{"version":3,"file":"helios-web.umd.cjs","sources":["../src/rendering/qualityOptions.js","../src/layers/LayerManager.js","../src/utilities/DebugLogger.js","../src/scheduler/Scheduler.js","../src/pipeline/constants.js","../src/layouts/Layout.js","../src/layouts/d3force3dLayoutWorker.js","../src/delegates/PositionDelegate.js","../src/delegates/GpuForcePositionDelegate.js","../src/layouts/layoutTuningModel.generated.js","../src/layouts/GpuForceLayout.js","../src/rendering/engine/Layer.js","../src/rendering/engine/AmbientOcclusionQuality.js","../src/rendering/engine/AmbientOcclusionMode.js","../src/rendering/engine/GraphLayerCommon.js","../src/rendering/engine/GraphLayer.js","../src/rendering/schema/GraphVisualSchema.js","../src/rendering/engine/shaders/graphWebGL.js","../src/rendering/engine/AmbientOcclusionCommon.js","../src/rendering/engine/AmbientOcclusionWebGLAlt.js","../src/rendering/engine/GraphLayerWebGL.js","../src/rendering/engine/shaders/graphWebGPUBase.js","../src/rendering/engine/framegraph/FrameGraphRunner.js","../src/utilities/counters.js","../src/rendering/engine/GraphLayerWebGPUBase.js","../src/rendering/engine/shaders/graphWebGPU.js","../src/rendering/engine/AmbientOcclusionWebGPU.js","../src/rendering/engine/GraphLayerWebGPU.js","../src/rendering/resources/WebGLResourceCache.js","../src/rendering/resources/WebGPUResourceCache.js","../src/rendering/resources/ResourceCache.js","../src/rendering/engine/WebGL2Device.js","../src/rendering/engine/WebGPUDevice.js","../src/rendering/touchGestureMath.js","../src/rendering/Camera.js","../src/rendering/engine/LayeredRenderer.js","../src/rendering/createRenderer.js","../src/rendering/CameraTransitionController.js","../src/rendering/engine/RenderTargetPool.js","../src/rendering/engine/shaders/attributeWebGL.js","../src/rendering/engine/shaders/attributeWebGPU.js","../src/rendering/AttributeTracker.js","../src/utilities/PerformanceMonitor.js","../node_modules/d3-scale-chromatic/src/colors.js","../node_modules/d3-scale-chromatic/src/categorical/category10.js","../node_modules/d3-scale-chromatic/src/categorical/Accent.js","../node_modules/d3-scale-chromatic/src/categorical/Dark2.js","../node_modules/d3-scale-chromatic/src/categorical/observable10.js","../node_modules/d3-scale-chromatic/src/categorical/Paired.js","../node_modules/d3-scale-chromatic/src/categorical/Pastel1.js","../node_modules/d3-scale-chromatic/src/categorical/Pastel2.js","../node_modules/d3-scale-chromatic/src/categorical/Set1.js","../node_modules/d3-scale-chromatic/src/categorical/Set2.js","../node_modules/d3-scale-chromatic/src/categorical/Set3.js","../node_modules/d3-scale-chromatic/src/categorical/Tableau10.js","../node_modules/d3-color/src/define.js","../node_modules/d3-color/src/color.js","../node_modules/d3-color/src/math.js","../node_modules/d3-color/src/cubehelix.js","../node_modules/d3-interpolate/src/basis.js","../node_modules/d3-interpolate/src/constant.js","../node_modules/d3-interpolate/src/color.js","../node_modules/d3-interpolate/src/rgb.js","../node_modules/d3-interpolate/src/cubehelix.js","../node_modules/d3-scale-chromatic/src/ramp.js","../node_modules/d3-scale-chromatic/src/diverging/BrBG.js","../node_modules/d3-scale-chromatic/src/diverging/PRGn.js","../node_modules/d3-scale-chromatic/src/diverging/PiYG.js","../node_modules/d3-scale-chromatic/src/diverging/PuOr.js","../node_modules/d3-scale-chromatic/src/diverging/RdBu.js","../node_modules/d3-scale-chromatic/src/diverging/RdGy.js","../node_modules/d3-scale-chromatic/src/diverging/RdYlBu.js","../node_modules/d3-scale-chromatic/src/diverging/RdYlGn.js","../node_modules/d3-scale-chromatic/src/diverging/Spectral.js","../node_modules/d3-scale-chromatic/src/sequential-multi/BuGn.js","../node_modules/d3-scale-chromatic/src/sequential-multi/BuPu.js","../node_modules/d3-scale-chromatic/src/sequential-multi/GnBu.js","../node_modules/d3-scale-chromatic/src/sequential-multi/OrRd.js","../node_modules/d3-scale-chromatic/src/sequential-multi/PuBuGn.js","../node_modules/d3-scale-chromatic/src/sequential-multi/PuBu.js","../node_modules/d3-scale-chromatic/src/sequential-multi/PuRd.js","../node_modules/d3-scale-chromatic/src/sequential-multi/RdPu.js","../node_modules/d3-scale-chromatic/src/sequential-multi/YlGnBu.js","../node_modules/d3-scale-chromatic/src/sequential-multi/YlGn.js","../node_modules/d3-scale-chromatic/src/sequential-multi/YlOrBr.js","../node_modules/d3-scale-chromatic/src/sequential-multi/YlOrRd.js","../node_modules/d3-scale-chromatic/src/sequential-single/Blues.js","../node_modules/d3-scale-chromatic/src/sequential-single/Greens.js","../node_modules/d3-scale-chromatic/src/sequential-single/Greys.js","../node_modules/d3-scale-chromatic/src/sequential-single/Purples.js","../node_modules/d3-scale-chromatic/src/sequential-single/Reds.js","../node_modules/d3-scale-chromatic/src/sequential-single/Oranges.js","../node_modules/d3-scale-chromatic/src/sequential-multi/cividis.js","../node_modules/d3-scale-chromatic/src/sequential-multi/cubehelix.js","../node_modules/d3-scale-chromatic/src/sequential-multi/rainbow.js","../node_modules/d3-scale-chromatic/src/sequential-multi/sinebow.js","../node_modules/d3-scale-chromatic/src/sequential-multi/turbo.js","../node_modules/d3-scale-chromatic/src/sequential-multi/viridis.js","../src/colors/colormaps.js","../src/pipeline/Mapper.js","../src/pipeline/VisualAttributes.js","../src/labels/SvgLabelController.js","../src/legends/SvgLegendController.js","../src/filters/HeliosFilter.js","../src/rendering/engine/DensityLayer.js","../src/ui/panels/docking.js","../src/ui/panels/resize.js","../src/ui/panelIcons.js","../src/ui/web-components/HeliosPanelElement.js","../src/ui/web-components/defineHeliosWebComponents.js","../src/ui/panels/Panel.js","../src/ui/panels/PanelManager.js","../src/ui/state/UIAttribute.js","../src/ui/style/defaultStyles.js","../src/ui/controls/createFpsThrottle.js","../src/ui/controls/createSliderRow.js","../src/ui/controls/createAlignedRowEl.js","../src/ui/controls/SuggestedSliderControls.js","../src/ui/controls/createDirtyIndicator.js","../src/ui/controls/createTooltipManager.js","../src/ui/controls/createToggleControl.js","../src/ui/controls/createSegmentedToggleControl.js","../src/ui/controls/createSelectControl.js","../src/ui/controls/LightDirectionControl.js","../src/ui/panels/PanelStack.js","../src/ui/panels/TabbedPanel.js","../src/ui/panels/panelSchema.js","../src/ui/controls/TwoHandleRange.js","../src/ui/controls/LogSliderControls.js","../src/ui/utils/colormapPreview.js","../src/ui/controls/ColormapPickerControl.js","../src/ui/utils/numbers.js","../src/ui/utils/colors.js","../src/ui/utils/attributes.js","../src/ui/utils/channelConfig.js","../src/ui/panels/MappersPanel.js","../src/ui/panels/LayoutPanel.js","../src/ui/panels/LegendsPanel.js","../src/ui/panels/CameraPanel.js","../src/ui/panels/AttributeRuleEditor.js","../src/ui/panels/SelectionPanel.js","../src/export/figureExport.js","../src/ui/HeliosUI.js","../src/behaviors/Behavior.js","../src/behaviors/AppearanceBehavior.js","../src/behaviors/BehaviorContext.js","../src/behaviors/BehaviorManager.js","../src/behaviors/BehaviorRegistry.js","../src/behaviors/ExporterBehavior.js","../src/behaviors/FilterBehavior.js","../src/behaviors/selectionShared.js","../src/behaviors/interactionShared.js","../src/behaviors/HoverBehavior.js","../src/behaviors/InterfaceBehavior.js","../src/behaviors/LayoutBehavior.js","../src/behaviors/LegendsBehavior.js","../src/behaviors/LabelsBehavior.js","../src/behaviors/mapperBehaviorShared.js","../src/behaviors/MappersBehavior.js","../src/behaviors/SelectionBehavior.js","../src/behaviors/index.js","../src/persistence/schema.js","../src/persistence/storage.js","../src/state/HeliosStateManager.js","../src/storage/HeliosStorageManager.js","../src/Helios.js"],"sourcesContent":["const DEFAULT_SUPERSAMPLING_FACTOR = 2;\nconst DEFAULT_SUPERSAMPLING_THRESHOLD = 2;\nexport const DEFAULT_GRAPHICS_POWER_PREFERENCE = 'high-performance';\n\nfunction normalizePositiveNumber(value, fallback) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric) || numeric <= 0) return fallback;\n  return numeric;\n}\n\nexport function getWindowDevicePixelRatio() {\n  if (typeof window === 'undefined') return 1;\n  return normalizePositiveNumber(window.devicePixelRatio, 1);\n}\n\nexport function normalizeSupersamplingOption(value, { forceSupersample = false } = {}) {\n  if (value === 'auto' || value == null) {\n    return forceSupersample ? true : 'auto';\n  }\n  if (value === 'off') return false;\n  if (value === '2x') return 2;\n  if (typeof value === 'boolean') return value;\n  const numeric = Number(value);\n  if (Number.isFinite(numeric) && numeric > 0) {\n    return numeric;\n  }\n  return forceSupersample ? true : 'auto';\n}\n\nexport function resolveSupersamplingPreset(value, { forceSupersample = false } = {}) {\n  const normalized = normalizeSupersamplingOption(value, { forceSupersample });\n  if (normalized === false) return 'off';\n  if (normalized === 'auto') return 'auto';\n  return '2x';\n}\n\nexport function supersamplingPresetToOption(value, { forceSupersample = false } = {}) {\n  const preset = resolveSupersamplingPreset(value, { forceSupersample });\n  if (preset === 'off') return false;\n  if (preset === '2x') return 2;\n  return 'auto';\n}\n\nexport function resolveSupersamplingMultiplier(baseDevicePixelRatio, options = {}) {\n  const baseRatio = normalizePositiveNumber(baseDevicePixelRatio, 1);\n  const mode = normalizeSupersamplingOption(options.supersampling, {\n    forceSupersample: options.forceSupersample === true,\n  });\n  const autoFactor = normalizePositiveNumber(options.supersamplingAutoFactor, DEFAULT_SUPERSAMPLING_FACTOR);\n  const autoThreshold = normalizePositiveNumber(options.supersamplingAutoThreshold, DEFAULT_SUPERSAMPLING_THRESHOLD);\n  if (typeof mode === 'number') {\n    return Math.max(1, mode);\n  }\n  if (mode === true) {\n    return autoFactor;\n  }\n  if (mode === false) {\n    return 1;\n  }\n  return baseRatio < autoThreshold ? autoFactor : 1;\n}\n\nexport function resolveEffectiveDevicePixelRatio(baseDevicePixelRatio = getWindowDevicePixelRatio(), options = {}) {\n  const baseRatio = normalizePositiveNumber(baseDevicePixelRatio, 1);\n  const multiplier = resolveSupersamplingMultiplier(baseRatio, options);\n  return Math.max(1, baseRatio * multiplier);\n}\n\nexport function resolveWebGLAntialiasEnabled(options = {}) {\n  return options.antialias !== false;\n}\n\nfunction objectOption(value) {\n  return value && typeof value === 'object' ? value : {};\n}\n\nexport function resolveGraphicsPowerPreference(options = {}) {\n  return options.powerPreference ?? DEFAULT_GRAPHICS_POWER_PREFERENCE;\n}\n\nexport function resolveWebGLContextAttributes(options = {}) {\n  return {\n    antialias: resolveWebGLAntialiasEnabled(options),\n    premultipliedAlpha: true,\n    powerPreference: resolveGraphicsPowerPreference(options),\n    ...objectOption(options.webglContextAttributes),\n  };\n}\n\nexport function resolveWebGPUAdapterOptions(options = {}) {\n  const adapterOptions = { ...objectOption(options.webgpuAdapterOptions) };\n  if (Object.prototype.hasOwnProperty.call(options, 'powerPreference')\n    && !Object.prototype.hasOwnProperty.call(adapterOptions, 'powerPreference')) {\n    adapterOptions.powerPreference = options.powerPreference;\n  }\n  if (adapterOptions.powerPreference == null) {\n    delete adapterOptions.powerPreference;\n  }\n  return adapterOptions;\n}\n\nexport function resolveWebGPURequestAdapterArgument(options = {}) {\n  const adapterOptions = resolveWebGPUAdapterOptions(options);\n  return Object.keys(adapterOptions).length ? adapterOptions : undefined;\n}\n\nexport function resolveWebGPUCanvasSampleCount(options = {}) {\n  const antialias = options.antialias;\n  if (antialias == null || antialias === false) return 1;\n  if (antialias === true) return 4;\n  const numeric = Number(antialias);\n  if (!Number.isFinite(numeric) || numeric <= 1) return 1;\n  return 4;\n}\n","import { getWindowDevicePixelRatio, resolveEffectiveDevicePixelRatio } from '../rendering/qualityOptions.js';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\nfunction resolveContainer(target) {\n  if (!target && typeof document !== 'undefined') {\n    return document.body;\n  }\n  if (typeof target === 'string') {\n    const element = document.querySelector(target);\n    if (!element) {\n      throw new Error(`Unable to find container using selector \"${target}\"`);\n    }\n    return element;\n  }\n  return target;\n}\n\nfunction normalizeViewportInsets(insets) {\n  if (!insets || typeof insets !== 'object') {\n    return { top: 0, right: 0, bottom: 0, left: 0 };\n  }\n  const coerce = (value) => {\n    const numeric = Number(value);\n    return Number.isFinite(numeric) ? Math.max(0, numeric) : 0;\n  };\n  return {\n    top: coerce(insets.top),\n    right: coerce(insets.right),\n    bottom: coerce(insets.bottom),\n    left: coerce(insets.left),\n  };\n}\n\n/**\n * Manages the DOM layers (canvas, SVG overlay, HTML overlays) that can be used\n * by Helios for rendering and interaction.\n */\nexport class LayerManager {\n  constructor(target, options = {}) {\n    this.container = resolveContainer(target);\n    if (!this.container) {\n      throw new Error('A valid container element is required');\n    }\n    this.options = options;\n\n    const suppressBrowserGestures = options.suppressBrowserGestures !== false;\n\n    this.root = document.createElement('div');\n    this.root.className = 'helios-root';\n    Object.assign(this.root.style, {\n      position: 'relative',\n      width: '100%',\n      height: '100%',\n      overflow: 'hidden',\n      touchAction: suppressBrowserGestures ? 'none' : 'auto',\n      ...(suppressBrowserGestures\n        ? { overscrollBehavior: 'none', overscrollBehaviorX: 'none', overscrollBehaviorY: 'none' }\n        : null),\n    });\n\n    this.canvas3d = document.createElement('canvas');\n    this.canvas3d.className = 'helios-layer-canvas3d';\n    Object.assign(this.canvas3d.style, {\n      position: 'absolute',\n      inset: 0,\n      width: '100%',\n      height: '100%',\n      display: 'block',\n      userSelect: 'none',\n      webkitUserSelect: 'none',\n      touchAction: suppressBrowserGestures ? 'none' : 'auto',\n      ...(suppressBrowserGestures\n        ? { overscrollBehavior: 'none', overscrollBehaviorX: 'none', overscrollBehaviorY: 'none' }\n        : null),\n    });\n\n    this.svgLayer = document.createElementNS(SVG_NS, 'svg');\n    this.svgLayer.classList.add('helios-layer-svg');\n    Object.assign(this.svgLayer.style, {\n      position: 'absolute',\n      inset: 0,\n      width: '100%',\n      height: '100%',\n      pointerEvents: 'none',\n      userSelect: 'none',\n      webkitUserSelect: 'none',\n    });\n\n    this.htmlOverlay = document.createElement('div');\n    this.htmlOverlay.className = 'helios-layer-overlay';\n    Object.assign(this.htmlOverlay.style, {\n      position: 'absolute',\n      inset: 0,\n      pointerEvents: 'none',\n      userSelect: 'none',\n      webkitUserSelect: 'none',\n    });\n\n    this.viewport = document.createElement('div');\n    this.viewport.className = 'helios-layer-viewport';\n    Object.assign(this.viewport.style, {\n      position: 'absolute',\n      inset: '0px',\n      overflow: 'hidden',\n      userSelect: 'none',\n      webkitUserSelect: 'none',\n    });\n\n    this.viewport.appendChild(this.canvas3d);\n    this.viewport.appendChild(this.svgLayer);\n    this.viewport.appendChild(this.htmlOverlay);\n    this.root.appendChild(this.viewport);\n\n    this.container.appendChild(this.root);\n\n    this._boundWheelBlocker = null;\n    if (suppressBrowserGestures) {\n      this._boundWheelBlocker = (event) => {\n        if (event?.cancelable) event.preventDefault();\n        event?.stopPropagation?.();\n      };\n      this.canvas3d.addEventListener('wheel', this._boundWheelBlocker, { passive: false });\n    }\n\n    this.layers = new Map();\n    this.resizeListeners = new Set();\n    this.viewportInsets = { top: 0, right: 0, bottom: 0, left: 0 };\n    const pixelRatio = resolveEffectiveDevicePixelRatio(getWindowDevicePixelRatio(), this.options);\n    this.size = { width: 0, height: 0, devicePixelRatio: pixelRatio };\n\n    this.boundResize = () => this.handleResize();\n    if (typeof ResizeObserver === 'function') {\n      this.resizeObserver = new ResizeObserver(this.boundResize);\n      this.resizeObserver.observe(this.root);\n    } else {\n      window.addEventListener('resize', this.boundResize);\n    }\n    this.handleResize();\n  }\n\n  get canvas() {\n    return this.canvas3d;\n  }\n\n  get svg() {\n    return this.svgLayer;\n  }\n\n  get overlay() {\n    return this.htmlOverlay;\n  }\n\n  addLayer(name, element) {\n    if (this.layers.has(name)) {\n      throw new Error(`Layer ${name} already exists`);\n    }\n    this.layers.set(name, element);\n    this.root.appendChild(element);\n  }\n\n  setViewportInsets(insets) {\n    const next = normalizeViewportInsets(insets);\n    const prev = this.viewportInsets;\n    if (\n      prev.top === next.top\n      && prev.right === next.right\n      && prev.bottom === next.bottom\n      && prev.left === next.left\n    ) {\n      return this;\n    }\n    this.viewportInsets = next;\n    this.viewport.style.top = `${next.top}px`;\n    this.viewport.style.right = `${next.right}px`;\n    this.viewport.style.bottom = `${next.bottom}px`;\n    this.viewport.style.left = `${next.left}px`;\n    this.handleResize();\n    return this;\n  }\n\n  removeLayer(name) {\n    const element = this.layers.get(name);\n    if (element) {\n      element.remove();\n      this.layers.delete(name);\n    }\n  }\n\n  onResize(callback) {\n    this.resizeListeners.add(callback);\n    callback({ ...this.size });\n    return () => this.resizeListeners.delete(callback);\n  }\n\n  setSupersampling(supersampling) {\n    this.options.supersampling = supersampling;\n    this.handleResize();\n  }\n\n  handleResize() {\n    const rect = this.viewport.getBoundingClientRect();\n    const pixelRatio = resolveEffectiveDevicePixelRatio(getWindowDevicePixelRatio(), this.options);\n    const width = Math.max(1, Math.floor(rect.width));\n    const height = Math.max(1, Math.floor(rect.height));\n\n    if (width === this.size.width && height === this.size.height && pixelRatio === this.size.devicePixelRatio) {\n      return;\n    }\n\n    this.size = { width, height, devicePixelRatio: pixelRatio };\n    this.canvas3d.width = Math.floor(width * pixelRatio);\n    this.canvas3d.height = Math.floor(height * pixelRatio);\n\n    for (const listener of this.resizeListeners) {\n      listener({ ...this.size });\n    }\n  }\n\n  destroy() {\n    if (this.resizeObserver) {\n      this.resizeObserver.disconnect();\n    } else {\n      window.removeEventListener('resize', this.boundResize);\n    }\n    if (this._boundWheelBlocker) {\n      this.canvas3d.removeEventListener('wheel', this._boundWheelBlocker);\n      this._boundWheelBlocker = null;\n    }\n    this.root.remove();\n    this.layers.clear();\n    this.resizeListeners.clear();\n  }\n}\n","const DEFAULT_CATEGORIES = ['helios', 'mapper', 'scheduler', 'layout', 'renderer'];\n\nfunction buildCategorySet(value) {\n  const categories = new Set();\n  if (value === true) {\n    DEFAULT_CATEGORIES.forEach((name) => categories.add(name));\n    return categories;\n  }\n  if (value === 'all' || value === '*') {\n    categories.add('*');\n    return categories;\n  }\n  if (Array.isArray(value)) {\n    value.map(String).forEach((name) => categories.add(name));\n    return categories;\n  }\n  if (value && typeof value === 'object') {\n    if (Array.isArray(value.categories)) {\n      value.categories.map(String).forEach((name) => categories.add(name));\n    }\n    Object.entries(value).forEach(([key, flag]) => {\n      if (flag === true) categories.add(key);\n    });\n  }\n  return categories;\n}\n\nexport function resolveDebugConfig(optionValue) {\n  const source = optionValue ?? globalThis?.__HELIOS_DEBUG__;\n  if (!source) {\n    return { enabled: false, categories: new Set() };\n  }\n  const categories = buildCategorySet(source);\n  if (categories.size === 0) {\n    DEFAULT_CATEGORIES.forEach((name) => categories.add(name));\n  }\n  return { enabled: true, categories };\n}\n\nexport class DebugLogger {\n  constructor(config = {}) {\n    this.enabled = config.enabled ?? false;\n    this.categories = config.categories ?? new Set();\n    this.prefix = config.prefix ?? 'helios';\n  }\n\n  enabledFor(category) {\n    if (!this.enabled) return false;\n    if (!category) return true;\n    return this.categories.has('*') || this.categories.has(category);\n  }\n\n  log(category, message, ...args) {\n    if (!this.enabledFor(category)) return;\n    const tag = category ? `${this.prefix}:${category}` : this.prefix;\n    if (args.length > 0) {\n      console.debug(`[${tag}] ${message}`, ...args);\n    } else {\n      console.debug(`[${tag}] ${message}`);\n    }\n  }\n}\n\nexport function createDebugLogger(optionValue) {\n  return new DebugLogger(resolveDebugConfig(optionValue));\n}\n","/**\n * Coordinates layout, geometry, and rendering cycles.\n */\nimport { createDebugLogger } from '../utilities/DebugLogger.js';\n\nexport class Scheduler {\n  constructor(options = {}) {\n    this.layout = null;\n    this.geometryCallback = null;\n    this.renderCallback = null;\n    this.running = false;\n    this._needsLayout = true;\n    this._needsGeometry = true;\n    this._needsRender = true;\n    this._lastTime = 0;\n    this._raf = null;\n    this._layoutBusy = false;\n    this._layoutActive = false;\n    this.layoutEnabled = options.layoutEnabled !== false;\n    this.layoutState = this.layoutEnabled ? 'running' : 'stopped';\n    this._layoutStartReason = null;\n    this._layoutStopReason = null;\n    this._layoutStartTimestamp = 0;\n    this._layoutEventHandlers = {\n      start: typeof options.onLayoutStart === 'function' ? options.onLayoutStart : null,\n      stop: typeof options.onLayoutStop === 'function' ? options.onLayoutStop : null,\n    };\n    this.currentFrame = null;\n    this.performanceMonitor = options.performanceMonitor ?? null;\n    this.maxFrameInterval =\n      options.maxFps && options.maxFps > 0 ? 1000 / options.maxFps : 0;\n    this._lastRenderTime = 0;\n    this._renderCount = 0;\n    this.attributeCallback = null;\n    this.attributeUpdateConfig = {\n      autoUpdate: options.attributeAutoUpdate === true,\n      maxFrameInterval:\n        options.attributeMaxFps && options.attributeMaxFps > 0\n          ? 1000 / options.attributeMaxFps\n          : 0,\n      frameSkip:\n        Number.isFinite(options.attributeFrameSkip) && options.attributeFrameSkip > 0\n          ? Math.floor(options.attributeFrameSkip)\n          : 0,\n      runWhenIdle: options.attributeRunWhenIdle === true,\n    };\n    this._attributeTimer = null;\n    this._lastAttributeTime = -Infinity;\n    this._lastAttributeRenderCount = 0;\n    this.renderPump = null;\n    this.debug =\n      options.debug && typeof options.debug.log === 'function'\n        ? options.debug\n        : createDebugLogger(options.debug);\n    this.debug.log('scheduler', 'Scheduler created', {\n      maxFps: options.maxFps ?? null,\n      throttled: this.maxFrameInterval > 0,\n      attributeAutoUpdate: this.attributeUpdateConfig.autoUpdate,\n      attributeMaxFps: options.attributeMaxFps ?? null,\n      attributeFrameSkip: this.attributeUpdateConfig.frameSkip,\n      layoutEnabled: this.layoutEnabled,\n    });\n  }\n\n  _resolveDisabledLayoutState(reason = null) {\n    return reason === 'alpha-min' || reason === 'idle' || reason === 'temperature'\n      ? 'idle'\n      : 'stopped';\n  }\n\n  getLayoutState() {\n    return this.layoutState;\n  }\n\n  setLayout(layout) {\n    this.layout = layout;\n    this.debug.log('scheduler', 'Layout attached', { layout: layout?.constructor?.name });\n    this.requestLayout();\n  }\n\n  setGeometryCallback(callback) {\n    this.geometryCallback = callback;\n    this.debug.log('scheduler', 'Geometry callback registered');\n    this.requestGeometry();\n  }\n\n  setRenderCallback(callback) {\n    this.renderCallback = callback;\n    this.debug.log('scheduler', 'Render callback registered');\n  }\n\n  setRenderPump(callback) {\n    this.renderPump = typeof callback === 'function' ? callback : null;\n  }\n\n  requestLayout() {\n    // Backwards-compatible signature: requestLayout(reason)\n    const reason = arguments.length ? arguments[0] : null;\n    if (!this._needsLayout) {\n      this.debug.log('scheduler', 'Layout requested');\n    }\n    this._needsLayout = true;\n    if (reason != null) {\n      this._layoutStartReason = reason;\n    }\n  }\n\n  requestGeometry() {\n    if (!this._needsGeometry) {\n      this.debug.log('scheduler', 'Geometry requested');\n    }\n    this._needsGeometry = true;\n  }\n\n  requestRender() {\n    if (!this._needsRender) {\n      this.debug.log('scheduler', 'Render requested');\n    }\n    this._needsRender = true;\n  }\n\n  setLayoutEnabled(enabled, reason = null) {\n    const next = enabled !== false;\n    if (next === this.layoutEnabled) {\n      if (!next && reason != null) {\n        this._layoutStopReason = reason;\n        this.layoutState = this._resolveDisabledLayoutState(reason);\n      } else if (next) {\n        this.layoutState = 'running';\n      }\n      return;\n    }\n    this.layoutEnabled = next;\n    if (!next) {\n      this._layoutStopReason = reason ?? 'user';\n      this._needsLayout = false;\n      this.layoutState = this._resolveDisabledLayoutState(this._layoutStopReason);\n    } else {\n      this._layoutStartReason = reason ?? 'user';\n      this._needsLayout = true;\n      this.layoutState = 'running';\n    }\n  }\n\n  setLayoutEventHandlers(handlers = {}) {\n    if (typeof handlers.start === 'function') {\n      this._layoutEventHandlers.start = handlers.start;\n    }\n    if (typeof handlers.stop === 'function') {\n      this._layoutEventHandlers.stop = handlers.stop;\n    }\n  }\n\n  start() {\n    if (this.running) return;\n    this.running = true;\n    this._lastTime = performance.now();\n    this._lastRenderTime = this._lastTime;\n    this._lastAttributeTime = -Infinity;\n    this._lastAttributeRenderCount = this._renderCount;\n    this.debug.log('scheduler', 'Scheduler started');\n    this._restartAttributeTimer();\n    this._raf = requestAnimationFrame((ts) => this.tick(ts));\n  }\n\n  stop() {\n    this.running = false;\n    if (this._raf !== null) {\n      cancelAnimationFrame(this._raf);\n      this._raf = null;\n    }\n    this._clearAttributeTimer();\n    this._layoutBusy = false;\n    if (this._layoutActive) {\n      this._layoutActive = false;\n      const handler = this._layoutEventHandlers.stop;\n      if (handler) {\n        handler({\n          timestamp: performance.now(),\n          durationMs: Math.max(0, performance.now() - (this._layoutStartTimestamp || 0)),\n          reason: this._layoutStopReason ?? 'stopped',\n        });\n      }\n    }\n    this.debug.log('scheduler', 'Scheduler stopped');\n  }\n\n  setAttributeCallback(callback, options = {}) {\n    this.attributeCallback = callback;\n    this.configureAttributeUpdates(options);\n  }\n\n  configureAttributeUpdates(options = {}) {\n    const cfg = { ...this.attributeUpdateConfig };\n    if (options.autoUpdate != null) {\n      cfg.autoUpdate = options.autoUpdate === true;\n    }\n    if (options.maxFps != null) {\n      cfg.maxFrameInterval = options.maxFps > 0 ? 1000 / options.maxFps : 0;\n    }\n    if (options.frameSkip != null) {\n      cfg.frameSkip = Number.isFinite(options.frameSkip) && options.frameSkip > 0\n        ? Math.floor(options.frameSkip)\n        : 0;\n    }\n    if (options.runWhenIdle != null) {\n      cfg.runWhenIdle = options.runWhenIdle === true;\n    }\n    this.attributeUpdateConfig = cfg;\n    this._restartAttributeTimer();\n  }\n\n  _clearAttributeTimer() {\n    if (this._attributeTimer) {\n      clearTimeout(this._attributeTimer);\n      this._attributeTimer = null;\n    }\n  }\n\n  _restartAttributeTimer() {\n    this._clearAttributeTimer();\n    if (!this.running) return;\n    if (!this.attributeUpdateConfig.autoUpdate) return;\n    if (!this.attributeUpdateConfig.runWhenIdle) return;\n    if (!this.attributeCallback) return;\n    const interval = this.attributeUpdateConfig.maxFrameInterval;\n    const delay = interval > 0 ? interval : 16;\n    this._attributeTimer = setTimeout(() => this._attributeTick(), delay);\n  }\n\n  _attributeTick() {\n    if (!this.running) return;\n    this._maybeRunAttributeUpdate('timer');\n    this._restartAttributeTimer();\n  }\n\n  _maybeRunAttributeUpdate(reason) {\n    if (!this.attributeUpdateConfig.autoUpdate) return;\n    if (!this.attributeCallback) return;\n    if (!this.currentFrame) return;\n    if (!this.attributeUpdateConfig.runWhenIdle && reason !== 'render') return;\n    const now = performance.now();\n    const elapsed = now - this._lastAttributeTime;\n    const interval = this.attributeUpdateConfig.maxFrameInterval;\n    if (interval > 0 && elapsed < interval) return;\n    const frameSkip = this.attributeUpdateConfig.frameSkip ?? 0;\n    const framesSince = this._renderCount - this._lastAttributeRenderCount;\n    if (frameSkip > 0 && this._lastAttributeRenderCount > 0 && framesSince < frameSkip + 1) return;\n    this._lastAttributeTime = now;\n    this._lastAttributeRenderCount = this._renderCount;\n    try {\n      this.attributeCallback(this.currentFrame);\n    } catch (error) {\n      console.error('Attribute update failed', { reason, error });\n    }\n  }\n\n  tick(timestamp) {\n    if (!this.running) {\n      return;\n    }\n    if (this.maxFrameInterval > 0 && timestamp - this._lastRenderTime < this.maxFrameInterval) {\n      this._raf = requestAnimationFrame((ts) => this.tick(ts));\n      return;\n    }\n    const delta = timestamp - this._lastTime;\n    this._lastTime = timestamp;\n    this._lastRenderTime = timestamp;\n    const perf = this.performanceMonitor;\n\n    const layoutWanted = Boolean(\n      this.layoutEnabled &&\n        this.layout &&\n        (this._needsLayout ||\n          (typeof this.layout.shouldRun === 'function' && this.layout.shouldRun())),\n    );\n    const layoutActiveNow = Boolean(layoutWanted || this._layoutBusy);\n    if (layoutActiveNow && !this._layoutActive) {\n      this._layoutActive = true;\n      this._layoutStartTimestamp = timestamp;\n      const handler = this._layoutEventHandlers.start;\n      if (handler) {\n        handler({\n          timestamp,\n          reason: this._layoutStartReason ?? 'requested',\n        });\n      }\n      this._layoutStartReason = null;\n      this._layoutStopReason = null;\n    } else if (!layoutActiveNow && this._layoutActive) {\n      this._layoutActive = false;\n      const handler = this._layoutEventHandlers.stop;\n      if (handler) {\n        handler({\n          timestamp,\n          durationMs: Math.max(0, timestamp - (this._layoutStartTimestamp || timestamp)),\n          reason: this._layoutStopReason ?? 'idle',\n        });\n      }\n      this._layoutStopReason = null;\n      this._layoutStartTimestamp = 0;\n    }\n\n    if (layoutWanted && !this._layoutBusy) {\n      const layoutStart = perf?.enabled ? performance.now() : 0;\n      const finalizeLayout = (changed) => {\n        if (layoutStart) {\n          perf.record('layout', performance.now() - layoutStart);\n        }\n        if (changed) {\n          this.requestGeometry();\n        }\n      };\n      try {\n        const result = this.layout.step(delta);\n        this._layoutBusy = result instanceof Promise;\n        if (this._layoutBusy) {\n          result\n            .then((changed) => {\n              this._layoutBusy = false;\n              finalizeLayout(changed);\n            })\n            .catch((error) => {\n              this._layoutBusy = false;\n              if (layoutStart) {\n                perf.record('layout', performance.now() - layoutStart);\n              }\n              console.error('Layout execution failed', error);\n            });\n        } else {\n          finalizeLayout(result);\n        }\n      } finally {\n        this._needsLayout = false;\n      }\n    }\n\n    if (this.geometryCallback && this._needsGeometry && !this._layoutBusy) {\n      const geometryStart = perf?.enabled ? performance.now() : 0;\n      this.currentFrame = this.geometryCallback();\n      if (geometryStart) {\n        perf.record('geometry', performance.now() - geometryStart);\n      }\n      this._needsGeometry = false;\n      this._needsRender = true;\n    }\n\n    if (this.renderPump && this.currentFrame) {\n      try {\n        const wantsRender = this.renderPump({ timestamp, frame: this.currentFrame });\n        if (wantsRender) this.requestRender();\n      } catch (error) {\n        console.warn('Scheduler render pump failed', error);\n      }\n    }\n\n    if (this.renderCallback && this.currentFrame && this._needsRender) {\n      const renderStart = perf?.enabled ? performance.now() : 0;\n      const rendered = this.renderCallback(this.currentFrame);\n      if (renderStart) {\n        perf.record('render', performance.now() - renderStart);\n      }\n      if (rendered === false) {\n        this._needsRender = true;\n      } else {\n        this._needsRender = false;\n        this._renderCount += 1;\n        this._maybeRunAttributeUpdate('render');\n      }\n    }\n\n    perf?.logIfDue();\n    this._raf = requestAnimationFrame((ts) => this.tick(ts));\n  }\n}\n","export const NODE_POSITION_ATTRIBUTE = '_helios_visuals_position';\nexport const NODE_COLOR_ATTRIBUTE = '_helios_visuals_color';\nexport const NODE_SIZE_ATTRIBUTE = '_helios_visuals_size';\nexport const NODE_STATE_ATTRIBUTE = '_helios_visuals_state';\nexport const NODE_OUTLINE_WIDTH_ATTRIBUTE = '_helios_visuals_outline_width';\nexport const NODE_OUTLINE_COLOR_ATTRIBUTE = '_helios_visuals_outline_color';\nexport const EDGE_COLOR_ATTRIBUTE = '_helios_visuals_edge_color';\nexport const EDGE_WIDTH_ATTRIBUTE = '_helios_visuals_edge_width';\nexport const EDGE_OPACITY_ATTRIBUTE = '_helios_visuals_edge_opacity';\nexport const EDGE_STATE_ATTRIBUTE = '_helios_visuals_edge_state';\nexport const EDGE_ENDPOINTS_SIZE_ATTRIBUTE = '_helios_visuals_edge_endpoints_size';\n\n// Aggregate export so callers can grab all visual attribute names from a single import.\nexport const VISUAL_ATTRIBUTE_NAMES = {\n  NODE_POSITION_ATTRIBUTE,\n  NODE_COLOR_ATTRIBUTE,\n  NODE_SIZE_ATTRIBUTE,\n  NODE_STATE_ATTRIBUTE,\n  NODE_OUTLINE_WIDTH_ATTRIBUTE,\n  NODE_OUTLINE_COLOR_ATTRIBUTE,\n  EDGE_COLOR_ATTRIBUTE,\n  EDGE_WIDTH_ATTRIBUTE,\n  EDGE_OPACITY_ATTRIBUTE,\n  EDGE_STATE_ATTRIBUTE,\n  EDGE_ENDPOINTS_SIZE_ATTRIBUTE,\n};\n\nexport const DEFAULT_NODE_COLOR = [0.9, 0.2, 1, 1];\nexport const DEFAULT_EDGE_COLOR = [0.4, 0.4, 0.9, 0.5];\nexport const DEFAULT_EDGE_OPACITY = 0.5;\nexport const DEFAULT_NODE_SIZE = 8;\nexport const DEFAULT_EDGE_WIDTH = 1;\nexport const DEFAULT_NODE_OUTLINE_WIDTH = 0.1;\nexport const DEFAULT_NODE_OUTLINE_COLOR = [0, 0, 0, 1];\n\n// Aggregate defaults for convenience imports.\nexport const DEFAULT_VISUALS = {\n  DEFAULT_NODE_COLOR,\n  DEFAULT_EDGE_COLOR,\n  DEFAULT_EDGE_OPACITY,\n  DEFAULT_NODE_SIZE,\n  DEFAULT_EDGE_WIDTH,\n  DEFAULT_NODE_OUTLINE_WIDTH,\n  DEFAULT_NODE_OUTLINE_COLOR,\n};\n\nexport const VISUAL_ATTRIBUTE_MAP = {\n  color: NODE_COLOR_ATTRIBUTE,\n  size: NODE_SIZE_ATTRIBUTE,\n  state: NODE_STATE_ATTRIBUTE,\n  outline: NODE_OUTLINE_WIDTH_ATTRIBUTE,\n  outlineColor: NODE_OUTLINE_COLOR_ATTRIBUTE,\n  position: NODE_POSITION_ATTRIBUTE,\n  edgeColor: EDGE_COLOR_ATTRIBUTE,\n  edgeWidth: EDGE_WIDTH_ATTRIBUTE,\n  edgeOpacity: EDGE_OPACITY_ATTRIBUTE,\n  edgeState: EDGE_STATE_ATTRIBUTE,\n  edgeEndpointSize: EDGE_ENDPOINTS_SIZE_ATTRIBUTE,\n};\n","import { NODE_POSITION_ATTRIBUTE } from '../pipeline/constants.js';\n\n/** @typedef {import('helios-network').default} HeliosNetwork */\n\nexport function withLogScaleBinding(binding) {\n  return {\n    type: 'number',\n    scale: 'log',\n    notation: 'scientific',\n    inputStep: 'any',\n    sliderStep: 0.01,\n    ...binding,\n  };\n}\n\nexport function withVelocityRetentionBinding(binding) {\n  return {\n    label: 'Velocity retention',\n    hint: 'Higher values keep more momentum; lower values damp faster.',\n    ...binding,\n  };\n}\n\n/**\n * Base class for layout algorithms.\n *\n * @public\n * @param {HeliosNetwork} network - Source graph.\n * @param {import('../pipeline/VisualAttributes.js').VisualAttributes} visuals\n * Visual attribute owner used by renderers.\n * @remarks Concrete implementations override lifecycle hooks to move nodes by\n * writing into `_helios_visuals_position`.\n */\nexport class Layout {\n  constructor(network, visuals) {\n    this.network = network;\n    this.visuals = visuals;\n    this.helios = null;\n    this._updateRequested = true;\n    this._updateListener = null;\n    this._positionHandoffPending = false;\n  }\n\n  async initialize() {}\n\n  shouldRun() {\n    return !this._positionHandoffPending && this._updateRequested;\n  }\n\n  requestUpdate() {\n    this._updateRequested = true;\n  }\n\n  step() {\n    this._updateRequested = false;\n    return false;\n  }\n\n  resize() {}\n\n  setUpdateListener(listener) {\n    this._updateListener = listener;\n  }\n\n  emitUpdate(payload) {\n    if (typeof this._updateListener === 'function') {\n      this._updateListener(payload);\n    }\n  }\n\n  getParameterBindings() {\n    return {\n      key: 'static',\n      label: this.constructor?.name ?? 'Layout',\n      dynamic: false,\n      bindings: [],\n    };\n  }\n\n  reheat(reason = 'layout') {\n    this.requestUpdate();\n    this.helios?._wakeLayoutIfIdle?.(reason);\n    return this;\n  }\n\n  isPositionHandoffPending() {\n    return this._positionHandoffPending === true;\n  }\n\n  beginPositionHandoff() {\n    this._positionHandoffPending = true;\n    this._updateRequested = false;\n    return this;\n  }\n\n  completePositionHandoff(snapshot = null, options = {}) {\n    const wrote = this.seedFromPositionSnapshot(snapshot, options);\n    this._positionHandoffPending = false;\n    if (options.requestUpdate !== false) {\n      this.requestUpdate();\n    }\n    return wrote;\n  }\n\n  seedFromPositionSnapshot(snapshot, options = {}) {\n    if (!(snapshot instanceof Float32Array) || snapshot.length <= 0) return false;\n\n    let wrote = false;\n    let writtenView = null;\n    const writeSnapshot = (view) => {\n      if (!view || !Number.isFinite(view.length) || view.length <= 0) return false;\n      const count = Math.min(view.length, snapshot.length);\n      if (count <= 0) return false;\n      view.set(snapshot.subarray(0, count), 0);\n      writtenView ??= view;\n      return true;\n    };\n    const apply = () => {\n      const visualView = this.visuals?.nodePositions ?? null;\n      const networkView = this.network?.getNodeAttributeBuffer?.(NODE_POSITION_ATTRIBUTE)?.view ?? null;\n      const wroteVisual = writeSnapshot(visualView);\n      const wroteNetwork = networkView && networkView !== visualView\n        ? writeSnapshot(networkView)\n        : false;\n      wrote = wroteVisual || wroteNetwork;\n    };\n\n    const withVisualAccess = typeof this.visuals?.withBufferAccess === 'function'\n      ? (fn) => this.visuals.withBufferAccess(fn)\n      : (fn) => fn();\n    const withNetworkAccess = typeof this.network?.withBufferAccess === 'function'\n      ? (fn) => this.network.withBufferAccess(fn)\n      : (fn) => fn();\n    withNetworkAccess(() => withVisualAccess(apply));\n\n    if (!wrote) return false;\n    this.visuals?.markPositionsDirty?.();\n    if (options.emitUpdate !== false) {\n      this.emitUpdate({\n        positions: writtenView ?? snapshot,\n        timestamp: performance.now(),\n        layoutElapsedMs: 0,\n      });\n    }\n    return true;\n  }\n\n  dispose() {}\n}\n\n/**\n * Keeps nodes at their current positions. Useful as a default fallback when no\n * dynamic layout is configured yet.\n */\n/**\n * Layout that keeps existing node positions fixed.\n *\n * @public\n * @param {HeliosNetwork} network - Source graph.\n * @param {import('../pipeline/VisualAttributes.js').VisualAttributes} visuals\n * Visual attribute owner.\n * @param {object} [options] - Static bounds and sizing options.\n */\nexport class StaticLayout extends Layout {\n  constructor(network, visuals, options = {}) {\n    super(network, visuals);\n    this.bounds = options.bounds ?? [0, 0, 1, 1];\n  }\n\n  initialize() {\n    const apply = () => {\n      const activeNodes = this.network?.nodeIndices || [];\n      const positions = this.visuals.nodePositions;\n      const [minX, minY, maxX, maxY] = this.bounds;\n      const width = Math.max(1, maxX - minX);\n      const height = Math.max(1, maxY - minY);\n\n      for (let n = 0; n < activeNodes.length; n += 1) {\n        const node = activeNodes[n];\n        const offset = node * 3;\n        const x = positions[offset];\n        const y = positions[offset + 1];\n        if (Number.isFinite(x) && Number.isFinite(y)) {\n          continue;\n        }\n        positions[offset] = minX + (width * Math.random());\n        positions[offset + 1] = minY + (height * Math.random());\n        positions[offset + 2] = 0;\n      }\n      this._updateRequested = false;\n      this.emitUpdate({ positions });\n    };\n    if (typeof this.visuals?.withBufferAccess === 'function') {\n      this.visuals.withBufferAccess(apply);\n    } else {\n      apply();\n    }\n  }\n\n  getParameterBindings() {\n    return {\n      key: 'static',\n      label: 'Static',\n      dynamic: false,\n      bindings: [],\n    };\n  }\n}\n\n/**\n * Proxies layout execution to a WebWorker.\n */\n/**\n * Worker-backed force or jitter layout.\n *\n * @public\n * @param {HeliosNetwork} network - Source graph.\n * @param {import('../pipeline/VisualAttributes.js').VisualAttributes} visuals\n * Visual attribute owner.\n * @param {object} [options] - Worker layout options such as layout kind, mode,\n * force constants, and sampling settings.\n */\nexport class WorkerLayout extends Layout {\n  constructor(network, visuals, options = {}) {\n    super(network, visuals);\n    this.worker = null;\n    this.options = { center: [0, 0, 0], ...options };\n    this.pending = false;\n    this.lastUpdate = 0;\n  }\n\n  async initialize() {\n    this.worker = new Worker(new URL('../workers/layoutWorker.js', import.meta.url), {\n      type: 'module',\n    });\n    this.worker.onmessage = (event) => this.handleMessage(event.data);\n    this.worker.postMessage({\n      type: 'init',\n      nodeCount: this.network.nodeCapacity,\n      options: this.options,\n    });\n  }\n\n  shouldRun() {\n    return !this.isPositionHandoffPending() && !this.pending;\n  }\n\n  step() {\n    if (!this.worker || this.pending) {\n      return false;\n    }\n    const now = performance.now();\n    this.pending = true;\n    let positionsCopy = null;\n    const snapshot = () => {\n      positionsCopy = new Float32Array(this.visuals.nodePositions);\n    };\n    if (typeof this.visuals?.withBufferAccess === 'function') {\n      this.visuals.withBufferAccess(snapshot);\n    } else {\n      snapshot();\n    }\n    const { nodeIndices, edges } = this.buildGraphPayload();\n    this.worker.postMessage(\n      {\n        type: 'tick',\n        timestamp: now,\n        positions: positionsCopy,\n        nodeIndices,\n        edges,\n      },\n      [positionsCopy.buffer],\n    );\n    this.lastUpdate = now;\n    return false;\n  }\n\n  handleMessage(message) {\n    if (message?.type === 'positions' && message.positions instanceof Float32Array) {\n      let view = null;\n      const apply = () => {\n        view = this.visuals.nodePositions;\n        const count = Math.min(view.length, message.positions.length);\n        for (let i = 0; i < count; i += 1) {\n          view[i] = message.positions[i];\n        }\n      };\n      if (typeof this.visuals?.withBufferAccess === 'function') {\n        this.visuals.withBufferAccess(apply);\n      } else {\n        apply();\n      }\n      this.pending = false;\n      this._updateRequested = false;\n      // Inform downstream consumers that position-dependent buffers changed.\n      this.visuals?.markPositionsDirty?.();\n      if (view) {\n        const layoutTimestamp = performance.now();\n        this.emitUpdate({ positions: view, timestamp: layoutTimestamp });\n      }\n      return true;\n    }\n    if (message?.type === 'ready') {\n      this.pending = false;\n      this._updateRequested = true;\n    }\n    return false;\n  }\n\n  dispose() {\n    if (this.worker) {\n      this.worker.terminate();\n      this.worker = null;\n    }\n  }\n\n  setSettings(next = {}, { reheat = false, reason = 'layout-settings' } = {}) {\n    if (!next || typeof next !== 'object') return this;\n    this.options = {\n      ...this.options,\n      ...next,\n      center: Array.isArray(next.center) ? next.center.slice(0, 3) : this.options.center,\n    };\n    if (this.worker) {\n      this.worker.postMessage({\n        type: 'settings',\n        options: this.options,\n      });\n    }\n    if (reheat) {\n      this.reheat(reason);\n    } else {\n      this.requestUpdate();\n    }\n    return this;\n  }\n\n  getParameterBindings() {\n    const layoutMode = String(this.options?.layout ?? 'force3d').toLowerCase();\n    if (layoutMode === 'jitter') {\n      return {\n        key: 'worker:jitter',\n        label: 'Jitter (worker)',\n        dynamic: true,\n        bindings: [\n          {\n            key: 'jitter',\n            label: 'Jitter',\n            type: 'number',\n            min: 0,\n            max: 20,\n            step: 0.1,\n            get: () => Number(this.options.jitter ?? 3),\n            set: (value) => this.setSettings({ jitter: value }, { reheat: true }),\n          },\n        ],\n      };\n    }\n\n    return {\n      key: 'worker:force3d',\n      label: 'Force (worker)',\n      dynamic: true,\n      bindings: [\n        {\n          key: 'repulsionStrategy',\n          label: 'Repulsion',\n          type: 'select',\n          options: [\n            { value: 'barnes-hut', label: 'Barnes-Hut' },\n            { value: 'negative', label: 'Negative sampling' },\n            { value: 'full', label: 'All pairs' },\n          ],\n          get: () => String(this.options.repulsionStrategy ?? 'barnes-hut'),\n          set: (value) => this.setSettings({ repulsionStrategy: value }, { reheat: true }),\n        },\n        {\n          key: 'negativeSampling',\n          label: 'Extra negatives',\n          type: 'boolean',\n          get: () => Boolean(this.options.negativeSampling),\n          set: (value) => this.setSettings({ negativeSampling: value }, { reheat: true }),\n        },\n        {\n          key: 'negativesPerNode',\n          label: 'Negatives / node',\n          type: 'number',\n          min: 1,\n          max: 256,\n          step: 1,\n          get: () => Number(this.options.negativesPerNode ?? 48),\n          set: (value) => this.setSettings({ negativesPerNode: value }, { reheat: true }),\n        },\n        {\n          key: 'repulsionExponent',\n          label: 'Repulsion exp.',\n          type: 'number',\n          min: 0.1,\n          max: 4,\n          step: 0.05,\n          get: () => Number(this.options.repulsionExponent ?? 2),\n          set: (value) => this.setSettings({ repulsionExponent: value }, { reheat: true }),\n        },\n        {\n          key: 'attractionExponent',\n          label: 'Attraction exp.',\n          type: 'number',\n          min: 0.1,\n          max: 4,\n          step: 0.05,\n          get: () => Number(this.options.attractionExponent ?? 1),\n          set: (value) => this.setSettings({ attractionExponent: value }, { reheat: true }),\n        },\n        {\n          key: 'kRepulsion',\n          ...withLogScaleBinding({\n            label: 'Repulsion',\n            min: 0.06,\n            max: 600,\n          }),\n          get: () => Number(this.options.kRepulsion ?? 6),\n          set: (value) => this.setSettings({ kRepulsion: value }, { reheat: true }),\n        },\n        {\n          key: 'kAttraction',\n          ...withLogScaleBinding({\n            label: 'Attraction',\n            min: 0.000035,\n            max: 0.35,\n          }),\n          get: () => Number(this.options.kAttraction ?? 0.0035),\n          set: (value) => this.setSettings({ kAttraction: value }, { reheat: true }),\n        },\n        {\n          key: 'kGravity',\n          ...withLogScaleBinding({\n            label: 'Gravity',\n            min: 0.000005,\n            max: 0.05,\n            inputMin: 0,\n          }),\n          get: () => Number(this.options.kGravity ?? 0.0005),\n          set: (value) => this.setSettings({ kGravity: value }, { reheat: true }),\n        },\n        {\n          key: 'epsilon',\n          label: 'Softening',\n          type: 'number',\n          min: 0.001,\n          max: 5,\n          step: 0.01,\n          get: () => Number(this.options.epsilon ?? 0.25),\n          set: (value) => this.setSettings({ epsilon: value }, { reheat: true }),\n        },\n        {\n          key: 'minDistance',\n          label: 'Min distance',\n          type: 'number',\n          min: 0.001,\n          max: 10,\n          step: 0.01,\n          get: () => Number(this.options.minDistance ?? 0.25),\n          set: (value) => this.setSettings({ minDistance: value }, { reheat: true }),\n        },\n        {\n          key: 'maxForce',\n          label: 'Max force',\n          type: 'number',\n          min: 0.1,\n          max: 100,\n          step: 0.1,\n          get: () => Number(this.options.maxForce ?? 50),\n          set: (value) => this.setSettings({ maxForce: value }, { reheat: true }),\n        },\n        {\n          key: 'maxStep',\n          label: 'Max step',\n          type: 'number',\n          min: 0.01,\n          max: 10,\n          step: 0.01,\n          get: () => Number(this.options.maxStep ?? 3),\n          set: (value) => this.setSettings({ maxStep: value }, { reheat: true }),\n        },\n        {\n          key: 'eta',\n          label: 'Eta',\n          type: 'number',\n          min: 0.001,\n          max: 1,\n          step: 0.001,\n          get: () => Number(this.options.eta ?? 0.04),\n          set: (value) => this.setSettings({ eta: value }, { reheat: true }),\n        },\n        withVelocityRetentionBinding({\n          key: 'damping',\n          type: 'number',\n          min: 0,\n          max: 1,\n          step: 0.001,\n          get: () => Number(this.options.damping ?? 0.9),\n          set: (value) => this.setSettings({ damping: value }, { reheat: true }),\n        }),\n        {\n          key: 'theta',\n          label: 'Theta',\n          type: 'number',\n          min: 0.1,\n          max: 1.5,\n          step: 0.01,\n          get: () => Number(this.options.theta ?? 0.6),\n          set: (value) => this.setSettings({ theta: value }, { reheat: true }),\n        },\n        {\n          key: 'leafSize',\n          label: 'Leaf size',\n          type: 'number',\n          min: 1,\n          max: 128,\n          step: 1,\n          get: () => Number(this.options.leafSize ?? 16),\n          set: (value) => this.setSettings({ leafSize: value }, { reheat: true }),\n        },\n        {\n          key: 'recenter',\n          label: 'Recenter',\n          type: 'boolean',\n          get: () => this.options.recenter !== false,\n          set: (value) => this.setSettings({ recenter: value }),\n        },\n      ],\n    };\n  }\n\n  resize(size) {\n    if (!this.worker || !size) return;\n    const center =\n      Array.isArray(this.options.center) && this.options.center.length >= 2\n        ? this.options.center\n        : [0, 0, 0];\n    this.worker.postMessage({\n      type: 'resize',\n      center,\n    });\n  }\n\n  buildGraphPayload() {\n    return this.network.withBufferAccess(() => {\n      const nodeIndices = this.network.nodeIndices.slice();\n      const edgeIndices = this.network.edgeIndices;\n      const edgesView = this.network.edgesView;\n      const edges = new Uint32Array(edgeIndices.length * 2);\n      for (let i = 0; i < edgeIndices.length; i += 1) {\n        const id = edgeIndices[i];\n        const base = id * 2;\n        edges[i * 2] = edgesView[base];\n        edges[i * 2 + 1] = edgesView[base + 1];\n      }\n      return { nodeIndices, edges };\n    }, { nodeIndices: true, edgeIndices: true, edgesView: true });\n  }\n}\n","import { Layout, withLogScaleBinding } from './Layout.js';\n\nconst DEFAULT_SETTINGS = {\n  use2D: false,\n  forcesStrength: 1,\n  forcesRatio: 1,\n  repulsiveExponent: 1,\n  attractiveExponent: 1,\n  gravity: 0.05,\n  viscosity: 0.05,\n  collisionEnabled: false,\n  collisionRadius: 50,\n  linkDistance: 30,\n  forceNormalizationType: 'degree',\n  alpha: 1,\n  alphaDecay: 0.003,\n  alphaTarget: 0,\n  alphaMin: 0.001,\n  autoStopAtAlphaMin: true,\n  recenter: true,\n  center: [0, 0, 0],\n};\n\nconst DEFAULT_OPTIONS = {\n  updateIntervalMs: 0,\n  settings: {},\n  mode: '2d',\n};\n\nfunction resolveSeedBounds(options = {}) {\n  const mode = options.mode === '3d' ? '3d' : '2d';\n  const bounds = options.bounds ?? null;\n  if (Array.isArray(bounds) && bounds.length >= 4) {\n    const minX = Number(bounds[0]);\n    const minY = Number(bounds[1]);\n    const maxX = Number(bounds[2]);\n    const maxY = Number(bounds[3]);\n    if ([minX, minY, maxX, maxY].every(Number.isFinite)) {\n      return {\n        width: Math.max(1, maxX - minX),\n        height: Math.max(1, maxY - minY),\n        depth: 0,\n        mode,\n        center: [(minX + maxX) * 0.5, (minY + maxY) * 0.5, 0],\n      };\n    }\n  }\n\n  const settingsCenter = Array.isArray(options.settings?.center) ? options.settings.center : [0, 0, 0];\n  const radius = Number.isFinite(options.radius) ? Math.max(1, options.radius) : 150;\n  const depth = Number.isFinite(options.depth) ? Math.max(0, options.depth) : 0;\n  return {\n    width: radius,\n    height: radius,\n    depth: mode === '3d' ? depth : 0,\n    mode,\n    center: settingsCenter,\n  };\n}\n\nfunction createZeroableUnitLogBinding(binding) {\n  return withLogScaleBinding({\n    min: 0.000001,\n    max: 1,\n    inputMin: 0,\n    inputMax: 1,\n    ...binding,\n  });\n}\n\nfunction shouldAutoStopAtAlphaMin(alpha, alphaMin) {\n  const current = Number(alpha);\n  const min = Number(alphaMin);\n  if (!Number.isFinite(current) || !Number.isFinite(min)) return false;\n  return current <= (min + 1e-9);\n}\n\nfunction hash32(value) {\n  let x = value >>> 0;\n  x = (x ^ (x >>> 16)) >>> 0;\n  x = Math.imul(x, 0x7feb352d) >>> 0;\n  x = (x ^ (x >>> 15)) >>> 0;\n  x = Math.imul(x, 0x846ca68b) >>> 0;\n  x = (x ^ (x >>> 16)) >>> 0;\n  return x >>> 0;\n}\n\n/**\n * Worker-backed layout adapter for the D3 Force 3D engine.\n *\n * @public\n * @param {import('helios-network').default} network - Source graph.\n * @param {import('../pipeline/VisualAttributes.js').VisualAttributes} visuals\n * Visual attribute owner.\n * @param {object} [options] - D3 force settings and worker options.\n * @remarks Use this when CPU worker force layout behavior is preferred over\n * GPU force layout, especially for compatibility testing.\n */\nexport class D3Force3DLayout extends Layout {\n  constructor(network, visuals, options = {}) {\n    super(network, visuals);\n    const normalizedMode = options.mode === '3d' ? '3d' : '2d';\n    const defaults = { ...DEFAULT_OPTIONS, ...options, mode: normalizedMode };\n    const settings = { ...DEFAULT_SETTINGS, ...(defaults.settings ?? {}) };\n    if (typeof options.use2D === 'boolean') {\n      settings.use2D = options.use2D;\n    } else if (typeof options.mode === 'string') {\n      settings.use2D = options.mode !== '3d';\n    }\n\n    this.options = defaults;\n    this.settings = settings;\n    this.reheatAlpha = Number.isFinite(settings.alpha) ? Number(settings.alpha) : DEFAULT_SETTINGS.alpha;\n    this.helios = options.helios ?? null;\n    this.worker = null;\n    this.pending = false;\n    this.lastUpdate = 0;\n    this.optionsDirty = true;\n    this.seededPositions = false;\n    this._adoptOnlyNextTick = false;\n    this._awaitingAdoptOnlyResponse = false;\n  }\n\n  _seedPlanarDepthIfNeeded() {\n    const nodeIndices = this.network?.nodeIndices ?? null;\n    const positions = this.visuals?.nodePositions ?? null;\n    if (!nodeIndices?.length || !positions?.length || nodeIndices.length <= 1) return false;\n\n    let minZ = Infinity;\n    let maxZ = -Infinity;\n    for (let i = 0; i < nodeIndices.length; i += 1) {\n      const offset = (nodeIndices[i] >>> 0) * 3;\n      const z = positions[offset + 2];\n      if (!Number.isFinite(z)) continue;\n      if (z < minZ) minZ = z;\n      if (z > maxZ) maxZ = z;\n    }\n\n    const zRange = Number.isFinite(minZ) && Number.isFinite(maxZ) ? (maxZ - minZ) : 0;\n    const depth = Number.isFinite(this.options?.depth) ? Math.max(0, this.options.depth) : 0;\n    const radius = Number.isFinite(this.options?.radius) ? Math.max(1, this.options.radius) : 150;\n    const planarTolerance = Math.max(1e-6, depth * 1e-5, radius * 1e-6);\n    if (zRange > planarTolerance) return false;\n\n    const centerZ = Number.isFinite(this.settings?.center?.[2]) ? this.settings.center[2] : 0;\n    const jitterBase = depth > 1e-6 ? depth : Math.max(1, radius * 0.25);\n    const jitterAmplitude = Math.max(1e-3, jitterBase * 0.04);\n    let jitterMean = 0;\n    for (let i = 0; i < nodeIndices.length; i += 1) {\n      const nodeId = nodeIndices[i] >>> 0;\n      jitterMean += (((hash32((nodeId + 1) >>> 0) + 0.5) / 4294967296) - 0.5) * jitterAmplitude;\n    }\n    jitterMean /= nodeIndices.length;\n\n    for (let i = 0; i < nodeIndices.length; i += 1) {\n      const nodeId = nodeIndices[i] >>> 0;\n      const offset = nodeId * 3;\n      const jitter = ((((hash32((nodeId + 1) >>> 0) + 0.5) / 4294967296) - 0.5) * jitterAmplitude) - jitterMean;\n      positions[offset + 2] = centerZ + jitter;\n    }\n    this.visuals?.markPositionsDirty?.();\n    return true;\n  }\n\n  async initialize() {\n    this.worker = new Worker(new URL('../workers/d3force3dWorker.js', import.meta.url), {\n      type: 'module',\n    });\n    this.worker.onmessage = (event) => this.handleMessage(event.data);\n    this.worker.postMessage({\n      type: 'init',\n      options: {\n        settings: { ...this.settings },\n      },\n    });\n  }\n\n  shouldRun() {\n    return !this.isPositionHandoffPending() && !this.pending;\n  }\n\n  step() {\n    if (!this.worker || this.pending) {\n      return false;\n    }\n    if (!this.seededPositions) {\n      this.visuals?.seedMissingPositions?.(resolveSeedBounds(this.options));\n      this.seededPositions = true;\n    }\n    const now = performance.now();\n    this.pending = true;\n    let positionsCopy = null;\n    const snapshot = () => {\n      positionsCopy = new Float32Array(this.visuals.nodePositions);\n    };\n    if (typeof this.visuals?.withBufferAccess === 'function') {\n      this.visuals.withBufferAccess(snapshot);\n    } else {\n      snapshot();\n    }\n\n    const { nodeIndices, edges } = this.buildGraphPayload();\n    const message = {\n      type: 'tick',\n      timestamp: now,\n      positions: positionsCopy,\n      nodeIndices,\n      edges,\n    };\n    if (this._adoptOnlyNextTick) {\n      message.adoptOnly = true;\n      this._adoptOnlyNextTick = false;\n      this._awaitingAdoptOnlyResponse = true;\n    }\n    if (this.optionsDirty) {\n      message.options = { settings: { ...this.settings } };\n      this.optionsDirty = false;\n    }\n\n    this.worker.postMessage(message, [positionsCopy.buffer]);\n    this.lastUpdate = now;\n    return false;\n  }\n\n  handleMessage(message) {\n    if (message?.type === 'positions' && message.positions instanceof Float32Array) {\n      let view = null;\n      const apply = () => {\n        view = this.visuals.nodePositions;\n        const count = Math.min(view.length, message.positions.length);\n        for (let i = 0; i < count; i += 1) {\n          view[i] = message.positions[i];\n        }\n      };\n      if (typeof this.visuals?.withBufferAccess === 'function') {\n        this.visuals.withBufferAccess(apply);\n      } else {\n        apply();\n      }\n\n      if (Number.isFinite(message.alpha)) {\n        this.settings.alpha = message.alpha;\n      }\n      this.pending = false;\n      this._updateRequested = false;\n      if (\n        this.settings.autoStopAtAlphaMin !== false\n        && shouldAutoStopAtAlphaMin(this.settings.alpha, this.settings.alphaMin ?? DEFAULT_SETTINGS.alphaMin)\n      ) {\n        this.helios?.stopLayout?.('alpha-min');\n      }\n      this.visuals?.markPositionsDirty?.();\n      if (view) {\n        this.emitUpdate({\n          positions: view,\n          timestamp: performance.now(),\n          handoffAdopted: this._awaitingAdoptOnlyResponse === true,\n        });\n      }\n      this._awaitingAdoptOnlyResponse = false;\n      return true;\n    }\n    if (message?.type === 'ready') {\n      this.pending = false;\n      this._updateRequested = true;\n      return true;\n    }\n    return false;\n  }\n\n  dispose() {\n    if (this.worker) {\n      this.worker.terminate();\n      this.worker = null;\n    }\n  }\n\n  _applyReheatAlpha() {\n    this.settings.alpha = this.reheatAlpha;\n    this.options = {\n      ...this.options,\n      settings: {\n        ...(this.options.settings ?? {}),\n        ...this.settings,\n      },\n    };\n    this.optionsDirty = true;\n  }\n\n  _resumeStoppedLayout(reason = 'layout') {\n    const helios = this.helios ?? null;\n    const activeLayout = typeof helios?.layout === 'function'\n      ? helios.layout()\n      : helios?._layout;\n    const scheduler = helios?.scheduler ?? null;\n    const state = typeof scheduler?.getLayoutState === 'function'\n      ? scheduler.getLayoutState()\n      : (scheduler?.layoutEnabled !== false ? 'running' : 'stopped');\n    if (activeLayout !== this || state !== 'stopped') return;\n    scheduler?.setLayoutEnabled?.(true, reason);\n    scheduler?.requestLayout?.(reason);\n  }\n\n  setSettings(next = {}, { reheat = false } = {}) {\n    if (!next || typeof next !== 'object') return this;\n    const hadUse2D = this.settings.use2D === true;\n    let nextMode = this.options?.mode === '3d' ? '3d' : '2d';\n\n    if (Object.prototype.hasOwnProperty.call(next, 'mode')) {\n      nextMode = next.mode === '3d' ? '3d' : '2d';\n      this.options.mode = nextMode;\n    }\n    Object.entries(next).forEach(([key, value]) => {\n      if (key in DEFAULT_SETTINGS) {\n        this.settings[key] = value;\n      }\n    });\n    if (Object.prototype.hasOwnProperty.call(next, 'alpha')) {\n      this.reheatAlpha = Number.isFinite(next.alpha) ? Number(next.alpha) : this.reheatAlpha;\n    }\n    if (Object.prototype.hasOwnProperty.call(next, 'use2D')) {\n      this.settings.use2D = next.use2D === true;\n      this.options.mode = this.settings.use2D ? '2d' : '3d';\n    } else if (Object.prototype.hasOwnProperty.call(next, 'mode')) {\n      this.settings.use2D = nextMode !== '3d';\n    }\n\n    const switchedInto3D = hadUse2D && this.settings.use2D === false;\n    if (switchedInto3D) {\n      const apply = () => this._seedPlanarDepthIfNeeded();\n      if (typeof this.visuals?.withBufferAccess === 'function') {\n        this.visuals.withBufferAccess(apply);\n      } else {\n        apply();\n      }\n    }\n\n    this.options = {\n      ...this.options,\n      mode: this.settings.use2D ? '2d' : '3d',\n      settings: {\n        ...(this.options.settings ?? {}),\n        ...this.settings,\n      },\n    };\n    this.optionsDirty = true;\n    if (reheat) {\n      this._applyReheatAlpha();\n      super.reheat('layout-settings');\n      this._resumeStoppedLayout('layout-settings');\n    } else {\n      this.requestUpdate();\n    }\n    return this;\n  }\n\n  reheat(reason = 'layout') {\n    this._applyReheatAlpha();\n    super.reheat(reason);\n    this._resumeStoppedLayout(reason);\n    return this;\n  }\n\n  seedFromNetworkPositions() {\n    this.seededPositions = true;\n    this._adoptOnlyNextTick = true;\n    this.requestUpdate();\n    this.emitUpdate({ timestamp: performance.now(), layoutElapsedMs: 0 });\n    this.helios?.scheduler?.requestRender?.();\n    return this;\n  }\n\n  completePositionHandoff(snapshot = null, options = {}) {\n    const wrote = super.completePositionHandoff(snapshot, options);\n    if (wrote) {\n      this.seededPositions = true;\n      this._adoptOnlyNextTick = true;\n    }\n    return wrote;\n  }\n\n  adoptHandoffState(state = {}) {\n    const nextAlpha = Number(state?.alpha);\n    if (Number.isFinite(nextAlpha)) {\n      const alphaMin = Number.isFinite(this.settings.alphaMin) ? this.settings.alphaMin : DEFAULT_SETTINGS.alphaMin;\n      const clamped = Math.max(alphaMin, Math.min(1, nextAlpha));\n      this.settings.alpha = clamped;\n      this.reheatAlpha = clamped;\n    }\n    if (Array.isArray(state?.center) && state.center.length >= 3) {\n      this.settings.center = [\n        Number.isFinite(state.center[0]) ? Number(state.center[0]) : 0,\n        Number.isFinite(state.center[1]) ? Number(state.center[1]) : 0,\n        Number.isFinite(state.center[2]) ? Number(state.center[2]) : 0,\n      ];\n    }\n    this.options = {\n      ...this.options,\n      settings: {\n        ...(this.options.settings ?? {}),\n        ...this.settings,\n      },\n    };\n    this.optionsDirty = true;\n    return this;\n  }\n\n  getParameterBindings() {\n    return {\n      key: 'd3force3d',\n      label: 'D3 Force 3D (worker)',\n      dynamic: true,\n      bindings: [\n        {\n          key: 'alphaCurrent',\n          label: 'Temp.',\n          type: 'display',\n          get: () => Number(this.settings.alpha ?? DEFAULT_SETTINGS.alpha),\n          format: (value) => Number(value).toFixed(4),\n          history: {\n            length: 20,\n            sampleMs: 1500,\n            scale: 'log',\n            min: () => {\n              const alphaMin = Number(this.settings.alphaMin ?? DEFAULT_SETTINGS.alphaMin);\n              return alphaMin > 0 ? alphaMin : null;\n            },\n            max: 1,\n          },\n        },\n        {\n          key: 'forcesStrength',\n          label: 'Force strength',\n          type: 'number',\n          min: 0,\n          max: 5,\n          step: 0.01,\n          get: () => Number(this.settings.forcesStrength ?? DEFAULT_SETTINGS.forcesStrength),\n          set: (value) => this.setSettings({ forcesStrength: value }, { reheat: true }),\n        },\n        {\n          key: 'forcesRatio',\n          ...withLogScaleBinding({\n            label: 'Force ratio',\n            min: 0.01,\n            max: 100,\n          }),\n          get: () => Number(this.settings.forcesRatio ?? DEFAULT_SETTINGS.forcesRatio),\n          set: (value) => this.setSettings({ forcesRatio: value }, { reheat: true }),\n        },\n        {\n          key: 'repulsiveExponent',\n          label: 'Repulsion exp.',\n          type: 'number',\n          min: 0.1,\n          max: 4,\n          step: 0.05,\n          get: () => Number(this.settings.repulsiveExponent ?? DEFAULT_SETTINGS.repulsiveExponent),\n          set: (value) => this.setSettings({ repulsiveExponent: value }, { reheat: true }),\n        },\n        {\n          key: 'attractiveExponent',\n          label: 'Attraction exp.',\n          type: 'number',\n          min: 0.1,\n          max: 4,\n          step: 0.05,\n          get: () => Number(this.settings.attractiveExponent ?? DEFAULT_SETTINGS.attractiveExponent),\n          set: (value) => this.setSettings({ attractiveExponent: value }, { reheat: true }),\n        },\n        {\n          key: 'gravity',\n          ...withLogScaleBinding({\n            label: 'Gravity',\n            min: 0.0005,\n            max: 5,\n          }),\n          get: () => Number(this.settings.gravity ?? DEFAULT_SETTINGS.gravity),\n          set: (value) => this.setSettings({ gravity: value }, { reheat: true }),\n        },\n        {\n          key: 'viscosity',\n          label: 'Viscosity',\n          type: 'number',\n          min: 0,\n          max: 1,\n          step: 0.001,\n          get: () => Number(this.settings.viscosity ?? DEFAULT_SETTINGS.viscosity),\n          set: (value) => this.setSettings({ viscosity: value }, { reheat: true }),\n        },\n        {\n          key: 'linkDistance',\n          label: 'Link distance',\n          type: 'number',\n          min: 1,\n          max: 300,\n          step: 1,\n          get: () => Number(this.settings.linkDistance ?? DEFAULT_SETTINGS.linkDistance),\n          set: (value) => this.setSettings({ linkDistance: value }, { reheat: true }),\n        },\n        {\n          key: 'collisionEnabled',\n          label: 'Collision',\n          type: 'boolean',\n          get: () => Boolean(this.settings.collisionEnabled),\n          set: (value) => this.setSettings({ collisionEnabled: value }, { reheat: true }),\n        },\n        {\n          key: 'collisionRadius',\n          label: 'Collision radius',\n          type: 'number',\n          min: 0,\n          max: 200,\n          step: 1,\n          get: () => Number(this.settings.collisionRadius ?? DEFAULT_SETTINGS.collisionRadius),\n          set: (value) => this.setSettings({ collisionRadius: value }, { reheat: true }),\n        },\n        {\n          key: 'forceNormalizationType',\n          label: 'Normalize by',\n          type: 'select',\n          options: [\n            { value: 'degree', label: 'Degree' },\n            { value: 'strength', label: 'Strength' },\n            { value: 'none', label: 'None' },\n          ],\n          get: () => String(this.settings.forceNormalizationType ?? DEFAULT_SETTINGS.forceNormalizationType),\n          set: (value) => this.setSettings({ forceNormalizationType: value }, { reheat: true }),\n        },\n        {\n          key: 'autoStopAtAlphaMin',\n          label: 'Stop at min temp',\n          type: 'boolean',\n          get: () => this.settings.autoStopAtAlphaMin !== false,\n          set: (value) => this.setSettings({ autoStopAtAlphaMin: value !== false }),\n        },\n        {\n          key: 'alphaDecay',\n          ...createZeroableUnitLogBinding({\n            label: 'Temp. decay',\n          }),\n          get: () => Number(this.settings.alphaDecay ?? DEFAULT_SETTINGS.alphaDecay),\n          set: (value) => this.setSettings({ alphaDecay: value }, { reheat: true }),\n        },\n        {\n          key: 'alphaTarget',\n          ...createZeroableUnitLogBinding({\n            label: 'Temp. target',\n          }),\n          get: () => Number(this.settings.alphaTarget ?? DEFAULT_SETTINGS.alphaTarget),\n          set: (value) => this.setSettings({ alphaTarget: value }, { reheat: true }),\n        },\n        {\n          key: 'alphaMin',\n          ...createZeroableUnitLogBinding({\n            label: 'Temp. min',\n          }),\n          get: () => Number(this.settings.alphaMin ?? DEFAULT_SETTINGS.alphaMin),\n          set: (value) => this.setSettings({ alphaMin: value }, { reheat: true }),\n        },\n        {\n          key: 'recenter',\n          label: 'Recenter',\n          type: 'boolean',\n          get: () => this.settings.recenter !== false,\n          set: (value) => this.setSettings({ recenter: value }),\n        },\n      ],\n    };\n  }\n\n  buildGraphPayload() {\n    return this.network.withBufferAccess(() => {\n      const nodeIndices = this.network.nodeIndices.slice();\n      const edgeIndices = this.network.edgeIndices;\n      const edgesView = this.network.edgesView;\n      const edges = new Uint32Array(edgeIndices.length * 2);\n      for (let i = 0; i < edgeIndices.length; i += 1) {\n        const id = edgeIndices[i];\n        const base = id * 2;\n        edges[i * 2] = edgesView[base];\n        edges[i * 2 + 1] = edgesView[base + 1];\n      }\n      return { nodeIndices, edges };\n    }, { nodeIndices: true, edgeIndices: true, edgesView: true });\n  }\n}\n\nexport default D3Force3DLayout;\n","const NETWORK_REPLACED_EVENT = 'network:replaced';\nconst INDEX_ATTRIBUTE = '$index';\n\nfunction safeVersion(value, fallback = 0) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return fallback;\n  return numeric;\n}\n\nfunction nextCounter(value) {\n  const current = safeVersion(value, 0);\n  if (current >= Number.MAX_SAFE_INTEGER) return 0;\n  return current + 1;\n}\n\nfunction warnOnce(owner, key, message, detail) {\n  if (!owner) return;\n  owner._warnedIssues ??= new Set();\n  if (owner._warnedIssues.has(key)) return;\n  owner._warnedIssues.add(key);\n  console.warn(message, detail);\n}\n\n/**\n * Abstract source for layout positions owned outside the network buffers.\n *\n * @public\n * @returns {PositionDelegate} Subclasses provide synchronized topology and\n * position snapshots for renderers.\n * @remarks Use position delegates when layout state lives in GPU buffers or\n * another external system. Subclasses must implement synchronization hooks and\n * bump `version` whenever positions change.\n */\nexport class PositionDelegate {\n  constructor() {\n    if (new.target === PositionDelegate) {\n      throw new TypeError('PositionDelegate is abstract. Extend it and implement synchronizeTopology(context).');\n    }\n    this.version = 0;\n    this._attached = false;\n    this._context = null;\n    this._versionSnapshot = null;\n    this._versionKey = '';\n    this._topologyDirty = true;\n    this._topologyDirtyReason = 'init';\n    this._unsubscribeNetworkReplaced = null;\n    this._warnedIssues = new Set();\n    this._onNetworkReplacedBound = (event) => {\n      const helios = this._context?.helios ?? null;\n      const nextNetwork = event?.detail?.network ?? helios?.network ?? this._context?.network ?? null;\n      const merged = this._mergeContext({\n        ...this._context,\n        helios,\n        network: nextNetwork,\n        visuals: helios?.visuals ?? this._context?.visuals ?? null,\n        renderer: helios?.renderer ?? this._context?.renderer ?? null,\n        scheduler: helios?.scheduler ?? this._context?.scheduler ?? null,\n      });\n      this.markTopologyDirty('network:replaced');\n      this.ensureSynchronized(merged);\n      if (typeof this.didReplaceNetwork === 'function') {\n        this.didReplaceNetwork({ ...merged, event });\n      }\n    };\n  }\n\n  onAttach(context = {}) {\n    const merged = this._mergeContext(context);\n    this._context = merged;\n    this._attached = true;\n    this._bindNetworkReplaced(merged.helios);\n    this.markTopologyDirty('attach');\n    this.ensureSynchronized(merged);\n    if (typeof this.didAttach === 'function') {\n      this.didAttach(merged);\n    }\n  }\n\n  onDetach(context = {}) {\n    const merged = this._mergeContext(context);\n    this._unbindNetworkReplaced();\n    this._attached = false;\n    this._context = null;\n    this._versionSnapshot = null;\n    this._versionKey = '';\n    this.markTopologyDirty('detach');\n    if (typeof this.didDetach === 'function') {\n      this.didDetach(merged);\n    }\n  }\n\n  markTopologyDirty(reason = 'manual') {\n    this._topologyDirty = true;\n    this._topologyDirtyReason = reason;\n  }\n\n  bumpVersion() {\n    this.version = nextCounter(this.version);\n    return this.version;\n  }\n\n  getVersion(context = {}) {\n    this.ensureSynchronized(context);\n    return safeVersion(this.version, 0);\n  }\n\n  getNodePositionView(context = {}) {\n    this.ensureSynchronized(context);\n    return null;\n  }\n\n  getPositionView(context = {}) {\n    return this.getNodePositionView(context);\n  }\n\n  getWebGPUPositionBuffer(context = {}) {\n    this.ensureSynchronized(context);\n    return null;\n  }\n\n  getWebGLPositionTexture(context = {}) {\n    this.ensureSynchronized(context);\n    return null;\n  }\n\n  getGpuPositionResource(context = {}) {\n    this.ensureSynchronized(context);\n    return null;\n  }\n\n  getPositionResource(context = {}) {\n    return this.getGpuPositionResource(context);\n  }\n\n  async flattenNodeDepthToPlane(context = {}, zValue = 0) {\n    this.ensureSynchronized(context);\n    void zValue;\n    return false;\n  }\n\n  ensureSynchronized(context = {}) {\n    const merged = this._mergeContext(context);\n    this._context = merged;\n    const network = merged.network ?? null;\n    if (!network) return false;\n    const previous = this._versionSnapshot;\n    let snapshot = context.versionSnapshot ?? null;\n    if (!snapshot) {\n      try {\n        snapshot = this.captureNetworkVersionSnapshot(network);\n      } catch (_) {\n        warnOnce(\n          this,\n          'capture-network-version-snapshot',\n          'PositionDelegate: failed to capture network version snapshot during synchronization.',\n          { context: merged },\n        );\n        return false;\n      }\n    }\n    const lostNodeIndices = previous?.nodeIndicesReadable && !snapshot?.nodeIndicesReadable;\n    const lostEdgeIndices = previous?.edgeIndicesReadable && !snapshot?.edgeIndicesReadable;\n    if (!this._topologyDirty && (lostNodeIndices || lostEdgeIndices)) {\n      return false;\n    }\n    const versionKey = this._snapshotKey(snapshot);\n    const changed = this._topologyDirty || versionKey !== this._versionKey;\n    if (!changed) return false;\n    this.synchronizeTopology({\n      ...merged,\n      previousVersionSnapshot: previous,\n      versionSnapshot: snapshot,\n      reason: this._topologyDirty ? this._topologyDirtyReason : 'version-change',\n    });\n    this._versionSnapshot = snapshot;\n    this._versionKey = versionKey;\n    this._topologyDirty = false;\n    this._topologyDirtyReason = null;\n    this.bumpVersion();\n    return true;\n  }\n\n  captureNetworkVersionSnapshot(network) {\n    const topology = this._readTopologyVersions(network);\n    const active = this._readActiveIndexSnapshot(network);\n    const nodeIndexAttributeVersion = this._readIndexAttributeVersion(network, 'node');\n    const edgeIndexAttributeVersion = this._readIndexAttributeVersion(network, 'edge');\n    return {\n      topologyNode: topology.node,\n      topologyEdge: topology.edge,\n      nodeIndicesVersion: safeVersion(active?.node?.version, 0),\n      edgeIndicesVersion: safeVersion(active?.edge?.version, 0),\n      nodeIndicesCount: safeVersion(active?.node?.length, 0),\n      edgeIndicesCount: safeVersion(active?.edge?.length, 0),\n      nodeIndexAttributeVersion,\n      edgeIndexAttributeVersion,\n      nodeIndicesReadable: active?.node instanceof Uint32Array,\n      edgeIndicesReadable: active?.edge instanceof Uint32Array,\n    };\n  }\n\n  synchronizeTopology() {\n    throw new Error('PositionDelegate subclasses must implement synchronizeTopology(context).');\n  }\n\n  _readTopologyVersions(network) {\n    if (!network || typeof network.getTopologyVersions !== 'function') {\n      return { node: 0, edge: 0 };\n    }\n    try {\n      const versions = network.getTopologyVersions() ?? {};\n      return {\n        node: safeVersion(versions.node, 0),\n        edge: safeVersion(versions.edge, 0),\n      };\n    } catch (_) {\n      warnOnce(\n        this,\n        'read-topology-versions',\n        'PositionDelegate: failed to read topology versions; using zero versions.',\n        { network },\n      );\n      return { node: 0, edge: 0 };\n    }\n  }\n\n  _readActiveIndexSnapshot(network) {\n    if (!network) return null;\n    try {\n      if (typeof network.withBufferAccess === 'function') {\n        return network.withBufferAccess(() => ({\n          node: network.nodeIndices ?? null,\n          edge: network.edgeIndices ?? null,\n        }), { nodeIndices: true, edgeIndices: true });\n      }\n      return {\n        node: network.nodeIndices ?? null,\n        edge: network.edgeIndices ?? null,\n      };\n    } catch (_) {\n      warnOnce(\n        this,\n        'read-active-index-snapshot',\n        'PositionDelegate: failed to read active index snapshot; topology sync may be skipped.',\n        { network },\n      );\n      return null;\n    }\n  }\n\n  _readIndexAttributeVersion(network, kind) {\n    if (!network) return 0;\n    const topologyVersions = this._readTopologyVersions(network);\n    const internalMap = kind === 'edge' ? network._edgeAttributes : network._nodeAttributes;\n    if (internalMap?.has?.(INDEX_ATTRIBUTE) === false) {\n      return safeVersion(kind === 'edge' ? topologyVersions.edge : topologyVersions.node, 0);\n    }\n    const hasGetter = kind === 'edge' ? network.hasEdgeAttribute : network.hasNodeAttribute;\n    const infoGetter = kind === 'edge' ? network.getEdgeAttributeInfo : network.getNodeAttributeInfo;\n    let attributeExists = null;\n    if (typeof hasGetter === 'function') {\n      try {\n        attributeExists = Boolean(hasGetter.call(network, INDEX_ATTRIBUTE));\n      } catch (_) {\n        attributeExists = null;\n      }\n    } else if (typeof infoGetter === 'function') {\n      try {\n        attributeExists = Boolean(infoGetter.call(network, INDEX_ATTRIBUTE));\n      } catch (_) {\n        attributeExists = null;\n      }\n    }\n    try {\n      if (kind === 'edge') {\n        if (attributeExists === false && Number.isFinite(topologyVersions.edge)) {\n          return safeVersion(topologyVersions.edge, 0);\n        }\n        if (typeof network.getEdgeAttributeVersion === 'function') {\n          return safeVersion(network.getEdgeAttributeVersion(INDEX_ATTRIBUTE), 0);\n        }\n        if (typeof network.withBufferAccess === 'function') {\n          return safeVersion(\n            network.withBufferAccess(() => network.getEdgeAttributeBuffer?.(INDEX_ATTRIBUTE)?.version, { edgeIndices: true }),\n            0,\n          );\n        }\n        return safeVersion(network.getEdgeAttributeBuffer?.(INDEX_ATTRIBUTE)?.version, 0);\n      }\n      if (attributeExists === false && Number.isFinite(topologyVersions.node)) {\n        return safeVersion(topologyVersions.node, 0);\n      }\n      if (typeof network.getNodeAttributeVersion === 'function') {\n        return safeVersion(network.getNodeAttributeVersion(INDEX_ATTRIBUTE), 0);\n      }\n      if (typeof network.withBufferAccess === 'function') {\n        return safeVersion(\n          network.withBufferAccess(() => network.getNodeAttributeBuffer?.(INDEX_ATTRIBUTE)?.version, { nodeIndices: true }),\n          0,\n        );\n      }\n      return safeVersion(network.getNodeAttributeBuffer?.(INDEX_ATTRIBUTE)?.version, 0);\n    } catch (_) {\n      warnOnce(\n        this,\n        `read-index-attribute-version:${kind}`,\n        `PositionDelegate: failed to read ${kind} $index attribute version; using zero.`,\n        { network },\n      );\n      return safeVersion(kind === 'edge' ? topologyVersions.edge : topologyVersions.node, 0);\n    }\n  }\n\n  _snapshotKey(snapshot) {\n    if (!snapshot) return '';\n    return [\n      snapshot.topologyNode,\n      snapshot.topologyEdge,\n      snapshot.nodeIndicesVersion,\n      snapshot.edgeIndicesVersion,\n      snapshot.nodeIndicesCount,\n      snapshot.edgeIndicesCount,\n      snapshot.nodeIndexAttributeVersion,\n      snapshot.edgeIndexAttributeVersion,\n    ].join('|');\n  }\n\n  _bindNetworkReplaced(helios) {\n    this._unbindNetworkReplaced();\n    if (!helios || typeof helios.on !== 'function') return;\n    try {\n      this._unsubscribeNetworkReplaced = helios.on(NETWORK_REPLACED_EVENT, this._onNetworkReplacedBound);\n    } catch (_) {\n      warnOnce(\n        this,\n        'bind-network-replaced',\n        'PositionDelegate: failed to subscribe to network:replaced events.',\n        { helios },\n      );\n      this._unsubscribeNetworkReplaced = null;\n    }\n  }\n\n  _unbindNetworkReplaced() {\n    if (typeof this._unsubscribeNetworkReplaced === 'function') {\n      try {\n        this._unsubscribeNetworkReplaced();\n      } catch (error) {\n        console.warn('PositionDelegate: failed to unsubscribe network-replaced listener.', error);\n      }\n    }\n    this._unsubscribeNetworkReplaced = null;\n  }\n\n  _mergeContext(context = {}) {\n    const previous = this._context ?? {};\n    return {\n      helios: context.helios ?? previous.helios ?? null,\n      network: context.network ?? previous.network ?? null,\n      visuals: context.visuals ?? previous.visuals ?? null,\n      renderer: context.renderer ?? previous.renderer ?? null,\n      scheduler: context.scheduler ?? previous.scheduler ?? null,\n      graphLayer: context.graphLayer ?? previous.graphLayer ?? null,\n      backend: context.backend ?? previous.backend ?? null,\n      device: context.device ?? previous.device ?? null,\n      gl: context.gl ?? previous.gl ?? null,\n    };\n  }\n}\n\nexport default PositionDelegate;\n","import { NODE_POSITION_ATTRIBUTE } from '../pipeline/constants.js';\nimport { PositionDelegate } from './PositionDelegate.js';\n\nconst WORKGROUP_SIZE = 64;\nconst STORAGE_FLAG = 0x80;\nconst COPY_SRC_FLAG = 0x04;\nconst COPY_DST_FLAG = 0x08;\nconst UNIFORM_FLAG = 0x40;\nconst MAP_READ_FLAG = 0x01;\nconst PARTIAL_CENTROID_CPU_THRESHOLD = 256;\nconst LAYOUT_CHUNK_AUTO_NODE_THRESHOLD = 500_000;\nconst DEFAULT_LAYOUT_CHUNK_NODE_COUNT = 65_536;\nconst DEFAULT_LAYOUT_CHUNK_COUNT = 2;\nconst MIN_LAYOUT_CHUNK_COUNT = 2;\nconst MAX_LAYOUT_CHUNK_COUNT = 10;\nconst WARNING_KEYS_BY_OWNER = new WeakMap();\nlet FALLBACK_VERSION_COUNTER = 1;\n\nconst DEFAULT_OPTIONS = {\n  mode: '3d',\n  forceModel: 'linear',\n  layoutScheduling: 'auto',\n  layoutChunkCount: DEFAULT_LAYOUT_CHUNK_COUNT,\n  center: [0, 0, 0],\n  radius: 220,\n  depth: 140,\n  sampleCount: null,\n  sampleCount2D: 64,\n  sampleCount3D: 96,\n  sampleChurn: 0,\n  exactRepulsionThreshold2D: 256,\n  exactRepulsionThreshold3D: 128,\n  maxNeighborsPerNode: 64,\n  outputScale: 6.5,\n  linkDistance: 1,\n  kRepulsion: 1,\n  kAttraction: 0.62,\n  kGravity: 0.001,\n  edgeWeightAttribute: null,\n  nodeMassAttribute: null,\n  forceNormalizationType: 'local-degree',\n  umapA: 1.5769434601962196,\n  umapB: 0.8950608779914887,\n  umapGamma: 1,\n  umapNeighborCount: 15,\n  umapNegativeSampleRate: 5,\n  umapEpochs: null,\n  eta: 0.4,\n  damping: 0.82,\n  maxStep: 2.5,\n  minDistance: 0.15,\n  alpha: 1,\n  alphaDecay: 0.003,\n  alphaTarget: 0,\n  alphaMin: 0.001,\n  recenter: true,\n  rotationDamping: 0.6,\n  resetAlphaOnTopologyChange: true,\n  seed: 0,\n  umapHasInitialPositions: false,\n  componentForces: 'auto',\n  componentMode: 'weak',\n  componentSeeding: false,\n  componentGravity: true,\n  componentMainGravityScale: 1.5,\n  componentSingletonGravityScale: 0.25,\n};\n\nfunction warnOnce(owner, key, message, detail = undefined) {\n  if (typeof console === 'undefined' || typeof console.warn !== 'function') return;\n  const target = owner && (typeof owner === 'object' || typeof owner === 'function') ? owner : warnOnce;\n  let keys = WARNING_KEYS_BY_OWNER.get(target);\n  if (!keys) {\n    keys = new Set();\n    WARNING_KEYS_BY_OWNER.set(target, keys);\n  }\n  if (keys.has(key)) return;\n  keys.add(key);\n  if (detail === undefined) console.warn(message);\n  else console.warn(message, detail);\n}\n\nfunction nextFallbackVersion() {\n  FALLBACK_VERSION_COUNTER += 1;\n  return FALLBACK_VERSION_COUNTER;\n}\n\nconst DEFAULT_UMAP_EPOCHS_SMALL = 500;\nconst DEFAULT_UMAP_EPOCHS_LARGE = 200;\nconst DEFAULT_UMAP_SAMPLE_CHURN = 0.01;\nconst DEFAULT_UMAP_ALPHA_DECAY = 0.0025;\n\nfunction buildComputeWgsl({ umap = false, scalar = false, normalized = false } = {}) {\n  return /* wgsl */ `\nstruct Params {\n  counts : vec4<u32>,\n  flags : vec4<u32>,\n  dispatch : vec4<u32>,\n  constantsA : vec4<f32>,\n  constantsB : vec4<f32>,\n  center : vec4<f32>,\n  constantsC : vec4<f32>,\n  chunk : vec4<u32>,\n};\n\n@group(0) @binding(0) var<storage, read> positionsIn : array<f32>;\n@group(0) @binding(1) var<storage, read> velocitiesIn : array<f32>;\n@group(0) @binding(2) var<storage, read_write> positionsOut : array<f32>;\n@group(0) @binding(3) var<storage, read_write> velocitiesOut : array<f32>;\n@group(0) @binding(4) var<storage, read> activeIds : array<u32>;\n@group(0) @binding(5) var<storage, read> activeMask : array<u32>;\n@group(0) @binding(6) var<storage, read> neighborStarts : array<u32>;\n@group(0) @binding(7) var<storage, read> neighborCounts : array<u32>;\n@group(0) @binding(8) var<storage, read> neighbors : array<u32>;\n${umap\n  ? '@group(0) @binding(9) var<storage, read> scalarWeights : array<f32>;\\n@group(0) @binding(10) var<uniform> params : Params;'\n  : scalar\n    ? '@group(0) @binding(9) var<storage, read> componentGravityScale : array<f32>;\\n@group(0) @binding(10) var<storage, read> neighborEdges : array<u32>;\\n@group(0) @binding(11) var<storage, read> scalarValues : array<f32>;\\n@group(0) @binding(12) var<uniform> params : Params;'\n    : '@group(0) @binding(9) var<storage, read> componentGravityScale : array<f32>;\\n@group(0) @binding(10) var<uniform> params : Params;'}\n\nfn hash32(value : u32) -> u32 {\n  var x = value;\n  x = x ^ (x >> 16u);\n  x = x * 0x7feb352du;\n  x = x ^ (x >> 15u);\n  x = x * 0x846ca68bu;\n  x = x ^ (x >> 16u);\n  return x;\n}\n\nfn clipGradient(value : f32) -> f32 {\n  return clamp(value, -4.0, 4.0);\n}\n\nfn sampleActiveId(nodeId : u32, iter : u32, activeCount : u32, seed : u32) -> u32 {\n  if (activeCount == 0u) {\n    return nodeId;\n  }\n  let mixed = hash32(seed + nodeId * 2654435761u + iter * 747796405u);\n  let index = mixed % activeCount;\n  return activeIds[index];\n}\n\nfn sampleEpoch(iter : u32, sampleCount : u32, churnCount : u32, sampleFrame : u32) -> u32 {\n  if (sampleCount == 0u || churnCount == 0u) {\n    return 0u;\n  }\n  let cappedChurn = min(churnCount, sampleCount);\n  return ((sampleFrame * cappedChurn) + (sampleCount - 1u - iter)) / sampleCount;\n}\n\nfn sampleActiveIdProgressive(\n  nodeId : u32,\n  iter : u32,\n  activeCount : u32,\n  seed : u32,\n  sampleCount : u32,\n  churnCount : u32,\n  sampleFrame : u32,\n) -> u32 {\n  if (activeCount == 0u) {\n    return nodeId;\n  }\n  let epoch = sampleEpoch(iter, sampleCount, churnCount, sampleFrame);\n  let epochSeed = seed + epoch * 1597334677u;\n  return sampleActiveId(nodeId, iter, activeCount, epochSeed);\n}\n\nfn sampleNeighborIndex(start : u32, limit : u32, nodeId : u32, iter : u32, seed : u32, sampleFrame : u32) -> u32 {\n  if (limit == 0u) {\n    return start;\n  }\n  let mixed = hash32(seed + nodeId * 2246822519u + iter * 3266489917u + sampleFrame * 668265263u);\n  return start + (mixed % limit);\n}\n\nfn samplesDue(epoch : f32, interval : f32) -> u32 {\n  if (!(interval > 0.0)) {\n    return 0u;\n  }\n  let previousEpoch = max(0.0, epoch - 1.0);\n  let previousBucket = floor(previousEpoch / interval);\n  let currentBucket = floor(epoch / interval);\n  return u32(max(0.0, currentBucket - previousBucket));\n}\n\nfn loadPosition(nodeId : u32) -> vec3<f32> {\n  let base = nodeId * 3u;\n  return vec3<f32>(\n    positionsIn[base + 0u],\n    positionsIn[base + 1u],\n    positionsIn[base + 2u],\n  );\n}\n\nfn loadVelocity(nodeId : u32) -> vec3<f32> {\n  let base = nodeId * 3u;\n  return vec3<f32>(\n    velocitiesIn[base + 0u],\n    velocitiesIn[base + 1u],\n    velocitiesIn[base + 2u],\n  );\n}\n\nfn storePosition(nodeId : u32, value : vec3<f32>) {\n  let base = nodeId * 3u;\n  positionsOut[base + 0u] = value.x;\n  positionsOut[base + 1u] = value.y;\n  positionsOut[base + 2u] = value.z;\n}\n\nfn storeVelocity(nodeId : u32, value : vec3<f32>) {\n  let base = nodeId * 3u;\n  velocitiesOut[base + 0u] = value.x;\n  velocitiesOut[base + 1u] = value.y;\n  velocitiesOut[base + 2u] = value.z;\n}\n\n@compute @workgroup_size(${WORKGROUP_SIZE}u)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n  let localNodeId = gid.x + (gid.y * params.dispatch.x) + (gid.z * params.dispatch.y);\n  let nodeId = localNodeId + params.chunk.x;\n  if (localNodeId >= params.chunk.y) {\n    return;\n  }\n  let nodeCapacity = params.counts.y;\n  if (nodeId >= nodeCapacity) {\n    return;\n  }\n\n  if (activeMask[nodeId] == 0u) {\n    storePosition(nodeId, loadPosition(nodeId));\n    storeVelocity(nodeId, loadVelocity(nodeId));\n    return;\n  }\n\n  let activeCount = params.counts.x;\n  let sampleCount = params.counts.z;\n  let maxNeighbors = params.counts.w;\n  let use3D = params.flags.x;\n  let sampleChurnCount = params.flags.y;\n  let seed = params.flags.z;\n  let exactRepulsionThreshold = params.flags.w;\n  let sampleFrame = params.dispatch.z;\n  let scalarFlags = params.dispatch.w;\n  let normalizationMode = scalarFlags & 255u;\n  let hasEdgeWeights = (scalarFlags & 256u) != 0u;\n\n  var pos = loadPosition(nodeId);\n  var vel = loadVelocity(nodeId);\n  if (use3D == 0u) {\n    pos.z = params.center.z;\n    vel.z = 0.0;\n  }\n\n  var force = vec3<f32>(0.0, 0.0, 0.0);\n  let minDist = max(1e-5, params.constantsB.z);\n  let minDistSq = minDist * minDist;\n${umap\n  ? `  let umapA = max(1e-6, params.constantsC.x);\n  let umapB = max(1e-6, params.constantsC.y);\n  let umapGamma = max(0.0, params.constantsC.z);\n  let umapNegativeSampleRate = max(0.0, params.constantsC.w);\n  let umapEpochs = max(1.0, params.constantsB.w);\n  let minEdgeWeight = 1.0 / umapEpochs;\n  let currentEpoch = f32(sampleFrame + 1u);`\n  : ''}\n\n${umap\n  ? ''\n  : `  if (activeCount > 1u) {\n    let useExactRepulsion = activeCount <= max(sampleCount, exactRepulsionThreshold);\n    let repulsionIterations = select(sampleCount, activeCount, useExactRepulsion);\n    if (repulsionIterations > 0u) {\n      let repulsionNormalization = select(\n        max(1.0, f32(activeCount) / max(1.0, f32(sampleCount))),\n        1.0,\n        useExactRepulsion,\n      );\n      var s : u32 = 0u;\n      loop {\n        if (s >= repulsionIterations) {\n          break;\n        }\n        let otherId = select(\n          sampleActiveIdProgressive(nodeId, s, activeCount, seed, sampleCount, sampleChurnCount, sampleFrame),\n          activeIds[s],\n          useExactRepulsion,\n        );\n        if (otherId != nodeId) {\n          var delta = pos - loadPosition(otherId);\n          if (use3D == 0u) {\n            delta.z = 0.0;\n          }\n          let distSq = max(dot(delta, delta), minDistSq);\n          let invDist = inverseSqrt(distSq);\n          let repulsionScale = params.constantsA.x * repulsionNormalization * invDist * invDist * invDist;\n          force = force + delta * repulsionScale;\n        }\n        s = s + 1u;\n      }\n    }\n  }`}\n  let start = neighborStarts[nodeId];\n  let degree = neighborCounts[nodeId];\n  let limit = min(degree, maxNeighbors);\n  if (limit > 0u) {\n${umap\n  ? `  var n : u32 = 0u;\n    loop {\n      if (n >= limit) {\n        break;\n      }\n      let edgeIndex = start + n;\n      let otherId = neighbors[edgeIndex];\n      if (otherId != nodeId) {\n        let edgeWeight = max(0.0, scalarWeights[nodeCapacity + edgeIndex]);\n        if (edgeWeight >= minEdgeWeight) {\n          let positiveInterval = 1.0 / max(edgeWeight, 1e-6);\n          let positiveDue = samplesDue(currentEpoch, positiveInterval);\n          if (positiveDue > 0u) {\n            var delta = loadPosition(otherId) - pos;\n            if (use3D == 0u) {\n              delta.z = 0.0;\n            }\n            let distSq = max(dot(delta, delta), minDistSq);\n            let springScale = params.constantsA.y\n              * f32(positiveDue)\n              * (2.0 * umapA * umapB * pow(distSq, umapB - 1.0))\n              / (1.0 + (umapA * pow(distSq, umapB)));\n            force = force + delta * springScale;\n          }\n\n          if (umapNegativeSampleRate > 0.0 && activeCount > 1u) {\n            let negativeInterval = positiveInterval / umapNegativeSampleRate;\n            let negativeDue = samplesDue(currentEpoch, negativeInterval);\n            var p : u32 = 0u;\n            loop {\n              if (p >= negativeDue) {\n                break;\n              }\n              let negativeIter = edgeIndex + p * maxNeighbors;\n              let negativeId = sampleActiveId(nodeId, negativeIter, activeCount, seed + sampleFrame * 668265263u);\n              if (negativeId != nodeId) {\n                var negativeDelta = pos - loadPosition(negativeId);\n                if (use3D == 0u) {\n                  negativeDelta.z = 0.0;\n                }\n                let negativeDistSq = max(dot(negativeDelta, negativeDelta), minDistSq);\n                let repulsionScale = params.constantsA.x\n                  * (2.0 * umapGamma * umapB)\n                  / ((0.001 + negativeDistSq) * (1.0 + (umapA * pow(negativeDistSq, umapB))));\n                force = force + negativeDelta * repulsionScale;\n              }\n              p = p + 1u;\n            }\n          }\n        }\n      }\n      n = n + 1u;\n    }`\n  : `    var n : u32 = 0u;\n    loop {\n      if (n >= limit) {\n        break;\n      }\n      let neighborIndex = start + n;\n      let otherId = neighbors[neighborIndex];\n      if (otherId != nodeId) {\n        var delta = loadPosition(otherId) - pos;\n        if (use3D == 0u) {\n          delta.z = 0.0;\n        }\n        let distSq = max(dot(delta, delta), minDistSq);\n        let dist = sqrt(distSq);\n        let invDist = 1.0 / dist;\n${scalar\n    ? `        let edgeId = neighborEdges[neighborIndex];\n        let edgeWeight = select(\n          1.0,\n          max(0.0, scalarValues[nodeCapacity + edgeId]),\n          hasEdgeWeights,\n        );\n        let otherDegree = neighborCounts[otherId];\n        let endpointDegreeNorm = max(1.0, f32(min(degree, otherDegree)));\n        let endpointStrengthNorm = max(1.0, min(\n          max(0.0, scalarValues[nodeId]),\n          max(0.0, scalarValues[otherId]),\n        ));\n        let degreeNorm = select(\n          max(1.0, f32(limit)),\n          endpointDegreeNorm,\n          normalizationMode == 1u,\n        );\n        let strengthOrDegreeNorm = select(\n          degreeNorm,\n          endpointStrengthNorm,\n          normalizationMode == 2u,\n        );\n        let finalNorm = select(\n          strengthOrDegreeNorm,\n          1.0,\n          normalizationMode == 3u,\n        );`\n    : normalized\n      ? `        let otherDegree = neighborCounts[otherId];\n        let endpointDegreeNorm = max(1.0, f32(min(degree, otherDegree)));\n        let localDegreeNorm = max(1.0, f32(limit));\n        let degreeNorm = select(\n          localDegreeNorm,\n          endpointDegreeNorm,\n          normalizationMode == 1u,\n        );\n        let finalNorm = select(\n          degreeNorm,\n          1.0,\n          normalizationMode == 3u,\n        );\n        let edgeWeight = 1.0;`\n      : `        let finalNorm = max(1.0, f32(limit));\n        let edgeWeight = 1.0;`}\n        let stretch = dist - params.constantsB.w;\n        let springScale = (params.constantsA.y * edgeWeight * stretch * invDist) / finalNorm;\n        force = force + delta * springScale;\n      }\n      n = n + 1u;\n    }`}\n  }\n\n  var gravityDelta = params.center.xyz - pos;\n  if (use3D == 0u) {\n    gravityDelta.z = 0.0;\n  }\n${umap\n  ? '  force = force + gravityDelta * params.constantsA.z;'\n  : `  let gravityScale = select(1.0, componentGravityScale[nodeId], params.chunk.z != 0u);\n  force = force + gravityDelta * params.constantsA.z * gravityScale;`}\n\n${umap\n  ? `  let eta = params.constantsA.w;\n  var nextDelta = vec3<f32>(\n    clipGradient(force.x) * eta,\n    clipGradient(force.y) * eta,\n    clipGradient(force.z) * eta,\n  );\n  let speed = length(nextDelta);\n  let maxStep = max(1e-5, params.constantsB.y);\n  if (speed > maxStep) {\n    nextDelta = nextDelta * (maxStep / speed);\n  }\n  if (use3D == 0u) {\n    nextDelta.z = 0.0;\n  }\n\n  var nextVel = nextDelta;\n  var nextPos = pos + nextDelta;\n  if (use3D == 0u) {\n    nextPos.z = params.center.z;\n  }`\n  : `  let eta = params.constantsA.w;\n  let damping = params.constantsB.x;\n  var nextVel = vel * damping + force * eta;\n\n  let speed = length(nextVel);\n  let maxStep = max(1e-5, params.constantsB.y);\n  if (speed > maxStep) {\n    nextVel = nextVel * (maxStep / speed);\n  }\n  if (use3D == 0u) {\n    nextVel.z = 0.0;\n  }\n\n  var nextPos = pos + nextVel;\n  if (use3D == 0u) {\n    nextPos.z = params.center.z;\n  }`}\n\n  storePosition(nodeId, nextPos);\n  storeVelocity(nodeId, nextVel);\n}\n`;\n}\n\nfunction buildCentroidReductionWgsl() {\n  return /* wgsl */ `\nstruct Params {\n  count : u32,\n  nodeCapacity : u32,\n  _pad0 : u32,\n  _pad1 : u32,\n};\n\n@group(0) @binding(0) var<storage, read> positions : array<f32>;\n@group(0) @binding(1) var<storage, read> nodeIds : array<u32>;\n@group(0) @binding(2) var<storage, read_write> partialSums : array<vec4<f32>>;\n@group(0) @binding(3) var<uniform> params : Params;\n\nvar<workgroup> localX : array<f32, ${PARTIAL_CENTROID_CPU_THRESHOLD}>;\nvar<workgroup> localY : array<f32, ${PARTIAL_CENTROID_CPU_THRESHOLD}>;\nvar<workgroup> localZ : array<f32, ${PARTIAL_CENTROID_CPU_THRESHOLD}>;\nvar<workgroup> localCount : array<f32, ${PARTIAL_CENTROID_CPU_THRESHOLD}>;\n\n@compute @workgroup_size(${PARTIAL_CENTROID_CPU_THRESHOLD})\nfn main(\n  @builtin(global_invocation_id) globalId : vec3<u32>,\n  @builtin(local_invocation_id) localId : vec3<u32>,\n  @builtin(workgroup_id) workgroupId : vec3<u32>\n) {\n  let localIndex = localId.x;\n  let index = globalId.x;\n  var x = 0.0;\n  var y = 0.0;\n  var z = 0.0;\n  var c = 0.0;\n  if (index < params.count) {\n    let nodeId = nodeIds[index];\n    if (nodeId < params.nodeCapacity) {\n      let base = nodeId * 3u;\n      x = positions[base + 0u];\n      y = positions[base + 1u];\n      z = positions[base + 2u];\n      c = 1.0;\n    }\n  }\n  localX[localIndex] = x;\n  localY[localIndex] = y;\n  localZ[localIndex] = z;\n  localCount[localIndex] = c;\n  workgroupBarrier();\n\n  var stride = ${PARTIAL_CENTROID_CPU_THRESHOLD / 2}u;\n  loop {\n    if (stride == 0u) {\n      break;\n    }\n    if (localIndex < stride) {\n      localX[localIndex] = localX[localIndex] + localX[localIndex + stride];\n      localY[localIndex] = localY[localIndex] + localY[localIndex + stride];\n      localZ[localIndex] = localZ[localIndex] + localZ[localIndex + stride];\n      localCount[localIndex] = localCount[localIndex] + localCount[localIndex + stride];\n    }\n    workgroupBarrier();\n    stride = stride / 2u;\n  }\n\n  if (localIndex == 0u) {\n    partialSums[workgroupId.x] = vec4<f32>(localX[0], localY[0], localZ[0], localCount[0]);\n  }\n}\n`;\n}\n\nconst COMPUTE_WGSL_LINEAR = buildComputeWgsl();\nconst COMPUTE_WGSL_LINEAR_NORMALIZED = buildComputeWgsl({ normalized: true });\nconst COMPUTE_WGSL_LINEAR_SCALAR = buildComputeWgsl({ scalar: true });\nconst COMPUTE_WGSL_UMAP = buildComputeWgsl({ umap: true });\n\nconst OUTPUT_SCALE_WGSL = /* wgsl */ `\nstruct OutputScaleParams {\n  counts : vec4<u32>,\n  dispatch : vec4<u32>,\n  center : vec4<f32>,\n  scale : vec4<f32>,\n  chunk : vec4<u32>,\n};\n\n@group(0) @binding(0) var<storage, read> positionsIn : array<f32>;\n@group(0) @binding(1) var<storage, read_write> positionsOut : array<f32>;\n@group(0) @binding(2) var<uniform> params : OutputScaleParams;\n\n@compute @workgroup_size(${WORKGROUP_SIZE}u)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n  let localNodeId = gid.x + (gid.y * params.dispatch.x) + (gid.z * params.dispatch.y);\n  let nodeId = localNodeId + params.chunk.x;\n  if (localNodeId >= params.chunk.y) {\n    return;\n  }\n  if (nodeId >= params.counts.x) {\n    return;\n  }\n\n  let base = nodeId * 3u;\n  let source = vec3<f32>(\n    positionsIn[base + 0u],\n    positionsIn[base + 1u],\n    positionsIn[base + 2u],\n  );\n  let centered = source - params.center.xyz;\n  var outputPos = params.center.xyz + centered * params.scale.x;\n  if (params.counts.y == 0u) {\n    outputPos.z = params.center.z;\n  }\n\n  positionsOut[base + 0u] = outputPos.x;\n  positionsOut[base + 1u] = outputPos.y;\n  positionsOut[base + 2u] = outputPos.z;\n}\n`;\n\nconst RECENTER_WGSL_BASE = /* wgsl */ `\nstruct RecenterParams {\n  counts : vec4<u32>,\n  center : vec4<f32>,\n};\n\n@group(0) @binding(0) var<storage, read_write> positions : array<f32>;\n@group(0) @binding(1) var<storage, read> activeIds : array<u32>;\n@group(0) @binding(2) var<uniform> params : RecenterParams;\n\nvar<workgroup> partialX : array<f32, ${WORKGROUP_SIZE}>;\nvar<workgroup> partialY : array<f32, ${WORKGROUP_SIZE}>;\nvar<workgroup> partialZ : array<f32, ${WORKGROUP_SIZE}>;\n\n@compute @workgroup_size(${WORKGROUP_SIZE}u)\nfn main(@builtin(local_invocation_id) lid : vec3<u32>) {\n  let tid = lid.x;\n  let activeCount = params.counts.x;\n  if (activeCount == 0u) {\n    return;\n  }\n\n  var sumX = 0.0;\n  var sumY = 0.0;\n  var sumZ = 0.0;\n  var index = tid;\n  loop {\n    if (index >= activeCount) {\n      break;\n    }\n    let nodeId = activeIds[index];\n    let base = nodeId * 3u;\n    sumX = sumX + positions[base + 0u];\n    sumY = sumY + positions[base + 1u];\n    sumZ = sumZ + positions[base + 2u];\n    index = index + ${WORKGROUP_SIZE}u;\n  }\n\n  partialX[tid] = sumX;\n  partialY[tid] = sumY;\n  partialZ[tid] = sumZ;\n  workgroupBarrier();\n\n  var stride = ${WORKGROUP_SIZE / 2}u;\n  loop {\n    if (stride == 0u) {\n      break;\n    }\n    if (tid < stride) {\n      partialX[tid] = partialX[tid] + partialX[tid + stride];\n      partialY[tid] = partialY[tid] + partialY[tid + stride];\n      partialZ[tid] = partialZ[tid] + partialZ[tid + stride];\n    }\n    workgroupBarrier();\n    stride = stride >> 1u;\n  }\n\n  if (tid == 0u) {\n    let invCount = 1.0 / max(1.0, f32(activeCount));\n    partialX[0] = partialX[0] * invCount - params.center.x;\n    partialY[0] = partialY[0] * invCount - params.center.y;\n    partialZ[0] = select(0.0, partialZ[0] * invCount - params.center.z, params.counts.y != 0u);\n  }\n  workgroupBarrier();\n\n  let shiftX = partialX[0];\n  let shiftY = partialY[0];\n  let shiftZ = partialZ[0];\n  index = tid;\n  loop {\n    if (index >= activeCount) {\n      break;\n    }\n    let nodeId = activeIds[index];\n    let base = nodeId * 3u;\n    positions[base + 0u] = positions[base + 0u] - shiftX;\n    positions[base + 1u] = positions[base + 1u] - shiftY;\n    if (params.counts.y != 0u) {\n      positions[base + 2u] = positions[base + 2u] - shiftZ;\n    } else {\n      positions[base + 2u] = params.center.z;\n    }\n    index = index + ${WORKGROUP_SIZE}u;\n  }\n}\n`;\n\nconst RECENTER_WGSL_ROTATION = /* wgsl */ `\nstruct RecenterParams {\n  counts : vec4<u32>,\n  center : vec4<f32>,\n  rotation : vec4<f32>,\n};\n\n@group(0) @binding(0) var<storage, read_write> positions : array<f32>;\n@group(0) @binding(1) var<storage, read_write> velocities : array<f32>;\n@group(0) @binding(2) var<storage, read> activeIds : array<u32>;\n@group(0) @binding(3) var<uniform> params : RecenterParams;\n\nvar<workgroup> partialX : array<f32, ${WORKGROUP_SIZE}>;\nvar<workgroup> partialY : array<f32, ${WORKGROUP_SIZE}>;\nvar<workgroup> partialZ : array<f32, ${WORKGROUP_SIZE}>;\nvar<workgroup> partialTorqueX : array<f32, ${WORKGROUP_SIZE}>;\nvar<workgroup> partialTorqueY : array<f32, ${WORKGROUP_SIZE}>;\nvar<workgroup> partialTorqueZ : array<f32, ${WORKGROUP_SIZE}>;\nvar<workgroup> partialRadiusSq : array<f32, ${WORKGROUP_SIZE}>;\n\n@compute @workgroup_size(${WORKGROUP_SIZE}u)\nfn main(@builtin(local_invocation_id) lid : vec3<u32>) {\n  let tid = lid.x;\n  let activeCount = params.counts.x;\n  if (activeCount == 0u) {\n    return;\n  }\n\n  var sumX = 0.0;\n  var sumY = 0.0;\n  var sumZ = 0.0;\n  var index = tid;\n  loop {\n    if (index >= activeCount) {\n      break;\n    }\n    let nodeId = activeIds[index];\n    let base = nodeId * 3u;\n    sumX = sumX + positions[base + 0u];\n    sumY = sumY + positions[base + 1u];\n    sumZ = sumZ + positions[base + 2u];\n    index = index + ${WORKGROUP_SIZE}u;\n  }\n\n  partialX[tid] = sumX;\n  partialY[tid] = sumY;\n  partialZ[tid] = sumZ;\n  workgroupBarrier();\n\n  var stride = ${WORKGROUP_SIZE / 2}u;\n  loop {\n    if (stride == 0u) {\n      break;\n    }\n    if (tid < stride) {\n      partialX[tid] = partialX[tid] + partialX[tid + stride];\n      partialY[tid] = partialY[tid] + partialY[tid + stride];\n      partialZ[tid] = partialZ[tid] + partialZ[tid + stride];\n    }\n    workgroupBarrier();\n    stride = stride >> 1u;\n  }\n\n  if (tid == 0u) {\n    let invCount = 1.0 / max(1.0, f32(activeCount));\n    partialX[0] = partialX[0] * invCount - params.center.x;\n    partialY[0] = partialY[0] * invCount - params.center.y;\n    partialZ[0] = select(0.0, partialZ[0] * invCount - params.center.z, params.counts.y != 0u);\n  }\n  workgroupBarrier();\n\n  let shiftX = partialX[0];\n  let shiftY = partialY[0];\n  let shiftZ = partialZ[0];\n  var torqueX = 0.0;\n  var torqueY = 0.0;\n  var torqueZ = 0.0;\n  var radiusSq = 0.0;\n  index = tid;\n  loop {\n    if (index >= activeCount) {\n      break;\n    }\n    let nodeId = activeIds[index];\n    let base = nodeId * 3u;\n    var pos = vec3<f32>(\n      positions[base + 0u] - shiftX,\n      positions[base + 1u] - shiftY,\n      positions[base + 2u] - shiftZ,\n    );\n    var vel = vec3<f32>(\n      velocities[base + 0u],\n      velocities[base + 1u],\n      velocities[base + 2u],\n    );\n    if (params.counts.y == 0u) {\n      pos.z = params.center.z;\n      vel.z = 0.0;\n    }\n    let r = pos - params.center.xyz;\n    let torque = cross(r, vel);\n    torqueX = torqueX + torque.x;\n    torqueY = torqueY + torque.y;\n    torqueZ = torqueZ + torque.z;\n    radiusSq = radiusSq + dot(r, r);\n    index = index + ${WORKGROUP_SIZE}u;\n  }\n\n  partialTorqueX[tid] = torqueX;\n  partialTorqueY[tid] = torqueY;\n  partialTorqueZ[tid] = torqueZ;\n  partialRadiusSq[tid] = radiusSq;\n  workgroupBarrier();\n\n  stride = ${WORKGROUP_SIZE / 2}u;\n  loop {\n    if (stride == 0u) {\n      break;\n    }\n    if (tid < stride) {\n      partialTorqueX[tid] = partialTorqueX[tid] + partialTorqueX[tid + stride];\n      partialTorqueY[tid] = partialTorqueY[tid] + partialTorqueY[tid + stride];\n      partialTorqueZ[tid] = partialTorqueZ[tid] + partialTorqueZ[tid + stride];\n      partialRadiusSq[tid] = partialRadiusSq[tid] + partialRadiusSq[tid + stride];\n    }\n    workgroupBarrier();\n    stride = stride >> 1u;\n  }\n\n  if (tid == 0u) {\n    let invRadiusSq = select(0.0, 1.0 / partialRadiusSq[0], partialRadiusSq[0] > 1e-6);\n    partialTorqueX[0] = partialTorqueX[0] * invRadiusSq;\n    partialTorqueY[0] = partialTorqueY[0] * invRadiusSq;\n    partialTorqueZ[0] = partialTorqueZ[0] * invRadiusSq;\n  }\n  workgroupBarrier();\n\n  let omega = vec3<f32>(partialTorqueX[0], partialTorqueY[0], partialTorqueZ[0]);\n  let rotationDamping = clamp(params.rotation.x, 0.0, 1.0);\n  index = tid;\n  loop {\n    if (index >= activeCount) {\n      break;\n    }\n    let nodeId = activeIds[index];\n    let base = nodeId * 3u;\n    var pos = vec3<f32>(\n      positions[base + 0u] - shiftX,\n      positions[base + 1u] - shiftY,\n      positions[base + 2u] - shiftZ,\n    );\n    var vel = vec3<f32>(\n      velocities[base + 0u],\n      velocities[base + 1u],\n      velocities[base + 2u],\n    );\n    let r = pos - params.center.xyz;\n    let correction = cross(omega, r) * rotationDamping;\n    pos = pos - correction;\n    vel = vel - correction;\n    positions[base + 0u] = pos.x;\n    positions[base + 1u] = pos.y;\n    if (params.counts.y != 0u) {\n      positions[base + 2u] = pos.z;\n      velocities[base + 0u] = vel.x;\n      velocities[base + 1u] = vel.y;\n      velocities[base + 2u] = vel.z;\n    } else {\n      positions[base + 2u] = params.center.z;\n      velocities[base + 0u] = vel.x;\n      velocities[base + 1u] = vel.y;\n      velocities[base + 2u] = 0.0;\n    }\n    index = index + ${WORKGROUP_SIZE}u;\n  }\n}\n`;\n\nfunction toFinite(value, fallback = 0) {\n  const numeric = Number(value);\n  return Number.isFinite(numeric) ? numeric : fallback;\n}\n\nfunction clamp(value, min, max, fallback) {\n  const numeric = toFinite(value, fallback);\n  if (numeric <= min) return min;\n  if (numeric >= max) return max;\n  return numeric;\n}\n\nfunction normalizeCenter(value) {\n  if (!Array.isArray(value)) return [0, 0, 0];\n  return [\n    toFinite(value[0], 0),\n    toFinite(value[1], 0),\n    toFinite(value[2], 0),\n  ];\n}\n\nfunction createEmptyUintArray() {\n  return new Uint32Array(0);\n}\n\nfunction createEmptyFloatArray() {\n  return new Float32Array(0);\n}\n\nfunction isUmapForceModel(value) {\n  return String(value ?? '').trim().toLowerCase() === 'umap';\n}\n\nfunction normalizeForceNormalizationType(value) {\n  const normalized = String(value ?? '').trim().toLowerCase();\n  if (normalized === 'degree' || normalized === 'endpoint-degree') return 'degree';\n  if (normalized === 'strength' || normalized === 'weighted-strength') return 'strength';\n  if (normalized === 'none' || normalized === 'off' || normalized === 'disabled') return 'none';\n  return 'local-degree';\n}\n\nfunction normalizeLayoutScheduling(value) {\n  const normalized = String(value ?? '').trim().toLowerCase();\n  if (normalized === 'chunk' || normalized === 'chunked') return 'chunked';\n  if (normalized === 'full' || normalized === 'legacy' || normalized === 'off') return 'full';\n  return 'auto';\n}\n\nfunction normalizeComponentForces(value) {\n  if (value === false) return 'off';\n  const normalized = String(value ?? '').trim().toLowerCase();\n  if (normalized === 'off' || normalized === 'false' || normalized === 'disabled' || normalized === 'none') {\n    return 'off';\n  }\n  if (normalized === 'halo') return 'halo';\n  if (normalized === 'supernode' || normalized === 'supernode-experimental') return 'supernode-experimental';\n  return 'auto';\n}\n\nfunction shouldUseComponentMetadata(options = {}, umapModel = false) {\n  return !umapModel && normalizeComponentForces(options.componentForces) !== 'off';\n}\n\nfunction disableUmapComponentOptions(options) {\n  if (!isUmapForceModel(options?.forceModel)) return options;\n  options.componentForces = 'off';\n  options.componentSeeding = false;\n  options.componentGravity = false;\n  return options;\n}\n\nfunction shouldActivateComponentForces({\n  componentForces = 'auto',\n  componentCount = 0,\n  activeCount = 0,\n  largestComponentSize = 0,\n  secondLargestComponentSize = 0,\n} = {}) {\n  if (componentCount <= 1 || activeCount <= 1 || largestComponentSize <= 0) return false;\n  const mode = normalizeComponentForces(componentForces);\n  if (mode === 'off') return false;\n  if (mode === 'halo' || mode === 'supernode-experimental') return true;\n\n  const safeActiveCount = Math.max(1, Math.floor(Number(activeCount) || 1));\n  const largest = Math.max(0, Math.floor(Number(largestComponentSize) || 0));\n  const second = Math.max(0, Math.floor(Number(secondLargestComponentSize) || 0));\n  if (safeActiveCount < 32) {\n    return largest > second;\n  }\n\n  const largestRatio = largest / safeActiveCount;\n  const smallRatio = (safeActiveCount - largest) / safeActiveCount;\n  const dominanceRatio = second > 0 ? largest / second : largest;\n  return (\n    largest >= 8\n    && largestRatio >= 0.08\n    && smallRatio >= 0.02\n    && (largestRatio >= 0.5 || dominanceRatio >= 2)\n  );\n}\n\nfunction resolveLayoutChunkNodeCount(value) {\n  const numeric = Math.floor(Number(value));\n  if (!Number.isFinite(numeric) || numeric <= 0) return DEFAULT_LAYOUT_CHUNK_NODE_COUNT;\n  return Math.max(1, numeric);\n}\n\nfunction resolveLayoutChunkCount(value) {\n  const numeric = Math.floor(Number(value));\n  if (!Number.isFinite(numeric)) return DEFAULT_LAYOUT_CHUNK_COUNT;\n  return Math.max(MIN_LAYOUT_CHUNK_COUNT, Math.min(MAX_LAYOUT_CHUNK_COUNT, numeric));\n}\n\nfunction shouldUseChunkedLayoutScheduling(value, activeCount) {\n  const scheduling = normalizeLayoutScheduling(value);\n  if (scheduling === 'chunked') return true;\n  if (scheduling === 'full') return false;\n  return Math.max(0, Math.floor(Number(activeCount) || 0)) > LAYOUT_CHUNK_AUTO_NODE_THRESHOLD;\n}\n\nfunction forceNormalizationMode(value) {\n  const normalized = normalizeForceNormalizationType(value);\n  if (normalized === 'degree') return 1;\n  if (normalized === 'strength') return 2;\n  if (normalized === 'none') return 3;\n  return 0;\n}\n\nfunction normalizeAttributeName(value, fallback = null) {\n  if (typeof value !== 'string') return fallback;\n  const trimmed = value.trim();\n  return trimmed || fallback;\n}\n\nfunction ensureUint32Capacity(view, length) {\n  const required = Math.max(1, Math.floor(length || 0));\n  if (view instanceof Uint32Array && view.length >= required) {\n    return view;\n  }\n  return new Uint32Array(required);\n}\n\nfunction ensureFloat32Capacity(view, length) {\n  const required = Math.max(1, Math.floor(length || 0));\n  if (view instanceof Float32Array && view.length >= required) {\n    return view;\n  }\n  return new Float32Array(required);\n}\n\nfunction normalizeReadbackNodeIds(nodeIds) {\n  if (nodeIds == null) return createEmptyUintArray();\n  if (typeof nodeIds === 'number') {\n    const numeric = Math.floor(nodeIds);\n    return Number.isFinite(numeric) && numeric >= 0 ? new Uint32Array([numeric]) : createEmptyUintArray();\n  }\n  const values = [];\n  const push = (value) => {\n    const numeric = Math.floor(Number(value));\n    values.push(Number.isFinite(numeric) && numeric >= 0 ? numeric >>> 0 : 0xffffffff);\n  };\n  if (Array.isArray(nodeIds) || ArrayBuffer.isView(nodeIds)) {\n    for (let i = 0; i < nodeIds.length; i += 1) push(nodeIds[i]);\n  } else if (typeof nodeIds?.[Symbol.iterator] === 'function') {\n    for (const value of nodeIds) push(value);\n  }\n  return values.length ? Uint32Array.from(values) : createEmptyUintArray();\n}\n\nfunction filterReadableNodeIds(ids, capacity) {\n  const limit = Math.max(0, Math.floor(Number(capacity) || 0));\n  if (!ids?.length || limit <= 0) return createEmptyUintArray();\n  const readable = [];\n  for (let i = 0; i < ids.length; i += 1) {\n    const id = ids[i] >>> 0;\n    if (id !== 0xffffffff && id < limit) readable.push(id);\n  }\n  return readable.length === ids.length ? ids : (readable.length ? Uint32Array.from(readable) : createEmptyUintArray());\n}\n\nfunction resolveReadbackOut(out, length) {\n  if (out instanceof Float32Array && out.length >= length) return out;\n  return new Float32Array(Math.max(0, length));\n}\n\nfunction copyPositionsFromFullSnapshot(snapshot, ids, out = null) {\n  const count = ids?.length ?? 0;\n  const positions = resolveReadbackOut(out, count * 3);\n  positions.fill(0, 0, count * 3);\n  if (!snapshot || !Number.isFinite(snapshot.length)) return positions;\n  for (let i = 0; i < count; i += 1) {\n    const id = ids[i];\n    const src = id * 3;\n    const dst = i * 3;\n    if (id === 0xffffffff || src + 2 >= snapshot.length) continue;\n    positions[dst] = snapshot[src] ?? 0;\n    positions[dst + 1] = snapshot[src + 1] ?? 0;\n    positions[dst + 2] = snapshot[src + 2] ?? 0;\n  }\n  return positions;\n}\n\nfunction centroidFromPackedPositions(positions, count, out = null) {\n  const centroid = resolveReadbackOut(out, 3);\n  centroid[0] = 0;\n  centroid[1] = 0;\n  centroid[2] = 0;\n  const safeCount = Math.max(0, Math.min(Math.floor(Number(count) || 0), Math.floor((positions?.length ?? 0) / 3)));\n  if (safeCount <= 0) return { centroid, count: 0 };\n  let sumX = 0;\n  let sumY = 0;\n  let sumZ = 0;\n  let found = 0;\n  for (let i = 0; i < safeCount; i += 1) {\n    const offset = i * 3;\n    const x = positions[offset];\n    const y = positions[offset + 1];\n    const z = positions[offset + 2];\n    if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) continue;\n    sumX += x;\n    sumY += y;\n    sumZ += z;\n    found += 1;\n  }\n  if (found > 0) {\n    centroid[0] = sumX / found;\n    centroid[1] = sumY / found;\n    centroid[2] = sumZ / found;\n  }\n  return { centroid, count: found };\n}\n\nfunction readbackNow() {\n  return typeof performance !== 'undefined' && typeof performance.now === 'function'\n    ? performance.now()\n    : Date.now();\n}\n\nfunction readbackIdsSignature(ids) {\n  if (!ids?.length) return '';\n  return Array.from(ids, (id) => String(id >>> 0)).join(',');\n}\n\nfunction cloneFloat32(value) {\n  return value instanceof Float32Array ? new Float32Array(value) : null;\n}\n\nfunction copyCachedFloat32(value, out = null) {\n  if (!(value instanceof Float32Array)) return null;\n  const target = resolveReadbackOut(out, value.length);\n  target.set(value.subarray(0, Math.min(value.length, target.length)), 0);\n  return target;\n}\n\nfunction readScalarViewValue(view, index, fallback = 0) {\n  if (!view || index == null || index < 0) return fallback;\n  const value = Number(view[index]);\n  return Number.isFinite(value) ? value : fallback;\n}\n\nfunction copyFloat32Values(target, source, length) {\n  const limit = Math.max(0, Math.min(length | 0, target?.length ?? 0, source?.length ?? 0));\n  for (let i = 0; i < limit; i += 1) {\n    target[i] = source[i];\n  }\n}\n\nfunction resolveComputeDispatchShape(itemCount, workgroupSize, maxWorkgroupsPerDimension = 65535) {\n  const safeCount = Math.max(0, Math.floor(itemCount || 0));\n  const safeWorkgroupSize = Math.max(1, Math.floor(workgroupSize || 1));\n  const limit = Math.max(1, Math.floor(maxWorkgroupsPerDimension || 65535));\n  const totalGroups = Math.max(1, Math.ceil(safeCount / safeWorkgroupSize));\n  const x = Math.min(limit, totalGroups);\n  const remainingAfterX = Math.max(1, Math.ceil(totalGroups / x));\n  const y = Math.min(limit, remainingAfterX);\n  const z = Math.max(1, Math.ceil(remainingAfterX / y));\n  if (z > limit) {\n    throw new Error(\n      `GPU-force dispatch requires ${totalGroups} workgroups, exceeding WebGPU grid capacity `\n      + `(${limit} per dimension).`,\n    );\n  }\n  const rowStride = x * safeWorkgroupSize;\n  const layerStride = rowStride * y;\n  return {\n    x,\n    y,\n    z,\n    rowStride,\n    layerStride,\n    totalGroups,\n  };\n}\n\nfunction safeRead(fn, fallback) {\n  try {\n    const value = fn();\n    return value ?? fallback;\n  } catch (error) {\n    return fallback;\n  }\n}\n\nconst SAFE_READ_WARNED_KEYS = new Set();\n\nfunction safeReadWithWarning(fn, fallback, warningKey, warningMessage) {\n  try {\n    const value = fn();\n    return value ?? fallback;\n  } catch (error) {\n    if (warningKey && !SAFE_READ_WARNED_KEYS.has(warningKey)) {\n      SAFE_READ_WARNED_KEYS.add(warningKey);\n      console.warn(warningMessage, error);\n    }\n    return fallback;\n  }\n}\n\nfunction getGpuUsage(name, fallback) {\n  if (typeof GPUBufferUsage !== 'undefined' && Number.isFinite(GPUBufferUsage?.[name])) {\n    return GPUBufferUsage[name];\n  }\n  return fallback;\n}\n\nfunction getGpuShaderStage(name, fallback) {\n  if (typeof GPUShaderStage !== 'undefined' && Number.isFinite(GPUShaderStage?.[name])) {\n    return GPUShaderStage[name];\n  }\n  return fallback;\n}\n\nfunction getGpuMapMode(name, fallback) {\n  if (typeof GPUMapMode !== 'undefined' && Number.isFinite(GPUMapMode?.[name])) {\n    return GPUMapMode[name];\n  }\n  return fallback;\n}\n\nfunction normalizeBackendType(value) {\n  if (value === 'webgpu') return 'webgpu';\n  if (value === 'webgl' || value === 'webgl2') return 'webgl';\n  return value ?? null;\n}\n\nfunction snapshotTopologyInputs(network) {\n  const snapshot = safeReadWithWarning(\n    () => {\n      if (typeof network?.withBufferAccess === 'function') {\n        return network.withBufferAccess(() => ({\n          nodeIndices: network?.nodeIndices instanceof Uint32Array ? network.nodeIndices : createEmptyUintArray(),\n          edgeIndices: network?.edgeIndices instanceof Uint32Array ? network.edgeIndices : createEmptyUintArray(),\n        }), { nodeIndices: true, edgeIndices: true });\n      }\n      return {\n        nodeIndices: network?.nodeIndices instanceof Uint32Array ? network.nodeIndices : createEmptyUintArray(),\n        edgeIndices: network?.edgeIndices instanceof Uint32Array ? network.edgeIndices : createEmptyUintArray(),\n      };\n    },\n    { nodeIndices: createEmptyUintArray(), edgeIndices: createEmptyUintArray() },\n    'gpu-force:snapshot-topology-inputs',\n    'GpuForcePositionDelegate: failed to snapshot active node/edge indices. Falling back to empty topology inputs.',\n  );\n  const nodeIndices = snapshot.nodeIndices;\n  const edgeIndices = snapshot.edgeIndices;\n  const nodeCapacityRaw = Number(safeReadWithWarning(\n    () => network?.nodeCapacity,\n    0,\n    'gpu-force:node-capacity',\n    'GpuForcePositionDelegate: failed to read network.nodeCapacity. Falling back to 0.',\n  ));\n  const nodeCapacity = Number.isFinite(nodeCapacityRaw) && nodeCapacityRaw > 0\n    ? Math.floor(nodeCapacityRaw)\n    : 0;\n  const inferredCapacity = Math.max(0, Math.floor(nodeIndices.length));\n  const edgeCapacityRaw = Number(safeReadWithWarning(\n    () => network?.edgeCapacity,\n    0,\n    'gpu-force:edge-capacity',\n    'GpuForcePositionDelegate: failed to read network.edgeCapacity. Falling back to active edge count.',\n  ));\n  const edgeCapacity = Number.isFinite(edgeCapacityRaw) && edgeCapacityRaw > 0\n    ? Math.floor(edgeCapacityRaw)\n    : Math.max(0, Math.floor(edgeIndices.length));\n  return {\n    nodeCapacity: Math.max(nodeCapacity, inferredCapacity),\n    edgeCapacity,\n    nodeIndices,\n    edgeIndices,\n    positionView: null,\n  };\n}\n\nfunction isSameTopologySnapshot(previous, next) {\n  if (!previous || !next) return false;\n  return (\n    Number(previous.topologyNode) === Number(next.topologyNode)\n    && Number(previous.topologyEdge) === Number(next.topologyEdge)\n    && Number(previous.nodeIndicesVersion) === Number(next.nodeIndicesVersion)\n    && Number(previous.edgeIndicesVersion) === Number(next.edgeIndicesVersion)\n    && Number(previous.nodeIndicesCount) === Number(next.nodeIndicesCount)\n    && Number(previous.edgeIndicesCount) === Number(next.edgeIndicesCount)\n    && Number(previous.nodeIndexAttributeVersion) === Number(next.nodeIndexAttributeVersion)\n    && Number(previous.edgeIndexAttributeVersion) === Number(next.edgeIndexAttributeVersion)\n  );\n}\n\nfunction buildTopologyPayload(topologyInputs, options = {}, scratch = {}) {\n  const {\n    nodeCapacity = 0,\n    nodeIndices = createEmptyUintArray(),\n    edgeIndices = createEmptyUintArray(),\n    edgesView = createEmptyUintArray(),\n    edgeCapacity = 0,\n    positionView = null,\n    edgeWeightView = null,\n    nodeMassView = null,\n    nodeStrengthView = null,\n  } = topologyInputs ?? {};\n  const umapModel = isUmapForceModel(options.forceModel);\n  const componentMetadataEnabled = shouldUseComponentMetadata(options, umapModel);\n  const forceNormalizationType = normalizeForceNormalizationType(options.forceNormalizationType);\n  const useLinearScalarInputs = !umapModel && (\n    Boolean(normalizeAttributeName(options.edgeWeightAttribute))\n    || forceNormalizationType === 'strength'\n  );\n  const useExplicitInitialPositions = !umapModel\n    || options.umapHasInitialPositions === true\n    || options.forceInitialPositions === true;\n  const edgeWeightAttribute = normalizeAttributeName(options.edgeWeightAttribute);\n  const nodeMassAttribute = normalizeAttributeName(options.nodeMassAttribute);\n\n  const hasExplicitActiveIds = nodeIndices.length > 0;\n  const activeCount = hasExplicitActiveIds ? nodeIndices.length : nodeCapacity;\n  const activeIds = ensureUint32Capacity(scratch.activeIds, activeCount);\n  scratch.activeIds = activeIds;\n  const activeMask = ensureUint32Capacity(scratch.activeMask, nodeCapacity);\n  scratch.activeMask = activeMask;\n  activeMask.fill(0, 0, nodeCapacity);\n  if (hasExplicitActiveIds) {\n    for (let i = 0; i < nodeIndices.length; i += 1) {\n      const nodeId = nodeIndices[i] >>> 0;\n      activeIds[i] = nodeId;\n      if (nodeId < nodeCapacity) {\n        activeMask[nodeId] = 1;\n      }\n    }\n  } else {\n    for (let nodeId = 0; nodeId < nodeCapacity; nodeId += 1) {\n      activeIds[nodeId] = nodeId;\n      activeMask[nodeId] = 1;\n    }\n  }\n\n  const neighborCounts = ensureUint32Capacity(scratch.neighborCounts, nodeCapacity);\n  scratch.neighborCounts = neighborCounts;\n  neighborCounts.fill(0, 0, nodeCapacity);\n  let nodeMass = createEmptyFloatArray();\n  let maxUmapEdgeWeight = 0;\n  if (umapModel) {\n    nodeMass = ensureFloat32Capacity(scratch.nodeMass, nodeCapacity);\n    scratch.nodeMass = nodeMass;\n    nodeMass.fill(0, 0, nodeCapacity);\n  } else {\n    scratch.nodeMass = createEmptyFloatArray();\n  }\n  for (let i = 0; i < edgeIndices.length; i += 1) {\n    const edgeId = edgeIndices[i] >>> 0;\n    const base = edgeId * 2;\n    if (base + 1 >= edgesView.length) continue;\n    const source = edgesView[base] >>> 0;\n    const target = edgesView[base + 1] >>> 0;\n    if (source >= nodeCapacity || target >= nodeCapacity) continue;\n    if (!activeMask[source] || !activeMask[target]) continue;\n    if (source === target) continue;\n    const weight = umapModel\n      ? readScalarViewValue(edgeWeightView, edgeId, 0)\n      : 1;\n    if (!(weight > 0)) continue;\n    if (umapModel && weight > maxUmapEdgeWeight) {\n      maxUmapEdgeWeight = weight;\n    }\n  }\n\n  const umapEpochs = umapModel\n    ? resolveUmapEpochCount(options.umapEpochs, activeCount)\n    : 0;\n  const minUmapEdgeWeight = umapModel && maxUmapEdgeWeight > 0\n    ? (maxUmapEdgeWeight / Math.max(1, umapEpochs))\n    : 0;\n\n  for (let i = 0; i < edgeIndices.length; i += 1) {\n    const edgeId = edgeIndices[i] >>> 0;\n    const base = edgeId * 2;\n    if (base + 1 >= edgesView.length) continue;\n    const source = edgesView[base] >>> 0;\n    const target = edgesView[base + 1] >>> 0;\n    if (source >= nodeCapacity || target >= nodeCapacity) continue;\n    if (!activeMask[source] || !activeMask[target]) continue;\n    if (source === target) continue;\n    const weight = umapModel\n      ? readScalarViewValue(edgeWeightView, edgeId, 0)\n      : 1;\n    if (!(weight > 0)) continue;\n    if (umapModel && weight < minUmapEdgeWeight) continue;\n    neighborCounts[source] += 1;\n    neighborCounts[target] += 1;\n    if (umapModel && !nodeMassAttribute) {\n      nodeMass[source] += weight;\n      nodeMass[target] += weight;\n    }\n  }\n\n  const neighborStarts = ensureUint32Capacity(scratch.neighborStarts, nodeCapacity);\n  scratch.neighborStarts = neighborStarts;\n  let neighborLength = 0;\n  for (let nodeId = 0; nodeId < nodeCapacity; nodeId += 1) {\n    neighborStarts[nodeId] = neighborLength;\n    neighborLength += neighborCounts[nodeId];\n  }\n\n  const neighbors = ensureUint32Capacity(scratch.neighbors, neighborLength);\n  scratch.neighbors = neighbors;\n  const neighborEdges = useLinearScalarInputs\n    ? ensureUint32Capacity(scratch.neighborEdges, neighborLength)\n    : createEmptyUintArray();\n  scratch.neighborEdges = neighborEdges;\n  let neighborWeights = createEmptyFloatArray();\n  if (umapModel) {\n    neighborWeights = ensureFloat32Capacity(scratch.neighborWeights, neighborLength);\n    scratch.neighborWeights = neighborWeights;\n  } else {\n    scratch.neighborWeights = createEmptyFloatArray();\n  }\n  const cursor = ensureUint32Capacity(scratch.cursor, nodeCapacity);\n  scratch.cursor = cursor;\n  for (let nodeId = 0; nodeId < nodeCapacity; nodeId += 1) {\n    cursor[nodeId] = neighborStarts[nodeId];\n  }\n  for (let i = 0; i < edgeIndices.length; i += 1) {\n    const edgeId = edgeIndices[i] >>> 0;\n    const base = edgeId * 2;\n    if (base + 1 >= edgesView.length) continue;\n    const source = edgesView[base] >>> 0;\n    const target = edgesView[base + 1] >>> 0;\n    if (source >= nodeCapacity || target >= nodeCapacity) continue;\n    if (!activeMask[source] || !activeMask[target]) continue;\n    if (source === target) continue;\n    const weight = umapModel\n      ? readScalarViewValue(edgeWeightView, edgeId, 0)\n      : 1;\n    if (!(weight > 0)) continue;\n    if (umapModel && weight < minUmapEdgeWeight) continue;\n    const sourceCursor = cursor[source]++;\n    const targetCursor = cursor[target]++;\n    neighbors[sourceCursor] = target;\n    neighbors[targetCursor] = source;\n    if (useLinearScalarInputs) {\n      neighborEdges[sourceCursor] = edgeId;\n      neighborEdges[targetCursor] = edgeId;\n    }\n    if (umapModel) {\n      const normalizedWeight = maxUmapEdgeWeight > 0 ? (weight / maxUmapEdgeWeight) : 0;\n      neighborWeights[sourceCursor] = normalizedWeight;\n      neighborWeights[targetCursor] = normalizedWeight;\n    }\n  }\n\n  if (umapModel && nodeMassAttribute) {\n    for (let nodeId = 0; nodeId < nodeCapacity; nodeId += 1) {\n      nodeMass[nodeId] = Math.max(0, readScalarViewValue(nodeMassView, nodeId, 0));\n    }\n  } else if (!umapModel) {\n    nodeMass.fill(1, 0, nodeCapacity);\n  }\n\n  let componentMetadata = null;\n  if (componentMetadataEnabled) {\n    componentMetadata = buildActiveComponentMetadata({\n      nodeCapacity,\n      activeIds,\n      activeCount,\n      activeMask,\n      neighborStarts,\n      neighborCounts,\n      neighbors,\n      options,\n      scratch,\n    });\n  } else {\n    const componentGravityScale = umapModel\n      ? createEmptyFloatArray()\n      : ensureFloat32Capacity(scratch.componentGravityScale, nodeCapacity);\n    scratch.componentGravityScale = componentGravityScale;\n    if (!umapModel) componentGravityScale.fill(1, 0, nodeCapacity);\n    componentMetadata = {\n      componentIds: createEmptyUintArray(),\n      componentRanks: createEmptyUintArray(),\n      nodeComponentRank: createEmptyUintArray(),\n      nodeComponentSize: createEmptyUintArray(),\n      componentSizes: createEmptyUintArray(),\n      componentGravityScale,\n      componentCount: 0,\n      largestComponentId: 0,\n      largestComponentSize: 0,\n      secondLargestComponentSize: 0,\n      singletonComponentCount: 0,\n      componentForcesActive: false,\n      componentSeedingEnabled: false,\n      componentGravityEnabled: false,\n    };\n  }\n\n  const center = normalizeCenter(options.center);\n  const radius = Math.max(1, toFinite(options.radius, DEFAULT_OPTIONS.radius));\n  const depth = Math.max(0, toFinite(options.depth, DEFAULT_OPTIONS.depth));\n  const outputScale = Math.max(0.0001, toFinite(options.outputScale, DEFAULT_OPTIONS.outputScale));\n  const normalizeInputByOutputScale = Math.abs(outputScale - 1.0) > 1e-6;\n  const is3D = options.mode === '3d';\n  const valueCount = Math.max(1, nodeCapacity) * 3;\n  const packedPositions = ensureFloat32Capacity(scratch.packedPositions, valueCount);\n  scratch.packedPositions = packedPositions;\n  const packedOutputPositions = ensureFloat32Capacity(scratch.packedOutputPositions, valueCount);\n  scratch.packedOutputPositions = packedOutputPositions;\n  for (let nodeId = 0; nodeId < nodeCapacity; nodeId += 1) {\n    const sourceOffset = nodeId * 3;\n    const targetOffset = nodeId * 3;\n    const x = useExplicitInitialPositions ? positionView?.[sourceOffset] : undefined;\n    const y = useExplicitInitialPositions ? positionView?.[sourceOffset + 1] : undefined;\n    const z = useExplicitInitialPositions ? positionView?.[sourceOffset + 2] : undefined;\n    const fallbackX = center[0] + (Math.random() - 0.5) * radius;\n    const fallbackY = center[1] + (Math.random() - 0.5) * radius;\n    const fallbackZ = is3D\n      ? center[2] + (Math.random() - 0.5) * depth\n      : center[2];\n\n    const seedX = Number.isFinite(x) ? x : fallbackX;\n    const seedY = Number.isFinite(y) ? y : fallbackY;\n    const seedZ = Number.isFinite(z)\n      ? (is3D ? z : center[2])\n      : fallbackZ;\n\n    packedOutputPositions[targetOffset] = seedX;\n    packedOutputPositions[targetOffset + 1] = seedY;\n    packedOutputPositions[targetOffset + 2] = seedZ;\n\n    if (normalizeInputByOutputScale) {\n      packedPositions[targetOffset] = center[0] + ((seedX - center[0]) / outputScale);\n      packedPositions[targetOffset + 1] = center[1] + ((seedY - center[1]) / outputScale);\n      packedPositions[targetOffset + 2] = is3D\n        ? (center[2] + ((seedZ - center[2]) / outputScale))\n        : center[2];\n    } else {\n      packedPositions[targetOffset] = seedX;\n      packedPositions[targetOffset + 1] = seedY;\n      packedPositions[targetOffset + 2] = seedZ;\n    }\n  }\n\n  let componentSeedingApplied = false;\n  if (\n    componentMetadataEnabled\n    && componentMetadata.componentCount > 1\n    && componentMetadata.componentSeedingEnabled === true\n    && options.componentSeeding !== false\n    && options.forceInitialPositions !== true\n  ) {\n    componentSeedingApplied = applyComponentAwareInitialPositions({\n      positions: packedOutputPositions,\n      nodeCapacity,\n      activeIds,\n      activeCount,\n      componentIds: componentMetadata.componentIds,\n      componentRanks: componentMetadata.componentRanks,\n      componentSizes: componentMetadata.componentSizes,\n      componentCount: componentMetadata.componentCount,\n      largestComponentId: componentMetadata.largestComponentId,\n      center,\n      radius,\n      depth,\n      mode: options.mode,\n      scratch,\n    });\n    if (componentSeedingApplied) {\n      for (let nodeId = 0; nodeId < nodeCapacity; nodeId += 1) {\n        const offset = nodeId * 3;\n        const seedX = packedOutputPositions[offset];\n        const seedY = packedOutputPositions[offset + 1];\n        const seedZ = packedOutputPositions[offset + 2];\n        if (normalizeInputByOutputScale) {\n          packedPositions[offset] = center[0] + ((seedX - center[0]) / outputScale);\n          packedPositions[offset + 1] = center[1] + ((seedY - center[1]) / outputScale);\n          packedPositions[offset + 2] = is3D\n            ? (center[2] + ((seedZ - center[2]) / outputScale))\n            : center[2];\n        } else {\n          packedPositions[offset] = seedX;\n          packedPositions[offset + 1] = seedY;\n          packedPositions[offset + 2] = is3D ? seedZ : center[2];\n        }\n      }\n    }\n  }\n\n  if (is3D && activeCount > 1) {\n    let minZ = Infinity;\n    let maxZ = -Infinity;\n    for (let i = 0; i < activeCount; i += 1) {\n      const nodeId = activeIds[i] >>> 0;\n      const z = packedOutputPositions[(nodeId * 3) + 2];\n      if (!Number.isFinite(z)) continue;\n      if (z < minZ) minZ = z;\n      if (z > maxZ) maxZ = z;\n    }\n    const zRange = Number.isFinite(minZ) && Number.isFinite(maxZ) ? (maxZ - minZ) : 0;\n    const planarTolerance = Math.max(1e-6, depth * 1e-5, radius * 1e-6);\n    if (zRange <= planarTolerance) {\n      const jitterBase = depth > 1e-6 ? depth : Math.max(1, radius * 0.25);\n      const jitterAmplitude = Math.max(1e-3, jitterBase * 0.04);\n      let jitterMean = 0;\n      for (let i = 0; i < activeCount; i += 1) {\n        const nodeId = activeIds[i] >>> 0;\n        jitterMean += (((hash32((nodeId + 1) >>> 0) + 0.5) / 4294967296) - 0.5) * jitterAmplitude;\n      }\n      jitterMean /= activeCount;\n\n      for (let i = 0; i < activeCount; i += 1) {\n        const nodeId = activeIds[i] >>> 0;\n        const offset = nodeId * 3;\n        const jitter = ((((hash32((nodeId + 1) >>> 0) + 0.5) / 4294967296) - 0.5) * jitterAmplitude) - jitterMean;\n        const nextOutputZ = packedOutputPositions[offset + 2] + jitter;\n        packedOutputPositions[offset + 2] = nextOutputZ;\n        packedPositions[offset + 2] = normalizeInputByOutputScale\n          ? (center[2] + ((nextOutputZ - center[2]) / outputScale))\n          : nextOutputZ;\n      }\n    }\n  }\n\n  if (umapModel && options.umapHasInitialPositions !== true && options.forceInitialPositions !== true) {\n    const warmScratch = scratch.umapWarmStart ?? {};\n    scratch.umapWarmStart = warmScratch;\n    if (warmStartUmapPositionsFromTopology({\n      nodeCapacity,\n      activeIds,\n      activeCount,\n      neighborStarts,\n      neighborCounts,\n      neighbors,\n      neighborWeights,\n      positions: packedOutputPositions,\n      center,\n      radius,\n      depth,\n      mode: options.mode,\n      scratch: warmScratch,\n    })) {\n      for (let nodeId = 0; nodeId < nodeCapacity; nodeId += 1) {\n        const offset = nodeId * 3;\n        const seedX = packedOutputPositions[offset];\n        const seedY = packedOutputPositions[offset + 1];\n        const seedZ = packedOutputPositions[offset + 2];\n        if (normalizeInputByOutputScale) {\n          packedPositions[offset] = center[0] + ((seedX - center[0]) / outputScale);\n          packedPositions[offset + 1] = center[1] + ((seedY - center[1]) / outputScale);\n          packedPositions[offset + 2] = is3D\n            ? (center[2] + ((seedZ - center[2]) / outputScale))\n            : center[2];\n        } else {\n          packedPositions[offset] = seedX;\n          packedPositions[offset + 1] = seedY;\n          packedPositions[offset + 2] = is3D ? seedZ : center[2];\n        }\n      }\n    }\n  }\n\n  return {\n    umapModel,\n    nodeCapacity,\n    activeCount,\n    activeIds,\n    activeMask,\n    neighborStarts,\n    neighborCounts,\n    neighbors,\n    neighborEdges,\n    neighborWeights,\n    nodeMass,\n    nodeStrength: ArrayBuffer.isView(nodeStrengthView) ? nodeStrengthView : createEmptyFloatArray(),\n    edgeWeightValues: ArrayBuffer.isView(edgeWeightView) ? edgeWeightView : createEmptyFloatArray(),\n    edgeCapacity: Math.max(0, Math.floor(Number(edgeCapacity) || 0)),\n    forceNormalizationType,\n    linearScalarInputs: useLinearScalarInputs,\n    linearNormalizedInputs: !umapModel && !useLinearScalarInputs && forceNormalizationType !== 'local-degree',\n    linearHasEdgeWeights: !umapModel && Boolean(edgeWeightAttribute),\n    componentIds: componentMetadata.componentIds,\n    componentRanks: componentMetadata.componentRanks,\n    nodeComponentRank: componentMetadata.nodeComponentRank,\n    nodeComponentSize: componentMetadata.nodeComponentSize,\n    componentSizes: componentMetadata.componentSizes,\n    componentGravityScale: componentMetadata.componentGravityScale,\n    componentCount: componentMetadata.componentCount,\n    largestComponentId: componentMetadata.largestComponentId,\n    largestComponentSize: componentMetadata.largestComponentSize,\n    secondLargestComponentSize: componentMetadata.secondLargestComponentSize,\n    singletonComponentCount: componentMetadata.singletonComponentCount,\n    componentForcesActive: componentMetadata.componentForcesActive,\n    componentSeedingEnabled: componentMetadata.componentSeedingEnabled,\n    componentGravityEnabled: componentMetadata.componentGravityEnabled,\n    componentSeedingApplied,\n    packedPositions,\n    packedOutputPositions,\n    neighborLength,\n    umapEpochs,\n    valueCount,\n  };\n}\n\nfunction hash32(value) {\n  let x = value >>> 0;\n  x = (x ^ (x >>> 16)) >>> 0;\n  x = Math.imul(x, 0x7feb352d) >>> 0;\n  x = (x ^ (x >>> 15)) >>> 0;\n  x = Math.imul(x, 0x846ca68b) >>> 0;\n  x = (x ^ (x >>> 16)) >>> 0;\n  return x >>> 0;\n}\n\nfunction hashToSignedUnit(value) {\n  return ((((hash32(value >>> 0) + 0.5) / 4294967296) * 2) - 1);\n}\n\nfunction sampleActiveId(nodeId, iter, activeIds, activeCount, seed) {\n  if (!activeIds || activeCount <= 0) return nodeId >>> 0;\n  const mixed = hash32((seed + Math.imul(nodeId >>> 0, 2654435761) + Math.imul(iter >>> 0, 747796405)) >>> 0);\n  const index = mixed % Math.max(1, activeCount);\n  return activeIds[index] >>> 0;\n}\n\nfunction resolveSampleChurnCount(sampleCount, sampleChurn) {\n  const safeSampleCount = Math.max(1, Math.floor(Number(sampleCount) || 0));\n  const churn = clamp(sampleChurn, 0, 1, DEFAULT_OPTIONS.sampleChurn);\n  if (churn <= 0) return 0;\n  return Math.min(safeSampleCount, Math.max(1, Math.ceil(safeSampleCount * churn)));\n}\n\nfunction resolveUmapSampleCount(negativeSampleRate, neighborCount, maxNeighborsPerNode) {\n  const safeNegativeRate = Math.max(0, Number(negativeSampleRate) || 0);\n  const positiveSampleCount = Math.max(\n    1,\n    Math.min(\n      Math.max(1, Math.floor(Number(maxNeighborsPerNode) || 0)),\n      Math.max(1, Math.floor(Number(neighborCount) || 0)),\n    ),\n  );\n  return Math.max(1, Math.round(safeNegativeRate * positiveSampleCount));\n}\n\nexport function resolveUmapEpochCount(value, nodeCount = 0) {\n  const explicit = Number(value);\n  if (Number.isFinite(explicit) && explicit > 0) {\n    return Math.max(1, Math.floor(explicit));\n  }\n  const safeNodeCount = Math.max(0, Math.floor(Number(nodeCount) || 0));\n  return safeNodeCount > 10000 ? DEFAULT_UMAP_EPOCHS_LARGE : DEFAULT_UMAP_EPOCHS_SMALL;\n}\n\nfunction resolveSampleEpoch(iter, sampleCount, churnCount, sampleFrame) {\n  const safeSampleCount = Math.max(1, Math.floor(Number(sampleCount) || 0));\n  const safeChurnCount = Math.min(safeSampleCount, Math.max(0, Math.floor(Number(churnCount) || 0)));\n  if (safeChurnCount <= 0) return 0;\n  const safeIter = Math.max(0, Math.floor(Number(iter) || 0));\n  const safeFrame = Math.max(0, Math.floor(Number(sampleFrame) || 0));\n  return Math.floor(((safeFrame * safeChurnCount) + (safeSampleCount - 1 - safeIter)) / safeSampleCount);\n}\n\nfunction countChangedSampleSlots(sampleCount, churnCount, sampleFrame) {\n  const safeSampleCount = Math.max(1, Math.floor(Number(sampleCount) || 0));\n  const safeChurnCount = Math.min(safeSampleCount, Math.max(0, Math.floor(Number(churnCount) || 0)));\n  const safeFrame = Math.max(0, Math.floor(Number(sampleFrame) || 0));\n  if (safeChurnCount <= 0 || safeFrame <= 0) return 0;\n  let changed = 0;\n  const previousFrame = safeFrame - 1;\n  for (let iter = 0; iter < safeSampleCount; iter += 1) {\n    const previousEpoch = resolveSampleEpoch(iter, safeSampleCount, safeChurnCount, previousFrame);\n    const currentEpoch = resolveSampleEpoch(iter, safeSampleCount, safeChurnCount, safeFrame);\n    if (previousEpoch !== currentEpoch) {\n      changed += 1;\n    }\n  }\n  return changed;\n}\n\nfunction sampleActiveIdProgressive(nodeId, iter, activeIds, activeCount, seed, sampleCount, churnCount, sampleFrame) {\n  const epoch = resolveSampleEpoch(iter, sampleCount, churnCount, sampleFrame);\n  if (epoch <= 0) {\n    return sampleActiveId(nodeId, iter, activeIds, activeCount, seed);\n  }\n  const epochSeed = (seed + Math.imul(epoch >>> 0, 1597334677)) >>> 0;\n  return sampleActiveId(nodeId, iter, activeIds, activeCount, epochSeed);\n}\n\nfunction recenterActivePositions(positions, activeIds, activeCount, center, is3D) {\n  if (!(positions instanceof Float32Array) || !activeIds || activeCount <= 0) return;\n\n  let sumX = 0;\n  let sumY = 0;\n  let sumZ = 0;\n  let validCount = 0;\n  for (let i = 0; i < activeCount; i += 1) {\n    const nodeId = activeIds[i];\n    const base = nodeId * 3;\n    if (base + 2 >= positions.length) continue;\n    sumX += positions[base];\n    sumY += positions[base + 1];\n    sumZ += positions[base + 2];\n    validCount += 1;\n  }\n\n  if (validCount <= 0) return;\n\n  const shiftX = (sumX / validCount) - center[0];\n  const shiftY = (sumY / validCount) - center[1];\n  const shiftZ = is3D ? ((sumZ / validCount) - center[2]) : 0;\n  if (Math.abs(shiftX) <= 1e-9 && Math.abs(shiftY) <= 1e-9 && Math.abs(shiftZ) <= 1e-9) return;\n\n  for (let i = 0; i < activeCount; i += 1) {\n    const nodeId = activeIds[i];\n    const base = nodeId * 3;\n    if (base + 2 >= positions.length) continue;\n    positions[base] -= shiftX;\n    positions[base + 1] -= shiftY;\n    positions[base + 2] = is3D ? (positions[base + 2] - shiftZ) : center[2];\n  }\n}\n\nfunction findComponentParent(parent, nodeId) {\n  let root = nodeId >>> 0;\n  while (parent[root] !== root) {\n    root = parent[root] >>> 0;\n  }\n  let current = nodeId >>> 0;\n  while (parent[current] !== current) {\n    const next = parent[current] >>> 0;\n    parent[current] = root;\n    current = next;\n  }\n  return root >>> 0;\n}\n\nfunction unionComponentParents(parent, size, a, b) {\n  let rootA = findComponentParent(parent, a);\n  let rootB = findComponentParent(parent, b);\n  if (rootA === rootB) return rootA;\n  if ((size[rootA] ?? 0) < (size[rootB] ?? 0)) {\n    const swap = rootA;\n    rootA = rootB;\n    rootB = swap;\n  }\n  parent[rootB] = rootA;\n  size[rootA] = (size[rootA] ?? 0) + (size[rootB] ?? 0);\n  return rootA;\n}\n\nexport function buildActiveComponentMetadata({\n  nodeCapacity = 0,\n  activeIds = createEmptyUintArray(),\n  activeCount = 0,\n  activeMask = createEmptyUintArray(),\n  neighborStarts = createEmptyUintArray(),\n  neighborCounts = createEmptyUintArray(),\n  neighbors = createEmptyUintArray(),\n  options = {},\n  scratch = {},\n} = {}) {\n  const safeNodeCapacity = Math.max(0, Math.floor(Number(nodeCapacity) || 0));\n  const safeActiveCount = Math.max(0, Math.floor(Number(activeCount) || 0));\n  const componentIds = ensureUint32Capacity(scratch.componentIds, safeNodeCapacity);\n  const componentRanks = ensureUint32Capacity(scratch.componentRanks, safeNodeCapacity);\n  const nodeComponentRank = ensureUint32Capacity(scratch.nodeComponentRank, safeNodeCapacity);\n  const nodeComponentSize = ensureUint32Capacity(scratch.nodeComponentSize, safeNodeCapacity);\n  const componentSizes = ensureUint32Capacity(scratch.componentSizes, Math.max(1, safeActiveCount));\n  const componentGravityScale = ensureFloat32Capacity(scratch.componentGravityScale, safeNodeCapacity);\n  scratch.componentIds = componentIds;\n  scratch.componentRanks = componentRanks;\n  scratch.nodeComponentRank = nodeComponentRank;\n  scratch.nodeComponentSize = nodeComponentSize;\n  scratch.componentSizes = componentSizes;\n  scratch.componentGravityScale = componentGravityScale;\n\n  componentIds.fill(0, 0, safeNodeCapacity);\n  componentRanks.fill(0, 0, safeNodeCapacity);\n  nodeComponentRank.fill(0, 0, safeNodeCapacity);\n  nodeComponentSize.fill(0, 0, safeNodeCapacity);\n  componentSizes.fill(0, 0, Math.max(1, safeActiveCount));\n  componentGravityScale.fill(1, 0, safeNodeCapacity);\n\n  if (safeNodeCapacity <= 0 || safeActiveCount <= 0) {\n    return {\n      componentIds,\n      componentRanks,\n      nodeComponentRank,\n      nodeComponentSize,\n      componentSizes,\n      componentGravityScale,\n      componentCount: 0,\n      largestComponentId: 0,\n      largestComponentSize: 0,\n      componentGravityEnabled: false,\n    };\n  }\n\n  const parent = ensureUint32Capacity(scratch.componentParent, safeNodeCapacity);\n  const unionSize = ensureUint32Capacity(scratch.componentUnionSize, safeNodeCapacity);\n  const rootToComponent = ensureUint32Capacity(scratch.componentRootToId, safeNodeCapacity);\n  scratch.componentParent = parent;\n  scratch.componentUnionSize = unionSize;\n  scratch.componentRootToId = rootToComponent;\n\n  const sentinel = 0xffffffff;\n  parent.fill(sentinel, 0, safeNodeCapacity);\n  unionSize.fill(0, 0, safeNodeCapacity);\n  rootToComponent.fill(sentinel, 0, safeNodeCapacity);\n\n  for (let i = 0; i < safeActiveCount; i += 1) {\n    const nodeId = activeIds[i] >>> 0;\n    if (nodeId >= safeNodeCapacity) continue;\n    parent[nodeId] = nodeId;\n    unionSize[nodeId] = 1;\n  }\n\n  for (let i = 0; i < safeActiveCount; i += 1) {\n    const nodeId = activeIds[i] >>> 0;\n    if (nodeId >= safeNodeCapacity || parent[nodeId] === sentinel) continue;\n    const start = neighborStarts[nodeId] >>> 0;\n    const degree = neighborCounts[nodeId] >>> 0;\n    for (let n = 0; n < degree; n += 1) {\n      const offset = start + n;\n      if (offset >= neighbors.length) break;\n      const otherId = neighbors[offset] >>> 0;\n      if (\n        otherId < safeNodeCapacity\n        && parent[otherId] !== sentinel\n        && (activeMask?.[otherId] ?? 0) !== 0\n      ) {\n        unionComponentParents(parent, unionSize, nodeId, otherId);\n      }\n    }\n  }\n\n  let componentCount = 0;\n  let largestComponentId = 0;\n  let largestComponentSize = 0;\n  for (let i = 0; i < safeActiveCount; i += 1) {\n    const nodeId = activeIds[i] >>> 0;\n    if (nodeId >= safeNodeCapacity || parent[nodeId] === sentinel) continue;\n    const root = findComponentParent(parent, nodeId);\n    let componentId = rootToComponent[root] >>> 0;\n    if (componentId === sentinel) {\n      componentId = componentCount;\n      rootToComponent[root] = componentId;\n      componentSizes[componentId] = 0;\n      componentCount += 1;\n    }\n    componentIds[nodeId] = componentId;\n    const nextSize = (componentSizes[componentId] + 1) >>> 0;\n    componentSizes[componentId] = nextSize;\n    if (nextSize > largestComponentSize) {\n      largestComponentSize = nextSize;\n      largestComponentId = componentId;\n    }\n  }\n\n  let nextRank = 1;\n  for (let componentId = 0; componentId < componentCount; componentId += 1) {\n    componentRanks[componentId] = componentId === largestComponentId ? 0 : nextRank++;\n  }\n\n  let secondLargestComponentSize = 0;\n  let singletonComponentCount = 0;\n  for (let componentId = 0; componentId < componentCount; componentId += 1) {\n    const componentSize = componentSizes[componentId] >>> 0;\n    if (componentSize === 1) singletonComponentCount += 1;\n    if (componentId !== largestComponentId && componentSize > secondLargestComponentSize) {\n      secondLargestComponentSize = componentSize;\n    }\n  }\n\n  const mainScale = Math.max(0, toFinite(options.componentMainGravityScale, DEFAULT_OPTIONS.componentMainGravityScale));\n  const singletonScale = clamp(\n    options.componentSingletonGravityScale,\n    0,\n    Math.max(1, mainScale),\n    DEFAULT_OPTIONS.componentSingletonGravityScale,\n  );\n  const componentForcesActive = shouldActivateComponentForces({\n    componentForces: options.componentForces,\n    componentCount,\n    activeCount: safeActiveCount,\n    largestComponentSize,\n    secondLargestComponentSize,\n  });\n  const seedingEnabled = componentForcesActive && options.componentSeeding === true;\n  const gravityEnabled = componentForcesActive && options.componentGravity !== false;\n  const largestLog = Math.max(1, Math.log2(Math.max(2, largestComponentSize + 1)));\n\n  for (let i = 0; i < safeActiveCount; i += 1) {\n    const nodeId = activeIds[i] >>> 0;\n    if (nodeId >= safeNodeCapacity) continue;\n    const componentId = componentIds[nodeId] >>> 0;\n    const componentSize = componentSizes[componentId] >>> 0;\n    nodeComponentRank[nodeId] = componentRanks[componentId] >>> 0;\n    nodeComponentSize[nodeId] = componentSize;\n    if (!gravityEnabled) {\n      componentGravityScale[nodeId] = 1;\n    } else if (componentId === largestComponentId) {\n      componentGravityScale[nodeId] = mainScale;\n    } else {\n      const sizeMix = Math.min(1, Math.log2(Math.max(2, componentSize + 1)) / largestLog);\n      componentGravityScale[nodeId] = singletonScale + ((1 - singletonScale) * sizeMix);\n    }\n  }\n\n  return {\n    componentIds,\n    componentRanks,\n    nodeComponentRank,\n    nodeComponentSize,\n    componentSizes,\n    componentGravityScale,\n    componentCount,\n    largestComponentId,\n    largestComponentSize,\n    secondLargestComponentSize,\n    singletonComponentCount,\n    componentForcesActive,\n    componentSeedingEnabled: seedingEnabled,\n    componentGravityEnabled: gravityEnabled,\n  };\n}\n\nexport function applyComponentAwareInitialPositions({\n  positions = null,\n  nodeCapacity = 0,\n  activeIds = createEmptyUintArray(),\n  activeCount = 0,\n  componentIds = createEmptyUintArray(),\n  componentRanks = createEmptyUintArray(),\n  componentSizes = createEmptyUintArray(),\n  componentCount = 0,\n  largestComponentId = 0,\n  center = [0, 0, 0],\n  radius = DEFAULT_OPTIONS.radius,\n  depth = DEFAULT_OPTIONS.depth,\n  mode = '2d',\n  scratch = {},\n} = {}) {\n  if (!(positions instanceof Float32Array) || activeCount <= 1 || componentCount <= 1 || nodeCapacity <= 1) {\n    return false;\n  }\n\n  const is3D = mode === '3d';\n  const centroidX = ensureFloat32Capacity(scratch.componentCentroidX, componentCount);\n  const centroidY = ensureFloat32Capacity(scratch.componentCentroidY, componentCount);\n  const centroidZ = ensureFloat32Capacity(scratch.componentCentroidZ, componentCount);\n  scratch.componentCentroidX = centroidX;\n  scratch.componentCentroidY = centroidY;\n  scratch.componentCentroidZ = centroidZ;\n  centroidX.fill(0, 0, componentCount);\n  centroidY.fill(0, 0, componentCount);\n  centroidZ.fill(0, 0, componentCount);\n\n  for (let i = 0; i < activeCount; i += 1) {\n    const nodeId = activeIds[i] >>> 0;\n    if (nodeId >= nodeCapacity) continue;\n    const componentId = componentIds[nodeId] >>> 0;\n    if (componentId >= componentCount) continue;\n    const base = nodeId * 3;\n    centroidX[componentId] += positions[base] ?? center[0];\n    centroidY[componentId] += positions[base + 1] ?? center[1];\n    centroidZ[componentId] += positions[base + 2] ?? center[2];\n  }\n\n  for (let componentId = 0; componentId < componentCount; componentId += 1) {\n    const size = Math.max(1, componentSizes[componentId] >>> 0);\n    centroidX[componentId] /= size;\n    centroidY[componentId] /= size;\n    centroidZ[componentId] /= size;\n  }\n\n  const shiftX = ensureFloat32Capacity(scratch.componentShiftX, componentCount);\n  const shiftY = ensureFloat32Capacity(scratch.componentShiftY, componentCount);\n  const shiftZ = ensureFloat32Capacity(scratch.componentShiftZ, componentCount);\n  scratch.componentShiftX = shiftX;\n  scratch.componentShiftY = shiftY;\n  scratch.componentShiftZ = shiftZ;\n  shiftX.fill(0, 0, componentCount);\n  shiftY.fill(0, 0, componentCount);\n  shiftZ.fill(0, 0, componentCount);\n\n  const goldenAngle = Math.PI * (3 - Math.sqrt(5));\n  const safeRadius = Math.max(1, toFinite(radius, DEFAULT_OPTIONS.radius));\n  const safeDepth = Math.max(0, toFinite(depth, DEFAULT_OPTIONS.depth));\n  const baseHaloRadius = safeRadius * 0.42;\n  const ringSpacing = safeRadius * 0.2;\n  for (let componentId = 0; componentId < componentCount; componentId += 1) {\n    let targetX = center[0];\n    let targetY = center[1];\n    let targetZ = center[2];\n    if (componentId !== largestComponentId) {\n      const rank = Math.max(1, componentRanks[componentId] >>> 0);\n      const size = Math.max(1, componentSizes[componentId] >>> 0);\n      const angle = rank * goldenAngle;\n      const haloRadius = baseHaloRadius + (ringSpacing * Math.sqrt(Math.max(0, rank - 1) / 16));\n      const sizeOffset = Math.log2(size + 1) * safeRadius * 0.015;\n      targetX += Math.cos(angle) * (haloRadius + sizeOffset);\n      targetY += Math.sin(angle) * (haloRadius + sizeOffset);\n      if (is3D && safeDepth > 0) {\n        targetZ += hashToSignedUnit(Math.imul((componentId + 1) >>> 0, 2246822519)) * safeDepth * 0.18;\n      }\n    }\n    shiftX[componentId] = targetX - centroidX[componentId];\n    shiftY[componentId] = targetY - centroidY[componentId];\n    shiftZ[componentId] = is3D ? (targetZ - centroidZ[componentId]) : (center[2] - centroidZ[componentId]);\n  }\n\n  for (let i = 0; i < activeCount; i += 1) {\n    const nodeId = activeIds[i] >>> 0;\n    if (nodeId >= nodeCapacity) continue;\n    const componentId = componentIds[nodeId] >>> 0;\n    if (componentId >= componentCount) continue;\n    const base = nodeId * 3;\n    positions[base] += shiftX[componentId];\n    positions[base + 1] += shiftY[componentId];\n    positions[base + 2] = is3D ? (positions[base + 2] + shiftZ[componentId]) : center[2];\n  }\n  return true;\n}\n\nexport function warmStartUmapPositionsFromTopology({\n  nodeCapacity = 0,\n  activeIds = createEmptyUintArray(),\n  activeCount = 0,\n  neighborStarts = createEmptyUintArray(),\n  neighborCounts = createEmptyUintArray(),\n  neighbors = createEmptyUintArray(),\n  neighborWeights = null,\n  positions = null,\n  center = [0, 0, 0],\n  radius = DEFAULT_OPTIONS.radius,\n  depth = DEFAULT_OPTIONS.depth,\n  mode = '2d',\n  scratch = {},\n} = {}) {\n  if (!(positions instanceof Float32Array) || activeCount <= 1 || nodeCapacity <= 1) {\n    return false;\n  }\n\n  const is3D = mode === '3d';\n  const signalX = ensureFloat32Capacity(scratch.signalX, nodeCapacity);\n  const signalY = ensureFloat32Capacity(scratch.signalY, nodeCapacity);\n  const nextX = ensureFloat32Capacity(scratch.nextX, nodeCapacity);\n  const nextY = ensureFloat32Capacity(scratch.nextY, nodeCapacity);\n  scratch.signalX = signalX;\n  scratch.signalY = signalY;\n  scratch.nextX = nextX;\n  scratch.nextY = nextY;\n\n  let signalZ = null;\n  let nextZ = null;\n  if (is3D) {\n    signalZ = ensureFloat32Capacity(scratch.signalZ, nodeCapacity);\n    nextZ = ensureFloat32Capacity(scratch.nextZ, nodeCapacity);\n    scratch.signalZ = signalZ;\n    scratch.nextZ = nextZ;\n  }\n\n  for (let i = 0; i < activeCount; i += 1) {\n    const nodeId = activeIds[i] >>> 0;\n    signalX[nodeId] = hashToSignedUnit(Math.imul((nodeId + 1) >>> 0, 2654435761));\n    signalY[nodeId] = hashToSignedUnit(Math.imul((nodeId + 1) >>> 0, 1597334677));\n    if (is3D && signalZ) {\n      signalZ[nodeId] = hashToSignedUnit(Math.imul((nodeId + 1) >>> 0, 2246822519));\n    }\n  }\n\n  const passes = Math.max(4, Math.min(8, Math.ceil(Math.log2(Math.max(2, activeCount)))));\n  for (let pass = 0; pass < passes; pass += 1) {\n    for (let i = 0; i < activeCount; i += 1) {\n      const nodeId = activeIds[i] >>> 0;\n      const start = neighborStarts[nodeId] ?? 0;\n      const degree = neighborCounts[nodeId] ?? 0;\n      if (degree <= 0) {\n        nextX[nodeId] = signalX[nodeId];\n        nextY[nodeId] = signalY[nodeId];\n        if (is3D && nextZ && signalZ) nextZ[nodeId] = signalZ[nodeId];\n        continue;\n      }\n\n      let sumWeight = 0;\n      let sumX = 0;\n      let sumY = 0;\n      let sumZ = 0;\n      for (let n = 0; n < degree; n += 1) {\n        const offset = start + n;\n        const otherId = neighbors[offset] >>> 0;\n        if (otherId >= nodeCapacity) continue;\n        const weight = neighborWeights instanceof Float32Array\n          ? Math.max(0, neighborWeights[offset] ?? 0)\n          : 1;\n        if (!(weight > 0)) continue;\n        sumWeight += weight;\n        sumX += signalX[otherId] * weight;\n        sumY += signalY[otherId] * weight;\n        if (is3D && signalZ) sumZ += signalZ[otherId] * weight;\n      }\n\n      if (!(sumWeight > 0)) {\n        nextX[nodeId] = signalX[nodeId];\n        nextY[nodeId] = signalY[nodeId];\n        if (is3D && nextZ && signalZ) nextZ[nodeId] = signalZ[nodeId];\n        continue;\n      }\n\n      nextX[nodeId] = (signalX[nodeId] * 0.3) + ((sumX / sumWeight) * 0.7);\n      nextY[nodeId] = (signalY[nodeId] * 0.3) + ((sumY / sumWeight) * 0.7);\n      if (is3D && nextZ && signalZ) {\n        nextZ[nodeId] = (signalZ[nodeId] * 0.3) + ((sumZ / sumWeight) * 0.7);\n      }\n    }\n\n    for (let i = 0; i < activeCount; i += 1) {\n      const nodeId = activeIds[i] >>> 0;\n      signalX[nodeId] = nextX[nodeId];\n      signalY[nodeId] = nextY[nodeId];\n      if (is3D && signalZ && nextZ) signalZ[nodeId] = nextZ[nodeId];\n    }\n  }\n\n  let meanX = 0;\n  let meanY = 0;\n  let meanZ = 0;\n  for (let i = 0; i < activeCount; i += 1) {\n    const nodeId = activeIds[i] >>> 0;\n    meanX += signalX[nodeId];\n    meanY += signalY[nodeId];\n    if (is3D && signalZ) meanZ += signalZ[nodeId];\n  }\n  meanX /= activeCount;\n  meanY /= activeCount;\n  if (is3D) meanZ /= activeCount;\n\n  let maxPlanarNorm = 0;\n  let maxDepthNorm = 0;\n  for (let i = 0; i < activeCount; i += 1) {\n    const nodeId = activeIds[i] >>> 0;\n    const centeredX = (signalX[nodeId] - meanX) + (hashToSignedUnit(Math.imul((nodeId + 1) >>> 0, 3266489917)) * 0.08);\n    const centeredY = (signalY[nodeId] - meanY) + (hashToSignedUnit(Math.imul((nodeId + 1) >>> 0, 668265263)) * 0.08);\n    maxPlanarNorm = Math.max(maxPlanarNorm, Math.hypot(centeredX, centeredY));\n    if (is3D && signalZ) {\n      const centeredZ = (signalZ[nodeId] - meanZ) + (hashToSignedUnit(Math.imul((nodeId + 1) >>> 0, 374761393)) * 0.08);\n      maxDepthNorm = Math.max(maxDepthNorm, Math.abs(centeredZ));\n    }\n  }\n\n  if (!(maxPlanarNorm > 1e-6)) {\n    return false;\n  }\n\n  const planarScale = (Math.max(1, radius) * 0.42) / maxPlanarNorm;\n  const depthScale = is3D\n    ? ((Math.max(1, depth || (radius * 0.35)) * 0.42) / Math.max(1e-6, maxDepthNorm || 1))\n    : 0;\n\n  for (let i = 0; i < activeCount; i += 1) {\n    const nodeId = activeIds[i] >>> 0;\n    const base = nodeId * 3;\n    const currentX = positions[base] - center[0];\n    const currentY = positions[base + 1] - center[1];\n    const currentZ = positions[base + 2] - center[2];\n    const warmX = ((signalX[nodeId] - meanX) + (hashToSignedUnit(Math.imul((nodeId + 1) >>> 0, 3266489917)) * 0.08)) * planarScale;\n    const warmY = ((signalY[nodeId] - meanY) + (hashToSignedUnit(Math.imul((nodeId + 1) >>> 0, 668265263)) * 0.08)) * planarScale;\n    const warmZ = is3D && signalZ\n      ? (((signalZ[nodeId] - meanZ) + (hashToSignedUnit(Math.imul((nodeId + 1) >>> 0, 374761393)) * 0.08)) * depthScale)\n      : 0;\n\n    positions[base] = center[0] + (warmX * 0.85) + (currentX * 0.15);\n    positions[base + 1] = center[1] + (warmY * 0.85) + (currentY * 0.15);\n    positions[base + 2] = is3D\n      ? (center[2] + (warmZ * 0.85) + (currentZ * 0.15))\n      : center[2];\n  }\n\n  recenterActivePositions(positions, activeIds, activeCount, center, is3D);\n  return true;\n}\n\nfunction compileWebGLShader(gl, type, source) {\n  const shader = gl?.createShader?.(type) ?? null;\n  if (!shader) {\n    throw new Error('WebGL2 GPU-force shader creation failed.');\n  }\n  gl.shaderSource(shader, source);\n  gl.compileShader(shader);\n  if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n    const log = gl.getShaderInfoLog(shader);\n    gl.deleteShader(shader);\n    throw new Error(log || 'WebGL2 GPU-force shader compilation failed.');\n  }\n  return shader;\n}\n\nfunction createWebGLProgram(gl, vertexSource, fragmentSource) {\n  const vertex = compileWebGLShader(gl, gl.VERTEX_SHADER, vertexSource);\n  const fragment = compileWebGLShader(gl, gl.FRAGMENT_SHADER, fragmentSource);\n  const program = gl.createProgram();\n  gl.attachShader(program, vertex);\n  gl.attachShader(program, fragment);\n  gl.linkProgram(program);\n  if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n    const log = gl.getProgramInfoLog(program);\n    gl.deleteProgram(program);\n    gl.deleteShader(vertex);\n    gl.deleteShader(fragment);\n    throw new Error(log || 'WebGL2 GPU-force program link failed.');\n  }\n  gl.deleteShader(vertex);\n  gl.deleteShader(fragment);\n  return program;\n}\n\nfunction canUseWebGLTextureCompute(gl) {\n  if (!gl) return false;\n  if (typeof gl.createShader !== 'function' || typeof gl.drawBuffers !== 'function') return false;\n  if (typeof gl.createFramebuffer !== 'function' || typeof gl.readPixels !== 'function') return false;\n  if (typeof gl.getExtension === 'function') {\n    const ext = gl.getExtension('EXT_color_buffer_float');\n    if (!ext) return false;\n  } else {\n    return false;\n  }\n  return true;\n}\n\nfunction resolveWebGLTextureLayout(gl, count) {\n  const max = gl?.getParameter?.(gl.MAX_TEXTURE_SIZE) ?? 16384;\n  const safeCount = Math.max(1, Math.floor(Number(count) || 0));\n  const width = Math.min(max, safeCount);\n  const height = Math.ceil(safeCount / Math.max(1, width));\n  if (height > max) {\n    throw new Error(\n      `WebGL2 GPU-force layout requires texture dimensions <= MAX_TEXTURE_SIZE (${max}), `\n      + `got ${safeCount} texels -> ${width}x${height}.`,\n    );\n  }\n  return { width, height };\n}\n\nconst WEBGL_FORCE_FULLSCREEN_VERTEX = `#version 300 es\nvoid main() {\n  vec2 position = vec2(\n    gl_VertexID == 2 ? 3.0 : -1.0,\n    gl_VertexID == 1 ? 3.0 : -1.0\n  );\n  gl_Position = vec4(position, 0.0, 1.0);\n}`;\n\nfunction buildWebglComputeFragment({ umap = false, scalar = false, normalized = false } = {}) {\n  return `#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp usampler2D;\n\nuniform sampler2D u_positions;\nuniform sampler2D u_velocities;\nuniform usampler2D u_activeIds;\nuniform usampler2D u_activeMask;\nuniform usampler2D u_neighborStarts;\nuniform usampler2D u_neighborCounts;\nuniform usampler2D u_neighbors;\n${umap ? '' : 'uniform sampler2D u_componentGravityScale;\\n'}\n${umap ? 'uniform sampler2D u_nodeMass;\\nuniform sampler2D u_neighborWeights;\\n' : ''}\n${scalar ? 'uniform usampler2D u_neighborEdges;\\nuniform sampler2D u_scalarValues;\\n' : ''}\n\nuniform ivec2 u_nodeTexSize;\nuniform ivec2 u_activeIdsTexSize;\nuniform ivec2 u_neighborTexSize;\n${scalar ? 'uniform ivec2 u_scalarTexSize;\\n' : ''}\n\nuniform int u_nodeCapacity;\nuniform int u_activeCount;\nuniform int u_sampleCount;\nuniform int u_maxNeighbors;\nuniform int u_use3D;\nuniform int u_exactRepulsionThreshold;\nuniform int u_sampleChurnCount;\nuniform int u_forceNormalizationMode;\nuniform int u_hasEdgeWeights;\n${umap ? '' : 'uniform int u_componentGravityEnabled;\\n'}\n\nuniform uint u_seed;\nuniform uint u_sampleFrame;\n\nuniform vec3 u_center;\nuniform float u_outputScale;\nuniform float u_linkDistance;\nuniform float u_minDistance;\nuniform float u_kRepulsion;\nuniform float u_kAttraction;\nuniform float u_kGravity;\nuniform float u_eta;\nuniform float u_damping;\nuniform float u_maxStep;\n${umap ? 'uniform float u_umapA;\\nuniform float u_umapB;\\nuniform float u_umapGamma;\\nuniform float u_umapNegativeSampleRate;\\nuniform float u_umapEpochs;\\n' : ''}\n\nlayout(location = 0) out vec4 outPosition;\nlayout(location = 1) out vec4 outVelocity;\nlayout(location = 2) out vec4 outOutputPosition;\n\nivec2 textureCoord(ivec2 size, int index) {\n  int width = max(size.x, 1);\n  return ivec2(index % width, index / width);\n}\n\nuint hash32(uint value) {\n  uint x = value;\n  x = x ^ (x >> 16u);\n  x = x * 0x7feb352du;\n  x = x ^ (x >> 15u);\n  x = x * 0x846ca68bu;\n  x = x ^ (x >> 16u);\n  return x;\n}\n\nfloat clipGradient(float value) {\n  return clamp(value, -4.0, 4.0);\n}\n\nuint sampleActiveId(int nodeId, int iter, int activeCount, uint seed) {\n  if (activeCount <= 0) {\n    return uint(max(nodeId, 0));\n  }\n  uint mixed = hash32(seed + uint(nodeId) * 2654435761u + uint(iter) * 747796405u);\n  int index = int(mixed % uint(max(activeCount, 1)));\n  return texelFetch(u_activeIds, textureCoord(u_activeIdsTexSize, index), 0).x;\n}\n\nint sampleEpoch(int iter, int sampleCount, int churnCount, uint sampleFrame) {\n  if (sampleCount <= 0 || churnCount <= 0) {\n    return 0;\n  }\n  int cappedChurn = min(churnCount, sampleCount);\n  return int(((sampleFrame * uint(cappedChurn)) + uint(sampleCount - 1 - iter)) / uint(sampleCount));\n}\n\nuint sampleActiveIdProgressive(int nodeId, int iter, int activeCount, uint seed, int sampleCount, int churnCount, uint sampleFrame) {\n  if (activeCount <= 0) {\n    return uint(max(nodeId, 0));\n  }\n  int epoch = sampleEpoch(iter, sampleCount, churnCount, sampleFrame);\n  uint epochSeed = seed + uint(epoch) * 1597334677u;\n  return sampleActiveId(nodeId, iter, activeCount, epochSeed);\n}\n\nint sampleNeighborIndex(int start, int limit, int nodeId, int iter, uint seed, uint sampleFrame) {\n  if (limit <= 0) {\n    return start;\n  }\n  uint mixed = hash32(seed + uint(nodeId) * 2246822519u + uint(iter) * 3266489917u + sampleFrame * 668265263u);\n  return start + int(mixed % uint(limit));\n}\n\nint samplesDue(float epoch, float interval) {\n  if (!(interval > 0.0)) {\n    return 0;\n  }\n  float previousEpoch = max(0.0, epoch - 1.0);\n  float previousBucket = floor(previousEpoch / interval);\n  float currentBucket = floor(epoch / interval);\n  return int(max(0.0, currentBucket - previousBucket));\n}\n\nvec3 fetchPosition(int nodeId) {\n  return texelFetch(u_positions, textureCoord(u_nodeTexSize, nodeId), 0).xyz;\n}\n\nvec3 fetchVelocity(int nodeId) {\n  return texelFetch(u_velocities, textureCoord(u_nodeTexSize, nodeId), 0).xyz;\n}\n\nuint fetchNodeUint(usampler2D source, int nodeId) {\n  return texelFetch(source, textureCoord(u_nodeTexSize, nodeId), 0).x;\n}\n\nuint fetchNeighborValue(int index) {\n  return texelFetch(u_neighbors, textureCoord(u_neighborTexSize, index), 0).x;\n}\n\n${umap ? '' : `float fetchComponentGravityScale(int nodeId) {\n  return texelFetch(u_componentGravityScale, textureCoord(u_nodeTexSize, nodeId), 0).x;\n}\n\n`}\n${scalar ? `uint fetchNeighborEdge(int index) {\n  return texelFetch(u_neighborEdges, textureCoord(u_neighborTexSize, index), 0).x;\n}\n\nfloat fetchScalarNode(int nodeId) {\n  return texelFetch(u_scalarValues, textureCoord(u_nodeTexSize, nodeId), 0).x;\n}\n\nfloat fetchScalarEdge(int edgeId) {\n  int offset = u_nodeCapacity + edgeId;\n  return texelFetch(u_scalarValues, textureCoord(u_scalarTexSize, offset), 0).x;\n}\n\n` : ''}\n${umap ? `float fetchNodeMass(int nodeId) {\n  return texelFetch(u_nodeMass, textureCoord(u_nodeTexSize, nodeId), 0).x;\n}\n\nfloat fetchNeighborWeight(int index) {\n  return texelFetch(u_neighborWeights, textureCoord(u_neighborTexSize, index), 0).x;\n}\n\n` : ''}void main() {\n  ivec2 coord = ivec2(gl_FragCoord.xy);\n  int nodeId = coord.x + coord.y * max(u_nodeTexSize.x, 1);\n  if (nodeId < 0 || nodeId >= u_nodeCapacity) {\n    outPosition = vec4(0.0);\n    outVelocity = vec4(0.0);\n    outOutputPosition = vec4(0.0);\n    return;\n  }\n\n  vec3 pos = fetchPosition(nodeId);\n  vec3 vel = fetchVelocity(nodeId);\n  if (u_use3D == 0) {\n    pos.z = u_center.z;\n    vel.z = 0.0;\n  }\n\n  if (fetchNodeUint(u_activeMask, nodeId) == 0u) {\n    vec3 outputPos = pos;\n    outputPos.xy = u_center.xy + (outputPos.xy - u_center.xy) * u_outputScale;\n    outputPos.z = u_use3D != 0\n      ? (u_center.z + (pos.z - u_center.z) * u_outputScale)\n      : u_center.z;\n    outPosition = vec4(pos, 1.0);\n    outVelocity = vec4(vel, 1.0);\n    outOutputPosition = vec4(outputPos, 1.0);\n    return;\n  }\n\n  vec3 force = vec3(0.0);\n  float minDist = max(0.00001, u_minDistance);\n  float minDistSq = minDist * minDist;\n${umap ? `  float umapA = max(0.000001, u_umapA);\n  float umapB = max(0.000001, u_umapB);\n  float umapGamma = max(0.0, u_umapGamma);\n  float umapNegativeSampleRate = max(0.0, u_umapNegativeSampleRate);\n  float umapEpochs = max(1.0, u_umapEpochs);\n  float minEdgeWeight = 1.0 / umapEpochs;\n  float currentEpoch = float(u_sampleFrame + 1u);\n` : ''}\n\n${umap\n  ? ''\n  : `  if (u_activeCount > 1) {\n    bool useExactRepulsion = u_activeCount <= max(u_sampleCount, u_exactRepulsionThreshold);\n    int repulsionIterations = useExactRepulsion ? u_activeCount : u_sampleCount;\n    float repulsionNormalization = useExactRepulsion\n      ? 1.0\n      : max(1.0, float(u_activeCount) / max(1.0, float(u_sampleCount)));\n    int s = 0;\n    while (s < repulsionIterations) {\n      uint otherIdU = useExactRepulsion\n        ? texelFetch(u_activeIds, textureCoord(u_activeIdsTexSize, s), 0).x\n        : sampleActiveIdProgressive(\n          nodeId,\n          s,\n          u_activeCount,\n          u_seed,\n          u_sampleCount,\n          u_sampleChurnCount,\n          u_sampleFrame\n        );\n      int otherId = int(otherIdU);\n      if (otherId != nodeId && otherId >= 0 && otherId < u_nodeCapacity) {\n        vec3 delta = pos - fetchPosition(otherId);\n        if (u_use3D == 0) {\n          delta.z = 0.0;\n        }\n        float distSq = max(dot(delta, delta), minDistSq);\n        float invDist = inversesqrt(distSq);\n        float repulsionScale = (u_kRepulsion * repulsionNormalization * invDist * invDist * invDist);\n        force += delta * repulsionScale;\n      }\n      s += 1;\n    }\n  }`}\n  int start = int(fetchNodeUint(u_neighborStarts, nodeId));\n  int degree = int(fetchNodeUint(u_neighborCounts, nodeId));\n  int limit = min(degree, u_maxNeighbors);\n  if (limit > 0) {\n${umap\n  ? `  int n = 0;\n    while (n < limit) {\n      int edgeIndex = start + n;\n      int otherId = int(fetchNeighborValue(edgeIndex));\n      if (otherId != nodeId && otherId >= 0 && otherId < u_nodeCapacity) {\n        float edgeWeight = max(0.0, fetchNeighborWeight(edgeIndex));\n        if (edgeWeight >= minEdgeWeight) {\n          float positiveInterval = 1.0 / max(edgeWeight, 0.000001);\n          int positiveDue = samplesDue(currentEpoch, positiveInterval);\n          if (positiveDue > 0) {\n            vec3 delta = fetchPosition(otherId) - pos;\n            if (u_use3D == 0) {\n              delta.z = 0.0;\n            }\n            float distSq = max(dot(delta, delta), minDistSq);\n            float springScale = (\n              u_kAttraction\n              * float(positiveDue)\n              * (2.0 * umapA * umapB * pow(distSq, umapB - 1.0))\n              / (1.0 + (umapA * pow(distSq, umapB)))\n            );\n            force += delta * springScale;\n          }\n\n          if (umapNegativeSampleRate > 0.0 && u_activeCount > 1) {\n            float negativeInterval = positiveInterval / umapNegativeSampleRate;\n            int negativeDue = samplesDue(currentEpoch, negativeInterval);\n            int p = 0;\n            while (p < negativeDue) {\n              int negativeIter = edgeIndex + (p * max(u_maxNeighbors, 1));\n              int negativeId = int(sampleActiveId(nodeId, negativeIter, u_activeCount, u_seed + (u_sampleFrame * 668265263u)));\n              if (negativeId != nodeId && negativeId >= 0 && negativeId < u_nodeCapacity) {\n                vec3 negativeDelta = pos - fetchPosition(negativeId);\n                if (u_use3D == 0) {\n                  negativeDelta.z = 0.0;\n                }\n                float negativeDistSq = max(dot(negativeDelta, negativeDelta), minDistSq);\n                float repulsionScale = (\n                  u_kRepulsion\n                  * (2.0 * umapGamma * umapB)\n                  / ((0.001 + negativeDistSq) * (1.0 + (umapA * pow(negativeDistSq, umapB))))\n                );\n                force += negativeDelta * repulsionScale;\n              }\n              p += 1;\n            }\n          }\n        }\n      }\n      n += 1;\n    }`\n  : `    int n = 0;\n    while (n < limit) {\n      int neighborIndex = start + n;\n      int otherId = int(fetchNeighborValue(neighborIndex));\n      if (otherId != nodeId && otherId >= 0 && otherId < u_nodeCapacity) {\n        vec3 delta = fetchPosition(otherId) - pos;\n        if (u_use3D == 0) {\n          delta.z = 0.0;\n        }\n        float distSq = max(dot(delta, delta), minDistSq);\n        float dist = sqrt(distSq);\n        float invDist = 1.0 / max(0.00000001, dist);\n        float stretch = dist - u_linkDistance;\n${scalar\n    ? `        uint edgeId = fetchNeighborEdge(neighborIndex);\n        float edgeWeight = u_hasEdgeWeights != 0 ? max(0.0, fetchScalarEdge(int(edgeId))) : 1.0;\n        float endpointDegreeNorm = max(1.0, float(min(uint(degree), fetchNodeUint(u_neighborCounts, otherId))));\n        float endpointStrengthNorm = max(1.0, min(max(0.0, fetchScalarNode(nodeId)), max(0.0, fetchScalarNode(otherId))));\n        float degreeNorm = max(1.0, float(limit));\n        if (u_forceNormalizationMode == 1) {\n          degreeNorm = endpointDegreeNorm;\n        } else if (u_forceNormalizationMode == 2) {\n          degreeNorm = endpointStrengthNorm;\n        } else if (u_forceNormalizationMode == 3) {\n          degreeNorm = 1.0;\n        }`\n    : normalized\n      ? `        float edgeWeight = 1.0;\n        float endpointDegreeNorm = max(1.0, float(min(uint(degree), fetchNodeUint(u_neighborCounts, otherId))));\n        float degreeNorm = max(1.0, float(limit));\n        if (u_forceNormalizationMode == 1) {\n          degreeNorm = endpointDegreeNorm;\n        } else if (u_forceNormalizationMode == 3) {\n          degreeNorm = 1.0;\n        }`\n      : `        float edgeWeight = 1.0;\n        float degreeNorm = max(1.0, float(limit));`}\n        float springScale = ((u_kAttraction * edgeWeight * stretch * invDist) / degreeNorm);\n        force += delta * springScale;\n      }\n      n += 1;\n    }`}\n  }\n\n  vec3 gravityDelta = u_center - pos;\n  if (u_use3D == 0) {\n    gravityDelta.z = 0.0;\n  }\n${umap\n  ? '  force += gravityDelta * u_kGravity;'\n  : `  float gravityScale = u_componentGravityEnabled != 0 ? fetchComponentGravityScale(nodeId) : 1.0;\n  force += gravityDelta * u_kGravity * gravityScale;`}\n\n${umap\n  ? `  vec3 nextDelta = vec3(\n    clipGradient(force.x) * u_eta,\n    clipGradient(force.y) * u_eta,\n    clipGradient(force.z) * u_eta\n  );\n  float speed = length(nextDelta);\n  if (speed > u_maxStep) {\n    nextDelta *= u_maxStep / max(speed, 0.00000001);\n  }\n  if (u_use3D == 0) {\n    nextDelta.z = 0.0;\n  }\n\n  vec3 nextVel = nextDelta;\n  vec3 nextPos = pos + nextDelta;\n  if (u_use3D == 0) {\n    nextPos.z = u_center.z;\n  }`\n  : `  vec3 nextVel = vel * u_damping + force * u_eta;\n  float speed = length(nextVel);\n  if (speed > u_maxStep) {\n    nextVel *= u_maxStep / max(speed, 0.00000001);\n  }\n  if (u_use3D == 0) {\n    nextVel.z = 0.0;\n  }\n\n  vec3 nextPos = pos + nextVel;\n  if (u_use3D == 0) {\n    nextPos.z = u_center.z;\n  }`}\n\n  vec3 outputPos = nextPos;\n  outputPos.xy = u_center.xy + (nextPos.xy - u_center.xy) * u_outputScale;\n  outputPos.z = u_use3D != 0\n    ? (u_center.z + (nextPos.z - u_center.z) * u_outputScale)\n    : u_center.z;\n\n  outPosition = vec4(nextPos, 1.0);\n  outVelocity = vec4(nextVel, 1.0);\n  outOutputPosition = vec4(outputPos, 1.0);\n}`;\n}\n\nconst WEBGL_FORCE_COMPUTE_FRAGMENT_LINEAR = buildWebglComputeFragment();\nconst WEBGL_FORCE_COMPUTE_FRAGMENT_LINEAR_NORMALIZED = buildWebglComputeFragment({ normalized: true });\nconst WEBGL_FORCE_COMPUTE_FRAGMENT_LINEAR_SCALAR = buildWebglComputeFragment({ scalar: true });\nconst WEBGL_FORCE_COMPUTE_FRAGMENT_UMAP = buildWebglComputeFragment({ umap: true });\n\nconst WEBGL_FORCE_REDUCTION_INIT_FRAGMENT = `#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp usampler2D;\n\nuniform sampler2D u_positions;\nuniform usampler2D u_activeMask;\nuniform ivec2 u_nodeTexSize;\nuniform ivec2 u_outputSize;\nuniform int u_nodeCapacity;\nuniform int u_use3D;\nuniform vec3 u_center;\n\nout vec4 fragColor;\n\nivec2 textureCoord(ivec2 size, int index) {\n  int width = max(size.x, 1);\n  return ivec2(index % width, index / width);\n}\n\nvoid main() {\n  ivec2 outCoord = ivec2(gl_FragCoord.xy);\n  ivec2 baseCoord = outCoord * 2;\n  vec4 sumValue = vec4(0.0);\n\n  for (int dy = 0; dy < 2; dy += 1) {\n    for (int dx = 0; dx < 2; dx += 1) {\n      ivec2 srcCoord = baseCoord + ivec2(dx, dy);\n      if (srcCoord.x < u_nodeTexSize.x && srcCoord.y < u_nodeTexSize.y) {\n        int nodeId = srcCoord.x + srcCoord.y * max(u_nodeTexSize.x, 1);\n        if (nodeId >= 0 && nodeId < u_nodeCapacity) {\n          uint activeFlag = texelFetch(u_activeMask, textureCoord(u_nodeTexSize, nodeId), 0).x;\n          if (activeFlag != 0u) {\n            vec3 pos = texelFetch(u_positions, textureCoord(u_nodeTexSize, nodeId), 0).xyz;\n            if (u_use3D == 0) {\n              pos.z = u_center.z;\n            }\n            sumValue += vec4(pos, 1.0);\n          }\n        }\n      }\n    }\n  }\n\n  fragColor = sumValue;\n}`;\n\nconst WEBGL_FORCE_REDUCTION_COMBINE_FRAGMENT = `#version 300 es\nprecision highp float;\nprecision highp int;\n\nuniform sampler2D u_source;\nuniform ivec2 u_sourceSize;\n\nout vec4 fragColor;\n\nvoid main() {\n  ivec2 outCoord = ivec2(gl_FragCoord.xy);\n  ivec2 baseCoord = outCoord * 2;\n  vec4 sumValue = vec4(0.0);\n\n  for (int dy = 0; dy < 2; dy += 1) {\n    for (int dx = 0; dx < 2; dx += 1) {\n      ivec2 srcCoord = baseCoord + ivec2(dx, dy);\n      if (srcCoord.x < u_sourceSize.x && srcCoord.y < u_sourceSize.y) {\n        sumValue += texelFetch(u_source, srcCoord, 0);\n      }\n    }\n  }\n\n  fragColor = sumValue;\n}`;\n\nconst WEBGL_FORCE_ANGULAR_REDUCTION_INIT_FRAGMENT = `#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp usampler2D;\n\nuniform sampler2D u_positions;\nuniform sampler2D u_velocities;\nuniform sampler2D u_centroid;\nuniform usampler2D u_activeMask;\nuniform ivec2 u_nodeTexSize;\nuniform ivec2 u_outputSize;\nuniform int u_nodeCapacity;\nuniform int u_use3D;\nuniform vec3 u_center;\n\nout vec4 fragColor;\n\nivec2 textureCoord(ivec2 size, int index) {\n  int width = max(size.x, 1);\n  return ivec2(index % width, index / width);\n}\n\nvoid main() {\n  ivec2 outCoord = ivec2(gl_FragCoord.xy);\n  ivec2 baseCoord = outCoord * 2;\n  vec4 angular = vec4(0.0);\n  vec4 centroidData = texelFetch(u_centroid, ivec2(0, 0), 0);\n  float count = max(centroidData.w, 1.0);\n  vec3 centroidValue = centroidData.xyz / count;\n  vec3 shift = centroidValue - u_center;\n  if (u_use3D == 0) {\n    shift.z = 0.0;\n  }\n\n  for (int dy = 0; dy < 2; dy += 1) {\n    for (int dx = 0; dx < 2; dx += 1) {\n      ivec2 srcCoord = baseCoord + ivec2(dx, dy);\n      if (srcCoord.x < u_nodeTexSize.x && srcCoord.y < u_nodeTexSize.y) {\n        int nodeId = srcCoord.x + srcCoord.y * max(u_nodeTexSize.x, 1);\n        if (nodeId >= 0 && nodeId < u_nodeCapacity) {\n          uint activeFlag = texelFetch(u_activeMask, textureCoord(u_nodeTexSize, nodeId), 0).x;\n          if (activeFlag != 0u) {\n            vec3 pos = texelFetch(u_positions, textureCoord(u_nodeTexSize, nodeId), 0).xyz - shift;\n            vec3 vel = texelFetch(u_velocities, textureCoord(u_nodeTexSize, nodeId), 0).xyz;\n            if (u_use3D == 0) {\n              pos.z = u_center.z;\n              vel.z = 0.0;\n            }\n            vec3 r = pos - u_center;\n            angular.xyz += cross(r, vel);\n            angular.w += dot(r, r);\n          }\n        }\n      }\n    }\n  }\n\n  fragColor = angular;\n}`;\n\nconst WEBGL_FORCE_RECENTER_FRAGMENT_BASE = `#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp usampler2D;\n\nuniform sampler2D u_positions;\nuniform sampler2D u_velocities;\nuniform sampler2D u_centroid;\nuniform usampler2D u_activeMask;\nuniform ivec2 u_nodeTexSize;\nuniform int u_nodeCapacity;\nuniform int u_use3D;\nuniform vec3 u_center;\nuniform float u_outputScale;\n\nlayout(location = 0) out vec4 outPosition;\nlayout(location = 1) out vec4 outVelocity;\nlayout(location = 2) out vec4 outOutputPosition;\n\nivec2 textureCoord(ivec2 size, int index) {\n  int width = max(size.x, 1);\n  return ivec2(index % width, index / width);\n}\n\nvoid main() {\n  ivec2 coord = ivec2(gl_FragCoord.xy);\n  int nodeId = coord.x + coord.y * max(u_nodeTexSize.x, 1);\n  if (nodeId < 0 || nodeId >= u_nodeCapacity) {\n    outPosition = vec4(0.0);\n    outVelocity = vec4(0.0);\n    outOutputPosition = vec4(0.0);\n    return;\n  }\n\n  vec3 pos = texelFetch(u_positions, textureCoord(u_nodeTexSize, nodeId), 0).xyz;\n  vec3 vel = texelFetch(u_velocities, textureCoord(u_nodeTexSize, nodeId), 0).xyz;\n  vec4 centroidData = texelFetch(u_centroid, ivec2(0, 0), 0);\n  float count = max(centroidData.w, 1.0);\n  vec3 centroidValue = centroidData.xyz / count;\n  vec3 shift = centroidValue - u_center;\n  if (u_use3D == 0) {\n    shift.z = 0.0;\n  }\n\n  if (texelFetch(u_activeMask, textureCoord(u_nodeTexSize, nodeId), 0).x != 0u) {\n    pos -= shift;\n  }\n  if (u_use3D == 0) {\n    pos.z = u_center.z;\n    vel.z = 0.0;\n  }\n\n  vec3 outputPos = pos;\n  outputPos.xy = u_center.xy + (pos.xy - u_center.xy) * u_outputScale;\n  outputPos.z = u_use3D != 0\n    ? (u_center.z + (pos.z - u_center.z) * u_outputScale)\n    : u_center.z;\n\n  outPosition = vec4(pos, 1.0);\n  outVelocity = vec4(vel, 1.0);\n  outOutputPosition = vec4(outputPos, 1.0);\n}`;\n\nconst WEBGL_FORCE_RECENTER_FRAGMENT_ROTATION = `#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp usampler2D;\n\nuniform sampler2D u_positions;\nuniform sampler2D u_velocities;\nuniform sampler2D u_centroid;\nuniform sampler2D u_angular;\nuniform usampler2D u_activeMask;\nuniform ivec2 u_nodeTexSize;\nuniform int u_nodeCapacity;\nuniform int u_use3D;\nuniform vec3 u_center;\nuniform float u_outputScale;\nuniform float u_rotationDamping;\n\nlayout(location = 0) out vec4 outPosition;\nlayout(location = 1) out vec4 outVelocity;\nlayout(location = 2) out vec4 outOutputPosition;\n\nivec2 textureCoord(ivec2 size, int index) {\n  int width = max(size.x, 1);\n  return ivec2(index % width, index / width);\n}\n\nvoid main() {\n  ivec2 coord = ivec2(gl_FragCoord.xy);\n  int nodeId = coord.x + coord.y * max(u_nodeTexSize.x, 1);\n  if (nodeId < 0 || nodeId >= u_nodeCapacity) {\n    outPosition = vec4(0.0);\n    outVelocity = vec4(0.0);\n    outOutputPosition = vec4(0.0);\n    return;\n  }\n\n  vec3 pos = texelFetch(u_positions, textureCoord(u_nodeTexSize, nodeId), 0).xyz;\n  vec3 vel = texelFetch(u_velocities, textureCoord(u_nodeTexSize, nodeId), 0).xyz;\n  vec4 centroidData = texelFetch(u_centroid, ivec2(0, 0), 0);\n  float count = max(centroidData.w, 1.0);\n  vec3 centroidValue = centroidData.xyz / count;\n  vec3 shift = centroidValue - u_center;\n  vec4 angularData = texelFetch(u_angular, ivec2(0, 0), 0);\n  float invRadiusSq = angularData.w > 0.000001 ? (1.0 / angularData.w) : 0.0;\n  vec3 omega = angularData.xyz * invRadiusSq;\n  if (u_use3D == 0) {\n    shift.z = 0.0;\n  }\n\n  if (texelFetch(u_activeMask, textureCoord(u_nodeTexSize, nodeId), 0).x != 0u) {\n    pos -= shift;\n    vec3 r = pos - u_center;\n    vec3 correction = cross(omega, r) * clamp(u_rotationDamping, 0.0, 1.0);\n    pos -= correction;\n    vel -= correction;\n  }\n  if (u_use3D == 0) {\n    pos.z = u_center.z;\n    vel.z = 0.0;\n  }\n\n  vec3 outputPos = pos;\n  outputPos.xy = u_center.xy + (pos.xy - u_center.xy) * u_outputScale;\n  outputPos.z = u_use3D != 0\n    ? (u_center.z + (pos.z - u_center.z) * u_outputScale)\n    : u_center.z;\n\n  outPosition = vec4(pos, 1.0);\n  outVelocity = vec4(vel, 1.0);\n  outOutputPosition = vec4(outputPos, 1.0);\n}`;\n\nclass WebGLTextureComputePath {\n  constructor(gl) {\n    this.gl = gl;\n    this.nodeCapacity = 0;\n    this.activeCount = 0;\n    this.seed = (Math.random() * 0xffffffff) >>> 0;\n    this.sampleFrame = 0;\n    this.textureVersion = 0;\n\n    this.nodeLayout = { width: 1, height: 1 };\n    this.activeLayout = { width: 1, height: 1 };\n    this.neighborLayout = { width: 1, height: 1 };\n    this.scalarLayout = { width: 1, height: 1 };\n\n    this.positionTextures = [null, null];\n    this.velocityTextures = [null, null];\n    this.outputPositionTexture = null;\n    this.activeIdsTexture = null;\n    this.activeMaskTexture = null;\n    this.neighborStartsTexture = null;\n    this.neighborCountsTexture = null;\n    this.neighborsTexture = null;\n    this.componentGravityScaleTexture = null;\n    this.neighborEdgesTexture = null;\n    this.nodeMassTexture = null;\n    this.neighborWeightsTexture = null;\n    this.scalarValuesTexture = null;\n    this.framebuffer = null;\n    this.readbackFramebuffer = null;\n    this.fullscreenVao = null;\n    this._reductionTargets = [\n      { texture: null, framebuffer: null, width: 1, height: 1 },\n      { texture: null, framebuffer: null, width: 1, height: 1 },\n    ];\n    this._angularReductionTargets = [\n      { texture: null, framebuffer: null, width: 1, height: 1 },\n      { texture: null, framebuffer: null, width: 1, height: 1 },\n    ];\n    this._positionUploadScratch = new Float32Array(0);\n    this._velocityUploadScratch = new Float32Array(0);\n    this._outputUploadScratch = new Float32Array(0);\n    this._nodeMassUploadScratch = new Float32Array(0);\n    this._neighborWeightUploadScratch = new Float32Array(0);\n    this._componentGravityScaleUploadScratch = new Float32Array(0);\n    this._scalarValuesUploadScratch = new Float32Array(0);\n    this._scalarValuesLinearScratch = new Float32Array(0);\n    this._uintUploadScratch = new Uint32Array(0);\n    this._readbackScratch = new Float32Array(0);\n    this._sparseReadbackScratch = new Float32Array(0);\n    this._centroidPositionScratch = new Float32Array(0);\n    this._textureSizes = new Map();\n    this.readIndex = 0;\n    this.umapEnabled = false;\n    this.computePrograms = {\n      linear: null,\n      linearNormalized: null,\n      linearScalar: null,\n      umap: null,\n    };\n    this.computeUniforms = {\n      linear: null,\n      linearNormalized: null,\n      linearScalar: null,\n      umap: null,\n    };\n    this.reductionInitProgram = createWebGLProgram(gl, WEBGL_FORCE_FULLSCREEN_VERTEX, WEBGL_FORCE_REDUCTION_INIT_FRAGMENT);\n    this.reductionCombineProgram = createWebGLProgram(gl, WEBGL_FORCE_FULLSCREEN_VERTEX, WEBGL_FORCE_REDUCTION_COMBINE_FRAGMENT);\n    this.angularReductionInitProgram = createWebGLProgram(gl, WEBGL_FORCE_FULLSCREEN_VERTEX, WEBGL_FORCE_ANGULAR_REDUCTION_INIT_FRAGMENT);\n    this.recenterPrograms = {\n      base: createWebGLProgram(gl, WEBGL_FORCE_FULLSCREEN_VERTEX, WEBGL_FORCE_RECENTER_FRAGMENT_BASE),\n      rotation: createWebGLProgram(gl, WEBGL_FORCE_FULLSCREEN_VERTEX, WEBGL_FORCE_RECENTER_FRAGMENT_ROTATION),\n    };\n    this.reductionInitUniforms = this._cacheUniforms(this.reductionInitProgram, [\n      'u_positions',\n      'u_activeMask',\n      'u_nodeTexSize',\n      'u_outputSize',\n      'u_nodeCapacity',\n      'u_use3D',\n      'u_center',\n    ]);\n    this.reductionCombineUniforms = this._cacheUniforms(this.reductionCombineProgram, [\n      'u_source',\n      'u_sourceSize',\n    ]);\n    this.angularReductionInitUniforms = this._cacheUniforms(this.angularReductionInitProgram, [\n      'u_positions',\n      'u_velocities',\n      'u_centroid',\n      'u_activeMask',\n      'u_nodeTexSize',\n      'u_outputSize',\n      'u_nodeCapacity',\n      'u_use3D',\n      'u_center',\n    ]);\n    this.recenterUniforms = {\n      base: this._cacheUniforms(this.recenterPrograms.base, [\n        'u_positions',\n        'u_velocities',\n        'u_centroid',\n        'u_activeMask',\n        'u_nodeTexSize',\n        'u_nodeCapacity',\n        'u_use3D',\n        'u_center',\n        'u_outputScale',\n      ]),\n      rotation: this._cacheUniforms(this.recenterPrograms.rotation, [\n      'u_positions',\n      'u_velocities',\n      'u_centroid',\n      'u_angular',\n      'u_activeMask',\n      'u_nodeTexSize',\n      'u_nodeCapacity',\n      'u_use3D',\n      'u_center',\n      'u_outputScale',\n      'u_rotationDamping',\n      ]),\n    };\n\n    this.framebuffer = gl.createFramebuffer();\n    this.readbackFramebuffer = gl.createFramebuffer();\n    this.fullscreenVao = gl.createVertexArray();\n    this._ensureComputeProgram(false);\n  }\n\n  _cacheUniforms(program, names) {\n    const map = Object.create(null);\n    for (const name of names) {\n      map[name] = this.gl.getUniformLocation(program, name);\n    }\n    return map;\n  }\n\n  _ensureComputeProgram(useUmap = false, useLinearScalar = false, useLinearNormalized = false) {\n    const key = useUmap ? 'umap' : useLinearScalar ? 'linearScalar' : useLinearNormalized ? 'linearNormalized' : 'linear';\n    if (this.computePrograms[key]) return;\n    const program = createWebGLProgram(\n      this.gl,\n      WEBGL_FORCE_FULLSCREEN_VERTEX,\n      useUmap\n        ? WEBGL_FORCE_COMPUTE_FRAGMENT_UMAP\n        : useLinearScalar\n          ? WEBGL_FORCE_COMPUTE_FRAGMENT_LINEAR_SCALAR\n          : useLinearNormalized\n            ? WEBGL_FORCE_COMPUTE_FRAGMENT_LINEAR_NORMALIZED\n            : WEBGL_FORCE_COMPUTE_FRAGMENT_LINEAR,\n    );\n    const uniformNames = [\n      'u_positions',\n      'u_velocities',\n      'u_activeIds',\n      'u_activeMask',\n      'u_neighborStarts',\n      'u_neighborCounts',\n      'u_neighbors',\n      ...(useUmap ? [] : ['u_componentGravityScale']),\n      'u_nodeTexSize',\n      'u_activeIdsTexSize',\n      'u_neighborTexSize',\n      ...(useLinearScalar ? ['u_scalarTexSize'] : []),\n      'u_nodeCapacity',\n      'u_activeCount',\n      'u_sampleCount',\n      'u_maxNeighbors',\n      'u_use3D',\n      'u_exactRepulsionThreshold',\n      'u_sampleChurnCount',\n      'u_forceNormalizationMode',\n      'u_hasEdgeWeights',\n      ...(useUmap ? [] : ['u_componentGravityEnabled']),\n      'u_seed',\n      'u_sampleFrame',\n      'u_center',\n      'u_outputScale',\n      'u_linkDistance',\n      'u_minDistance',\n      'u_kRepulsion',\n      'u_kAttraction',\n      'u_kGravity',\n      'u_eta',\n      'u_damping',\n      'u_maxStep',\n      ...(useUmap ? ['u_nodeMass', 'u_neighborWeights', 'u_umapA', 'u_umapB', 'u_umapGamma', 'u_umapNegativeSampleRate', 'u_umapEpochs'] : []),\n      ...(useLinearScalar ? ['u_neighborEdges', 'u_scalarValues'] : []),\n    ];\n    this.computePrograms[key] = program;\n    this.computeUniforms[key] = this._cacheUniforms(program, uniformNames);\n  }\n\n  _ensureFloatTexture(field, width, height) {\n    const gl = this.gl;\n    let texture = this[field] ?? null;\n    const sizeKey = `${field}`;\n    const previousSize = this._textureSizes.get(sizeKey) ?? null;\n    const needsAllocation = !texture || !previousSize || previousSize.width !== width || previousSize.height !== height;\n    if (!texture) {\n      texture = gl.createTexture();\n      this[field] = texture;\n    }\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    if (needsAllocation) {\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, width, height, 0, gl.RGBA, gl.FLOAT, null);\n      this._textureSizes.set(sizeKey, { width, height });\n    }\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    return texture;\n  }\n\n  _ensureFloatTextureAt(textures, index, width, height) {\n    let texture = textures[index] ?? null;\n    const gl = this.gl;\n    const sizeKey = `float:${index}`;\n    const previousSize = this._textureSizes.get(sizeKey) ?? null;\n    const needsAllocation = !texture || !previousSize || previousSize.width !== width || previousSize.height !== height;\n    if (!texture) {\n      texture = gl.createTexture();\n      textures[index] = texture;\n    }\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    if (needsAllocation) {\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, width, height, 0, gl.RGBA, gl.FLOAT, null);\n      this._textureSizes.set(sizeKey, { width, height });\n    }\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    return texture;\n  }\n\n  _ensureUintTexture(field, width, height) {\n    const gl = this.gl;\n    let texture = this[field] ?? null;\n    const sizeKey = `${field}`;\n    const previousSize = this._textureSizes.get(sizeKey) ?? null;\n    const needsAllocation = !texture || !previousSize || previousSize.width !== width || previousSize.height !== height;\n    if (!texture) {\n      texture = gl.createTexture();\n      this[field] = texture;\n    }\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    if (needsAllocation) {\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32UI, width, height, 0, gl.RED_INTEGER, gl.UNSIGNED_INT, null);\n      this._textureSizes.set(sizeKey, { width, height });\n    }\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    return texture;\n  }\n\n  _ensureReductionTarget(index, width, height, targets = this._reductionTargets) {\n    const gl = this.gl;\n    const target = targets[index];\n    if (!target.texture) {\n      target.texture = gl.createTexture();\n    }\n    if (!target.framebuffer) {\n      target.framebuffer = gl.createFramebuffer();\n    }\n    if (target.width !== width || target.height !== height) {\n      gl.bindTexture(gl.TEXTURE_2D, target.texture);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, width, height, 0, gl.RGBA, gl.FLOAT, null);\n      gl.bindTexture(gl.TEXTURE_2D, null);\n      target.width = width;\n      target.height = height;\n    }\n    gl.bindFramebuffer(gl.FRAMEBUFFER, target.framebuffer);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, target.texture, 0);\n    gl.drawBuffers([gl.COLOR_ATTACHMENT0]);\n    const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    if (status !== gl.FRAMEBUFFER_COMPLETE) {\n      throw new Error('WebGL2 GPU-force reduction framebuffer is incomplete.');\n    }\n    return target;\n  }\n\n  _ensurePackedFloatScratch(field, texelCount) {\n    const required = Math.max(1, texelCount) * 4;\n    if (!(this[field] instanceof Float32Array) || this[field].length < required) {\n      this[field] = new Float32Array(required);\n    }\n    return this[field];\n  }\n\n  _ensurePackedUintScratch(field, texelCount) {\n    const required = Math.max(1, texelCount);\n    if (!(this[field] instanceof Uint32Array) || this[field].length < required) {\n      this[field] = new Uint32Array(required);\n    }\n    return this[field];\n  }\n\n  _packVec3Source(source, count, field) {\n    const texelCount = this.nodeLayout.width * this.nodeLayout.height;\n    const target = this._ensurePackedFloatScratch(field, texelCount);\n    target.fill(0, 0, texelCount * 4);\n    const limit = Math.max(0, Math.min(count, Math.floor((source?.length ?? 0) / 3)));\n    for (let i = 0; i < limit; i += 1) {\n      const src = i * 3;\n      const dst = i * 4;\n      target[dst] = source[src] ?? 0;\n      target[dst + 1] = source[src + 1] ?? 0;\n      target[dst + 2] = source[src + 2] ?? 0;\n      target[dst + 3] = 1;\n    }\n    return target;\n  }\n\n  _packScalarSource(source, count, texelCount, field) {\n    const target = this._ensurePackedFloatScratch(field, texelCount);\n    target.fill(0, 0, texelCount * 4);\n    const limit = Math.max(0, Math.min(count, Math.floor(source?.length ?? 0)));\n    for (let i = 0; i < limit; i += 1) {\n      const dst = i * 4;\n      target[dst] = Number(source[i] ?? 0);\n      target[dst + 3] = 1;\n    }\n    return target;\n  }\n\n  _uploadPackedFloatTexture(texture, packed, width, height) {\n    const gl = this.gl;\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    // Topology sync happens infrequently, so redefining the texture here is an\n    // acceptable tradeoff for broader WebGL driver compatibility.\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, width, height, 0, gl.RGBA, gl.FLOAT, packed);\n    gl.bindTexture(gl.TEXTURE_2D, null);\n  }\n\n  _uploadUintTexture(texture, layout, view) {\n    const gl = this.gl;\n    const safeLength = Math.max(1, layout.width * layout.height);\n    const data = this._ensurePackedUintScratch('_uintUploadScratch', safeLength);\n    data.fill(0, 0, safeLength);\n    if (view instanceof Uint32Array && view.length > 0) {\n      data.set(view.subarray(0, Math.min(view.length, safeLength)), 0);\n    }\n    const pixels = data.length === safeLength ? data : data.subarray(0, safeLength);\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32UI, layout.width, layout.height, 0, gl.RED_INTEGER, gl.UNSIGNED_INT, pixels);\n    gl.bindTexture(gl.TEXTURE_2D, null);\n  }\n\n  _bindTexture(unit, texture) {\n    const gl = this.gl;\n    gl.activeTexture(gl.TEXTURE0 + unit);\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n  }\n\n  _releaseUmapTextures() {\n    const gl = this.gl;\n    if (!gl) return;\n    if (this.nodeMassTexture) gl.deleteTexture(this.nodeMassTexture);\n    if (this.neighborWeightsTexture) gl.deleteTexture(this.neighborWeightsTexture);\n    this.nodeMassTexture = null;\n    this.neighborWeightsTexture = null;\n    this._textureSizes.delete('nodeMassTexture');\n    this._textureSizes.delete('neighborWeightsTexture');\n    this._nodeMassUploadScratch = new Float32Array(0);\n    this._neighborWeightUploadScratch = new Float32Array(0);\n  }\n\n  _releaseComponentGravityTexture() {\n    const gl = this.gl;\n    if (!gl) return;\n    if (this.componentGravityScaleTexture) gl.deleteTexture(this.componentGravityScaleTexture);\n    this.componentGravityScaleTexture = null;\n    this._textureSizes.delete('componentGravityScaleTexture');\n    this._componentGravityScaleUploadScratch = new Float32Array(0);\n  }\n\n  _releaseLinearScalarTextures() {\n    const gl = this.gl;\n    if (!gl) return;\n    if (this.neighborEdgesTexture) gl.deleteTexture(this.neighborEdgesTexture);\n    if (this.scalarValuesTexture) gl.deleteTexture(this.scalarValuesTexture);\n    this.neighborEdgesTexture = null;\n    this.scalarValuesTexture = null;\n    this._textureSizes.delete('neighborEdgesTexture');\n    this._textureSizes.delete('scalarValuesTexture');\n    this._scalarValuesUploadScratch = new Float32Array(0);\n    this._scalarValuesLinearScratch = new Float32Array(0);\n  }\n\n  _prepareMainFramebuffer(positionTexture, velocityTexture, outputTexture) {\n    const gl = this.gl;\n    gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, positionTexture, 0);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT1, gl.TEXTURE_2D, velocityTexture, 0);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT2, gl.TEXTURE_2D, outputTexture, 0);\n    gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1, gl.COLOR_ATTACHMENT2]);\n    const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n    if (status !== gl.FRAMEBUFFER_COMPLETE) {\n      gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n      throw new Error('WebGL2 GPU-force framebuffer is incomplete.');\n    }\n  }\n\n  _saveState() {\n    const gl = this.gl;\n    return {\n      framebuffer: gl.getParameter(gl.FRAMEBUFFER_BINDING),\n      vao: gl.getParameter(gl.VERTEX_ARRAY_BINDING),\n      program: gl.getParameter(gl.CURRENT_PROGRAM),\n      viewport: gl.getParameter(gl.VIEWPORT),\n      activeTexture: gl.getParameter(gl.ACTIVE_TEXTURE),\n      blendEnabled: gl.isEnabled(gl.BLEND),\n      depthEnabled: gl.isEnabled(gl.DEPTH_TEST),\n    };\n  }\n\n  _restoreState(state) {\n    const gl = this.gl;\n    if (!state) return;\n    if (state.blendEnabled) gl.enable(gl.BLEND);\n    else gl.disable(gl.BLEND);\n    if (state.depthEnabled) gl.enable(gl.DEPTH_TEST);\n    else gl.disable(gl.DEPTH_TEST);\n    gl.useProgram(state.program);\n    gl.bindVertexArray(state.vao);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, state.framebuffer);\n    gl.viewport(state.viewport[0], state.viewport[1], state.viewport[2], state.viewport[3]);\n    gl.activeTexture(state.activeTexture);\n  }\n\n  syncTopology(payload, options = {}) {\n    if (!payload || !this.gl) return false;\n    const preserveDynamicState = options?.preserveDynamicState === true;\n    const previousNodeCapacity = this.nodeCapacity;\n    const useUmap = payload.umapModel === true;\n    const useLinearScalar = !useUmap && payload.linearScalarInputs === true;\n    const useLinearNormalized = !useUmap && !useLinearScalar && payload.linearNormalizedInputs === true;\n    this.umapEnabled = useUmap;\n    this._ensureComputeProgram(useUmap, useLinearScalar, useLinearNormalized);\n    this.nodeCapacity = Math.max(0, payload.nodeCapacity | 0);\n    this.activeCount = Math.max(0, payload.activeCount | 0);\n    this.nodeLayout = resolveWebGLTextureLayout(this.gl, Math.max(1, this.nodeCapacity));\n    this.activeLayout = resolveWebGLTextureLayout(this.gl, Math.max(1, this.activeCount));\n    this.neighborLayout = resolveWebGLTextureLayout(this.gl, Math.max(1, payload.neighborLength | 0));\n    const scalarValueCount = useLinearScalar\n      ? (this.nodeCapacity + Math.max(0, payload.edgeCapacity | 0))\n      : 0;\n    this.scalarLayout = resolveWebGLTextureLayout(this.gl, Math.max(1, scalarValueCount));\n\n    this._ensureFloatTextureAt(this.positionTextures, 0, this.nodeLayout.width, this.nodeLayout.height);\n    this._ensureFloatTextureAt(this.positionTextures, 1, this.nodeLayout.width, this.nodeLayout.height);\n    this._ensureFloatTextureAt(this.velocityTextures, 0, this.nodeLayout.width, this.nodeLayout.height);\n    this._ensureFloatTextureAt(this.velocityTextures, 1, this.nodeLayout.width, this.nodeLayout.height);\n    this._ensureFloatTexture('outputPositionTexture', this.nodeLayout.width, this.nodeLayout.height);\n    this._ensureUintTexture('activeIdsTexture', this.activeLayout.width, this.activeLayout.height);\n    this._ensureUintTexture('activeMaskTexture', this.nodeLayout.width, this.nodeLayout.height);\n    this._ensureUintTexture('neighborStartsTexture', this.nodeLayout.width, this.nodeLayout.height);\n    this._ensureUintTexture('neighborCountsTexture', this.nodeLayout.width, this.nodeLayout.height);\n    this._ensureUintTexture('neighborsTexture', this.neighborLayout.width, this.neighborLayout.height);\n    if (useUmap) {\n      this._releaseComponentGravityTexture();\n    } else {\n      this._ensureFloatTexture('componentGravityScaleTexture', this.nodeLayout.width, this.nodeLayout.height);\n    }\n\n    this._uploadUintTexture(this.activeIdsTexture, this.activeLayout, payload.activeIds);\n    this._uploadUintTexture(this.activeMaskTexture, this.nodeLayout, payload.activeMask);\n    this._uploadUintTexture(this.neighborStartsTexture, this.nodeLayout, payload.neighborStarts);\n    this._uploadUintTexture(this.neighborCountsTexture, this.nodeLayout, payload.neighborCounts);\n    this._uploadUintTexture(this.neighborsTexture, this.neighborLayout, payload.neighbors);\n    if (!useUmap && payload.componentGravityEnabled === true) {\n      const componentGravityScalePacked = this._packScalarSource(\n        payload.componentGravityScale,\n        this.nodeCapacity,\n        this.nodeLayout.width * this.nodeLayout.height,\n        '_componentGravityScaleUploadScratch',\n      );\n      this._uploadPackedFloatTexture(\n        this.componentGravityScaleTexture,\n        componentGravityScalePacked,\n        this.nodeLayout.width,\n        this.nodeLayout.height,\n      );\n    }\n    if (useLinearScalar) {\n      this._ensureUintTexture('neighborEdgesTexture', this.neighborLayout.width, this.neighborLayout.height);\n      this._ensureFloatTexture('scalarValuesTexture', this.scalarLayout.width, this.scalarLayout.height);\n      this._uploadUintTexture(this.neighborEdgesTexture, this.neighborLayout, payload.neighborEdges);\n      const scalarValues = ensureFloat32Capacity(this._scalarValuesLinearScratch, scalarValueCount);\n      this._scalarValuesLinearScratch = scalarValues;\n      scalarValues.fill(0, 0, scalarValueCount);\n      if (this.nodeCapacity > 0 && ArrayBuffer.isView(payload.nodeStrength)) {\n        const nodeLimit = Math.min(this.nodeCapacity, payload.nodeStrength.length);\n        for (let i = 0; i < nodeLimit; i += 1) {\n          const value = Number(payload.nodeStrength[i]);\n          scalarValues[i] = Number.isFinite(value) ? value : 0;\n        }\n      }\n      if (payload.linearHasEdgeWeights && ArrayBuffer.isView(payload.edgeWeightValues)) {\n        const edgeLimit = Math.min(Math.max(0, payload.edgeCapacity | 0), payload.edgeWeightValues.length);\n        for (let i = 0; i < edgeLimit; i += 1) {\n          const value = Number(payload.edgeWeightValues[i]);\n          scalarValues[this.nodeCapacity + i] = Number.isFinite(value) ? value : 0;\n        }\n      }\n      const scalarValuesPacked = this._packScalarSource(\n        scalarValues,\n        scalarValueCount,\n        this.scalarLayout.width * this.scalarLayout.height,\n        '_scalarValuesUploadScratch',\n      );\n      this._uploadPackedFloatTexture(\n        this.scalarValuesTexture,\n        scalarValuesPacked,\n        this.scalarLayout.width,\n        this.scalarLayout.height,\n      );\n    } else {\n      this._releaseLinearScalarTextures();\n    }\n    if (useUmap) {\n      this._ensureFloatTexture('nodeMassTexture', this.nodeLayout.width, this.nodeLayout.height);\n      this._ensureFloatTexture('neighborWeightsTexture', this.neighborLayout.width, this.neighborLayout.height);\n      const nodeMassPacked = this._packScalarSource(\n        payload.nodeMass,\n        this.nodeCapacity,\n        this.nodeLayout.width * this.nodeLayout.height,\n        '_nodeMassUploadScratch',\n      );\n      const neighborWeightPacked = this._packScalarSource(\n        payload.neighborWeights,\n        payload.neighborLength | 0,\n        this.neighborLayout.width * this.neighborLayout.height,\n        '_neighborWeightUploadScratch',\n      );\n      this._uploadPackedFloatTexture(this.nodeMassTexture, nodeMassPacked, this.nodeLayout.width, this.nodeLayout.height);\n      this._uploadPackedFloatTexture(\n        this.neighborWeightsTexture,\n        neighborWeightPacked,\n        this.neighborLayout.width,\n        this.neighborLayout.height,\n      );\n    } else {\n      this._releaseUmapTextures();\n    }\n\n    const canPreserveDynamicState = preserveDynamicState\n      && previousNodeCapacity === this.nodeCapacity\n      && this.nodeCapacity > 0;\n    if (!canPreserveDynamicState) {\n      const positionPacked = this._packVec3Source(payload.packedPositions, this.nodeCapacity, '_positionUploadScratch');\n      const outputPacked = this._packVec3Source(\n        payload.packedOutputPositions ?? payload.packedPositions,\n        this.nodeCapacity,\n        '_outputUploadScratch',\n      );\n      const velocityPacked = this._ensurePackedFloatScratch('_velocityUploadScratch', this.nodeLayout.width * this.nodeLayout.height);\n      velocityPacked.fill(0, 0, this.nodeLayout.width * this.nodeLayout.height * 4);\n      this._uploadPackedFloatTexture(this.positionTextures[0], positionPacked, this.nodeLayout.width, this.nodeLayout.height);\n      this._uploadPackedFloatTexture(this.positionTextures[1], positionPacked, this.nodeLayout.width, this.nodeLayout.height);\n      this._uploadPackedFloatTexture(this.velocityTextures[0], velocityPacked, this.nodeLayout.width, this.nodeLayout.height);\n      this._uploadPackedFloatTexture(this.velocityTextures[1], velocityPacked, this.nodeLayout.width, this.nodeLayout.height);\n      this._uploadPackedFloatTexture(this.outputPositionTexture, outputPacked, this.nodeLayout.width, this.nodeLayout.height);\n      this.readIndex = 0;\n      this.sampleFrame = 0;\n      this.textureVersion += 1;\n    }\n    return true;\n  }\n\n  _runReduction(positionTexture, is3D, center) {\n    const gl = this.gl;\n    let sourceTexture = positionTexture;\n    let sourceWidth = this.nodeLayout.width;\n    let sourceHeight = this.nodeLayout.height;\n    let sourceIsInitial = true;\n    let targetIndex = 0;\n\n    while (sourceWidth > 1 || sourceHeight > 1) {\n      const targetWidth = Math.max(1, Math.ceil(sourceWidth / 2));\n      const targetHeight = Math.max(1, Math.ceil(sourceHeight / 2));\n      const target = this._ensureReductionTarget(targetIndex, targetWidth, targetHeight, this._reductionTargets);\n      gl.bindFramebuffer(gl.FRAMEBUFFER, target.framebuffer);\n      gl.viewport(0, 0, targetWidth, targetHeight);\n      gl.useProgram(sourceIsInitial ? this.reductionInitProgram : this.reductionCombineProgram);\n      gl.bindVertexArray(this.fullscreenVao);\n      gl.drawBuffers([gl.COLOR_ATTACHMENT0]);\n\n      if (sourceIsInitial) {\n        this._bindTexture(0, sourceTexture);\n        this._bindTexture(1, this.activeMaskTexture);\n        gl.uniform1i(this.reductionInitUniforms.u_positions, 0);\n        gl.uniform1i(this.reductionInitUniforms.u_activeMask, 1);\n        gl.uniform2i(this.reductionInitUniforms.u_nodeTexSize, this.nodeLayout.width, this.nodeLayout.height);\n        gl.uniform2i(this.reductionInitUniforms.u_outputSize, targetWidth, targetHeight);\n        gl.uniform1i(this.reductionInitUniforms.u_nodeCapacity, this.nodeCapacity);\n        gl.uniform1i(this.reductionInitUniforms.u_use3D, is3D ? 1 : 0);\n        gl.uniform3f(this.reductionInitUniforms.u_center, center[0], center[1], center[2]);\n      } else {\n        this._bindTexture(0, sourceTexture);\n        gl.uniform1i(this.reductionCombineUniforms.u_source, 0);\n        gl.uniform2i(this.reductionCombineUniforms.u_sourceSize, sourceWidth, sourceHeight);\n      }\n\n      gl.drawArrays(gl.TRIANGLES, 0, 3);\n      sourceTexture = target.texture;\n      sourceWidth = targetWidth;\n      sourceHeight = targetHeight;\n      sourceIsInitial = false;\n      targetIndex = (targetIndex + 1) % 2;\n    }\n\n    return sourceTexture;\n  }\n\n  _runAngularReduction(positionTexture, velocityTexture, centroidTexture, is3D, center) {\n    const gl = this.gl;\n    let sourceTexture = null;\n    let sourceWidth = this.nodeLayout.width;\n    let sourceHeight = this.nodeLayout.height;\n    let sourceIsInitial = true;\n    let targetIndex = 0;\n\n    while (sourceWidth > 1 || sourceHeight > 1) {\n      const targetWidth = Math.max(1, Math.ceil(sourceWidth / 2));\n      const targetHeight = Math.max(1, Math.ceil(sourceHeight / 2));\n      const target = this._ensureReductionTarget(targetIndex, targetWidth, targetHeight, this._angularReductionTargets);\n      gl.bindFramebuffer(gl.FRAMEBUFFER, target.framebuffer);\n      gl.viewport(0, 0, targetWidth, targetHeight);\n      gl.useProgram(sourceIsInitial ? this.angularReductionInitProgram : this.reductionCombineProgram);\n      gl.bindVertexArray(this.fullscreenVao);\n      gl.drawBuffers([gl.COLOR_ATTACHMENT0]);\n\n      if (sourceIsInitial) {\n        this._bindTexture(0, positionTexture);\n        this._bindTexture(1, velocityTexture);\n        this._bindTexture(2, centroidTexture);\n        this._bindTexture(3, this.activeMaskTexture);\n        gl.uniform1i(this.angularReductionInitUniforms.u_positions, 0);\n        gl.uniform1i(this.angularReductionInitUniforms.u_velocities, 1);\n        gl.uniform1i(this.angularReductionInitUniforms.u_centroid, 2);\n        gl.uniform1i(this.angularReductionInitUniforms.u_activeMask, 3);\n        gl.uniform2i(this.angularReductionInitUniforms.u_nodeTexSize, this.nodeLayout.width, this.nodeLayout.height);\n        gl.uniform2i(this.angularReductionInitUniforms.u_outputSize, targetWidth, targetHeight);\n        gl.uniform1i(this.angularReductionInitUniforms.u_nodeCapacity, this.nodeCapacity);\n        gl.uniform1i(this.angularReductionInitUniforms.u_use3D, is3D ? 1 : 0);\n        gl.uniform3f(this.angularReductionInitUniforms.u_center, center[0], center[1], center[2]);\n      } else {\n        this._bindTexture(0, sourceTexture);\n        gl.uniform1i(this.reductionCombineUniforms.u_source, 0);\n        gl.uniform2i(this.reductionCombineUniforms.u_sourceSize, sourceWidth, sourceHeight);\n      }\n\n      gl.drawArrays(gl.TRIANGLES, 0, 3);\n      sourceTexture = target.texture;\n      sourceWidth = targetWidth;\n      sourceHeight = targetHeight;\n      sourceIsInitial = false;\n      targetIndex = (targetIndex + 1) % 2;\n    }\n\n    return sourceTexture;\n  }\n\n  step(stepOptions = {}) {\n    if (!this.gl || this.nodeCapacity <= 0 || this.activeCount <= 0) return false;\n\n    const gl = this.gl;\n    const state = this._saveState();\n    try {\n      gl.disable(gl.BLEND);\n      gl.disable(gl.DEPTH_TEST);\n      gl.bindVertexArray(this.fullscreenVao);\n\n      const readIndex = this.readIndex;\n      const writeIndex = 1 - readIndex;\n      const positionsIn = this.positionTextures[readIndex];\n      const velocitiesIn = this.velocityTextures[readIndex];\n      const positionsOut = this.positionTextures[writeIndex];\n      const velocitiesOut = this.velocityTextures[writeIndex];\n      const center = normalizeCenter(stepOptions.center);\n      const is3D = stepOptions.mode === '3d';\n      const sampleCount = Math.max(1, Math.floor(toFinite(stepOptions.sampleCount, DEFAULT_OPTIONS.sampleCount2D)));\n      const sampleChurnCount = resolveSampleChurnCount(sampleCount, stepOptions.sampleChurn);\n      const exactRepulsionThreshold = Math.max(1, Math.floor(toFinite(\n        stepOptions.exactRepulsionThreshold,\n        is3D ? DEFAULT_OPTIONS.exactRepulsionThreshold3D : DEFAULT_OPTIONS.exactRepulsionThreshold2D,\n      )));\n      const maxNeighborsPerNode = Math.max(1, Math.floor(toFinite(\n        stepOptions.maxNeighborsPerNode,\n        DEFAULT_OPTIONS.maxNeighborsPerNode,\n      )));\n      const useUmap = isUmapForceModel(stepOptions.forceModel);\n      const useLinearScalar = !useUmap && stepOptions.linearScalarInputs === true;\n      const useLinearNormalized = !useUmap && !useLinearScalar && stepOptions.linearNormalizedInputs === true;\n      this._ensureComputeProgram(useUmap, useLinearScalar, useLinearNormalized);\n      const computeKey = useUmap ? 'umap' : useLinearScalar ? 'linearScalar' : useLinearNormalized ? 'linearNormalized' : 'linear';\n      const computeProgram = this.computePrograms[computeKey];\n      const computeUniforms = this.computeUniforms[computeKey];\n      const outputScale = Math.max(0.0001, toFinite(stepOptions.outputScale, DEFAULT_OPTIONS.outputScale));\n      const rotationDamping = clamp(stepOptions.rotationDamping, 0, 1, DEFAULT_OPTIONS.rotationDamping);\n      const useRotationDamping = rotationDamping > 1e-6;\n\n      this._prepareMainFramebuffer(positionsOut, velocitiesOut, this.outputPositionTexture);\n      gl.viewport(0, 0, this.nodeLayout.width, this.nodeLayout.height);\n      gl.useProgram(computeProgram);\n      this._bindTexture(0, positionsIn);\n      this._bindTexture(1, velocitiesIn);\n      this._bindTexture(2, this.activeIdsTexture);\n      this._bindTexture(3, this.activeMaskTexture);\n      this._bindTexture(4, this.neighborStartsTexture);\n      this._bindTexture(5, this.neighborCountsTexture);\n      this._bindTexture(6, this.neighborsTexture);\n      gl.uniform1i(computeUniforms.u_positions, 0);\n      gl.uniform1i(computeUniforms.u_velocities, 1);\n      gl.uniform1i(computeUniforms.u_activeIds, 2);\n      gl.uniform1i(computeUniforms.u_activeMask, 3);\n      gl.uniform1i(computeUniforms.u_neighborStarts, 4);\n      gl.uniform1i(computeUniforms.u_neighborCounts, 5);\n      gl.uniform1i(computeUniforms.u_neighbors, 6);\n      if (useUmap) {\n        this._bindTexture(7, this.nodeMassTexture);\n        this._bindTexture(8, this.neighborWeightsTexture);\n        gl.uniform1i(computeUniforms.u_nodeMass, 7);\n        gl.uniform1i(computeUniforms.u_neighborWeights, 8);\n      } else if (useLinearScalar) {\n        this._bindTexture(7, this.componentGravityScaleTexture);\n        this._bindTexture(8, this.neighborEdgesTexture);\n        this._bindTexture(9, this.scalarValuesTexture);\n        gl.uniform1i(computeUniforms.u_componentGravityScale, 7);\n        gl.uniform1i(computeUniforms.u_neighborEdges, 8);\n        gl.uniform1i(computeUniforms.u_scalarValues, 9);\n      } else {\n        this._bindTexture(7, this.componentGravityScaleTexture);\n        gl.uniform1i(computeUniforms.u_componentGravityScale, 7);\n      }\n      gl.uniform2i(computeUniforms.u_nodeTexSize, this.nodeLayout.width, this.nodeLayout.height);\n      gl.uniform2i(computeUniforms.u_activeIdsTexSize, this.activeLayout.width, this.activeLayout.height);\n      gl.uniform2i(computeUniforms.u_neighborTexSize, this.neighborLayout.width, this.neighborLayout.height);\n      if (useLinearScalar) {\n        gl.uniform2i(computeUniforms.u_scalarTexSize, this.scalarLayout.width, this.scalarLayout.height);\n      }\n      gl.uniform1i(computeUniforms.u_nodeCapacity, this.nodeCapacity);\n      gl.uniform1i(computeUniforms.u_activeCount, this.activeCount);\n      gl.uniform1i(computeUniforms.u_sampleCount, sampleCount);\n      gl.uniform1i(computeUniforms.u_maxNeighbors, maxNeighborsPerNode);\n      gl.uniform1i(computeUniforms.u_use3D, is3D ? 1 : 0);\n      gl.uniform1i(computeUniforms.u_exactRepulsionThreshold, exactRepulsionThreshold);\n      gl.uniform1i(computeUniforms.u_sampleChurnCount, sampleChurnCount);\n      if (!useUmap) {\n        gl.uniform1i(computeUniforms.u_forceNormalizationMode, forceNormalizationMode(stepOptions.forceNormalizationType));\n        gl.uniform1i(computeUniforms.u_hasEdgeWeights, stepOptions.hasEdgeWeights ? 1 : 0);\n      }\n      if (!useUmap) {\n        gl.uniform1i(computeUniforms.u_componentGravityEnabled, stepOptions.componentGravityEnabled ? 1 : 0);\n      }\n      gl.uniform1ui(computeUniforms.u_seed, this.seed >>> 0);\n      gl.uniform1ui(computeUniforms.u_sampleFrame, this.sampleFrame >>> 0);\n      gl.uniform3f(computeUniforms.u_center, center[0], center[1], center[2]);\n      gl.uniform1f(computeUniforms.u_outputScale, outputScale);\n      gl.uniform1f(computeUniforms.u_linkDistance, Math.max(0.0001, toFinite(stepOptions.linkDistance, DEFAULT_OPTIONS.linkDistance)));\n      gl.uniform1f(computeUniforms.u_minDistance, Math.max(0.0001, toFinite(stepOptions.minDistance, DEFAULT_OPTIONS.minDistance)));\n      gl.uniform1f(computeUniforms.u_kRepulsion, toFinite(stepOptions.kRepulsion, DEFAULT_OPTIONS.kRepulsion));\n      gl.uniform1f(computeUniforms.u_kAttraction, toFinite(stepOptions.kAttraction, DEFAULT_OPTIONS.kAttraction));\n      gl.uniform1f(computeUniforms.u_kGravity, toFinite(stepOptions.kGravity, DEFAULT_OPTIONS.kGravity));\n      gl.uniform1f(computeUniforms.u_eta, toFinite(stepOptions.eta, DEFAULT_OPTIONS.eta));\n      gl.uniform1f(computeUniforms.u_damping, clamp(stepOptions.damping, 0, 1, DEFAULT_OPTIONS.damping));\n      gl.uniform1f(computeUniforms.u_maxStep, Math.max(0.001, toFinite(stepOptions.maxStep, DEFAULT_OPTIONS.maxStep)));\n      if (useUmap) {\n        gl.uniform1f(computeUniforms.u_umapA, Math.max(0.000001, toFinite(stepOptions.umapA, DEFAULT_OPTIONS.umapA)));\n        gl.uniform1f(computeUniforms.u_umapB, Math.max(0.000001, toFinite(stepOptions.umapB, DEFAULT_OPTIONS.umapB)));\n        gl.uniform1f(computeUniforms.u_umapGamma, Math.max(0, toFinite(stepOptions.umapGamma, DEFAULT_OPTIONS.umapGamma)));\n        gl.uniform1f(\n          computeUniforms.u_umapNegativeSampleRate,\n          Math.max(0, toFinite(stepOptions.umapNegativeSampleRate, DEFAULT_OPTIONS.umapNegativeSampleRate)),\n        );\n        gl.uniform1f(computeUniforms.u_umapEpochs, Math.max(1, toFinite(stepOptions.umapEpochs, DEFAULT_UMAP_EPOCHS_SMALL)));\n      }\n      gl.drawArrays(gl.TRIANGLES, 0, 3);\n\n      if (stepOptions.recenter === true) {\n        const centroidTexture = this._runReduction(positionsOut, is3D, center);\n        const angularTexture = useRotationDamping\n          ? this._runAngularReduction(positionsOut, velocitiesOut, centroidTexture, is3D, center)\n          : null;\n        const recenterProgram = useRotationDamping ? this.recenterPrograms.rotation : this.recenterPrograms.base;\n        const recenterUniforms = useRotationDamping ? this.recenterUniforms.rotation : this.recenterUniforms.base;\n        this._prepareMainFramebuffer(this.positionTextures[readIndex], this.velocityTextures[readIndex], this.outputPositionTexture);\n        gl.viewport(0, 0, this.nodeLayout.width, this.nodeLayout.height);\n        gl.useProgram(recenterProgram);\n        this._bindTexture(0, positionsOut);\n        this._bindTexture(1, velocitiesOut);\n        this._bindTexture(2, centroidTexture);\n        if (useRotationDamping) {\n          this._bindTexture(3, angularTexture);\n          this._bindTexture(4, this.activeMaskTexture);\n        } else {\n          this._bindTexture(3, this.activeMaskTexture);\n        }\n        gl.uniform1i(recenterUniforms.u_positions, 0);\n        gl.uniform1i(recenterUniforms.u_velocities, 1);\n        gl.uniform1i(recenterUniforms.u_centroid, 2);\n        if (useRotationDamping) {\n          gl.uniform1i(recenterUniforms.u_angular, 3);\n          gl.uniform1i(recenterUniforms.u_activeMask, 4);\n        } else {\n          gl.uniform1i(recenterUniforms.u_activeMask, 3);\n        }\n        gl.uniform2i(recenterUniforms.u_nodeTexSize, this.nodeLayout.width, this.nodeLayout.height);\n        gl.uniform1i(recenterUniforms.u_nodeCapacity, this.nodeCapacity);\n        gl.uniform1i(recenterUniforms.u_use3D, is3D ? 1 : 0);\n        gl.uniform3f(recenterUniforms.u_center, center[0], center[1], center[2]);\n        gl.uniform1f(recenterUniforms.u_outputScale, outputScale);\n        if (useRotationDamping) {\n          gl.uniform1f(recenterUniforms.u_rotationDamping, rotationDamping);\n        }\n        gl.drawArrays(gl.TRIANGLES, 0, 3);\n      } else {\n        this.readIndex = writeIndex;\n      }\n\n      if (stepOptions.recenter === true) {\n        this.readIndex = readIndex;\n      }\n      this.sampleFrame = (this.sampleFrame + 1) >>> 0;\n      this.textureVersion += 1;\n      return true;\n    } finally {\n      this._restoreState(state);\n    }\n  }\n\n  getPositionTexture() {\n    return this.outputPositionTexture ?? null;\n  }\n\n  getPositionTextureMeta() {\n    return {\n      version: this.textureVersion,\n      count: this.nodeCapacity,\n      buffer: this.outputPositionTexture,\n      byteOffset: 0,\n      byteLength: 0,\n    };\n  }\n\n  getExecutionMode() {\n    return 'gpu';\n  }\n\n  readPositionSnapshot() {\n    if (!this.outputPositionTexture || this.nodeCapacity <= 0) return null;\n    const gl = this.gl;\n    const width = this.nodeLayout.width;\n    const height = this.nodeLayout.height;\n    const texelCount = Math.max(1, width * height);\n    const required = texelCount * 4;\n    if (!(this._readbackScratch instanceof Float32Array) || this._readbackScratch.length < required) {\n      this._readbackScratch = new Float32Array(required);\n    }\n    const state = this._saveState();\n    try {\n      gl.bindFramebuffer(gl.FRAMEBUFFER, this.readbackFramebuffer);\n      gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.outputPositionTexture, 0);\n      gl.readBuffer(gl.COLOR_ATTACHMENT0);\n      gl.readPixels(0, 0, width, height, gl.RGBA, gl.FLOAT, this._readbackScratch);\n    } finally {\n      this._restoreState(state);\n    }\n    const output = new Float32Array(Math.max(1, this.nodeCapacity) * 3);\n    for (let i = 0; i < this.nodeCapacity; i += 1) {\n      const src = i * 4;\n      const dst = i * 3;\n      output[dst] = this._readbackScratch[src] ?? 0;\n      output[dst + 1] = this._readbackScratch[src + 1] ?? 0;\n      output[dst + 2] = this._readbackScratch[src + 2] ?? 0;\n    }\n    return output;\n  }\n\n  readNodePositionsById(nodeIds, options = {}) {\n    if (!this.outputPositionTexture || this.nodeCapacity <= 0) return null;\n    const ids = normalizeReadbackNodeIds(nodeIds);\n    const count = ids.length;\n    const output = resolveReadbackOut(options.out, count * 3);\n    output.fill(0, 0, count * 3);\n    if (count <= 0) return output;\n\n    const gl = this.gl;\n    const width = this.nodeLayout.width;\n    const required = count * 4;\n    if (!(this._sparseReadbackScratch instanceof Float32Array) || this._sparseReadbackScratch.length < required) {\n      this._sparseReadbackScratch = new Float32Array(required);\n    }\n    const state = this._saveState();\n    try {\n      gl.bindFramebuffer(gl.FRAMEBUFFER, this.readbackFramebuffer);\n      gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.outputPositionTexture, 0);\n      gl.readBuffer(gl.COLOR_ATTACHMENT0);\n      for (let i = 0; i < count; i += 1) {\n        const id = ids[i];\n        if (id === 0xffffffff || id >= this.nodeCapacity) continue;\n        const x = id % width;\n        const y = Math.floor(id / width);\n        const target = this._sparseReadbackScratch.subarray(i * 4, (i * 4) + 4);\n        gl.readPixels(x, y, 1, 1, gl.RGBA, gl.FLOAT, target);\n      }\n    } finally {\n      this._restoreState(state);\n    }\n    for (let i = 0; i < count; i += 1) {\n      const id = ids[i];\n      if (id === 0xffffffff || id >= this.nodeCapacity) continue;\n      const src = i * 4;\n      const dst = i * 3;\n      output[dst] = this._sparseReadbackScratch[src] ?? 0;\n      output[dst + 1] = this._sparseReadbackScratch[src + 1] ?? 0;\n      output[dst + 2] = this._sparseReadbackScratch[src + 2] ?? 0;\n    }\n    return output;\n  }\n\n  readNodeCentroidById(nodeIds, options = {}) {\n    const ids = normalizeReadbackNodeIds(nodeIds);\n    const readableIds = filterReadableNodeIds(ids, this.nodeCapacity);\n    const count = readableIds.length;\n    if (count <= 0) {\n      const centroid = resolveReadbackOut(options.out, 3);\n      centroid[0] = 0;\n      centroid[1] = 0;\n      centroid[2] = 0;\n      return { centroid, count: 0 };\n    }\n    if (count > PARTIAL_CENTROID_CPU_THRESHOLD && count > Math.max(1, this.nodeCapacity * 0.25)) {\n      const snapshot = this.readPositionSnapshot();\n      const packed = copyPositionsFromFullSnapshot(snapshot, readableIds, this._centroidPositionScratch);\n      this._centroidPositionScratch = packed;\n      return centroidFromPackedPositions(packed, count, options.out);\n    }\n    const packed = this.readNodePositionsById(readableIds, { out: this._centroidPositionScratch });\n    this._centroidPositionScratch = packed;\n    return centroidFromPackedPositions(packed, count, options.out);\n  }\n\n  writePositionSnapshot(snapshot, options = {}) {\n    if (!(snapshot instanceof Float32Array) || this.nodeCapacity <= 0) return false;\n    const center = normalizeCenter(options.center);\n    const outputScale = Math.max(0.0001, toFinite(options.outputScale, DEFAULT_OPTIONS.outputScale));\n    const normalizeInputByOutputScale = Math.abs(outputScale - 1.0) > 1e-6;\n    const vec3Count = Math.max(1, this.nodeCapacity) * 3;\n    const positions = ensureFloat32Capacity(this._positionWriteScratch, vec3Count);\n    const outputPositions = ensureFloat32Capacity(this._outputPositionWriteScratch, vec3Count);\n    positions.fill(0, 0, vec3Count);\n    outputPositions.fill(0, 0, vec3Count);\n    const limit = Math.max(0, Math.min(this.nodeCapacity, Math.floor(snapshot.length / 3)));\n    for (let i = 0; i < limit; i += 1) {\n      const src = i * 3;\n      const x = Number(snapshot[src] ?? center[0]);\n      const y = Number(snapshot[src + 1] ?? center[1]);\n      const z = Number(snapshot[src + 2] ?? center[2]);\n      const safeX = Number.isFinite(x) ? x : center[0];\n      const safeY = Number.isFinite(y) ? y : center[1];\n      const safeZ = Number.isFinite(z) ? z : center[2];\n      outputPositions[src] = safeX;\n      outputPositions[src + 1] = safeY;\n      outputPositions[src + 2] = safeZ;\n      if (normalizeInputByOutputScale) {\n        positions[src] = center[0] + ((safeX - center[0]) / outputScale);\n        positions[src + 1] = center[1] + ((safeY - center[1]) / outputScale);\n        positions[src + 2] = center[2] + ((safeZ - center[2]) / outputScale);\n      } else {\n        positions[src] = safeX;\n        positions[src + 1] = safeY;\n        positions[src + 2] = safeZ;\n      }\n    }\n\n    const positionPacked = this._packVec3Source(positions, this.nodeCapacity, '_positionUploadScratch');\n    const outputPacked = this._packVec3Source(outputPositions, this.nodeCapacity, '_outputUploadScratch');\n    this._uploadPackedFloatTexture(this.positionTextures[0], positionPacked, this.nodeLayout.width, this.nodeLayout.height);\n    this._uploadPackedFloatTexture(this.positionTextures[1], positionPacked, this.nodeLayout.width, this.nodeLayout.height);\n    this._uploadPackedFloatTexture(this.outputPositionTexture, outputPacked, this.nodeLayout.width, this.nodeLayout.height);\n    this.textureVersion += 1;\n    return true;\n  }\n\n  dispose() {\n    const gl = this.gl;\n    if (!gl) return;\n    for (const texture of this.positionTextures) {\n      if (texture) gl.deleteTexture(texture);\n    }\n    for (const texture of this.velocityTextures) {\n      if (texture) gl.deleteTexture(texture);\n    }\n    if (this.outputPositionTexture) gl.deleteTexture(this.outputPositionTexture);\n    if (this.activeIdsTexture) gl.deleteTexture(this.activeIdsTexture);\n    if (this.activeMaskTexture) gl.deleteTexture(this.activeMaskTexture);\n    if (this.neighborStartsTexture) gl.deleteTexture(this.neighborStartsTexture);\n    if (this.neighborCountsTexture) gl.deleteTexture(this.neighborCountsTexture);\n    if (this.neighborsTexture) gl.deleteTexture(this.neighborsTexture);\n    if (this.componentGravityScaleTexture) gl.deleteTexture(this.componentGravityScaleTexture);\n    if (this.neighborEdgesTexture) gl.deleteTexture(this.neighborEdgesTexture);\n    if (this.nodeMassTexture) gl.deleteTexture(this.nodeMassTexture);\n    if (this.neighborWeightsTexture) gl.deleteTexture(this.neighborWeightsTexture);\n    if (this.scalarValuesTexture) gl.deleteTexture(this.scalarValuesTexture);\n    for (const target of this._reductionTargets) {\n      if (target.texture) gl.deleteTexture(target.texture);\n      if (target.framebuffer) gl.deleteFramebuffer(target.framebuffer);\n    }\n    for (const target of this._angularReductionTargets) {\n      if (target.texture) gl.deleteTexture(target.texture);\n      if (target.framebuffer) gl.deleteFramebuffer(target.framebuffer);\n    }\n    if (this.framebuffer) gl.deleteFramebuffer(this.framebuffer);\n    if (this.readbackFramebuffer) gl.deleteFramebuffer(this.readbackFramebuffer);\n    if (this.fullscreenVao) gl.deleteVertexArray(this.fullscreenVao);\n    if (this.computePrograms.linear) gl.deleteProgram(this.computePrograms.linear);\n    if (this.computePrograms.linearNormalized) gl.deleteProgram(this.computePrograms.linearNormalized);\n    if (this.computePrograms.linearScalar) gl.deleteProgram(this.computePrograms.linearScalar);\n    if (this.computePrograms.umap) gl.deleteProgram(this.computePrograms.umap);\n    if (this.reductionInitProgram) gl.deleteProgram(this.reductionInitProgram);\n    if (this.reductionCombineProgram) gl.deleteProgram(this.reductionCombineProgram);\n    if (this.angularReductionInitProgram) gl.deleteProgram(this.angularReductionInitProgram);\n    if (this.recenterPrograms?.base) gl.deleteProgram(this.recenterPrograms.base);\n    if (this.recenterPrograms?.rotation) gl.deleteProgram(this.recenterPrograms.rotation);\n\n    this.positionTextures = [null, null];\n    this.velocityTextures = [null, null];\n    this.outputPositionTexture = null;\n    this.activeIdsTexture = null;\n    this.activeMaskTexture = null;\n    this.neighborStartsTexture = null;\n    this.neighborCountsTexture = null;\n    this.neighborsTexture = null;\n    this.neighborEdgesTexture = null;\n    this.nodeMassTexture = null;\n    this.neighborWeightsTexture = null;\n    this.scalarValuesTexture = null;\n    this.computePrograms = { linear: null, linearNormalized: null, linearScalar: null, umap: null };\n    this.computeUniforms = { linear: null, linearNormalized: null, linearScalar: null, umap: null };\n    this.framebuffer = null;\n    this.readbackFramebuffer = null;\n    this.fullscreenVao = null;\n    this.angularReductionInitProgram = null;\n    this.recenterPrograms = null;\n    this.recenterUniforms = null;\n    this.textureVersion = 0;\n    this._textureSizes.clear();\n  }\n}\n\nclass WebGLForceComputeBackend {\n  constructor(gl) {\n    this.gl = gl;\n    this._gpu = canUseWebGLTextureCompute(gl) ? new WebGLTextureComputePath(gl) : null;\n    this._warnedUnavailable = false;\n  }\n\n  get seed() {\n    return this._gpu?.seed ?? 0;\n  }\n\n  set seed(value) {\n    if (this._gpu) this._gpu.seed = value >>> 0;\n  }\n\n  get sampleFrame() {\n    return this._gpu?.sampleFrame ?? 0;\n  }\n\n  set sampleFrame(value) {\n    if (this._gpu) this._gpu.sampleFrame = value >>> 0;\n  }\n\n  get nodeCapacity() {\n    return this._gpu?.nodeCapacity ?? 0;\n  }\n\n  get activeCount() {\n    return this._gpu?.activeCount ?? 0;\n  }\n\n  _warnUnavailable() {\n    if (this._warnedUnavailable === true) return;\n    this._warnedUnavailable = true;\n    console.warn('GpuForcePositionDelegate: WebGL gpu-force requires float texture compute support; no CPU fallback is available.');\n  }\n\n  syncTopology(payload, options = {}) {\n    if (!this._gpu) {\n      this._warnUnavailable();\n      return false;\n    }\n    return this._gpu.syncTopology(payload, options);\n  }\n\n  step(stepOptions = {}) {\n    if (!this._gpu) {\n      this._warnUnavailable();\n      return false;\n    }\n    return this._gpu.step(stepOptions);\n  }\n\n  getPositionTexture() {\n    return this._gpu?.getPositionTexture?.() ?? null;\n  }\n\n  getPositionTextureMeta() {\n    return this._gpu?.getPositionTextureMeta?.() ?? null;\n  }\n\n  readPositionSnapshot() {\n    return this._gpu?.readPositionSnapshot?.() ?? null;\n  }\n\n  readNodePositionsById(nodeIds, options = {}) {\n    return this._gpu?.readNodePositionsById?.(nodeIds, options) ?? null;\n  }\n\n  readNodeCentroidById(nodeIds, options = {}) {\n    return this._gpu?.readNodeCentroidById?.(nodeIds, options) ?? null;\n  }\n\n  writePositionSnapshot(snapshot, options = {}) {\n    if (!this._gpu) {\n      this._warnUnavailable();\n      return false;\n    }\n    return this._gpu.writePositionSnapshot?.(snapshot, options) ?? false;\n  }\n\n  getExecutionMode() {\n    return this._gpu?.getExecutionMode?.() ?? 'unavailable';\n  }\n\n  dispose() {\n    this._gpu?.dispose?.();\n    this._gpu = null;\n    this._warnedUnavailable = false;\n  }\n}\n\nclass WebGPUForceComputeBackend {\n  constructor(device) {\n    this.device = device;\n    this.linearPipeline = null;\n    this.linearNormalizedPipeline = null;\n    this.linearBindGroupLayout = null;\n    this.linearBindGroup = null;\n    this.linearScalarPipeline = null;\n    this.linearScalarBindGroupLayout = null;\n    this.linearScalarBindGroup = null;\n    this.umapPipeline = null;\n    this.umapBindGroupLayout = null;\n    this.umapBindGroup = null;\n    this.outputScalePipeline = null;\n    this.outputScaleBindGroupLayout = null;\n    this.outputScaleBindGroup = null;\n    this.outputScaleScratchBindGroup = null;\n    this.recenterBasePipeline = null;\n    this.recenterBaseBindGroupLayout = null;\n    this.recenterBaseBindGroup = null;\n    this.recenterRotationPipeline = null;\n    this.recenterRotationBindGroupLayout = null;\n    this.recenterRotationBindGroup = null;\n    this.centroidPipeline = null;\n    this.centroidBindGroupLayout = null;\n    this.paramsBuffer = null;\n    this.outputScaleParamsBuffer = null;\n    this.recenterParamsBuffer = null;\n    this.centroidParamsBuffer = null;\n    this.centroidIdsBuffer = null;\n    this.centroidPartialBuffer = null;\n    this.centroidReadbackBuffer = null;\n    this.positionReadbackBuffer = null;\n    this.positionBuffer = null;\n    this.outputPositionBuffer = null;\n    this.velocityBuffer = null;\n    this.scratchPositionBuffer = null;\n    this.scratchVelocityBuffer = null;\n    this.activeIdsBuffer = null;\n    this.activeMaskBuffer = null;\n    this.neighborStartsBuffer = null;\n    this.neighborCountsBuffer = null;\n    this.neighborsBuffer = null;\n    this.componentGravityScaleBuffer = null;\n    this.neighborEdgesBuffer = null;\n    this.scalarWeightsBuffer = null;\n    this.nodeCapacity = 0;\n    this.activeCount = 0;\n    this.umapEnabled = false;\n    this.seed = (Math.random() * 0xffffffff) >>> 0;\n    this.sampleFrame = 0;\n    this.layoutChunkOffset = 0;\n    this.zeroVelocities = createEmptyFloatArray();\n    this.scalarWeightsUpload = createEmptyFloatArray();\n    this._readbackChain = Promise.resolve();\n    this.maxComputeWorkgroupsPerDimension = Math.max(\n      1,\n      Math.floor(device?.limits?.maxComputeWorkgroupsPerDimension ?? 65535),\n    );\n\n    const shaderVisibility = getGpuShaderStage('COMPUTE', 0x4);\n    this.shaderVisibility = shaderVisibility;\n    this.storageUsage = (\n      getGpuUsage('STORAGE', STORAGE_FLAG)\n      | getGpuUsage('COPY_DST', COPY_DST_FLAG)\n      | getGpuUsage('COPY_SRC', COPY_SRC_FLAG)\n    );\n    this.uniformUsage = (\n      getGpuUsage('UNIFORM', UNIFORM_FLAG)\n      | getGpuUsage('COPY_DST', COPY_DST_FLAG)\n    );\n\n    this._ensurePipeline(false);\n    this._ensureOutputScalePipeline();\n    this._ensureRecenterPipeline(false);\n    this._ensureRecenterPipeline(true);\n    this._ensureCentroidPipeline();\n  }\n\n  _ensurePipeline(useUmap = false, useLinearScalar = false, useLinearNormalized = false) {\n    if (!this.device) return;\n    const pipelineField = useUmap ? 'umapPipeline' : useLinearScalar ? 'linearScalarPipeline' : useLinearNormalized ? 'linearNormalizedPipeline' : 'linearPipeline';\n    const layoutField = useUmap ? 'umapBindGroupLayout' : useLinearScalar ? 'linearScalarBindGroupLayout' : 'linearBindGroupLayout';\n    if (this[pipelineField]) return;\n    const entries = [\n      { binding: 0, visibility: this.shaderVisibility, buffer: { type: 'read-only-storage' } },\n      { binding: 1, visibility: this.shaderVisibility, buffer: { type: 'read-only-storage' } },\n      { binding: 2, visibility: this.shaderVisibility, buffer: { type: 'storage' } },\n      { binding: 3, visibility: this.shaderVisibility, buffer: { type: 'storage' } },\n      { binding: 4, visibility: this.shaderVisibility, buffer: { type: 'read-only-storage' } },\n      { binding: 5, visibility: this.shaderVisibility, buffer: { type: 'read-only-storage' } },\n      { binding: 6, visibility: this.shaderVisibility, buffer: { type: 'read-only-storage' } },\n      { binding: 7, visibility: this.shaderVisibility, buffer: { type: 'read-only-storage' } },\n      { binding: 8, visibility: this.shaderVisibility, buffer: { type: 'read-only-storage' } },\n      ...(!useUmap ? [{ binding: 9, visibility: this.shaderVisibility, buffer: { type: 'read-only-storage' } }] : []),\n      ...(useUmap\n        ? [{ binding: 9, visibility: this.shaderVisibility, buffer: { type: 'read-only-storage' } }]\n        : useLinearScalar\n          ? [\n            { binding: 10, visibility: this.shaderVisibility, buffer: { type: 'read-only-storage' } },\n            { binding: 11, visibility: this.shaderVisibility, buffer: { type: 'read-only-storage' } },\n          ]\n        : []),\n      { binding: useUmap ? 10 : useLinearScalar ? 12 : 10, visibility: this.shaderVisibility, buffer: { type: 'uniform' } },\n    ];\n    this[layoutField] = this.device.createBindGroupLayout({ entries });\n    const module = this.device.createShaderModule({\n      code: useUmap\n        ? COMPUTE_WGSL_UMAP\n        : useLinearScalar\n          ? COMPUTE_WGSL_LINEAR_SCALAR\n          : useLinearNormalized\n            ? COMPUTE_WGSL_LINEAR_NORMALIZED\n            : COMPUTE_WGSL_LINEAR,\n    });\n    this[pipelineField] = this.device.createComputePipeline({\n      layout: this.device.createPipelineLayout({ bindGroupLayouts: [this[layoutField]] }),\n      compute: { module, entryPoint: 'main' },\n    });\n  }\n\n  _ensureOutputScalePipeline() {\n    if (!this.device || this.outputScalePipeline) return;\n    this.outputScaleBindGroupLayout = this.device.createBindGroupLayout({\n      entries: [\n        { binding: 0, visibility: this.shaderVisibility, buffer: { type: 'read-only-storage' } },\n        { binding: 1, visibility: this.shaderVisibility, buffer: { type: 'storage' } },\n        { binding: 2, visibility: this.shaderVisibility, buffer: { type: 'uniform' } },\n      ],\n    });\n    const module = this.device.createShaderModule({ code: OUTPUT_SCALE_WGSL });\n    this.outputScalePipeline = this.device.createComputePipeline({\n      layout: this.device.createPipelineLayout({ bindGroupLayouts: [this.outputScaleBindGroupLayout] }),\n      compute: { module, entryPoint: 'main' },\n    });\n  }\n\n  _ensureRecenterPipeline(useRotation = false) {\n    if (!this.device) return;\n    const pipelineField = useRotation ? 'recenterRotationPipeline' : 'recenterBasePipeline';\n    const layoutField = useRotation ? 'recenterRotationBindGroupLayout' : 'recenterBaseBindGroupLayout';\n    if (this[pipelineField]) return;\n    const entries = useRotation\n      ? [\n        { binding: 0, visibility: this.shaderVisibility, buffer: { type: 'storage' } },\n        { binding: 1, visibility: this.shaderVisibility, buffer: { type: 'storage' } },\n        { binding: 2, visibility: this.shaderVisibility, buffer: { type: 'read-only-storage' } },\n        { binding: 3, visibility: this.shaderVisibility, buffer: { type: 'uniform' } },\n      ]\n      : [\n        { binding: 0, visibility: this.shaderVisibility, buffer: { type: 'storage' } },\n        { binding: 1, visibility: this.shaderVisibility, buffer: { type: 'read-only-storage' } },\n        { binding: 2, visibility: this.shaderVisibility, buffer: { type: 'uniform' } },\n      ];\n    this[layoutField] = this.device.createBindGroupLayout({ entries });\n    const module = this.device.createShaderModule({ code: useRotation ? RECENTER_WGSL_ROTATION : RECENTER_WGSL_BASE });\n    this[pipelineField] = this.device.createComputePipeline({\n      layout: this.device.createPipelineLayout({ bindGroupLayouts: [this[layoutField]] }),\n      compute: { module, entryPoint: 'main' },\n    });\n  }\n\n  _ensureCentroidPipeline() {\n    if (!this.device || this.centroidPipeline) return;\n    this.centroidBindGroupLayout = this.device.createBindGroupLayout({\n      entries: [\n        { binding: 0, visibility: this.shaderVisibility, buffer: { type: 'read-only-storage' } },\n        { binding: 1, visibility: this.shaderVisibility, buffer: { type: 'read-only-storage' } },\n        { binding: 2, visibility: this.shaderVisibility, buffer: { type: 'storage' } },\n        { binding: 3, visibility: this.shaderVisibility, buffer: { type: 'uniform' } },\n      ],\n    });\n    const module = this.device.createShaderModule({ code: buildCentroidReductionWgsl() });\n    this.centroidPipeline = this.device.createComputePipeline({\n      layout: this.device.createPipelineLayout({ bindGroupLayouts: [this.centroidBindGroupLayout] }),\n      compute: { module, entryPoint: 'main' },\n    });\n  }\n\n  _ensureBuffer(field, size, usage, label) {\n    const normalizedSize = Math.max(4, Math.ceil((size ?? 0) / 4) * 4);\n    const current = this[field] ?? null;\n    if (current?.size >= normalizedSize) {\n      return current;\n    }\n    current?.destroy?.();\n    const created = this.device.createBuffer({ size: normalizedSize, usage, label });\n    this[field] = created;\n    return created;\n  }\n\n  _releaseUmapBuffer() {\n    this.neighborEdgesBuffer?.destroy?.();\n    this.scalarWeightsBuffer?.destroy?.();\n    this.neighborEdgesBuffer = null;\n    this.scalarWeightsBuffer = null;\n    this.scalarWeightsUpload = createEmptyFloatArray();\n    this.umapBindGroup = null;\n    this.linearScalarBindGroup = null;\n  }\n\n  _releaseLinearScalarBuffer() {\n    this.neighborEdgesBuffer?.destroy?.();\n    this.neighborEdgesBuffer = null;\n    this.linearScalarBindGroup = null;\n  }\n\n  _releaseComponentGravityBuffer() {\n    this.componentGravityScaleBuffer?.destroy?.();\n    this.componentGravityScaleBuffer = null;\n    this.linearBindGroup = null;\n    this.linearScalarBindGroup = null;\n  }\n\n  _rebuildBindGroup(useUmap = false, useLinearScalar = false) {\n    const layout = useUmap ? this.umapBindGroupLayout : useLinearScalar ? this.linearScalarBindGroupLayout : this.linearBindGroupLayout;\n    if (!layout) return;\n    const entries = [\n      { binding: 0, resource: { buffer: this.positionBuffer } },\n      { binding: 1, resource: { buffer: this.velocityBuffer } },\n      { binding: 2, resource: { buffer: this.scratchPositionBuffer } },\n      { binding: 3, resource: { buffer: this.scratchVelocityBuffer } },\n      { binding: 4, resource: { buffer: this.activeIdsBuffer } },\n      { binding: 5, resource: { buffer: this.activeMaskBuffer } },\n      { binding: 6, resource: { buffer: this.neighborStartsBuffer } },\n      { binding: 7, resource: { buffer: this.neighborCountsBuffer } },\n      { binding: 8, resource: { buffer: this.neighborsBuffer } },\n      ...(!useUmap ? [{ binding: 9, resource: { buffer: this.componentGravityScaleBuffer } }] : []),\n      ...(useUmap ? [{ binding: 9, resource: { buffer: this.scalarWeightsBuffer } }] : []),\n      ...(!useUmap && useLinearScalar ? [\n        { binding: 10, resource: { buffer: this.neighborEdgesBuffer } },\n        { binding: 11, resource: { buffer: this.scalarWeightsBuffer } },\n      ] : []),\n      { binding: useUmap ? 10 : useLinearScalar ? 12 : 10, resource: { buffer: this.paramsBuffer } },\n    ];\n    const bindGroup = this.device.createBindGroup({ layout, entries });\n    if (useUmap) this.umapBindGroup = bindGroup;\n    else if (useLinearScalar) this.linearScalarBindGroup = bindGroup;\n    else this.linearBindGroup = bindGroup;\n  }\n\n  _rebuildOutputScaleBindGroup(sourceBuffer = this.positionBuffer, field = 'outputScaleBindGroup') {\n    if (!this.outputScaleBindGroupLayout) return;\n    if (!sourceBuffer || !this.outputPositionBuffer || !this.outputScaleParamsBuffer) return;\n    this[field] = this.device.createBindGroup({\n      layout: this.outputScaleBindGroupLayout,\n      entries: [\n        { binding: 0, resource: { buffer: sourceBuffer } },\n        { binding: 1, resource: { buffer: this.outputPositionBuffer } },\n        { binding: 2, resource: { buffer: this.outputScaleParamsBuffer } },\n      ],\n    });\n  }\n\n  _rebuildOutputScaleBindGroups() {\n    this._rebuildOutputScaleBindGroup(this.positionBuffer, 'outputScaleBindGroup');\n    this._rebuildOutputScaleBindGroup(this.scratchPositionBuffer, 'outputScaleScratchBindGroup');\n  }\n\n  _rebuildRecenterBindGroup(useRotation = false) {\n    const layout = useRotation ? this.recenterRotationBindGroupLayout : this.recenterBaseBindGroupLayout;\n    if (!layout) return;\n    if (!this.positionBuffer || !this.activeIdsBuffer || !this.recenterParamsBuffer) return;\n    if (useRotation && !this.velocityBuffer) return;\n    const bindGroup = this.device.createBindGroup({\n      layout,\n      entries: useRotation\n        ? [\n          { binding: 0, resource: { buffer: this.positionBuffer } },\n          { binding: 1, resource: { buffer: this.velocityBuffer } },\n          { binding: 2, resource: { buffer: this.activeIdsBuffer } },\n          { binding: 3, resource: { buffer: this.recenterParamsBuffer } },\n        ]\n        : [\n          { binding: 0, resource: { buffer: this.positionBuffer } },\n          { binding: 1, resource: { buffer: this.activeIdsBuffer } },\n          { binding: 2, resource: { buffer: this.recenterParamsBuffer } },\n        ],\n    });\n    if (useRotation) this.recenterRotationBindGroup = bindGroup;\n    else this.recenterBaseBindGroup = bindGroup;\n  }\n\n  _swapSimulationBuffers() {\n    const positionBuffer = this.positionBuffer;\n    this.positionBuffer = this.scratchPositionBuffer;\n    this.scratchPositionBuffer = positionBuffer;\n\n    const velocityBuffer = this.velocityBuffer;\n    this.velocityBuffer = this.scratchVelocityBuffer;\n    this.scratchVelocityBuffer = velocityBuffer;\n\n    this.linearBindGroup = null;\n    this.linearScalarBindGroup = null;\n    this.umapBindGroup = null;\n    this.outputScaleBindGroup = null;\n    this.outputScaleScratchBindGroup = null;\n    this.recenterBaseBindGroup = null;\n    this.recenterRotationBindGroup = null;\n  }\n\n  syncTopology(payload, options = {}) {\n    if (!payload || !this.device) return false;\n    const {\n      nodeCapacity,\n      activeCount,\n      activeIds,\n      activeMask,\n      neighborStarts,\n      neighborCounts,\n      neighbors,\n      neighborEdges,\n      componentGravityScale,\n      nodeMass,\n      neighborWeights,\n      nodeStrength,\n      edgeWeightValues,\n      packedPositions,\n      packedOutputPositions,\n    } = payload;\n    const preserveDynamicState = options?.preserveDynamicState === true;\n    const previousNodeCapacity = this.nodeCapacity;\n    const useUmap = payload.umapModel === true;\n    const useLinearScalar = !useUmap && payload.linearScalarInputs === true;\n    const useLinearNormalized = !useUmap && !useLinearScalar && payload.linearNormalizedInputs === true;\n    this.umapEnabled = useUmap;\n    this._ensurePipeline(useUmap, useLinearScalar, useLinearNormalized);\n\n    this.nodeCapacity = Math.max(0, nodeCapacity | 0);\n    this.activeCount = Math.max(0, activeCount | 0);\n\n    const nodeVec3Bytes = Math.max(1, this.nodeCapacity) * 12;\n    const nodeU32Bytes = Math.max(1, this.nodeCapacity) * 4;\n\n    this._ensureBuffer('positionBuffer', nodeVec3Bytes, this.storageUsage, 'layout:gpu-force:positions');\n    this._ensureBuffer('outputPositionBuffer', nodeVec3Bytes, this.storageUsage, 'layout:gpu-force:positions-output');\n    this._ensureBuffer('velocityBuffer', nodeVec3Bytes, this.storageUsage, 'layout:gpu-force:velocities');\n    this._ensureBuffer('scratchPositionBuffer', nodeVec3Bytes, this.storageUsage, 'layout:gpu-force:scratch-positions');\n    this._ensureBuffer('scratchVelocityBuffer', nodeVec3Bytes, this.storageUsage, 'layout:gpu-force:scratch-velocities');\n\n    this._ensureBuffer('activeIdsBuffer', Math.max(1, activeIds.length) * 4, this.storageUsage, 'layout:gpu-force:active-ids');\n    this._ensureBuffer('activeMaskBuffer', nodeU32Bytes, this.storageUsage, 'layout:gpu-force:active-mask');\n    this._ensureBuffer('neighborStartsBuffer', nodeU32Bytes, this.storageUsage, 'layout:gpu-force:neighbor-starts');\n    this._ensureBuffer('neighborCountsBuffer', nodeU32Bytes, this.storageUsage, 'layout:gpu-force:neighbor-counts');\n    this._ensureBuffer('neighborsBuffer', Math.max(1, neighbors.length) * 4, this.storageUsage, 'layout:gpu-force:neighbors');\n    if (useUmap) {\n      this._releaseComponentGravityBuffer();\n    } else {\n      this._ensureBuffer('componentGravityScaleBuffer', Math.max(1, this.nodeCapacity) * 4, this.storageUsage, 'layout:gpu-force:component-gravity-scale');\n    }\n    if (useLinearScalar) {\n      this._ensureBuffer(\n        'neighborEdgesBuffer',\n        Math.max(1, neighborEdges.length) * 4,\n        this.storageUsage,\n        'layout:gpu-force:neighbor-edges',\n      );\n    } else {\n      this._releaseLinearScalarBuffer();\n    }\n    const scalarWeightCount = useUmap\n      ? (this.nodeCapacity + Math.max(0, payload.neighborLength | 0))\n      : useLinearScalar\n        ? (this.nodeCapacity + Math.max(0, payload.edgeCapacity | 0))\n        : 0;\n    if (useUmap || useLinearScalar) {\n      this.scalarWeightsUpload = ensureFloat32Capacity(this.scalarWeightsUpload, scalarWeightCount);\n      this._ensureBuffer(\n        'scalarWeightsBuffer',\n        Math.max(1, scalarWeightCount) * 4,\n        this.storageUsage,\n        'layout:gpu-force:scalar-weights',\n      );\n    } else {\n      this._releaseUmapBuffer();\n    }\n    this._ensureBuffer('paramsBuffer', 256, this.uniformUsage, 'layout:gpu-force:params');\n    this._ensureBuffer('outputScaleParamsBuffer', 80, this.uniformUsage, 'layout:gpu-force:output-scale-params');\n    this._ensureBuffer('recenterParamsBuffer', 64, this.uniformUsage, 'layout:gpu-force:recenter-params');\n\n    const queue = this.device.queue;\n    const canPreserveDynamicState = preserveDynamicState\n      && previousNodeCapacity === this.nodeCapacity\n      && this.positionBuffer\n      && this.outputPositionBuffer\n      && this.velocityBuffer\n      && this.scratchPositionBuffer\n      && this.scratchVelocityBuffer;\n    if (!canPreserveDynamicState) {\n      const positionBytes = Math.max(4, Math.min(packedPositions.byteLength, Math.max(1, this.nodeCapacity) * 12));\n      queue.writeBuffer(this.positionBuffer, 0, packedPositions.buffer, packedPositions.byteOffset, positionBytes);\n      queue.writeBuffer(\n        this.outputPositionBuffer,\n        0,\n        (packedOutputPositions ?? packedPositions).buffer,\n        (packedOutputPositions ?? packedPositions).byteOffset,\n        positionBytes,\n      );\n      queue.writeBuffer(this.scratchPositionBuffer, 0, packedPositions.buffer, packedPositions.byteOffset, positionBytes);\n\n      this.zeroVelocities = ensureFloat32Capacity(this.zeroVelocities, Math.max(1, this.nodeCapacity) * 3);\n      this.zeroVelocities.fill(0, 0, Math.max(1, this.nodeCapacity) * 3);\n      const zeroBytes = Math.max(4, Math.min(this.zeroVelocities.byteLength, Math.max(1, this.nodeCapacity) * 12));\n      queue.writeBuffer(this.velocityBuffer, 0, this.zeroVelocities.buffer, this.zeroVelocities.byteOffset, zeroBytes);\n      queue.writeBuffer(this.scratchVelocityBuffer, 0, this.zeroVelocities.buffer, this.zeroVelocities.byteOffset, zeroBytes);\n      this.sampleFrame = 0;\n      this.layoutChunkOffset = 0;\n    }\n\n    if (activeCount > 0) {\n      queue.writeBuffer(this.activeIdsBuffer, 0, activeIds.buffer, activeIds.byteOffset, activeCount * 4);\n    }\n    if (this.nodeCapacity > 0) {\n      const nodeU32BytesUsed = this.nodeCapacity * 4;\n      queue.writeBuffer(this.activeMaskBuffer, 0, activeMask.buffer, activeMask.byteOffset, nodeU32BytesUsed);\n      queue.writeBuffer(this.neighborStartsBuffer, 0, neighborStarts.buffer, neighborStarts.byteOffset, nodeU32BytesUsed);\n      queue.writeBuffer(this.neighborCountsBuffer, 0, neighborCounts.buffer, neighborCounts.byteOffset, nodeU32BytesUsed);\n      if (!useUmap && payload.componentGravityEnabled === true) {\n        queue.writeBuffer(this.componentGravityScaleBuffer, 0, componentGravityScale.buffer, componentGravityScale.byteOffset, this.nodeCapacity * 4);\n      }\n    }\n    if (payload.neighborLength > 0) {\n      queue.writeBuffer(this.neighborsBuffer, 0, neighbors.buffer, neighbors.byteOffset, payload.neighborLength * 4);\n      if (useLinearScalar) {\n        queue.writeBuffer(this.neighborEdgesBuffer, 0, neighborEdges.buffer, neighborEdges.byteOffset, payload.neighborLength * 4);\n      }\n    }\n    if (useUmap && scalarWeightCount > 0) {\n      const scalarWeights = this.scalarWeightsUpload;\n      scalarWeights.fill(0, 0, scalarWeightCount);\n      if (this.nodeCapacity > 0) {\n        scalarWeights.set(nodeMass.subarray(0, this.nodeCapacity), 0);\n      }\n      if (payload.neighborLength > 0) {\n        scalarWeights.set(neighborWeights.subarray(0, payload.neighborLength), this.nodeCapacity);\n      }\n      queue.writeBuffer(\n        this.scalarWeightsBuffer,\n        0,\n        scalarWeights.buffer,\n        scalarWeights.byteOffset,\n        scalarWeightCount * 4,\n      );\n    } else if (useLinearScalar && scalarWeightCount > 0) {\n      const scalarWeights = this.scalarWeightsUpload;\n      scalarWeights.fill(0, 0, scalarWeightCount);\n      if (this.nodeCapacity > 0 && ArrayBuffer.isView(nodeStrength)) {\n        const limit = Math.min(this.nodeCapacity, nodeStrength.length);\n        for (let i = 0; i < limit; i += 1) {\n          const value = Number(nodeStrength[i]);\n          scalarWeights[i] = Number.isFinite(value) ? value : 0;\n        }\n      }\n      if (payload.linearHasEdgeWeights && ArrayBuffer.isView(edgeWeightValues)) {\n        const edgeLimit = Math.min(Math.max(0, payload.edgeCapacity | 0), edgeWeightValues.length);\n        for (let i = 0; i < edgeLimit; i += 1) {\n          const value = Number(edgeWeightValues[i]);\n          scalarWeights[this.nodeCapacity + i] = Number.isFinite(value) ? value : 0;\n        }\n      }\n      queue.writeBuffer(\n        this.scalarWeightsBuffer,\n        0,\n        scalarWeights.buffer,\n        scalarWeights.byteOffset,\n        scalarWeightCount * 4,\n      );\n    }\n\n    this._rebuildBindGroup(useUmap, useLinearScalar);\n    this._rebuildOutputScaleBindGroups();\n    this._rebuildRecenterBindGroup(false);\n    this._rebuildRecenterBindGroup(true);\n    return true;\n  }\n\n  _resolveChunkState(stepOptions = {}) {\n    const useChunked = shouldUseChunkedLayoutScheduling(\n      stepOptions.layoutScheduling,\n      this.activeCount,\n    );\n    if (!useChunked || this.nodeCapacity <= 0) {\n      return {\n        enabled: false,\n        start: 0,\n        count: Math.max(0, this.nodeCapacity),\n        completesSweep: true,\n        sweepStart: true,\n      };\n    }\n    const legacyNodeCount = stepOptions.layoutChunkCount == null && stepOptions.layoutChunkNodeCount != null\n      ? resolveLayoutChunkNodeCount(stepOptions.layoutChunkNodeCount)\n      : null;\n    const chunkNodeCount = legacyNodeCount == null\n      ? Math.ceil(Math.max(1, this.nodeCapacity) / resolveLayoutChunkCount(stepOptions.layoutChunkCount))\n      : legacyNodeCount;\n    const currentOffset = Math.max(\n      0,\n      Math.min(Math.floor(Number(this.layoutChunkOffset) || 0), Math.max(0, this.nodeCapacity - 1)),\n    );\n    const count = Math.max(1, Math.min(chunkNodeCount, this.nodeCapacity - currentOffset));\n    return {\n      enabled: true,\n      start: currentOffset,\n      count,\n      completesSweep: currentOffset + count >= this.nodeCapacity,\n      sweepStart: currentOffset === 0,\n    };\n  }\n\n  peekChunkState(stepOptions = {}) {\n    return this._resolveChunkState(stepOptions);\n  }\n\n  _writeOutputScaleParams({\n    dispatchShape,\n    center,\n    outputScale,\n    chunkStart = 0,\n    chunkCount = this.nodeCapacity,\n    mode = '2d',\n  } = {}) {\n    const scaleParamsBuffer = new ArrayBuffer(20 * 4);\n    const scaleParamsU32 = new Uint32Array(scaleParamsBuffer);\n    const scaleParamsF32 = new Float32Array(scaleParamsBuffer);\n    scaleParamsU32[0] = this.nodeCapacity >>> 0;\n    scaleParamsU32[1] = mode === '3d' ? 1 : 0;\n    scaleParamsU32[4] = dispatchShape.rowStride >>> 0;\n    scaleParamsU32[5] = dispatchShape.layerStride >>> 0;\n    scaleParamsF32[8] = center[0];\n    scaleParamsF32[9] = center[1];\n    scaleParamsF32[10] = center[2];\n    scaleParamsF32[12] = outputScale;\n    scaleParamsU32[16] = Math.max(0, Math.floor(chunkStart || 0)) >>> 0;\n    scaleParamsU32[17] = Math.max(0, Math.floor(chunkCount || 0)) >>> 0;\n    this.device.queue.writeBuffer(this.outputScaleParamsBuffer, 0, scaleParamsBuffer);\n  }\n\n  _encodeOutputUpdate({\n    encoder,\n    sourceBuffer = this.positionBuffer,\n    bindGroup = this.outputScaleBindGroup,\n    dispatchShape,\n    center,\n    outputScale,\n    chunkStart = 0,\n    chunkCount = this.nodeCapacity,\n    mode = '2d',\n  } = {}) {\n    const safeChunkStart = Math.max(0, Math.floor(chunkStart || 0));\n    const safeChunkCount = Math.max(0, Math.floor(chunkCount || 0));\n    if (!encoder || !sourceBuffer || !this.outputPositionBuffer || safeChunkCount <= 0) return false;\n    const offset = safeChunkStart * 12;\n    const bytes = safeChunkCount * 12;\n    if (Math.abs(outputScale - 1.0) <= 1e-6) {\n      encoder.copyBufferToBuffer(sourceBuffer, offset, this.outputPositionBuffer, offset, bytes);\n      return true;\n    }\n    this._ensureOutputScalePipeline();\n    if (sourceBuffer === this.scratchPositionBuffer) {\n      this._rebuildOutputScaleBindGroup(this.scratchPositionBuffer, 'outputScaleScratchBindGroup');\n      bindGroup = this.outputScaleScratchBindGroup;\n    } else {\n      this._rebuildOutputScaleBindGroup(this.positionBuffer, 'outputScaleBindGroup');\n      bindGroup = this.outputScaleBindGroup;\n    }\n    if (!this.outputScalePipeline || !bindGroup || !this.outputScaleParamsBuffer) return false;\n    this._writeOutputScaleParams({\n      dispatchShape,\n      center,\n      outputScale,\n      chunkStart: safeChunkStart,\n      chunkCount: safeChunkCount,\n      mode,\n    });\n    const outputScalePass = encoder.beginComputePass({ label: 'layout:gpu-force:output-scale' });\n    outputScalePass.setPipeline(this.outputScalePipeline);\n    outputScalePass.setBindGroup(0, bindGroup);\n    outputScalePass.dispatchWorkgroups(dispatchShape.x, dispatchShape.y, dispatchShape.z);\n    outputScalePass.end();\n    return true;\n  }\n\n  step(stepOptions = {}) {\n    if (!this.device) return false;\n    if (this.nodeCapacity <= 0 || this.activeCount <= 0) return false;\n    if (!this.outputPositionBuffer) return false;\n\n    const sampleCount = Math.max(1, Math.floor(toFinite(stepOptions.sampleCount, 64)));\n    const sampleChurnCount = resolveSampleChurnCount(sampleCount, stepOptions.sampleChurn);\n    const exactRepulsionThreshold = Math.max(1, Math.floor(toFinite(\n      stepOptions.exactRepulsionThreshold,\n      stepOptions.mode === '3d'\n        ? DEFAULT_OPTIONS.exactRepulsionThreshold3D\n        : DEFAULT_OPTIONS.exactRepulsionThreshold2D,\n    )));\n    const maxNeighborsPerNode = Math.max(1, Math.floor(toFinite(stepOptions.maxNeighborsPerNode, 64)));\n    // Keep sampled repulsion neighborhoods stable by default, while allowing\n    // optional progressive churn to refresh only part of the sample set.\n    this.seed = this.seed >>> 0;\n    const sampleFrame = this.sampleFrame >>> 0;\n    const forceModel = isUmapForceModel(stepOptions.forceModel) ? 1 : 0;\n    const useUmap = forceModel === 1;\n    const useLinearScalar = !useUmap && stepOptions.linearScalarInputs === true;\n    const useLinearNormalized = !useUmap && !useLinearScalar && stepOptions.linearNormalizedInputs === true;\n    const pipeline = useUmap ? this.umapPipeline : useLinearScalar ? this.linearScalarPipeline : useLinearNormalized ? this.linearNormalizedPipeline : this.linearPipeline;\n    const bindGroup = useUmap ? this.umapBindGroup : useLinearScalar ? this.linearScalarBindGroup : this.linearBindGroup;\n    if (!pipeline || !bindGroup) return false;\n\n    const chunkState = this._resolveChunkState(stepOptions);\n    const dispatchCount = chunkState.enabled ? chunkState.count : this.nodeCapacity;\n    const dispatchShape = resolveComputeDispatchShape(\n      dispatchCount,\n      WORKGROUP_SIZE,\n      this.maxComputeWorkgroupsPerDimension,\n    );\n    const paramsBuffer = new ArrayBuffer(32 * 4);\n    const paramsU32 = new Uint32Array(paramsBuffer);\n    const paramsF32 = new Float32Array(paramsBuffer);\n\n    paramsU32[0] = this.activeCount >>> 0;\n    paramsU32[1] = this.nodeCapacity >>> 0;\n    paramsU32[2] = sampleCount >>> 0;\n    paramsU32[3] = maxNeighborsPerNode >>> 0;\n\n    paramsU32[4] = stepOptions.mode === '3d' ? 1 : 0;\n    paramsU32[5] = sampleChurnCount >>> 0;\n    paramsU32[6] = this.seed >>> 0;\n    paramsU32[7] = exactRepulsionThreshold >>> 0;\n\n    paramsU32[8] = dispatchShape.rowStride >>> 0;\n    paramsU32[9] = dispatchShape.layerStride >>> 0;\n    paramsU32[10] = sampleFrame >>> 0;\n    paramsU32[11] = useUmap\n      ? (forceModel >>> 0)\n      : useLinearScalar\n      ? ((forceNormalizationMode(stepOptions.forceNormalizationType) & 255) | (stepOptions.hasEdgeWeights ? 256 : 0))\n      : useLinearNormalized\n        ? (forceNormalizationMode(stepOptions.forceNormalizationType) & 255)\n        : (forceModel >>> 0);\n\n    paramsF32[12] = toFinite(stepOptions.kRepulsion, DEFAULT_OPTIONS.kRepulsion);\n    paramsF32[13] = toFinite(stepOptions.kAttraction, DEFAULT_OPTIONS.kAttraction);\n    paramsF32[14] = toFinite(stepOptions.kGravity, DEFAULT_OPTIONS.kGravity);\n    paramsF32[15] = toFinite(stepOptions.eta, DEFAULT_OPTIONS.eta);\n\n    paramsF32[16] = clamp(stepOptions.damping, 0, 1, DEFAULT_OPTIONS.damping);\n    paramsF32[17] = Math.max(0.001, toFinite(stepOptions.maxStep, DEFAULT_OPTIONS.maxStep));\n    paramsF32[18] = Math.max(0.0001, toFinite(stepOptions.minDistance, DEFAULT_OPTIONS.minDistance));\n    paramsF32[19] = useUmap\n      ? Math.max(1, toFinite(stepOptions.umapEpochs, DEFAULT_UMAP_EPOCHS_SMALL))\n      : Math.max(0.0001, toFinite(stepOptions.linkDistance, DEFAULT_OPTIONS.linkDistance));\n\n    const center = normalizeCenter(stepOptions.center);\n    paramsF32[20] = center[0];\n    paramsF32[21] = center[1];\n    paramsF32[22] = center[2];\n    paramsF32[23] = Math.max(0.001, toFinite(stepOptions.dt, 1 / 60));\n\n    paramsF32[24] = Math.max(0.000001, toFinite(stepOptions.umapA, DEFAULT_OPTIONS.umapA));\n    paramsF32[25] = Math.max(0.000001, toFinite(stepOptions.umapB, DEFAULT_OPTIONS.umapB));\n    paramsF32[26] = Math.max(0, toFinite(stepOptions.umapGamma, DEFAULT_OPTIONS.umapGamma));\n    paramsF32[27] = Math.max(\n      0,\n      toFinite(stepOptions.umapNegativeSampleRate, DEFAULT_OPTIONS.umapNegativeSampleRate),\n    );\n    paramsU32[28] = chunkState.start >>> 0;\n    paramsU32[29] = chunkState.count >>> 0;\n    paramsU32[30] = !useUmap && stepOptions.componentGravityEnabled ? 1 : 0;\n\n    const outputScale = Math.max(0.0001, toFinite(stepOptions.outputScale, DEFAULT_OPTIONS.outputScale));\n    const rotationDamping = clamp(stepOptions.rotationDamping, 0, 1, DEFAULT_OPTIONS.rotationDamping);\n    const useRotationDamping = rotationDamping > 1e-6;\n\n    this.device.queue.writeBuffer(this.paramsBuffer, 0, paramsBuffer);\n\n    const encoder = this.device.createCommandEncoder({ label: 'layout:gpu-force:step' });\n    const pass = encoder.beginComputePass({ label: 'layout:gpu-force:compute' });\n    pass.setPipeline(pipeline);\n    pass.setBindGroup(0, bindGroup);\n    pass.dispatchWorkgroups(dispatchShape.x, dispatchShape.y, dispatchShape.z);\n    pass.end();\n\n    const bytes = Math.max(1, this.nodeCapacity) * 12;\n    if (!chunkState.enabled) {\n      encoder.copyBufferToBuffer(this.scratchPositionBuffer, 0, this.positionBuffer, 0, bytes);\n      encoder.copyBufferToBuffer(this.scratchVelocityBuffer, 0, this.velocityBuffer, 0, bytes);\n\n      if (stepOptions.recenter === true) {\n        this._ensureRecenterPipeline(useRotationDamping);\n        this._rebuildRecenterBindGroup(useRotationDamping);\n        const recenterPipeline = useRotationDamping ? this.recenterRotationPipeline : this.recenterBasePipeline;\n        const recenterBindGroup = useRotationDamping ? this.recenterRotationBindGroup : this.recenterBaseBindGroup;\n        if (!recenterPipeline || !recenterBindGroup || !this.recenterParamsBuffer) {\n          return false;\n        }\n        const recenterParamsBuffer = new ArrayBuffer(useRotationDamping ? (12 * 4) : (8 * 4));\n        const recenterParamsU32 = new Uint32Array(recenterParamsBuffer);\n        const recenterParamsF32 = new Float32Array(recenterParamsBuffer);\n        recenterParamsU32[0] = this.activeCount >>> 0;\n        recenterParamsU32[1] = stepOptions.mode === '3d' ? 1 : 0;\n        recenterParamsF32[4] = center[0];\n        recenterParamsF32[5] = center[1];\n        recenterParamsF32[6] = center[2];\n        if (useRotationDamping) {\n          recenterParamsF32[8] = rotationDamping;\n        }\n        this.device.queue.writeBuffer(this.recenterParamsBuffer, 0, recenterParamsBuffer);\n\n        const recenterPass = encoder.beginComputePass({ label: 'layout:gpu-force:recenter' });\n        recenterPass.setPipeline(recenterPipeline);\n        recenterPass.setBindGroup(0, recenterBindGroup);\n        recenterPass.dispatchWorkgroups(1);\n        recenterPass.end();\n      }\n\n      const fullOutputDispatchShape = chunkState.enabled\n        ? resolveComputeDispatchShape(\n            this.nodeCapacity,\n            WORKGROUP_SIZE,\n            this.maxComputeWorkgroupsPerDimension,\n          )\n        : dispatchShape;\n      if (!this._encodeOutputUpdate({\n        encoder,\n        sourceBuffer: this.positionBuffer,\n        bindGroup: this.outputScaleBindGroup,\n        dispatchShape: fullOutputDispatchShape,\n        center,\n        outputScale,\n        chunkStart: 0,\n        chunkCount: this.nodeCapacity,\n        mode: stepOptions.mode,\n      })) {\n        return false;\n      }\n    } else if (chunkState.completesSweep) {\n      this._swapSimulationBuffers();\n      this._rebuildBindGroup(useUmap, useLinearScalar);\n      this._rebuildOutputScaleBindGroups();\n\n      if (stepOptions.recenter === true) {\n        this._ensureRecenterPipeline(useRotationDamping);\n        this._rebuildRecenterBindGroup(useRotationDamping);\n        const recenterPipeline = useRotationDamping ? this.recenterRotationPipeline : this.recenterBasePipeline;\n        const recenterBindGroup = useRotationDamping ? this.recenterRotationBindGroup : this.recenterBaseBindGroup;\n        if (!recenterPipeline || !recenterBindGroup || !this.recenterParamsBuffer) {\n          return false;\n        }\n        const recenterParamsBuffer = new ArrayBuffer(useRotationDamping ? (12 * 4) : (8 * 4));\n        const recenterParamsU32 = new Uint32Array(recenterParamsBuffer);\n        const recenterParamsF32 = new Float32Array(recenterParamsBuffer);\n        recenterParamsU32[0] = this.activeCount >>> 0;\n        recenterParamsU32[1] = stepOptions.mode === '3d' ? 1 : 0;\n        recenterParamsF32[4] = center[0];\n        recenterParamsF32[5] = center[1];\n        recenterParamsF32[6] = center[2];\n        if (useRotationDamping) {\n          recenterParamsF32[8] = rotationDamping;\n        }\n        this.device.queue.writeBuffer(this.recenterParamsBuffer, 0, recenterParamsBuffer);\n\n        const recenterPass = encoder.beginComputePass({ label: 'layout:gpu-force:recenter' });\n        recenterPass.setPipeline(recenterPipeline);\n        recenterPass.setBindGroup(0, recenterBindGroup);\n        recenterPass.dispatchWorkgroups(1);\n        recenterPass.end();\n      }\n\n      const outputStart = stepOptions.recenter === true ? 0 : chunkState.start;\n      const outputCount = stepOptions.recenter === true ? this.nodeCapacity : chunkState.count;\n      const outputDispatchShape = stepOptions.recenter === true\n        ? resolveComputeDispatchShape(\n            this.nodeCapacity,\n            WORKGROUP_SIZE,\n            this.maxComputeWorkgroupsPerDimension,\n          )\n        : dispatchShape;\n      if (!this._encodeOutputUpdate({\n        encoder,\n        sourceBuffer: this.positionBuffer,\n        bindGroup: this.outputScaleBindGroup,\n        dispatchShape: outputDispatchShape,\n        center,\n        outputScale,\n        chunkStart: outputStart,\n        chunkCount: outputCount,\n        mode: stepOptions.mode,\n      })) {\n        return false;\n      }\n    } else if (!this._encodeOutputUpdate({\n      encoder,\n      sourceBuffer: this.scratchPositionBuffer,\n      bindGroup: this.outputScaleScratchBindGroup,\n      dispatchShape,\n      center,\n      outputScale,\n      chunkStart: chunkState.start,\n      chunkCount: chunkState.count,\n      mode: stepOptions.mode,\n    })) {\n      return false;\n    }\n\n    this.device.queue.submit([encoder.finish()]);\n    if (!chunkState.enabled || chunkState.completesSweep) {\n      this.sampleFrame = (sampleFrame + 1) >>> 0;\n      this.layoutChunkOffset = 0;\n    } else {\n      this.layoutChunkOffset = (chunkState.start + chunkState.count) >>> 0;\n    }\n    return true;\n  }\n\n  getPositionBuffer() {\n    return this.outputPositionBuffer ?? this.positionBuffer ?? null;\n  }\n\n  async readPositionSnapshot() {\n    return this._enqueueReadback(() => this._readPositionSnapshot());\n  }\n\n  async _readPositionSnapshot() {\n    const sourceBuffer = this.getPositionBuffer();\n    if (!this.device || !sourceBuffer || this.nodeCapacity <= 0) return null;\n    const byteLength = Math.max(1, this.nodeCapacity) * 12;\n    const staging = this._ensureBuffer(\n      'positionReadbackBuffer',\n      byteLength,\n      getGpuUsage('MAP_READ', MAP_READ_FLAG) | getGpuUsage('COPY_DST', COPY_DST_FLAG),\n      'layout:gpu-force:positions-readback',\n    );\n    const encoder = this.device.createCommandEncoder({ label: 'layout:gpu-force:readback' });\n    encoder.copyBufferToBuffer(sourceBuffer, 0, staging, 0, byteLength);\n    this.device.queue.submit([encoder.finish()]);\n    if (typeof staging.mapAsync !== 'function' || typeof staging.getMappedRange !== 'function') {\n      return new Float32Array(Math.max(1, this.nodeCapacity) * 3);\n    }\n    await staging.mapAsync(getGpuMapMode('READ', MAP_READ_FLAG), 0, byteLength);\n    const mapped = staging.getMappedRange(0, byteLength);\n    const copy = new Float32Array(mapped.slice(0));\n    staging.unmap?.();\n    return copy;\n  }\n\n  async readNodePositionsById(nodeIds, options = {}) {\n    return this._enqueueReadback(() => this._readNodePositionsById(nodeIds, options));\n  }\n\n  async _readNodePositionsById(nodeIds, options = {}) {\n    const sourceBuffer = this.getPositionBuffer();\n    if (!this.device || !sourceBuffer || this.nodeCapacity <= 0) return null;\n    const ids = normalizeReadbackNodeIds(nodeIds);\n    const count = ids.length;\n    const output = resolveReadbackOut(options.out, count * 3);\n    output.fill(0, 0, count * 3);\n    if (count <= 0) return output;\n\n    const byteLength = Math.max(4, count * 12);\n    const staging = this._ensureBuffer(\n      'positionReadbackBuffer',\n      byteLength,\n      getGpuUsage('MAP_READ', MAP_READ_FLAG) | getGpuUsage('COPY_DST', COPY_DST_FLAG),\n      'layout:gpu-force:positions-readback',\n    );\n    const encoder = this.device.createCommandEncoder({ label: 'layout:gpu-force:partial-readback' });\n    for (let i = 0; i < count; i += 1) {\n      const id = ids[i];\n      if (id === 0xffffffff || id >= this.nodeCapacity) continue;\n      encoder.copyBufferToBuffer(sourceBuffer, id * 12, staging, i * 12, 12);\n    }\n    this.device.queue.submit([encoder.finish()]);\n    if (typeof staging.mapAsync !== 'function' || typeof staging.getMappedRange !== 'function') {\n      return output;\n    }\n    await staging.mapAsync(getGpuMapMode('READ', MAP_READ_FLAG), 0, byteLength);\n    const mapped = staging.getMappedRange(0, byteLength);\n    const mappedFloats = new Float32Array(mapped, 0, count * 3);\n    for (let i = 0; i < count; i += 1) {\n      const id = ids[i];\n      if (id === 0xffffffff || id >= this.nodeCapacity) continue;\n      const offset = i * 3;\n      output[offset] = mappedFloats[offset] ?? 0;\n      output[offset + 1] = mappedFloats[offset + 1] ?? 0;\n      output[offset + 2] = mappedFloats[offset + 2] ?? 0;\n    }\n    staging.unmap?.();\n    return output;\n  }\n\n  async readNodeCentroidById(nodeIds, options = {}) {\n    return this._enqueueReadback(() => this._readNodeCentroidById(nodeIds, options));\n  }\n\n  async _readNodeCentroidById(nodeIds, options = {}) {\n    const ids = normalizeReadbackNodeIds(nodeIds);\n    const readableIds = filterReadableNodeIds(ids, this.nodeCapacity);\n    const count = readableIds.length;\n    if (count <= 0) {\n      const centroid = resolveReadbackOut(options.out, 3);\n      centroid[0] = 0;\n      centroid[1] = 0;\n      centroid[2] = 0;\n      return { centroid, count: 0 };\n    }\n    if (count <= PARTIAL_CENTROID_CPU_THRESHOLD) {\n      const packed = await this._readNodePositionsById(readableIds);\n      return centroidFromPackedPositions(packed, count, options.out);\n    }\n    const reduced = await this._readNodeCentroidByIdGpuReduction(readableIds, options);\n    if (reduced) return reduced;\n    const packed = await this._readNodePositionsById(readableIds);\n    return centroidFromPackedPositions(packed, count, options.out);\n  }\n\n  _enqueueReadback(fn) {\n    const previous = this._readbackChain ?? Promise.resolve();\n    const current = previous.catch(() => {}).then(fn);\n    this._readbackChain = current.catch(() => {});\n    return current;\n  }\n\n  async _readNodeCentroidByIdGpuReduction(ids, options = {}) {\n    const sourceBuffer = this.getPositionBuffer();\n    if (!this.device || !sourceBuffer || !this.centroidPipeline || !this.centroidBindGroupLayout) return null;\n    const count = ids.length;\n    const groupCount = Math.max(1, Math.ceil(count / PARTIAL_CENTROID_CPU_THRESHOLD));\n    const idsByteLength = Math.max(4, count * 4);\n    const partialByteLength = Math.max(16, groupCount * 16);\n    const paramsByteLength = 16;\n    const idsBuffer = this._ensureBuffer(\n      'centroidIdsBuffer',\n      idsByteLength,\n      getGpuUsage('STORAGE', STORAGE_FLAG) | getGpuUsage('COPY_DST', COPY_DST_FLAG),\n      'layout:gpu-force:centroid-ids',\n    );\n    const partialBuffer = this._ensureBuffer(\n      'centroidPartialBuffer',\n      partialByteLength,\n      getGpuUsage('STORAGE', STORAGE_FLAG) | getGpuUsage('COPY_SRC', COPY_SRC_FLAG),\n      'layout:gpu-force:centroid-partials',\n    );\n    const paramsBuffer = this._ensureBuffer(\n      'centroidParamsBuffer',\n      paramsByteLength,\n      getGpuUsage('UNIFORM', UNIFORM_FLAG) | getGpuUsage('COPY_DST', COPY_DST_FLAG),\n      'layout:gpu-force:centroid-params',\n    );\n    const readbackBuffer = this._ensureBuffer(\n      'centroidReadbackBuffer',\n      partialByteLength,\n      getGpuUsage('MAP_READ', MAP_READ_FLAG) | getGpuUsage('COPY_DST', COPY_DST_FLAG),\n      'layout:gpu-force:centroid-readback',\n    );\n\n    this.device.queue.writeBuffer(idsBuffer, 0, ids.buffer, ids.byteOffset, idsByteLength);\n    const params = new Uint32Array([count >>> 0, this.nodeCapacity >>> 0, 0, 0]);\n    this.device.queue.writeBuffer(paramsBuffer, 0, params);\n    const bindGroup = this.device.createBindGroup({\n      layout: this.centroidBindGroupLayout,\n      entries: [\n        { binding: 0, resource: { buffer: sourceBuffer } },\n        { binding: 1, resource: { buffer: idsBuffer } },\n        { binding: 2, resource: { buffer: partialBuffer } },\n        { binding: 3, resource: { buffer: paramsBuffer } },\n      ],\n    });\n    const encoder = this.device.createCommandEncoder({ label: 'layout:gpu-force:centroid-readback' });\n    const pass = encoder.beginComputePass({ label: 'layout:gpu-force:centroid-reduce' });\n    pass.setPipeline(this.centroidPipeline);\n    pass.setBindGroup(0, bindGroup);\n    pass.dispatchWorkgroups(groupCount);\n    pass.end();\n    encoder.copyBufferToBuffer(partialBuffer, 0, readbackBuffer, 0, partialByteLength);\n    this.device.queue.submit([encoder.finish()]);\n    if (typeof readbackBuffer.mapAsync !== 'function' || typeof readbackBuffer.getMappedRange !== 'function') {\n      return null;\n    }\n    await readbackBuffer.mapAsync(getGpuMapMode('READ', MAP_READ_FLAG), 0, partialByteLength);\n    const mapped = readbackBuffer.getMappedRange(0, partialByteLength);\n    const partials = new Float32Array(mapped);\n    let sumX = 0;\n    let sumY = 0;\n    let sumZ = 0;\n    let found = 0;\n    for (let i = 0; i < groupCount; i += 1) {\n      const offset = i * 4;\n      sumX += partials[offset] ?? 0;\n      sumY += partials[offset + 1] ?? 0;\n      sumZ += partials[offset + 2] ?? 0;\n      found += partials[offset + 3] ?? 0;\n    }\n    readbackBuffer.unmap?.();\n    const centroid = resolveReadbackOut(options.out, 3);\n    if (found > 0) {\n      centroid[0] = sumX / found;\n      centroid[1] = sumY / found;\n      centroid[2] = sumZ / found;\n    } else {\n      centroid[0] = 0;\n      centroid[1] = 0;\n      centroid[2] = 0;\n    }\n    return { centroid, count: found };\n  }\n\n  writePositionSnapshot(snapshot, options = {}) {\n    if (!(snapshot instanceof Float32Array) || !this.device || this.nodeCapacity <= 0) return false;\n    const center = normalizeCenter(options.center);\n    const outputScale = Math.max(0.0001, toFinite(options.outputScale, DEFAULT_OPTIONS.outputScale));\n    const normalizeInputByOutputScale = Math.abs(outputScale - 1.0) > 1e-6;\n    const vec3Count = Math.max(1, this.nodeCapacity) * 3;\n    const positions = ensureFloat32Capacity(this._positionWriteScratch, vec3Count);\n    const outputPositions = ensureFloat32Capacity(this._outputPositionWriteScratch, vec3Count);\n    positions.fill(0, 0, vec3Count);\n    outputPositions.fill(0, 0, vec3Count);\n    const limit = Math.max(0, Math.min(this.nodeCapacity, Math.floor(snapshot.length / 3)));\n    for (let i = 0; i < limit; i += 1) {\n      const src = i * 3;\n      const x = Number(snapshot[src] ?? center[0]);\n      const y = Number(snapshot[src + 1] ?? center[1]);\n      const z = Number(snapshot[src + 2] ?? center[2]);\n      const safeX = Number.isFinite(x) ? x : center[0];\n      const safeY = Number.isFinite(y) ? y : center[1];\n      const safeZ = Number.isFinite(z) ? z : center[2];\n      outputPositions[src] = safeX;\n      outputPositions[src + 1] = safeY;\n      outputPositions[src + 2] = safeZ;\n      if (normalizeInputByOutputScale) {\n        positions[src] = center[0] + ((safeX - center[0]) / outputScale);\n        positions[src + 1] = center[1] + ((safeY - center[1]) / outputScale);\n        positions[src + 2] = center[2] + ((safeZ - center[2]) / outputScale);\n      } else {\n        positions[src] = safeX;\n        positions[src + 1] = safeY;\n        positions[src + 2] = safeZ;\n      }\n    }\n\n    const byteLength = Math.max(4, this.nodeCapacity * 12);\n    this.device.queue.writeBuffer(this.positionBuffer, 0, positions.buffer, positions.byteOffset, byteLength);\n    this.device.queue.writeBuffer(this.outputPositionBuffer, 0, outputPositions.buffer, outputPositions.byteOffset, byteLength);\n    this.device.queue.writeBuffer(this.scratchPositionBuffer, 0, positions.buffer, positions.byteOffset, byteLength);\n    this.layoutChunkOffset = 0;\n    return true;\n  }\n\n  dispose() {\n    this.positionBuffer?.destroy?.();\n    this.outputPositionBuffer?.destroy?.();\n    this.velocityBuffer?.destroy?.();\n    this.scratchPositionBuffer?.destroy?.();\n    this.scratchVelocityBuffer?.destroy?.();\n    this.activeIdsBuffer?.destroy?.();\n    this.activeMaskBuffer?.destroy?.();\n    this.neighborStartsBuffer?.destroy?.();\n    this.neighborCountsBuffer?.destroy?.();\n    this.neighborsBuffer?.destroy?.();\n    this.componentGravityScaleBuffer?.destroy?.();\n    this._releaseUmapBuffer();\n    this.paramsBuffer?.destroy?.();\n    this.outputScaleParamsBuffer?.destroy?.();\n    this.recenterParamsBuffer?.destroy?.();\n    this.centroidParamsBuffer?.destroy?.();\n    this.centroidIdsBuffer?.destroy?.();\n    this.centroidPartialBuffer?.destroy?.();\n    this.centroidReadbackBuffer?.destroy?.();\n    this.positionReadbackBuffer?.destroy?.();\n\n    this.positionBuffer = null;\n    this.outputPositionBuffer = null;\n    this.velocityBuffer = null;\n    this.scratchPositionBuffer = null;\n    this.scratchVelocityBuffer = null;\n    this.activeIdsBuffer = null;\n    this.activeMaskBuffer = null;\n    this.neighborStartsBuffer = null;\n    this.neighborCountsBuffer = null;\n    this.neighborsBuffer = null;\n    this.componentGravityScaleBuffer = null;\n    this.scalarWeightsBuffer = null;\n    this.paramsBuffer = null;\n    this.outputScaleParamsBuffer = null;\n    this.recenterParamsBuffer = null;\n    this.centroidParamsBuffer = null;\n    this.centroidIdsBuffer = null;\n    this.centroidPartialBuffer = null;\n    this.centroidReadbackBuffer = null;\n    this.positionReadbackBuffer = null;\n    this.linearBindGroup = null;\n    this.umapBindGroup = null;\n    this.outputScaleBindGroup = null;\n    this.outputScaleScratchBindGroup = null;\n    this.recenterBaseBindGroup = null;\n    this.recenterRotationBindGroup = null;\n    this.linearPipeline = null;\n    this.umapPipeline = null;\n    this.outputScalePipeline = null;\n    this.recenterBasePipeline = null;\n    this.recenterRotationPipeline = null;\n    this.centroidPipeline = null;\n    this.linearBindGroupLayout = null;\n    this.umapBindGroupLayout = null;\n    this.outputScaleBindGroupLayout = null;\n    this.recenterBaseBindGroupLayout = null;\n    this.recenterRotationBindGroupLayout = null;\n    this.centroidBindGroupLayout = null;\n    this.nodeCapacity = 0;\n    this.activeCount = 0;\n    this.sampleFrame = 0;\n    this.layoutChunkOffset = 0;\n    this.zeroVelocities = createEmptyFloatArray();\n    this.scalarWeightsUpload = createEmptyFloatArray();\n    this._readbackChain = Promise.resolve();\n  }\n}\n\n/**\n * Position delegate used by GPU force layouts.\n *\n * @public\n * @param {object} [options] - GPU force layout delegate options and resource\n * handles.\n * @returns {GpuForcePositionDelegate} Delegate that synchronizes graph topology\n * to GPU buffers and exposes position snapshots to Helios renderers.\n * @remarks This is a low-level extension point. Most applications configure it\n * indirectly through `GpuForceLayout` or `LayoutBehavior`.\n */\nexport class GpuForcePositionDelegate extends PositionDelegate {\n  constructor(options = {}) {\n    super();\n    const normalizedOptions = {\n      ...DEFAULT_OPTIONS,\n      ...options,\n      center: normalizeCenter(options.center ?? DEFAULT_OPTIONS.center),\n      mode: options.mode === '2d' ? '2d' : '3d',\n      layoutScheduling: normalizeLayoutScheduling(options.layoutScheduling ?? DEFAULT_OPTIONS.layoutScheduling),\n      layoutChunkCount: resolveLayoutChunkCount(options.layoutChunkCount),\n      layoutChunkNodeCount: options.layoutChunkNodeCount == null\n        ? null\n        : resolveLayoutChunkNodeCount(options.layoutChunkNodeCount),\n      componentForces: normalizeComponentForces(options.componentForces ?? DEFAULT_OPTIONS.componentForces),\n    };\n    if (isUmapForceModel(normalizedOptions.forceModel)) {\n      if (options.kRepulsion == null) normalizedOptions.kRepulsion = 1;\n      if (options.kAttraction == null) normalizedOptions.kAttraction = 1;\n      if (options.kGravity == null) normalizedOptions.kGravity = 0;\n      if (options.eta == null) normalizedOptions.eta = 1;\n      if (options.alphaDecay == null) normalizedOptions.alphaDecay = DEFAULT_UMAP_ALPHA_DECAY;\n      if (options.sampleChurn == null) normalizedOptions.sampleChurn = DEFAULT_UMAP_SAMPLE_CHURN;\n    }\n    disableUmapComponentOptions(normalizedOptions);\n    this.options = normalizedOptions;\n    this.alpha = clamp(this.options.alpha, 0, 1, DEFAULT_OPTIONS.alpha);\n    this.debug = options.debug ?? options.helios?.debug ?? null;\n    this._backendType = null;\n    this._backendDeviceRef = null;\n    this._backendGlRef = null;\n    this._webgpu = null;\n    this._webgl = null;\n    this._activeCount = 0;\n    this._nodeCapacity = 0;\n    this._componentCount = 0;\n    this._componentGravityEnabled = false;\n    this._topologyScratch = {\n      activeIds: createEmptyUintArray(),\n      activeMask: createEmptyUintArray(),\n      neighborStarts: createEmptyUintArray(),\n      neighborCounts: createEmptyUintArray(),\n      neighbors: createEmptyUintArray(),\n      neighborEdges: createEmptyUintArray(),\n      neighborWeights: createEmptyFloatArray(),\n      nodeMass: createEmptyFloatArray(),\n      cursor: createEmptyUintArray(),\n      componentIds: createEmptyUintArray(),\n      componentRanks: createEmptyUintArray(),\n      nodeComponentRank: createEmptyUintArray(),\n      nodeComponentSize: createEmptyUintArray(),\n      componentSizes: createEmptyUintArray(),\n      componentGravityScale: createEmptyFloatArray(),\n      componentParent: createEmptyUintArray(),\n      componentUnionSize: createEmptyUintArray(),\n      componentRootToId: createEmptyUintArray(),\n      packedPositions: createEmptyFloatArray(),\n      packedOutputPositions: createEmptyFloatArray(),\n    };\n    this._sparseReadbackCache = new Map();\n    this._sparseReadbackLatest = new Map();\n    this._sparseReadbackPending = new Set();\n    this._sampleDebugFrameInterval = 30;\n  }\n\n  markTopologyDirty(reason = 'manual') {\n    super.markTopologyDirty(reason);\n    this._clearSparseReadbackCache();\n  }\n\n  _clearSparseReadbackCache() {\n    this._sparseReadbackCache?.clear?.();\n    this._sparseReadbackLatest?.clear?.();\n    this._sparseReadbackPending?.clear?.();\n  }\n\n  didDetach() {\n    this.dispose();\n  }\n\n  updateOptions(next = {}) {\n    if (!next || typeof next !== 'object') return this;\n    const prevMode = this.options.mode;\n    const prevCenter = this.options.center;\n    const prevForceModel = this.options.forceModel;\n    const prevEdgeWeightAttribute = this.options.edgeWeightAttribute;\n    const prevNodeMassAttribute = this.options.nodeMassAttribute;\n    const prevForceNormalizationType = this.options.forceNormalizationType;\n    const prevLayoutScheduling = this.options.layoutScheduling;\n    const prevLayoutChunkCount = this.options.layoutChunkCount;\n    const prevLayoutChunkNodeCount = this.options.layoutChunkNodeCount;\n    const prevComponentForces = this.options.componentForces;\n    const prevComponentSeeding = this.options.componentSeeding;\n    const prevComponentGravity = this.options.componentGravity;\n    const prevComponentMainGravityScale = this.options.componentMainGravityScale;\n    const prevComponentSingletonGravityScale = this.options.componentSingletonGravityScale;\n    this.options = {\n      ...this.options,\n      ...next,\n      center: normalizeCenter(next.center ?? this.options.center),\n      mode: (next.mode ?? this.options.mode) === '3d' ? '3d' : '2d',\n      layoutScheduling: normalizeLayoutScheduling(next.layoutScheduling ?? this.options.layoutScheduling),\n      layoutChunkCount: resolveLayoutChunkCount(next.layoutChunkCount ?? this.options.layoutChunkCount),\n      layoutChunkNodeCount: next.layoutChunkNodeCount == null\n        ? (Object.prototype.hasOwnProperty.call(next, 'layoutChunkCount') ? null : this.options.layoutChunkNodeCount)\n        : resolveLayoutChunkNodeCount(next.layoutChunkNodeCount),\n      componentForces: normalizeComponentForces(next.componentForces ?? this.options.componentForces),\n    };\n    if (isUmapForceModel(this.options.forceModel) && !isUmapForceModel(prevForceModel)) {\n      if (next.kRepulsion == null) this.options.kRepulsion = 1;\n      if (next.kAttraction == null) this.options.kAttraction = 1;\n      if (next.kGravity == null) this.options.kGravity = 0;\n      if (next.eta == null) this.options.eta = 1;\n      if (next.alphaDecay == null) this.options.alphaDecay = DEFAULT_UMAP_ALPHA_DECAY;\n      if (next.sampleChurn == null) this.options.sampleChurn = DEFAULT_UMAP_SAMPLE_CHURN;\n    }\n    disableUmapComponentOptions(this.options);\n    if (next.alpha != null) {\n      this.alpha = clamp(next.alpha, 0, 1, this.alpha);\n    }\n    const centerChanged = (\n      prevCenter[0] !== this.options.center[0]\n      || prevCenter[1] !== this.options.center[1]\n      || prevCenter[2] !== this.options.center[2]\n    );\n    const modelChanged = prevForceModel !== this.options.forceModel;\n    const edgeWeightChanged = prevEdgeWeightAttribute !== this.options.edgeWeightAttribute;\n    const nodeMassChanged = prevNodeMassAttribute !== this.options.nodeMassAttribute;\n    const forceNormalizationChanged = prevForceNormalizationType !== this.options.forceNormalizationType;\n    const componentOptionsChanged = (\n      prevComponentForces !== this.options.componentForces\n      || prevComponentSeeding !== this.options.componentSeeding\n      || prevComponentGravity !== this.options.componentGravity\n      || prevComponentMainGravityScale !== this.options.componentMainGravityScale\n      || prevComponentSingletonGravityScale !== this.options.componentSingletonGravityScale\n    );\n    if (prevMode !== this.options.mode || centerChanged || modelChanged || edgeWeightChanged || nodeMassChanged || forceNormalizationChanged || componentOptionsChanged) {\n      this.markTopologyDirty('options');\n    }\n    if (\n      prevLayoutScheduling !== this.options.layoutScheduling\n      || prevLayoutChunkCount !== this.options.layoutChunkCount\n      || prevLayoutChunkNodeCount !== this.options.layoutChunkNodeCount\n    ) {\n      if (this._webgpu) this._webgpu.layoutChunkOffset = 0;\n    }\n    return this;\n  }\n\n  dispose() {\n    this._webgpu?.dispose?.();\n    this._webgl?.dispose?.();\n    this._webgpu = null;\n    this._webgl = null;\n    this._backendType = null;\n    this._backendDeviceRef = null;\n    this._backendGlRef = null;\n    this._activeCount = 0;\n    this._nodeCapacity = 0;\n    this._componentCount = 0;\n    this._componentGravityEnabled = false;\n    this._topologyScratch = {\n      activeIds: createEmptyUintArray(),\n      activeMask: createEmptyUintArray(),\n      neighborStarts: createEmptyUintArray(),\n      neighborCounts: createEmptyUintArray(),\n      neighbors: createEmptyUintArray(),\n      neighborEdges: createEmptyUintArray(),\n      neighborWeights: createEmptyFloatArray(),\n      nodeMass: createEmptyFloatArray(),\n      cursor: createEmptyUintArray(),\n      componentIds: createEmptyUintArray(),\n      componentRanks: createEmptyUintArray(),\n      nodeComponentRank: createEmptyUintArray(),\n      nodeComponentSize: createEmptyUintArray(),\n      componentSizes: createEmptyUintArray(),\n      componentGravityScale: createEmptyFloatArray(),\n      componentParent: createEmptyUintArray(),\n      componentUnionSize: createEmptyUintArray(),\n      componentRootToId: createEmptyUintArray(),\n      packedPositions: createEmptyFloatArray(),\n      packedOutputPositions: createEmptyFloatArray(),\n    };\n    this._clearSparseReadbackCache();\n  }\n\n  resetDynamicStateFromNetwork(context = {}) {\n    this.markTopologyDirty('position-seed');\n    this.ensureSynchronized({\n      ...context,\n      forceInitialPositions: context.forceInitialPositions !== false,\n    });\n    return this;\n  }\n\n  resetAnnealing() {\n    if (this._webgpu) {\n      this._webgpu.sampleFrame = 0;\n      this._webgpu.layoutChunkOffset = 0;\n    }\n    if (this._webgl) {\n      this._webgl.sampleFrame = 0;\n    }\n    return this;\n  }\n\n  getCompletedEpochs() {\n    const backend = this._webgpu ?? this._webgl;\n    return Math.max(0, Math.floor(Number(backend?.sampleFrame) || 0));\n  }\n\n  _resolveBackend(context = {}) {\n    const renderer = context.renderer ?? context.helios?.renderer ?? null;\n    const rendererDevice = renderer?.device ?? null;\n    const backend = normalizeBackendType(context.backend ?? rendererDevice?.type ?? null);\n    const possibleDevice = context.device ?? rendererDevice?.device ?? null;\n    const gpuDevice = possibleDevice\n      && typeof possibleDevice.createCommandEncoder === 'function'\n      && typeof possibleDevice.createBuffer === 'function'\n      ? possibleDevice\n      : null;\n    const gl = context.gl ?? rendererDevice?.gl ?? null;\n    return {\n      backend: backend ?? null,\n      gpuDevice,\n      gl,\n    };\n  }\n\n  _markDirtyForBackend(context = {}) {\n    const resolved = this._resolveBackend(context);\n    const changed = (\n      this._backendType !== resolved.backend\n      || this._backendDeviceRef !== resolved.gpuDevice\n      || this._backendGlRef !== resolved.gl\n    );\n    if (changed) {\n      this._backendType = resolved.backend;\n      this._backendDeviceRef = resolved.gpuDevice;\n      this._backendGlRef = resolved.gl;\n      this.markTopologyDirty('backend-change');\n    }\n    return resolved;\n  }\n\n  captureNetworkVersionSnapshot(network) {\n    const snapshot = super.captureNetworkVersionSnapshot(network);\n    const forceNormalizationType = normalizeForceNormalizationType(this.options.forceNormalizationType);\n    const usesLinearStrength = !isUmapForceModel(this.options.forceModel) && forceNormalizationType === 'strength';\n    const usesLinearEdgeWeights = !isUmapForceModel(this.options.forceModel)\n      && Boolean(normalizeAttributeName(this.options.edgeWeightAttribute));\n    if (!isUmapForceModel(this.options.forceModel) && !usesLinearStrength && !usesLinearEdgeWeights) {\n      return {\n        ...snapshot,\n        edgeWeightAttributeVersion: 0,\n        nodeMassAttributeVersion: 0,\n        nodeStrengthAttributeVersion: 0,\n      };\n    }\n    const edgeWeightAttribute = normalizeAttributeName(this.options.edgeWeightAttribute);\n    const nodeMassAttribute = normalizeAttributeName(this.options.nodeMassAttribute);\n    let nodeStrengthAttributeVersion = 0;\n    if (usesLinearStrength && typeof network?.__heliosResolveLayoutStrengthAttribute === 'function') {\n      try {\n        nodeStrengthAttributeVersion = toFinite(\n          network.__heliosResolveLayoutStrengthAttribute(edgeWeightAttribute)?.version,\n          0,\n        );\n      } catch (error) {\n        warnOnce(\n          this,\n          'layout-strength-attribute-version',\n          'GpuForcePositionDelegate: failed to resolve layout strength attribute version; forcing topology synchronization.',\n          { error },\n        );\n        nodeStrengthAttributeVersion = nextFallbackVersion();\n      }\n    }\n    const readVersion = (kind, attr, getter) => {\n      if (!attr || typeof getter !== 'function') return 0;\n      try {\n        return toFinite(getter.call(network, attr), 0);\n      } catch (error) {\n        warnOnce(\n          this,\n          `${kind}-attribute-version:${attr}`,\n          `GpuForcePositionDelegate: failed to read ${kind} attribute version for \"${attr}\"; forcing topology synchronization.`,\n          { error },\n        );\n        return nextFallbackVersion();\n      }\n    };\n    return {\n      ...snapshot,\n      edgeWeightAttributeVersion: readVersion('edge weight', edgeWeightAttribute, network?.getEdgeAttributeVersion),\n      nodeMassAttributeVersion: readVersion('node mass', nodeMassAttribute, network?.getNodeAttributeVersion),\n      nodeStrengthAttributeVersion,\n    };\n  }\n\n  _snapshotKey(snapshot) {\n    return [\n      super._snapshotKey(snapshot),\n      toFinite(snapshot?.edgeWeightAttributeVersion, 0),\n      toFinite(snapshot?.nodeMassAttributeVersion, 0),\n      toFinite(snapshot?.nodeStrengthAttributeVersion, 0),\n    ].join('|');\n  }\n\n  synchronizeTopology(context = {}) {\n    const network = context.network ?? null;\n    if (!network) return;\n    const versionSnapshot = context.versionSnapshot ?? null;\n    const previousVersionSnapshot = context.previousVersionSnapshot ?? null;\n    const synchronizeReason = context.reason ?? null;\n    const topologyUnchanged = synchronizeReason === 'version-change'\n      && isSameTopologySnapshot(previousVersionSnapshot, versionSnapshot);\n    const fallbackInputs = snapshotTopologyInputs(network);\n    const topologyInputs = {\n      ...fallbackInputs,\n      nodeCapacity: Number.isFinite(versionSnapshot?.nodeIndicesCount)\n        ? Math.max(\n          fallbackInputs.nodeCapacity,\n          Math.floor(Number(versionSnapshot.nodeIndicesCount)),\n        )\n        : fallbackInputs.nodeCapacity,\n      positionView: null,\n    };\n\n    const resolved = this._resolveBackend(context);\n    const isWebGPU = resolved.backend === 'webgpu' && Boolean(resolved.gpuDevice);\n    const isWebGL = resolved.backend === 'webgl' && Boolean(resolved.gl);\n\n    if (!isWebGPU && !isWebGL) {\n      this._webgpu?.dispose?.();\n      this._webgl?.dispose?.();\n      this._webgpu = null;\n      this._webgl = null;\n      this._activeCount = topologyInputs.nodeIndices.length;\n      this._nodeCapacity = topologyInputs.nodeCapacity;\n      return;\n    }\n\n    if (isWebGPU) {\n      this._webgl?.dispose?.();\n      this._webgl = null;\n      if (!this._webgpu || this._webgpu.device !== resolved.gpuDevice) {\n        this._webgpu?.dispose?.();\n        this._webgpu = new WebGPUForceComputeBackend(resolved.gpuDevice);\n      }\n      if (topologyUnchanged && this._webgpu.getPositionBuffer() && this._activeCount > 0) {\n        return;\n      }\n    } else {\n      this._webgpu?.dispose?.();\n      this._webgpu = null;\n      if (!this._webgl || this._webgl.gl !== resolved.gl) {\n        this._webgl?.dispose?.();\n        this._webgl = new WebGLForceComputeBackend(resolved.gl);\n      }\n      if (topologyUnchanged && this._webgl.getPositionTexture() && this._activeCount > 0) {\n        return;\n      }\n    }\n\n    let payload = null;\n    const forceNormalizationType = normalizeForceNormalizationType(this.options.forceNormalizationType);\n    const linearEdgeWeightAttribute = !isUmapForceModel(this.options.forceModel)\n      ? normalizeAttributeName(this.options.edgeWeightAttribute)\n      : null;\n    let layoutStrengthAttribute = null;\n    if (\n      !isUmapForceModel(this.options.forceModel)\n      && forceNormalizationType === 'strength'\n      && typeof network.__heliosResolveLayoutStrengthAttribute === 'function'\n    ) {\n      layoutStrengthAttribute = network.__heliosResolveLayoutStrengthAttribute(linearEdgeWeightAttribute)?.name ?? null;\n    }\n    const materializePayload = () => {\n      // Access attribute buffers before taking WASM-backed topology views so\n      // hidden metadata allocation cannot stale a previously captured edgesView.\n      topologyInputs.positionView = network?.getNodeAttributeBuffer?.(NODE_POSITION_ATTRIBUTE)?.view ?? null;\n      if (isUmapForceModel(this.options.forceModel)) {\n        const edgeWeightAttribute = normalizeAttributeName(this.options.edgeWeightAttribute);\n        const nodeMassAttribute = normalizeAttributeName(this.options.nodeMassAttribute);\n        topologyInputs.edgeWeightView = edgeWeightAttribute\n          ? (network?.getEdgeAttributeBuffer?.(edgeWeightAttribute)?.view ?? null)\n          : null;\n        topologyInputs.nodeMassView = nodeMassAttribute\n          ? (network?.getNodeAttributeBuffer?.(nodeMassAttribute)?.view ?? null)\n          : null;\n        topologyInputs.nodeStrengthView = null;\n      } else {\n        topologyInputs.edgeWeightView = linearEdgeWeightAttribute\n          ? (network?.getEdgeAttributeBuffer?.(linearEdgeWeightAttribute)?.view ?? null)\n          : null;\n        topologyInputs.nodeMassView = null;\n        topologyInputs.nodeStrengthView = layoutStrengthAttribute\n          ? (network?.getNodeAttributeBuffer?.(layoutStrengthAttribute)?.view ?? null)\n          : null;\n      }\n      topologyInputs.edgesView = network?.edgesView instanceof Uint32Array ? network.edgesView : createEmptyUintArray();\n      payload = buildTopologyPayload({\n        ...topologyInputs,\n      }, {\n        ...this.options,\n        forceInitialPositions: context.forceInitialPositions === true,\n      }, this._topologyScratch);\n    };\n    if (typeof network.withBufferAccess === 'function') {\n      network.withBufferAccess(materializePayload);\n    } else {\n      materializePayload();\n    }\n    if (!payload) return;\n\n    this._activeCount = payload.activeCount;\n    this._nodeCapacity = payload.nodeCapacity;\n    this._componentCount = payload.componentCount ?? 0;\n    this._componentGravityEnabled = payload.componentGravityEnabled === true;\n    const activeSelectionChanged = Boolean(previousVersionSnapshot && versionSnapshot && (\n      Number(previousVersionSnapshot.nodeIndicesVersion) !== Number(versionSnapshot.nodeIndicesVersion)\n      || Number(previousVersionSnapshot.edgeIndicesVersion) !== Number(versionSnapshot.edgeIndicesVersion)\n      || Number(previousVersionSnapshot.nodeIndicesCount) !== Number(versionSnapshot.nodeIndicesCount)\n      || Number(previousVersionSnapshot.edgeIndicesCount) !== Number(versionSnapshot.edgeIndicesCount)\n    ));\n    const resetForComponentSeeding = payload.componentSeedingApplied === true\n      && (synchronizeReason !== 'version-change' || activeSelectionChanged);\n    const shouldPreferPreserve = synchronizeReason !== 'attach'\n      && synchronizeReason !== 'backend-change'\n      && synchronizeReason !== 'network:replaced'\n      && synchronizeReason !== 'position-seed'\n      && synchronizeReason !== 'init';\n    const preserveDynamicState = Boolean(shouldPreferPreserve\n      && this._nodeCapacity > 0\n      && topologyInputs.nodeCapacity === this._nodeCapacity\n      && !resetForComponentSeeding\n      && (\n        (this._webgpu && this._webgpu.getPositionBuffer?.())\n        || (this._webgl && this._webgl.getPositionTexture?.())\n      ));\n    if (this._webgpu) {\n      this._webgpu.syncTopology(payload, { preserveDynamicState });\n    } else if (this._webgl) {\n      this._webgl.syncTopology(payload, { preserveDynamicState });\n    }\n\n    if (this.options.resetAlphaOnTopologyChange !== false) {\n      this.alpha = clamp(this.options.alpha, 0, 1, DEFAULT_OPTIONS.alpha);\n    }\n  }\n\n  step(context = {}) {\n    this._markDirtyForBackend(context);\n    this.ensureSynchronized(context);\n    if ((this._webgpu || this._webgl) && this._nodeCapacity > 0 && this._activeCount <= 0) {\n      // Recover if a transient snapshot produced an empty active set.\n      this.markTopologyDirty('active-set-empty');\n      this.ensureSynchronized(context);\n    }\n    if (!this._webgpu && !this._webgl) {\n      return false;\n    }\n\n    const dtMs = Math.max(1, toFinite(context.deltaMs, 16));\n    const dt = Math.min(0.08, Math.max(0.008, dtMs * 0.001));\n    const dtScale = dt * 60;\n\n    const umapForceModel = isUmapForceModel(this.options.forceModel);\n    const forceNormalizationType = normalizeForceNormalizationType(this.options.forceNormalizationType);\n    const hasLinearEdgeWeights = !umapForceModel && Boolean(normalizeAttributeName(this.options.edgeWeightAttribute));\n    const linearScalarInputs = !umapForceModel && (\n      hasLinearEdgeWeights\n      || forceNormalizationType === 'strength'\n    );\n    const linearNormalizedInputs = !umapForceModel\n      && !linearScalarInputs\n      && forceNormalizationType !== 'local-degree';\n    const effectiveLayoutScheduling = normalizeLayoutScheduling(\n      context.layoutSchedulingOverride ?? this.options.layoutScheduling,\n    );\n    const chunkState = this._webgpu?.peekChunkState?.({\n      layoutScheduling: effectiveLayoutScheduling,\n      layoutChunkCount: this.options.layoutChunkNodeCount == null ? this.options.layoutChunkCount : undefined,\n      layoutChunkNodeCount: this.options.layoutChunkNodeCount,\n    }) ?? { enabled: false, sweepStart: true };\n    const alphaTarget = clamp(this.options.alphaTarget, 0, 1, DEFAULT_OPTIONS.alphaTarget);\n    const alphaDecay = clamp(this.options.alphaDecay, 0, 1, DEFAULT_OPTIONS.alphaDecay);\n    const alphaMin = clamp(this.options.alphaMin, 0, 1, DEFAULT_OPTIONS.alphaMin);\n    const umapEpochs = umapForceModel\n      ? resolveUmapEpochCount(this.options.umapEpochs, this._activeCount)\n      : 0;\n    if (!chunkState.enabled || chunkState.sweepStart) {\n      this.alpha += (alphaTarget - this.alpha) * alphaDecay;\n      if (this.alpha < alphaMin) this.alpha = alphaMin;\n    }\n\n    const maxNeighborsPerNode = Math.max(1, Math.floor(toFinite(this.options.maxNeighborsPerNode, DEFAULT_OPTIONS.maxNeighborsPerNode)));\n    const explicitSampleCountValue = this.options.sampleCount;\n    const explicitSampleCount = explicitSampleCountValue == null || explicitSampleCountValue === ''\n      ? NaN\n      : Number(explicitSampleCountValue);\n    const sampleCount = umapForceModel\n      ? resolveUmapSampleCount(\n        toFinite(this.options.umapNegativeSampleRate, DEFAULT_OPTIONS.umapNegativeSampleRate),\n        toFinite(this.options.umapNeighborCount, DEFAULT_OPTIONS.umapNeighborCount),\n        maxNeighborsPerNode,\n      )\n      : (Number.isFinite(explicitSampleCount)\n        ? Math.max(1, Math.floor(explicitSampleCount))\n        : (this.options.mode === '3d'\n          ? Math.max(1, Math.floor(toFinite(this.options.sampleCount3D, DEFAULT_OPTIONS.sampleCount3D)))\n          : Math.max(1, Math.floor(toFinite(this.options.sampleCount2D, DEFAULT_OPTIONS.sampleCount2D)))));\n    const exactRepulsionThreshold = Math.max(\n      1,\n      Math.floor(\n        toFinite(\n          this.options.mode === '3d'\n            ? this.options.exactRepulsionThreshold3D\n            : this.options.exactRepulsionThreshold2D,\n          this.options.mode === '3d'\n            ? DEFAULT_OPTIONS.exactRepulsionThreshold3D\n            : DEFAULT_OPTIONS.exactRepulsionThreshold2D,\n        ),\n      ),\n    );\n    const exactDecisionCount = Math.max(sampleCount, exactRepulsionThreshold);\n    const exactRepulsionScale = !umapForceModel && this._activeCount > 1 && this._activeCount <= exactDecisionCount\n      ? Math.sqrt(this._activeCount / Math.max(1, exactDecisionCount))\n      : 1;\n    const minDistance = umapForceModel\n      ? 0.001\n      : Math.max(0.0001, toFinite(this.options.minDistance, DEFAULT_OPTIONS.minDistance));\n\n    const stepPayload = {\n      mode: this.options.mode,\n      forceModel: umapForceModel ? 'umap' : 'linear',\n      layoutScheduling: effectiveLayoutScheduling,\n      layoutChunkCount: this.options.layoutChunkNodeCount == null ? this.options.layoutChunkCount : undefined,\n      layoutChunkNodeCount: this.options.layoutChunkNodeCount,\n      forceNormalizationType,\n      linearScalarInputs,\n      linearNormalizedInputs,\n      hasEdgeWeights: hasLinearEdgeWeights,\n      center: this.options.center,\n      recenter: this.options.recenter === true,\n      rotationDamping: clamp(this.options.rotationDamping, 0, 1, DEFAULT_OPTIONS.rotationDamping),\n      sampleCount,\n      sampleChurn: clamp(this.options.sampleChurn, 0, 1, DEFAULT_OPTIONS.sampleChurn),\n      exactRepulsionThreshold,\n      maxNeighborsPerNode,\n      outputScale: Math.max(0.0001, toFinite(this.options.outputScale, DEFAULT_OPTIONS.outputScale)),\n      linkDistance: Math.max(0.0001, toFinite(this.options.linkDistance, DEFAULT_OPTIONS.linkDistance)),\n      kRepulsion: toFinite(this.options.kRepulsion, DEFAULT_OPTIONS.kRepulsion) * this.alpha * exactRepulsionScale,\n      kAttraction: toFinite(this.options.kAttraction, DEFAULT_OPTIONS.kAttraction) * this.alpha,\n      kGravity: toFinite(this.options.kGravity, DEFAULT_OPTIONS.kGravity) * this.alpha,\n      componentGravityEnabled: this._componentGravityEnabled,\n      umapA: Math.max(0.000001, toFinite(this.options.umapA, DEFAULT_OPTIONS.umapA)),\n      umapB: Math.max(0.000001, toFinite(this.options.umapB, DEFAULT_OPTIONS.umapB)),\n      umapGamma: Math.max(0, toFinite(this.options.umapGamma, DEFAULT_OPTIONS.umapGamma)),\n      umapEpochs,\n      umapNegativeSampleRate: Math.max(\n        0,\n        toFinite(this.options.umapNegativeSampleRate, DEFAULT_OPTIONS.umapNegativeSampleRate),\n      ),\n      eta: umapForceModel ? 1 : (toFinite(this.options.eta, DEFAULT_OPTIONS.eta) * dtScale),\n      damping: clamp(this.options.damping, 0, 1, DEFAULT_OPTIONS.damping),\n      maxStep: umapForceModel\n        ? Math.max(4, toFinite(this.options.maxStep, DEFAULT_OPTIONS.maxStep))\n        : Math.max(0.001, toFinite(this.options.maxStep, DEFAULT_OPTIONS.maxStep) * dtScale),\n      minDistance,\n      alpha: this.alpha,\n      dt,\n    };\n    this._logSamplingTrace(stepPayload);\n    const changed = this._webgpu\n      ? this._webgpu.step(stepPayload)\n      : this._webgl.step(stepPayload);\n\n    if (changed) {\n      this.bumpVersion();\n    }\n    return changed;\n  }\n\n  _resolveSampleDebugConfig() {\n    const source = globalThis?.__HELIOS_LAYOUT_SAMPLE_DEBUG__;\n    const debugEnabled = typeof this.debug?.enabledFor === 'function' && this.debug.enabledFor('layout-sampling');\n    if (!source && !debugEnabled) return null;\n    if (source === true) {\n      return { every: this._sampleDebugFrameInterval, previewCount: 6 };\n    }\n    if (source && typeof source === 'object') {\n      const enabled = source.enabled !== false;\n      if (!enabled && !debugEnabled) return null;\n      return {\n        every: Math.max(1, Math.floor(Number(source.every) || this._sampleDebugFrameInterval)),\n        previewCount: Math.max(1, Math.floor(Number(source.previewCount) || 6)),\n      };\n    }\n    return { every: this._sampleDebugFrameInterval, previewCount: 6 };\n  }\n\n  _emitSampleDebug(message, payload) {\n    const canUseDebugLogger = typeof this.debug?.log === 'function'\n      && (typeof this.debug?.enabledFor !== 'function' || this.debug.enabledFor('layout-sampling'));\n    if (canUseDebugLogger) {\n      this.debug.log('layout-sampling', message, payload);\n      return;\n    }\n    console.debug('[helios:layout-sampling]', message, payload);\n  }\n\n  _logSamplingTrace(stepPayload) {\n    const config = this._resolveSampleDebugConfig();\n    if (!config) return;\n    const backend = this._webgpu ? this._webgpu : this._webgl;\n    if (!backend) return;\n    const sampleFrame = backend.sampleFrame >>> 0;\n    if ((sampleFrame % config.every) !== 0) return;\n    const sampleCount = Math.max(1, Math.floor(Number(stepPayload.sampleCount) || 0));\n    const sampleChurnCount = resolveSampleChurnCount(sampleCount, stepPayload.sampleChurn);\n    const exactThreshold = Math.max(1, Math.floor(Number(stepPayload.exactRepulsionThreshold) || 0));\n    const useExactRepulsion = this._activeCount <= Math.max(sampleCount, exactThreshold);\n    const activeIds = this._topologyScratch.activeIds instanceof Uint32Array\n      ? this._topologyScratch.activeIds\n      : createEmptyUintArray();\n    const previewCount = Math.min(config.previewCount, sampleCount);\n    const samplePreview = [];\n    for (let iter = 0; iter < previewCount; iter += 1) {\n      samplePreview.push({\n        slot: iter,\n        epoch: resolveSampleEpoch(iter, sampleCount, sampleChurnCount, sampleFrame),\n        activeId: activeIds.length > 0\n          ? sampleActiveIdProgressive(\n            0,\n            iter,\n            activeIds,\n            this._activeCount,\n            backend.seed >>> 0,\n            sampleCount,\n            sampleChurnCount,\n            sampleFrame,\n          )\n          : null,\n      });\n    }\n    this._emitSampleDebug('GPU force sampling', {\n      backend: this._webgpu ? 'webgpu' : 'webgl',\n      mode: stepPayload.mode,\n      forceModel: stepPayload.forceModel,\n      activeCount: this._activeCount,\n      sampleCount,\n      sampleChurn: stepPayload.sampleChurn,\n      sampleChurnCount,\n      sampleFrame,\n      changedSlotCount: countChangedSampleSlots(sampleCount, sampleChurnCount, sampleFrame),\n      useExactRepulsion,\n      exactRepulsionThreshold: exactThreshold,\n      samplePreview,\n    });\n  }\n\n  getNodePositionView(context = {}) {\n    this._markDirtyForBackend(context);\n    this.ensureSynchronized(context);\n    if (this._webgpu || this._webgl) return null;\n\n    const network = context.network ?? this._context?.network ?? null;\n    if (!network) return null;\n    if (typeof network.withBufferAccess === 'function') {\n      return network.withBufferAccess(() => network.getNodeAttributeBuffer?.(NODE_POSITION_ATTRIBUTE)?.view ?? null);\n    }\n    return network.getNodeAttributeBuffer?.(NODE_POSITION_ATTRIBUTE)?.view ?? null;\n  }\n\n  getWebGPUPositionBuffer(context = {}) {\n    this._markDirtyForBackend(context);\n    this.ensureSynchronized(context);\n    const buffer = this._webgpu?.getPositionBuffer?.() ?? null;\n    if (!buffer) return null;\n    return {\n      buffer,\n      count: this._activeCount,\n      version: this.version,\n    };\n  }\n\n  getWebGLPositionTexture(context = {}) {\n    this._markDirtyForBackend(context);\n    this.ensureSynchronized(context);\n    const texture = this._webgl?.getPositionTexture?.() ?? null;\n    if (!texture) return null;\n    return {\n      texture,\n      count: this._nodeCapacity,\n      version: this.version,\n      meta: this._webgl?.getPositionTextureMeta?.() ?? null,\n    };\n  }\n\n  getGpuPositionResource(context = {}) {\n    this._markDirtyForBackend(context);\n    this.ensureSynchronized(context);\n    if (this._webgpu) {\n      const resource = this.getWebGPUPositionBuffer(context);\n      if (resource) return resource;\n    }\n    if (this._webgl) {\n      return this.getWebGLPositionTexture(context);\n    }\n    return null;\n  }\n\n  async snapshotNodePositions(context = {}) {\n    this._markDirtyForBackend(context);\n    this.ensureSynchronized(context);\n    if (this._webgpu) {\n      return this._webgpu.readPositionSnapshot();\n    }\n    if (this._webgl) {\n      return this._webgl.readPositionSnapshot();\n    }\n    const view = this.getNodePositionView(context);\n    if (!view || !Number.isFinite(view.length) || view.length <= 0) return null;\n    return new Float32Array(view);\n  }\n\n  _sparseReadbackKey(kind, version, idsKey) {\n    return `${kind}:${version}:${idsKey}`;\n  }\n\n  _sparseReadbackLatestKey(kind, idsKey) {\n    return `${kind}:${idsKey}`;\n  }\n\n  _getSparseReadbackCache(kind, idsKey, version, options = {}) {\n    const exact = this._sparseReadbackCache.get(this._sparseReadbackKey(kind, version, idsKey));\n    if (exact) return exact;\n    if (options.allowStaleVersion === false) return null;\n    return this._sparseReadbackLatest.get(this._sparseReadbackLatestKey(kind, idsKey)) ?? null;\n  }\n\n  _storeSparseReadbackCache(kind, idsKey, version, entry) {\n    const cached = {\n      ...entry,\n      version,\n      at: readbackNow(),\n    };\n    this._sparseReadbackCache.set(this._sparseReadbackKey(kind, version, idsKey), cached);\n    this._sparseReadbackLatest.set(this._sparseReadbackLatestKey(kind, idsKey), cached);\n    if (this._sparseReadbackCache.size > 64) {\n      const entries = Array.from(this._sparseReadbackCache.entries())\n        .sort((a, b) => (b[1]?.at ?? 0) - (a[1]?.at ?? 0));\n      this._sparseReadbackCache.clear();\n      for (let i = 0; i < Math.min(32, entries.length); i += 1) {\n        this._sparseReadbackCache.set(entries[i][0], entries[i][1]);\n      }\n    }\n    if (this._sparseReadbackLatest.size > 32) {\n      const entries = Array.from(this._sparseReadbackLatest.entries())\n        .sort((a, b) => (b[1]?.at ?? 0) - (a[1]?.at ?? 0));\n      this._sparseReadbackLatest.clear();\n      for (let i = 0; i < Math.min(16, entries.length); i += 1) {\n        this._sparseReadbackLatest.set(entries[i][0], entries[i][1]);\n      }\n    }\n  }\n\n  _scheduleSparseReadbackRefresh(kind, context, ids, idsKey, options = {}) {\n    const pendingKey = this._sparseReadbackLatestKey(kind, idsKey);\n    if (this._sparseReadbackPending.has(pendingKey)) return;\n    this._sparseReadbackPending.add(pendingKey);\n    const refreshOptions = {\n      ...options,\n      out: null,\n      preferCached: false,\n      deferReadback: false,\n      allowStaleVersion: false,\n    };\n    Promise.resolve()\n      .then(() => (kind === 'centroid'\n        ? this._snapshotNodeCentroidByIdImmediate(context, ids, refreshOptions)\n        : this._snapshotNodePositionsByIdImmediate(context, ids, refreshOptions)))\n      .then(() => {\n        context.helios?._labels?.requestFullReselect?.(`delegate-${kind}-readback-cache`);\n        context.scheduler?.requestRender?.();\n      })\n      .catch((error) => {\n        warnOnce(\n          this,\n          `sparse-readback-refresh:${kind}`,\n          `GpuForcePositionDelegate: failed to refresh sparse ${kind} readback cache.`,\n          { error },\n        );\n      })\n      .finally(() => {\n        this._sparseReadbackPending.delete(pendingKey);\n      });\n  }\n\n  async snapshotNodePositionsById(context = {}, nodeIds = [], options = {}) {\n    this._markDirtyForBackend(context);\n    this.ensureSynchronized(context);\n    const ids = normalizeReadbackNodeIds(nodeIds);\n    const count = ids.length;\n    const version = this.version;\n    const idsKey = readbackIdsSignature(ids);\n    if ((options.preferCached === true || options.deferReadback === true) && idsKey) {\n      const cached = this._getSparseReadbackCache('positions', idsKey, version, options);\n      if (cached?.positions instanceof Float32Array) {\n        this._scheduleSparseReadbackRefresh('positions', context, ids, idsKey, options);\n        return {\n          ids,\n          positions: copyCachedFloat32(cached.positions, options.out),\n          count: cached.count ?? count,\n          version: cached.version ?? version,\n          source: `${cached.source ?? 'delegate'}-cache`,\n          cached: true,\n          stale: cached.version !== version,\n        };\n      }\n      if (options.deferReadback === true) {\n        this._scheduleSparseReadbackRefresh('positions', context, ids, idsKey, options);\n        return { ids, positions: null, count, version, source: this._webgpu ? 'webgpu-deferred' : this._webgl ? 'webgl2-deferred' : 'cpu-deferred', deferred: true };\n      }\n    }\n    return this._snapshotNodePositionsByIdImmediate(context, ids, options);\n  }\n\n  async _snapshotNodePositionsByIdImmediate(context = {}, ids = createEmptyUintArray(), options = {}) {\n    const count = ids.length;\n    const version = this.version;\n    const idsKey = readbackIdsSignature(ids);\n    if (this._webgpu) {\n      const positions = await this._webgpu.readNodePositionsById(ids, options);\n      const result = positions\n        ? { ids, positions, count, version, source: 'webgpu' }\n        : { ids, positions: resolveReadbackOut(options.out, count * 3), count, version, source: 'webgpu' };\n      if (idsKey && result.positions instanceof Float32Array) {\n        this._storeSparseReadbackCache('positions', idsKey, version, {\n          positions: cloneFloat32(result.positions),\n          count,\n          source: result.source,\n        });\n      }\n      return result;\n    }\n    if (this._webgl) {\n      const positions = this._webgl.readNodePositionsById(ids, options);\n      const result = positions\n        ? { ids, positions, count, version, source: 'webgl2' }\n        : { ids, positions: resolveReadbackOut(options.out, count * 3), count, version, source: 'webgl2' };\n      if (idsKey && result.positions instanceof Float32Array) {\n        this._storeSparseReadbackCache('positions', idsKey, version, {\n          positions: cloneFloat32(result.positions),\n          count,\n          source: result.source,\n        });\n      }\n      return result;\n    }\n    const view = this.getNodePositionView(context);\n    const positions = copyPositionsFromFullSnapshot(view, ids, options.out);\n    const result = { ids, positions, count, version, source: 'cpu' };\n    if (idsKey) {\n      this._storeSparseReadbackCache('positions', idsKey, version, {\n        positions: cloneFloat32(positions),\n        count,\n        source: result.source,\n      });\n    }\n    return result;\n  }\n\n  async snapshotNodeCentroidById(context = {}, nodeIds = [], options = {}) {\n    this._markDirtyForBackend(context);\n    this.ensureSynchronized(context);\n    const ids = normalizeReadbackNodeIds(nodeIds);\n    const count = ids.length;\n    const version = this.version;\n    if (count <= 0) {\n      const centroid = resolveReadbackOut(options.out, 3);\n      centroid[0] = 0;\n      centroid[1] = 0;\n      centroid[2] = 0;\n      return { centroid, count: 0, version, source: this._webgpu ? 'webgpu' : this._webgl ? 'webgl2' : 'cpu' };\n    }\n    const idsKey = readbackIdsSignature(ids);\n    if ((options.preferCached === true || options.deferReadback === true) && idsKey) {\n      const cached = this._getSparseReadbackCache('centroid', idsKey, version, options);\n      if (cached?.centroid instanceof Float32Array) {\n        this._scheduleSparseReadbackRefresh('centroid', context, ids, idsKey, options);\n        return {\n          centroid: copyCachedFloat32(cached.centroid, options.out),\n          count: cached.count ?? count,\n          version: cached.version ?? version,\n          source: `${cached.source ?? 'delegate'}-cache`,\n          cached: true,\n          stale: cached.version !== version,\n        };\n      }\n      if (options.deferReadback === true) {\n        this._scheduleSparseReadbackRefresh('centroid', context, ids, idsKey, options);\n        return { centroid: null, count: 0, version, source: this._webgpu ? 'webgpu-deferred' : this._webgl ? 'webgl2-deferred' : 'cpu-deferred', deferred: true };\n      }\n    }\n    return this._snapshotNodeCentroidByIdImmediate(context, ids, options);\n  }\n\n  async _snapshotNodeCentroidByIdImmediate(context = {}, ids = createEmptyUintArray(), options = {}) {\n    const count = ids.length;\n    const version = this.version;\n    const idsKey = readbackIdsSignature(ids);\n    if (this._webgpu) {\n      const result = await this._webgpu.readNodeCentroidById(ids, options);\n      const resolved = {\n        centroid: result?.centroid ?? resolveReadbackOut(options.out, 3),\n        count: result?.count ?? 0,\n        version,\n        source: 'webgpu',\n      };\n      if (idsKey && resolved.centroid instanceof Float32Array) {\n        this._storeSparseReadbackCache('centroid', idsKey, version, {\n          centroid: cloneFloat32(resolved.centroid),\n          count: resolved.count,\n          source: resolved.source,\n        });\n      }\n      return resolved;\n    }\n    if (this._webgl) {\n      const result = this._webgl.readNodeCentroidById(ids, options);\n      const resolved = {\n        centroid: result?.centroid ?? resolveReadbackOut(options.out, 3),\n        count: result?.count ?? 0,\n        version,\n        source: 'webgl2',\n      };\n      if (idsKey && resolved.centroid instanceof Float32Array) {\n        this._storeSparseReadbackCache('centroid', idsKey, version, {\n          centroid: cloneFloat32(resolved.centroid),\n          count: resolved.count,\n          source: resolved.source,\n        });\n      }\n      return resolved;\n    }\n    const view = this.getNodePositionView(context);\n    const readableIds = filterReadableNodeIds(ids, Math.floor((view?.length ?? 0) / 3));\n    const packed = copyPositionsFromFullSnapshot(view, readableIds);\n    const result = centroidFromPackedPositions(packed, readableIds.length, options.out);\n    const resolved = { centroid: result.centroid, count: result.count, version, source: 'cpu' };\n    if (idsKey) {\n      this._storeSparseReadbackCache('centroid', idsKey, version, {\n        centroid: cloneFloat32(result.centroid),\n        count: result.count,\n        source: resolved.source,\n      });\n    }\n    return resolved;\n  }\n\n  writePositionSnapshot(snapshot, options = {}) {\n    if (!(snapshot instanceof Float32Array) || snapshot.length <= 0) return false;\n    const context = options && typeof options === 'object' ? options : {};\n    this._markDirtyForBackend(context);\n    this.ensureSynchronized(context);\n    const backend = this._webgpu ?? this._webgl;\n    if (!backend || typeof backend.writePositionSnapshot !== 'function') return false;\n    const wroteBackend = backend.writePositionSnapshot(snapshot, {\n      center: options.center ?? this.options.center,\n      outputScale: options.outputScale ?? this.options.outputScale,\n    });\n    if (!wroteBackend) return false;\n    this.bumpVersion();\n    return true;\n  }\n\n  async synchronizeNodePositionsToNetwork(context = {}) {\n    const network = context.network ?? this._context?.network ?? null;\n    if (!network) return false;\n    const snapshot = await this.snapshotNodePositions(context);\n    if (!snapshot || !Number.isFinite(snapshot.length) || snapshot.length <= 0) return false;\n\n    let wrote = false;\n    const apply = () => {\n      const buffer = network.getNodeAttributeBuffer?.(NODE_POSITION_ATTRIBUTE) ?? null;\n      const view = buffer?.view ?? null;\n      if (!view || !Number.isFinite(view.length) || view.length <= 0) return;\n      const count = Math.min(view.length, snapshot.length);\n      if (count <= 0) return;\n      view.set(snapshot.subarray(0, count), 0);\n      wrote = true;\n    };\n\n    if (typeof network.withBufferAccess === 'function') {\n      network.withBufferAccess(apply);\n    } else {\n      apply();\n    }\n    return wrote;\n  }\n\n  async flattenNodeDepthToPlane(context = {}, zValue = 0) {\n    const targetZ = Number.isFinite(zValue) ? zValue : 0;\n    this._markDirtyForBackend(context);\n    this.ensureSynchronized(context);\n    const backend = this._webgpu ?? this._webgl;\n    if (!backend || typeof backend.writePositionSnapshot !== 'function') return false;\n\n    const snapshot = await this.snapshotNodePositions(context);\n    if (!(snapshot instanceof Float32Array) || snapshot.length <= 0) return false;\n\n    const network = context.network ?? this._context?.network ?? null;\n    let activeIds = null;\n    const readActiveIds = () => {\n      activeIds = network?.nodeIndices instanceof Uint32Array ? network.nodeIndices : null;\n    };\n    if (typeof network?.withBufferAccess === 'function') network.withBufferAccess(readActiveIds);\n    else readActiveIds();\n    const activeCount = activeIds?.length ?? 0;\n    if (activeCount <= 0) return false;\n\n    let changed = false;\n    for (let i = 0; i < activeCount; i += 1) {\n      const nodeId = activeIds[i] >>> 0;\n      const offset = (nodeId * 3) + 2;\n      const currentZ = Number(snapshot[offset]);\n      if (!Number.isFinite(currentZ)) continue;\n      if (Math.abs(currentZ - targetZ) <= 1e-9) continue;\n      snapshot[offset] = targetZ;\n      changed = true;\n    }\n    if (!changed) return false;\n\n    const wroteBackend = backend.writePositionSnapshot(snapshot, {\n      center: this.options.center,\n      outputScale: this.options.outputScale,\n    });\n    if (!wroteBackend) return false;\n    this.bumpVersion();\n    return true;\n  }\n\n  async injectPlanarDepthJitter(context = {}, amplitude = 0) {\n    const safeAmplitude = Number(amplitude);\n    if (!(safeAmplitude > 0)) return false;\n    this._markDirtyForBackend(context);\n    this.ensureSynchronized(context);\n    const backend = this._webgpu ?? this._webgl;\n    if (!backend || typeof backend.writePositionSnapshot !== 'function') return false;\n    const snapshot = await this.snapshotNodePositions(context);\n    if (!(snapshot instanceof Float32Array) || snapshot.length <= 0) return false;\n\n    const network = context.network ?? this._context?.network ?? null;\n    let activeIds = null;\n    const readActiveIds = () => {\n      activeIds = network?.nodeIndices instanceof Uint32Array ? network.nodeIndices : null;\n    };\n    if (typeof network?.withBufferAccess === 'function') network.withBufferAccess(readActiveIds);\n    else readActiveIds();\n    const activeCount = activeIds?.length ?? 0;\n    if (activeCount <= 0) return false;\n\n    let minZ = Infinity;\n    let maxZ = -Infinity;\n    for (let i = 0; i < activeCount; i += 1) {\n      const nodeId = activeIds[i] >>> 0;\n      const z = Number(snapshot[(nodeId * 3) + 2]);\n      const safeZ = Number.isFinite(z) ? z : this.options.center[2];\n      if (safeZ < minZ) minZ = safeZ;\n      if (safeZ > maxZ) maxZ = safeZ;\n    }\n    const zRange = Number.isFinite(minZ) && Number.isFinite(maxZ) ? (maxZ - minZ) : 0;\n    const tolerance = Math.max(1e-6, safeAmplitude * 0.05);\n    if (zRange > tolerance) return false;\n\n    let mean = 0;\n    for (let i = 0; i < activeCount; i += 1) {\n      const nodeId = activeIds[i] >>> 0;\n      mean += ((((hash32(nodeId + 1) + 0.5) / 4294967296) - 0.5) * safeAmplitude);\n    }\n    mean /= Math.max(1, activeCount);\n\n    for (let i = 0; i < activeCount; i += 1) {\n      const nodeId = activeIds[i] >>> 0;\n      const offset = (nodeId * 3) + 2;\n      const currentZ = Number(snapshot[offset]);\n      const baseZ = Number.isFinite(currentZ) ? currentZ : this.options.center[2];\n      const noise = ((((hash32(nodeId + 1) + 0.5) / 4294967296) - 0.5) * safeAmplitude) - mean;\n      snapshot[offset] = baseZ + noise;\n    }\n\n    const wroteBackend = backend.writePositionSnapshot(snapshot, {\n      center: this.options.center,\n      outputScale: this.options.outputScale,\n    });\n    if (!wroteBackend) return false;\n    this.bumpVersion();\n    return true;\n  }\n}\n\nexport default GpuForcePositionDelegate;\n","const DEFAULT_BASE_OPTIONS = Object.freeze({\n  \"outputScale\": 6.5\n});\n\n/**\n * Default model used to tune GPU force layout options from graph statistics.\n *\n * @public\n */\nexport const DEFAULT_LAYOUT_TUNING_MODEL = Object.freeze({\n  \"version\": 1,\n  \"featureNames\": [\n    \"bias\",\n    \"smallGraph\",\n    \"density\",\n    \"avgDegreeNorm\",\n    \"degreeVarianceNorm\",\n    \"componentProxy\"\n  ],\n  \"parameters\": {\n    \"outputScale\": {\n      \"coefficients\": [\n        0.245287,\n        1.318114,\n        -0.940403,\n        0.619971,\n        -0.354482,\n        0.048489\n      ],\n      \"clamp\": [\n        4,\n        20\n      ]\n    }\n  }\n});\n\nfunction clamp(value, min, max) {\n  return Math.min(max, Math.max(min, value));\n}\n\nfunction toFinite(value, fallback = 0) {\n  const numeric = Number(value);\n  return Number.isFinite(numeric) ? numeric : fallback;\n}\n\nfunction resolveCount(value, fallback = 0) {\n  const numeric = Math.floor(Number(value));\n  return Number.isFinite(numeric) && numeric >= 0 ? numeric : fallback;\n}\n\nfunction getArrayLikeLength(value) {\n  const length = Number(value?.length);\n  return Number.isFinite(length) && length >= 0 ? Math.floor(length) : 0;\n}\n\nfunction readNetworkSnapshot(network) {\n  const read = () => {\n    const nodeCount = resolveCount(\n      network?.nodeCount ?? network?.nodeCapacity ?? getArrayLikeLength(network?.nodeIndices),\n      0,\n    );\n    const edgeCount = resolveCount(\n      network?.edgeCount ?? network?.edgesCount ?? getArrayLikeLength(network?.edgeIndices),\n      0,\n    );\n    const edgesView = network?.edgesView ?? null;\n    const edgePairLimit = Math.min(getArrayLikeLength(edgesView), 40000);\n    return {\n      nodeCount,\n      edgeCount,\n      hasEdgeInfo: Boolean(network && (\n        network.edgeCount != null\n        || network.edgesCount != null\n        || network.edgeIndices != null\n        || network.edgesView != null\n      )),\n      edgePairs: edgesView ? Array.from(edgesView.slice ? edgesView.slice(0, edgePairLimit) : edgesView).slice(0, edgePairLimit) : null,\n    };\n  };\n  if (typeof network?.withBufferAccess === 'function') {\n    return network.withBufferAccess(read);\n  }\n  return read();\n}\nfunction estimateDegreeStats(snapshot) {\n  const nodeCount = Math.max(0, snapshot.nodeCount);\n  const edgeCount = Math.max(0, snapshot.edgeCount);\n  const avgDegree = nodeCount > 0 ? (2 * edgeCount) / nodeCount : 0;\n  const edgePairs = snapshot.edgePairs;\n  if (!snapshot.hasEdgeInfo) {\n    return { avgDegree, degreeVariance: avgDegree, isolateFraction: 0, componentProxy: 0 };\n  }\n  if (edgeCount <= 0) {\n    return {\n      avgDegree,\n      degreeVariance: 0,\n      isolateFraction: nodeCount > 0 ? 1 : 0,\n      componentProxy: nodeCount > 1 ? 1 : 0,\n    };\n  }\n  if (!edgePairs || edgePairs.length < 2 || nodeCount <= 0) {\n    return { avgDegree, degreeVariance: avgDegree, isolateFraction: 0, componentProxy: 0 };\n  }\n  const availablePairs = Math.floor(edgePairs.length / 2);\n  const pairLimit = Math.min(availablePairs, 20000);\n  const stride = Math.max(1, Math.floor(availablePairs / Math.max(1, pairLimit)));\n  const degree = new Map();\n  let sampledPairs = 0;\n  for (let pair = 0; pair < availablePairs && sampledPairs < pairLimit; pair += stride) {\n    const a = edgePairs[pair * 2];\n    const b = edgePairs[(pair * 2) + 1];\n    if (!Number.isFinite(a) || !Number.isFinite(b) || a === b) continue;\n    degree.set(a, (degree.get(a) ?? 0) + 1);\n    degree.set(b, (degree.get(b) ?? 0) + 1);\n    sampledPairs += 1;\n  }\n  const scale = edgeCount > sampledPairs && sampledPairs > 0 ? edgeCount / sampledPairs : 1;\n  let sum = 0;\n  let sumSq = 0;\n  for (const value of degree.values()) {\n    const d = value * scale;\n    sum += d;\n    sumSq += d * d;\n  }\n  const seenNodes = Math.min(nodeCount, degree.size);\n  const unseenNodes = Math.max(0, nodeCount - seenNodes);\n  const mean = sum / nodeCount;\n  const isolateFraction = nodeCount > 0 ? unseenNodes / nodeCount : 0;\n  return {\n    avgDegree: sampledPairs < edgeCount ? avgDegree : mean,\n    degreeVariance: Math.max(0, (sumSq / nodeCount) - (mean * mean)),\n    isolateFraction,\n    componentProxy: isolateFraction,\n  };\n}\n/**\n * Extract graph features used by the layout tuning model.\n *\n * @public\n * @param {object} network - Helios network or network-like object.\n * @param {object} [hints] - Optional feature overrides such as nodeCount or edgeCount.\n * @returns {object} Feature record and model input vector.\n */\nexport function extractLayoutTuningFeatures(network, hints = {}) {\n  const snapshot = readNetworkSnapshot(network);\n  const nodeCount = Math.max(0, resolveCount(hints.nodeCount ?? snapshot.nodeCount, snapshot.nodeCount));\n  const edgeCount = Math.max(0, resolveCount(hints.edgeCount ?? snapshot.edgeCount, snapshot.edgeCount));\n  const stats = estimateDegreeStats({ ...snapshot, nodeCount, edgeCount });\n  const avgDegree = toFinite(hints.avgDegree, stats.avgDegree || (nodeCount > 0 ? (2 * edgeCount) / nodeCount : 0));\n  const density = nodeCount > 1 ? clamp((2 * edgeCount) / (nodeCount * (nodeCount - 1)), 0, 1) : 0;\n  const degreeVariance = toFinite(hints.degreeVariance, stats.degreeVariance);\n  const communityCount = resolveCount(hints.communityCount, 0);\n  const logNodeCount = Math.log10(Math.max(2, nodeCount));\n  const smallGraph = clamp((Math.log10(200) - logNodeCount) / (Math.log10(200) - Math.log10(5)), 0, 1);\n  return {\n    nodeCount,\n    edgeCount,\n    avgDegree,\n    density,\n    degreeVariance,\n    isolateFraction: toFinite(hints.isolateFraction, stats.isolateFraction),\n    componentProxy: toFinite(hints.componentProxy, stats.componentProxy),\n    communityCount,\n    vector: [\n      1,\n      smallGraph,\n      density,\n      clamp(avgDegree / 50, 0, 2),\n      clamp(degreeVariance / Math.max(1, avgDegree * avgDegree), 0, 2),\n      toFinite(hints.componentProxy, stats.componentProxy),\n    ],\n  };\n}\nfunction dot(coefficients, vector) {\n  let total = 0;\n  for (let i = 0; i < coefficients.length; i += 1) total += (Number(coefficients[i]) || 0) * (Number(vector[i]) || 0);\n  return total;\n}\n\nfunction resolveModel(model) {\n  if (model === false || model == null) return null;\n  if (typeof model === 'function') return model;\n  if (model && typeof model === 'object') return model;\n  return DEFAULT_LAYOUT_TUNING_MODEL;\n}\n\n/**\n * Predict layout option overrides for a network using the layout tuning model.\n *\n * @public\n * @param {object} network - Helios network or network-like object.\n * @param {object} [options] - Prediction options.\n * @param {object|Function|false|null} [options.model] - Model descriptor, custom predictor, or false to disable.\n * @param {object} [options.baseOptions] - Base layout options multiplied by model outputs.\n * @param {object} [options.hints] - Optional feature overrides.\n * @returns {object} Predicted layout options.\n */\nexport function predictLayoutTuningOptions(network, {\n  model = DEFAULT_LAYOUT_TUNING_MODEL,\n  baseOptions = DEFAULT_BASE_OPTIONS,\n  hints = {},\n} = {}) {\n  const resolvedModel = resolveModel(model);\n  if (!resolvedModel) return {};\n  const features = extractLayoutTuningFeatures(network, hints);\n  if (typeof resolvedModel === 'function') return resolvedModel(features, baseOptions) ?? {};\n  const parameters = resolvedModel.parameters ?? DEFAULT_LAYOUT_TUNING_MODEL.parameters;\n  const next = {};\n  for (const [key, descriptor] of Object.entries(parameters)) {\n    const base = toFinite(baseOptions[key], DEFAULT_BASE_OPTIONS[key]);\n    if (!Number.isFinite(base)) continue;\n    const multiplier = Math.exp(dot(descriptor.coefficients ?? [], features.vector));\n    const [min, max] = descriptor.clamp ?? [Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY];\n    next[key] = clamp(base * multiplier, min, max);\n  }\n  return next;\n}\n","import { Layout, withLogScaleBinding, withVelocityRetentionBinding } from './Layout.js';\nimport { GpuForcePositionDelegate } from '../delegates/GpuForcePositionDelegate.js';\nimport { DEFAULT_LAYOUT_TUNING_MODEL, predictLayoutTuningOptions } from './layoutTuningModel.generated.js';\n\nconst DEFAULT_OPTIONS = {\n  mode: '3d',\n  forceModel: 'linear',\n  layoutScheduling: 'auto',\n  layoutChunkCount: 2,\n  updateIntervalMs: 0,\n  center: [0, 0, 0],\n  radius: 220,\n  depth: 140,\n  sampleCount: null,\n  sampleCount2D: 64,\n  sampleCount3D: 96,\n  sampleChurn: 0,\n  maxNeighborsPerNode: 64,\n  outputScale: 6.5,\n  linkDistance: 1,\n  kRepulsion: 1,\n  kAttraction: 0.62,\n  kGravity: 0.001,\n  edgeWeightAttribute: null,\n  nodeMassAttribute: null,\n  forceNormalizationType: 'local-degree',\n  umapA: 1.5769434601962196,\n  umapB: 0.8950608779914887,\n  umapGamma: 1,\n  umapNeighborCount: 15,\n  umapNegativeSampleRate: 5,\n  umapEpochs: null,\n  eta: 0.4,\n  damping: 0.82,\n  maxStep: 2.5,\n  minDistance: 0.15,\n  alpha: 1,\n  alphaDecay: 0.003,\n  alphaTarget: 0,\n  alphaMin: 0.001,\n  autoStopAtAlphaMin: true,\n  recenter: true,\n  rotationDamping: 0.6,\n  componentForces: 'auto',\n  componentMode: 'weak',\n  componentSeeding: false,\n  componentGravity: true,\n  componentMainGravityScale: 1.5,\n  componentSingletonGravityScale: 0.25,\n};\n\nconst DEFAULT_UMAP_OUTPUT_SCALE = 24;\nconst OUTPUT_SCALE_CONTROL_MAX = 100;\nconst DEFAULT_UMAP_SAMPLE_CHURN = 0.01;\nconst DEFAULT_UMAP_ALPHA_DECAY = 0.0025;\nconst AUTO_TUNED_OPTION_KEYS = Object.freeze([\n  'maxNeighborsPerNode',\n  'sampleCount2D',\n  'sampleCount3D',\n  'sampleChurn',\n  'outputScale',\n]);\nconst AUTO_TUNE_MIN_NODE_COUNT = 10_000;\nconst AUTO_TUNE_MAX_NODE_COUNT = 1_000_000;\nconst AUTO_TUNE_TARGET_OPTIONS = Object.freeze({\n  maxNeighborsPerNode: 20,\n  sampleCount2D: 10,\n  sampleCount3D: 10,\n  sampleChurn: 0.05,\n});\n\nfunction toFinite(value, fallback = 0) {\n  const numeric = Number(value);\n  return Number.isFinite(numeric) ? numeric : fallback;\n}\n\nfunction hasOwn(object, key) {\n  return Boolean(object) && Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction normalizeCenter(center) {\n  if (!Array.isArray(center)) return [0, 0, 0];\n  return [\n    toFinite(center[0], 0),\n    toFinite(center[1], 0),\n    toFinite(center[2], 0),\n  ];\n}\n\nfunction createZeroableUnitLogBinding(binding) {\n  return withLogScaleBinding({\n    min: 0.000001,\n    max: 1,\n    inputMin: 0,\n    inputMax: 1,\n    ...binding,\n  });\n}\n\nfunction shouldAutoStopAtAlphaMin(alpha, alphaMin) {\n  const current = Number(alpha);\n  const min = Number(alphaMin);\n  if (!Number.isFinite(current) || !Number.isFinite(min)) return false;\n  return current <= (min + 1e-9);\n}\n\nfunction isUmapForceModel(value) {\n  return String(value ?? '').trim().toLowerCase() === 'umap';\n}\n\nfunction normalizeForceNormalizationType(value) {\n  const normalized = String(value ?? '').trim().toLowerCase();\n  if (normalized === 'degree' || normalized === 'endpoint-degree') return 'degree';\n  if (normalized === 'strength' || normalized === 'weighted-strength') return 'strength';\n  if (normalized === 'none' || normalized === 'off' || normalized === 'disabled') return 'none';\n  return 'local-degree';\n}\n\nfunction normalizeLayoutScheduling(value) {\n  const normalized = String(value ?? '').trim().toLowerCase();\n  if (normalized === 'chunk' || normalized === 'chunked') return 'chunked';\n  if (normalized === 'full' || normalized === 'legacy' || normalized === 'off') return 'full';\n  return 'auto';\n}\n\nfunction normalizeComponentForces(value) {\n  if (value === false) return 'off';\n  const normalized = String(value ?? '').trim().toLowerCase();\n  if (normalized === 'off' || normalized === 'false' || normalized === 'disabled' || normalized === 'none') {\n    return 'off';\n  }\n  if (normalized === 'halo') return 'halo';\n  if (normalized === 'supernode' || normalized === 'supernode-experimental') return 'supernode-experimental';\n  return 'auto';\n}\n\nfunction disableUmapComponentOptions(options) {\n  if (!isUmapForceModel(options?.forceModel)) return options;\n  options.componentForces = 'off';\n  options.componentSeeding = false;\n  options.componentGravity = false;\n  return options;\n}\n\nfunction resolveLayoutChunkNodeCount(value) {\n  const numeric = Math.floor(Number(value));\n  if (!Number.isFinite(numeric) || numeric <= 0) return 65_536;\n  return Math.max(1, numeric);\n}\n\nfunction resolveLayoutChunkCount(value) {\n  const numeric = Math.floor(Number(value));\n  if (!Number.isFinite(numeric)) return DEFAULT_OPTIONS.layoutChunkCount;\n  return Math.max(2, Math.min(10, numeric));\n}\n\nfunction clamp01(value) {\n  if (!Number.isFinite(value)) return 0;\n  return Math.max(0, Math.min(1, value));\n}\n\nfunction resolveLayoutNodeCount(network) {\n  if (!network || typeof network !== 'object') return 0;\n  const directCount = Number(network.nodeCount ?? network.nodeCapacity);\n  if (Number.isFinite(directCount) && directCount >= 0) {\n    return Math.max(0, Math.floor(directCount));\n  }\n  const indexedCount = Number(network.nodeIndices?.length);\n  if (Number.isFinite(indexedCount) && indexedCount >= 0) {\n    return Math.max(0, Math.floor(indexedCount));\n  }\n  return 0;\n}\n\nfunction resolveAutoTuneProgress(nodeCount) {\n  const safeNodeCount = Math.max(0, Math.floor(Number(nodeCount) || 0));\n  if (safeNodeCount <= AUTO_TUNE_MIN_NODE_COUNT) return 0;\n  if (safeNodeCount >= AUTO_TUNE_MAX_NODE_COUNT) return 1;\n  const minLog = Math.log10(AUTO_TUNE_MIN_NODE_COUNT);\n  const maxLog = Math.log10(AUTO_TUNE_MAX_NODE_COUNT);\n  const nodeLog = Math.log10(safeNodeCount);\n  return clamp01((nodeLog - minLog) / (maxLog - minLog));\n}\n\nfunction interpolateAutoTunedValue(base, target, progress, { round = false } = {}) {\n  const safeBase = Number(base);\n  const safeTarget = Number(target);\n  if (!Number.isFinite(safeBase)) return safeTarget;\n  if (!Number.isFinite(safeTarget)) return safeBase;\n  const value = safeBase + ((safeTarget - safeBase) * clamp01(progress));\n  return round ? Math.round(value) : value;\n}\n\nexport function resolveGpuForceAutoTuning(nodeCount, baseOptions = {}, modelOptions = {}) {\n  const progress = resolveAutoTuneProgress(nodeCount);\n  const model = modelOptions.model === undefined ? DEFAULT_LAYOUT_TUNING_MODEL : modelOptions.model;\n  const modelTuned = model === false || isUmapForceModel(modelOptions.forceModel)\n    ? {}\n    : predictLayoutTuningOptions(modelOptions.network ?? null, {\n        model,\n        baseOptions: {\n          outputScale: baseOptions.outputScale ?? DEFAULT_OPTIONS.outputScale,\n        },\n        hints: {\n          nodeCount,\n          edgeCount: modelOptions.edgeCount,\n          avgDegree: modelOptions.avgDegree,\n          communityCount: modelOptions.communityCount,\n        },\n      });\n  return {\n    maxNeighborsPerNode: interpolateAutoTunedValue(\n      baseOptions.maxNeighborsPerNode ?? DEFAULT_OPTIONS.maxNeighborsPerNode,\n      AUTO_TUNE_TARGET_OPTIONS.maxNeighborsPerNode,\n      progress,\n      { round: true },\n    ),\n    sampleCount2D: interpolateAutoTunedValue(\n      baseOptions.sampleCount2D ?? DEFAULT_OPTIONS.sampleCount2D,\n      AUTO_TUNE_TARGET_OPTIONS.sampleCount2D,\n      progress,\n      { round: true },\n    ),\n    sampleCount3D: interpolateAutoTunedValue(\n      baseOptions.sampleCount3D ?? DEFAULT_OPTIONS.sampleCount3D,\n      AUTO_TUNE_TARGET_OPTIONS.sampleCount3D,\n      progress,\n      { round: true },\n    ),\n    sampleChurn: interpolateAutoTunedValue(\n      baseOptions.sampleChurn ?? DEFAULT_OPTIONS.sampleChurn,\n      AUTO_TUNE_TARGET_OPTIONS.sampleChurn,\n      progress,\n    ),\n    linkDistance: baseOptions.linkDistance ?? DEFAULT_OPTIONS.linkDistance,\n    minDistance: baseOptions.minDistance ?? DEFAULT_OPTIONS.minDistance,\n    kRepulsion: baseOptions.kRepulsion ?? DEFAULT_OPTIONS.kRepulsion,\n    kAttraction: baseOptions.kAttraction ?? DEFAULT_OPTIONS.kAttraction,\n    kGravity: baseOptions.kGravity ?? DEFAULT_OPTIONS.kGravity,\n    outputScale: modelTuned.outputScale ?? (baseOptions.outputScale ?? DEFAULT_OPTIONS.outputScale),\n  };\n}\n\nfunction applyGpuForceAutoTuning(options, explicitOptions, network, baseAutoTuneOptions) {\n  const nodeCount = resolveLayoutNodeCount(network);\n  const tuned = resolveGpuForceAutoTuning(nodeCount, baseAutoTuneOptions, {\n    network,\n    model: options.skipTuningModel || options.umapHasInitialPositions ? false : options.tuningModel,\n    forceModel: options.forceModel,\n  });\n  const next = { ...options };\n  for (const key of AUTO_TUNED_OPTION_KEYS) {\n    if (!hasOwn(explicitOptions, key)) {\n      next[key] = tuned[key];\n    }\n  }\n  return next;\n}\n\nfunction createAutoTuneBaseOptions(options = {}) {\n  return {\n    maxNeighborsPerNode: options.maxNeighborsPerNode ?? DEFAULT_OPTIONS.maxNeighborsPerNode,\n    sampleCount2D: options.sampleCount2D ?? DEFAULT_OPTIONS.sampleCount2D,\n    sampleCount3D: options.sampleCount3D ?? DEFAULT_OPTIONS.sampleCount3D,\n    sampleChurn: options.sampleChurn ?? DEFAULT_OPTIONS.sampleChurn,\n    linkDistance: options.linkDistance ?? DEFAULT_OPTIONS.linkDistance,\n    minDistance: options.minDistance ?? DEFAULT_OPTIONS.minDistance,\n    kRepulsion: options.kRepulsion ?? DEFAULT_OPTIONS.kRepulsion,\n    kAttraction: options.kAttraction ?? DEFAULT_OPTIONS.kAttraction,\n    kGravity: options.kGravity ?? DEFAULT_OPTIONS.kGravity,\n    outputScale: options.outputScale ?? DEFAULT_OPTIONS.outputScale,\n  };\n}\n\n/**\n * GPU-backed force layout that can run through WebGPU or WebGL2 delegates.\n *\n * @public\n * @param {import('helios-network').default} network - Source graph.\n * @param {import('../pipeline/VisualAttributes.js').VisualAttributes} visuals\n * Visual attribute owner.\n * @param {object} [options] - Force, UMAP-like force, sampling, damping,\n * recentering, and renderer delegate options.\n * @remarks Renderer support and graph size determine whether WebGPU or WebGL2\n * backing is selected. Position output is written into Helios visual position\n * buffers for rendering.\n */\nexport class GpuForceLayout extends Layout {\n  constructor(network, visuals, options = {}) {\n    super(network, visuals);\n    const normalizedMode = options.mode === '2d' ? '2d' : '3d';\n    const normalized = {\n      ...DEFAULT_OPTIONS,\n      ...options,\n      mode: normalizedMode,\n      center: normalizeCenter(options.center ?? DEFAULT_OPTIONS.center),\n      layoutScheduling: normalizeLayoutScheduling(options.layoutScheduling ?? DEFAULT_OPTIONS.layoutScheduling),\n      layoutChunkCount: resolveLayoutChunkCount(options.layoutChunkCount),\n      layoutChunkNodeCount: options.layoutChunkNodeCount == null\n        ? null\n        : resolveLayoutChunkNodeCount(options.layoutChunkNodeCount),\n      componentForces: normalizeComponentForces(options.componentForces ?? DEFAULT_OPTIONS.componentForces),\n    };\n    if (isUmapForceModel(normalized.forceModel)) {\n      if (options.outputScale == null) normalized.outputScale = DEFAULT_UMAP_OUTPUT_SCALE;\n      if (options.kRepulsion == null) normalized.kRepulsion = 1;\n      if (options.kAttraction == null) normalized.kAttraction = 1;\n      if (options.kGravity == null) normalized.kGravity = 0;\n      if (options.eta == null) normalized.eta = 1;\n      if (options.alphaDecay == null) normalized.alphaDecay = DEFAULT_UMAP_ALPHA_DECAY;\n      if (options.sampleChurn == null) normalized.sampleChurn = DEFAULT_UMAP_SAMPLE_CHURN;\n    }\n    disableUmapComponentOptions(normalized);\n    this._autoTuneExplicitKeys = new Set(\n      AUTO_TUNED_OPTION_KEYS.filter((key) => hasOwn(options, key)),\n    );\n    this._autoTuneBaseOptions = createAutoTuneBaseOptions(normalized);\n    this.options = applyGpuForceAutoTuning(normalized, options, network, this._autoTuneBaseOptions);\n    this.helios = options.helios ?? null;\n    this.positionDelegate = new GpuForcePositionDelegate(this.options);\n    this.lastUpdate = 0;\n  }\n\n  getPositionDelegate() {\n    return this.positionDelegate;\n  }\n\n  async initialize() {\n    this._updateRequested = true;\n  }\n\n  shouldRun() {\n    return !this.isPositionHandoffPending();\n  }\n\n  step(deltaMs = 16) {\n    const changed = this.positionDelegate.step(this._buildDelegateContext(deltaMs));\n    this.lastUpdate = performance.now();\n    this._updateRequested = false;\n    if (\n      this.options.autoStopAtAlphaMin !== false\n      && shouldAutoStopAtAlphaMin(this.positionDelegate.alpha, this.options.alphaMin ?? DEFAULT_OPTIONS.alphaMin)\n    ) {\n      this.helios?.stopLayout?.('alpha-min');\n    }\n    if (changed) {\n      this.emitUpdate({\n        timestamp: performance.now(),\n        layoutElapsedMs: deltaMs,\n        delegateChanged: true,\n      });\n      this.helios?.scheduler?.requestRender?.();\n    }\n    return changed;\n  }\n\n  resize(size) {\n    if (!size) return;\n    this.positionDelegate.updateOptions({ center: normalizeCenter(this.options.center) });\n  }\n\n  _getAutoTuneExplicitKeys() {\n    if (!(this._autoTuneExplicitKeys instanceof Set)) {\n      this._autoTuneExplicitKeys = new Set();\n    }\n    return this._autoTuneExplicitKeys;\n  }\n\n  _getAutoTuneBaseOptions() {\n    if (!this._autoTuneBaseOptions || typeof this._autoTuneBaseOptions !== 'object') {\n      this._autoTuneBaseOptions = createAutoTuneBaseOptions(this.options);\n    }\n    return this._autoTuneBaseOptions;\n  }\n\n  syncAutoSettingsForNetwork(network = this.network, { reheat = false, reason = 'layout-auto-tune' } = {}) {\n    if (network) {\n      this.network = network;\n    }\n    const explicitKeys = this._getAutoTuneExplicitKeys();\n    const baseAutoTuneOptions = this._getAutoTuneBaseOptions();\n    const explicitOptions = Object.fromEntries(\n      Array.from(explicitKeys, (key) => [key, this.options?.[key]]),\n    );\n    const nextOptions = applyGpuForceAutoTuning(\n      this.options,\n      explicitOptions,\n      this.network,\n      baseAutoTuneOptions,\n    );\n    let changed = false;\n    for (const key of AUTO_TUNED_OPTION_KEYS) {\n      if (!explicitKeys.has(key) && nextOptions[key] !== this.options[key]) {\n        changed = true;\n        break;\n      }\n    }\n    if (!changed) return false;\n    this.options = nextOptions;\n    this.positionDelegate?.updateOptions?.(this.options);\n    if (reheat) {\n      this._applyReheatAlpha();\n      super.reheat(reason);\n    }\n    return true;\n  }\n\n  _applyReheatAlpha() {\n    this.positionDelegate.updateOptions({\n      alpha: Number(this.options.alpha ?? DEFAULT_OPTIONS.alpha),\n    });\n    this.positionDelegate.resetAnnealing?.();\n  }\n\n  setSettings(next = {}, { reheat = false, reason = 'layout-settings' } = {}) {\n    if (!next || typeof next !== 'object') return this;\n    const prevForceModel = this.options.forceModel;\n    const explicitKeys = this._getAutoTuneExplicitKeys();\n    const baseAutoTuneOptions = this._getAutoTuneBaseOptions();\n    for (const key of AUTO_TUNED_OPTION_KEYS) {\n      if (hasOwn(next, key)) {\n        explicitKeys.add(key);\n      }\n    }\n    this.options = {\n      ...this.options,\n      ...next,\n      center: normalizeCenter(next.center ?? this.options.center),\n      mode: (next.mode ?? this.options.mode) === '3d' ? '3d' : '2d',\n      layoutScheduling: normalizeLayoutScheduling(next.layoutScheduling ?? this.options.layoutScheduling),\n      layoutChunkCount: resolveLayoutChunkCount(next.layoutChunkCount ?? this.options.layoutChunkCount),\n      layoutChunkNodeCount: next.layoutChunkNodeCount == null\n        ? (hasOwn(next, 'layoutChunkCount') ? null : this.options.layoutChunkNodeCount)\n        : resolveLayoutChunkNodeCount(next.layoutChunkNodeCount),\n      componentForces: normalizeComponentForces(next.componentForces ?? this.options.componentForces),\n    };\n    if (isUmapForceModel(this.options.forceModel) && !isUmapForceModel(prevForceModel)) {\n      if (next.outputScale == null) this.options.outputScale = DEFAULT_UMAP_OUTPUT_SCALE;\n      if (next.kRepulsion == null) this.options.kRepulsion = 1;\n      if (next.kAttraction == null) this.options.kAttraction = 1;\n      if (next.kGravity == null) this.options.kGravity = 0;\n      if (next.eta == null) this.options.eta = 1;\n      if (next.alphaDecay == null) this.options.alphaDecay = DEFAULT_UMAP_ALPHA_DECAY;\n      if (next.sampleChurn == null) this.options.sampleChurn = DEFAULT_UMAP_SAMPLE_CHURN;\n    }\n    disableUmapComponentOptions(this.options);\n    if (!explicitKeys.has('sampleChurn')) {\n      baseAutoTuneOptions.sampleChurn = this.options.sampleChurn;\n    }\n    this.options = applyGpuForceAutoTuning(\n      this.options,\n      Object.fromEntries(Array.from(explicitKeys, (key) => [key, this.options[key]])),\n      this.network,\n      baseAutoTuneOptions,\n    );\n    this.positionDelegate.updateOptions(this.options);\n    if (reheat) {\n      this._applyReheatAlpha();\n      super.reheat(reason);\n    } else {\n      this.requestUpdate();\n    }\n    return this;\n  }\n\n  reheat(reason = 'layout') {\n    this._applyReheatAlpha();\n    super.reheat(reason);\n    return this;\n  }\n\n  seedFromNetworkPositions(options = {}) {\n    this.positionDelegate.resetDynamicStateFromNetwork({\n      ...this._buildDelegateContext(0),\n      ...options,\n    });\n    this.requestUpdate();\n    this.emitUpdate({ timestamp: performance.now(), layoutElapsedMs: 0 });\n    this.helios?.scheduler?.requestRender?.();\n    return this;\n  }\n\n  getParameterBindings() {\n    const sampleKey = this.options.mode === '3d' ? 'sampleCount3D' : 'sampleCount2D';\n    const sampleLabel = 'Repulsion samples';\n    const umapModel = isUmapForceModel(this.options.forceModel);\n    const bindings = [\n      {\n        key: 'alphaCurrent',\n        label: 'Temp.',\n        type: 'display',\n        get: () => Number(this.positionDelegate?.alpha ?? this.options.alpha ?? DEFAULT_OPTIONS.alpha),\n        format: (value) => Number(value).toFixed(4),\n        history: {\n          length: 20,\n          sampleMs: 1500,\n          scale: 'log',\n          min: () => {\n            const alphaMin = Number(this.options.alphaMin ?? DEFAULT_OPTIONS.alphaMin);\n            return alphaMin > 0 ? alphaMin : null;\n          },\n          max: 1,\n        },\n      },\n      {\n        key: 'maxNeighborsPerNode',\n        label: 'Neighbors / node',\n        type: 'number',\n        min: 1,\n        max: 256,\n        step: 1,\n        get: () => Number(this.options.maxNeighborsPerNode ?? DEFAULT_OPTIONS.maxNeighborsPerNode),\n        set: (value) => this.setSettings({ maxNeighborsPerNode: value }, { reheat: true }),\n      },\n      {\n        key: 'outputScale',\n        ...withLogScaleBinding({\n          label: 'Output scale',\n          min: 0.1,\n          max: OUTPUT_SCALE_CONTROL_MAX,\n        }),\n        get: () => Number(this.options.outputScale ?? DEFAULT_OPTIONS.outputScale),\n        set: (value) => this.setSettings({ outputScale: value }, { reheat: true }),\n      },\n      {\n        key: 'rotationDamping',\n        label: 'Rotation damping',\n        hint: 'Projects out the estimated rigid-body spin after each GPU step. 0 disables the correction; 1 removes the full fitted rotation component.',\n        type: 'number',\n        min: 0,\n        max: 1,\n        step: 0.01,\n        inputMin: 0,\n        inputMax: 1,\n        sliderMin: 0,\n        sliderMax: 1,\n        get: () => Number(this.options.rotationDamping ?? DEFAULT_OPTIONS.rotationDamping),\n        set: (value) => this.setSettings({ rotationDamping: value }),\n      },\n      {\n        key: 'layoutScheduling',\n        label: 'Scheduling',\n        hint: 'Auto uses chunked WebGPU layout above 500k active nodes. Full keeps the legacy one-step dispatch. Chunked reduces render queue stalls but converges more slowly.',\n        type: 'select',\n        options: [\n          { value: 'auto', label: 'Auto' },\n          { value: 'full', label: 'Full' },\n          { value: 'chunked', label: 'Chunked' },\n        ],\n        get: () => normalizeLayoutScheduling(this.options.layoutScheduling ?? DEFAULT_OPTIONS.layoutScheduling),\n        set: (value) => this.setSettings({ layoutScheduling: normalizeLayoutScheduling(value) }),\n      },\n      {\n        key: 'layoutChunkCount',\n        label: 'Chunks',\n        hint: 'Number of WebGPU layout chunks per full sweep when chunked scheduling is active.',\n        type: 'number',\n        min: 2,\n        max: 10,\n        inputMin: 2,\n        inputMax: 10,\n        sliderMin: 2,\n        sliderMax: 10,\n        step: 1,\n        get: () => resolveLayoutChunkCount(this.options.layoutChunkCount),\n        set: (value) => this.setSettings({ layoutChunkCount: resolveLayoutChunkCount(value) }),\n      },\n    ];\n\n    if (!umapModel) {\n      bindings.push({\n        key: 'componentForces',\n        label: 'Components',\n        hint: 'Auto scales gravity for singleton-heavy layouts without changing dense connected layouts. Off disables component metadata. Force halo applies component gravity unconditionally without reseeding positions.',\n        type: 'select',\n        options: [\n          { value: 'auto', label: 'Auto' },\n          { value: 'off', label: 'Off' },\n          { value: 'halo', label: 'Force halo' },\n        ],\n        get: () => normalizeComponentForces(this.options.componentForces ?? DEFAULT_OPTIONS.componentForces),\n        set: (value) => this.setSettings({ componentForces: normalizeComponentForces(value) }, { reheat: true }),\n      });\n    }\n\n    if (umapModel) {\n      bindings.push(\n        {\n          key: 'umapEpochCurrent',\n          label: 'Epochs',\n          type: 'display',\n          get: () => Number(this.positionDelegate?.getCompletedEpochs?.() ?? 0),\n          format: (value) => String(Math.max(0, Math.floor(Number(value) || 0))),\n        },\n        {\n          key: 'umapNegativeSampleRate',\n          label: 'Negative sample rate',\n          type: 'number',\n          min: 0,\n          max: 64,\n          step: 1,\n          get: () => Number(this.options.umapNegativeSampleRate ?? DEFAULT_OPTIONS.umapNegativeSampleRate),\n          set: (value) => this.setSettings({ umapNegativeSampleRate: value }, { reheat: true }),\n        },\n        {\n          key: 'sampleChurn',\n          label: 'Negative sample churn',\n          hint: '0 keeps sampled negatives fixed; positive values progressively refresh sampled negatives between steps. This is an implementation detail for interactive UMAP, not a standard UMAP-learn parameter.',\n          type: 'number',\n          min: 0,\n          max: 1,\n          step: 0.01,\n          inputMin: 0,\n          inputMax: 1,\n          sliderMin: 0,\n          sliderMax: 1,\n          get: () => Number(this.options.sampleChurn ?? DEFAULT_OPTIONS.sampleChurn),\n          set: (value) => {\n            this.setSettings({ sampleChurn: value });\n            this.reheat();\n          },\n        },\n        {\n          key: 'umapA',\n          ...withLogScaleBinding({\n            label: 'UMAP a',\n            min: 0.01,\n            max: 10,\n          }),\n          get: () => Number(this.options.umapA ?? DEFAULT_OPTIONS.umapA),\n          set: (value) => this.setSettings({ umapA: value }, { reheat: true }),\n        },\n        {\n          key: 'umapB',\n          ...withLogScaleBinding({\n            label: 'UMAP b',\n            min: 0.01,\n            max: 10,\n          }),\n          get: () => Number(this.options.umapB ?? DEFAULT_OPTIONS.umapB),\n          set: (value) => this.setSettings({ umapB: value }, { reheat: true }),\n        },\n        {\n          key: 'umapGamma',\n          ...withLogScaleBinding({\n            label: 'Gamma',\n            min: 0.01,\n            max: 10,\n          }),\n          get: () => Number(this.options.umapGamma ?? DEFAULT_OPTIONS.umapGamma),\n          set: (value) => this.setSettings({ umapGamma: value }, { reheat: true }),\n        },\n        {\n          key: 'kRepulsion',\n          ...withLogScaleBinding({\n            label: 'Repulsion importance',\n            min: 0.001,\n            max: 100,\n          }),\n          get: () => Number(this.options.kRepulsion ?? 1),\n          set: (value) => this.setSettings({ kRepulsion: value }, { reheat: true }),\n        },\n        {\n          key: 'kAttraction',\n          ...withLogScaleBinding({\n            label: 'Attraction importance',\n            min: 0.001,\n            max: 100,\n          }),\n          get: () => Number(this.options.kAttraction ?? 1),\n          set: (value) => this.setSettings({ kAttraction: value }, { reheat: true }),\n        },\n      );\n    } else {\n      bindings.push(\n        {\n          key: sampleKey,\n          label: sampleLabel,\n          type: 'number',\n          min: 1,\n          sliderMax: 256,\n          inputMax: null,\n          step: 1,\n          hint: 'Suggested range 1-256; larger typed values are allowed.',\n          get: () => Number(this.options[sampleKey] ?? DEFAULT_OPTIONS[sampleKey]),\n          set: (value) => {\n            this.setSettings({ [sampleKey]: value });\n            this.reheat();\n          },\n        },\n        {\n          key: 'sampleChurn',\n          label: 'Sample churn',\n          hint: '0 keeps repulsion samples fixed; positive values progressively refresh samples. This only affects sampled repulsion, not exact repulsion on smaller active sets.',\n          type: 'number',\n          min: 0,\n          max: 1,\n          step: 0.01,\n          inputMin: 0,\n          inputMax: 1,\n          sliderMin: 0,\n          sliderMax: 1,\n          get: () => Number(this.options.sampleChurn ?? DEFAULT_OPTIONS.sampleChurn),\n          set: (value) => {\n            this.setSettings({ sampleChurn: value });\n            this.reheat();\n          },\n        },\n        {\n          key: 'linkDistance',\n          label: 'Link distance',\n          type: 'number',\n          min: 0.1,\n          max: 20,\n          step: 0.01,\n          get: () => Number(this.options.linkDistance ?? DEFAULT_OPTIONS.linkDistance),\n          set: (value) => this.setSettings({ linkDistance: value }, { reheat: true }),\n        },\n        {\n          key: 'forceNormalizationType',\n          label: 'Normalize by',\n          type: 'select',\n          options: [\n            { value: 'local-degree', label: 'Local degree' },\n            { value: 'degree', label: 'Degree' },\n            { value: 'strength', label: 'Strength' },\n            { value: 'none', label: 'None' },\n          ],\n          get: () => normalizeForceNormalizationType(this.options.forceNormalizationType),\n          set: (value) => this.setSettings({ forceNormalizationType: normalizeForceNormalizationType(value) }, { reheat: true }),\n        },\n        {\n          key: 'kRepulsion',\n          ...withLogScaleBinding({\n            label: 'Repulsion',\n            min: 0.01,\n            max: 100,\n          }),\n          get: () => Number(this.options.kRepulsion ?? DEFAULT_OPTIONS.kRepulsion),\n          set: (value) => this.setSettings({ kRepulsion: value }, { reheat: true }),\n        },\n        {\n          key: 'kAttraction',\n          ...withLogScaleBinding({\n            label: 'Attraction',\n            min: 0.0062,\n            max: 62,\n          }),\n          get: () => Number(this.options.kAttraction ?? DEFAULT_OPTIONS.kAttraction),\n          set: (value) => this.setSettings({ kAttraction: value }, { reheat: true }),\n        },\n      );\n    }\n\n    bindings.push(\n      {\n        key: 'kGravity',\n        ...withLogScaleBinding({\n          label: 'Gravity',\n          min: 0.00001,\n          max: 0.1,\n          inputMin: 0,\n        }),\n        get: () => Number(this.options.kGravity ?? DEFAULT_OPTIONS.kGravity),\n        set: (value) => this.setSettings({ kGravity: value }, { reheat: true }),\n      },\n      {\n        key: 'eta',\n        label: 'Eta',\n        type: 'number',\n        min: 0.001,\n        max: 1,\n        step: 0.001,\n        get: () => Number(this.options.eta ?? DEFAULT_OPTIONS.eta),\n        set: (value) => this.setSettings({ eta: value }, { reheat: true }),\n      },\n      withVelocityRetentionBinding({\n        key: 'damping',\n        type: 'number',\n        min: 0,\n        max: 1,\n        step: 0.001,\n        get: () => Number(this.options.damping ?? DEFAULT_OPTIONS.damping),\n        set: (value) => this.setSettings({ damping: value }, { reheat: true }),\n      }),\n      {\n        key: 'maxStep',\n        label: 'Max step',\n        type: 'number',\n        min: 0.01,\n        max: 10,\n        step: 0.01,\n        get: () => Number(this.options.maxStep ?? DEFAULT_OPTIONS.maxStep),\n        set: (value) => this.setSettings({ maxStep: value }, { reheat: true }),\n      },\n    );\n\n    if (!umapModel) {\n      bindings.push({\n        key: 'minDistance',\n        label: 'Min distance',\n        type: 'number',\n        min: 0.001,\n        max: 10,\n        step: 0.001,\n        get: () => Number(this.options.minDistance ?? DEFAULT_OPTIONS.minDistance),\n        set: (value) => this.setSettings({ minDistance: value }, { reheat: true }),\n      });\n    }\n\n    bindings.push(\n      {\n        key: 'autoStopAtAlphaMin',\n        label: 'Stop at min temp',\n        type: 'boolean',\n        get: () => this.options.autoStopAtAlphaMin !== false,\n        set: (value) => this.setSettings({ autoStopAtAlphaMin: value !== false }),\n      },\n      {\n        key: 'alphaDecay',\n        ...createZeroableUnitLogBinding({\n          label: 'Temp. decay',\n        }),\n        get: () => Number(this.options.alphaDecay ?? DEFAULT_OPTIONS.alphaDecay),\n        set: (value) => this.setSettings({ alphaDecay: value }, { reheat: true }),\n      },\n      {\n        key: 'alphaTarget',\n        ...createZeroableUnitLogBinding({\n          label: 'Temp. target',\n        }),\n        get: () => Number(this.options.alphaTarget ?? DEFAULT_OPTIONS.alphaTarget),\n        set: (value) => this.setSettings({ alphaTarget: value }, { reheat: true }),\n      },\n      {\n        key: 'alphaMin',\n        ...createZeroableUnitLogBinding({\n          label: 'Temp. min',\n        }),\n        get: () => Number(this.options.alphaMin ?? DEFAULT_OPTIONS.alphaMin),\n        set: (value) => this.setSettings({ alphaMin: value }, { reheat: true }),\n      },\n    );\n    return {\n      key: 'gpu-force',\n      label: umapModel ? 'UMAP Force (GPU)' : 'Force (GPU)',\n      dynamic: true,\n      bindings,\n    };\n  }\n\n  dispose() {\n    this.positionDelegate.dispose?.();\n  }\n\n  _buildDelegateContext(deltaMs = 16) {\n    const renderer = this.helios?.renderer ?? null;\n    const rendererDevice = renderer?.device ?? null;\n    const forceFullStartupLayout = this.helios?._isStartupLayoutWarmupActive?.() === true\n      && normalizeLayoutScheduling(this.options.layoutScheduling ?? DEFAULT_OPTIONS.layoutScheduling) === 'auto';\n    return {\n      helios: this.helios,\n      network: this.network,\n      visuals: this.visuals,\n      renderer,\n      scheduler: this.helios?.scheduler ?? null,\n      backend: rendererDevice?.type ?? null,\n      device: rendererDevice?.device ?? null,\n      gl: rendererDevice?.gl ?? null,\n      deltaMs,\n      reason: 'layout-step',\n      layoutSchedulingOverride: forceFullStartupLayout ? 'full' : null,\n    };\n  }\n}\n\nexport default GpuForceLayout;\n","export class Layer {\n  constructor(name = 'layer') {\n    this.name = name;\n    this.device = null;\n    this.size = null;\n  }\n\n  initialize(device, size) {\n    this.device = device;\n    this.size = size;\n  }\n\n  resize(size) {\n    this.size = size;\n  }\n\n  // eslint-disable-next-line class-methods-use-this, no-unused-vars\n  render(context, frame) {\n    // Implemented by subclasses.\n  }\n\n  destroy() {\n    // Implemented by subclasses if needed.\n  }\n}\n","export const AMBIENT_OCCLUSION_QUALITY_DEFAULT = 'medium';\n\nexport const AMBIENT_OCCLUSION_QUALITY_OPTIONS = Object.freeze([\n  Object.freeze({ value: 'low', label: 'Low' }),\n  Object.freeze({ value: 'medium', label: 'Medium' }),\n  Object.freeze({ value: 'high', label: 'High' }),\n  Object.freeze({ value: 'ultra', label: 'Ultra' }),\n]);\n\nfunction freezeKernel(kernel) {\n  return Object.freeze(kernel.map((sample) => Object.freeze(sample)));\n}\n\nfunction buildSmoothKernel(sampleCount) {\n  const kernel = [];\n  const goldenAngle = 2.399963229728653;\n  for (let i = 0; i < sampleCount; i += 1) {\n    const radius = Math.sqrt((i + 0.5) / sampleCount);\n    const angle = i * goldenAngle;\n    kernel.push([\n      Math.cos(angle) * radius,\n      Math.sin(angle) * radius,\n    ]);\n  }\n  return freezeKernel(kernel);\n}\n\nfunction buildHemisphereKernel(sampleCount) {\n  const kernel = [];\n  const goldenAngle = 2.399963229728653;\n  for (let i = 0; i < sampleCount; i += 1) {\n    const t = (i + 0.5) / sampleCount;\n    const angle = i * goldenAngle;\n    const radial = Math.sqrt(t);\n    const z = Math.sqrt(Math.max(0, 1 - radial * radial));\n    const scale = 0.1 + 0.9 * t * t;\n    kernel.push([\n      Math.cos(angle) * radial * scale,\n      Math.sin(angle) * radial * scale,\n      z * scale,\n    ]);\n  }\n  return freezeKernel(kernel);\n}\n\nfunction buildBlurWeights(radius, sigma) {\n  const weights = new Array(radius + 1).fill(0);\n  for (let i = 0; i <= radius; i += 1) {\n    weights[i] = Math.exp(-((i * i) / (2 * sigma * sigma)));\n  }\n  let total = weights[0];\n  for (let i = 1; i <= radius; i += 1) total += weights[i] * 2;\n  for (let i = 0; i <= radius; i += 1) weights[i] /= total;\n  return Object.freeze(weights);\n}\n\nfunction createPreset(key, label, config) {\n  return Object.freeze({\n    key,\n    label,\n    resolutionScale: config.resolutionScale,\n    smoothSampleCount: config.smoothSampleCount,\n    altSampleCount: config.altSampleCount,\n    blurRadius: config.blurRadius,\n    blurSigma: config.blurSigma,\n    blurWeights: buildBlurWeights(config.blurRadius, config.blurSigma),\n    depthSharpness: config.depthSharpness,\n    occlusionScale: config.occlusionScale,\n    smoothKernel: buildSmoothKernel(config.smoothSampleCount),\n    altKernel: buildHemisphereKernel(config.altSampleCount),\n  });\n}\n\nexport const AMBIENT_OCCLUSION_QUALITY_PRESETS = Object.freeze({\n  low: createPreset('low', 'Low', {\n    resolutionScale: 0.5,\n    smoothSampleCount: 8,\n    altSampleCount: 12,\n    blurRadius: 2,\n    blurSigma: 1.2,\n    depthSharpness: 320.0,\n    occlusionScale: 1.6,\n  }),\n  medium: createPreset('medium', 'Medium', {\n    resolutionScale: 1.0,\n    smoothSampleCount: 12,\n    altSampleCount: 28,\n    blurRadius: 3,\n    blurSigma: 1.55,\n    depthSharpness: 380.0,\n    occlusionScale: 1.52,\n  }),\n  high: createPreset('high', 'High', {\n    resolutionScale: 1.0,\n    smoothSampleCount: 20,\n    altSampleCount: 40,\n    blurRadius: 4,\n    blurSigma: 1.9,\n    depthSharpness: 460.0,\n    occlusionScale: 1.46,\n  }),\n  ultra: createPreset('ultra', 'Ultra', {\n    resolutionScale: 1.0,\n    smoothSampleCount: 28,\n    altSampleCount: 64,\n    blurRadius: 5,\n    blurSigma: 2.2,\n    depthSharpness: 520.0,\n    occlusionScale: 1.42,\n  }),\n});\n\nexport function normalizeAmbientOcclusionQuality(value, fallback = AMBIENT_OCCLUSION_QUALITY_DEFAULT) {\n  const normalized = typeof value === 'string' ? value.trim().toLowerCase() : '';\n  if (normalized && normalized in AMBIENT_OCCLUSION_QUALITY_PRESETS) return normalized;\n  return fallback;\n}\n\nexport function getAmbientOcclusionQualityPreset(value) {\n  return AMBIENT_OCCLUSION_QUALITY_PRESETS[\n    normalizeAmbientOcclusionQuality(value, AMBIENT_OCCLUSION_QUALITY_DEFAULT)\n  ];\n}\n","export const AMBIENT_OCCLUSION_MODE_DEFAULT = 'fast';\n\nexport const AMBIENT_OCCLUSION_MODE_OPTIONS = Object.freeze([\n  Object.freeze({ value: 'fast', label: 'Fast SSAO' }),\n  Object.freeze({ value: 'smooth', label: 'Smooth SSAO' }),\n]);\n\nexport function normalizeAmbientOcclusionMode(value, fallback = AMBIENT_OCCLUSION_MODE_DEFAULT) {\n  const normalized = typeof value === 'string' ? value.trim().toLowerCase() : '';\n  if (normalized === 'fast' || normalized === 'alt') return 'fast';\n  if (normalized === 'smooth') return 'smooth';\n  return fallback;\n}\n","export const EDGE_WIDTH_SCALE_MULTIPLIER_GLOBAL = 300.0;\n","import { Layer } from './Layer.js';\nimport {\n  AMBIENT_OCCLUSION_QUALITY_DEFAULT,\n  normalizeAmbientOcclusionQuality,\n} from './AmbientOcclusionQuality.js';\nimport {\n  AMBIENT_OCCLUSION_MODE_DEFAULT,\n  normalizeAmbientOcclusionMode,\n} from './AmbientOcclusionMode.js';\n\nexport { EDGE_WIDTH_SCALE_MULTIPLIER_GLOBAL } from './GraphLayerCommon.js';\n\nexport const SHADED_LIGHT_DIRECTION_DEFAULT = Object.freeze([\n  0.577350269,\n  0.577350269,\n  0.577350269,\n]);\nexport const SHADED_LIGHT_COLOR_DEFAULT = Object.freeze([1, 1, 1, 1]);\nexport const SHADED_AMBIENT_TOP_COLOR_DEFAULT = Object.freeze([1, 1, 1, 1]);\nexport const SHADED_AMBIENT_BOTTOM_COLOR_DEFAULT = Object.freeze([163 / 255, 163 / 255, 163 / 255, 1]);\nexport const SHADED_DIFFUSE_STRENGTH_DEFAULT = 0.5;\nexport const SHADED_AMBIENT_STRENGTH_DEFAULT = 1;\nexport const SHADED_SPECULAR_COLOR_DEFAULT = Object.freeze([1, 1, 1, 1]);\nexport const SHADED_SPECULAR_STRENGTH_DEFAULT = 0;\nexport const SHADED_SHININESS_DEFAULT = 48;\nexport const AMBIENT_OCCLUSION_STRENGTH_DEFAULT = 1.5;\nexport const AMBIENT_OCCLUSION_RADIUS_DEFAULT = 50;\nexport const AMBIENT_OCCLUSION_BIAS_DEFAULT = 0.02;\nexport const AMBIENT_OCCLUSION_INTENSITY_SCALE_DEFAULT = 1.25;\nexport const AMBIENT_OCCLUSION_INTENSITY_SHIFT_DEFAULT = 0.05;\nexport { AMBIENT_OCCLUSION_QUALITY_DEFAULT } from './AmbientOcclusionQuality.js';\nexport { AMBIENT_OCCLUSION_MODE_DEFAULT } from './AmbientOcclusionMode.js';\n\nfunction clampUnit01(value, fallback = 0) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return fallback;\n  if (numeric <= 0) return 0;\n  if (numeric >= 1) return 1;\n  return numeric;\n}\n\nfunction normalizeShadedColor(value, fallback) {\n  const source = Array.isArray(value) || ArrayBuffer.isView(value) ? value : fallback;\n  return [\n    clampUnit01(source?.[0], fallback[0] ?? 0),\n    clampUnit01(source?.[1], fallback[1] ?? 0),\n    clampUnit01(source?.[2], fallback[2] ?? 0),\n    clampUnit01(source?.[3], fallback[3] ?? 1),\n  ];\n}\n\nfunction normalizeShadedDirection(value, fallback = SHADED_LIGHT_DIRECTION_DEFAULT) {\n  const source = Array.isArray(value) || ArrayBuffer.isView(value) ? value : fallback;\n  const x = Number(source?.[0]);\n  const y = Number(source?.[1]);\n  const z = Number(source?.[2]);\n  if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) {\n    return [...fallback];\n  }\n  const length = Math.hypot(x, y, z);\n  if (!(length > 1e-6)) {\n    return [...fallback];\n  }\n  return [x / length, y / length, z / length];\n}\n\nexport class GraphLayer extends Layer {\n  static NO_HOVER_INDEX = 0xffffffff;\n  static FORCE_VISIBILITY_BOOST = 1000.0;\n\n  isSupportedTransparencyMode(mode) {\n    switch (mode) {\n      case 'alpha':\n      case 'weighted':\n      case 'additive':\n      case 'screen':\n      case 'max':\n      case 'additive-normalized':\n      case 'additive-tonemapped':\n      case 'additive-normalized-bright':\n        return true;\n      default:\n        return false;\n    }\n  }\n\n  isWeightedTransparencyMode(mode) {\n    switch (mode) {\n      case 'weighted':\n      case 'additive-normalized':\n      case 'additive-tonemapped':\n      case 'additive-normalized-bright':\n        return true;\n      default:\n        return false;\n    }\n  }\n\n  normalizeEdgeTransparencyMode(mode) {\n    const raw = typeof mode === 'string' ? mode : '';\n    const fallback = raw ? 'alpha' : 'weighted';\n    const resolved = this.isSupportedTransparencyMode(raw) ? raw : fallback;\n    if (this.isWeightedTransparencyMode(resolved) && this.weightedSupported === false) {\n      return 'alpha';\n    }\n    return resolved;\n  }\n\n  constructor(options = {}) {\n    super('graph-layer');\n    const requestedSlots = Number(options.stateSlots);\n    const clampedSlots = Number.isFinite(requestedSlots) ? Math.floor(requestedSlots) : 4;\n    this.stateSlotCount = Math.min(32, Math.max(0, clampedSlots));\n    this.edgeRenderingMode = options.edgeRendering === 'line' ? 'line' : 'quad';\n    this.weightedSupported = null;\n    this.edgeTransparencyMode = this.normalizeEdgeTransparencyMode(options.transparencyModeEdges);\n    this.nodeOpacityBase = 0;\n    this.nodeOpacityScale = 1;\n    this.nodeSizeBase = 0;\n    this.nodeSizeScale = 1;\n    this.semanticZoomExponent = Number.isFinite(options.semanticZoomExponent)\n      ? options.semanticZoomExponent\n      : 0;\n    this.nodeOutlineWidthBase = 0;\n    this.nodeOutlineWidthScale = 0;\n    this.nodeOutlineColor = options.nodeOutlineColor ?? [0, 0, 0, 1];\n    this.nodeOutlineUseAttributes = options.nodeOutlineUseAttributes === true;\n    this.edgeOpacityBase = 0;\n    this.edgeOpacityScale = 0.5;\n    this.edgeWidthBase = 0;\n    this.edgeWidthScale = 1;\n    this.edgeEndpointTrim = Number.isFinite(options.edgeEndpointTrim) ? options.edgeEndpointTrim : 0.8;\n    this.edgeWidthClampToNodeDiameter = options.edgeWidthClampToNodeDiameter !== false;\n    this.nodeBlendWithEdges = options.nodeBlendWithEdges === true;\n    this.edgeDepthWrite = options.edgeDepthWrite === true;\n    this.edgeFastRendering = options.edgeFastRendering === true;\n    this.edgeAdaptiveFastRendering = options.edgeAdaptiveFastRendering === true;\n    this.lastRenderDurationMs = null;\n    this.loggedWeightedActive = false;\n    this.shadedEnabled = options.shadedEnabled === true;\n    this.shadedNodes = options.shadedNodes !== false;\n    this.shadedEdges = options.shadedEdges === true;\n    this.shadedLightDirection = normalizeShadedDirection(options.shadedLightDirection);\n    this.shadedLightColor = normalizeShadedColor(options.shadedLightColor, SHADED_LIGHT_COLOR_DEFAULT);\n    this.shadedAmbientTopColor = normalizeShadedColor(\n      options.shadedAmbientTopColor,\n      SHADED_AMBIENT_TOP_COLOR_DEFAULT,\n    );\n    this.shadedAmbientBottomColor = normalizeShadedColor(\n      options.shadedAmbientBottomColor,\n      SHADED_AMBIENT_BOTTOM_COLOR_DEFAULT,\n    );\n    this.shadedDiffuseStrength = Number.isFinite(Number(options.shadedDiffuseStrength))\n      ? Math.max(0, Number(options.shadedDiffuseStrength))\n      : SHADED_DIFFUSE_STRENGTH_DEFAULT;\n    this.shadedAmbientStrength = Number.isFinite(Number(options.shadedAmbientStrength))\n      ? Math.max(0, Number(options.shadedAmbientStrength))\n      : SHADED_AMBIENT_STRENGTH_DEFAULT;\n    this.shadedSpecularColor = normalizeShadedColor(\n      options.shadedSpecularColor,\n      SHADED_SPECULAR_COLOR_DEFAULT,\n    );\n    this.shadedSpecularStrength = Number.isFinite(Number(options.shadedSpecularStrength))\n      ? Math.max(0, Number(options.shadedSpecularStrength))\n      : SHADED_SPECULAR_STRENGTH_DEFAULT;\n    this.shadedShininess = Number.isFinite(Number(options.shadedShininess))\n      ? Math.max(1, Number(options.shadedShininess))\n      : SHADED_SHININESS_DEFAULT;\n    this.ambientOcclusionEnabled = options.ambientOcclusionEnabled === true;\n    this.ambientOcclusionNodes = options.ambientOcclusionNodes !== false;\n    this.ambientOcclusionEdges = options.ambientOcclusionEdges === true;\n    this.ambientOcclusionStrength = Number.isFinite(Number(options.ambientOcclusionStrength))\n      ? Math.max(0, Number(options.ambientOcclusionStrength))\n      : AMBIENT_OCCLUSION_STRENGTH_DEFAULT;\n    this.ambientOcclusionRadius = Number.isFinite(Number(options.ambientOcclusionRadius))\n      ? Math.max(1, Number(options.ambientOcclusionRadius))\n      : AMBIENT_OCCLUSION_RADIUS_DEFAULT;\n    this.ambientOcclusionBias = Number.isFinite(Number(options.ambientOcclusionBias))\n      ? Math.max(0, Number(options.ambientOcclusionBias))\n      : AMBIENT_OCCLUSION_BIAS_DEFAULT;\n    this.ambientOcclusionMode = normalizeAmbientOcclusionMode(\n      options.ambientOcclusionMode,\n      AMBIENT_OCCLUSION_MODE_DEFAULT,\n    );\n    this.ambientOcclusionIntensityScale = Number.isFinite(Number(options.ambientOcclusionIntensityScale))\n      ? Math.max(0, Number(options.ambientOcclusionIntensityScale))\n      : AMBIENT_OCCLUSION_INTENSITY_SCALE_DEFAULT;\n    this.ambientOcclusionIntensityShift = Number.isFinite(Number(options.ambientOcclusionIntensityShift))\n      ? Math.max(0, Number(options.ambientOcclusionIntensityShift))\n      : AMBIENT_OCCLUSION_INTENSITY_SHIFT_DEFAULT;\n    this.ambientOcclusionQuality = normalizeAmbientOcclusionQuality(\n      options.ambientOcclusionQuality,\n      AMBIENT_OCCLUSION_QUALITY_DEFAULT,\n    );\n    const slots = this.stateSlotCount;\n    this.nodeStateScale = new Float32Array(slots * 4);\n    this.nodeStateColorMul = new Float32Array(slots * 4);\n    this.nodeStateColorAdd = new Float32Array(slots * 4);\n    this.nodeStateForceMaxAlphaMask = 0;\n    this.nodeNoStateScale = new Float32Array(4);\n    this.nodeNoStateColorMul = new Float32Array(4);\n    this.nodeNoStateColorAdd = new Float32Array(4);\n    this.nodeNoStateStyleEnabled = true;\n    this.edgeStateScale = new Float32Array(slots * 4);\n    this.edgeStateColorMul = new Float32Array(slots * 4);\n    this.edgeStateColorAdd = new Float32Array(slots * 4);\n    this.edgeStateForceMaxAlphaMask = 0;\n    this.edgeNoStateScale = new Float32Array(4);\n    this.edgeNoStateColorMul = new Float32Array(4);\n    this.edgeNoStateColorAdd = new Float32Array(4);\n    this.edgeNoStateStyleEnabled = true;\n    this.propagateHoveredNodeToEdges = options.propagateHoveredNodeToEdges === true;\n    this.propagateSelectedNodesToEdges = options.propagateSelectedNodesToEdges === true;\n\n    this.hoveredNodeIndex = GraphLayer.NO_HOVER_INDEX;\n    this.hoveredNodeState = 0;\n    this.hoveredNodeIsVirtual = false;\n    this.hoveredEdgeIndex = GraphLayer.NO_HOVER_INDEX;\n    this.hoveredEdgeState = 0;\n    this.hoveredEdgeIsVirtual = false;\n    this.nodeHoverScale = new Float32Array([1.35, 1, 1.1, 0]);\n    this.nodeHoverColorMul = new Float32Array([1, 1, 1, 1]);\n    this.nodeHoverColorAdd = new Float32Array([0.08, 0.08, 0.08, 0]);\n    this.nodeHoverForceMaxAlpha = false;\n    this.edgeHoverScale = new Float32Array([1.35, 50, 1, 0]);\n    this.edgeHoverColorMul = new Float32Array([1, 1, 1, 1]);\n    this.edgeHoverColorAdd = new Float32Array([0.08, 0.08, 0.08, 0]);\n    this.edgeHoverForceMaxAlpha = false;\n    this.positionDelegate = null;\n    this.positionInterpolation = {\n      enabled: false,\n      factor: 1,\n      sourceVersion: 0,\n      sourceCount: 0,\n      sourceView: null,\n      sourceWebGPUBuffer: null,\n      sourceWebGLTexture: null,\n      sourceTextureMeta: null,\n    };\n    this.resetStateStyles();\n  }\n\n  getCameraUniforms(camera, context = null) {\n    if (camera?.getUniforms) {\n      const uniforms = camera.getUniforms();\n      if (!this.ensureFinite(uniforms?.viewProjection) || !this.ensureFinite(uniforms?.view)) {\n        return null;\n      }\n      const exportViewport = context?.target?.exportFigureLogicalViewport ?? null;\n      if (!exportViewport) {\n        return uniforms;\n      }\n      return {\n        ...uniforms,\n        viewport: {\n          ...(uniforms.viewport ?? {}),\n          ...exportViewport,\n        },\n      };\n    }\n    return null;\n  }\n\n  ensureFinite(array) {\n    if (!array) return false;\n    for (let i = 0; i < array.length; i += 1) {\n      if (!Number.isFinite(array[i])) return false;\n    }\n    return true;\n  }\n\n  shouldRenderEdges() {\n    const edgeWidthBase = Number(this.edgeWidthBase);\n    const edgeWidthScale = Number(this.edgeWidthScale);\n    if (edgeWidthBase === 0 && edgeWidthScale === 0) return false;\n\n    const edgeOpacityBase = Number(this.edgeOpacityBase);\n    const edgeOpacityScale = Number(this.edgeOpacityScale);\n    if (edgeOpacityBase === 0 && edgeOpacityScale === 0) return false;\n\n    return true;\n  }\n\n  hasSemanticZoom() {\n    return Number.isFinite(this.semanticZoomExponent) && this.semanticZoomExponent > 0;\n  }\n\n  hasEdgeTrim() {\n    return Number.isFinite(this.edgeEndpointTrim) && this.edgeEndpointTrim !== 0;\n  }\n\n  hasEdgeWidthClampToNodeDiameter(options = {}) {\n    return options.fastPath === true ? false : this.edgeWidthClampToNodeDiameter !== false;\n  }\n\n  isNodeShadingEnabled() {\n    return this.shadedEnabled === true && this.shadedNodes !== false;\n  }\n\n  isEdgeShadingEnabled() {\n    return this.shadedEnabled === true && this.shadedEdges === true;\n  }\n\n  isAmbientOcclusionEnabled() {\n    return this.ambientOcclusionEnabled === true;\n  }\n\n  isAmbientOcclusionNodesEnabled() {\n    return this.isAmbientOcclusionEnabled() && this.ambientOcclusionNodes !== false;\n  }\n\n  isAmbientOcclusionEdgesEnabled() {\n    return this.isAmbientOcclusionEnabled() && this.ambientOcclusionEdges === true;\n  }\n\n  getAmbientOcclusionSelection() {\n    return {\n      nodes: this.isAmbientOcclusionNodesEnabled(),\n      edges: this.isAmbientOcclusionEdgesEnabled(),\n    };\n  }\n\n  hasAmbientOcclusionSelection() {\n    const selection = this.getAmbientOcclusionSelection();\n    return selection.nodes || selection.edges;\n  }\n\n  hasActiveEdgeStateStyling() {\n    if ((this.hoveredEdgeState >>> 0) !== 0) return true;\n    if (\n      this.edgeNoStateScale[0] !== 1\n      || this.edgeNoStateScale[1] !== 1\n      || this.edgeNoStateScale[3] !== 0\n      || this.edgeNoStateColorMul[0] !== 1\n      || this.edgeNoStateColorMul[1] !== 1\n      || this.edgeNoStateColorMul[2] !== 1\n      || this.edgeNoStateColorAdd[0] !== 0\n      || this.edgeNoStateColorAdd[1] !== 0\n      || this.edgeNoStateColorAdd[2] !== 0\n    ) {\n      return true;\n    }\n    for (let i = 0; i < this.stateSlotCount; i += 1) {\n      const o = i * 4;\n      if (\n        this.edgeStateScale[o + 0] !== 1\n        || this.edgeStateScale[o + 1] !== 1\n        || this.edgeStateScale[o + 3] !== 0\n        || this.edgeStateColorMul[o + 0] !== 1\n        || this.edgeStateColorMul[o + 1] !== 1\n        || this.edgeStateColorMul[o + 2] !== 1\n        || this.edgeStateColorAdd[o + 0] !== 0\n        || this.edgeStateColorAdd[o + 1] !== 0\n        || this.edgeStateColorAdd[o + 2] !== 0\n      ) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  hasActiveNodeStateStyling() {\n    if ((this.hoveredNodeState >>> 0) !== 0) return true;\n    if (\n      this.nodeNoStateScale[0] !== 1\n      || this.nodeNoStateScale[1] !== 1\n      || this.nodeNoStateScale[2] !== 1\n      || this.nodeNoStateScale[3] !== 0\n      || this.nodeNoStateColorMul[0] !== 1\n      || this.nodeNoStateColorMul[1] !== 1\n      || this.nodeNoStateColorMul[2] !== 1\n      || this.nodeNoStateColorAdd[0] !== 0\n      || this.nodeNoStateColorAdd[1] !== 0\n      || this.nodeNoStateColorAdd[2] !== 0\n    ) {\n      return true;\n    }\n    for (let i = 0; i < this.stateSlotCount; i += 1) {\n      const o = i * 4;\n      if (\n        this.nodeStateScale[o + 0] !== 1\n        || this.nodeStateScale[o + 1] !== 1\n        || this.nodeStateScale[o + 2] !== 1\n        || this.nodeStateScale[o + 3] !== 0\n        || this.nodeStateColorMul[o + 0] !== 1\n        || this.nodeStateColorMul[o + 1] !== 1\n        || this.nodeStateColorMul[o + 2] !== 1\n        || this.nodeStateColorAdd[o + 0] !== 0\n        || this.nodeStateColorAdd[o + 1] !== 0\n        || this.nodeStateColorAdd[o + 2] !== 0\n      ) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  hasActiveEndpointStateStyling() {\n    if (this.nodeNoStateScale[0] !== 1) return true;\n    for (let i = 0; i < this.stateSlotCount; i += 1) {\n      if (this.nodeStateScale[i * 4] !== 1) return true;\n    }\n    return false;\n  }\n\n  resolveEdgeSpecialization(options = {}) {\n    const is2D = options.is2D === true;\n    const trim = options.fastPath === true ? false : this.hasEdgeTrim();\n    const widthClampToNodeDiameter = this.hasEdgeWidthClampToNodeDiameter(options);\n    const propagateHoveredNodeToEdges = options.fastPath === true\n      ? false\n      : this.propagateHoveredNodeToEdges === true;\n    const propagateSelectedNodesToEdges = options.fastPath === true\n      ? false\n      : this.propagateSelectedNodesToEdges === true;\n    const edgeState = options.fastPath === true\n      ? false\n      : (this.hasActiveEdgeStateStyling() || propagateHoveredNodeToEdges || propagateSelectedNodesToEdges);\n    const endpointState = options.fastPath === true\n      ? false\n      : (((trim || widthClampToNodeDiameter) && this.hasActiveEndpointStateStyling()) || propagateSelectedNodesToEdges);\n    return {\n      cameraMode: is2D ? '2d' : '3d',\n      semanticZoom: options.fastPath === true ? false : (is2D && this.hasSemanticZoom()),\n      trim,\n      widthClampToNodeDiameter,\n      edgeState,\n      endpointState,\n      propagateHoveredNodeToEdges,\n      propagateSelectedNodesToEdges,\n    };\n  }\n\n\n  setHoveredNodeState(index, mask) {\n    const nextIndex =\n      index == null || Number(index) < 0\n        ? GraphLayer.NO_HOVER_INDEX\n        : (Number(index) >>> 0);\n    this.hoveredNodeIndex = nextIndex;\n    this.hoveredNodeState = (Number(mask) >>> 0);\n    this.hoveredNodeIsVirtual = false;\n    return this;\n  }\n\n  setHoveredEdgeState(index, mask) {\n    const nextIndex =\n      index == null || Number(index) < 0\n        ? GraphLayer.NO_HOVER_INDEX\n        : (Number(index) >>> 0);\n    this.hoveredEdgeIndex = nextIndex;\n    this.hoveredEdgeState = (Number(mask) >>> 0);\n    this.hoveredEdgeIsVirtual = false;\n    return this;\n  }\n\n  setNodeHoverStyle(style = {}) {\n    if (style.sizeMul != null) this.nodeHoverScale[0] = Number(style.sizeMul);\n    if (style.opacityMul != null) this.nodeHoverScale[1] = Number(style.opacityMul);\n    if (style.outlineMul != null) this.nodeHoverScale[2] = Number(style.outlineMul);\n    if (style.discard != null) this.nodeHoverScale[3] = style.discard ? 1 : 0;\n    if (style.colorMul != null) {\n      const v = style.colorMul;\n      this.nodeHoverColorMul[0] = v[0] ?? this.nodeHoverColorMul[0];\n      this.nodeHoverColorMul[1] = v[1] ?? this.nodeHoverColorMul[1];\n      this.nodeHoverColorMul[2] = v[2] ?? this.nodeHoverColorMul[2];\n      this.nodeHoverColorMul[3] = v[3] ?? this.nodeHoverColorMul[3];\n    }\n    if (style.colorAdd != null) {\n      const v = style.colorAdd;\n      this.nodeHoverColorAdd[0] = v[0] ?? this.nodeHoverColorAdd[0];\n      this.nodeHoverColorAdd[1] = v[1] ?? this.nodeHoverColorAdd[1];\n      this.nodeHoverColorAdd[2] = v[2] ?? this.nodeHoverColorAdd[2];\n      this.nodeHoverColorAdd[3] = v[3] ?? this.nodeHoverColorAdd[3];\n    }\n    if (style.forceMaxAlpha != null) this.nodeHoverForceMaxAlpha = style.forceMaxAlpha === true;\n    this._hoverLast = null;\n  }\n\n  setEdgeHoverStyle(style = {}) {\n    if (style.widthMul != null) this.edgeHoverScale[0] = Number(style.widthMul);\n    if (style.opacityMul != null) this.edgeHoverScale[1] = Number(style.opacityMul);\n    if (style.discard != null) this.edgeHoverScale[3] = style.discard ? 1 : 0;\n    if (style.colorMul != null) {\n      const v = style.colorMul;\n      this.edgeHoverColorMul[0] = v[0] ?? this.edgeHoverColorMul[0];\n      this.edgeHoverColorMul[1] = v[1] ?? this.edgeHoverColorMul[1];\n      this.edgeHoverColorMul[2] = v[2] ?? this.edgeHoverColorMul[2];\n      this.edgeHoverColorMul[3] = v[3] ?? this.edgeHoverColorMul[3];\n    }\n    if (style.colorAdd != null) {\n      const v = style.colorAdd;\n      this.edgeHoverColorAdd[0] = v[0] ?? this.edgeHoverColorAdd[0];\n      this.edgeHoverColorAdd[1] = v[1] ?? this.edgeHoverColorAdd[1];\n      this.edgeHoverColorAdd[2] = v[2] ?? this.edgeHoverColorAdd[2];\n      this.edgeHoverColorAdd[3] = v[3] ?? this.edgeHoverColorAdd[3];\n    }\n    if (style.forceMaxAlpha != null) this.edgeHoverForceMaxAlpha = style.forceMaxAlpha === true;\n    this._hoverLast = null;\n  }\n\n  resetStateStyles() {\n    const slots = this.stateSlotCount;\n    this.nodeStateForceMaxAlphaMask = 0;\n    this.edgeStateForceMaxAlphaMask = 0;\n    for (let i = 0; i < slots; i += 1) {\n      const o = i * 4;\n      this.nodeStateScale[o + 0] = 1;\n      this.nodeStateScale[o + 1] = 1;\n      this.nodeStateScale[o + 2] = 1;\n      this.nodeStateScale[o + 3] = 0;\n      this.nodeStateColorMul[o + 0] = 1;\n      this.nodeStateColorMul[o + 1] = 1;\n      this.nodeStateColorMul[o + 2] = 1;\n      this.nodeStateColorMul[o + 3] = 1;\n      this.nodeStateColorAdd[o + 0] = 0;\n      this.nodeStateColorAdd[o + 1] = 0;\n      this.nodeStateColorAdd[o + 2] = 0;\n      this.nodeStateColorAdd[o + 3] = 0;\n\n      this.edgeStateScale[o + 0] = 1;\n      this.edgeStateScale[o + 1] = 1;\n      this.edgeStateScale[o + 2] = 1;\n      this.edgeStateScale[o + 3] = 0;\n      this.edgeStateColorMul[o + 0] = 1;\n      this.edgeStateColorMul[o + 1] = 1;\n      this.edgeStateColorMul[o + 2] = 1;\n      this.edgeStateColorMul[o + 3] = 1;\n      this.edgeStateColorAdd[o + 0] = 0;\n      this.edgeStateColorAdd[o + 1] = 0;\n      this.edgeStateColorAdd[o + 2] = 0;\n      this.edgeStateColorAdd[o + 3] = 0;\n    }\n\n    // NO_STATE styles (applied when state bitmask is 0).\n    this.nodeNoStateScale[0] = 1;\n    this.nodeNoStateScale[1] = 1;\n    this.nodeNoStateScale[2] = 1;\n    this.nodeNoStateScale[3] = 0;\n    this.nodeNoStateColorMul[0] = 1;\n    this.nodeNoStateColorMul[1] = 1;\n    this.nodeNoStateColorMul[2] = 1;\n    this.nodeNoStateColorMul[3] = 1;\n    this.nodeNoStateColorAdd[0] = 0;\n    this.nodeNoStateColorAdd[1] = 0;\n    this.nodeNoStateColorAdd[2] = 0;\n    this.nodeNoStateColorAdd[3] = 0;\n\n    this.edgeNoStateScale[0] = 1;\n    this.edgeNoStateScale[1] = 1;\n    this.edgeNoStateScale[2] = 1;\n    this.edgeNoStateScale[3] = 0;\n    this.edgeNoStateColorMul[0] = 1;\n    this.edgeNoStateColorMul[1] = 1;\n    this.edgeNoStateColorMul[2] = 1;\n    this.edgeNoStateColorMul[3] = 1;\n    this.edgeNoStateColorAdd[0] = 0;\n    this.edgeNoStateColorAdd[1] = 0;\n    this.edgeNoStateColorAdd[2] = 0;\n    this.edgeNoStateColorAdd[3] = 0;\n  }\n\n  setNodeStateStyle(slot, style = {}) {\n    const index = Number(slot);\n    if (!Number.isInteger(index) || index < 0 || index >= this.stateSlotCount) return;\n    const o = index * 4;\n    if (style.sizeMul != null) this.nodeStateScale[o + 0] = Number(style.sizeMul);\n    if (style.opacityMul != null) this.nodeStateScale[o + 1] = Number(style.opacityMul);\n    if (style.outlineMul != null) this.nodeStateScale[o + 2] = Number(style.outlineMul);\n    if (style.discard != null) this.nodeStateScale[o + 3] = style.discard ? 1 : 0;\n    if (style.colorMul != null) {\n      const v = style.colorMul;\n      this.nodeStateColorMul[o + 0] = v[0] ?? this.nodeStateColorMul[o + 0];\n      this.nodeStateColorMul[o + 1] = v[1] ?? this.nodeStateColorMul[o + 1];\n      this.nodeStateColorMul[o + 2] = v[2] ?? this.nodeStateColorMul[o + 2];\n      this.nodeStateColorMul[o + 3] = v[3] ?? this.nodeStateColorMul[o + 3];\n    }\n    if (style.colorAdd != null) {\n      const v = style.colorAdd;\n      this.nodeStateColorAdd[o + 0] = v[0] ?? this.nodeStateColorAdd[o + 0];\n      this.nodeStateColorAdd[o + 1] = v[1] ?? this.nodeStateColorAdd[o + 1];\n      this.nodeStateColorAdd[o + 2] = v[2] ?? this.nodeStateColorAdd[o + 2];\n      this.nodeStateColorAdd[o + 3] = v[3] ?? this.nodeStateColorAdd[o + 3];\n    }\n    if (style.forceMaxAlpha != null) {\n      const bit = (1 << index) >>> 0;\n      if (style.forceMaxAlpha) {\n        this.nodeStateForceMaxAlphaMask = (this.nodeStateForceMaxAlphaMask | bit) >>> 0;\n      } else {\n        this.nodeStateForceMaxAlphaMask = (this.nodeStateForceMaxAlphaMask & (~bit)) >>> 0;\n      }\n    }\n  }\n\n  setNodeNoStateStyle(style = {}) {\n    if (style.sizeMul != null) this.nodeNoStateScale[0] = Number(style.sizeMul);\n    if (style.opacityMul != null) this.nodeNoStateScale[1] = Number(style.opacityMul);\n    if (style.outlineMul != null) this.nodeNoStateScale[2] = Number(style.outlineMul);\n    if (style.discard != null) this.nodeNoStateScale[3] = style.discard ? 1 : 0;\n    if (style.colorMul != null) {\n      const v = style.colorMul;\n      this.nodeNoStateColorMul[0] = v[0] ?? this.nodeNoStateColorMul[0];\n      this.nodeNoStateColorMul[1] = v[1] ?? this.nodeNoStateColorMul[1];\n      this.nodeNoStateColorMul[2] = v[2] ?? this.nodeNoStateColorMul[2];\n      this.nodeNoStateColorMul[3] = v[3] ?? this.nodeNoStateColorMul[3];\n    }\n    if (style.colorAdd != null) {\n      const v = style.colorAdd;\n      this.nodeNoStateColorAdd[0] = v[0] ?? this.nodeNoStateColorAdd[0];\n      this.nodeNoStateColorAdd[1] = v[1] ?? this.nodeNoStateColorAdd[1];\n      this.nodeNoStateColorAdd[2] = v[2] ?? this.nodeNoStateColorAdd[2];\n      this.nodeNoStateColorAdd[3] = v[3] ?? this.nodeNoStateColorAdd[3];\n    }\n  }\n\n  setEdgeStateStyle(slot, style = {}) {\n    const index = Number(slot);\n    if (!Number.isInteger(index) || index < 0 || index >= this.stateSlotCount) return;\n    const o = index * 4;\n    if (style.widthMul != null) this.edgeStateScale[o + 0] = Number(style.widthMul);\n    if (style.opacityMul != null) this.edgeStateScale[o + 1] = Number(style.opacityMul);\n    if (style.discard != null) this.edgeStateScale[o + 3] = style.discard ? 1 : 0;\n    if (style.colorMul != null) {\n      const v = style.colorMul;\n      this.edgeStateColorMul[o + 0] = v[0] ?? this.edgeStateColorMul[o + 0];\n      this.edgeStateColorMul[o + 1] = v[1] ?? this.edgeStateColorMul[o + 1];\n      this.edgeStateColorMul[o + 2] = v[2] ?? this.edgeStateColorMul[o + 2];\n      this.edgeStateColorMul[o + 3] = v[3] ?? this.edgeStateColorMul[o + 3];\n    }\n    if (style.colorAdd != null) {\n      const v = style.colorAdd;\n      this.edgeStateColorAdd[o + 0] = v[0] ?? this.edgeStateColorAdd[o + 0];\n      this.edgeStateColorAdd[o + 1] = v[1] ?? this.edgeStateColorAdd[o + 1];\n      this.edgeStateColorAdd[o + 2] = v[2] ?? this.edgeStateColorAdd[o + 2];\n      this.edgeStateColorAdd[o + 3] = v[3] ?? this.edgeStateColorAdd[o + 3];\n    }\n    if (style.forceMaxAlpha != null) {\n      const bit = (1 << index) >>> 0;\n      if (style.forceMaxAlpha) {\n        this.edgeStateForceMaxAlphaMask = (this.edgeStateForceMaxAlphaMask | bit) >>> 0;\n      } else {\n        this.edgeStateForceMaxAlphaMask = (this.edgeStateForceMaxAlphaMask & (~bit)) >>> 0;\n      }\n    }\n  }\n\n  setEdgeNoStateStyle(style = {}) {\n    if (style.widthMul != null) this.edgeNoStateScale[0] = Number(style.widthMul);\n    if (style.opacityMul != null) this.edgeNoStateScale[1] = Number(style.opacityMul);\n    if (style.discard != null) this.edgeNoStateScale[3] = style.discard ? 1 : 0;\n    if (style.colorMul != null) {\n      const v = style.colorMul;\n      this.edgeNoStateColorMul[0] = v[0] ?? this.edgeNoStateColorMul[0];\n      this.edgeNoStateColorMul[1] = v[1] ?? this.edgeNoStateColorMul[1];\n      this.edgeNoStateColorMul[2] = v[2] ?? this.edgeNoStateColorMul[2];\n      this.edgeNoStateColorMul[3] = v[3] ?? this.edgeNoStateColorMul[3];\n    }\n    if (style.colorAdd != null) {\n      const v = style.colorAdd;\n      this.edgeNoStateColorAdd[0] = v[0] ?? this.edgeNoStateColorAdd[0];\n      this.edgeNoStateColorAdd[1] = v[1] ?? this.edgeNoStateColorAdd[1];\n      this.edgeNoStateColorAdd[2] = v[2] ?? this.edgeNoStateColorAdd[2];\n      this.edgeNoStateColorAdd[3] = v[3] ?? this.edgeNoStateColorAdd[3];\n    }\n  }\n\n  setEdgeRenderingMode(mode) {\n    if (mode === 'line' || mode === 'quad') {\n      this.edgeRenderingMode = mode;\n    }\n  }\n\n  getEffectiveEdgeRenderingMode() {\n    return this.isFastEdgeRenderingActive() ? 'line' : this.edgeRenderingMode;\n  }\n\n  setEdgeFastRendering(enabled) {\n    this.edgeFastRendering = enabled === true;\n  }\n\n  setAdaptiveEdgeFastRendering(enabled) {\n    this.edgeAdaptiveFastRendering = enabled === true;\n  }\n\n  isFastEdgeRenderingActive() {\n    return this.edgeFastRendering === true || this.edgeAdaptiveFastRendering === true;\n  }\n\n  setEdgeTransparencyMode(mode) {\n    this.edgeTransparencyMode = this.normalizeEdgeTransparencyMode(mode);\n  }\n\n  setPositionDelegate(delegate = null) {\n    this.positionDelegate = delegate ?? null;\n    return this;\n  }\n\n  setPositionInterpolationState(state = null) {\n    const enabled = state?.enabled === true;\n    const factor = Number.isFinite(state?.factor) ? Math.max(0, Math.min(1, Number(state.factor))) : 1;\n    this.positionInterpolation = {\n      enabled,\n      factor,\n      sourceVersion: Number.isFinite(state?.sourceVersion) ? Number(state.sourceVersion) : 0,\n      sourceCount: Number.isFinite(state?.sourceCount) ? Math.max(0, Math.floor(Number(state.sourceCount))) : 0,\n      sourceView: state?.sourceView ?? null,\n      sourceWebGPUBuffer: state?.sourceWebGPUBuffer ?? null,\n      sourceWebGLTexture: state?.sourceWebGLTexture ?? null,\n      sourceTextureMeta: state?.sourceTextureMeta ?? null,\n    };\n    return this;\n  }\n\n  getPositionInterpolationState() {\n    return this.positionInterpolation ?? null;\n  }\n\n  resolvePositionSourceOverride(network, backendContext = {}) {\n    const delegate = this.positionDelegate;\n    if (!delegate || !network) return null;\n    const delegateNetwork = delegate?._context?.network ?? network;\n\n    const context = {\n      network: delegateNetwork,\n      graphLayer: this,\n      backend: backendContext.backend ?? null,\n      device: backendContext.device ?? null,\n      gl: backendContext.gl ?? null,\n    };\n\n    const ensureSynchronized = (reason = 'delegate-access') => {\n      if (typeof delegate.ensureSynchronized !== 'function') return;\n      try {\n        delegate.ensureSynchronized({ ...context, reason });\n      } catch (error) {\n        console.warn('GraphLayer: position delegate synchronization failed', error);\n      }\n    };\n\n    const pickValue = (...fns) => {\n      for (const fn of fns) {\n        if (typeof fn !== 'function') continue;\n        ensureSynchronized(`before:${fn.name || 'callback'}`);\n        try {\n          const value = fn.call(delegate, context);\n          if (value != null) return value;\n        } catch (error) {\n          console.warn('GraphLayer: position delegate callback failed', error);\n        }\n      }\n      return null;\n    };\n\n    ensureSynchronized('resolve-position-override');\n    const gpuShared = pickValue(delegate.getGpuPositionResource, delegate.getPositionResource);\n    const webgpuRaw = pickValue(delegate.getWebGPUPositionBuffer);\n    const webglRaw = pickValue(delegate.getWebGLPositionTexture);\n    const versionRaw = pickValue(delegate.getVersion);\n    const hasGpuResource = Boolean(gpuShared || webgpuRaw || webglRaw);\n    const view = hasGpuResource\n      ? null\n      : pickValue(delegate.getNodePositionView, delegate.getPositionView);\n\n    const normalizeBuffer = (raw) => {\n      if (!raw) return null;\n      if (raw.buffer) return raw.buffer;\n      return raw;\n    };\n\n    const normalizeTexture = (raw) => {\n      if (!raw) return null;\n      if (raw.texture) return raw.texture;\n      return raw;\n    };\n\n    const version =\n      Number.isFinite(versionRaw)\n        ? Number(versionRaw)\n        : (Number.isFinite(delegate.version) ? Number(delegate.version) : 0);\n    const countFromView = view && Number.isFinite(view.length)\n      ? Math.floor((view.length ?? 0) / 3)\n      : 0;\n    const countFromActiveIndices = (() => {\n      try {\n        return Math.max(0, Math.floor(Number(network?.nodeCount ?? 0)));\n      } catch (_) {\n        return 0;\n      }\n    })();\n    const count = Number.isFinite(gpuShared?.count)\n      ? Math.max(0, Math.floor(Number(gpuShared.count)))\n      : (Number.isFinite(webgpuRaw?.count)\n        ? Math.max(0, Math.floor(Number(webgpuRaw.count)))\n        : (Number.isFinite(webglRaw?.count)\n          ? Math.max(0, Math.floor(Number(webglRaw.count)))\n          : (countFromView || countFromActiveIndices)));\n    const webgpuBuffer = normalizeBuffer(webgpuRaw) ?? normalizeBuffer(gpuShared);\n    const webglTexture = normalizeTexture(webglRaw) ?? normalizeTexture(gpuShared);\n    const webglTextureVersion = Number.isFinite(webglRaw?.version)\n      ? Number(webglRaw.version)\n      : (Number.isFinite(gpuShared?.version) ? Number(gpuShared.version) : version);\n    const webglTextureCount = Number.isFinite(webglRaw?.count)\n      ? Math.max(0, Math.floor(Number(webglRaw.count)))\n      : count;\n    const webglTextureMeta = webglRaw?.meta ?? null;\n\n    if (!view && !webgpuBuffer && !webglTexture) return null;\n    return {\n      view: view ?? null,\n      version,\n      count,\n      webgpuBuffer: webgpuBuffer ?? null,\n      webglTexture: webglTexture ?? null,\n      webglTextureVersion,\n      webglTextureCount,\n      webglTextureMeta,\n    };\n  }\n}\n","function getMode(entry) {\n  return entry && typeof entry === 'object' ? entry.mode : null;\n}\n\nfunction isUniform(entry) {\n  return getMode(entry) === 'uniform';\n}\n\nexport class GraphVisualSchema {\n  constructor(options = {}) {\n    this.nodeOutlineUseAttributes = options.nodeOutlineUseAttributes === true;\n  }\n\n  static fromNetwork(network, options = {}) {\n    const schema = new GraphVisualSchema(options);\n    schema.visualConfig = (network && network.__heliosVisualConfig && typeof network.__heliosVisualConfig === 'object')\n      ? network.__heliosVisualConfig\n      : null;\n    return schema;\n  }\n\n  getNodeVariant() {\n    const nodeCfg = this.visualConfig?.node ?? null;\n    if (nodeCfg) {\n      return {\n        colorBuffer: nodeCfg?.color?.mode !== 'uniform',\n        sizeBuffer: nodeCfg?.size?.mode !== 'uniform',\n        outlineWidthBuffer: nodeCfg?.outline?.mode !== 'uniform',\n        outlineColorBuffer: nodeCfg?.outlineColor?.mode !== 'uniform',\n      };\n    }\n\n    // If no visual config exists, preserve prior behavior: outline can be gated\n    // by the global toggle.\n    return {\n      colorBuffer: true,\n      sizeBuffer: true,\n      outlineWidthBuffer: this.nodeOutlineUseAttributes === true,\n      outlineColorBuffer: this.nodeOutlineUseAttributes === true,\n    };\n  }\n\n  getEdgeVariant() {\n    const edgeCfg = this.visualConfig?.edge ?? null;\n    return {\n      colorBuffer: !isUniform(edgeCfg?.color),\n      widthBuffer: !isUniform(edgeCfg?.width),\n      opacityBuffer: !isUniform(edgeCfg?.opacity),\n      endpointSizeBuffer: !isUniform(edgeCfg?.endpointSize),\n    };\n  }\n}\n","function resolveNodeOptions(options = {}) {\n  const node = options?.node && typeof options.node === 'object' ? options.node : {};\n  const mode = (value) => (value === 'uniform' ? 'uniform' : 'buffer');\n  return {\n    color: mode(node.color),\n    size: mode(node.size),\n    outline: mode(node.outline),\n    outlineColor: mode(node.outlineColor),\n    shading: node.shading === true,\n  };\n}\n\nfunction resolveEdgeOptions(options = {}) {\n  const edge = options?.edge && typeof options.edge === 'object' ? options.edge : {};\n  const channel = (entry, fallbackSource = 'edge') => ({\n    mode: entry?.mode === 'uniform' ? 'uniform' : 'buffer',\n    source: entry?.source === 'node' ? 'node' : fallbackSource,\n    endpoints: (entry?.endpoints === 'source' || entry?.endpoints === 'from')\n      ? 'source'\n      : ((entry?.endpoints === 'destination' || entry?.endpoints === 'target' || entry?.endpoints === 'to')\n        ? 'destination'\n        : 'both'),\n  });\n  return {\n    color: channel(edge.color, 'edge'),\n    width: channel(edge.width, 'edge'),\n    opacity: channel(edge.opacity, 'edge'),\n    endpointSize: channel(edge.endpointSize, 'edge'),\n    shading: edge.shading === true,\n    fastPath: edge.fastPath === true,\n    cameraMode: edge.cameraMode === '2d' ? '2d' : (edge.cameraMode === '3d' ? '3d' : 'dynamic'),\n    semanticZoom: edge.semanticZoom !== false,\n    trim: edge.trim !== false,\n    widthClampToNodeDiameter: edge.widthClampToNodeDiameter !== false,\n    edgeState: edge.edgeState !== false,\n    endpointState: edge.endpointState !== false,\n    propagateHoveredNodeToEdges: edge.propagateHoveredNodeToEdges === true,\n    propagateSelectedNodesToEdges: edge.propagateSelectedNodesToEdges === true,\n  };\n}\n\nconst PACK_DEPTH_GLSL = /* glsl */ `\nvec4 packDepthToRGBA(const in float v) {\n  const vec4 bitShift = vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0);\n  const vec4 bitMask = vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);\n  vec4 res = fract(v * bitShift);\n  res -= res.xxyz * bitMask;\n  return res;\n}`;\n\nexport function createGraphWebGLSources(options = {}) {\n  const node = resolveNodeOptions(options);\n  const edge = resolveEdgeOptions(options);\n  const stateSlots = Math.max(1, Math.min(32, Number(options?.stateSlots) || 4));\n  const forceVisibilityBoost = 1000.0;\n\n  const nodeColorBuffer = node.color !== 'uniform';\n  const nodeSizeBuffer = node.size !== 'uniform';\n  const nodeOutlineBuffer = node.outline !== 'uniform';\n  const nodeOutlineColorBuffer = node.outlineColor !== 'uniform';\n\n  const edgeColorSourceNode = edge.color.source === 'node';\n  const edgeWidthSourceNode = edge.width.source === 'node';\n  const edgeOpacitySourceNode = edge.opacity.source === 'node';\n  const edgeEndpointSizeSourceNode = edge.endpointSize.source === 'node';\n  const edgeColorBuffer = edge.color.mode !== 'uniform' && !edgeColorSourceNode;\n  const edgeWidthBuffer = edge.width.mode !== 'uniform' && !edgeWidthSourceNode;\n  const edgeOpacityBuffer = edge.opacity.mode !== 'uniform' && !edgeOpacitySourceNode;\n  const edgeEndpointSizeBuffer = edge.endpointSize.mode !== 'uniform' && !edgeEndpointSizeSourceNode;\n\n  const edgeColorEndpoints = edge.color.endpoints === 'source' ? 1 : (edge.color.endpoints === 'destination' ? 2 : 0);\n  const edgeWidthEndpoints = edge.width.endpoints === 'source' ? 1 : (edge.width.endpoints === 'destination' ? 2 : 0);\n  const edgeOpacityEndpoints = edge.opacity.endpoints === 'source' ? 1 : (edge.opacity.endpoints === 'destination' ? 2 : 0);\n  const edgeEndpointSizeEndpoints = edge.endpointSize.endpoints === 'source'\n    ? 1\n    : (edge.endpointSize.endpoints === 'destination' ? 2 : 0);\n  const fastEdgePath = edge.fastPath === true;\n  const nodeShadingEnabled = node.shading === true;\n  const edgeShadingEnabled = !fastEdgePath && edge.shading === true;\n  const edgeCameraMode = edge.cameraMode;\n  const edgeSemanticZoomEnabled = !fastEdgePath && edge.semanticZoom === true;\n  const edgeTrimEnabled = !fastEdgePath && edge.trim === true;\n  const edgeWidthClampToNodeDiameter = !fastEdgePath && edge.widthClampToNodeDiameter === true;\n  const edgeEndpointGeometryEnabled = edgeTrimEnabled || edgeWidthClampToNodeDiameter;\n  const edgeStateEnabled = !fastEdgePath && edge.edgeState === true;\n  const edgeEndpointStateEnabled = !fastEdgePath\n    && (edge.endpointState === true || edge.propagateSelectedNodesToEdges === true)\n    && (edgeEndpointGeometryEnabled || edge.propagateSelectedNodesToEdges === true);\n\n  const nodeColorDecl = nodeColorBuffer\n    ? `\nuniform sampler2D u_nodeColors;\nuniform int u_hasNodeColors;`\n    : '';\n  const nodeSizeDecl = nodeSizeBuffer\n    ? `\nuniform sampler2D u_nodeSizes;\nuniform int u_hasNodeSizes;`\n    : '';\n  const nodeOutlineDecl = nodeOutlineBuffer\n    ? `\nuniform sampler2D u_nodeOutlineWidths;\nuniform int u_hasNodeOutlineWidths;`\n    : '';\n  const nodeOutlineColorDecl = nodeOutlineColorBuffer\n    ? `\nuniform sampler2D u_nodeOutlineColors;\nuniform int u_hasNodeOutlineColors;`\n    : '';\n\nconst nodeFetchColor = nodeColorBuffer\n    ? `\nvec4 fetchNodeColor(uint id) {\n  if (u_hasNodeColors == 0) return u_defaultNodeColor;\n  return texelFetch(u_nodeColors, textureCoord(u_nodeColors, id), 0);\n}`\n    : `\nvec4 fetchNodeColor(uint id) {\n  return u_defaultNodeColor;\n}`;\n\n  const nodeFetchSize = nodeSizeBuffer\n    ? `\nfloat fetchNodeSize(uint id) {\n  if (u_hasNodeSizes == 0) return u_defaultNodeSize;\n  return texelFetch(u_nodeSizes, textureCoord(u_nodeSizes, id), 0).x;\n}`\n    : `\nfloat fetchNodeSize(uint id) {\n  return u_defaultNodeSize;\n}`;\n\n  const nodeFetchOutline = nodeOutlineBuffer\n    ? `\nfloat fetchNodeOutlineWidth(uint id) {\n  if (u_hasNodeOutlineWidths == 0) return u_nodeOutline;\n  return texelFetch(u_nodeOutlineWidths, textureCoord(u_nodeOutlineWidths, id), 0).x;\n}`\n    : `\nfloat fetchNodeOutlineWidth(uint id) {\n  return u_nodeOutline;\n}`;\n\n  const nodeFetchOutlineColor = nodeOutlineColorBuffer\n    ? `\nvec4 fetchNodeOutlineColor(uint id) {\n  if (u_hasNodeOutlineColors == 0) return u_outlineColor;\n  return texelFetch(u_nodeOutlineColors, textureCoord(u_nodeOutlineColors, id), 0);\n}`\n    : `\nvec4 fetchNodeOutlineColor(uint id) {\n  return u_outlineColor;\n}`;\n\n  const nodeFetchState = `\nuint fetchNodeState(uint id) {\n  if (u_hasNodeStates == 0) return 0u;\n  return texelFetch(u_nodeStates, textureCoord(u_nodeStates, id), 0).x;\n}`;\n\n  const edgeColorDecl = edgeColorBuffer\n    ? `\nuniform sampler2D u_edgeColors;\nuniform int u_hasEdgeColors;`\n    : '';\n  const edgeOpacityDecl = edgeOpacityBuffer\n    ? `\nuniform sampler2D u_edgeOpacities;\nuniform int u_hasEdgeOpacities;`\n    : '';\n  const edgeWidthDecl = edgeWidthBuffer\n    ? `\nuniform sampler2D u_edgeWidths;\nuniform int u_hasEdgeWidths;`\n    : '';\n  const edgeEndpointSizeDecl = edgeEndpointSizeBuffer\n    ? `\nuniform sampler2D u_edgeEndpointSizes;\nuniform int u_hasEdgeEndpointSizes;`\n    : '';\n\n  const edgeFetchColor = edgeColorBuffer\n    ? `\nvec4 fetchEdgeColor(uint id, bool target) {\n  if (u_hasEdgeColors == 0) return target ? u_defaultEdgeColorEnd : u_defaultEdgeColorStart;\n  int offset = int(id) * 2 + (target ? 1 : 0);\n  return texelFetch(u_edgeColors, textureCoord(u_edgeColors, uint(offset)), 0);\n}`\n    : `\nvec4 fetchEdgeColor(uint id, bool target) {\n  return target ? u_defaultEdgeColorEnd : u_defaultEdgeColorStart;\n}`;\n\n  const edgeFetchOpacity = edgeOpacityBuffer\n    ? `\nvec2 fetchEdgeOpacityPair(uint edgeId) {\n  if (u_hasEdgeOpacities == 0) return u_defaultEdgeOpacity;\n  return texelFetch(u_edgeOpacities, textureCoord(u_edgeOpacities, edgeId), 0).xy;\n}`\n    : `\nvec2 fetchEdgeOpacityPair(uint edgeId) {\n  return u_defaultEdgeOpacity;\n}`;\n\n  const edgeFetchWidth = edgeWidthBuffer\n    ? `\nvec2 fetchEdgeWidthPair(uint edgeId) {\n  if (u_hasEdgeWidths == 0) return u_defaultEdgeWidth;\n  return texelFetch(u_edgeWidths, textureCoord(u_edgeWidths, edgeId), 0).xy;\n}`\n    : `\nvec2 fetchEdgeWidthPair(uint edgeId) {\n  return u_defaultEdgeWidth;\n}`;\n\n  const edgeFetchEndpointSize = edgeEndpointSizeBuffer\n    ? `\nvec2 fetchEdgeEndpointSizePair(uint edgeId) {\n  if (u_hasEdgeEndpointSizes == 0) return u_defaultEdgeEndpointSize;\n  return texelFetch(u_edgeEndpointSizes, textureCoord(u_edgeEndpointSizes, edgeId), 0).xy;\n}`\n    : `\nvec2 fetchEdgeEndpointSizePair(uint edgeId) {\n  return u_defaultEdgeEndpointSize;\n}`;\n\n  const edgeColorNodeBlock = edgeColorSourceNode\n    ? `\n  vec4 nodeSourceColor = fetchNodeColor(sourceId);\n  vec4 nodeTargetColor = fetchNodeColor(targetId);\n  if (${edgeColorEndpoints} == 1) {\n    sourceColor = nodeSourceColor;\n    targetColor = nodeSourceColor;\n  } else if (${edgeColorEndpoints} == 2) {\n    sourceColor = nodeTargetColor;\n    targetColor = nodeTargetColor;\n  } else {\n    sourceColor = nodeSourceColor;\n    targetColor = nodeTargetColor;\n  }`\n    : '';\n\n  const TEXTURE_INDEX_HELPERS = `\nivec2 textureCoord(sampler2D tex, uint index) {\n  ivec2 size = textureSize(tex, 0);\n  int width = max(size.x, 1);\n  int i = int(index);\n  return ivec2(i % width, i / width);\n}\n\nivec2 textureCoord(usampler2D tex, uint index) {\n  ivec2 size = textureSize(tex, 0);\n  int width = max(size.x, 1);\n  int i = int(index);\n  return ivec2(i % width, i / width);\n}`;\n\n  const edgeStateUniformDecl = edgeStateEnabled\n    ? `\nuniform usampler2D u_edgeStates;\nuniform int u_hasEdgeStates;\nuniform uint u_hoverEdgeIndex;\nuniform uint u_hoverEdgeState;\nuniform uint u_hoverEdgeIsVirtual;\n${edge.propagateHoveredNodeToEdges ? 'uniform uint u_hoverNodeIndex;\\nuniform uint u_hoverNodeIsVirtual;\\n' : ''}uniform uint u_edgeStateForceMaxAlphaMask;\nuniform vec4 u_edgeHoverScale;\nuniform vec4 u_edgeHoverColorMul;\nuniform vec4 u_edgeHoverColorAdd;\nuniform vec4 u_edgeNoStateScale;\nuniform vec4 u_edgeNoStateColorMul;\nuniform vec4 u_edgeNoStateColorAdd;\nuniform vec4 u_edgeStateScale[${stateSlots}];\nuniform vec4 u_edgeStateColorMul[${stateSlots}];\nuniform vec4 u_edgeStateColorAdd[${stateSlots}];`\n    : '';\n\n  const edgeStateFetch = edgeStateEnabled\n    ? `\nuint fetchEdgeState(uint id) {\n  if (u_hasEdgeStates == 0) return 0u;\n  return texelFetch(u_edgeStates, textureCoord(u_edgeStates, id), 0).x;\n}`\n    : '';\n\n  const edgeLineStateBlock = edgeStateEnabled\n    ? `\n  uint state = fetchEdgeState(a_edgeId);\n  uvec2 endpointStatePair = ${edgeEndpointStateEnabled ? 'fetchEdgeEndpointStatePair(sourceId, targetId)' : 'uvec2(0u, 0u)'};\n  if (u_hoverEdgeIndex != 4294967295u && a_edgeId == u_hoverEdgeIndex) {\n    if (u_hoverEdgeIsVirtual == 0u) state |= u_hoverEdgeState;\n  }\n  ${edge.propagateHoveredNodeToEdges\n    ? `\n  if (u_hoverNodeIndex != 4294967295u && (sourceId == u_hoverNodeIndex || targetId == u_hoverNodeIndex)) {\n    if (u_hoverNodeIsVirtual == 0u) state |= 4u;\n  }`\n    : ''}\n  ${edge.propagateSelectedNodesToEdges\n    ? `\n  if (((endpointStatePair.x | endpointStatePair.y) & 2u) != 0u) {\n    state |= 2u;\n  }`\n    : ''}\n  bool forceMaxAlpha = (state & u_edgeStateForceMaxAlphaMask) != 0u;\n  float opacityMul = 1.0;\n  vec3 rgbMul = vec3(1.0);\n  vec3 rgbAdd = vec3(0.0);\n  uint discardFlag = 0u;\n  bool virtualHover = (u_hoverEdgeIndex != 4294967295u && a_edgeId == u_hoverEdgeIndex && u_hoverEdgeIsVirtual != 0u)${edge.propagateHoveredNodeToEdges ? ' || (u_hoverNodeIndex != 4294967295u && (sourceId == u_hoverNodeIndex || targetId == u_hoverNodeIndex) && u_hoverNodeIsVirtual != 0u)' : ''};\n  if (state == 0u) {\n    vec4 scale = u_edgeNoStateScale;\n    opacityMul *= scale.y;\n    rgbMul *= u_edgeNoStateColorMul.rgb;\n    rgbAdd += u_edgeNoStateColorAdd.rgb;\n    discardFlag = uint(scale.w > 0.5);\n  } else {\n    for (int i = 0; i < ${stateSlots}; i += 1) {\n      float enabled = float((state >> uint(i)) & 1u);\n      vec4 scale = u_edgeStateScale[i];\n      opacityMul *= mix(1.0, scale.y, enabled);\n      rgbMul *= mix(vec3(1.0), u_edgeStateColorMul[i].rgb, enabled);\n      rgbAdd += u_edgeStateColorAdd[i].rgb * enabled;\n      discardFlag |= uint((scale.w > 0.5) && (enabled > 0.5));\n    }\n  }\n  if (virtualHover) {\n    vec4 scale = u_edgeHoverScale;\n    opacityMul *= scale.y;\n    rgbMul *= u_edgeHoverColorMul.rgb;\n    rgbAdd += u_edgeHoverColorAdd.rgb;\n    discardFlag |= uint(scale.w > 0.5);\n    forceMaxAlpha = forceMaxAlpha || (u_edgeHoverColorMul.a > 1.5);\n  }`\n    : `\n  bool forceMaxAlpha = false;\n  float opacityMul = 1.0;\n  vec3 rgbMul = vec3(1.0);\n  vec3 rgbAdd = vec3(0.0);\n  uint discardFlag = 0u;`;\n\n  const edgeQuadStateBlock = edgeStateEnabled\n    ? `\n  uint state = fetchEdgeState(a_edgeId);\n  uvec2 endpointStatePair = ${edgeEndpointStateEnabled ? 'fetchEdgeEndpointStatePair(sourceId, targetId)' : 'uvec2(0u, 0u)'};\n  if (u_hoverEdgeIndex != 4294967295u && a_edgeId == u_hoverEdgeIndex) {\n    if (u_hoverEdgeIsVirtual == 0u) state |= u_hoverEdgeState;\n  }\n  ${edge.propagateHoveredNodeToEdges\n    ? `\n  if (u_hoverNodeIndex != 4294967295u && (sourceId == u_hoverNodeIndex || targetId == u_hoverNodeIndex)) {\n    if (u_hoverNodeIsVirtual == 0u) state |= 4u;\n  }`\n    : ''}\n  ${edge.propagateSelectedNodesToEdges\n    ? `\n  if (((endpointStatePair.x | endpointStatePair.y) & 2u) != 0u) {\n    state |= 2u;\n  }`\n    : ''}\n  bool forceMaxAlpha = (state & u_edgeStateForceMaxAlphaMask) != 0u;\n  float widthMul = 1.0;\n  float opacityMul = 1.0;\n  vec3 rgbMul = vec3(1.0);\n  vec3 rgbAdd = vec3(0.0);\n  uint discardFlag = 0u;\n  bool virtualHover = (u_hoverEdgeIndex != 4294967295u && a_edgeId == u_hoverEdgeIndex && u_hoverEdgeIsVirtual != 0u)${edge.propagateHoveredNodeToEdges ? ' || (u_hoverNodeIndex != 4294967295u && (sourceId == u_hoverNodeIndex || targetId == u_hoverNodeIndex) && u_hoverNodeIsVirtual != 0u)' : ''};\n  if (state == 0u) {\n    vec4 scale = u_edgeNoStateScale;\n    widthMul *= scale.x;\n    opacityMul *= scale.y;\n    rgbMul *= u_edgeNoStateColorMul.rgb;\n    rgbAdd += u_edgeNoStateColorAdd.rgb;\n    discardFlag = uint(scale.w > 0.5);\n  } else {\n    for (int i = 0; i < ${stateSlots}; i += 1) {\n      float enabled = float((state >> uint(i)) & 1u);\n      vec4 scale = u_edgeStateScale[i];\n      widthMul *= mix(1.0, scale.x, enabled);\n      opacityMul *= mix(1.0, scale.y, enabled);\n      rgbMul *= mix(vec3(1.0), u_edgeStateColorMul[i].rgb, enabled);\n      rgbAdd += u_edgeStateColorAdd[i].rgb * enabled;\n      discardFlag |= uint((scale.w > 0.5) && (enabled > 0.5));\n    }\n  }\n  if (virtualHover) {\n    vec4 scale = u_edgeHoverScale;\n    widthMul *= scale.x;\n    opacityMul *= scale.y;\n    rgbMul *= u_edgeHoverColorMul.rgb;\n    rgbAdd += u_edgeHoverColorAdd.rgb;\n    discardFlag |= uint(scale.w > 0.5);\n    forceMaxAlpha = forceMaxAlpha || (u_edgeHoverColorMul.a > 1.5);\n  }`\n    : `\n  bool forceMaxAlpha = false;\n  float widthMul = 1.0;\n  float opacityMul = 1.0;\n  vec3 rgbMul = vec3(1.0);\n  vec3 rgbAdd = vec3(0.0);\n  uint discardFlag = 0u;`;\n\n  const edgeEndpointStateUniformDecl = edgeEndpointStateEnabled\n    ? `\n\tuniform usampler2D u_nodeStates;\n\tuniform int u_hasNodeStates;\n\tuniform vec4 u_nodeNoStateScale;\n\tuniform vec4 u_nodeStateScale[${stateSlots}];`\n    : '';\n\n  const edgeEndpointStateFetch = edgeEndpointStateEnabled\n    ? `\n\t${nodeFetchState}\n\n\tuvec2 fetchEdgeEndpointStatePair(uint sourceId, uint targetId) {\n\t  return uvec2(fetchNodeState(sourceId), fetchNodeState(targetId));\n\t}`\n    : '';\n\n  const edgeEndpointGeometryBlock = edgeEndpointGeometryEnabled\n    ? `\n\t  uvec2 trimEndpointStatePair = ${edgeEndpointStateEnabled ? 'fetchEdgeEndpointStatePair(sourceId, targetId)' : 'uvec2(0u, 0u)'};\n  float startSizeMul = 1.0;\n  float endSizeMul = 1.0;\n  ${edgeEndpointStateEnabled\n    ? `\n  if (trimEndpointStatePair.x == 0u) {\n    startSizeMul *= u_nodeNoStateScale.x;\n  } else {\n    for (int i = 0; i < ${stateSlots}; i += 1) {\n      float enabledStart = float((trimEndpointStatePair.x >> uint(i)) & 1u);\n      float slotMul = u_nodeStateScale[i].x;\n      startSizeMul *= mix(1.0, slotMul, enabledStart);\n    }\n  }\n  if (trimEndpointStatePair.y == 0u) {\n    endSizeMul *= u_nodeNoStateScale.x;\n  } else {\n    for (int i = 0; i < ${stateSlots}; i += 1) {\n      float enabledEnd = float((trimEndpointStatePair.y >> uint(i)) & 1u);\n      float slotMul = u_nodeStateScale[i].x;\n      endSizeMul *= mix(1.0, slotMul, enabledEnd);\n    }\n  }`\n    : ''}\n\n  vec2 endpointSizePair = ${edgeEndpointSizeSourceNode\n    ? `resolveNodePair(\n      u_nodeEndpointSizeSource,\n      sourceId,\n      targetId,\n      u_hasNodeEndpointSizeSource,\n      ${edgeEndpointSizeEndpoints},\n      u_defaultNodeEndpointSizeSource\n    )`\n    : 'fetchEdgeEndpointSizePair(a_edgeId)'};\n  float semanticScale = ${(!edgeSemanticZoomEnabled || edgeCameraMode === '3d')\n    ? '1.0'\n    : (edgeCameraMode === '2d'\n      ? '((u_semanticZoomExponent > 0.0) ? (1.0 / pow(max(u_zoom2D, 1e-3), u_semanticZoomExponent)) : 1.0)'\n      : '((u_is2D == 1 && u_semanticZoomExponent > 0.0) ? (1.0 / pow(max(u_zoom2D, 1e-3), u_semanticZoomExponent)) : 1.0)')};\n  float startRadius = max((u_nodeSizeBase + u_nodeSizeScale * endpointSizePair.x) * startSizeMul, 0.0) * 0.5 * semanticScale;\n  float endRadius = max((u_nodeSizeBase + u_nodeSizeScale * endpointSizePair.y) * endSizeMul, 0.0) * 0.5 * semanticScale;\n  ${edgeTrimEnabled\n    ? `\n  float trimStart = startRadius * u_edgeEndpointTrim;\n  float trimEnd = endRadius * u_edgeEndpointTrim;\n  vec3 startPos = sourcePos + dirN * trimStart;\n  vec3 endPos = targetPos - dirN * trimEnd;\n`\n    : `\n  vec3 startPos = sourcePos;\n  vec3 endPos = targetPos;\n`}\n`\n    : `\n  float semanticScale = ${(!edgeSemanticZoomEnabled || edgeCameraMode === '3d')\n    ? '1.0'\n    : (edgeCameraMode === '2d'\n      ? '((u_semanticZoomExponent > 0.0) ? (1.0 / pow(max(u_zoom2D, 1e-3), u_semanticZoomExponent)) : 1.0)'\n      : '((u_is2D == 1 && u_semanticZoomExponent > 0.0) ? (1.0 / pow(max(u_zoom2D, 1e-3), u_semanticZoomExponent)) : 1.0)')};\n  vec3 startPos = sourcePos;\n  vec3 endPos = targetPos;\n`;\n\n  const edgeQuadWidthClampBlock = edgeWidthClampToNodeDiameter\n    ? `\n  float maxSegmentWidth = max(mix(startRadius, endRadius, segmentMix) * 2.0, 0.0);\n  width = min(max(width, 0.0), maxSegmentWidth);`\n    : '';\n\n  const edgeQuadWidthDirBlock = edgeCameraMode === '2d'\n    ? `\n  vec3 widthDir = normalize(vec3(-dirN.y, dirN.x, 0.0));`\n    : (edgeCameraMode === '3d'\n      ? `\n  vec3 viewDir = u_cameraPosition - centerPos;\n  float viewDirLen = length(viewDir);\n  viewDir = viewDirLen > 1e-5 ? (viewDir / viewDirLen) : vec3(0.0, 0.0, 1.0);\n  vec3 widthDir = cross(viewDir, dirN);\n  float widthDirLen = length(widthDir);\n  if (widthDirLen <= 1e-5) {\n    vec3 cameraUp = normalize(u_cameraUp);\n    widthDir = cross(cameraUp, dirN);\n    widthDirLen = length(widthDir);\n  }\n  if (widthDirLen <= 1e-5) {\n    vec3 cameraRight = normalize(u_cameraRight);\n    widthDir = cross(dirN, cameraRight);\n    widthDirLen = length(widthDir);\n  }\n  widthDir = widthDirLen > 1e-5 ? (widthDir / widthDirLen) : vec3(0.0, 1.0, 0.0);`\n      : `\n  vec3 widthDir;\n  if (u_is2D == 1) {\n    widthDir = normalize(vec3(-dirN.y, dirN.x, 0.0));\n  } else {\n    vec3 viewDir = u_cameraPosition - centerPos;\n    float viewDirLen = length(viewDir);\n    viewDir = viewDirLen > 1e-5 ? (viewDir / viewDirLen) : vec3(0.0, 0.0, 1.0);\n    widthDir = cross(viewDir, dirN);\n    float widthDirLen = length(widthDir);\n    if (widthDirLen <= 1e-5) {\n      vec3 cameraUp = normalize(u_cameraUp);\n      widthDir = cross(cameraUp, dirN);\n      widthDirLen = length(widthDir);\n    }\n    if (widthDirLen <= 1e-5) {\n      vec3 cameraRight = normalize(u_cameraRight);\n      widthDir = cross(dirN, cameraRight);\n      widthDirLen = length(widthDir);\n    }\n    widthDir = widthDirLen > 1e-5 ? (widthDir / widthDirLen) : vec3(0.0, 1.0, 0.0);\n  }`);\n\n  const shadedUniformDecl = `\nuniform vec3 u_shadedLightDirection;\nuniform vec3 u_shadedLightColor;\nuniform vec3 u_shadedAmbientTopColor;\nuniform vec3 u_shadedAmbientBottomColor;\nuniform vec3 u_shadedSpecularColor;\nuniform vec4 u_shadedParams;`;\n\n  const nodeShadingHelper = nodeShadingEnabled\n    ? `\nvec3 applyNodeShading(vec3 baseColor, vec2 local) {\n  float lensqr = dot(local, local);\n  vec3 normal = normalize(vec3(local.xy, sqrt(max(1.0 - lensqr, 0.0))));\n  vec3 lightDir = normalize(u_shadedLightDirection);\n  vec3 ambient = mix(u_shadedAmbientBottomColor, u_shadedAmbientTopColor, normal.z * 0.5 + 0.5) * u_shadedParams.w;\n  float diffuse = max(dot(lightDir, normal), 0.0);\n  vec3 reflection = reflect(-lightDir, normal);\n  float specular = pow(max(dot(vec3(0.0, 0.0, 1.0), reflection), 0.0), max(u_shadedParams.y, 1.0)) * u_shadedParams.x;\n  vec3 shaded = baseColor * (ambient + u_shadedLightColor * (diffuse * u_shadedParams.z)) + u_shadedSpecularColor * specular;\n  return clamp(shaded, 0.0, 1.0);\n}`\n    : '';\n\n  const edgeShadingHelper = edgeShadingEnabled\n    ? `\nvec3 applyEdgeShading(vec3 baseColor, float edgeYInput, vec2 shadeBasis) {\n  float edgeY = clamp(edgeYInput, -1.0, 1.0);\n  vec2 basis = shadeBasis;\n  float basisLen = length(basis);\n  basis = basisLen > 1e-5 ? (basis / basisLen) : vec2(0.0, 1.0);\n  vec3 normal = normalize(vec3(basis * edgeY, sqrt(max(1.0 - edgeY * edgeY, 0.0))));\n  vec3 lightDir = normalize(u_shadedLightDirection);\n  vec3 ambient = mix(u_shadedAmbientBottomColor, u_shadedAmbientTopColor, normal.z * 0.5 + 0.5) * u_shadedParams.w;\n  float diffuse = max(dot(lightDir, normal), 0.0);\n  vec3 reflection = reflect(-lightDir, normal);\n  float specular = pow(max(dot(vec3(0.0, 0.0, 1.0), reflection), 0.0), max(u_shadedParams.y, 1.0)) * u_shadedParams.x;\n  vec3 shaded = baseColor * (ambient + u_shadedLightColor * (diffuse * u_shadedParams.z)) + u_shadedSpecularColor * specular;\n  return clamp(shaded, 0.0, 1.0);\n}`\n    : '';\n\n  const NODE_VERTEX_SOURCE = `#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp usampler2D;\n\nlayout (location = 0) in vec2 a_corner;\nlayout (location = 1) in uint a_nodeId;\n\nuniform mat4 u_viewProjection;\nuniform sampler2D u_nodePositions;${nodeColorDecl}${nodeSizeDecl}${nodeOutlineDecl}${nodeOutlineColorDecl}\nuniform sampler2D u_nodePositionsFrom;\nuniform float u_nodeInterpolationFactor;\nuniform int u_nodeInterpolationEnabled;\nuniform vec3 u_cameraPosition;\nuniform vec3 u_cameraUp;\nuniform vec3 u_cameraRight;\nuniform int u_is2D;\nuniform float u_zoom2D;\nuniform float u_semanticZoomExponent;\nuniform vec4 u_defaultNodeColor;\nuniform float u_defaultNodeSize;\nuniform float u_nodeOpacityBase;\nuniform float u_nodeOpacityScale;\nuniform float u_nodeSizeBase;\nuniform float u_nodeSizeScale;\nuniform float u_nodeOutline;\nuniform float u_outlineWidthBase;\nuniform float u_outlineWidthScale;\nuniform vec4 u_outlineColor;\nuniform usampler2D u_nodeStates;\nuniform int u_hasNodeStates;\nuniform uint u_hoverNodeIndex;\nuniform uint u_hoverNodeState;\nuniform uint u_hoverNodeIsVirtual;\nuniform uint u_nodeStateForceMaxAlphaMask;\nuniform vec4 u_nodeHoverScale;\nuniform vec4 u_nodeHoverColorMul;\nuniform vec4 u_nodeHoverColorAdd;\nuniform vec4 u_nodeNoStateScale;\nuniform vec4 u_nodeNoStateColorMul;\nuniform vec4 u_nodeNoStateColorAdd;\nuniform vec4 u_nodeStateScale[${stateSlots}];\nuniform vec4 u_nodeStateColorMul[${stateSlots}];\nuniform vec4 u_nodeStateColorAdd[${stateSlots}];\n\nout vec4 v_color;\nout vec2 v_local;\nout vec4 v_outlineColor;\nout float v_outlineThreshold;\nout vec3 v_centerWorld;\nout vec3 v_rightWorld;\nout vec3 v_upWorld;\nout vec3 v_viewDir;\nout float v_radius;\nflat out uint v_discardFlag;\n${TEXTURE_INDEX_HELPERS}\n\nvec3 fetchNodePos(uint id) {\n  vec3 toPos = texelFetch(u_nodePositions, textureCoord(u_nodePositions, id), 0).xyz;\n  if (u_nodeInterpolationEnabled == 0) return toPos;\n  vec3 fromPos = texelFetch(u_nodePositionsFrom, textureCoord(u_nodePositionsFrom, id), 0).xyz;\n  float t = clamp(u_nodeInterpolationFactor, 0.0, 1.0);\n  return mix(fromPos, toPos, t);\n}\n${nodeFetchColor}\n${nodeFetchSize}\n${nodeFetchOutline}\n${nodeFetchOutlineColor}\n${nodeFetchState}\n\nvoid main() {\n  uint state = fetchNodeState(a_nodeId);\n  if (u_hoverNodeIndex != 4294967295u && a_nodeId == u_hoverNodeIndex) {\n    if (u_hoverNodeIsVirtual == 0u) state |= u_hoverNodeState;\n  }\n  bool forceMaxAlpha = (state & u_nodeStateForceMaxAlphaMask) != 0u;\n  float sizeMul = 1.0;\n  float opacityMul = 1.0;\n  float outlineMul = 1.0;\n  vec3 rgbMul = vec3(1.0);\n  vec3 rgbAdd = vec3(0.0);\n  uint discardFlag = 0u;\n  bool virtualHover = u_hoverNodeIndex != 4294967295u && a_nodeId == u_hoverNodeIndex && u_hoverNodeIsVirtual != 0u;\n  if (state == 0u) {\n    vec4 scale = u_nodeNoStateScale;\n    sizeMul *= scale.x;\n    opacityMul *= scale.y;\n    outlineMul *= scale.z;\n    rgbMul *= u_nodeNoStateColorMul.rgb;\n    rgbAdd += u_nodeNoStateColorAdd.rgb;\n    discardFlag = uint(scale.w > 0.5);\n  } else {\n    for (int i = 0; i < ${stateSlots}; i += 1) {\n      float enabled = float((state >> uint(i)) & 1u);\n      vec4 scale = u_nodeStateScale[i];\n      sizeMul *= mix(1.0, scale.x, enabled);\n      opacityMul *= mix(1.0, scale.y, enabled);\n      outlineMul *= mix(1.0, scale.z, enabled);\n      rgbMul *= mix(vec3(1.0), u_nodeStateColorMul[i].rgb, enabled);\n      rgbAdd += u_nodeStateColorAdd[i].rgb * enabled;\n      discardFlag |= uint((scale.w > 0.5) && (enabled > 0.5));\n    }\n  }\n  if (virtualHover) {\n    vec4 scale = u_nodeHoverScale;\n    sizeMul *= scale.x;\n    opacityMul *= scale.y;\n    outlineMul *= scale.z;\n    rgbMul *= u_nodeHoverColorMul.rgb;\n    rgbAdd += u_nodeHoverColorAdd.rgb;\n    discardFlag |= uint(scale.w > 0.5);\n    forceMaxAlpha = forceMaxAlpha || (u_nodeHoverColorMul.a > 1.5);\n  }\n  v_discardFlag = discardFlag;\n\n  vec3 position = fetchNodePos(a_nodeId);\n  float semanticScale = (u_is2D == 1 && u_semanticZoomExponent > 0.0)\n    ? (1.0 / pow(max(u_zoom2D, 1e-3), u_semanticZoomExponent))\n    : 1.0;\n  float rawSize = fetchNodeSize(a_nodeId);\n  float baseSize = (u_nodeSizeBase + u_nodeSizeScale * rawSize) * sizeMul;\n  float rawOutline = fetchNodeOutlineWidth(a_nodeId);\n  float outlineWidth = max(0.0, (u_outlineWidthBase + u_outlineWidthScale * rawOutline) * outlineMul);\n  float fullSize = max(0.0, baseSize + outlineWidth) * semanticScale;\n  float semanticOutlineWidth = outlineWidth * semanticScale;\n  float radius = fullSize * 0.5;\n\n  vec3 right = u_cameraRight;\n  vec3 up = u_cameraUp;\n  vec3 viewDir = vec3(0.0, 0.0, 1.0);\n  if (u_is2D == 1) {\n    right = normalize(right);\n    up = normalize(up);\n  } else {\n    viewDir = u_cameraPosition - position;\n    float viewLen = length(viewDir);\n    viewDir = viewLen > 1e-5 ? viewDir / viewLen : vec3(0.0, 0.0, 1.0);\n    right = u_cameraRight - viewDir * dot(u_cameraRight, viewDir);\n    float rightLen = length(right);\n    right = rightLen > 1e-5 ? right / rightLen : normalize(cross(u_cameraUp, viewDir));\n    up = normalize(cross(viewDir, right));\n  }\n\n  vec3 world = position + (right * a_corner.x + up * a_corner.y) * radius;\n  gl_Position = u_viewProjection * vec4(world, 1.0);\n\n  vec4 baseColor = fetchNodeColor(a_nodeId);\n  vec3 rgb = clamp(baseColor.rgb * rgbMul + rgbAdd, 0.0, 1.0);\n  float alpha = clamp(u_nodeOpacityBase + u_nodeOpacityScale * baseColor.a, 0.0, 1.0) * opacityMul;\n  v_color = vec4(rgb, forceMaxAlpha ? 1.0 : clamp(alpha, 0.0, 1.0));\n\n  vec4 outlineColorIn = fetchNodeOutlineColor(a_nodeId);\n  float outlineAlpha = clamp(u_nodeOpacityBase + u_nodeOpacityScale * outlineColorIn.a, 0.0, 1.0) * opacityMul;\n  v_outlineColor = vec4(outlineColorIn.rgb, forceMaxAlpha ? 1.0 : clamp(outlineAlpha, 0.0, 1.0));\n  v_outlineThreshold = semanticOutlineWidth / max(fullSize, 1e-5);\n  v_local = a_corner;\n  v_centerWorld = position;\n  v_rightWorld = right;\n  v_upWorld = up;\n  v_viewDir = viewDir;\n  v_radius = radius;\n}\n`;\n\n  const NODE_FRAGMENT_SOURCE = `#version 300 es\nprecision highp float;\nprecision highp int;\n\nin vec4 v_color;\nin vec2 v_local;\nin vec4 v_outlineColor;\nin float v_outlineThreshold;\nin vec3 v_centerWorld;\nin vec3 v_rightWorld;\nin vec3 v_upWorld;\nin vec3 v_viewDir;\nin float v_radius;\nflat in uint v_discardFlag;\n\nuniform mat4 u_viewProjection;\nuniform int u_is2D;\n${nodeShadingEnabled ? shadedUniformDecl : ''}\n${nodeShadingHelper}\n\nout vec4 fragColor;\n\nvoid main() {\n  if (v_discardFlag != 0u) {\n    discard;\n  }\n  float dist = length(v_local);\n  if (dist > 1.0) {\n    discard;\n  }\n  vec4 fillColor = v_color;\n  ${nodeShadingEnabled ? 'fillColor = vec4(applyNodeShading(v_color.rgb, v_local), v_color.a);' : ''}\n  fragColor = fillColor;\n  if (v_outlineThreshold > 0.0 && dist > (1.0 - v_outlineThreshold)) {\n    fragColor = v_outlineColor;\n  }\n  if (u_is2D == 0) {\n    float radius = v_radius;\n    float xyLenSq = dot(v_local * radius, v_local * radius);\n    float zOffset = sqrt(max(radius * radius - xyLenSq, 0.0));\n    vec3 worldPos = v_centerWorld\n      + (v_rightWorld * v_local.x + v_upWorld * v_local.y) * radius\n      + normalize(v_viewDir) * zOffset;\n    vec4 clip = u_viewProjection * vec4(worldPos, 1.0);\n    float depth = clip.z / clip.w;\n    gl_FragDepth = depth * 0.5 + 0.5;\n  }\n}\n`;\n\n  const NODE_DEPTH_FRAGMENT_SOURCE = `#version 300 es\nprecision highp float;\nprecision highp int;\n${PACK_DEPTH_GLSL}\n\nin vec2 v_local;\nin vec3 v_centerWorld;\nin vec3 v_rightWorld;\nin vec3 v_upWorld;\nin vec3 v_viewDir;\nin float v_radius;\nflat in uint v_discardFlag;\n\nuniform mat4 u_viewProjection;\nuniform int u_is2D;\n\nout vec4 fragColor;\n\nvoid main() {\n  if (v_discardFlag != 0u) {\n    discard;\n  }\n  float dist = length(v_local);\n  if (dist > 1.0) {\n    discard;\n  }\n  if (u_is2D == 0) {\n    float radius = v_radius;\n    float xyLenSq = dot(v_local * radius, v_local * radius);\n    float zOffset = sqrt(max(radius * radius - xyLenSq, 0.0));\n    vec3 worldPos = v_centerWorld\n      + (v_rightWorld * v_local.x + v_upWorld * v_local.y) * radius\n      + normalize(v_viewDir) * zOffset;\n    vec4 clip = u_viewProjection * vec4(worldPos, 1.0);\n    float depth = clip.z / clip.w;\n    gl_FragDepth = depth * 0.5 + 0.5;\n  }\n  fragColor = packDepthToRGBA(gl_FragCoord.z);\n}\n`;\n\n  const EDGE_VERTEX_SOURCE = `#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp usampler2D;\n\nlayout (location = 0) in uint a_edgeId;\n\nuniform mat4 u_viewProjection;\nuniform sampler2D u_nodePositions;\nuniform sampler2D u_nodePositionsFrom;\nuniform float u_nodeInterpolationFactor;\nuniform int u_nodeInterpolationEnabled;\n${edgeColorSourceNode ? 'uniform sampler2D u_nodeEdgeColors;\\nuniform int u_hasNodeColors;' : ''}\n${edgeOpacitySourceNode ? 'uniform sampler2D u_nodeOpacitySource;\\nuniform int u_hasNodeOpacitySource;' : ''}${edgeColorDecl}${edgeOpacityDecl}\nuniform usampler2D u_edgeEndpoints;\n${edgeStateUniformDecl}\n${edgeEndpointStateUniformDecl}\nuniform vec4 u_defaultNodeEdgeColor;\nuniform vec4 u_defaultEdgeColorStart;\nuniform vec4 u_defaultEdgeColorEnd;\nuniform vec2 u_defaultEdgeOpacity;\nuniform vec2 u_defaultNodeOpacitySource;\nuniform float u_edgeOpacityBase;\nuniform float u_edgeOpacityScale;\n\nout vec4 v_color;\nout float v_weight;\nflat out uint v_discardFlag;\n${edgeShadingEnabled ? 'out vec2 v_edgeLocal;\\nout vec2 v_edgeShadeBasis;\\nflat out uint v_edgeShadeEnabled;' : ''}\n${TEXTURE_INDEX_HELPERS}\n\nvec3 fetchNodePos(uint id) {\n  vec3 toPos = texelFetch(u_nodePositions, textureCoord(u_nodePositions, id), 0).xyz;\n  if (u_nodeInterpolationEnabled == 0) return toPos;\n  vec3 fromPos = texelFetch(u_nodePositionsFrom, textureCoord(u_nodePositionsFrom, id), 0).xyz;\n  float t = clamp(u_nodeInterpolationFactor, 0.0, 1.0);\n  return mix(fromPos, toPos, t);\n}\n\n${edgeStateFetch}\n${edgeEndpointStateFetch}\n\n${edgeColorSourceNode ? `\nvec4 fetchNodeColor(uint id) {\n  if (u_hasNodeColors == 0) return u_defaultNodeEdgeColor;\n  return texelFetch(u_nodeEdgeColors, textureCoord(u_nodeEdgeColors, id), 0);\n}` : ''}\n\n${edgeFetchColor}\n\n${edgeOpacitySourceNode ? `\nfloat fetchNodeOpacity(uint id, float fallbackValue) {\n  if (u_hasNodeOpacitySource == 0) return fallbackValue;\n  return texelFetch(u_nodeOpacitySource, textureCoord(u_nodeOpacitySource, id), 0).x;\n}\n\nvec2 resolveNodeOpacityPair(uint sourceId, uint targetId, int endpointsMode, vec2 fallbackPair) {\n  float sourceValue = fetchNodeOpacity(sourceId, fallbackPair.x);\n  float targetValue = fetchNodeOpacity(targetId, fallbackPair.y);\n  if (endpointsMode == 1) return vec2(sourceValue, sourceValue);\n  if (endpointsMode == 2) return vec2(targetValue, targetValue);\n  return vec2(sourceValue, targetValue);\n}` : ''}\n\n${edgeFetchOpacity}\n\nvoid main() {\n  uvec2 endpoints = texelFetch(u_edgeEndpoints, textureCoord(u_edgeEndpoints, a_edgeId), 0).xy;\n  uint sourceId = endpoints.x;\n  uint targetId = endpoints.y;\n${edgeLineStateBlock}\n  uint nodeId = (gl_VertexID & 1) == 0 ? sourceId : targetId;\n  vec3 pos = fetchNodePos(nodeId);\n  gl_Position = u_viewProjection * vec4(pos, 1.0);\n\n  vec4 sourceColor = fetchEdgeColor(a_edgeId, false);\n  vec4 targetColor = fetchEdgeColor(a_edgeId, true);\n${edgeColorNodeBlock}\n  bool isTarget = (gl_VertexID & 1) == 1;\n  vec4 baseColor = isTarget ? targetColor : sourceColor;\n  vec2 opacityPair = ${edgeOpacitySourceNode\n    ? `resolveNodeOpacityPair(sourceId, targetId, ${edgeOpacityEndpoints}, u_defaultNodeOpacitySource)`\n    : 'fetchEdgeOpacityPair(a_edgeId)'};\n  float rawOpacity = isTarget ? opacityPair.y : opacityPair.x;\n  float opacity = clamp(u_edgeOpacityBase + u_edgeOpacityScale * rawOpacity, 0.0, 1.0);\n  vec3 rgb = clamp(baseColor.rgb * rgbMul + rgbAdd, 0.0, 1.0);\n  float weight = max(baseColor.a * opacity * opacityMul, 0.0);\n  float alpha = clamp(weight, 0.0, 1.0);\n  v_color = vec4(rgb, forceMaxAlpha ? 1.0 : alpha);\n  v_weight = forceMaxAlpha ? max(weight, ${forceVisibilityBoost.toFixed(1)}) : weight;\n  v_discardFlag = discardFlag;\n  ${edgeShadingEnabled ? 'v_edgeLocal = vec2(0.0);\\n  v_edgeShadeBasis = vec2(0.0, 1.0);\\n  v_edgeShadeEnabled = 0u;' : ''}\n}\n`;\n\n  const EDGE_QUAD_VERTEX_SOURCE = `#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp usampler2D;\n\nlayout (location = 0) in vec2 a_corner;\nlayout (location = 1) in uint a_edgeId;\n\nuniform mat4 u_viewProjection;\nuniform vec3 u_cameraPosition;\nuniform vec3 u_cameraUp;\nuniform vec3 u_cameraRight;\nuniform int u_is2D;\nuniform vec2 u_viewport;\nuniform sampler2D u_nodePositions;\nuniform sampler2D u_nodePositionsFrom;\nuniform float u_nodeInterpolationFactor;\nuniform int u_nodeInterpolationEnabled;\n${edgeColorSourceNode ? 'uniform sampler2D u_nodeEdgeColors;\\nuniform int u_hasNodeColors;' : ''}\n${edgeWidthSourceNode ? 'uniform sampler2D u_nodeWidthSource;\\nuniform int u_hasNodeWidthSource;' : ''}\n${edgeOpacitySourceNode ? 'uniform sampler2D u_nodeOpacitySource;\\nuniform int u_hasNodeOpacitySource;' : ''}\n${edgeEndpointSizeSourceNode ? 'uniform sampler2D u_nodeEndpointSizeSource;\\nuniform int u_hasNodeEndpointSizeSource;' : ''}${edgeColorDecl}${edgeWidthDecl}${edgeOpacityDecl}${edgeEndpointSizeDecl}\nuniform usampler2D u_edgeEndpoints;\n${edgeStateUniformDecl}\n${edgeEndpointStateUniformDecl}\nuniform vec4 u_defaultNodeEdgeColor;\nuniform vec4 u_defaultEdgeColorStart;\nuniform vec4 u_defaultEdgeColorEnd;\nuniform vec2 u_defaultEdgeWidth;\nuniform vec2 u_defaultNodeWidthSource;\nuniform vec2 u_defaultEdgeOpacity;\nuniform vec2 u_defaultNodeOpacitySource;\nuniform vec2 u_defaultEdgeEndpointSize;\nuniform vec2 u_defaultNodeEndpointSizeSource;\nuniform float u_edgeWidthBase;\nuniform float u_edgeWidthScale;\nuniform float u_edgeOpacityBase;\nuniform float u_edgeOpacityScale;\nuniform float u_nodeSizeBase;\nuniform float u_nodeSizeScale;\nuniform float u_edgeEndpointTrim;\nuniform float u_zoom2D;\nuniform float u_semanticZoomExponent;\n\nout vec4 v_color;\nout float v_weight;\nflat out uint v_discardFlag;\n${edgeShadingEnabled ? 'out vec2 v_edgeLocal;\\nout vec2 v_edgeShadeBasis;\\nflat out uint v_edgeShadeEnabled;' : ''}\n${TEXTURE_INDEX_HELPERS}\n\nvec3 fetchNodePos(uint id) {\n  vec3 toPos = texelFetch(u_nodePositions, textureCoord(u_nodePositions, id), 0).xyz;\n  if (u_nodeInterpolationEnabled == 0) return toPos;\n  vec3 fromPos = texelFetch(u_nodePositionsFrom, textureCoord(u_nodePositionsFrom, id), 0).xyz;\n  float t = clamp(u_nodeInterpolationFactor, 0.0, 1.0);\n  return mix(fromPos, toPos, t);\n}\n\n${edgeStateFetch}\n${edgeEndpointStateFetch}\n\n${edgeColorSourceNode ? `\nvec4 fetchNodeColor(uint id) {\n  if (u_hasNodeColors == 0) return u_defaultNodeEdgeColor;\n  return texelFetch(u_nodeEdgeColors, textureCoord(u_nodeEdgeColors, id), 0);\n}` : ''}\n\n${edgeFetchColor}\n\n${edgeWidthSourceNode || edgeOpacitySourceNode || edgeEndpointSizeSourceNode ? `\nfloat fetchNodeScalar(sampler2D sourceTex, uint nodeId, int hasSource, float fallbackValue) {\n  if (hasSource == 0) return fallbackValue;\n  return texelFetch(sourceTex, textureCoord(sourceTex, nodeId), 0).x;\n}\n\nvec2 resolveNodePair(\n  sampler2D sourceTex,\n  uint sourceId,\n  uint targetId,\n  int hasSource,\n  int endpointsMode,\n  vec2 fallbackPair\n) {\n  float sourceValue = fetchNodeScalar(sourceTex, sourceId, hasSource, fallbackPair.x);\n  float targetValue = fetchNodeScalar(sourceTex, targetId, hasSource, fallbackPair.y);\n  if (endpointsMode == 1) return vec2(sourceValue, sourceValue);\n  if (endpointsMode == 2) return vec2(targetValue, targetValue);\n  return vec2(sourceValue, targetValue);\n}` : ''}\n\n${edgeFetchWidth}\n${edgeFetchOpacity}\n${edgeFetchEndpointSize}\n\nvoid main() {\n  uvec2 endpoints = texelFetch(u_edgeEndpoints, textureCoord(u_edgeEndpoints, a_edgeId), 0).xy;\n  uint sourceId = endpoints.x;\n  uint targetId = endpoints.y;\n${edgeQuadStateBlock}\n\n  vec3 sourcePos = fetchNodePos(sourceId);\n  vec3 targetPos = fetchNodePos(targetId);\n  vec3 dir = targetPos - sourcePos;\n  float dirLenWorld = max(length(dir), 1e-5);\n  vec3 dirN = dir / dirLenWorld;\n${edgeEndpointGeometryBlock}\n\n  float segmentMix = clamp(a_corner.x, 0.0, 1.0);\n  vec2 widthPair = ${edgeWidthSourceNode\n    ? `resolveNodePair(\n      u_nodeWidthSource,\n      sourceId,\n      targetId,\n      u_hasNodeWidthSource,\n      ${edgeWidthEndpoints},\n      u_defaultNodeWidthSource\n    )`\n    : 'fetchEdgeWidthPair(a_edgeId)'};\n  float rawWidth = mix(widthPair.x, widthPair.y, segmentMix);\n  float width = max((u_edgeWidthBase + u_edgeWidthScale * rawWidth) * widthMul, 0.0) * semanticScale;\n${edgeQuadWidthClampBlock}\n  float halfWidth = max(width, 1e-3) * 0.5;\n  vec3 centerPos = mix(startPos, endPos, segmentMix);\n${edgeQuadWidthDirBlock}\n  vec2 shadeBasis = vec2(dot(widthDir, normalize(u_cameraRight)), dot(widthDir, normalize(u_cameraUp)));\n  float shadeBasisLen = length(shadeBasis);\n  shadeBasis = shadeBasisLen > 1e-5 ? (shadeBasis / shadeBasisLen) : vec2(0.0, 1.0);\n  vec3 worldPos = centerPos + widthDir * halfWidth * a_corner.y;\n  gl_Position = u_viewProjection * vec4(worldPos, 1.0);\n\n  vec4 sourceColor = fetchEdgeColor(a_edgeId, false);\n  vec4 targetColor = fetchEdgeColor(a_edgeId, true);\n${edgeColorNodeBlock}\n  vec4 blendedColor = mix(sourceColor, targetColor, segmentMix);\n  vec2 opacityPair = ${edgeOpacitySourceNode\n    ? `resolveNodePair(\n      u_nodeOpacitySource,\n      sourceId,\n      targetId,\n      u_hasNodeOpacitySource,\n      ${edgeOpacityEndpoints},\n      u_defaultNodeOpacitySource\n    )`\n    : 'fetchEdgeOpacityPair(a_edgeId)'};\n  float rawOpacity = mix(opacityPair.x, opacityPair.y, segmentMix);\n  float opacity = clamp(u_edgeOpacityBase + u_edgeOpacityScale * rawOpacity, 0.0, 1.0);\n  vec3 rgb = clamp(blendedColor.rgb * rgbMul + rgbAdd, 0.0, 1.0);\n  float weight = max(blendedColor.a * opacity * opacityMul, 0.0);\n  float alpha = clamp(weight, 0.0, 1.0);\n  v_color = vec4(rgb, forceMaxAlpha ? 1.0 : alpha);\n  v_weight = forceMaxAlpha ? max(weight, ${forceVisibilityBoost.toFixed(1)}) : weight;\n  v_discardFlag = discardFlag;\n  ${edgeShadingEnabled ? 'v_edgeLocal = a_corner;\\n  v_edgeShadeBasis = shadeBasis;\\n  v_edgeShadeEnabled = 1u;' : ''}\n}\n`;\n\n  const EDGE_FRAGMENT_SOURCE = `#version 300 es\nprecision highp float;\n\nin vec4 v_color;\nflat in uint v_discardFlag;\n${edgeShadingEnabled ? 'in vec2 v_edgeLocal;\\nin vec2 v_edgeShadeBasis;\\nflat in uint v_edgeShadeEnabled;\\n' : ''}${edgeShadingEnabled ? shadedUniformDecl : ''}\n${edgeShadingHelper}\nout vec4 fragColor;\n\nvoid main() {\n  if (v_discardFlag != 0u) {\n    discard;\n  }\n  vec3 rgb = v_color.rgb;\n  ${edgeShadingEnabled ? 'if (v_edgeShadeEnabled != 0u) {\\n    rgb = applyEdgeShading(rgb, v_edgeLocal.y, v_edgeShadeBasis);\\n  }' : ''}\n  fragColor = vec4(rgb, v_color.a);\n}\n`;\n\n  const EDGE_DEPTH_FRAGMENT_SOURCE = `#version 300 es\nprecision highp float;\n${PACK_DEPTH_GLSL}\n\nflat in uint v_discardFlag;\n\nout vec4 fragColor;\n\nvoid main() {\n  if (v_discardFlag != 0u) {\n    discard;\n  }\n  fragColor = packDepthToRGBA(gl_FragCoord.z);\n}\n`;\n\n  const EDGE_WEIGHTED_FRAGMENT_SOURCE = `#version 300 es\nprecision highp float;\n\nin vec4 v_color;\nin float v_weight;\nflat in uint v_discardFlag;\n${edgeShadingEnabled ? 'in vec2 v_edgeLocal;\\nin vec2 v_edgeShadeBasis;\\nflat in uint v_edgeShadeEnabled;\\n' : ''}${edgeShadingEnabled ? shadedUniformDecl : ''}\n${edgeShadingHelper}\nlayout (location = 0) out vec4 fragAccum;\nlayout (location = 1) out vec4 fragWeight;\n\nvoid main() {\n  if (v_discardFlag != 0u) {\n    discard;\n  }\n  vec3 rgb = v_color.rgb;\n  ${edgeShadingEnabled ? 'if (v_edgeShadeEnabled != 0u) {\\n    rgb = applyEdgeShading(rgb, v_edgeLocal.y, v_edgeShadeBasis);\\n  }' : ''}\n  float weight = v_weight;\n  fragAccum = vec4(rgb * weight, weight);\n  fragWeight = vec4(weight, 0.0, 0.0, 0.0);\n}\n`;\n\n  const EDGE_WEIGHTED_QUAD_FRAGMENT_SOURCE = EDGE_WEIGHTED_FRAGMENT_SOURCE;\n\n  const EDGE_RESOLVE_VERTEX_SOURCE = `#version 300 es\nlayout (location = 0) in vec2 a_position;\nlayout (location = 1) in vec2 a_uv;\nout vec2 v_uv;\n\nvoid main() {\n  gl_Position = vec4(a_position, 0.0, 1.0);\n  v_uv = a_uv;\n}\n`;\n\n  const EDGE_RESOLVE_FRAGMENT_SOURCE = `#version 300 es\nprecision highp float;\nin vec2 v_uv;\nuniform sampler2D u_colorAccum;\nuniform sampler2D u_weightAccum;\nout vec4 fragColor;\n\nvoid main() {\n  vec3 accum = texture(u_colorAccum, v_uv).rgb;\n  float weight = texture(u_weightAccum, v_uv).r;\n  float denom = max(weight, 1e-4);\n  vec3 resolved = accum / denom;\n  float alpha = clamp(weight, 0.0, 1.0);\n  fragColor = vec4(resolved * alpha, alpha);\n}\n`;\n\n  const EDGE_RESOLVE_TONEMAP_FRAGMENT_SOURCE = `#version 300 es\nprecision highp float;\nin vec2 v_uv;\nuniform sampler2D u_colorAccum;\nuniform sampler2D u_weightAccum;\nout vec4 fragColor;\n\nvoid main() {\n  vec3 accum = texture(u_colorAccum, v_uv).rgb;\n  float weight = texture(u_weightAccum, v_uv).r;\n  float denom = max(weight, 1e-4);\n  vec3 resolved = accum / denom;\n  vec3 tonemapped = resolved / (resolved + vec3(1.0));\n  float alpha = clamp(weight, 0.0, 1.0);\n  fragColor = vec4(tonemapped, alpha);\n}\n`;\n\n  const EDGE_RESOLVE_BOOST_FRAGMENT_SOURCE = `#version 300 es\nprecision highp float;\nin vec2 v_uv;\nuniform sampler2D u_colorAccum;\nuniform sampler2D u_weightAccum;\nout vec4 fragColor;\n\nvoid main() {\n  vec3 accum = texture(u_colorAccum, v_uv).rgb;\n  float weight = texture(u_weightAccum, v_uv).r;\n  float denom = max(weight, 1e-4);\n  vec3 resolved = accum / denom;\n  float boost = clamp(weight, 0.0, 4.0);\n  vec3 boosted = resolved * boost;\n  vec3 tonemapped = boosted / (boosted + vec3(1.0));\n  float alpha = clamp(weight, 0.0, 1.0);\n  fragColor = vec4(tonemapped, alpha);\n}\n`;\n\n  return {\n    NODE_VERTEX_SOURCE,\n    NODE_FRAGMENT_SOURCE,\n    NODE_DEPTH_FRAGMENT_SOURCE,\n    EDGE_VERTEX_SOURCE,\n    EDGE_QUAD_VERTEX_SOURCE,\n    EDGE_FRAGMENT_SOURCE,\n    EDGE_DEPTH_FRAGMENT_SOURCE,\n    EDGE_WEIGHTED_FRAGMENT_SOURCE,\n    EDGE_WEIGHTED_QUAD_FRAGMENT_SOURCE,\n    EDGE_RESOLVE_VERTEX_SOURCE,\n    EDGE_RESOLVE_FRAGMENT_SOURCE,\n    EDGE_RESOLVE_TONEMAP_FRAGMENT_SOURCE,\n    EDGE_RESOLVE_BOOST_FRAGMENT_SOURCE,\n  };\n}\n\nexport default createGraphWebGLSources;\n","export function invertMat4(out, a) {\n  if (!out || !a || out.length < 16 || a.length < 16) return false;\n  const a00 = a[0]; const a01 = a[1]; const a02 = a[2]; const a03 = a[3];\n  const a10 = a[4]; const a11 = a[5]; const a12 = a[6]; const a13 = a[7];\n  const a20 = a[8]; const a21 = a[9]; const a22 = a[10]; const a23 = a[11];\n  const a30 = a[12]; const a31 = a[13]; const a32 = a[14]; const a33 = a[15];\n\n  const b00 = a00 * a11 - a01 * a10;\n  const b01 = a00 * a12 - a02 * a10;\n  const b02 = a00 * a13 - a03 * a10;\n  const b03 = a01 * a12 - a02 * a11;\n  const b04 = a01 * a13 - a03 * a11;\n  const b05 = a02 * a13 - a03 * a12;\n  const b06 = a20 * a31 - a21 * a30;\n  const b07 = a20 * a32 - a22 * a30;\n  const b08 = a20 * a33 - a23 * a30;\n  const b09 = a21 * a32 - a22 * a31;\n  const b10 = a21 * a33 - a23 * a31;\n  const b11 = a22 * a33 - a23 * a32;\n\n  const det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n  if (!Number.isFinite(det) || Math.abs(det) < 1e-12) return false;\n  const invDet = 1 / det;\n\n  out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * invDet;\n  out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * invDet;\n  out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * invDet;\n  out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * invDet;\n  out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * invDet;\n  out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * invDet;\n  out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * invDet;\n  out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * invDet;\n  out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * invDet;\n  out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * invDet;\n  out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * invDet;\n  out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * invDet;\n  out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * invDet;\n  out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * invDet;\n  out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * invDet;\n  out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * invDet;\n  return true;\n}\n\nexport function resolveContextViewport(context, fallbackWidth = 1, fallbackHeight = 1) {\n  const raw = context?.viewport ?? null;\n  if (Array.isArray(raw)) {\n    return {\n      x: Number(raw[0]) || 0,\n      y: Number(raw[1]) || 0,\n      width: Math.max(1, Math.floor(Number(raw[2]) || fallbackWidth || 1)),\n      height: Math.max(1, Math.floor(Number(raw[3]) || fallbackHeight || 1)),\n    };\n  }\n  if (raw && typeof raw === 'object') {\n    return {\n      x: Number(raw.x) || 0,\n      y: Number(raw.y) || 0,\n      width: Math.max(1, Math.floor(Number(raw.width) || fallbackWidth || 1)),\n      height: Math.max(1, Math.floor(Number(raw.height) || fallbackHeight || 1)),\n    };\n  }\n  return {\n    x: 0,\n    y: 0,\n    width: Math.max(1, Math.floor(fallbackWidth || 1)),\n    height: Math.max(1, Math.floor(fallbackHeight || 1)),\n  };\n}\n","import { invertMat4, resolveContextViewport } from './AmbientOcclusionCommon.js';\nimport { normalizeAmbientOcclusionMode } from './AmbientOcclusionMode.js';\nimport { getAmbientOcclusionQualityPreset } from './AmbientOcclusionQuality.js';\n\nfunction formatFloat(value) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return '0.0';\n  const fixed = numeric.toFixed(8).replace(/0+$/, '').replace(/\\.$/, '');\n  return fixed.includes('.') ? fixed : `${fixed}.0`;\n}\n\nfunction createSmoothAoFragmentSource(preset) {\n  const kernel = preset.smoothKernel\n    .map(([x, y]) => `  vec2(${formatFloat(x)}, ${formatFloat(y)})`)\n    .join(',\\n');\n  return `#version 300 es\nprecision highp float;\n\nin vec2 v_uv;\n\nuniform mat4 u_invViewProjection;\nuniform vec4 u_sizes;\nuniform vec4 u_params;\nuniform vec3 u_cameraPosition;\nuniform sampler2D u_depthTex;\n\nout vec4 fragColor;\n\nconst int SAMPLE_COUNT = ${preset.smoothSampleCount};\nconst vec2 KERNEL[SAMPLE_COUNT] = vec2[SAMPLE_COUNT](\n${kernel}\n);\n\nfloat hash12(vec2 p) {\n  vec3 p3 = fract(vec3(p.x, p.y, p.x) * 0.1031);\n  p3 += dot(p3, p3.yzx + vec3(33.33));\n  return fract((p3.x + p3.y) * p3.z);\n}\n\nivec2 fullSize() {\n  return ivec2(int(u_sizes.x), int(u_sizes.y));\n}\n\nivec2 aoSize() {\n  return ivec2(int(u_sizes.z), int(u_sizes.w));\n}\n\nfloat readDepthFromUv(vec2 uv) {\n  ivec2 size = fullSize();\n  ivec2 px = clamp(ivec2(vec2(size) * clamp(uv, vec2(0.0), vec2(1.0))), ivec2(0), size - ivec2(1));\n  return texelFetch(u_depthTex, px, 0).r;\n}\n\nvec3 reconstructWorld(vec2 uv, float depth) {\n  vec4 clip = vec4(uv * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);\n  vec4 world = u_invViewProjection * clip;\n  return world.xyz / max(world.w, 1e-6);\n}\n\nvec3 reconstructNormal(vec2 uv, float centerDepth, vec3 center) {\n  vec2 texel = vec2(1.0 / max(u_sizes.x, 1.0), 1.0 / max(u_sizes.y, 1.0));\n  vec2 uvLeft = clamp(uv - vec2(texel.x, 0.0), vec2(0.0), vec2(1.0));\n  vec2 uvRight = clamp(uv + vec2(texel.x, 0.0), vec2(0.0), vec2(1.0));\n  vec2 uvDown = clamp(uv - vec2(0.0, texel.y), vec2(0.0), vec2(1.0));\n  vec2 uvUp = clamp(uv + vec2(0.0, texel.y), vec2(0.0), vec2(1.0));\n  float depthLeft = readDepthFromUv(uvLeft);\n  float depthRight = readDepthFromUv(uvRight);\n  float depthDown = readDepthFromUv(uvDown);\n  float depthUp = readDepthFromUv(uvUp);\n  vec3 pLeft = reconstructWorld(uvLeft, depthLeft);\n  vec3 pRight = reconstructWorld(uvRight, depthRight);\n  vec3 pDown = reconstructWorld(uvDown, depthDown);\n  vec3 pUp = reconstructWorld(uvUp, depthUp);\n  vec3 dx = center - pLeft;\n  if (abs(depthRight - centerDepth) <= abs(centerDepth - depthLeft)) {\n    dx = pRight - center;\n  }\n  vec3 dy = center - pDown;\n  if (abs(depthUp - centerDepth) <= abs(centerDepth - depthDown)) {\n    dy = pUp - center;\n  }\n  vec3 n = cross(dx, dy);\n  float lenN = length(n);\n  if (!(lenN > 1e-6)) {\n    return vec3(0.0, 0.0, 1.0);\n  }\n  n /= lenN;\n  vec3 viewDir = normalize(u_cameraPosition - center);\n  if (dot(n, viewDir) < 0.0) {\n    n = -n;\n  }\n  return n;\n}\n\nvoid main() {\n  vec2 pixel = gl_FragCoord.xy - vec2(0.5);\n  vec2 uv = gl_FragCoord.xy / vec2(aoSize());\n  float centerDepth = readDepthFromUv(uv);\n  if (centerDepth >= 0.999999) {\n    fragColor = vec4(1.0);\n    return;\n  }\n\n  vec3 center = reconstructWorld(uv, centerDepth);\n  vec3 normal = reconstructNormal(uv, centerDepth, center);\n  vec2 fullTexel = vec2(1.0 / max(u_sizes.x, 1.0), 1.0 / max(u_sizes.y, 1.0));\n  float radius = max(u_params.x, 1.0);\n  float bias = max(u_params.y, 0.0);\n  float angle = hash12(pixel) * 6.28318530718;\n  mat2 rot = mat2(\n    vec2(cos(angle), sin(angle)),\n    vec2(-sin(angle), cos(angle))\n  );\n\n  float occlusion = 0.0;\n  float weightSum = 0.0;\n  for (int i = 0; i < SAMPLE_COUNT; i += 1) {\n    vec2 offset = rot * KERNEL[i] * (radius * fullTexel);\n    vec2 sampleUv = clamp(uv + offset, vec2(0.0), vec2(1.0));\n    float sampleDepth = readDepthFromUv(sampleUv);\n    if (sampleDepth >= 0.999999) {\n      continue;\n    }\n    vec3 samplePos = reconstructWorld(sampleUv, sampleDepth);\n    vec3 delta = samplePos - center;\n    float distanceSq = max(dot(delta, delta), 1e-5);\n    vec3 deltaDir = normalize(delta);\n    float angular = max(dot(normal, deltaDir) - bias, 0.0);\n    float attenuation = 1.0 / (1.0 + distanceSq * 0.2);\n    occlusion += angular * attenuation;\n    weightSum += attenuation;\n  }\n\n  float ao = 1.0;\n  if (weightSum > 1e-5) {\n    ao = clamp(1.0 - (occlusion / weightSum) * ${formatFloat(preset.occlusionScale)}, 0.0, 1.0);\n  }\n  fragColor = vec4(vec3(ao), 1.0);\n}`;\n}\n\nfunction createAltAoFragmentSource(preset) {\n  const kernel = preset.altKernel\n    .map(([x, y, z]) => `  vec3(${formatFloat(x)}, ${formatFloat(y)}, ${formatFloat(z)})`)\n    .join(',\\n');\n  return `#version 300 es\nprecision highp float;\n\nin vec2 v_uv;\n\nuniform mat4 u_invViewProjection;\nuniform mat4 u_viewProjection;\nuniform mat4 u_view;\nuniform vec4 u_sizes;\nuniform vec4 u_params;\nuniform vec4 u_altParams;\nuniform vec3 u_cameraPosition;\nuniform sampler2D u_depthTex;\n\nout vec4 fragColor;\n\nconst int SAMPLE_COUNT = ${preset.altSampleCount};\nconst vec3 KERNEL[SAMPLE_COUNT] = vec3[SAMPLE_COUNT](\n${kernel}\n);\n\nfloat hash12(vec2 p) {\n  vec3 p3 = fract(vec3(p.x, p.y, p.x) * 0.1031);\n  p3 += dot(p3, p3.yzx + vec3(33.33));\n  return fract((p3.x + p3.y) * p3.z);\n}\n\nivec2 fullSize() {\n  return ivec2(int(u_sizes.x), int(u_sizes.y));\n}\n\nivec2 aoSize() {\n  return ivec2(int(u_sizes.z), int(u_sizes.w));\n}\n\nfloat readDepthFromUv(vec2 uv) {\n  ivec2 size = fullSize();\n  ivec2 px = clamp(ivec2(vec2(size) * clamp(uv, vec2(0.0), vec2(1.0))), ivec2(0), size - ivec2(1));\n  return texelFetch(u_depthTex, px, 0).r;\n}\n\nvec3 reconstructWorld(vec2 uv, float depth) {\n  vec4 clip = vec4(uv * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);\n  vec4 world = u_invViewProjection * clip;\n  return world.xyz / max(world.w, 1e-6);\n}\n\nvec3 reconstructNormal(vec2 uv, float centerDepth, vec3 center) {\n  vec2 texel = vec2(1.0 / max(u_sizes.x, 1.0), 1.0 / max(u_sizes.y, 1.0));\n  vec2 uvLeft = clamp(uv - vec2(texel.x, 0.0), vec2(0.0), vec2(1.0));\n  vec2 uvRight = clamp(uv + vec2(texel.x, 0.0), vec2(0.0), vec2(1.0));\n  vec2 uvDown = clamp(uv - vec2(0.0, texel.y), vec2(0.0), vec2(1.0));\n  vec2 uvUp = clamp(uv + vec2(0.0, texel.y), vec2(0.0), vec2(1.0));\n  float depthLeft = readDepthFromUv(uvLeft);\n  float depthRight = readDepthFromUv(uvRight);\n  float depthDown = readDepthFromUv(uvDown);\n  float depthUp = readDepthFromUv(uvUp);\n  vec3 pLeft = reconstructWorld(uvLeft, depthLeft);\n  vec3 pRight = reconstructWorld(uvRight, depthRight);\n  vec3 pDown = reconstructWorld(uvDown, depthDown);\n  vec3 pUp = reconstructWorld(uvUp, depthUp);\n  vec3 dx = center - pLeft;\n  if (abs(depthRight - centerDepth) <= abs(centerDepth - depthLeft)) {\n    dx = pRight - center;\n  }\n  vec3 dy = center - pDown;\n  if (abs(depthUp - centerDepth) <= abs(centerDepth - depthDown)) {\n    dy = pUp - center;\n  }\n  vec3 n = cross(dx, dy);\n  float lenN = length(n);\n  if (!(lenN > 1e-6)) {\n    return vec3(0.0, 0.0, 1.0);\n  }\n  n /= lenN;\n  vec3 viewDir = normalize(u_cameraPosition - center);\n  if (dot(n, viewDir) < 0.0) {\n    n = -n;\n  }\n  return n;\n}\n\nvec3 orthogonal(vec3 normal) {\n  if (abs(normal.z) < 0.999) {\n    return normalize(cross(normal, vec3(0.0, 0.0, 1.0)));\n  }\n  return normalize(cross(normal, vec3(0.0, 1.0, 0.0)));\n}\n\nvec3 worldToView(vec3 world) {\n  return (u_view * vec4(world, 1.0)).xyz;\n}\n\nvoid main() {\n  vec2 pixel = gl_FragCoord.xy - vec2(0.5);\n  vec2 uv = gl_FragCoord.xy / vec2(aoSize());\n  float centerDepth = readDepthFromUv(uv);\n  if (centerDepth >= 0.999999) {\n    fragColor = vec4(1.0);\n    return;\n  }\n\n  vec3 center = reconstructWorld(uv, centerDepth);\n  vec3 centerView = worldToView(center);\n  vec3 normal = reconstructNormal(uv, centerDepth, center);\n  vec2 fullTexel = vec2(1.0 / max(u_sizes.x, 1.0), 1.0 / max(u_sizes.y, 1.0));\n  vec3 px = reconstructWorld(uv + vec2(fullTexel.x, 0.0), readDepthFromUv(uv + vec2(fullTexel.x, 0.0)));\n  vec3 py = reconstructWorld(uv + vec2(0.0, fullTexel.y), readDepthFromUv(uv + vec2(0.0, fullTexel.y)));\n  float pixelWorld = max(0.5 * (length(px - center) + length(py - center)), 1e-4);\n  float worldRadius = max(u_params.x, 1.0) * pixelWorld;\n  float bias = max(u_params.y, 0.0);\n\n  float angle = hash12(pixel) * 6.28318530718;\n  vec3 randomVec = vec3(cos(angle), sin(angle), 0.0);\n  vec3 tangent = randomVec - normal * dot(randomVec, normal);\n  float tangentLength = length(tangent);\n  if (!(tangentLength > 1e-6)) {\n    tangent = orthogonal(normal);\n  } else {\n    tangent /= tangentLength;\n  }\n  vec3 bitangent = normalize(cross(normal, tangent));\n  mat3 tbn = mat3(tangent, bitangent, normal);\n\n  float occlusion = 0.0;\n  for (int i = 0; i < SAMPLE_COUNT; i += 1) {\n    vec3 sampleWorld = center + (tbn * KERNEL[i]) * worldRadius;\n    vec4 sampleClip = u_viewProjection * vec4(sampleWorld, 1.0);\n    if (!(sampleClip.w > 1e-6)) {\n      continue;\n    }\n    vec3 sampleNdc = sampleClip.xyz / sampleClip.w;\n    vec2 sampleUv = sampleNdc.xy * 0.5 + 0.5;\n    if (any(lessThan(sampleUv, vec2(0.0))) || any(greaterThan(sampleUv, vec2(1.0)))) {\n      continue;\n    }\n    float sampleDepth = readDepthFromUv(sampleUv);\n    if (sampleDepth >= 0.999999) {\n      continue;\n    }\n    vec3 occluderWorld = reconstructWorld(sampleUv, sampleDepth);\n    vec3 occluderView = worldToView(occluderWorld);\n    vec3 sampleView = worldToView(sampleWorld);\n    float rangeCheck = smoothstep(0.0, 1.0, worldRadius / max(abs(centerView.z - occluderView.z), 1e-4));\n    float blocked = occluderView.z >= sampleView.z + bias ? 1.0 : 0.0;\n    occlusion += blocked * rangeCheck;\n  }\n\n  float occ = occlusion / float(SAMPLE_COUNT);\n  float ao = 1.0 - clamp((occ - u_altParams.y) * u_altParams.x, 0.0, 1.0);\n  fragColor = vec4(vec3(ao), 1.0);\n}`;\n}\n\nfunction createBlurFragmentSource(preset) {\n  const radius = preset.blurRadius;\n  const weights = preset.blurWeights.map((value) => formatFloat(value)).join(', ');\n  return `#version 300 es\nprecision highp float;\n\nin vec2 v_uv;\n\nuniform vec4 u_sizes;\nuniform vec4 u_params;\nuniform vec2 u_direction;\nuniform sampler2D u_depthTex;\nuniform sampler2D u_aoTex;\n\nout vec4 fragColor;\n\nconst int BLUR_RADIUS = ${radius};\nconst float BLUR_WEIGHTS[${radius + 1}] = float[${radius + 1}](${weights});\n\nivec2 fullSize() {\n  return ivec2(int(u_sizes.x), int(u_sizes.y));\n}\n\nivec2 aoSize() {\n  return ivec2(int(u_sizes.z), int(u_sizes.w));\n}\n\nfloat readDepthFromUv(vec2 uv) {\n  ivec2 size = fullSize();\n  ivec2 px = clamp(ivec2(vec2(size) * clamp(uv, vec2(0.0), vec2(1.0))), ivec2(0), size - ivec2(1));\n  return texelFetch(u_depthTex, px, 0).r;\n}\n\nfloat readAo(ivec2 coord) {\n  ivec2 size = aoSize();\n  ivec2 clamped = clamp(coord, ivec2(0), size - ivec2(1));\n  return texelFetch(u_aoTex, clamped, 0).r;\n}\n\nvoid main() {\n  ivec2 size = aoSize();\n  ivec2 coord = clamp(ivec2(gl_FragCoord.xy - vec2(0.5)), ivec2(0), size - ivec2(1));\n  vec2 uv = gl_FragCoord.xy / vec2(size);\n  float centerDepth = readDepthFromUv(uv);\n  float sum = readAo(coord) * BLUR_WEIGHTS[0];\n  float weightSum = BLUR_WEIGHTS[0];\n  for (int i = 1; i <= BLUR_RADIUS; i += 1) {\n    float spatial = BLUR_WEIGHTS[i];\n    ivec2 delta = ivec2(round(u_direction * float(i)));\n    ivec2 coordA = coord + delta;\n    ivec2 coordB = coord - delta;\n    vec2 uvA = (vec2(coordA) + 0.5) / vec2(size);\n    vec2 uvB = (vec2(coordB) + 0.5) / vec2(size);\n    float depthA = readDepthFromUv(uvA);\n    float depthB = readDepthFromUv(uvB);\n    float weightA = spatial * exp(-abs(depthA - centerDepth) * u_params.z);\n    float weightB = spatial * exp(-abs(depthB - centerDepth) * u_params.z);\n    sum += readAo(coordA) * weightA;\n    sum += readAo(coordB) * weightB;\n    weightSum += weightA + weightB;\n  }\n  float ao = sum / max(weightSum, 1e-5);\n  fragColor = vec4(vec3(ao), 1.0);\n}`;\n}\n\nconst FULLSCREEN_VERTEX_SOURCE = `#version 300 es\nlayout (location = 0) in vec2 a_position;\nlayout (location = 1) in vec2 a_uv;\n\nout vec2 v_uv;\n\nvoid main() {\n  gl_Position = vec4(a_position, 0.0, 1.0);\n  v_uv = a_uv;\n}`;\n\nconst COMPOSITE_FRAGMENT_SOURCE = `#version 300 es\nprecision highp float;\n\nin vec2 v_uv;\n\nuniform sampler2D u_aoTex;\nuniform float u_strength;\n\nout vec4 fragColor;\n\nvoid main() {\n  float ao = texture(u_aoTex, v_uv).r;\n  float alpha = clamp((1.0 - ao) * u_strength, 0.0, 1.0);\n  fragColor = vec4(0.0, 0.0, 0.0, alpha);\n}`;\n\nfunction createTexture(gl, width, height, internalFormat, format, type, filter = gl.LINEAR) {\n  const texture = gl.createTexture();\n  gl.bindTexture(gl.TEXTURE_2D, texture);\n  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n  gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, width, height, 0, format, type, null);\n  return texture;\n}\n\nfunction deleteFramebuffer(gl, framebuffer) {\n  if (framebuffer) gl.deleteFramebuffer(framebuffer);\n}\n\nfunction deleteTexture(gl, texture) {\n  if (texture) gl.deleteTexture(texture);\n}\n\nexport class AmbientOcclusionWebGLAlt {\n  constructor(device) {\n    this.device = device;\n    this.gl = device?.gl ?? null;\n    this.prepassFramebuffer = null;\n    this.prepassColor = null;\n    this.prepassDepth = null;\n    this.aoRawFramebuffer = null;\n    this.aoRaw = null;\n    this.aoPingFramebuffer = null;\n    this.aoPing = null;\n    this.aoPongFramebuffer = null;\n    this.aoPong = null;\n    this.fullSize = { width: 0, height: 0 };\n    this.aoSize = { width: 0, height: 0 };\n    this.aoPrograms = new Map();\n    this.blurPrograms = new Map();\n    this.compositeProgram = null;\n    this.fullscreenVao = null;\n    this.fullscreenBuffer = null;\n    this._ownedPrograms = new Set();\n    this.invViewProjection = new Float32Array(16);\n  }\n\n  destroy() {\n    const { gl } = this;\n    if (!gl) return;\n    this.destroyTargets();\n    for (const program of this._ownedPrograms) {\n      gl.deleteProgram(program);\n    }\n    this._ownedPrograms.clear();\n    this.aoPrograms.clear();\n    this.blurPrograms.clear();\n    this.compositeProgram = null;\n    if (this.fullscreenVao) gl.deleteVertexArray(this.fullscreenVao);\n    if (this.fullscreenBuffer) gl.deleteBuffer(this.fullscreenBuffer);\n    this.fullscreenVao = null;\n    this.fullscreenBuffer = null;\n  }\n\n  destroyTargets() {\n    const { gl } = this;\n    if (!gl) return;\n    deleteFramebuffer(gl, this.prepassFramebuffer);\n    deleteTexture(gl, this.prepassColor);\n    deleteTexture(gl, this.prepassDepth);\n    deleteFramebuffer(gl, this.aoRawFramebuffer);\n    deleteTexture(gl, this.aoRaw);\n    deleteFramebuffer(gl, this.aoPingFramebuffer);\n    deleteTexture(gl, this.aoPing);\n    deleteFramebuffer(gl, this.aoPongFramebuffer);\n    deleteTexture(gl, this.aoPong);\n    this.prepassFramebuffer = null;\n    this.prepassColor = null;\n    this.prepassDepth = null;\n    this.aoRawFramebuffer = null;\n    this.aoRaw = null;\n    this.aoPingFramebuffer = null;\n    this.aoPing = null;\n    this.aoPongFramebuffer = null;\n    this.aoPong = null;\n    this.fullSize = { width: 0, height: 0 };\n    this.aoSize = { width: 0, height: 0 };\n  }\n\n  ensureFullscreenGeometry() {\n    const { gl } = this;\n    if (!gl || this.fullscreenVao) return;\n    this.fullscreenVao = gl.createVertexArray();\n    this.fullscreenBuffer = gl.createBuffer();\n    gl.bindVertexArray(this.fullscreenVao);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.fullscreenBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n      -1, -1, 0, 0,\n      1, -1, 1, 0,\n      -1, 1, 0, 1,\n      -1, 1, 0, 1,\n      1, -1, 1, 0,\n      1, 1, 1, 1,\n    ]), gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(0);\n    gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 16, 0);\n    gl.enableVertexAttribArray(1);\n    gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 16, 8);\n    gl.bindVertexArray(null);\n    gl.bindBuffer(gl.ARRAY_BUFFER, null);\n  }\n\n  createProgram(fragmentSource, uniformNames) {\n    const program = this.device.createProgram(FULLSCREEN_VERTEX_SOURCE, fragmentSource);\n    const uniforms = {};\n    for (const name of uniformNames) {\n      uniforms[name] = this.gl.getUniformLocation(program, name);\n    }\n    this._ownedPrograms.add(program);\n    return { program, uniforms };\n  }\n\n  ensurePrograms(mode, quality) {\n    this.ensureFullscreenGeometry();\n    const aoKey = `${mode}|${quality.key}`;\n    if (!this.aoPrograms.has(aoKey)) {\n      this.aoPrograms.set(\n        aoKey,\n        this.createProgram(\n          mode === 'fast' ? createAltAoFragmentSource(quality) : createSmoothAoFragmentSource(quality),\n          [\n            'u_invViewProjection',\n            'u_viewProjection',\n            'u_view',\n            'u_sizes',\n            'u_params',\n            'u_altParams',\n            'u_cameraPosition',\n            'u_depthTex',\n          ],\n        ),\n      );\n    }\n    if (!this.blurPrograms.has(quality.key)) {\n      this.blurPrograms.set(\n        quality.key,\n        this.createProgram(createBlurFragmentSource(quality), [\n          'u_sizes',\n          'u_params',\n          'u_direction',\n          'u_depthTex',\n          'u_aoTex',\n        ]),\n      );\n    }\n    if (!this.compositeProgram) {\n      this.compositeProgram = this.createProgram(COMPOSITE_FRAGMENT_SOURCE, ['u_aoTex', 'u_strength']);\n    }\n    return true;\n  }\n\n  ensureTargets(width, height, quality) {\n    const { gl } = this;\n    if (!gl) return false;\n    const fullWidth = Math.max(1, Math.floor(width));\n    const fullHeight = Math.max(1, Math.floor(height));\n    const aoWidth = Math.max(1, Math.round(fullWidth * quality.resolutionScale));\n    const aoHeight = Math.max(1, Math.round(fullHeight * quality.resolutionScale));\n    const recreateFull = this.fullSize.width !== fullWidth || this.fullSize.height !== fullHeight;\n    const recreateAo = this.aoSize.width !== aoWidth || this.aoSize.height !== aoHeight;\n\n    if (recreateFull) {\n      deleteFramebuffer(gl, this.prepassFramebuffer);\n      deleteTexture(gl, this.prepassColor);\n      deleteTexture(gl, this.prepassDepth);\n\n      this.prepassFramebuffer = gl.createFramebuffer();\n      this.prepassColor = createTexture(gl, fullWidth, fullHeight, gl.RGBA8, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST);\n      this.prepassDepth = createTexture(\n        gl,\n        fullWidth,\n        fullHeight,\n        gl.DEPTH_COMPONENT24,\n        gl.DEPTH_COMPONENT,\n        gl.UNSIGNED_INT,\n        gl.NEAREST,\n      );\n      gl.bindFramebuffer(gl.FRAMEBUFFER, this.prepassFramebuffer);\n      gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.prepassColor, 0);\n      gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, this.prepassDepth, 0);\n      gl.drawBuffers([gl.COLOR_ATTACHMENT0]);\n      const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n      if (status !== gl.FRAMEBUFFER_COMPLETE) {\n        console.warn('AmbientOcclusionWebGLAlt: prepass framebuffer incomplete.', status);\n        this.destroyTargets();\n        gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n        return false;\n      }\n      this.fullSize = { width: fullWidth, height: fullHeight };\n    }\n\n    if (recreateAo) {\n      deleteFramebuffer(gl, this.aoRawFramebuffer);\n      deleteTexture(gl, this.aoRaw);\n      deleteFramebuffer(gl, this.aoPingFramebuffer);\n      deleteTexture(gl, this.aoPing);\n      deleteFramebuffer(gl, this.aoPongFramebuffer);\n      deleteTexture(gl, this.aoPong);\n\n      this.aoRawFramebuffer = gl.createFramebuffer();\n      this.aoRaw = createTexture(gl, aoWidth, aoHeight, gl.RGBA8, gl.RGBA, gl.UNSIGNED_BYTE, gl.LINEAR);\n      gl.bindFramebuffer(gl.FRAMEBUFFER, this.aoRawFramebuffer);\n      gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.aoRaw, 0);\n      gl.drawBuffers([gl.COLOR_ATTACHMENT0]);\n      if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {\n        console.warn('AmbientOcclusionWebGLAlt: raw AO framebuffer incomplete.');\n        this.destroyTargets();\n        gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n        return false;\n      }\n\n      this.aoPingFramebuffer = gl.createFramebuffer();\n      this.aoPing = createTexture(gl, aoWidth, aoHeight, gl.RGBA8, gl.RGBA, gl.UNSIGNED_BYTE, gl.LINEAR);\n      gl.bindFramebuffer(gl.FRAMEBUFFER, this.aoPingFramebuffer);\n      gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.aoPing, 0);\n      gl.drawBuffers([gl.COLOR_ATTACHMENT0]);\n      if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {\n        console.warn('AmbientOcclusionWebGLAlt: ping AO framebuffer incomplete.');\n        this.destroyTargets();\n        gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n        return false;\n      }\n\n      this.aoPongFramebuffer = gl.createFramebuffer();\n      this.aoPong = createTexture(gl, aoWidth, aoHeight, gl.RGBA8, gl.RGBA, gl.UNSIGNED_BYTE, gl.LINEAR);\n      gl.bindFramebuffer(gl.FRAMEBUFFER, this.aoPongFramebuffer);\n      gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.aoPong, 0);\n      gl.drawBuffers([gl.COLOR_ATTACHMENT0]);\n      if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {\n        console.warn('AmbientOcclusionWebGLAlt: pong AO framebuffer incomplete.');\n        this.destroyTargets();\n        gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n        return false;\n      }\n\n      this.aoSize = { width: aoWidth, height: aoHeight };\n    }\n\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    return true;\n  }\n\n  setAoUniforms(uniforms, cameraUniforms, strength, radius, bias, quality, intensityScale, intensityShift) {\n    const { gl } = this;\n    if (!gl || !invertMat4(this.invViewProjection, cameraUniforms?.viewProjection)) {\n      return false;\n    }\n    gl.uniformMatrix4fv(uniforms.u_invViewProjection, false, this.invViewProjection);\n    if (uniforms.u_viewProjection) {\n      gl.uniformMatrix4fv(uniforms.u_viewProjection, false, cameraUniforms?.viewProjection ?? this.invViewProjection);\n    }\n    if (uniforms.u_view) {\n      gl.uniformMatrix4fv(uniforms.u_view, false, cameraUniforms?.view ?? this.invViewProjection);\n    }\n    if (uniforms.u_cameraPosition) {\n      gl.uniform3f(\n        uniforms.u_cameraPosition,\n        cameraUniforms?.position?.[0] ?? 0,\n        cameraUniforms?.position?.[1] ?? 0,\n        cameraUniforms?.position?.[2] ?? 1,\n      );\n    }\n    gl.uniform4f(uniforms.u_sizes, this.fullSize.width, this.fullSize.height, this.aoSize.width, this.aoSize.height);\n    gl.uniform4f(\n      uniforms.u_params,\n      Math.max(1, Number(radius) || 1),\n      Math.max(0, Number(bias) || 0),\n      quality.depthSharpness,\n      Math.max(0, Number(strength) || 0),\n    );\n    if (uniforms.u_altParams) {\n      gl.uniform4f(\n        uniforms.u_altParams,\n        Math.max(0, Number(intensityScale) || 0),\n        Math.max(0, Number(intensityShift) || 0),\n        0,\n        0,\n      );\n    }\n    return true;\n  }\n\n  drawFullscreen() {\n    this.gl.bindVertexArray(this.fullscreenVao);\n    this.gl.drawArrays(this.gl.TRIANGLES, 0, 6);\n  }\n\n  render(context, options = {}) {\n    const { gl } = this;\n    if (!gl) return false;\n    const requestedMode = normalizeAmbientOcclusionMode(options.mode);\n    const quality = getAmbientOcclusionQualityPreset(options.quality);\n    const viewport = resolveContextViewport(\n      context,\n      context?.target?.width ?? gl.canvas?.width ?? 1,\n      context?.target?.height ?? gl.canvas?.height ?? 1,\n    );\n    if (!this.ensurePrograms(requestedMode, quality)) return false;\n    if (!this.ensureTargets(viewport.width, viewport.height, quality)) return false;\n\n    const aoEntry = this.aoPrograms.get(`${requestedMode}|${quality.key}`);\n    const blurEntry = this.blurPrograms.get(quality.key);\n    const compositeEntry = this.compositeProgram;\n    if (!aoEntry?.program || !blurEntry?.program || !compositeEntry?.program) return false;\n    gl.useProgram(aoEntry.program);\n    if (!this.setAoUniforms(\n      aoEntry.uniforms,\n      options.cameraUniforms,\n      options.strength,\n      options.radius,\n      options.bias,\n      quality,\n      options.intensityScale,\n      options.intensityShift,\n    )) {\n      return false;\n    }\n\n    gl.bindFramebuffer(gl.FRAMEBUFFER, this.prepassFramebuffer);\n    gl.drawBuffers([gl.COLOR_ATTACHMENT0]);\n    gl.viewport(0, 0, viewport.width, viewport.height);\n    gl.colorMask(true, true, true, true);\n    gl.depthMask(true);\n    gl.clearColor(1, 1, 1, 1);\n    gl.clearDepth(1.0);\n    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n    gl.disable(gl.BLEND);\n    gl.enable(gl.DEPTH_TEST);\n    gl.depthFunc(gl.LEQUAL);\n    if (options.selection?.nodes) options.drawNodes?.({ depthOnly: true });\n    if (options.selection?.edges) {\n      options.drawEdges?.({\n        depthOnly: true,\n        weighted: false,\n        passViewportWidth: viewport.width,\n        passViewportHeight: viewport.height,\n      });\n    }\n\n    gl.bindFramebuffer(gl.FRAMEBUFFER, this.aoRawFramebuffer);\n    gl.drawBuffers([gl.COLOR_ATTACHMENT0]);\n    gl.viewport(0, 0, this.aoSize.width, this.aoSize.height);\n    gl.disable(gl.DEPTH_TEST);\n    gl.depthMask(false);\n    gl.disable(gl.BLEND);\n    gl.useProgram(aoEntry.program);\n    gl.activeTexture(gl.TEXTURE0);\n    gl.bindTexture(gl.TEXTURE_2D, this.prepassDepth);\n    gl.uniform1i(aoEntry.uniforms.u_depthTex, 0);\n    this.drawFullscreen();\n\n    gl.bindFramebuffer(gl.FRAMEBUFFER, this.aoPingFramebuffer);\n    gl.drawBuffers([gl.COLOR_ATTACHMENT0]);\n    gl.useProgram(blurEntry.program);\n    gl.uniform4f(blurEntry.uniforms.u_sizes, this.fullSize.width, this.fullSize.height, this.aoSize.width, this.aoSize.height);\n    gl.uniform4f(\n      blurEntry.uniforms.u_params,\n      Math.max(1, Number(options.radius) || 1),\n      Math.max(0, Number(options.bias) || 0),\n      quality.depthSharpness,\n      Math.max(0, Number(options.strength) || 0),\n    );\n    gl.uniform2f(blurEntry.uniforms.u_direction, 1, 0);\n    gl.activeTexture(gl.TEXTURE0);\n    gl.bindTexture(gl.TEXTURE_2D, this.prepassDepth);\n    gl.uniform1i(blurEntry.uniforms.u_depthTex, 0);\n    gl.activeTexture(gl.TEXTURE1);\n    gl.bindTexture(gl.TEXTURE_2D, this.aoRaw);\n    gl.uniform1i(blurEntry.uniforms.u_aoTex, 1);\n    this.drawFullscreen();\n\n    gl.bindFramebuffer(gl.FRAMEBUFFER, this.aoPongFramebuffer);\n    gl.drawBuffers([gl.COLOR_ATTACHMENT0]);\n    gl.uniform2f(blurEntry.uniforms.u_direction, 0, 1);\n    gl.activeTexture(gl.TEXTURE1);\n    gl.bindTexture(gl.TEXTURE_2D, this.aoPing);\n    this.drawFullscreen();\n\n    const outputFramebuffer = context.target?.handle ?? null;\n    gl.bindFramebuffer(gl.FRAMEBUFFER, outputFramebuffer);\n    if (outputFramebuffer) gl.drawBuffers([gl.COLOR_ATTACHMENT0]);\n    gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n    gl.disable(gl.DEPTH_TEST);\n    gl.depthMask(false);\n    gl.enable(gl.BLEND);\n    gl.blendEquation(gl.FUNC_ADD);\n    if (typeof gl.blendFuncSeparate === 'function') {\n      gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE);\n    } else {\n      gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n    }\n    gl.colorMask(true, true, true, false);\n    gl.useProgram(compositeEntry.program);\n    gl.activeTexture(gl.TEXTURE0);\n    gl.bindTexture(gl.TEXTURE_2D, this.aoPong);\n    gl.uniform1i(compositeEntry.uniforms.u_aoTex, 0);\n    gl.uniform1f(compositeEntry.uniforms.u_strength, Math.max(0, Number(options.strength) || 0));\n    this.drawFullscreen();\n    gl.colorMask(true, true, true, true);\n    return true;\n  }\n}\n\nexport default AmbientOcclusionWebGLAlt;\n","import {\n  GraphLayer,\n  AMBIENT_OCCLUSION_BIAS_DEFAULT,\n  AMBIENT_OCCLUSION_RADIUS_DEFAULT,\n  AMBIENT_OCCLUSION_STRENGTH_DEFAULT,\n  SHADED_LIGHT_DIRECTION_DEFAULT,\n  SHADED_LIGHT_COLOR_DEFAULT,\n  SHADED_AMBIENT_STRENGTH_DEFAULT,\n  SHADED_AMBIENT_TOP_COLOR_DEFAULT,\n  SHADED_AMBIENT_BOTTOM_COLOR_DEFAULT,\n  SHADED_DIFFUSE_STRENGTH_DEFAULT,\n  SHADED_SPECULAR_COLOR_DEFAULT,\n  SHADED_SPECULAR_STRENGTH_DEFAULT,\n  SHADED_SHININESS_DEFAULT,\n} from './GraphLayer.js';\nimport { normalizeAmbientOcclusionQuality } from './AmbientOcclusionQuality.js';\nimport { GraphVisualSchema } from '../schema/GraphVisualSchema.js';\nimport {\n  VISUAL_ATTRIBUTE_NAMES,\n  DEFAULT_NODE_COLOR,\n  DEFAULT_EDGE_COLOR,\n  DEFAULT_EDGE_OPACITY,\n  DEFAULT_NODE_SIZE,\n  DEFAULT_EDGE_WIDTH,\n} from '../../pipeline/constants.js';\nimport { createGraphWebGLSources } from './shaders/graphWebGL.js';\nimport { AmbientOcclusionWebGLAlt } from './AmbientOcclusionWebGLAlt.js';\n\nconst {\n  NODE_COLOR_ATTRIBUTE,\n  NODE_POSITION_ATTRIBUTE,\n  NODE_SIZE_ATTRIBUTE,\n  NODE_STATE_ATTRIBUTE,\n  NODE_OUTLINE_WIDTH_ATTRIBUTE,\n  NODE_OUTLINE_COLOR_ATTRIBUTE,\n  EDGE_COLOR_ATTRIBUTE,\n  EDGE_WIDTH_ATTRIBUTE,\n  EDGE_OPACITY_ATTRIBUTE,\n  EDGE_STATE_ATTRIBUTE,\n  EDGE_ENDPOINTS_SIZE_ATTRIBUTE,\n} = VISUAL_ATTRIBUTE_NAMES;\n\nfunction normalizeEndpoints(value) {\n  if (value === 'source' || value === 'from') return 'source';\n  if (value === 'destination' || value === 'target' || value === 'to') return 'destination';\n  return 'both';\n}\n\nfunction clamp01(value, fallback = 0) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return fallback;\n  if (numeric <= 0) return 0;\n  if (numeric >= 1) return 1;\n  return numeric;\n}\n\nfunction toNumber(value, fallback = 0) {\n  const numeric = Number(value);\n  return Number.isFinite(numeric) ? numeric : fallback;\n}\n\nfunction toRgba(value, fallback = DEFAULT_EDGE_COLOR) {\n  if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n    const len = value.length ?? 0;\n    if (len >= 4) {\n      return [\n        clamp01(value[0], fallback[0] ?? 0),\n        clamp01(value[1], fallback[1] ?? 0),\n        clamp01(value[2], fallback[2] ?? 0),\n        clamp01(value[3], fallback[3] ?? 1),\n      ];\n    }\n    if (len >= 3) {\n      return [\n        clamp01(value[0], fallback[0] ?? 0),\n        clamp01(value[1], fallback[1] ?? 0),\n        clamp01(value[2], fallback[2] ?? 0),\n        fallback[3] ?? 1,\n      ];\n    }\n  }\n  if (value && typeof value === 'object') {\n    if ('source' in value) return toRgba(value.source, fallback);\n  }\n  return [\n    clamp01(fallback[0], 0),\n    clamp01(fallback[1], 0),\n    clamp01(fallback[2], 0),\n    clamp01(fallback[3], 1),\n  ];\n}\n\nfunction toColorPair(value, fallback = [DEFAULT_EDGE_COLOR, DEFAULT_EDGE_COLOR]) {\n  const fallbackStart = toRgba(fallback?.[0] ?? DEFAULT_EDGE_COLOR, DEFAULT_EDGE_COLOR);\n  const fallbackEnd = toRgba(fallback?.[1] ?? fallbackStart, fallbackStart);\n  if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n    const len = value.length ?? 0;\n    if (len >= 2 && (Array.isArray(value[0]) || ArrayBuffer.isView(value[0]) || (value[0] && typeof value[0] === 'object'))) {\n      const start = toRgba(value[0], fallbackStart);\n      const end = toRgba(value[1], start);\n      return [start, end];\n    }\n    if (len >= 8) {\n      const start = toRgba([value[0], value[1], value[2], value[3]], fallbackStart);\n      const end = toRgba([value[4], value[5], value[6], value[7]], fallbackEnd);\n      return [start, end];\n    }\n    if (len >= 4) {\n      const rgba = toRgba(value, fallbackStart);\n      return [rgba, rgba];\n    }\n  }\n  if (value && typeof value === 'object') {\n    const start = 'source' in value ? toRgba(value.source, fallbackStart) : toRgba(value, fallbackStart);\n    const end = 'target' in value ? toRgba(value.target, start) : start;\n    return [start, end];\n  }\n  return [fallbackStart, fallbackEnd];\n}\n\nfunction toScalarPair(value, fallback = [1, 1]) {\n  const fallbackA = toNumber(fallback?.[0], 1);\n  const fallbackB = toNumber(fallback?.[1], fallbackA);\n  if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n    const len = value.length ?? 0;\n    if (len >= 2) {\n      const a = toNumber(value[0], fallbackA);\n      const b = toNumber(value[1], a);\n      return [a, b];\n    }\n    if (len >= 1) {\n      const scalar = toNumber(value[0], fallbackA);\n      return [scalar, scalar];\n    }\n  }\n  if (value && typeof value === 'object') {\n    const start = ('source' in value) ? toNumber(value.source, fallbackA) : fallbackA;\n    const end = ('target' in value) ? toNumber(value.target, start) : start;\n    return [start, end];\n  }\n  const scalar = toNumber(value, fallbackA);\n  return [scalar, scalar];\n}\n\nconst NODE_UNIFORM_NAMES = [\n  'u_viewProjection',\n  'u_nodeOutlineWidths',\n  'u_nodeOutlineColors',\n  'u_nodeStates',\n  'u_nodePositions',\n  'u_nodePositionsFrom',\n  'u_nodeInterpolationFactor',\n  'u_nodeInterpolationEnabled',\n  'u_nodeColors',\n  'u_nodeSizes',\n  'u_cameraPosition',\n  'u_cameraUp',\n  'u_cameraRight',\n  'u_is2D',\n  'u_zoom2D',\n  'u_semanticZoomExponent',\n  'u_hasNodeColors',\n  'u_hasNodeSizes',\n  'u_hasNodeOutlineWidths',\n  'u_hasNodeOutlineColors',\n  'u_hasNodeStates',\n  'u_defaultNodeColor',\n  'u_defaultNodeSize',\n  'u_hoverNodeIndex',\n  'u_hoverNodeState',\n  'u_hoverNodeIsVirtual',\n  'u_nodeStateForceMaxAlphaMask',\n  'u_nodeHoverScale',\n  'u_nodeHoverColorMul',\n  'u_nodeHoverColorAdd',\n  'u_nodeNoStateScale',\n  'u_nodeNoStateColorMul',\n  'u_nodeNoStateColorAdd',\n  'u_nodeStateScale[0]',\n  'u_nodeStateColorMul[0]',\n  'u_nodeStateColorAdd[0]',\n  'u_nodeOpacityBase',\n  'u_nodeOpacityScale',\n  'u_nodeSizeBase',\n  'u_nodeSizeScale',\n  'u_nodeOutline',\n  'u_outlineWidthBase',\n  'u_outlineWidthScale',\n  'u_outlineColor',\n  'u_shadedLightDirection',\n  'u_shadedLightColor',\n  'u_shadedAmbientTopColor',\n  'u_shadedAmbientBottomColor',\n  'u_shadedSpecularColor',\n  'u_shadedParams',\n];\n\nconst EDGE_UNIFORM_NAMES = [\n  'u_viewProjection',\n  'u_nodePositions',\n  'u_nodePositionsFrom',\n  'u_nodeInterpolationFactor',\n  'u_nodeInterpolationEnabled',\n  'u_nodeStates',\n  'u_nodeEdgeColors',\n  'u_edgeColors',\n  'u_edgeStates',\n  'u_edgeOpacities',\n  'u_nodeOpacitySource',\n  'u_edgeEndpoints',\n  'u_hasNodeStates',\n  'u_hasEdgeStates',\n  'u_hoverNodeIndex',\n  'u_hoverNodeIsVirtual',\n  'u_hoverEdgeIndex',\n  'u_hoverEdgeState',\n  'u_hoverEdgeIsVirtual',\n  'u_edgeStateForceMaxAlphaMask',\n  'u_edgeHoverScale',\n  'u_edgeHoverColorMul',\n  'u_edgeHoverColorAdd',\n  'u_edgeNoStateScale',\n  'u_edgeNoStateColorMul',\n  'u_edgeNoStateColorAdd',\n  'u_edgeStateScale[0]',\n  'u_edgeStateColorMul[0]',\n  'u_edgeStateColorAdd[0]',\n  'u_edgeColorSource',\n  'u_edgeColorEndpoints',\n  'u_edgeOpacitySource',\n  'u_edgeOpacityEndpoints',\n  'u_hasEdgeColors',\n  'u_hasNodeColors',\n  'u_hasEdgeOpacities',\n  'u_hasNodeOpacitySource',\n  'u_defaultNodeEdgeColor',\n  'u_defaultEdgeColorStart',\n  'u_defaultEdgeColorEnd',\n  'u_defaultEdgeOpacity',\n  'u_defaultNodeOpacitySource',\n  'u_edgeOpacityBase',\n  'u_edgeOpacityScale',\n  'u_shadedLightDirection',\n  'u_shadedLightColor',\n  'u_shadedAmbientTopColor',\n  'u_shadedAmbientBottomColor',\n  'u_shadedSpecularColor',\n  'u_shadedParams',\n];\n\nconst EDGE_QUAD_UNIFORM_NAMES = [\n  'u_viewProjection',\n  'u_cameraPosition',\n  'u_cameraUp',\n  'u_cameraRight',\n  'u_is2D',\n  'u_viewport',\n  'u_nodePositions',\n  'u_nodePositionsFrom',\n  'u_nodeInterpolationFactor',\n  'u_nodeInterpolationEnabled',\n  'u_nodeStates',\n  'u_nodeEdgeColors',\n  'u_edgeColors',\n  'u_edgeEndpoints',\n  'u_edgeStates',\n  'u_edgeWidths',\n  'u_edgeOpacities',\n  'u_edgeEndpointSizes',\n  'u_nodeWidthSource',\n  'u_nodeOpacitySource',\n  'u_nodeEndpointSizeSource',\n  'u_edgeColorSource',\n  'u_edgeColorEndpoints',\n  'u_edgeWidthSource',\n  'u_edgeWidthEndpoints',\n  'u_edgeOpacitySource',\n  'u_edgeOpacityEndpoints',\n  'u_edgeEndpointSizeSource',\n  'u_edgeEndpointSizeEndpoints',\n  'u_hasEdgeColors',\n  'u_hasNodeColors',\n  'u_hasEdgeStates',\n  'u_hasNodeStates',\n  'u_hasEdgeWidths',\n  'u_hasEdgeOpacities',\n  'u_hasEdgeEndpointSizes',\n  'u_hasNodeWidthSource',\n  'u_hasNodeOpacitySource',\n  'u_hasNodeEndpointSizeSource',\n  'u_defaultNodeEdgeColor',\n  'u_defaultEdgeColorStart',\n  'u_defaultEdgeColorEnd',\n  'u_defaultEdgeWidth',\n  'u_defaultNodeWidthSource',\n  'u_defaultEdgeOpacity',\n  'u_defaultNodeOpacitySource',\n  'u_defaultEdgeEndpointSize',\n  'u_defaultNodeEndpointSizeSource',\n  'u_edgeWidthBase',\n  'u_edgeWidthScale',\n  'u_edgeOpacityBase',\n  'u_edgeOpacityScale',\n  'u_nodeSizeBase',\n  'u_nodeSizeScale',\n  'u_edgeEndpointTrim',\n  'u_zoom2D',\n  'u_semanticZoomExponent',\n  'u_hoverNodeIndex',\n  'u_hoverNodeIsVirtual',\n  'u_hoverEdgeIndex',\n  'u_hoverEdgeState',\n  'u_hoverEdgeIsVirtual',\n  'u_edgeStateForceMaxAlphaMask',\n  'u_edgeHoverScale',\n  'u_edgeHoverColorMul',\n  'u_edgeHoverColorAdd',\n  'u_nodeNoStateScale',\n  'u_nodeStateScale[0]',\n  'u_edgeNoStateScale',\n  'u_edgeNoStateColorMul',\n  'u_edgeNoStateColorAdd',\n  'u_edgeStateScale[0]',\n  'u_edgeStateColorMul[0]',\n  'u_edgeStateColorAdd[0]',\n  'u_shadedLightDirection',\n  'u_shadedLightColor',\n  'u_shadedAmbientTopColor',\n  'u_shadedAmbientBottomColor',\n  'u_shadedSpecularColor',\n  'u_shadedParams',\n];\n\nconst DEFAULT_STATE_SCALE = new Float32Array([1, 1, 1, 0]);\nconst DEFAULT_STATE_COLOR_MUL = new Float32Array([1, 1, 1, 1]);\nconst DEFAULT_STATE_COLOR_ADD = new Float32Array([0, 0, 0, 0]);\n\nfunction warnOnce(owner, key, message, detail) {\n  if (!owner) return;\n  owner._warnedIssues ??= new Set();\n  if (owner._warnedIssues.has(key)) return;\n  owner._warnedIssues.add(key);\n  console.warn(message, detail);\n}\n\nfunction isMissingAttributeError(error) {\n  const message = typeof error?.message === 'string' ? error.message : '';\n  return (\n    message.includes('Unknown node attribute')\n    || message.includes('Unknown edge attribute')\n    || message.includes('Cannot perform attribute metadata lookup')\n  );\n}\n\nfunction isDebugWebGLRenderEnabled() {\n  if (globalThis.__HELIOS_DEBUG_WEBGL_RENDER === true) return true;\n  try {\n    const search = globalThis.location?.search ?? '';\n    return search.includes('debugWebGLRender=1');\n  } catch (_) {\n    return false;\n  }\n}\n\nfunction debugWebGLRender(message, detail) {\n  if (!isDebugWebGLRenderEnabled()) return;\n  console.warn(`[Helios][WebGLRender] ${message}`, detail);\n}\n\nconst NODE_VERTEX_SOURCE = `#version 300 es\nprecision highp float;\nprecision highp int;\n\nlayout (location = 0) in uint a_nodeId;\n\nuniform mat4 u_viewProjection;\nuniform sampler2D u_nodePositions;\nuniform sampler2D u_nodeColors;\nuniform sampler2D u_nodeSizes;\nuniform vec3 u_cameraPosition;\nuniform vec3 u_cameraUp;\nuniform vec3 u_cameraRight;\nuniform int u_is2D;\nuniform vec2 u_viewport;\nuniform int u_hasNodeColors;\nuniform int u_hasNodeSizes;\nuniform vec4 u_defaultNodeColor;\nuniform float u_defaultNodeSize;\nuniform float u_nodeSizeBase;\nuniform float u_nodeSizeScale;\n\nout vec4 v_color;\n\nvec3 fetchNodePos(uint id) {\n  return texelFetch(u_nodePositions, ivec2(int(id), 0), 0).xyz;\n}\n\nvec4 fetchNodeColor(uint id) {\n  if (u_hasNodeColors == 0) return u_defaultNodeColor;\n  return texelFetch(u_nodeColors, ivec2(int(id), 0), 0);\n}\n\nfloat fetchNodeSize(uint id) {\n  if (u_hasNodeSizes == 0) return u_defaultNodeSize;\n  return texelFetch(u_nodeSizes, ivec2(int(id), 0), 0).x;\n}\n\nvoid main() {\n  vec3 position = fetchNodePos(a_nodeId);\n  float rawSize = fetchNodeSize(a_nodeId);\n  float fullSize = max(0.0, u_nodeSizeBase + u_nodeSizeScale * rawSize);\n  float radius = fullSize * 0.5;\n\n  vec3 right = u_cameraRight;\n  vec3 up = u_cameraUp;\n  if (u_is2D == 1) {\n    right = normalize(right);\n    up = normalize(up);\n  } else {\n    vec3 viewDir = u_cameraPosition - position;\n    float viewLen = length(viewDir);\n    viewDir = viewLen > 1e-5 ? viewDir / viewLen : vec3(0.0, 0.0, 1.0);\n    right = u_cameraRight - viewDir * dot(u_cameraRight, viewDir);\n    float rightLen = length(right);\n    right = rightLen > 1e-5 ? right / rightLen : normalize(cross(u_cameraUp, viewDir));\n    up = normalize(cross(viewDir, right));\n  }\n\n  vec4 clipCenter = u_viewProjection * vec4(position, 1.0);\n  vec4 clipOffset = u_viewProjection * vec4(position + right * radius, 1.0);\n  vec2 ndcCenter = clipCenter.xy / clipCenter.w;\n  vec2 ndcOffset = clipOffset.xy / clipOffset.w;\n  vec2 pixelScale = vec2(max(u_viewport.x, 1.0), max(u_viewport.y, 1.0)) * 0.5;\n  float radiusPx = length((ndcOffset - ndcCenter) * pixelScale);\n  gl_PointSize = max(0.0, radiusPx * 2.0);\n  gl_Position = clipCenter;\n  v_color = fetchNodeColor(a_nodeId);\n}\n`;\n\nconst NODE_FRAGMENT_SOURCE = `#version 300 es\nprecision highp float;\n\nin vec4 v_color;\nout vec4 fragColor;\n\nvoid main() {\n  vec2 local = gl_PointCoord * 2.0 - 1.0;\n  if (dot(local, local) > 1.0) discard;\n  fragColor = v_color;\n}\n`;\n\nconst EDGE_VERTEX_SOURCE = `#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp usampler2D;\n\nlayout (location = 0) in uint a_edgeId;\n\nuniform mat4 u_viewProjection;\nuniform sampler2D u_nodePositions;\nuniform sampler2D u_nodeColors;\nuniform sampler2D u_nodeEdgeColors;\nuniform sampler2D u_edgeColors;\nuniform sampler2D u_edgeOpacities;\nuniform sampler2D u_nodeOpacitySource;\nuniform usampler2D u_edgeEndpoints;\nuniform int u_edgeColorSource; // 0=edge, 1=node\nuniform int u_edgeColorEndpoints; // 0=both, 1=source, 2=destination\nuniform int u_edgeOpacitySource; // 0=edge, 1=node\nuniform int u_edgeOpacityEndpoints; // 0=both, 1=source, 2=destination\nuniform int u_hasEdgeColors;\nuniform int u_hasNodeColors;\nuniform int u_hasEdgeOpacities;\nuniform int u_hasNodeOpacitySource;\nuniform vec4 u_defaultNodeEdgeColor;\nuniform vec4 u_defaultEdgeColorStart;\nuniform vec4 u_defaultEdgeColorEnd;\nuniform vec2 u_defaultEdgeOpacity;\nuniform vec2 u_defaultNodeOpacitySource;\nuniform float u_edgeOpacityBase;\nuniform float u_edgeOpacityScale;\n\nout vec4 v_color;\n\nvec3 fetchNodePos(uint id) {\n  return texelFetch(u_nodePositions, ivec2(int(id), 0), 0).xyz;\n}\n\nvec4 fetchNodeColor(uint id) {\n  if (u_hasNodeColors == 0) return u_defaultNodeEdgeColor;\n  return texelFetch(u_nodeEdgeColors, ivec2(int(id), 0), 0);\n}\n\nvec4 fetchEdgeColor(uint id, bool target) {\n  if (u_hasEdgeColors == 0) return target ? u_defaultEdgeColorEnd : u_defaultEdgeColorStart;\n  int offset = int(id) * 2 + (target ? 1 : 0);\n  return texelFetch(u_edgeColors, ivec2(offset, 0), 0);\n}\n\nfloat fetchNodeOpacity(uint id, float fallbackValue) {\n  if (u_hasNodeOpacitySource == 0) return fallbackValue;\n  return texelFetch(u_nodeOpacitySource, ivec2(int(id), 0), 0).x;\n}\n\nvec2 resolveNodeOpacityPair(uint sourceId, uint targetId, int endpointsMode, vec2 fallbackPair) {\n  float sourceValue = fetchNodeOpacity(sourceId, fallbackPair.x);\n  float targetValue = fetchNodeOpacity(targetId, fallbackPair.y);\n  if (endpointsMode == 1) return vec2(sourceValue, sourceValue);\n  if (endpointsMode == 2) return vec2(targetValue, targetValue);\n  return vec2(sourceValue, targetValue);\n}\n\nvec2 fetchEdgeOpacityPair(uint id, uint sourceId, uint targetId) {\n  if (u_edgeOpacitySource == 1) {\n    return resolveNodeOpacityPair(sourceId, targetId, u_edgeOpacityEndpoints, u_defaultNodeOpacitySource);\n  }\n  if (u_hasEdgeOpacities == 0) return u_defaultEdgeOpacity;\n  return texelFetch(u_edgeOpacities, ivec2(int(id), 0), 0).xy;\n}\n\nvoid main() {\n  uvec2 endpoints = texelFetch(u_edgeEndpoints, ivec2(int(a_edgeId), 0), 0).xy;\n  uint sourceId = endpoints.x;\n  uint targetId = endpoints.y;\n  uint nodeId = (gl_VertexID & 1) == 0 ? sourceId : targetId;\n  vec3 pos = fetchNodePos(nodeId);\n  gl_Position = u_viewProjection * vec4(pos, 1.0);\n\n  vec4 sourceColor = fetchEdgeColor(a_edgeId, false);\n  vec4 targetColor = fetchEdgeColor(a_edgeId, true);\n  if (u_edgeColorSource == 1) {\n    vec4 nodeSourceColor = fetchNodeColor(sourceId);\n    vec4 nodeTargetColor = fetchNodeColor(targetId);\n    if (u_edgeColorEndpoints == 1) {\n      sourceColor = nodeSourceColor;\n      targetColor = nodeSourceColor;\n    } else if (u_edgeColorEndpoints == 2) {\n      sourceColor = nodeTargetColor;\n      targetColor = nodeTargetColor;\n    } else {\n      sourceColor = nodeSourceColor;\n      targetColor = nodeTargetColor;\n    }\n  }\n  bool isTarget = (gl_VertexID & 1) == 1;\n  vec4 baseColor = isTarget ? targetColor : sourceColor;\n  vec2 opacityPair = fetchEdgeOpacityPair(a_edgeId, sourceId, targetId);\n  float rawOpacity = isTarget ? opacityPair.y : opacityPair.x;\n  float opacity = clamp(u_edgeOpacityBase + u_edgeOpacityScale * rawOpacity, 0.0, 1.0);\n  v_color = vec4(baseColor.rgb, clamp(baseColor.a * opacity, 0.0, 1.0));\n}\n`;\n\nconst EDGE_QUAD_VERTEX_SOURCE = `#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp usampler2D;\n\nlayout (location = 0) in vec2 a_corner;\nlayout (location = 1) in uint a_edgeId;\n\nuniform mat4 u_viewProjection;\nuniform vec2 u_viewport;\nuniform sampler2D u_nodePositions;\nuniform sampler2D u_nodeEdgeColors;\nuniform sampler2D u_edgeColors;\nuniform usampler2D u_edgeEndpoints;\nuniform sampler2D u_edgeWidths;\nuniform sampler2D u_edgeOpacities;\nuniform sampler2D u_edgeEndpointSizes;\nuniform sampler2D u_nodeWidthSource;\nuniform sampler2D u_nodeOpacitySource;\nuniform sampler2D u_nodeEndpointSizeSource;\nuniform int u_edgeColorSource; // 0=edge, 1=node\nuniform int u_edgeColorEndpoints; // 0=both, 1=source, 2=destination\nuniform int u_edgeWidthSource; // 0=edge, 1=node\nuniform int u_edgeWidthEndpoints; // 0=both, 1=source, 2=destination\nuniform int u_edgeOpacitySource; // 0=edge, 1=node\nuniform int u_edgeOpacityEndpoints; // 0=both, 1=source, 2=destination\nuniform int u_edgeEndpointSizeSource; // 0=edge, 1=node\nuniform int u_edgeEndpointSizeEndpoints; // 0=both, 1=source, 2=destination\nuniform int u_hasEdgeColors;\nuniform int u_hasNodeColors;\nuniform int u_hasEdgeWidths;\nuniform int u_hasEdgeOpacities;\nuniform int u_hasEdgeEndpointSizes;\nuniform int u_hasNodeWidthSource;\nuniform int u_hasNodeOpacitySource;\nuniform int u_hasNodeEndpointSizeSource;\nuniform vec4 u_defaultNodeEdgeColor;\nuniform vec4 u_defaultEdgeColorStart;\nuniform vec4 u_defaultEdgeColorEnd;\nuniform vec2 u_defaultEdgeWidth;\nuniform vec2 u_defaultEdgeOpacity;\nuniform vec2 u_defaultNodeOpacitySource;\nuniform vec2 u_defaultEdgeEndpointSize;\nuniform float u_edgeWidthBase;\nuniform float u_edgeWidthScale;\nuniform float u_edgeOpacityBase;\nuniform float u_edgeOpacityScale;\nuniform float u_nodeSizeBase;\nuniform float u_nodeSizeScale;\nuniform float u_edgeEndpointTrim;\n\nout vec4 v_color;\n\nvec3 fetchNodePos(uint id) {\n  return texelFetch(u_nodePositions, ivec2(int(id), 0), 0).xyz;\n}\n\nvec4 fetchNodeColor(uint id) {\n  if (u_hasNodeColors == 0) return u_defaultNodeEdgeColor;\n  return texelFetch(u_nodeEdgeColors, ivec2(int(id), 0), 0);\n}\n\nvec4 fetchEdgeColor(uint id, bool target) {\n  if (u_hasEdgeColors == 0) return target ? u_defaultEdgeColorEnd : u_defaultEdgeColorStart;\n  int offset = int(id) * 2 + (target ? 1 : 0);\n  return texelFetch(u_edgeColors, ivec2(offset, 0), 0);\n}\n\nfloat fetchNodeScalar(sampler2D sourceTex, uint nodeId, int hasSource, float fallbackValue) {\n  if (hasSource == 0) return fallbackValue;\n  return texelFetch(sourceTex, ivec2(int(nodeId), 0), 0).x;\n}\n\nvec2 resolveNodePair(\n  sampler2D sourceTex,\n  uint sourceId,\n  uint targetId,\n  int hasSource,\n  int endpointsMode,\n  vec2 fallbackPair\n) {\n  float sourceValue = fetchNodeScalar(sourceTex, sourceId, hasSource, fallbackPair.x);\n  float targetValue = fetchNodeScalar(sourceTex, targetId, hasSource, fallbackPair.y);\n  if (endpointsMode == 1) return vec2(sourceValue, sourceValue);\n  if (endpointsMode == 2) return vec2(targetValue, targetValue);\n  return vec2(sourceValue, targetValue);\n}\n\nvec2 fetchEdgeWidthPair(uint edgeId, uint sourceId, uint targetId) {\n  if (u_edgeWidthSource == 1) {\n    return resolveNodePair(\n      u_nodeWidthSource,\n      sourceId,\n      targetId,\n      u_hasNodeWidthSource,\n      u_edgeWidthEndpoints,\n      u_defaultEdgeWidth\n    );\n  }\n  if (u_hasEdgeWidths == 0) return u_defaultEdgeWidth;\n  return texelFetch(u_edgeWidths, ivec2(int(edgeId), 0), 0).xy;\n}\n\nvec2 fetchEdgeOpacityPair(uint edgeId, uint sourceId, uint targetId) {\n  if (u_edgeOpacitySource == 1) {\n    return resolveNodePair(\n      u_nodeOpacitySource,\n      sourceId,\n      targetId,\n      u_hasNodeOpacitySource,\n      u_edgeOpacityEndpoints,\n      u_defaultNodeOpacitySource\n    );\n  }\n  if (u_hasEdgeOpacities == 0) return u_defaultEdgeOpacity;\n  return texelFetch(u_edgeOpacities, ivec2(int(edgeId), 0), 0).xy;\n}\n\nvec2 fetchEdgeEndpointSizePair(uint edgeId, uint sourceId, uint targetId) {\n  if (u_edgeEndpointSizeSource == 1) {\n    return resolveNodePair(\n      u_nodeEndpointSizeSource,\n      sourceId,\n      targetId,\n      u_hasNodeEndpointSizeSource,\n      u_edgeEndpointSizeEndpoints,\n      u_defaultEdgeEndpointSize\n    );\n  }\n  if (u_hasEdgeEndpointSizes == 0) return u_defaultEdgeEndpointSize;\n  return texelFetch(u_edgeEndpointSizes, ivec2(int(edgeId), 0), 0).xy;\n}\n\nvoid main() {\n  uvec2 endpoints = texelFetch(u_edgeEndpoints, ivec2(int(a_edgeId), 0), 0).xy;\n  uint sourceId = endpoints.x;\n  uint targetId = endpoints.y;\n\n  vec3 sourcePos = fetchNodePos(sourceId);\n  vec3 targetPos = fetchNodePos(targetId);\n  vec3 dir = targetPos - sourcePos;\n  float dirLenWorld = max(length(dir), 1e-5);\n  vec3 dirN = dir / dirLenWorld;\n\n  vec2 endpointSizePair = fetchEdgeEndpointSizePair(a_edgeId, sourceId, targetId);\n  float startRadius = max(u_nodeSizeBase + u_nodeSizeScale * endpointSizePair.x, 0.0) * 0.5;\n  float endRadius = max(u_nodeSizeBase + u_nodeSizeScale * endpointSizePair.y, 0.0) * 0.5;\n  float trimStart = startRadius * u_edgeEndpointTrim;\n  float trimEnd = endRadius * u_edgeEndpointTrim;\n  vec3 startPos = sourcePos + dirN * trimStart;\n  vec3 endPos = targetPos - dirN * trimEnd;\n\n  float segmentMix = clamp(a_corner.x, 0.0, 1.0);\n  vec2 widthPair = fetchEdgeWidthPair(a_edgeId, sourceId, targetId);\n  float rawWidth = mix(widthPair.x, widthPair.y, segmentMix);\n  float width = max(u_edgeWidthBase + u_edgeWidthScale * rawWidth, 0.0);\n\n  vec4 clipStart = u_viewProjection * vec4(startPos, 1.0);\n  vec4 clipEnd = u_viewProjection * vec4(endPos, 1.0);\n  vec2 ndcStart = clipStart.xy / clipStart.w;\n  vec2 ndcEnd = clipEnd.xy / clipEnd.w;\n  vec2 ndcDir = ndcEnd - ndcStart;\n  float dirLen = max(length(ndcDir), 1e-5);\n  vec2 perp = vec2(-ndcDir.y, ndcDir.x) / dirLen;\n  float halfWidth = max(width, 1e-3) * 0.5;\n  vec2 pixelToNdc = vec2(2.0 / max(u_viewport.x, 1.0), 2.0 / max(u_viewport.y, 1.0));\n  vec2 offsetNdc = perp * halfWidth * pixelToNdc;\n  vec4 clipPos = mix(clipStart, clipEnd, segmentMix);\n  clipPos.xy += offsetNdc * a_corner.y * 1.5;\n  gl_Position = clipPos;\n\n  vec4 sourceColor = fetchEdgeColor(a_edgeId, false);\n  vec4 targetColor = fetchEdgeColor(a_edgeId, true);\n  if (u_edgeColorSource == 1) {\n    vec4 nodeSourceColor = fetchNodeColor(sourceId);\n    vec4 nodeTargetColor = fetchNodeColor(targetId);\n    if (u_edgeColorEndpoints == 1) {\n      sourceColor = nodeSourceColor;\n      targetColor = nodeSourceColor;\n    } else if (u_edgeColorEndpoints == 2) {\n      sourceColor = nodeTargetColor;\n      targetColor = nodeTargetColor;\n    } else {\n      sourceColor = nodeSourceColor;\n      targetColor = nodeTargetColor;\n    }\n  }\n  vec4 blendedColor = mix(sourceColor, targetColor, segmentMix);\n  vec2 opacityPair = fetchEdgeOpacityPair(a_edgeId, sourceId, targetId);\n  float rawOpacity = mix(opacityPair.x, opacityPair.y, segmentMix);\n  float opacity = clamp(u_edgeOpacityBase + u_edgeOpacityScale * rawOpacity, 0.0, 1.0);\n  v_color = vec4(blendedColor.rgb, clamp(blendedColor.a * opacity, 0.0, 1.0));\n}\n`;\n\nconst EDGE_FRAGMENT_SOURCE = `#version 300 es\nprecision highp float;\n\nin vec4 v_color;\nout vec4 fragColor;\n\nvoid main() {\n  fragColor = v_color;\n}\n`;\n\nexport class GraphLayerWebGL extends GraphLayer {\n  constructor(options = {}) {\n    super(options);\n    this.device = null;\n    this.gl = null;\n\n    this.nodeProgram = null;\n    this.edgeProgram = null;\n    this.edgeQuadProgram = null;\n    this.nodeVao = null;\n    this.nodeQuadBuffer = null;\n    this.edgeVao = null;\n    this.edgeQuadVao = null;\n    this.edgeQuadBuffer = null;\n    this.nodeIdBuffer = null;\n    this.edgeIdBuffer = null;\n\n    this.nodeTextures = {\n      positions: null,\n      positionsFrom: null,\n      colors: null,\n      sizes: null,\n      states: null,\n      outlineWidths: null,\n      outlineColors: null,\n      edgeColorSource: null,\n      edgeWidthSource: null,\n      edgeOpacitySource: null,\n      edgeEndpointSizeSource: null,\n    };\n    this.edgeTextures = {\n      endpoints: null,\n      colors: null,\n      widths: null,\n      opacities: null,\n      endpointSizes: null,\n      states: null,\n    };\n    this.textureMeta = {\n      nodePositions: null,\n      nodePositionsFrom: null,\n      nodeColors: null,\n      nodeSizes: null,\n      nodeStates: null,\n      nodeOutlineWidths: null,\n      nodeOutlineColors: null,\n      nodeEdgeColors: null,\n      nodeEdgeWidths: null,\n      nodeEdgeOpacities: null,\n      nodeEdgeEndpointSizes: null,\n      edgeEndpoints: null,\n      edgeColors: null,\n      edgeWidths: null,\n      edgeOpacities: null,\n      edgeEndpointSizes: null,\n      edgeStates: null,\n    };\n    this.bufferMeta = {\n      nodeIds: null,\n      edgeIds: null,\n    };\n    this._uploadScratch = new Map();\n\n    this.nodeCount = 0;\n    this.edgeCount = 0;\n    this.warnedWeightedFallback = false;\n\n    this.nodeProgramCache = new Map();\n    this.edgeProgramCache = new Map();\n    this.edgeQuadProgramCache = new Map();\n    this.edgeWeightedProgramCache = new Map();\n    this.edgeWeightedQuadProgramCache = new Map();\n    this.nodeDepthProgramCache = new Map();\n    this.edgeDepthProgramCache = new Map();\n    this.edgeQuadDepthProgramCache = new Map();\n    this._ownedPrograms = new Set();\n\n    this.edgeResolveProgram = null;\n    this.edgeResolveUniformColor = null;\n    this.edgeResolveUniformWeight = null;\n    this.edgeResolveTonemapProgram = null;\n    this.edgeResolveTonemapUniformColor = null;\n    this.edgeResolveTonemapUniformWeight = null;\n    this.edgeResolveBoostProgram = null;\n    this.edgeResolveBoostUniformColor = null;\n    this.edgeResolveBoostUniformWeight = null;\n    this.edgeResolveVAO = null;\n    this.edgeResolveBuffer = null;\n    this.weightedFramebuffer = null;\n    this.weightedColor = null;\n    this.weightedWeight = null;\n    this.weightedDepth = null;\n    this.weightedSize = null;\n    this.weightedSupported = null;\n    this.ambientOcclusion = null;\n  }\n\n  initialize(device, size) {\n    if (device?.type !== 'webgl2') {\n      throw new Error('GraphLayerWebGL requires a WebGL2 device.');\n    }\n    super.initialize(device, size);\n    this.device = device;\n    this.gl = device.gl;\n    this.initializePrograms();\n    this.initializeGeometry();\n    this.initializeTextures();\n    this.ambientOcclusion = new AmbientOcclusionWebGLAlt(device);\n  }\n\n  resize(size) {\n    super.resize(size);\n  }\n\n  destroy() {\n    const { gl } = this;\n    if (!gl) return;\n    for (const program of this._ownedPrograms) {\n      gl.deleteProgram(program);\n    }\n    this._ownedPrograms.clear();\n    this.nodeProgramCache.clear();\n    this.nodeDepthProgramCache.clear();\n    this.edgeProgramCache.clear();\n    this.edgeDepthProgramCache.clear();\n    this.edgeQuadProgramCache.clear();\n    this.edgeQuadDepthProgramCache.clear();\n    this.edgeWeightedProgramCache.clear();\n    this.edgeWeightedQuadProgramCache.clear();\n    if (this.edgeResolveProgram) gl.deleteProgram(this.edgeResolveProgram);\n    if (this.edgeResolveTonemapProgram) gl.deleteProgram(this.edgeResolveTonemapProgram);\n    if (this.edgeResolveBoostProgram) gl.deleteProgram(this.edgeResolveBoostProgram);\n    if (this.edgeResolveVAO) gl.deleteVertexArray(this.edgeResolveVAO);\n    if (this.edgeResolveBuffer) gl.deleteBuffer(this.edgeResolveBuffer);\n    this.destroyWeightedTargets();\n    if (this.nodeVao) gl.deleteVertexArray(this.nodeVao);\n    if (this.nodeQuadBuffer) gl.deleteBuffer(this.nodeQuadBuffer);\n    if (this.edgeVao) gl.deleteVertexArray(this.edgeVao);\n    if (this.edgeQuadVao) gl.deleteVertexArray(this.edgeQuadVao);\n    if (this.edgeQuadBuffer) gl.deleteBuffer(this.edgeQuadBuffer);\n    if (this.nodeIdBuffer) gl.deleteBuffer(this.nodeIdBuffer);\n    if (this.edgeIdBuffer) gl.deleteBuffer(this.edgeIdBuffer);\n    this.ambientOcclusion?.destroy?.();\n    this.ambientOcclusion = null;\n    Object.values(this.nodeTextures).forEach((tex) => tex && gl.deleteTexture(tex));\n    Object.values(this.edgeTextures).forEach((tex) => tex && gl.deleteTexture(tex));\n  }\n\n  initializePrograms() {\n    const { gl } = this;\n    const extColorBufferFloat = gl.getExtension('EXT_color_buffer_float');\n    const extColorBufferHalfFloat = gl.getExtension('EXT_color_buffer_half_float');\n    const extFloatBlend = gl.getExtension('EXT_float_blend');\n    const canDrawMultiple = (gl.getParameter(gl.MAX_COLOR_ATTACHMENTS) ?? 1) >= 2;\n    this.weightedSupported = Boolean(\n      gl.drawBuffers\n      && canDrawMultiple\n      && (extColorBufferFloat || extColorBufferHalfFloat)\n      && extFloatBlend,\n    );\n    this.edgeTransparencyMode = this.normalizeEdgeTransparencyMode(this.edgeTransparencyMode);\n    this.nodeProgramCache.clear();\n    this.nodeDepthProgramCache.clear();\n    this.edgeProgramCache.clear();\n    this.edgeDepthProgramCache.clear();\n    this.edgeQuadProgramCache.clear();\n    this.edgeQuadDepthProgramCache.clear();\n    this.edgeWeightedProgramCache.clear();\n    this.edgeWeightedQuadProgramCache.clear();\n  }\n\n  resolveUniformLocations(program, names) {\n    const out = {};\n    for (const name of names) {\n      out[name] = this.gl.getUniformLocation(program, name);\n    }\n    return out;\n  }\n\n  resolveNodeVariant(visualConfig) {\n    const nodeCfg = visualConfig?.node ?? null;\n    if (!nodeCfg) {\n      return {\n        colorBuffer: true,\n        sizeBuffer: true,\n        outlineWidthBuffer: this.nodeOutlineUseAttributes === true,\n        outlineColorBuffer: this.nodeOutlineUseAttributes === true,\n        shading: this.isNodeShadingEnabled(),\n      };\n    }\n    return {\n      colorBuffer: nodeCfg?.color?.mode !== 'uniform',\n      sizeBuffer: nodeCfg?.size?.mode !== 'uniform',\n      outlineWidthBuffer: nodeCfg?.outline?.mode !== 'uniform',\n      outlineColorBuffer: nodeCfg?.outlineColor?.mode !== 'uniform',\n      shading: this.isNodeShadingEnabled(),\n    };\n  }\n\n  getNodeVariantKey(variant) {\n    return `c:${variant?.colorBuffer ? 'B' : 'U'}|s:${variant?.sizeBuffer ? 'B' : 'U'}|o:${variant?.outlineWidthBuffer ? 'B' : 'U'}|oc:${variant?.outlineColorBuffer ? 'B' : 'U'}|sh:${variant?.shading ? 1 : 0}`;\n  }\n\n  getEdgeVariantKey(variant) {\n    return [\n      `f:${variant?.fastPath ? 1 : 0}`,\n      `cm:${variant?.cameraMode ?? '3d'}`,\n      `sz:${variant?.semanticZoom ? 1 : 0}`,\n      `tr:${variant?.trim ? 1 : 0}`,\n      `wc:${variant?.widthClampToNodeDiameter ? 1 : 0}`,\n      `st:${variant?.edgeState ? 1 : 0}`,\n      `et:${variant?.endpointState ? 1 : 0}`,\n      `ph:${variant?.propagateHoveredNodeToEdges ? 1 : 0}`,\n      `ps:${variant?.propagateSelectedNodesToEdges ? 1 : 0}`,\n      `sh:${variant?.shading ? 1 : 0}`,\n      `c:${variant?.colorBuffer ? 'B' : 'U'}:${variant?.colorSource}:${variant?.colorEndpoints}`,\n      `w:${variant?.widthBuffer ? 'B' : 'U'}:${variant?.widthSource}:${variant?.widthEndpoints}`,\n      `o:${variant?.opacityBuffer ? 'B' : 'U'}:${variant?.opacitySource}:${variant?.opacityEndpoints}`,\n      `es:${variant?.endpointSizeBuffer ? 'B' : 'U'}:${variant?.endpointSizeSource}:${variant?.endpointSizeEndpoints}`,\n    ].join('|');\n  }\n\n  getProgramEntry(cache, key, buildSources, uniformNames) {\n    if (cache.has(key)) return cache.get(key);\n    const sharedCache = this.device?.resourceCache?.webgl;\n    const sharedKey = `graph:webgl:indirect:${key}`;\n    let entry;\n    if (sharedCache) {\n      entry = sharedCache.getOrCreateProgram(sharedKey, () => {\n        const sources = buildSources();\n        const program = this.device.createProgram(sources.vertex, sources.fragment);\n        const uniforms = this.resolveUniformLocations(program, uniformNames);\n        return { program, uniforms };\n      });\n    } else {\n      const sources = buildSources();\n      const program = this.device.createProgram(sources.vertex, sources.fragment);\n      const uniforms = this.resolveUniformLocations(program, uniformNames);\n      entry = { program, uniforms };\n      this._ownedPrograms.add(program);\n    }\n    cache.set(key, entry);\n    return entry;\n  }\n\n  buildIndirectShaderOptions(nodeVariant, edgeVariant) {\n    return {\n      stateSlots: this.stateSlotCount,\n      node: {\n        color: nodeVariant?.colorBuffer ? 'buffer' : 'uniform',\n        size: nodeVariant?.sizeBuffer ? 'buffer' : 'uniform',\n        outline: nodeVariant?.outlineWidthBuffer ? 'buffer' : 'uniform',\n        outlineColor: nodeVariant?.outlineColorBuffer ? 'buffer' : 'uniform',\n        shading: nodeVariant?.shading === true,\n      },\n      edge: {\n        color: {\n          mode: edgeVariant?.colorBuffer ? 'buffer' : 'uniform',\n          source: edgeVariant?.colorSource === 'node' ? 'node' : 'edge',\n          endpoints: edgeVariant?.colorEndpoints ?? 'both',\n        },\n        width: {\n          mode: edgeVariant?.widthBuffer ? 'buffer' : 'uniform',\n          source: edgeVariant?.widthSource === 'node' ? 'node' : 'edge',\n          endpoints: edgeVariant?.widthEndpoints ?? 'both',\n        },\n        opacity: {\n          mode: edgeVariant?.opacityBuffer ? 'buffer' : 'uniform',\n          source: edgeVariant?.opacitySource === 'node' ? 'node' : 'edge',\n          endpoints: edgeVariant?.opacityEndpoints ?? 'both',\n        },\n        endpointSize: {\n          mode: edgeVariant?.endpointSizeBuffer ? 'buffer' : 'uniform',\n          source: edgeVariant?.endpointSizeSource === 'node' ? 'node' : 'edge',\n          endpoints: edgeVariant?.endpointSizeEndpoints ?? 'both',\n        },\n        fastPath: edgeVariant?.fastPath === true,\n        cameraMode: edgeVariant?.cameraMode ?? '3d',\n        semanticZoom: edgeVariant?.semanticZoom === true,\n        trim: edgeVariant?.trim === true,\n        widthClampToNodeDiameter: edgeVariant?.widthClampToNodeDiameter === true,\n        edgeState: edgeVariant?.edgeState === true,\n        endpointState: edgeVariant?.endpointState === true,\n        propagateHoveredNodeToEdges: edgeVariant?.propagateHoveredNodeToEdges === true,\n        propagateSelectedNodesToEdges: edgeVariant?.propagateSelectedNodesToEdges === true,\n        shading: edgeVariant?.shading === true,\n      },\n    };\n  }\n\n  getNodeProgram(nodeVariant) {\n    const key = `node|${this.getNodeVariantKey(nodeVariant)}`;\n    return this.getProgramEntry(\n      this.nodeProgramCache,\n      key,\n      () => {\n        const sources = createGraphWebGLSources(this.buildIndirectShaderOptions(nodeVariant, null));\n        return { vertex: sources.NODE_VERTEX_SOURCE, fragment: sources.NODE_FRAGMENT_SOURCE };\n      },\n      NODE_UNIFORM_NAMES,\n    );\n  }\n\n  getNodeDepthProgram(nodeVariant) {\n    const key = `node-depth|${this.getNodeVariantKey(nodeVariant)}`;\n    return this.getProgramEntry(\n      this.nodeDepthProgramCache,\n      key,\n      () => {\n        const sources = createGraphWebGLSources(this.buildIndirectShaderOptions(nodeVariant, null));\n        return { vertex: sources.NODE_VERTEX_SOURCE, fragment: sources.NODE_DEPTH_FRAGMENT_SOURCE };\n      },\n      NODE_UNIFORM_NAMES,\n    );\n  }\n\n  getEdgeProgram(kind, nodeVariant, edgeVariant, weighted = false) {\n    const suffix = kind === 'quad' ? 'edge-quad' : 'edge-line';\n    const cache = weighted\n      ? (kind === 'quad' ? this.edgeWeightedQuadProgramCache : this.edgeWeightedProgramCache)\n      : (kind === 'quad' ? this.edgeQuadProgramCache : this.edgeProgramCache);\n    const uniformNames = kind === 'quad' ? EDGE_QUAD_UNIFORM_NAMES : EDGE_UNIFORM_NAMES;\n    const key = `${suffix}|${weighted ? 'w' : 'a'}|${this.getNodeVariantKey(nodeVariant)}|${this.getEdgeVariantKey(edgeVariant)}`;\n    return this.getProgramEntry(\n      cache,\n      key,\n      () => {\n        const sources = createGraphWebGLSources(this.buildIndirectShaderOptions(nodeVariant, edgeVariant));\n        return {\n          vertex: kind === 'quad' ? sources.EDGE_QUAD_VERTEX_SOURCE : sources.EDGE_VERTEX_SOURCE,\n          fragment: weighted\n            ? (kind === 'quad' ? sources.EDGE_WEIGHTED_QUAD_FRAGMENT_SOURCE : sources.EDGE_WEIGHTED_FRAGMENT_SOURCE)\n            : sources.EDGE_FRAGMENT_SOURCE,\n        };\n      },\n      uniformNames,\n    );\n  }\n\n  getEdgeDepthProgram(kind, nodeVariant, edgeVariant) {\n    const suffix = kind === 'quad' ? 'edge-quad-depth' : 'edge-line-depth';\n    const cache = kind === 'quad' ? this.edgeQuadDepthProgramCache : this.edgeDepthProgramCache;\n    const uniformNames = kind === 'quad' ? EDGE_QUAD_UNIFORM_NAMES : EDGE_UNIFORM_NAMES;\n    const key = `${suffix}|${this.getNodeVariantKey(nodeVariant)}|${this.getEdgeVariantKey(edgeVariant)}`;\n    return this.getProgramEntry(\n      cache,\n      key,\n      () => {\n        const sources = createGraphWebGLSources(this.buildIndirectShaderOptions(nodeVariant, edgeVariant));\n        return {\n          vertex: kind === 'quad' ? sources.EDGE_QUAD_VERTEX_SOURCE : sources.EDGE_VERTEX_SOURCE,\n          fragment: sources.EDGE_DEPTH_FRAGMENT_SOURCE,\n        };\n      },\n      uniformNames,\n    );\n  }\n\n  applyEdgeBlend(gl, mode) {\n    switch (mode) {\n      case 'additive':\n        gl.blendEquation(gl.FUNC_ADD);\n        gl.blendFunc(gl.SRC_ALPHA, gl.ONE);\n        break;\n      case 'screen':\n        gl.blendEquation(gl.FUNC_ADD);\n        gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR);\n        break;\n      case 'max':\n        gl.blendEquation(gl.MAX);\n        gl.blendFunc(gl.SRC_ALPHA, gl.ONE);\n        break;\n      default:\n        this.applyStandardAlphaBlend(gl);\n        break;\n    }\n  }\n\n  applyStandardAlphaBlend(gl) {\n    gl.blendEquation(gl.FUNC_ADD);\n    gl.blendFuncSeparate?.(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n    if (typeof gl.blendFuncSeparate !== 'function') {\n      gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n    }\n  }\n\n  destroyWeightedTargets() {\n    const { gl } = this;\n    if (!gl) return;\n    if (this.weightedFramebuffer) gl.deleteFramebuffer(this.weightedFramebuffer);\n    if (this.weightedColor) gl.deleteTexture(this.weightedColor);\n    if (this.weightedWeight) gl.deleteTexture(this.weightedWeight);\n    if (this.weightedDepth) gl.deleteRenderbuffer(this.weightedDepth);\n    this.weightedFramebuffer = null;\n    this.weightedColor = null;\n    this.weightedWeight = null;\n    this.weightedDepth = null;\n    this.weightedSize = null;\n    this._activeNodePositionTexture = null;\n    this._activeNodePositionTextureMeta = null;\n  }\n\n  ensureWeightedTargets(width, height) {\n    if (!this.weightedSupported) return false;\n    const { gl } = this;\n    if (!gl) return false;\n    const targetWidth = Math.max(1, Math.floor(width));\n    const targetHeight = Math.max(1, Math.floor(height));\n    if (this.weightedSize && this.weightedSize.width === targetWidth && this.weightedSize.height === targetHeight) {\n      return true;\n    }\n\n    this.destroyWeightedTargets();\n\n    const framebuffer = gl.createFramebuffer();\n    const color = gl.createTexture();\n    const weight = gl.createTexture();\n    const depth = gl.createRenderbuffer();\n\n    gl.bindTexture(gl.TEXTURE_2D, color);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA16F, targetWidth, targetHeight, 0, gl.RGBA, gl.HALF_FLOAT, null);\n\n    gl.bindTexture(gl.TEXTURE_2D, weight);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA16F, targetWidth, targetHeight, 0, gl.RGBA, gl.HALF_FLOAT, null);\n\n    gl.bindRenderbuffer(gl.RENDERBUFFER, depth);\n    gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT24, targetWidth, targetHeight);\n\n    gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, color, 0);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT1, gl.TEXTURE_2D, weight, 0);\n    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, depth);\n    gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1]);\n\n    const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n    if (status !== gl.FRAMEBUFFER_COMPLETE) {\n      console.warn('GraphLayerWebGL: weighted framebuffer incomplete, falling back to alpha.', status);\n      this.destroyWeightedTargets();\n      gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n      return false;\n    }\n\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    gl.bindRenderbuffer(gl.RENDERBUFFER, null);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    this.weightedFramebuffer = framebuffer;\n    this.weightedColor = color;\n    this.weightedWeight = weight;\n    this.weightedDepth = depth;\n    this.weightedSize = { width: targetWidth, height: targetHeight };\n    return true;\n  }\n\n  ensureResolvePrograms() {\n    const { gl } = this;\n    if (!gl) return false;\n    if (this.edgeResolveProgram && this.edgeResolveTonemapProgram && this.edgeResolveBoostProgram) return true;\n\n    const sharedCache = this.device?.resourceCache?.webgl;\n    const getProgram = (cacheKey, vert, frag) => {\n      if (!sharedCache) return this.device.createProgram(vert, frag);\n      const entry = sharedCache.getOrCreateProgram(cacheKey, () => ({ program: this.device.createProgram(vert, frag) }));\n      return entry?.program ?? null;\n    };\n    const sources = createGraphWebGLSources();\n    this.edgeResolveProgram = getProgram(\n      'graph:webgl:indirect:resolve:base',\n      sources.EDGE_RESOLVE_VERTEX_SOURCE,\n      sources.EDGE_RESOLVE_FRAGMENT_SOURCE,\n    );\n    this.edgeResolveTonemapProgram = getProgram(\n      'graph:webgl:indirect:resolve:tonemap',\n      sources.EDGE_RESOLVE_VERTEX_SOURCE,\n      sources.EDGE_RESOLVE_TONEMAP_FRAGMENT_SOURCE,\n    );\n    this.edgeResolveBoostProgram = getProgram(\n      'graph:webgl:indirect:resolve:boost',\n      sources.EDGE_RESOLVE_VERTEX_SOURCE,\n      sources.EDGE_RESOLVE_BOOST_FRAGMENT_SOURCE,\n    );\n    if (!this.edgeResolveProgram || !this.edgeResolveTonemapProgram || !this.edgeResolveBoostProgram) return false;\n    this.edgeResolveUniformColor = gl.getUniformLocation(this.edgeResolveProgram, 'u_colorAccum');\n    this.edgeResolveUniformWeight = gl.getUniformLocation(this.edgeResolveProgram, 'u_weightAccum');\n    this.edgeResolveTonemapUniformColor = gl.getUniformLocation(this.edgeResolveTonemapProgram, 'u_colorAccum');\n    this.edgeResolveTonemapUniformWeight = gl.getUniformLocation(this.edgeResolveTonemapProgram, 'u_weightAccum');\n    this.edgeResolveBoostUniformColor = gl.getUniformLocation(this.edgeResolveBoostProgram, 'u_colorAccum');\n    this.edgeResolveBoostUniformWeight = gl.getUniformLocation(this.edgeResolveBoostProgram, 'u_weightAccum');\n    return true;\n  }\n\n  prepareWeightedWebGL(width, height) {\n    return this.ensureResolvePrograms() && this.ensureWeightedTargets(width, height);\n  }\n\n  initializeGeometry() {\n    const { gl } = this;\n    this.nodeQuadBuffer = gl.createBuffer();\n    this.nodeIdBuffer = gl.createBuffer();\n    this.edgeIdBuffer = gl.createBuffer();\n    this.edgeQuadBuffer = gl.createBuffer();\n\n    const nodeQuad = new Float32Array([\n      -1, -1,\n      1, -1,\n      -1, 1,\n      1, 1,\n    ]);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.nodeQuadBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, nodeQuad, gl.STATIC_DRAW);\n\n    this.nodeVao = gl.createVertexArray();\n    gl.bindVertexArray(this.nodeVao);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.nodeQuadBuffer);\n    gl.enableVertexAttribArray(0);\n    gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 8, 0);\n    gl.vertexAttribDivisor(0, 0);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.nodeIdBuffer);\n    gl.enableVertexAttribArray(1);\n    gl.vertexAttribIPointer(1, 1, gl.UNSIGNED_INT, 4, 0);\n    gl.vertexAttribDivisor(1, 1);\n\n    this.edgeVao = gl.createVertexArray();\n    gl.bindVertexArray(this.edgeVao);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.edgeIdBuffer);\n    gl.enableVertexAttribArray(0);\n    gl.vertexAttribIPointer(0, 1, gl.UNSIGNED_INT, 4, 0);\n    gl.vertexAttribDivisor(0, 1);\n\n    const edgeQuadCorners = new Float32Array([\n      0, 1,\n      0, -1,\n      1, 1,\n      1, -1,\n    ]);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.edgeQuadBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, edgeQuadCorners, gl.STATIC_DRAW);\n\n    this.edgeQuadVao = gl.createVertexArray();\n    gl.bindVertexArray(this.edgeQuadVao);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.edgeQuadBuffer);\n    gl.enableVertexAttribArray(0);\n    gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 8, 0);\n    gl.vertexAttribDivisor(0, 0);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.edgeIdBuffer);\n    gl.enableVertexAttribArray(1);\n    gl.vertexAttribIPointer(1, 1, gl.UNSIGNED_INT, 4, 0);\n    gl.vertexAttribDivisor(1, 1);\n\n    this.edgeResolveBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.edgeResolveBuffer);\n    const resolveQuad = new Float32Array([\n      -1, -1, 0, 0,\n      1, -1, 1, 0,\n      -1, 1, 0, 1,\n      -1, 1, 0, 1,\n      1, -1, 1, 0,\n      1, 1, 1, 1,\n    ]);\n    gl.bufferData(gl.ARRAY_BUFFER, resolveQuad, gl.STATIC_DRAW);\n\n    this.edgeResolveVAO = gl.createVertexArray();\n    gl.bindVertexArray(this.edgeResolveVAO);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.edgeResolveBuffer);\n    gl.enableVertexAttribArray(0);\n    gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 16, 0);\n    gl.enableVertexAttribArray(1);\n    gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 16, 8);\n\n    gl.bindVertexArray(null);\n    gl.bindBuffer(gl.ARRAY_BUFFER, null);\n  }\n\n  createTexture() {\n    const tex = this.gl.createTexture();\n    this.gl.bindTexture(this.gl.TEXTURE_2D, tex);\n    this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.NEAREST);\n    this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.NEAREST);\n    this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);\n    this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);\n    this.gl.bindTexture(this.gl.TEXTURE_2D, null);\n    return tex;\n  }\n\n  initializeTextures() {\n    this.nodeTextures.positions = this.createTexture();\n    this.nodeTextures.positionsFrom = this.createTexture();\n    this.nodeTextures.colors = this.createTexture();\n    this.nodeTextures.sizes = this.createTexture();\n    this.nodeTextures.states = this.createTexture();\n    this.nodeTextures.outlineWidths = this.createTexture();\n    this.nodeTextures.outlineColors = this.createTexture();\n    this.nodeTextures.edgeColorSource = this.createTexture();\n    this.nodeTextures.edgeWidthSource = this.createTexture();\n    this.nodeTextures.edgeOpacitySource = this.createTexture();\n    this.nodeTextures.edgeEndpointSizeSource = this.createTexture();\n    this.edgeTextures.endpoints = this.createTexture();\n    this.edgeTextures.colors = this.createTexture();\n    this.edgeTextures.widths = this.createTexture();\n    this.edgeTextures.opacities = this.createTexture();\n    this.edgeTextures.endpointSizes = this.createTexture();\n    this.edgeTextures.states = this.createTexture();\n  }\n\n  resolveEdgeVariant(visualConfig, options = {}) {\n    const edgeCfg = visualConfig?.edge ?? null;\n    const fastPath = options.fastPath === true || this.isFastEdgeRenderingActive?.() === true;\n    const specialization = this.resolveEdgeSpecialization({\n      fastPath,\n      is2D: options.is2D === true,\n    });\n    const normalize = (entry, fallbackSource = 'edge') => {\n      if (!entry || typeof entry !== 'object') {\n        return {\n          mode: 'buffer',\n          source: fallbackSource,\n          endpoints: 'both',\n          doubleWidth: true,\n          nodeAttribute: null,\n        };\n      }\n      return {\n        mode: entry.mode ?? 'buffer',\n        source: entry.source ?? fallbackSource,\n        endpoints: normalizeEndpoints(entry.endpoints),\n        doubleWidth: entry.doubleWidth !== false,\n        nodeAttribute: entry.nodeAttribute ?? null,\n      };\n    };\n    const color = normalize(edgeCfg?.color, 'edge');\n    const width = normalize(edgeCfg?.width, 'edge');\n    const opacity = normalize(edgeCfg?.opacity, 'edge');\n    const endpointSize = normalize(edgeCfg?.endpointSize, 'edge');\n    if (fastPath) {\n      return {\n        colorBuffer: color.mode !== 'uniform',\n        colorSource: color.source,\n        colorEndpoints: color.endpoints,\n        colorNodeAttribute: color.nodeAttribute,\n        colorDoubleWidth: color.doubleWidth,\n        widthBuffer: false,\n        widthSource: 'edge',\n        widthEndpoints: 'both',\n        widthNodeAttribute: null,\n        widthDoubleWidth: false,\n        opacityBuffer: false,\n        opacitySource: 'edge',\n        opacityEndpoints: 'both',\n        opacityNodeAttribute: null,\n        opacityDoubleWidth: false,\n        endpointSizeBuffer: false,\n        endpointSizeSource: 'edge',\n        endpointSizeEndpoints: 'both',\n        endpointSizeNodeAttribute: null,\n        endpointSizeDoubleWidth: false,\n        shading: false,\n        cameraMode: specialization.cameraMode,\n        semanticZoom: specialization.semanticZoom,\n        trim: specialization.trim,\n        widthClampToNodeDiameter: specialization.widthClampToNodeDiameter,\n        edgeState: specialization.edgeState,\n        endpointState: specialization.endpointState,\n        propagateHoveredNodeToEdges: specialization.propagateHoveredNodeToEdges,\n        propagateSelectedNodesToEdges: specialization.propagateSelectedNodesToEdges,\n        fastPath: true,\n      };\n    }\n    return {\n      colorBuffer: color.mode !== 'uniform',\n      colorSource: color.source,\n      colorEndpoints: color.endpoints,\n      colorNodeAttribute: color.nodeAttribute,\n      colorDoubleWidth: color.doubleWidth,\n      widthBuffer: width.mode !== 'uniform',\n      widthSource: width.source,\n      widthEndpoints: width.endpoints,\n      widthNodeAttribute: width.nodeAttribute,\n      widthDoubleWidth: width.doubleWidth,\n      opacityBuffer: opacity.mode !== 'uniform',\n      opacitySource: opacity.source,\n      opacityEndpoints: opacity.endpoints,\n      opacityNodeAttribute: opacity.nodeAttribute,\n      opacityDoubleWidth: opacity.doubleWidth,\n      endpointSizeBuffer: (specialization.trim || specialization.widthClampToNodeDiameter) && endpointSize.mode !== 'uniform',\n      endpointSizeSource: endpointSize.source,\n      endpointSizeEndpoints: endpointSize.endpoints,\n      endpointSizeNodeAttribute: endpointSize.nodeAttribute,\n      endpointSizeDoubleWidth: endpointSize.doubleWidth,\n      shading: this.isEdgeShadingEnabled(),\n      cameraMode: specialization.cameraMode,\n      semanticZoom: specialization.semanticZoom,\n      trim: specialization.trim,\n      widthClampToNodeDiameter: specialization.widthClampToNodeDiameter,\n      edgeState: specialization.edgeState,\n      endpointState: specialization.endpointState,\n      propagateHoveredNodeToEdges: specialization.propagateHoveredNodeToEdges,\n      propagateSelectedNodesToEdges: specialization.propagateSelectedNodesToEdges,\n      fastPath: false,\n    };\n  }\n\n  withSparseGraph(network, topologyVersions, indices, edgeNodeAttributes, fn) {\n    if (!network) return fn(null);\n    if (typeof network.withBufferAccess !== 'function') {\n      console.warn('GraphLayerWebGL: network does not support buffer access sessions');\n      return false;\n    }\n    const hasNodeAttribute = (name) => (\n      Boolean(name) && (network._nodeAttributes?.has?.(name) ?? false)\n    );\n    const hasEdgeAttribute = (name) => (\n      Boolean(name) && (network._edgeAttributes?.has?.(name) ?? false)\n    );\n    return network.withBufferAccess(() => {\n      const nodeIndices = indices?.node ?? network.nodeIndices ?? null;\n      const edgeIndices = indices?.edge ?? network.edgeIndices ?? null;\n      const nodeIndexDirtyRange = typeof network.getActiveIndexDirtyRange === 'function'\n        ? network.getActiveIndexDirtyRange('node')\n        : null;\n      const edgeIndexDirtyRange = typeof network.getActiveIndexDirtyRange === 'function'\n        ? network.getActiveIndexDirtyRange('edge')\n        : null;\n      const safeGet = (scope, name) => {\n        if (!name) return null;\n        if (scope === 'node' && !hasNodeAttribute(name)) return null;\n        if (scope === 'edge' && !hasEdgeAttribute(name)) return null;\n        const getter = scope === 'node' ? network.getNodeAttributeBuffer : network.getEdgeAttributeBuffer;\n        if (typeof getter !== 'function') return null;\n        return getter.call(network, name);\n      };\n\n      const nodePositions = safeGet('node', NODE_POSITION_ATTRIBUTE);\n      const nodeColors = safeGet('node', NODE_COLOR_ATTRIBUTE);\n      const nodeSizes = safeGet('node', NODE_SIZE_ATTRIBUTE);\n      const nodeStates = safeGet('node', NODE_STATE_ATTRIBUTE);\n      const nodeOutlineWidths = safeGet('node', NODE_OUTLINE_WIDTH_ATTRIBUTE);\n      const nodeOutlineColors = safeGet('node', NODE_OUTLINE_COLOR_ATTRIBUTE);\n      const edgeColors = safeGet('edge', EDGE_COLOR_ATTRIBUTE);\n      const edgeWidths = safeGet('edge', EDGE_WIDTH_ATTRIBUTE);\n      const edgeOpacities = safeGet('edge', EDGE_OPACITY_ATTRIBUTE);\n      const edgeEndpointSizes = safeGet('edge', EDGE_ENDPOINTS_SIZE_ATTRIBUTE);\n      const edgeStates = safeGet('edge', EDGE_STATE_ATTRIBUTE);\n\n      const edgeNodeColor = edgeNodeAttributes?.color ? safeGet('node', edgeNodeAttributes.color) : null;\n      const edgeNodeWidth = edgeNodeAttributes?.width ? safeGet('node', edgeNodeAttributes.width) : null;\n      const edgeNodeOpacity = edgeNodeAttributes?.opacity ? safeGet('node', edgeNodeAttributes.opacity) : null;\n      const edgeNodeEndpointSize = edgeNodeAttributes?.endpointSize\n        ? safeGet('node', edgeNodeAttributes.endpointSize)\n        : null;\n      const positionOverride = this.resolvePositionSourceOverride(network, {\n        backend: 'webgl',\n        gl: this.gl,\n        device: this.device,\n      });\n      const resolvedNodePositions = positionOverride?.view ?? nodePositions?.view ?? null;\n      const resolvedNodePositionVersion = Number.isFinite(positionOverride?.version)\n        ? Number(positionOverride.version)\n        : (nodePositions?.version ?? 0);\n      const resolvedNodePositionTexture = positionOverride?.webglTexture ?? null;\n      const resolvedNodePositionTextureVersion = Number.isFinite(positionOverride?.webglTextureVersion)\n        ? Number(positionOverride.webglTextureVersion)\n        : resolvedNodePositionVersion;\n      const resolvedNodePositionTextureCount = Number.isFinite(positionOverride?.webglTextureCount)\n        ? Math.max(0, Math.floor(Number(positionOverride.webglTextureCount)))\n        : Math.floor((resolvedNodePositions?.length ?? 0) / 3);\n      const resolvedNodePositionTextureMeta = positionOverride?.webglTextureMeta ?? null;\n\n      const nodes = {\n        positions: resolvedNodePositions,\n        colors: nodeColors?.view ?? null,\n        sizes: nodeSizes?.view ?? null,\n        states: nodeStates?.view ?? null,\n        outlineWidths: nodeOutlineWidths?.view ?? null,\n        outlineColors: nodeOutlineColors?.view ?? null,\n        positionTexture: resolvedNodePositionTexture,\n        positionTextureVersion: resolvedNodePositionTextureVersion,\n        positionTextureCount: resolvedNodePositionTextureCount,\n        positionTextureMeta: resolvedNodePositionTextureMeta,\n        indices: nodeIndices,\n        indexDirtyRange: nodeIndexDirtyRange,\n        count: nodeIndices?.length ?? 0,\n        versions: {\n          positions: resolvedNodePositionVersion,\n          colors: nodeColors?.version ?? 0,\n          sizes: nodeSizes?.version ?? 0,\n          states: nodeStates?.version ?? 0,\n          outlineWidths: nodeOutlineWidths?.version ?? 0,\n          outlineColors: nodeOutlineColors?.version ?? 0,\n          indices: nodeIndices?.version ?? topologyVersions?.node ?? 0,\n          topology: topologyVersions?.node ?? 0,\n        },\n      };\n\n      const edges = {\n        endpoints: network.edgesView ?? null,\n        colors: edgeColors?.view ?? null,\n        widths: edgeWidths?.view ?? null,\n        opacities: edgeOpacities?.view ?? null,\n        endpointSizes: edgeEndpointSizes?.view ?? null,\n        states: edgeStates?.view ?? null,\n        indices: edgeIndices,\n        indexDirtyRange: edgeIndexDirtyRange,\n        count: edgeIndices?.length ?? 0,\n        versions: {\n          endpoints: topologyVersions?.edge ?? 0,\n          colors: edgeColors?.version ?? 0,\n          widths: edgeWidths?.version ?? 0,\n          opacities: edgeOpacities?.version ?? 0,\n          endpointSizes: edgeEndpointSizes?.version ?? 0,\n          states: edgeStates?.version ?? 0,\n          indices: edgeIndices?.version ?? topologyVersions?.edge ?? 0,\n          topology: topologyVersions?.edge ?? 0,\n        },\n      };\n\n      const nodeEdgeSources = {\n        color: edgeNodeColor?.view\n          ? {\n            attribute: edgeNodeAttributes.color,\n            view: edgeNodeColor.view,\n            version: edgeNodeColor.version ?? 0,\n          }\n          : null,\n        width: edgeNodeWidth?.view\n          ? {\n            attribute: edgeNodeAttributes.width,\n            view: edgeNodeWidth.view,\n            version: edgeNodeWidth.version ?? 0,\n          }\n          : null,\n        opacity: edgeNodeOpacity?.view\n          ? {\n            attribute: edgeNodeAttributes.opacity,\n            view: edgeNodeOpacity.view,\n            version: edgeNodeOpacity.version ?? 0,\n          }\n          : null,\n        endpointSize: edgeNodeEndpointSize?.view\n          ? {\n            attribute: edgeNodeAttributes.endpointSize,\n            view: edgeNodeEndpointSize.view,\n            version: edgeNodeEndpointSize.version ?? 0,\n          }\n          : null,\n      };\n\n      return fn({ nodes, edges, nodeEdgeSources });\n    });\n  }\n\n  getTextureLayout(count) {\n    const max = this.gl.getParameter(this.gl.MAX_TEXTURE_SIZE) ?? 16384;\n    const safeCount = Math.max(1, Math.floor(Number(count) || 0));\n    const width = Math.min(max, safeCount);\n    const height = Math.ceil(safeCount / width);\n    if (height > max) {\n      throw new Error(\n        `WebGL2 indirect requires texture dimensions <= MAX_TEXTURE_SIZE (${max}), `\n        + `got ${safeCount} texels -> ${width}x${height}.`,\n      );\n    }\n    return { width, height };\n  }\n\n  uploadTexture2D(texture, view, components, count, formatInfo, type) {\n    const { gl } = this;\n    const { width, height } = this.getTextureLayout(count);\n    const valueCount = width * height * components;\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n    gl.pixelStorei(gl.UNPACK_ROW_LENGTH, 0);\n    const directView = (view.length === valueCount) ? view : this._packTextureUpload(view, valueCount);\n    gl.texImage2D(\n      gl.TEXTURE_2D,\n      0,\n      formatInfo.internalFormat,\n      width,\n      height,\n      0,\n      formatInfo.format,\n      type,\n      directView,\n    );\n  }\n\n  _packTextureUpload(view, valueCount) {\n    const ctor = typeof view?.constructor === 'function' ? view.constructor : Float32Array;\n    const key = ctor.name || 'TypedArray';\n    let scratch = this._uploadScratch.get(key) ?? null;\n    if (!(scratch instanceof ctor) || scratch.length < valueCount) {\n      scratch = new ctor(valueCount);\n      this._uploadScratch.set(key, scratch);\n    }\n    scratch.fill(0, 0, valueCount);\n    if (view && typeof view.subarray === 'function' && view.length > 0) {\n      scratch.set(view.subarray(0, Math.min(view.length, valueCount)), 0);\n    }\n    return scratch.length === valueCount ? scratch : scratch.subarray(0, valueCount);\n  }\n\n  isSameView(meta, view, version, count) {\n    return Boolean(\n      meta\n      && meta.version === (version ?? 0)\n      && meta.count === count\n      && meta.buffer === view?.buffer\n      && meta.byteOffset === (view?.byteOffset ?? 0)\n      && meta.byteLength === (view?.byteLength ?? 0),\n    );\n  }\n\n  rememberView(slot, view, version, count) {\n    this.textureMeta[slot] = {\n      version: version ?? 0,\n      count,\n      buffer: view?.buffer ?? null,\n      byteOffset: view?.byteOffset ?? 0,\n      byteLength: view?.byteLength ?? 0,\n    };\n  }\n\n  uploadFloatTexture(slot, texture, view, components, count, version) {\n    if (!view || !texture || !count) return false;\n    if (this.isSameView(this.textureMeta[slot], view, version, count)) return true;\n    const { gl } = this;\n    const formatInfo = components === 1\n      ? { internalFormat: gl.R32F, format: gl.RED }\n      : (components === 2\n        ? { internalFormat: gl.RG32F, format: gl.RG }\n        : (components === 3\n          ? { internalFormat: gl.RGB32F, format: gl.RGB }\n          : { internalFormat: gl.RGBA32F, format: gl.RGBA }));\n    this.uploadTexture2D(texture, view, components, count, formatInfo, gl.FLOAT);\n    this.rememberView(slot, view, version, count);\n    return true;\n  }\n\n  uploadUintTexture(slot, texture, view, components, count, version) {\n    if (!view || !texture || !count) return false;\n    if (this.isSameView(this.textureMeta[slot], view, version, count)) return true;\n    const { gl } = this;\n    const formatInfo = components === 2\n      ? { internalFormat: gl.RG32UI, format: gl.RG_INTEGER }\n      : { internalFormat: gl.R32UI, format: gl.RED_INTEGER };\n    this.uploadTexture2D(texture, view, components, count, formatInfo, gl.UNSIGNED_INT);\n    this.rememberView(slot, view, version, count);\n    return true;\n  }\n\n  uploadIdBuffer(slot, buffer, view, version, count, dirtyRange = null) {\n    if (!view || !buffer) return 0;\n    const meta = this.bufferMeta[slot];\n    const same = Boolean(\n      meta\n      && meta.version === (version ?? 0)\n      && meta.count === count\n      && meta.buffer === view.buffer\n      && meta.byteOffset === view.byteOffset\n      && meta.byteLength === view.byteLength,\n    );\n    if (!same) {\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, buffer);\n      const canSubData = Boolean(\n        dirtyRange\n        && meta\n        && meta.count === count\n        && meta.buffer === view.buffer\n        && meta.byteOffset === view.byteOffset\n        && meta.byteLength === view.byteLength\n        && Number.isFinite(Number(dirtyRange.start))\n        && Number.isFinite(Number(dirtyRange.count))\n        && Number(dirtyRange.count) > 0\n      );\n      if (canSubData) {\n        const start = Math.max(0, Math.floor(Number(dirtyRange.start)));\n        const dirtyCount = Math.max(0, Math.floor(Number(dirtyRange.count)));\n        const end = Math.min(view.length ?? 0, start + dirtyCount);\n        if (end > start) {\n          this.gl.bufferSubData(\n            this.gl.ARRAY_BUFFER,\n            start * (view.BYTES_PER_ELEMENT || Uint32Array.BYTES_PER_ELEMENT),\n            view.subarray(start, end),\n          );\n        } else {\n          this.gl.bufferData(this.gl.ARRAY_BUFFER, view, this.gl.DYNAMIC_DRAW);\n        }\n      } else {\n        this.gl.bufferData(this.gl.ARRAY_BUFFER, view, this.gl.DYNAMIC_DRAW);\n      }\n      this.bufferMeta[slot] = {\n        version: version ?? 0,\n        count,\n        buffer: view.buffer,\n        byteOffset: view.byteOffset,\n        byteLength: view.byteLength,\n      };\n    }\n    return count;\n  }\n\n  bindTexture(unit, texture) {\n    this.gl.activeTexture(this.gl.TEXTURE0 + unit);\n    this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n  }\n\n  getSharedSparseResources() {\n    const nodePositionsTexture = this._activeNodePositionTexture ?? this.nodeTextures.positions ?? null;\n    const nodePositionsMeta = this._activeNodePositionTextureMeta ?? this.textureMeta.nodePositions ?? null;\n    return {\n      textures: {\n        nodePositions: nodePositionsTexture,\n        nodePositionsFrom: this.nodeTextures.positionsFrom ?? null,\n        nodeSizes: this.nodeTextures.sizes ?? null,\n        nodeOutlineWidths: this.nodeTextures.outlineWidths ?? null,\n        nodeWidthSource: this.nodeTextures.edgeWidthSource ?? null,\n        nodeEndpointSizeSource: this.nodeTextures.edgeEndpointSizeSource ?? null,\n        edgeEndpoints: this.edgeTextures.endpoints ?? null,\n        edgeWidths: this.edgeTextures.widths ?? null,\n        edgeEndpointSizes: this.edgeTextures.endpointSizes ?? null,\n      },\n      textureMeta: {\n        nodePositions: nodePositionsMeta,\n        nodePositionsFrom: this.textureMeta.nodePositionsFrom ?? null,\n        nodeSizes: this.textureMeta.nodeSizes ?? null,\n        nodeOutlineWidths: this.textureMeta.nodeOutlineWidths ?? null,\n        nodeEdgeWidths: this.textureMeta.nodeEdgeWidths ?? null,\n        nodeEdgeEndpointSizes: this.textureMeta.nodeEdgeEndpointSizes ?? null,\n        edgeEndpoints: this.textureMeta.edgeEndpoints ?? null,\n        edgeWidths: this.textureMeta.edgeWidths ?? null,\n        edgeEndpointSizes: this.textureMeta.edgeEndpointSizes ?? null,\n      },\n    };\n  }\n\n  render(context, frame) {\n    if (!context || context.type !== 'webgl2') return;\n    const network = frame?.network;\n    if (!network) return;\n    const cameraUniforms = this.getCameraUniforms(frame?.camera, context);\n    if (!cameraUniforms) return;\n    const is2D = cameraUniforms.mode === '2d';\n    const zoom2D = is2D ? Math.max(1e-3, cameraUniforms.view?.[0] ?? 1) : 1;\n    const semanticZoomExponent = Number.isFinite(this.semanticZoomExponent) ? this.semanticZoomExponent : 0;\n\n    let topologyVersions = { node: 0, edge: 0 };\n    if (typeof network.getTopologyVersions === 'function') {\n      try {\n        topologyVersions = network.getTopologyVersions() ?? topologyVersions;\n      } catch (_) {\n        warnOnce(\n          this,\n          'render-topology-versions',\n          'GraphLayerWebGL: failed to read topology versions during render; using zero versions.',\n          { network },\n        );\n        topologyVersions = { node: 0, edge: 0 };\n      }\n    }\n    debugWebGLRender('graph:render:start', {\n      target: context.target\n        ? {\n          width: context.target.width ?? null,\n          height: context.target.height ?? null,\n          hasHandle: Boolean(context.target.handle),\n        }\n        : null,\n      viewport: context.viewport ?? null,\n      topologyVersions,\n      drawingBuffer: this.gl\n        ? {\n          width: this.gl.drawingBufferWidth,\n          height: this.gl.drawingBufferHeight,\n        }\n        : null,\n    });\n    const schema = GraphVisualSchema.fromNetwork(network, {\n      nodeOutlineUseAttributes: this.nodeOutlineUseAttributes === true,\n    });\n    const visualConfig = schema?.visualConfig ?? null;\n    const nodeVariant = this.resolveNodeVariant(visualConfig);\n    const nodeConfig = visualConfig?.node ?? null;\n    const edgeConfig = visualConfig?.edge ?? null;\n    const fastEdges = this.isFastEdgeRenderingActive?.() === true;\n    const edgeRenderingMode = this.getEffectiveEdgeRenderingMode?.() ?? this.edgeRenderingMode;\n    const edgeVariant = this.resolveEdgeVariant(visualConfig, { fastPath: fastEdges, is2D });\n    const nodeProgramEntry = this.getNodeProgram(nodeVariant);\n    const nodeDepthProgramEntry = this.getNodeDepthProgram(nodeVariant);\n    const edgeLineProgramEntry = this.getEdgeProgram('line', nodeVariant, edgeVariant);\n    const edgeLineDepthProgramEntry = this.getEdgeDepthProgram('line', nodeVariant, edgeVariant);\n    const edgeQuadProgramEntry = this.getEdgeProgram('quad', nodeVariant, edgeVariant);\n    const edgeQuadDepthProgramEntry = this.getEdgeDepthProgram('quad', nodeVariant, edgeVariant);\n    const edgeLineWeightedProgramEntry = this.getEdgeProgram('line', nodeVariant, edgeVariant, true);\n    const edgeQuadWeightedProgramEntry = this.getEdgeProgram('quad', nodeVariant, edgeVariant, true);\n    const nodeColorBufferEnabled = nodeVariant ? nodeVariant.colorBuffer !== false : true;\n    const nodeSizeBufferEnabled = nodeVariant ? nodeVariant.sizeBuffer !== false : true;\n    const nodeOutlineBufferEnabled = nodeVariant ? nodeVariant.outlineWidthBuffer === true : false;\n    const nodeOutlineColorBufferEnabled = nodeVariant ? nodeVariant.outlineColorBuffer === true : false;\n\n    const nodeDefaultColor = (nodeConfig?.color?.mode === 'uniform')\n      ? toRgba(nodeConfig?.color?.value, DEFAULT_NODE_COLOR)\n      : toRgba(DEFAULT_NODE_COLOR, DEFAULT_NODE_COLOR);\n    const nodeDefaultSize = (nodeConfig?.size?.mode === 'uniform')\n      ? toNumber(nodeConfig?.size?.value, DEFAULT_NODE_SIZE)\n      : DEFAULT_NODE_SIZE;\n    const nodeDefaultOutline = (nodeConfig?.outline?.mode === 'uniform')\n      ? toNumber(nodeConfig?.outline?.value, 0)\n      : 0;\n    const nodeDefaultOutlineColor = (nodeConfig?.outlineColor?.mode === 'uniform')\n      ? toRgba(nodeConfig?.outlineColor?.value, this.nodeOutlineColor)\n      : toRgba(this.nodeOutlineColor, this.nodeOutlineColor);\n\n    const defaultEdgeColorPair = (edgeConfig?.color?.mode === 'uniform')\n      ? toColorPair(edgeConfig?.color?.value, [DEFAULT_EDGE_COLOR, DEFAULT_EDGE_COLOR])\n      : [toRgba(DEFAULT_EDGE_COLOR, DEFAULT_EDGE_COLOR), toRgba(DEFAULT_EDGE_COLOR, DEFAULT_EDGE_COLOR)];\n    const defaultEdgeWidth = (edgeConfig?.width?.mode === 'uniform')\n      ? toScalarPair(edgeConfig?.width?.value, [DEFAULT_EDGE_WIDTH, DEFAULT_EDGE_WIDTH])\n      : [DEFAULT_EDGE_WIDTH, DEFAULT_EDGE_WIDTH];\n    const defaultEdgeOpacity = (edgeConfig?.opacity?.mode === 'uniform')\n      ? toScalarPair(edgeConfig?.opacity?.value, [DEFAULT_EDGE_OPACITY, DEFAULT_EDGE_OPACITY])\n      : [DEFAULT_EDGE_OPACITY, DEFAULT_EDGE_OPACITY];\n    const defaultEdgeEndpointSize = (edgeConfig?.endpointSize?.mode === 'uniform')\n      ? toScalarPair(edgeConfig?.endpointSize?.value, [1, 1])\n      : [1, 1];\n    const shadedLightDirection = Array.isArray(this.shadedLightDirection) || ArrayBuffer.isView(this.shadedLightDirection)\n      ? this.shadedLightDirection\n      : SHADED_LIGHT_DIRECTION_DEFAULT;\n    const shadedLightColor = toRgba(this.shadedLightColor, SHADED_LIGHT_COLOR_DEFAULT);\n    const shadedAmbientTopColor = toRgba(this.shadedAmbientTopColor, SHADED_AMBIENT_TOP_COLOR_DEFAULT);\n    const shadedAmbientBottomColor = toRgba(this.shadedAmbientBottomColor, SHADED_AMBIENT_BOTTOM_COLOR_DEFAULT);\n    const shadedSpecularColor = toRgba(this.shadedSpecularColor, SHADED_SPECULAR_COLOR_DEFAULT);\n    const shadedDiffuseStrength = Number.isFinite(Number(this.shadedDiffuseStrength))\n      ? Math.max(0, Number(this.shadedDiffuseStrength))\n      : SHADED_DIFFUSE_STRENGTH_DEFAULT;\n    const shadedAmbientStrength = Number.isFinite(Number(this.shadedAmbientStrength))\n      ? Math.max(0, Number(this.shadedAmbientStrength))\n      : SHADED_AMBIENT_STRENGTH_DEFAULT;\n    const shadedSpecularStrength = Number.isFinite(Number(this.shadedSpecularStrength))\n      ? Math.max(0, Number(this.shadedSpecularStrength))\n      : SHADED_SPECULAR_STRENGTH_DEFAULT;\n    const shadedShininess = Number.isFinite(Number(this.shadedShininess))\n      ? Math.max(1, Number(this.shadedShininess))\n      : SHADED_SHININESS_DEFAULT;\n    const edgeNodeAttributes = {\n      color: edgeVariant?.colorSource === 'node'\n        ? (edgeVariant.colorNodeAttribute ?? NODE_COLOR_ATTRIBUTE)\n        : null,\n      width: edgeVariant?.widthSource === 'node'\n        ? (edgeVariant.widthNodeAttribute ?? NODE_SIZE_ATTRIBUTE)\n        : null,\n      opacity: edgeVariant?.opacitySource === 'node'\n        ? (edgeVariant.opacityNodeAttribute ?? NODE_SIZE_ATTRIBUTE)\n        : null,\n      endpointSize: edgeVariant?.endpointSizeSource === 'node'\n        ? (edgeVariant.endpointSizeNodeAttribute ?? NODE_SIZE_ATTRIBUTE)\n        : null,\n    };\n    const customEdgeNodeAttributes = {\n      color: edgeNodeAttributes.color && edgeNodeAttributes.color !== NODE_COLOR_ATTRIBUTE\n        ? edgeNodeAttributes.color\n        : null,\n      width: edgeNodeAttributes.width && edgeNodeAttributes.width !== NODE_SIZE_ATTRIBUTE\n        ? edgeNodeAttributes.width\n        : null,\n      opacity: edgeNodeAttributes.opacity && edgeNodeAttributes.opacity !== NODE_SIZE_ATTRIBUTE\n        ? edgeNodeAttributes.opacity\n        : null,\n      endpointSize: edgeNodeAttributes.endpointSize && edgeNodeAttributes.endpointSize !== NODE_SIZE_ATTRIBUTE\n        ? edgeNodeAttributes.endpointSize\n        : null,\n    };\n    const usesDefaultNodeColor = Boolean(edgeNodeAttributes.color && edgeNodeAttributes.color === NODE_COLOR_ATTRIBUTE);\n    const usesDefaultNodeSize = Boolean(\n      (edgeNodeAttributes.width && edgeNodeAttributes.width === NODE_SIZE_ATTRIBUTE)\n      || (edgeNodeAttributes.opacity && edgeNodeAttributes.opacity === NODE_SIZE_ATTRIBUTE)\n      || (edgeNodeAttributes.endpointSize && edgeNodeAttributes.endpointSize === NODE_SIZE_ATTRIBUTE),\n    );\n    const defaultNodeSourceScalar = toNumber(nodeDefaultSize, DEFAULT_NODE_SIZE);\n    const defaultNodeWidth = usesDefaultNodeSize\n      ? [defaultNodeSourceScalar, defaultNodeSourceScalar]\n      : defaultEdgeWidth;\n    const defaultNodeOpacity = usesDefaultNodeSize\n      ? [defaultNodeSourceScalar, defaultNodeSourceScalar]\n      : defaultEdgeOpacity;\n    const defaultNodeEndpointSize = usesDefaultNodeSize\n      ? [defaultNodeSourceScalar, defaultNodeSourceScalar]\n      : defaultEdgeEndpointSize;\n\n    this.withSparseGraph(\n      network,\n      topologyVersions,\n      null,\n      customEdgeNodeAttributes,\n      (geometry) => {\n        if (!geometry) return false;\n        const { gl } = this;\n        const nodes = geometry.nodes;\n        const edges = geometry.edges;\n        debugWebGLRender('graph:render:geometry', {\n          nodes: {\n            count: nodes.count,\n            indices: nodes.indices?.length ?? 0,\n            positions: nodes.positions?.length ?? 0,\n            colors: nodes.colors?.length ?? 0,\n            sizes: nodes.sizes?.length ?? 0,\n            states: nodes.states?.length ?? 0,\n            positionTexture: Boolean(nodes.positionTexture),\n          },\n          edges: {\n            count: edges.count,\n            indices: edges.indices?.length ?? 0,\n            colors: edges.colors?.length ?? 0,\n            widths: edges.widths?.length ?? 0,\n            opacities: edges.opacities?.length ?? 0,\n            endpointSizes: edges.endpointSizes?.length ?? 0,\n            states: edges.states?.length ?? 0,\n          },\n          nodeEdgeSources: {\n            color: Boolean(geometry.nodeEdgeSources?.color?.view),\n            width: Boolean(geometry.nodeEdgeSources?.width?.view),\n            opacity: Boolean(geometry.nodeEdgeSources?.opacity?.view),\n            endpointSize: Boolean(geometry.nodeEdgeSources?.endpointSize?.view),\n          },\n        });\n        const hasNodeColorsForNodes = Boolean(nodeColorBufferEnabled && nodes.colors);\n        const hasNodeSizesForNodes = Boolean(nodeSizeBufferEnabled && nodes.sizes);\n        const hasNodeStatesForNodes = Boolean(nodes.states);\n        const hasNodeOutlineWidthsForNodes = Boolean(nodeOutlineBufferEnabled && nodes.outlineWidths);\n        const hasNodeOutlineColorsForNodes = Boolean(nodeOutlineColorBufferEnabled && nodes.outlineColors);\n        const hasNodeColorsForEdges = Boolean(nodes.colors);\n        const hasNodeSizesForEdges = Boolean(nodes.sizes);\n        const nodeColorSource = geometry.nodeEdgeSources?.color?.view\n          ?? (usesDefaultNodeColor ? (hasNodeColorsForEdges ? nodes.colors : null) : null);\n        const nodeWidthSource = geometry.nodeEdgeSources?.width?.view\n          ?? (usesDefaultNodeSize ? (hasNodeSizesForEdges ? nodes.sizes : null) : null);\n        const nodeOpacitySource = geometry.nodeEdgeSources?.opacity?.view\n          ?? (usesDefaultNodeSize ? (hasNodeSizesForEdges ? nodes.sizes : null) : null);\n        const nodeEndpointSizeSource = geometry.nodeEdgeSources?.endpointSize?.view\n          ?? (usesDefaultNodeSize ? (hasNodeSizesForEdges ? nodes.sizes : null) : null);\n        const mapEndpointMode = (value) => (value === 'source' ? 1 : (value === 'destination' ? 2 : 0));\n        const interpolationState = this.getPositionInterpolationState?.() ?? this.positionInterpolation ?? null;\n        const interpolationEnabled = interpolationState?.enabled === true;\n        const interpolationFactor = clamp01(interpolationState?.factor, 1);\n        const interpolationSourceView = interpolationState?.sourceView ?? null;\n        const interpolationSourceVersion = Number.isFinite(interpolationState?.sourceVersion)\n          ? Number(interpolationState.sourceVersion)\n          : 0;\n        const interpolationSourceCount = Number.isFinite(interpolationState?.sourceCount)\n          ? Math.max(0, Math.floor(Number(interpolationState.sourceCount)))\n          : Math.floor((interpolationSourceView?.length ?? 0) / 3);\n        const delegateNodePositionTexture = nodes.positionTexture ?? null;\n        const delegateNodeTextureMeta = delegateNodePositionTexture\n          ? {\n            version: nodes.positionTextureVersion ?? nodes.versions?.positions ?? 0,\n            count: nodes.positionTextureCount ?? Math.floor((nodes.positions?.length ?? 0) / 3),\n            buffer: delegateNodePositionTexture,\n            byteOffset: 0,\n            byteLength: 0,\n          }\n          : null;\n        const activeNodePositionTexture = delegateNodePositionTexture ?? this.nodeTextures.positions ?? null;\n        const activeNodePositionMeta = delegateNodeTextureMeta ?? this.textureMeta.nodePositions ?? null;\n        const interpolationSourceTexture = interpolationState?.sourceWebGLTexture ?? null;\n        const interpolationSourceTextureMeta = interpolationState?.sourceTextureMeta ?? null;\n        const activeNodePositionFromTexture = interpolationSourceTexture ?? this.nodeTextures.positionsFrom ?? null;\n        const resolvedNodePositionFromTexture = interpolationEnabled\n          ? (activeNodePositionFromTexture ?? activeNodePositionTexture)\n          : activeNodePositionTexture;\n        this._activeNodePositionTexture = activeNodePositionTexture;\n        this._activeNodePositionTextureMeta = activeNodePositionMeta;\n\n        this.nodeCount = this.uploadIdBuffer(\n          'nodeIds',\n          this.nodeIdBuffer,\n          nodes.indices,\n          nodes.versions?.indices,\n          nodes.count,\n          nodes.indexDirtyRange,\n        );\n        this.edgeCount = this.uploadIdBuffer(\n          'edgeIds',\n          this.edgeIdBuffer,\n          edges.indices,\n          edges.versions?.indices,\n          edges.count,\n          edges.indexDirtyRange,\n        );\n\n        if (this.nodeCount > 0) {\n          if (!activeNodePositionTexture) {\n            throw new Error('WebGL2 indirect rendering requires a node position texture.');\n          }\n          if (!delegateNodePositionTexture && !nodes.positions) {\n            throw new Error('WebGL2 indirect rendering requires node position values.');\n          }\n          if (!delegateNodePositionTexture && nodes.positions) {\n            const positionCount = Math.floor((nodes.positions.length ?? 0) / 3);\n            this.uploadFloatTexture(\n              'nodePositions',\n              this.nodeTextures.positions,\n              nodes.positions,\n              3,\n              positionCount,\n              nodes.versions?.positions ?? 0,\n            );\n          }\n          if (interpolationEnabled && !interpolationSourceTexture && interpolationSourceView) {\n            this.uploadFloatTexture(\n              'nodePositionsFrom',\n              this.nodeTextures.positionsFrom,\n              interpolationSourceView,\n              3,\n              interpolationSourceCount,\n              interpolationSourceVersion,\n            );\n          } else if (interpolationSourceTextureMeta) {\n            this.textureMeta.nodePositionsFrom = interpolationSourceTextureMeta;\n          } else if (!interpolationEnabled) {\n            this.textureMeta.nodePositionsFrom = this.textureMeta.nodePositions;\n          }\n          if (hasNodeSizesForNodes) {\n            const sizeCount = nodes.sizes.length ?? 0;\n            this.uploadFloatTexture(\n              'nodeSizes',\n              this.nodeTextures.sizes,\n              nodes.sizes,\n              1,\n              sizeCount,\n              nodes.versions?.sizes ?? 0,\n            );\n          }\n          if (hasNodeStatesForNodes) {\n            const stateCount = nodes.states.length ?? 0;\n            this.uploadUintTexture(\n              'nodeStates',\n              this.nodeTextures.states,\n              nodes.states,\n              1,\n              stateCount,\n              nodes.versions?.states ?? 0,\n            );\n          }\n          if (hasNodeColorsForNodes) {\n            const colorCount = Math.floor((nodes.colors.length ?? 0) / 4);\n            this.uploadFloatTexture(\n              'nodeColors',\n              this.nodeTextures.colors,\n              nodes.colors,\n              4,\n              colorCount,\n              nodes.versions?.colors ?? 0,\n            );\n          }\n          if (hasNodeOutlineWidthsForNodes) {\n            const outlineCount = nodes.outlineWidths.length ?? 0;\n            this.uploadFloatTexture(\n              'nodeOutlineWidths',\n              this.nodeTextures.outlineWidths,\n              nodes.outlineWidths,\n              1,\n              outlineCount,\n              nodes.versions?.outlineWidths ?? 0,\n            );\n          }\n          if (hasNodeOutlineColorsForNodes) {\n            const outlineColorCount = Math.floor((nodes.outlineColors.length ?? 0) / 4);\n            this.uploadFloatTexture(\n              'nodeOutlineColors',\n              this.nodeTextures.outlineColors,\n              nodes.outlineColors,\n              4,\n              outlineColorCount,\n              nodes.versions?.outlineColors ?? 0,\n            );\n          }\n          if (nodeColorSource) {\n            const sourceCount = Math.floor((nodeColorSource.length ?? 0) / 4);\n            this.uploadFloatTexture(\n              'nodeEdgeColors',\n              this.nodeTextures.edgeColorSource,\n              nodeColorSource,\n              4,\n              sourceCount,\n              geometry.nodeEdgeSources?.color?.version ?? nodes.versions?.colors ?? 0,\n            );\n          }\n          if (nodeWidthSource) {\n            this.uploadFloatTexture(\n              'nodeEdgeWidths',\n              this.nodeTextures.edgeWidthSource,\n              nodeWidthSource,\n              1,\n              nodeWidthSource.length ?? 0,\n              geometry.nodeEdgeSources?.width?.version ?? nodes.versions?.sizes ?? 0,\n            );\n          }\n          if (nodeOpacitySource) {\n            this.uploadFloatTexture(\n              'nodeEdgeOpacities',\n              this.nodeTextures.edgeOpacitySource,\n              nodeOpacitySource,\n              1,\n              nodeOpacitySource.length ?? 0,\n              geometry.nodeEdgeSources?.opacity?.version ?? nodes.versions?.sizes ?? 0,\n            );\n          }\n          if (nodeEndpointSizeSource) {\n            this.uploadFloatTexture(\n              'nodeEdgeEndpointSizes',\n              this.nodeTextures.edgeEndpointSizeSource,\n              nodeEndpointSizeSource,\n              1,\n              nodeEndpointSizeSource.length ?? 0,\n              geometry.nodeEdgeSources?.endpointSize?.version ?? nodes.versions?.sizes ?? 0,\n            );\n          }\n        }\n        if (this.edgeCount > 0 && edges.endpoints) {\n          const endpointCount = Math.floor((edges.endpoints.length ?? 0) / 2);\n          this.uploadUintTexture(\n            'edgeEndpoints',\n            this.edgeTextures.endpoints,\n            edges.endpoints,\n            2,\n            endpointCount,\n            edges.versions?.endpoints ?? 0,\n          );\n          if (edges.colors) {\n            const edgeColorCount = Math.floor((edges.colors.length ?? 0) / 8);\n            this.uploadFloatTexture(\n              'edgeColors',\n              this.edgeTextures.colors,\n              edges.colors,\n              4,\n              edgeColorCount * 2,\n              edges.versions?.colors ?? 0,\n            );\n          }\n          if (edges.widths) {\n            const edgeWidthCount = Math.floor((edges.widths.length ?? 0) / 2);\n            this.uploadFloatTexture(\n              'edgeWidths',\n              this.edgeTextures.widths,\n              edges.widths,\n              2,\n              edgeWidthCount,\n              edges.versions?.widths ?? 0,\n            );\n          }\n          if (edges.opacities) {\n            const edgeOpacityCount = Math.floor((edges.opacities.length ?? 0) / 2);\n            this.uploadFloatTexture(\n              'edgeOpacities',\n              this.edgeTextures.opacities,\n              edges.opacities,\n              2,\n              edgeOpacityCount,\n              edges.versions?.opacities ?? 0,\n            );\n          }\n          if (edges.endpointSizes) {\n            const edgeEndpointSizeCount = Math.floor((edges.endpointSizes.length ?? 0) / 2);\n            this.uploadFloatTexture(\n              'edgeEndpointSizes',\n              this.edgeTextures.endpointSizes,\n              edges.endpointSizes,\n              2,\n              edgeEndpointSizeCount,\n              edges.versions?.endpointSizes ?? 0,\n            );\n          }\n          if (edges.states) {\n            const edgeStateCount = edges.states.length ?? 0;\n            this.uploadUintTexture(\n              'edgeStates',\n              this.edgeTextures.states,\n              edges.states,\n              1,\n              edgeStateCount,\n              edges.versions?.states ?? 0,\n            );\n          }\n        }\n\n        const viewport = context.viewport;\n        const rasterViewportWidth = viewport ? viewport[2] : (gl.drawingBufferWidth || this.size.width || 1);\n        const rasterViewportHeight = viewport ? viewport[3] : (gl.drawingBufferHeight || this.size.height || 1);\n        const logicalViewport = context.target?.exportFigureLogicalViewport ?? null;\n        const exportPixelRatio = Math.max(1, Number(logicalViewport?.devicePixelRatio ?? 1));\n        const screenViewportWidth = Math.max(\n          1,\n          Math.floor(logicalViewport ? logicalViewport.width * exportPixelRatio : rasterViewportWidth),\n        );\n        const screenViewportHeight = Math.max(\n          1,\n          Math.floor(logicalViewport ? logicalViewport.height * exportPixelRatio : rasterViewportHeight),\n        );\n        const transparencyMode = fastEdges ? 'alpha' : this.edgeTransparencyMode;\n        const nodeBlendWithEdges = this.nodeBlendWithEdges === true;\n        const edgeDepthWrite = !fastEdges && this.edgeDepthWrite === true;\n        debugWebGLRender('graph:render:uploads', {\n          nodeCount: this.nodeCount,\n          edgeCount: this.edgeCount,\n          viewportWidth: rasterViewportWidth,\n          viewportHeight: rasterViewportHeight,\n          screenViewportWidth,\n          screenViewportHeight,\n          edgeRenderingMode,\n          fastEdges,\n          transparencyMode,\n          nodeBlendWithEdges,\n          edgeDepthWrite,\n          textures: {\n            nodePositions: Boolean(this.nodeTextures.positions),\n            nodeColors: Boolean(this.nodeTextures.colors),\n            nodeSizes: Boolean(this.nodeTextures.sizes),\n            edgeColors: Boolean(this.edgeTextures.colors),\n            edgeWidths: Boolean(this.edgeTextures.widths),\n            edgeOpacities: Boolean(this.edgeTextures.opacities),\n          },\n        });\n\n        gl.enable(gl.DEPTH_TEST);\n        gl.depthMask(true);\n        gl.depthFunc(gl.LEQUAL);\n        gl.enable(gl.BLEND);\n        this.applyStandardAlphaBlend(gl);\n\n        const set1i = (uniforms, name, value) => {\n          const loc = uniforms[name];\n          if (loc) gl.uniform1i(loc, value);\n        };\n        const set1f = (uniforms, name, value) => {\n          const loc = uniforms[name];\n          if (loc) gl.uniform1f(loc, value);\n        };\n        const set1ui = (uniforms, name, value) => {\n          const loc = uniforms[name];\n          if (loc) gl.uniform1ui(loc, value >>> 0);\n        };\n        const set2f = (uniforms, name, a, b) => {\n          const loc = uniforms[name];\n          if (loc) gl.uniform2f(loc, a, b);\n        };\n        const set3f = (uniforms, name, a, b, c) => {\n          const loc = uniforms[name];\n          if (loc) gl.uniform3f(loc, a, b, c);\n        };\n        const set4f = (uniforms, name, a, b, c, d) => {\n          const loc = uniforms[name];\n          if (loc) gl.uniform4f(loc, a, b, c, d);\n        };\n        const set4fv = (uniforms, name, value) => {\n          const loc = uniforms[name];\n          if (loc) gl.uniform4fv(loc, value);\n        };\n        const setMat4 = (uniforms, name, value) => {\n          const loc = uniforms[name];\n          if (loc) gl.uniformMatrix4fv(loc, false, value);\n        };\n        const setShadingUniforms = (uniforms) => {\n          set3f(\n            uniforms,\n            'u_shadedLightDirection',\n            shadedLightDirection[0] ?? SHADED_LIGHT_DIRECTION_DEFAULT[0],\n            shadedLightDirection[1] ?? SHADED_LIGHT_DIRECTION_DEFAULT[1],\n            shadedLightDirection[2] ?? SHADED_LIGHT_DIRECTION_DEFAULT[2],\n          );\n          set3f(\n            uniforms,\n            'u_shadedLightColor',\n            shadedLightColor[0],\n            shadedLightColor[1],\n            shadedLightColor[2],\n          );\n          set3f(\n            uniforms,\n            'u_shadedAmbientTopColor',\n            shadedAmbientTopColor[0],\n            shadedAmbientTopColor[1],\n            shadedAmbientTopColor[2],\n          );\n          set3f(\n            uniforms,\n            'u_shadedAmbientBottomColor',\n            shadedAmbientBottomColor[0],\n            shadedAmbientBottomColor[1],\n            shadedAmbientBottomColor[2],\n          );\n          set3f(\n            uniforms,\n            'u_shadedSpecularColor',\n            shadedSpecularColor[0],\n            shadedSpecularColor[1],\n            shadedSpecularColor[2],\n          );\n          set4f(\n            uniforms,\n            'u_shadedParams',\n            shadedSpecularStrength,\n            shadedShininess,\n            shadedDiffuseStrength,\n            shadedAmbientStrength,\n          );\n        };\n\n        const drawEdges = ({\n          weighted = false,\n          depthOnly = false,\n          passViewportWidth = screenViewportWidth,\n          passViewportHeight = screenViewportHeight,\n        } = {}) => {\n          if (!this.edgeCount || !this.shouldRenderEdges() || !edges.endpoints || !activeNodePositionTexture) return;\n          const hasEdgeColors = Boolean(edgeVariant?.colorBuffer && edgeVariant?.colorSource !== 'node' && edges.colors);\n          const hasNodeColorsForEdgeChannel = Boolean(nodeColorSource);\n          const hasEdgeWidths = Boolean(edgeVariant?.widthBuffer && edgeVariant?.widthSource !== 'node' && edges.widths);\n          const hasEdgeOpacities = Boolean(\n            edgeVariant?.opacityBuffer\n            && edgeVariant?.opacitySource !== 'node'\n            && edges.opacities,\n          );\n          const hasEdgeStates = Boolean(edges.states);\n          const hasNodeStatesForEdgeEndpoint = Boolean(nodes.states);\n          const hasEdgeEndpointSizes = Boolean(\n            edgeVariant?.endpointSizeBuffer\n            && edgeVariant?.endpointSizeSource !== 'node'\n            && edges.endpointSizes,\n          );\n          const hasNodeWidthSource = Boolean(nodeWidthSource);\n          const hasNodeOpacitySource = Boolean(nodeOpacitySource);\n          const hasNodeEndpointSizeSource = Boolean(nodeEndpointSizeSource);\n          const colorEndpointMode = mapEndpointMode(edgeVariant?.colorEndpoints);\n          const opacityEndpointMode = mapEndpointMode(edgeVariant?.opacityEndpoints);\n\n          if (edgeRenderingMode === 'quad') {\n            const edgeEntry = depthOnly\n              ? edgeQuadDepthProgramEntry\n              : (weighted ? edgeQuadWeightedProgramEntry : edgeQuadProgramEntry);\n            if (!edgeEntry?.program) return;\n            const uniforms = edgeEntry.uniforms;\n            gl.useProgram(edgeEntry.program);\n            setMat4(uniforms, 'u_viewProjection', cameraUniforms.viewProjection);\n            set3f(\n              uniforms,\n              'u_cameraPosition',\n              cameraUniforms.position?.[0] ?? 0,\n              cameraUniforms.position?.[1] ?? 0,\n              cameraUniforms.position?.[2] ?? 1,\n            );\n            set3f(\n              uniforms,\n              'u_cameraUp',\n              cameraUniforms.up?.[0] ?? 0,\n              cameraUniforms.up?.[1] ?? 1,\n              cameraUniforms.up?.[2] ?? 0,\n            );\n            set3f(\n              uniforms,\n              'u_cameraRight',\n              cameraUniforms.right?.[0] ?? 1,\n              cameraUniforms.right?.[1] ?? 0,\n              cameraUniforms.right?.[2] ?? 0,\n            );\n            set1i(uniforms, 'u_is2D', cameraUniforms?.mode === '2d' ? 1 : 0);\n            set2f(uniforms, 'u_viewport', passViewportWidth, passViewportHeight);\n            set1i(uniforms, 'u_nodePositions', 0);\n            set1i(uniforms, 'u_nodePositionsFrom', 12);\n            set1f(uniforms, 'u_nodeInterpolationFactor', interpolationFactor);\n            set1i(uniforms, 'u_nodeInterpolationEnabled', interpolationEnabled ? 1 : 0);\n            set1i(uniforms, 'u_nodeStates', 16);\n            set1i(uniforms, 'u_nodeEdgeColors', 5);\n            set1i(uniforms, 'u_edgeColors', 2);\n            set1i(uniforms, 'u_edgeEndpoints', 3);\n            set1i(uniforms, 'u_edgeStates', 15);\n            set1i(uniforms, 'u_edgeWidths', 6);\n            set1i(uniforms, 'u_edgeOpacities', 10);\n            set1i(uniforms, 'u_edgeEndpointSizes', 7);\n            set1i(uniforms, 'u_nodeWidthSource', 8);\n            set1i(uniforms, 'u_nodeOpacitySource', 11);\n            set1i(uniforms, 'u_nodeEndpointSizeSource', 9);\n            set1i(uniforms, 'u_edgeColorSource', edgeVariant?.colorSource === 'node' ? 1 : 0);\n            set1i(uniforms, 'u_edgeColorEndpoints', colorEndpointMode);\n            set1i(uniforms, 'u_edgeWidthSource', edgeVariant?.widthSource === 'node' ? 1 : 0);\n            set1i(uniforms, 'u_edgeWidthEndpoints', mapEndpointMode(edgeVariant?.widthEndpoints));\n            set1i(uniforms, 'u_edgeOpacitySource', edgeVariant?.opacitySource === 'node' ? 1 : 0);\n            set1i(uniforms, 'u_edgeOpacityEndpoints', opacityEndpointMode);\n            set1i(uniforms, 'u_edgeEndpointSizeSource', edgeVariant?.endpointSizeSource === 'node' ? 1 : 0);\n            set1i(uniforms, 'u_edgeEndpointSizeEndpoints', mapEndpointMode(edgeVariant?.endpointSizeEndpoints));\n            set1i(uniforms, 'u_hasEdgeColors', hasEdgeColors ? 1 : 0);\n            set1i(uniforms, 'u_hasNodeColors', hasNodeColorsForEdgeChannel ? 1 : 0);\n            set1i(uniforms, 'u_hasEdgeStates', hasEdgeStates ? 1 : 0);\n            set1i(uniforms, 'u_hasNodeStates', hasNodeStatesForEdgeEndpoint ? 1 : 0);\n            set1i(uniforms, 'u_hasEdgeWidths', hasEdgeWidths ? 1 : 0);\n            set1i(uniforms, 'u_hasEdgeOpacities', hasEdgeOpacities ? 1 : 0);\n            set1i(uniforms, 'u_hasEdgeEndpointSizes', hasEdgeEndpointSizes ? 1 : 0);\n            set1i(uniforms, 'u_hasNodeWidthSource', hasNodeWidthSource ? 1 : 0);\n            set1i(uniforms, 'u_hasNodeOpacitySource', hasNodeOpacitySource ? 1 : 0);\n            set1i(uniforms, 'u_hasNodeEndpointSizeSource', hasNodeEndpointSizeSource ? 1 : 0);\n            set1ui(uniforms, 'u_hoverNodeIndex', this.hoveredNodeIndex);\n            set1ui(uniforms, 'u_hoverNodeIsVirtual', this.hoveredNodeIsVirtual ? 1 : 0);\n            set1ui(uniforms, 'u_hoverEdgeIndex', this.hoveredEdgeIndex);\n            set1ui(uniforms, 'u_hoverEdgeState', this.hoveredEdgeState);\n            set1ui(uniforms, 'u_hoverEdgeIsVirtual', this.hoveredEdgeIsVirtual ? 1 : 0);\n            set1ui(uniforms, 'u_edgeStateForceMaxAlphaMask', this.edgeStateForceMaxAlphaMask >>> 0);\n            set4fv(uniforms, 'u_edgeHoverScale', this.edgeHoverScale);\n            set4fv(uniforms, 'u_edgeHoverColorMul', this.edgeHoverForceMaxAlpha ? [1, 1, 1, 2] : this.edgeHoverColorMul);\n            set4fv(uniforms, 'u_edgeHoverColorAdd', this.edgeHoverColorAdd);\n            set4fv(\n              uniforms,\n              'u_nodeNoStateScale',\n              this.nodeNoStateStyleEnabled === true ? this.nodeNoStateScale : DEFAULT_STATE_SCALE,\n            );\n            set4fv(\n              uniforms,\n              'u_nodeStateScale[0]',\n              (this.nodeStateScale && this.nodeStateScale.length > 0) ? this.nodeStateScale : DEFAULT_STATE_SCALE,\n            );\n            set4fv(\n              uniforms,\n              'u_edgeNoStateScale',\n              this.edgeNoStateStyleEnabled === true ? this.edgeNoStateScale : DEFAULT_STATE_SCALE,\n            );\n            set4fv(\n              uniforms,\n              'u_edgeNoStateColorMul',\n              this.edgeNoStateStyleEnabled === true ? this.edgeNoStateColorMul : DEFAULT_STATE_COLOR_MUL,\n            );\n            set4fv(\n              uniforms,\n              'u_edgeNoStateColorAdd',\n              this.edgeNoStateStyleEnabled === true ? this.edgeNoStateColorAdd : DEFAULT_STATE_COLOR_ADD,\n            );\n            set4fv(\n              uniforms,\n              'u_edgeStateScale[0]',\n              (this.edgeStateScale && this.edgeStateScale.length > 0) ? this.edgeStateScale : DEFAULT_STATE_SCALE,\n            );\n            set4fv(\n              uniforms,\n              'u_edgeStateColorMul[0]',\n              (this.edgeStateColorMul && this.edgeStateColorMul.length > 0) ? this.edgeStateColorMul : DEFAULT_STATE_COLOR_MUL,\n            );\n            set4fv(\n              uniforms,\n              'u_edgeStateColorAdd[0]',\n              (this.edgeStateColorAdd && this.edgeStateColorAdd.length > 0) ? this.edgeStateColorAdd : DEFAULT_STATE_COLOR_ADD,\n            );\n            set4f(\n              uniforms,\n              'u_defaultNodeEdgeColor',\n              nodeDefaultColor[0],\n              nodeDefaultColor[1],\n              nodeDefaultColor[2],\n              nodeDefaultColor[3],\n            );\n            set4f(\n              uniforms,\n              'u_defaultEdgeColorStart',\n              defaultEdgeColorPair[0][0],\n              defaultEdgeColorPair[0][1],\n              defaultEdgeColorPair[0][2],\n              defaultEdgeColorPair[0][3],\n            );\n            set4f(\n              uniforms,\n              'u_defaultEdgeColorEnd',\n              defaultEdgeColorPair[1][0],\n              defaultEdgeColorPair[1][1],\n              defaultEdgeColorPair[1][2],\n              defaultEdgeColorPair[1][3],\n            );\n            const quadDefaultEdgeWidth = edgeVariant?.widthSource === 'node' ? defaultNodeWidth : defaultEdgeWidth;\n            const quadDefaultEdgeEndpointSize = edgeVariant?.endpointSizeSource === 'node'\n              ? defaultNodeEndpointSize\n              : defaultEdgeEndpointSize;\n            set2f(uniforms, 'u_defaultEdgeWidth', quadDefaultEdgeWidth[0], quadDefaultEdgeWidth[1]);\n            set2f(uniforms, 'u_defaultNodeWidthSource', defaultNodeWidth[0], defaultNodeWidth[1]);\n            set2f(uniforms, 'u_defaultEdgeOpacity', defaultEdgeOpacity[0], defaultEdgeOpacity[1]);\n            set2f(uniforms, 'u_defaultNodeOpacitySource', defaultNodeOpacity[0], defaultNodeOpacity[1]);\n            set2f(\n              uniforms,\n              'u_defaultEdgeEndpointSize',\n              quadDefaultEdgeEndpointSize[0],\n              quadDefaultEdgeEndpointSize[1],\n            );\n            set2f(\n              uniforms,\n              'u_defaultNodeEndpointSizeSource',\n              defaultNodeEndpointSize[0],\n              defaultNodeEndpointSize[1],\n            );\n            set1f(uniforms, 'u_edgeWidthBase', this.edgeWidthBase);\n            set1f(uniforms, 'u_edgeWidthScale', this.edgeWidthScale);\n            set1f(uniforms, 'u_edgeOpacityBase', this.edgeOpacityBase);\n            set1f(uniforms, 'u_edgeOpacityScale', this.edgeOpacityScale);\n            set1f(uniforms, 'u_nodeSizeBase', this.nodeSizeBase);\n            set1f(uniforms, 'u_nodeSizeScale', this.nodeSizeScale);\n            set1f(uniforms, 'u_edgeEndpointTrim', this.edgeEndpointTrim);\n            set1f(uniforms, 'u_zoom2D', zoom2D);\n            set1f(uniforms, 'u_semanticZoomExponent', semanticZoomExponent);\n            if (!depthOnly) setShadingUniforms(uniforms);\n            this.bindTexture(0, activeNodePositionTexture);\n            this.bindTexture(12, resolvedNodePositionFromTexture ?? activeNodePositionTexture);\n            this.bindTexture(5, this.nodeTextures.edgeColorSource);\n            this.bindTexture(2, this.edgeTextures.colors);\n            this.bindTexture(3, this.edgeTextures.endpoints);\n            this.bindTexture(6, this.edgeTextures.widths);\n            this.bindTexture(10, this.edgeTextures.opacities);\n            this.bindTexture(7, this.edgeTextures.endpointSizes);\n            this.bindTexture(8, this.nodeTextures.edgeWidthSource);\n            this.bindTexture(11, this.nodeTextures.edgeOpacitySource);\n            this.bindTexture(9, this.nodeTextures.edgeEndpointSizeSource);\n            this.bindTexture(15, this.edgeTextures.states);\n            this.bindTexture(16, this.nodeTextures.states);\n            gl.bindVertexArray(this.edgeQuadVao);\n            gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, this.edgeCount);\n            return;\n          }\n\n          const edgeEntry = depthOnly\n            ? edgeLineDepthProgramEntry\n            : (weighted ? edgeLineWeightedProgramEntry : edgeLineProgramEntry);\n          if (!edgeEntry?.program) return;\n          const uniforms = edgeEntry.uniforms;\n          gl.useProgram(edgeEntry.program);\n          setMat4(uniforms, 'u_viewProjection', cameraUniforms.viewProjection);\n          set1i(uniforms, 'u_nodePositions', 0);\n          set1i(uniforms, 'u_nodePositionsFrom', 12);\n          set1f(uniforms, 'u_nodeInterpolationFactor', interpolationFactor);\n          set1i(uniforms, 'u_nodeInterpolationEnabled', interpolationEnabled ? 1 : 0);\n          set1i(uniforms, 'u_nodeStates', 16);\n          set1i(uniforms, 'u_nodeEdgeColors', 5);\n          set1i(uniforms, 'u_edgeColors', 2);\n          set1i(uniforms, 'u_edgeStates', 15);\n          set1i(uniforms, 'u_edgeOpacities', 10);\n          set1i(uniforms, 'u_nodeOpacitySource', 11);\n          set1i(uniforms, 'u_edgeEndpoints', 3);\n          set1i(uniforms, 'u_edgeColorSource', edgeVariant?.colorSource === 'node' ? 1 : 0);\n          set1i(uniforms, 'u_edgeColorEndpoints', colorEndpointMode);\n          set1i(uniforms, 'u_edgeOpacitySource', edgeVariant?.opacitySource === 'node' ? 1 : 0);\n          set1i(uniforms, 'u_edgeOpacityEndpoints', opacityEndpointMode);\n          set1i(uniforms, 'u_hasEdgeColors', hasEdgeColors ? 1 : 0);\n          set1i(uniforms, 'u_hasNodeColors', hasNodeColorsForEdgeChannel ? 1 : 0);\n          set1i(uniforms, 'u_hasNodeStates', hasNodeStatesForEdgeEndpoint ? 1 : 0);\n          set1i(uniforms, 'u_hasEdgeStates', hasEdgeStates ? 1 : 0);\n          set1i(uniforms, 'u_hasEdgeOpacities', hasEdgeOpacities ? 1 : 0);\n          set1i(uniforms, 'u_hasNodeOpacitySource', hasNodeOpacitySource ? 1 : 0);\n          set1ui(uniforms, 'u_hoverNodeIndex', this.hoveredNodeIndex);\n          set1ui(uniforms, 'u_hoverNodeIsVirtual', this.hoveredNodeIsVirtual ? 1 : 0);\n          set1ui(uniforms, 'u_hoverEdgeIndex', this.hoveredEdgeIndex);\n          set1ui(uniforms, 'u_hoverEdgeState', this.hoveredEdgeState);\n          set1ui(uniforms, 'u_hoverEdgeIsVirtual', this.hoveredEdgeIsVirtual ? 1 : 0);\n          set1ui(uniforms, 'u_edgeStateForceMaxAlphaMask', this.edgeStateForceMaxAlphaMask >>> 0);\n          set4fv(uniforms, 'u_edgeHoverScale', this.edgeHoverScale);\n          set4fv(uniforms, 'u_edgeHoverColorMul', this.edgeHoverForceMaxAlpha ? [1, 1, 1, 2] : this.edgeHoverColorMul);\n          set4fv(uniforms, 'u_edgeHoverColorAdd', this.edgeHoverColorAdd);\n          set4fv(\n            uniforms,\n            'u_edgeNoStateScale',\n            this.edgeNoStateStyleEnabled === true ? this.edgeNoStateScale : DEFAULT_STATE_SCALE,\n          );\n          set4fv(\n            uniforms,\n            'u_edgeNoStateColorMul',\n            this.edgeNoStateStyleEnabled === true ? this.edgeNoStateColorMul : DEFAULT_STATE_COLOR_MUL,\n          );\n          set4fv(\n            uniforms,\n            'u_edgeNoStateColorAdd',\n            this.edgeNoStateStyleEnabled === true ? this.edgeNoStateColorAdd : DEFAULT_STATE_COLOR_ADD,\n          );\n          set4fv(\n            uniforms,\n            'u_edgeStateScale[0]',\n            (this.edgeStateScale && this.edgeStateScale.length > 0) ? this.edgeStateScale : DEFAULT_STATE_SCALE,\n          );\n          set4fv(\n            uniforms,\n            'u_edgeStateColorMul[0]',\n            (this.edgeStateColorMul && this.edgeStateColorMul.length > 0) ? this.edgeStateColorMul : DEFAULT_STATE_COLOR_MUL,\n          );\n          set4fv(\n            uniforms,\n            'u_edgeStateColorAdd[0]',\n            (this.edgeStateColorAdd && this.edgeStateColorAdd.length > 0) ? this.edgeStateColorAdd : DEFAULT_STATE_COLOR_ADD,\n          );\n          set4f(\n            uniforms,\n            'u_defaultNodeEdgeColor',\n            nodeDefaultColor[0],\n            nodeDefaultColor[1],\n            nodeDefaultColor[2],\n            nodeDefaultColor[3],\n          );\n          set4f(\n            uniforms,\n            'u_defaultEdgeColorStart',\n            defaultEdgeColorPair[0][0],\n            defaultEdgeColorPair[0][1],\n            defaultEdgeColorPair[0][2],\n            defaultEdgeColorPair[0][3],\n          );\n          set4f(\n            uniforms,\n            'u_defaultEdgeColorEnd',\n            defaultEdgeColorPair[1][0],\n            defaultEdgeColorPair[1][1],\n            defaultEdgeColorPair[1][2],\n            defaultEdgeColorPair[1][3],\n          );\n          set2f(uniforms, 'u_defaultEdgeOpacity', defaultEdgeOpacity[0], defaultEdgeOpacity[1]);\n          set2f(uniforms, 'u_defaultNodeOpacitySource', defaultNodeOpacity[0], defaultNodeOpacity[1]);\n          set1f(uniforms, 'u_edgeOpacityBase', this.edgeOpacityBase);\n          set1f(uniforms, 'u_edgeOpacityScale', this.edgeOpacityScale);\n          if (!depthOnly) setShadingUniforms(uniforms);\n          this.bindTexture(0, activeNodePositionTexture);\n          this.bindTexture(12, resolvedNodePositionFromTexture ?? activeNodePositionTexture);\n          this.bindTexture(5, this.nodeTextures.edgeColorSource);\n          this.bindTexture(2, this.edgeTextures.colors);\n          this.bindTexture(15, this.edgeTextures.states);\n          this.bindTexture(10, this.edgeTextures.opacities);\n          this.bindTexture(11, this.nodeTextures.edgeOpacitySource);\n          this.bindTexture(3, this.edgeTextures.endpoints);\n          this.bindTexture(16, this.nodeTextures.states);\n          gl.bindVertexArray(this.edgeVao);\n          gl.drawArraysInstanced(gl.LINES, 0, 2, this.edgeCount);\n        };\n\n        const drawNodes = ({ depthOnly = false } = {}) => {\n          if (!this.nodeCount || !activeNodePositionTexture) return;\n          const nodeEntry = depthOnly ? nodeDepthProgramEntry : nodeProgramEntry;\n          if (!nodeEntry?.program) return;\n          const uniforms = nodeEntry.uniforms;\n          gl.useProgram(nodeEntry.program);\n          setMat4(uniforms, 'u_viewProjection', cameraUniforms.viewProjection);\n          set1i(uniforms, 'u_nodePositions', 0);\n          set1i(uniforms, 'u_nodePositionsFrom', 15);\n          set1f(uniforms, 'u_nodeInterpolationFactor', interpolationFactor);\n          set1i(uniforms, 'u_nodeInterpolationEnabled', interpolationEnabled ? 1 : 0);\n          set1i(uniforms, 'u_nodeColors', 1);\n          set1i(uniforms, 'u_nodeSizes', 4);\n          set1i(uniforms, 'u_nodeOutlineWidths', 12);\n          set1i(uniforms, 'u_nodeOutlineColors', 13);\n          set1i(uniforms, 'u_nodeStates', 14);\n          set3f(\n            uniforms,\n            'u_cameraPosition',\n            cameraUniforms.position?.[0] ?? 0,\n            cameraUniforms.position?.[1] ?? 0,\n            cameraUniforms.position?.[2] ?? 1,\n          );\n          set3f(\n            uniforms,\n            'u_cameraUp',\n            cameraUniforms.up?.[0] ?? 0,\n            cameraUniforms.up?.[1] ?? 1,\n            cameraUniforms.up?.[2] ?? 0,\n          );\n          set3f(\n            uniforms,\n            'u_cameraRight',\n            cameraUniforms.right?.[0] ?? 1,\n            cameraUniforms.right?.[1] ?? 0,\n            cameraUniforms.right?.[2] ?? 0,\n          );\n          set1i(uniforms, 'u_is2D', cameraUniforms?.mode === '2d' ? 1 : 0);\n          set1f(uniforms, 'u_zoom2D', zoom2D);\n          set1f(uniforms, 'u_semanticZoomExponent', semanticZoomExponent);\n          set1i(uniforms, 'u_hasNodeColors', hasNodeColorsForNodes ? 1 : 0);\n          set1i(uniforms, 'u_hasNodeSizes', hasNodeSizesForNodes ? 1 : 0);\n          set1i(uniforms, 'u_hasNodeOutlineWidths', hasNodeOutlineWidthsForNodes ? 1 : 0);\n          set1i(uniforms, 'u_hasNodeOutlineColors', hasNodeOutlineColorsForNodes ? 1 : 0);\n          set1i(uniforms, 'u_hasNodeStates', hasNodeStatesForNodes ? 1 : 0);\n          set1ui(uniforms, 'u_hoverNodeIndex', this.hoveredNodeIndex);\n          set1ui(uniforms, 'u_hoverNodeState', this.hoveredNodeState);\n          set1ui(uniforms, 'u_hoverNodeIsVirtual', this.hoveredNodeIsVirtual ? 1 : 0);\n          set1ui(uniforms, 'u_nodeStateForceMaxAlphaMask', this.nodeStateForceMaxAlphaMask >>> 0);\n          set4fv(uniforms, 'u_nodeHoverScale', this.nodeHoverScale);\n          set4fv(uniforms, 'u_nodeHoverColorMul', this.nodeHoverForceMaxAlpha ? [1, 1, 1, 2] : this.nodeHoverColorMul);\n          set4fv(uniforms, 'u_nodeHoverColorAdd', this.nodeHoverColorAdd);\n          set4fv(\n            uniforms,\n            'u_nodeNoStateScale',\n            this.nodeNoStateStyleEnabled === true ? this.nodeNoStateScale : DEFAULT_STATE_SCALE,\n          );\n          set4fv(\n            uniforms,\n            'u_nodeNoStateColorMul',\n            this.nodeNoStateStyleEnabled === true ? this.nodeNoStateColorMul : DEFAULT_STATE_COLOR_MUL,\n          );\n          set4fv(\n            uniforms,\n            'u_nodeNoStateColorAdd',\n            this.nodeNoStateStyleEnabled === true ? this.nodeNoStateColorAdd : DEFAULT_STATE_COLOR_ADD,\n          );\n          set4fv(\n            uniforms,\n            'u_nodeStateScale[0]',\n            (this.nodeStateScale && this.nodeStateScale.length > 0) ? this.nodeStateScale : DEFAULT_STATE_SCALE,\n          );\n          set4fv(\n            uniforms,\n            'u_nodeStateColorMul[0]',\n            (this.nodeStateColorMul && this.nodeStateColorMul.length > 0) ? this.nodeStateColorMul : DEFAULT_STATE_COLOR_MUL,\n          );\n          set4fv(\n            uniforms,\n            'u_nodeStateColorAdd[0]',\n            (this.nodeStateColorAdd && this.nodeStateColorAdd.length > 0) ? this.nodeStateColorAdd : DEFAULT_STATE_COLOR_ADD,\n          );\n          set4f(\n            uniforms,\n            'u_defaultNodeColor',\n            nodeDefaultColor[0],\n            nodeDefaultColor[1],\n            nodeDefaultColor[2],\n            nodeDefaultColor[3],\n          );\n          set1f(uniforms, 'u_defaultNodeSize', nodeDefaultSize);\n          set1f(uniforms, 'u_nodeOpacityBase', this.nodeOpacityBase);\n          set1f(uniforms, 'u_nodeOpacityScale', this.nodeOpacityScale);\n          set1f(uniforms, 'u_nodeSizeBase', this.nodeSizeBase);\n          set1f(uniforms, 'u_nodeSizeScale', this.nodeSizeScale);\n          set1f(uniforms, 'u_nodeOutline', nodeDefaultOutline);\n          set1f(uniforms, 'u_outlineWidthBase', this.nodeOutlineWidthBase);\n          set1f(uniforms, 'u_outlineWidthScale', this.nodeOutlineWidthScale);\n          if (!depthOnly) {\n            setShadingUniforms(uniforms);\n            set4f(\n              uniforms,\n              'u_outlineColor',\n              nodeDefaultOutlineColor[0],\n              nodeDefaultOutlineColor[1],\n              nodeDefaultOutlineColor[2],\n              nodeDefaultOutlineColor[3],\n            );\n          }\n          this.bindTexture(0, activeNodePositionTexture);\n          this.bindTexture(15, resolvedNodePositionFromTexture ?? activeNodePositionTexture);\n          this.bindTexture(1, this.nodeTextures.colors);\n          this.bindTexture(4, this.nodeTextures.sizes);\n          this.bindTexture(12, this.nodeTextures.outlineWidths);\n          this.bindTexture(13, this.nodeTextures.outlineColors);\n          this.bindTexture(14, this.nodeTextures.states);\n          gl.bindVertexArray(this.nodeVao);\n          gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, this.nodeCount);\n        };\n\n        const applyViewport = () => {\n          if (viewport) {\n            gl.viewport(viewport[0], viewport[1], viewport[2], viewport[3]);\n          } else {\n            gl.viewport(0, 0, rasterViewportWidth, rasterViewportHeight);\n          }\n        };\n\n        const outputFramebuffer = context.target?.handle ?? null;\n        const outputDrawBuffers = outputFramebuffer ? [gl.COLOR_ATTACHMENT0] : [gl.BACK];\n        const mainFramebuffer = outputFramebuffer;\n        const mainDrawBuffers = mainFramebuffer ? [gl.COLOR_ATTACHMENT0] : [gl.BACK];\n\n        const effectiveEdgeCount = this.shouldRenderEdges() ? this.edgeCount : 0;\n        const weightedRequested = !fastEdges && (transparencyMode === 'weighted'\n          || transparencyMode === 'additive-normalized'\n          || transparencyMode === 'additive-tonemapped'\n          || transparencyMode === 'additive-normalized-bright');\n        const weightedReady = weightedRequested && effectiveEdgeCount > 0\n          ? this.prepareWeightedWebGL(rasterViewportWidth, rasterViewportHeight)\n          : false;\n        const ambientOcclusionActive = !is2D && this.hasAmbientOcclusionSelection();\n        debugWebGLRender('graph:render:mode', {\n          weightedRequested,\n          weightedReady,\n          ambientOcclusionActive,\n          is2D,\n          nodeCount: this.nodeCount,\n          edgeCount: effectiveEdgeCount,\n        });\n\n        if (weightedReady) {\n          if (!this.loggedWeightedActive) {\n            console.info(`GraphLayerWebGL: using weighted multipass for '${transparencyMode}'`);\n            this.loggedWeightedActive = true;\n          }\n\n          if (!is2D && this.nodeCount && !nodeBlendWithEdges) {\n            gl.bindFramebuffer(gl.FRAMEBUFFER, mainFramebuffer);\n            if (mainFramebuffer) gl.drawBuffers(mainDrawBuffers);\n            applyViewport();\n            gl.enable(gl.DEPTH_TEST);\n            gl.depthMask(true);\n            gl.depthFunc(gl.LEQUAL);\n            gl.enable(gl.BLEND);\n            gl.blendEquation(gl.FUNC_ADD);\n            gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n            drawNodes();\n          }\n\n          gl.bindFramebuffer(gl.FRAMEBUFFER, this.weightedFramebuffer);\n          gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1]);\n          applyViewport();\n          gl.clearBufferfv(gl.COLOR, 0, new Float32Array([0, 0, 0, 0]));\n          gl.clearBufferfv(gl.COLOR, 1, new Float32Array([0, 0, 0, 0]));\n          gl.clearBufferfv(gl.DEPTH, 0, new Float32Array([1]));\n\n          if (!is2D && this.nodeCount && !nodeBlendWithEdges) {\n            gl.colorMask(false, false, false, false);\n            gl.disable(gl.BLEND);\n            gl.enable(gl.DEPTH_TEST);\n            gl.depthMask(true);\n            gl.depthFunc(gl.LEQUAL);\n            drawNodes();\n            gl.colorMask(true, true, true, true);\n          }\n\n          if (this.edgeCount) {\n            gl.enable(gl.BLEND);\n            gl.blendEquation(gl.FUNC_ADD);\n            gl.blendFunc(gl.ONE, gl.ONE);\n            if (is2D) {\n              gl.disable(gl.DEPTH_TEST);\n              gl.depthMask(false);\n            } else {\n              gl.enable(gl.DEPTH_TEST);\n              gl.depthMask(edgeDepthWrite);\n              gl.depthFunc(gl.LEQUAL);\n            }\n            drawEdges({\n              weighted: true,\n              passViewportWidth: screenViewportWidth,\n              passViewportHeight: screenViewportHeight,\n            });\n          }\n\n          gl.bindFramebuffer(gl.FRAMEBUFFER, mainFramebuffer);\n          if (mainFramebuffer) gl.drawBuffers(mainDrawBuffers);\n          applyViewport();\n          gl.disable(gl.DEPTH_TEST);\n          gl.depthMask(false);\n          gl.enable(gl.BLEND);\n          gl.blendEquation(gl.FUNC_ADD);\n          gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\n          let resolveProgram = this.edgeResolveProgram;\n          let resolveUniformColor = this.edgeResolveUniformColor;\n          let resolveUniformWeight = this.edgeResolveUniformWeight;\n          if (transparencyMode === 'additive-tonemapped') {\n            resolveProgram = this.edgeResolveTonemapProgram ?? resolveProgram;\n            resolveUniformColor = this.edgeResolveTonemapUniformColor ?? resolveUniformColor;\n            resolveUniformWeight = this.edgeResolveTonemapUniformWeight ?? resolveUniformWeight;\n          } else if (transparencyMode === 'additive-normalized-bright') {\n            resolveProgram = this.edgeResolveBoostProgram ?? resolveProgram;\n            resolveUniformColor = this.edgeResolveBoostUniformColor ?? resolveUniformColor;\n            resolveUniformWeight = this.edgeResolveBoostUniformWeight ?? resolveUniformWeight;\n          }\n\n          if (resolveProgram) {\n            gl.useProgram(resolveProgram);\n            gl.activeTexture(gl.TEXTURE0);\n            gl.bindTexture(gl.TEXTURE_2D, this.weightedColor);\n            if (resolveUniformColor) gl.uniform1i(resolveUniformColor, 0);\n            gl.activeTexture(gl.TEXTURE1);\n            gl.bindTexture(gl.TEXTURE_2D, this.weightedWeight);\n            if (resolveUniformWeight) gl.uniform1i(resolveUniformWeight, 1);\n            gl.bindVertexArray(this.edgeResolveVAO);\n            gl.drawArrays(gl.TRIANGLES, 0, 6);\n          }\n\n          if ((is2D || nodeBlendWithEdges) && this.nodeCount) {\n            gl.enable(gl.BLEND);\n            if (nodeBlendWithEdges) {\n              this.applyEdgeBlend(gl, transparencyMode);\n            } else {\n              gl.blendEquation(gl.FUNC_ADD);\n              gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n            }\n            gl.depthMask(false);\n            gl.disable(gl.DEPTH_TEST);\n            gl.bindFramebuffer(gl.FRAMEBUFFER, mainFramebuffer);\n            if (mainFramebuffer) gl.drawBuffers(mainDrawBuffers);\n            applyViewport();\n            drawNodes();\n          }\n        } else {\n          if (weightedRequested && effectiveEdgeCount > 0) {\n            this.weightedSupported = false;\n            this.edgeTransparencyMode = this.normalizeEdgeTransparencyMode(this.edgeTransparencyMode);\n          }\n          if (weightedRequested && this.edgeCount > 0 && !this.warnedWeightedFallback) {\n            console.warn('Weighted edge transparency is not available in WebGL2 indirect; falling back to alpha.');\n            this.warnedWeightedFallback = true;\n          }\n\n          const applyNodeBlend = () => {\n            if (nodeBlendWithEdges) {\n              this.applyEdgeBlend(gl, transparencyMode);\n            } else {\n              this.applyStandardAlphaBlend(gl);\n            }\n          };\n\n          const setupNodeDepth = () => {\n            if (nodeBlendWithEdges || is2D) {\n              gl.disable(gl.DEPTH_TEST);\n              gl.depthMask(false);\n            } else {\n              gl.enable(gl.DEPTH_TEST);\n              gl.depthMask(true);\n              gl.depthFunc(gl.LEQUAL);\n            }\n          };\n\n          if (is2D) {\n            this.applyEdgeBlend(gl, transparencyMode);\n            gl.disable(gl.DEPTH_TEST);\n            gl.depthMask(false);\n            drawEdges();\n            applyNodeBlend();\n            setupNodeDepth();\n            drawNodes();\n          } else {\n            applyNodeBlend();\n            setupNodeDepth();\n            drawNodes();\n            this.applyEdgeBlend(gl, transparencyMode);\n            gl.enable(gl.DEPTH_TEST);\n            gl.depthMask(edgeDepthWrite);\n            gl.depthFunc(gl.LEQUAL);\n            drawEdges();\n          }\n        }\n\n        if (ambientOcclusionActive && this.ambientOcclusion?.render) {\n          this.ambientOcclusion.render(context, {\n            cameraUniforms,\n            selection: this.getAmbientOcclusionSelection(),\n            strength: Number.isFinite(Number(this.ambientOcclusionStrength))\n              ? Math.max(0, Number(this.ambientOcclusionStrength))\n              : AMBIENT_OCCLUSION_STRENGTH_DEFAULT,\n            radius: Number.isFinite(Number(this.ambientOcclusionRadius))\n              ? Math.max(1, Number(this.ambientOcclusionRadius))\n              : AMBIENT_OCCLUSION_RADIUS_DEFAULT,\n            bias: Number.isFinite(Number(this.ambientOcclusionBias))\n              ? Math.max(0, Number(this.ambientOcclusionBias))\n              : AMBIENT_OCCLUSION_BIAS_DEFAULT,\n            mode: this.ambientOcclusionMode,\n            intensityScale: Number.isFinite(Number(this.ambientOcclusionIntensityScale))\n              ? Math.max(0, Number(this.ambientOcclusionIntensityScale))\n              : 1.25,\n            intensityShift: Number.isFinite(Number(this.ambientOcclusionIntensityShift))\n              ? Math.max(0, Number(this.ambientOcclusionIntensityShift))\n              : 0.05,\n            quality: normalizeAmbientOcclusionQuality(this.ambientOcclusionQuality),\n            drawNodes,\n            drawEdges,\n          });\n        }\n\n        if (outputFramebuffer) gl.drawBuffers(outputDrawBuffers);\n\n        gl.bindVertexArray(null);\n        const finalError = gl.getError();\n        debugWebGLRender('graph:render:end', {\n          finalError,\n          nodeCount: this.nodeCount,\n          edgeCount: this.edgeCount,\n          weightedRequested,\n          weightedReady,\n        });\n        gl.depthMask(true);\n        gl.enable(gl.DEPTH_TEST);\n        gl.depthFunc(gl.LEQUAL);\n        this.applyStandardAlphaBlend(gl);\n        return true;\n      },\n    );\n  }\n}\n\nexport default GraphLayerWebGL;\n","export function createGraphWebGPUSources(stateSlots = 4, options = {}) {\n  const STATE_SLOTS = Math.max(0, Math.min(32, Math.floor(Number(stateSlots) || 0)));\n  const FORCE_VISIBILITY_BOOST = 1000.0;\n  const useNodeIndices = options.useNodeIndices !== false;\n  const useEdgeIndices = options.useEdgeIndices !== false;\n  const bindings = options?.bindings ?? null;\n\n  const nodeOptions = options?.node && typeof options.node === 'object' ? options.node : {};\n  const edgeOptions = options?.edge && typeof options.edge === 'object' ? options.edge : {};\n\n  // Back-compat: previous API used a single toggle for outline width + outline color from buffers.\n  if (options?.useNodeOutlineAttributes === true) {\n    if (nodeOptions.outline == null) nodeOptions.outline = 'buffer';\n    if (nodeOptions.outlineColor == null) nodeOptions.outlineColor = 'buffer';\n  }\n\n  const useNodeColorBuffer = nodeOptions.color !== 'uniform';\n  const useNodeSizeBuffer = nodeOptions.size !== 'uniform';\n  const useNodeStateBuffer = nodeOptions.state !== 'none';\n  const useNodePositionInterpolation = nodeOptions.positionInterpolation !== false;\n  const useNodeShading = nodeOptions.shading === true;\n  // Default outline to uniform unless explicitly marked as buffer.\n  const useNodeOutlineWidthBuffer = nodeOptions.outline === 'buffer';\n  const useNodeOutlineColorBuffer = nodeOptions.outlineColor === 'buffer';\n\n  const useEdgeColorBuffer = edgeOptions.color !== 'uniform';\n  const useEdgeWidthBuffer = edgeOptions.width !== 'uniform';\n  const useEdgeOpacityBuffer = edgeOptions.opacity !== 'uniform';\n  const useEdgeEndpointSizeBuffer = edgeOptions.endpointSize !== 'uniform';\n  const edgeWidthClampToNodeDiameter = edgeOptions.widthClampToNodeDiameter !== false;\n\n  // Existing optional extra bindings for outline buffers.\n  const useNodeOutlineAttributes = useNodeOutlineWidthBuffer || useNodeOutlineColorBuffer;\n\n  const defaultBindings = {\n    camera: 0,\n    nodeIndices: 1,\n    nodePositions: 2,\n    nodeSizes: 3,\n    nodeColors: 4,\n    nodeStates: 5,\n    globals: 6,\n    hover: 7,\n    nodeOutlineWidths: 8,\n    nodeOutlineColors: 9,\n    nodePositionsFrom: 10,\n    shading: 11,\n    edgeIndices: 1,\n    edgeSegments: 2,\n    edgeColors: 3,\n    edgeWidths: 4,\n    edgeEndpointSizes: 5,\n    edgeOpacities: 6,\n    edgeStates: 7,\n  };\n  const bindingMap = bindings ?? defaultBindings;\n  const hasBinding = (name) => {\n    if (bindings) return bindingMap[name] != null;\n    return Object.prototype.hasOwnProperty.call(defaultBindings, name);\n  };\n  const bindingIndex = (name) => bindingMap[name];\n\n  const NODE_OUTLINE_STORAGE_BINDINGS = useNodeOutlineAttributes\n    ? [\n      useNodeOutlineWidthBuffer && hasBinding('nodeOutlineWidths')\n        ? `@group(0) @binding(${bindingIndex('nodeOutlineWidths')}) var<storage, read> nodeOutlineWidths : NodeOutlineWidths;`\n        : null,\n      useNodeOutlineColorBuffer && hasBinding('nodeOutlineColors')\n        ? `\\t@group(0) @binding(${bindingIndex('nodeOutlineColors')}) var<storage, read> nodeOutlineColors : NodeOutlineColors;`\n        : null,\n    ].filter(Boolean).join('\\n')\n    : '';\n\n  const NODE_OUTLINE_RAW_EXPR = useNodeOutlineWidthBuffer\n    ? 'let outlineRaw = nodeOutlineWidths.data[index];'\n    : 'let outlineRaw = globals.nodeRaw.y;';\n\n  const NODE_OUTLINE_BASE_COLOR_EXPR = useNodeOutlineColorBuffer\n    ? 'let outlineBaseColor = nodeOutlineColors.data[index];'\n    : 'let outlineBaseColor = globals.nodeOutlineColor;';\n\n  const NODE_TARGET_BINDING = (useNodePositionInterpolation && hasBinding('nodePositionsFrom'))\n    ? `@group(0) @binding(${bindingIndex('nodePositionsFrom')}) var<storage, read> nodePositionsFrom : NodePositionsFrom;`\n    : '';\n  const NODE_SHADING_BINDING = (useNodeShading && hasBinding('shading'))\n    ? `@group(0) @binding(${bindingIndex('shading')}) var<uniform> shading : Shading;`\n    : '';\n  const NODE_SHADING_HELPER = useNodeShading\n    ? `\nfn applyNodeShading(baseColor: vec3<f32>, local: vec2<f32>) -> vec3<f32> {\n  let lensqr = dot(local, local);\n  let normal = normalize(vec3<f32>(local.xy, sqrt(max(1.0 - lensqr, 0.0))));\n  let lightDir = normalize(shading.lightDirection.xyz);\n  let ambient = mix(shading.ambientBottomColor.xyz, shading.ambientTopColor.xyz, normal.z * 0.5 + 0.5)\n    * shading.params.w;\n  let diffuse = max(dot(lightDir, normal), 0.0);\n  let reflection = reflect(-lightDir, normal);\n  let specular = pow(max(dot(vec3<f32>(0.0, 0.0, 1.0), reflection), 0.0), max(shading.params.y, 1.0))\n    * shading.params.x;\n  let shaded = baseColor * (ambient + shading.lightColor.xyz * (diffuse * shading.params.z))\n    + shading.specularColor.xyz * specular;\n  return clamp(shaded, vec3<f32>(0.0), vec3<f32>(1.0));\n}`\n    : '';\n  const NODE_FILL_COLOR_EXPR = useNodeShading\n    ? 'vec4<f32>(applyNodeShading(input.color.rgb, input.local), input.color.a)'\n    : 'input.color';\n  const EDGE_TARGET_BINDING = '';\n\n  const NODE_WGSL = /* wgsl */ `\nconst USE_NODE_INDICES : bool = ${useNodeIndices ? 'true' : 'false'};\nconst USE_NODE_COLOR_BUFFER : bool = ${useNodeColorBuffer ? 'true' : 'false'};\nconst USE_NODE_SIZE_BUFFER : bool = ${useNodeSizeBuffer ? 'true' : 'false'};\nconst USE_NODE_STATE_BUFFER : bool = ${useNodeStateBuffer ? 'true' : 'false'};\nconst USE_NODE_POSITION_INTERPOLATION : bool = ${useNodePositionInterpolation ? 'true' : 'false'};\nconst USE_NODE_SHADING : bool = ${useNodeShading ? 'true' : 'false'};\nconst USE_NODE_OUTLINE_WIDTH_BUFFER : bool = ${useNodeOutlineWidthBuffer ? 'true' : 'false'};\nconst USE_NODE_OUTLINE_COLOR_BUFFER : bool = ${useNodeOutlineColorBuffer ? 'true' : 'false'};\n\nstruct Camera {\n  viewProjection: mat4x4<f32>,\n  view: mat4x4<f32>,\n  position: vec4<f32>,\n  up: vec4<f32>,\n  right: vec4<f32>,\n  // viewport.xy = width/height in pixels, viewport.zw = 1/width,1/height\n  viewport: vec4<f32>,\n};\n\nstruct Globals {\n  nodeOpacity: vec2<f32>, // base, scale\n  nodeSize: vec2<f32>, // base, scale\n  nodeOutline: vec2<f32>, // base, scale (applied to node size attribute)\n  edgeOpacity: vec2<f32>, // base, scale\n  edgeWidth: vec2<f32>, // base, scale\n  _pad0: vec2<f32>, // x=semanticZoomExponent\n  nodeColor: vec4<f32>,\n  nodeRaw: vec2<f32>, // x=nodeSizeRaw y=nodeOutlineRaw\n  _pad1: vec2<f32>,\n  nodeOutlineColor: vec4<f32>,\n  edgeColorStart: vec4<f32>,\n  edgeColorEnd: vec4<f32>,\n  edgeWidthRaw: vec2<f32>,\n  edgeOpacityRaw: vec2<f32>,\n  edgeEndpointSizeRaw: vec2<f32>,\n  _pad2: vec2<f32>,\n  edgeTrim: vec4<f32>, // edgeTrim.x used, rest padding\n  nodeNoStateScale: vec4<f32>, // x=sizeMul y=opacityMul z=outlineMul w=discard(>0.5)\n  nodeNoStateColorMul: vec4<f32>,\n  nodeNoStateColorAdd: vec4<f32>,\n  edgeNoStateScale: vec4<f32>, // x=widthMul y=opacityMul w=discard(>0.5)\n  edgeNoStateColorMul: vec4<f32>,\n  edgeNoStateColorAdd: vec4<f32>,\n  nodeStateScale: array<vec4<f32>, ${STATE_SLOTS}>,\n  nodeStateColorMul: array<vec4<f32>, ${STATE_SLOTS}>,\n  nodeStateColorAdd: array<vec4<f32>, ${STATE_SLOTS}>,\n  edgeStateScale: array<vec4<f32>, ${STATE_SLOTS}>,\n  edgeStateColorMul: array<vec4<f32>, ${STATE_SLOTS}>,\n  edgeStateColorAdd: array<vec4<f32>, ${STATE_SLOTS}>,\n  positionInterpolation: vec4<f32>, // x=factor y=enabled\n};\n\nstruct NodeIndices {\n  data: array<u32>,\n};\n\nstruct NodePositions {\n  data: array<f32>, // packed xyz triplets\n};\n\nstruct NodePositionsFrom {\n  data: array<f32>, // packed xyz triplets\n};\n\nstruct NodeSizes {\n  data: array<f32>,\n};\n\nstruct NodeColors {\n  data: array<vec4<f32>>,\n};\n\n\tstruct NodeStates {\n\t  data: array<u32>,\n\t};\n\n  struct NodeOutlineWidths {\n    data: array<f32>,\n  };\n\nstruct NodeOutlineColors {\n  data: array<vec4<f32>>,\n};\n\nstruct Shading {\n  lightDirection: vec4<f32>,\n  lightColor: vec4<f32>,\n  ambientTopColor: vec4<f32>,\n  ambientBottomColor: vec4<f32>,\n  specularColor: vec4<f32>,\n  params: vec4<f32>, // x=specularStrength y=shininess z=diffuseStrength w=ambientStrength\n};\n\n\t@group(0) @binding(${bindingIndex('camera')}) var<uniform> camera : Camera;\n\t${useNodeIndices && hasBinding('nodeIndices') ? `@group(0) @binding(${bindingIndex('nodeIndices')}) var<storage, read> nodeIndices : NodeIndices;` : ''}\n\t${hasBinding('nodePositions') ? `@group(0) @binding(${bindingIndex('nodePositions')}) var<storage, read> nodePositions : NodePositions;` : ''}\n\t${useNodeSizeBuffer && hasBinding('nodeSizes') ? `@group(0) @binding(${bindingIndex('nodeSizes')}) var<storage, read> nodeSizes : NodeSizes;` : ''}\n\t${useNodeColorBuffer && hasBinding('nodeColors') ? `@group(0) @binding(${bindingIndex('nodeColors')}) var<storage, read> nodeColors : NodeColors;` : ''}\n\t${useNodeStateBuffer && hasBinding('nodeStates') ? `@group(0) @binding(${bindingIndex('nodeStates')}) var<storage, read> nodeStates : NodeStates;` : ''}\n  ${NODE_OUTLINE_STORAGE_BINDINGS}\n  ${NODE_TARGET_BINDING}\n  ${NODE_SHADING_BINDING}\n\t@group(0) @binding(${bindingIndex('globals')}) var<uniform> globals : Globals;\n\tstruct Hover {\n\t  nodeIndex: u32,\n\t  nodeState: u32,\n\t  edgeIndex: u32,\n\t  edgeState: u32,\n    nodeStateForceMaxAlphaMask: u32,\n    edgeStateForceMaxAlphaMask: u32,\n    nodeVirtual: u32,\n    edgeVirtual: u32,\n    nodeHoverScale: vec4<f32>,\n    nodeHoverColorMul: vec4<f32>,\n    nodeHoverColorAdd: vec4<f32>,\n    edgeHoverScale: vec4<f32>,\n    edgeHoverColorMul: vec4<f32>,\n    edgeHoverColorAdd: vec4<f32>,\n\t};\n\t\t@group(0) @binding(${bindingIndex('hover')}) var<uniform> hover : Hover;\n\nfn semanticZoomScale() -> f32 {\n  let is2D = camera.position.w > 0.5;\n  if (!is2D) {\n    return 1.0;\n  }\n  let exponent = globals._pad0.x;\n  if (exponent <= 0.0 || exponent != exponent) {\n    return 1.0;\n  }\n  let zoom2D = max(abs(camera.view[0][0]), 1e-3);\n  if (exponent == 1.0) {\n    return 1.0 / zoom2D;\n  }\n  return 1.0 / pow(zoom2D, exponent);\n}\n\nstruct VertexInput {\n  @location(0) corner : vec2<f32>,\n  @builtin(instance_index) instance : u32,\n};\n\nstruct VertexOutput {\n  @builtin(position) position : vec4<f32>,\n  @location(0) color : vec4<f32>,\n  @location(1) local : vec2<f32>,\n  @location(2) outlineColor : vec4<f32>,\n  @location(3) outlineThreshold : f32,\n  @location(4) centerWorld : vec3<f32>,\n  @location(5) rightWorld : vec3<f32>,\n  @location(6) upWorld : vec3<f32>,\n  @location(7) viewDir : vec3<f32>,\n  @location(8) radius : f32,\n  @location(9) @interpolate(flat) discardFlag : u32,\n};\n\n@vertex\nfn nodeVertex(input : VertexInput) -> VertexOutput {\n  var index = input.instance;\n  if (USE_NODE_INDICES) {\n    index = nodeIndices.data[input.instance];\n  }\n  let baseOffset = index * 3u;\n  let basePositionTo = vec3<f32>(\n    nodePositions.data[baseOffset + 0u],\n    nodePositions.data[baseOffset + 1u],\n    nodePositions.data[baseOffset + 2u]\n  );\n  var basePosition = basePositionTo;\n  ${useNodePositionInterpolation ? `\n  let basePositionFrom = vec3<f32>(\n    nodePositionsFrom.data[baseOffset + 0u],\n    nodePositionsFrom.data[baseOffset + 1u],\n    nodePositionsFrom.data[baseOffset + 2u]\n  );\n  let interpolationT = clamp(globals.positionInterpolation.x, 0.0, 1.0);\n  basePosition = select(\n    basePositionTo,\n    mix(basePositionFrom, basePositionTo, interpolationT),\n    globals.positionInterpolation.y > 0.5\n  );` : ''}\n  let rawSize = ${useNodeSizeBuffer ? 'nodeSizes.data[index]' : 'globals.nodeRaw.x'};\n\t  var state = ${useNodeStateBuffer ? 'nodeStates.data[index]' : '0u'};\n\t  if (hover.nodeIndex != 0xffffffffu && index == hover.nodeIndex) {\n\t    if (hover.nodeVirtual == 0u) {\n        state = state | hover.nodeState;\n      }\n\t  }\n    var forceMaxAlpha = (state & hover.nodeStateForceMaxAlphaMask) != 0u;\n\t  var sizeMul = 1.0;\n\t  var opacityMul = 1.0;\n\t  var outlineMul = 1.0;\n\t  var rgbMul = vec3<f32>(1.0, 1.0, 1.0);\n\t  var rgbAdd = vec3<f32>(0.0, 0.0, 0.0);\n  var discardFlag = 0u;\n  let virtualHover = hover.nodeIndex != 0xffffffffu && index == hover.nodeIndex && hover.nodeVirtual != 0u;\n  if (state == 0u) {\n    let scale = globals.nodeNoStateScale;\n    sizeMul = sizeMul * scale.x;\n    opacityMul = opacityMul * scale.y;\n    outlineMul = outlineMul * scale.z;\n    rgbMul = rgbMul * globals.nodeNoStateColorMul.rgb;\n    rgbAdd = rgbAdd + globals.nodeNoStateColorAdd.rgb;\n    discardFlag = select(0u, 1u, scale.w > 0.5);\n  } else {\n    for (var i = 0u; i < ${STATE_SLOTS}u; i = i + 1u) {\n      let enabled = (state >> i) & 1u;\n      if (enabled == 1u) {\n        let scale = globals.nodeStateScale[i];\n        sizeMul = sizeMul * scale.x;\n        opacityMul = opacityMul * scale.y;\n        outlineMul = outlineMul * scale.z;\n        rgbMul = rgbMul * globals.nodeStateColorMul[i].rgb;\n        rgbAdd = rgbAdd + globals.nodeStateColorAdd[i].rgb;\n        if (scale.w > 0.5) {\n          discardFlag = 1u;\n        }\n      }\n    }\n  }\n  if (virtualHover) {\n    let scale = hover.nodeHoverScale;\n    sizeMul = sizeMul * scale.x;\n    opacityMul = opacityMul * scale.y;\n    outlineMul = outlineMul * scale.z;\n    rgbMul = rgbMul * hover.nodeHoverColorMul.rgb;\n    rgbAdd = rgbAdd + hover.nodeHoverColorAdd.rgb;\n    if (scale.w > 0.5) {\n      discardFlag = 1u;\n    }\n    forceMaxAlpha = forceMaxAlpha || hover.nodeHoverColorMul.a > 1.5;\n  }\n\n  let semanticScale = semanticZoomScale();\n  let diameter = max(0.0, (globals.nodeSize.x + globals.nodeSize.y * rawSize) * sizeMul);\n  ${NODE_OUTLINE_RAW_EXPR}\n  let outlineWidth = max(0.0, (globals.nodeOutline.x + globals.nodeOutline.y * outlineRaw) * outlineMul);\n  let fullDiameter = (diameter + outlineWidth) * semanticScale;\n  let semanticOutlineWidth = outlineWidth * semanticScale;\n  let radius = fullDiameter * 0.5;\n  let is2D = camera.position.w > 0.5;\n  var right = camera.right.xyz;\n  var up = camera.up.xyz;\n  var viewDir = vec3<f32>(0.0, 0.0, 1.0);\n  if (is2D) {\n    right = normalize(right);\n    up = normalize(up);\n  } else {\n    viewDir = camera.position.xyz - basePosition;\n    let viewLen = length(viewDir);\n    if (viewLen > 1e-5) {\n      viewDir = viewDir / vec3<f32>(viewLen);\n    } else {\n      viewDir = vec3<f32>(0.0, 0.0, 1.0);\n    }\n    right = camera.right.xyz - viewDir * dot(camera.right.xyz, viewDir);\n    let rightLen = length(right);\n    if (rightLen > 1e-5) {\n      right = right / vec3<f32>(rightLen);\n    } else {\n      right = normalize(cross(camera.up.xyz, viewDir));\n    }\n    up = normalize(cross(viewDir, right));\n  }\n  let offset = right * input.corner.x + up * input.corner.y;\n  var output : VertexOutput;\n  output.position = camera.viewProjection * vec4<f32>(basePosition + offset * radius, 1.0);\n  let baseColor = ${useNodeColorBuffer ? 'nodeColors.data[index]' : 'globals.nodeColor'};\n  let alpha = clamp(globals.nodeOpacity.x + globals.nodeOpacity.y * baseColor.a, 0.0, 1.0) * opacityMul;\n  let rgb = clamp(baseColor.rgb * rgbMul + rgbAdd, vec3<f32>(0.0), vec3<f32>(1.0));\n  output.color = vec4<f32>(rgb, select(clamp(alpha, 0.0, 1.0), 1.0, forceMaxAlpha));\n  output.local = input.corner;\n  ${NODE_OUTLINE_BASE_COLOR_EXPR}\n  let outlineAlpha = clamp(globals.nodeOpacity.x + globals.nodeOpacity.y * outlineBaseColor.a, 0.0, 1.0) * opacityMul;\n  output.outlineColor = vec4<f32>(outlineBaseColor.rgb, select(clamp(outlineAlpha, 0.0, 1.0), 1.0, forceMaxAlpha));\n  output.outlineThreshold = select(0.0, semanticOutlineWidth / max(fullDiameter, 1e-5), outlineWidth > 0.0);\n  output.centerWorld = basePosition;\n  output.rightWorld = right;\n  output.upWorld = up;\n  output.viewDir = viewDir;\n  output.radius = radius;\n  output.discardFlag = discardFlag;\n  return output;\n}\n\nstruct NodeFragmentOutput {\n  @location(0) color : vec4<f32>,\n  @builtin(frag_depth) depth : f32,\n};\n${NODE_SHADING_HELPER}\n\n@fragment\nfn nodeFragment(input : VertexOutput) -> NodeFragmentOutput {\n  var output : NodeFragmentOutput;\n  if (input.discardFlag == 1u) {\n    discard;\n  }\n  let dist = length(input.local);\n  if (dist > 1.0) {\n    discard;\n  }\n  if (input.outlineThreshold > 0.0 && dist > (1.0 - input.outlineThreshold)) {\n    output.color = input.outlineColor;\n  } else {\n    output.color = ${NODE_FILL_COLOR_EXPR};\n  }\n  // Depth as a sphere in 3D; retain default depth in 2D (where depth test is disabled).\n  if (camera.position.w < 0.5) {\n    let radius = input.radius;\n    let xyLenSq = dot(input.local * radius, input.local * radius);\n    let zOffset = sqrt(max(radius * radius - xyLenSq, 0.0));\n    let worldPos = input.centerWorld\n      + (input.rightWorld * input.local.x + input.upWorld * input.local.y) * radius\n      + normalize(input.viewDir) * zOffset;\n    let clip = camera.viewProjection * vec4<f32>(worldPos, 1.0);\n    output.depth = clip.z / clip.w;\n  } else {\n    output.depth = input.position.z / input.position.w;\n  }\n  return output;\n}`;\n\n  const EDGE_WGSL = /* wgsl */ `\nconst USE_EDGE_INDICES : bool = ${useEdgeIndices ? 'true' : 'false'};\nconst USE_EDGE_COLOR_BUFFER : bool = ${useEdgeColorBuffer ? 'true' : 'false'};\nconst USE_EDGE_WIDTH_BUFFER : bool = ${useEdgeWidthBuffer ? 'true' : 'false'};\nconst USE_EDGE_OPACITY_BUFFER : bool = ${useEdgeOpacityBuffer ? 'true' : 'false'};\nconst USE_EDGE_ENDPOINT_SIZE_BUFFER : bool = ${useEdgeEndpointSizeBuffer ? 'true' : 'false'};\n\nstruct Camera {\n  viewProjection: mat4x4<f32>,\n  view: mat4x4<f32>,\n  position: vec4<f32>,\n  up: vec4<f32>,\n  right: vec4<f32>,\n  // viewport.xy = width/height in pixels, viewport.zw = 1/width,1/height\n  viewport: vec4<f32>,\n};\n\nstruct Globals {\n  nodeOpacity: vec2<f32>, // base, scale\n  nodeSize: vec2<f32>, // base, scale\n  nodeOutline: vec2<f32>, // base, scale (applied to node size attribute)\n  edgeOpacity: vec2<f32>, // base, scale\n  edgeWidth: vec2<f32>, // base, scale\n  _pad0: vec2<f32>, // x=semanticZoomExponent\n  nodeColor: vec4<f32>,\n  nodeRaw: vec2<f32>, // x=nodeSizeRaw y=nodeOutlineRaw\n  _pad1: vec2<f32>,\n  nodeOutlineColor: vec4<f32>,\n  edgeColorStart: vec4<f32>,\n  edgeColorEnd: vec4<f32>,\n  edgeWidthRaw: vec2<f32>,\n  edgeOpacityRaw: vec2<f32>,\n  edgeEndpointSizeRaw: vec2<f32>,\n  _pad2: vec2<f32>,\n  edgeTrim: vec4<f32>, // edgeTrim.x used, rest padding\n  nodeNoStateScale: vec4<f32>, // x=sizeMul y=opacityMul z=outlineMul w=discard(>0.5)\n  nodeNoStateColorMul: vec4<f32>,\n  nodeNoStateColorAdd: vec4<f32>,\n  edgeNoStateScale: vec4<f32>, // x=widthMul y=opacityMul w=discard(>0.5)\n  edgeNoStateColorMul: vec4<f32>,\n  edgeNoStateColorAdd: vec4<f32>,\n  nodeStateScale: array<vec4<f32>, ${STATE_SLOTS}>,\n  nodeStateColorMul: array<vec4<f32>, ${STATE_SLOTS}>,\n  nodeStateColorAdd: array<vec4<f32>, ${STATE_SLOTS}>,\n  edgeStateScale: array<vec4<f32>, ${STATE_SLOTS}>,\n  edgeStateColorMul: array<vec4<f32>, ${STATE_SLOTS}>,\n  edgeStateColorAdd: array<vec4<f32>, ${STATE_SLOTS}>,\n};\n\nstruct EdgeSegments {\n  data: array<f32>, // packed start/end xyz\n};\n\nstruct EdgeColors {\n  data: array<vec4<f32>>,\n};\n\nstruct EdgeIndices {\n  data: array<u32>,\n};\n\nstruct EdgeWidths {\n  data: array<vec2<f32>>,\n};\n\nstruct EdgeEndpointSizes {\n  data: array<vec2<f32>>,\n};\n\nstruct EdgeOpacities {\n  data: array<vec2<f32>>,\n};\n\nstruct EdgeStates {\n  data: array<u32>,\n};\n\n\t\tstruct Hover {\n\t  nodeIndex: u32,\n\t  nodeState: u32,\n\t  edgeIndex: u32,\n\t  edgeState: u32,\n    nodeStateForceMaxAlphaMask: u32,\n    edgeStateForceMaxAlphaMask: u32,\n    nodeVirtual: u32,\n    edgeVirtual: u32,\n    nodeHoverScale: vec4<f32>,\n    nodeHoverColorMul: vec4<f32>,\n    nodeHoverColorAdd: vec4<f32>,\n    edgeHoverScale: vec4<f32>,\n    edgeHoverColorMul: vec4<f32>,\n    edgeHoverColorAdd: vec4<f32>,\n\t};\n\n\t@group(0) @binding(0) var<uniform> camera : Camera;\n\t@group(0) @binding(1) var<storage, read> edgeIndices : EdgeIndices;\n\t@group(0) @binding(2) var<storage, read> edgeSegments : EdgeSegments;\n\t@group(0) @binding(3) var<storage, read> edgeColors : EdgeColors;\n\t@group(0) @binding(4) var<storage, read> edgeWidths : EdgeWidths;\n@group(0) @binding(5) var<storage, read> edgeEndpointSizes : EdgeEndpointSizes;\n\t\t@group(0) @binding(6) var<storage, read> edgeOpacities : EdgeOpacities;\n\t\t@group(0) @binding(7) var<storage, read> edgeStates : EdgeStates;\n  ${EDGE_TARGET_BINDING}\n\t@group(0) @binding(9) var<uniform> globals : Globals;\n\t\t@group(0) @binding(10) var<uniform> hover : Hover;\n\nfn semanticZoomScale() -> f32 {\n  let is2D = camera.position.w > 0.5;\n  if (!is2D) {\n    return 1.0;\n  }\n  let exponent = globals._pad0.x;\n  if (exponent <= 0.0 || exponent != exponent) {\n    return 1.0;\n  }\n  let zoom2D = max(abs(camera.view[0][0]), 1e-3);\n  if (exponent == 1.0) {\n    return 1.0 / zoom2D;\n  }\n  return 1.0 / pow(zoom2D, exponent);\n}\n\nstruct EdgeVertexOutput {\n  @builtin(position) position : vec4<f32>,\n  @location(0) color : vec4<f32>,\n  @location(1) weight : f32,\n  @location(2) @interpolate(flat) discardFlag : u32,\n};\n\n@vertex\nfn edgeVertex(@builtin(vertex_index) vertexIndex : u32) -> EdgeVertexOutput {\n  let edgeSlot = vertexIndex / 2u;\n  var edgeId = edgeSlot;\n  if (USE_EDGE_INDICES) {\n    edgeId = edgeIndices.data[edgeSlot];\n  }\n  let base = edgeId * 6u;\n  var startPos = vec3<f32>(\n    edgeSegments.data[base + 0u],\n    edgeSegments.data[base + 1u],\n    edgeSegments.data[base + 2u]\n  );\n  var endPos = vec3<f32>(\n    edgeSegments.data[base + 3u],\n    edgeSegments.data[base + 4u],\n    edgeSegments.data[base + 5u]\n  );\n\t  var state = edgeStates.data[edgeId];\n\t  if (hover.edgeIndex != 0xffffffffu && edgeId == hover.edgeIndex) {\n\t    if (hover.edgeVirtual == 0u) {\n        state = state | hover.edgeState;\n      }\n\t  }\n    var forceMaxAlpha = (state & hover.edgeStateForceMaxAlphaMask) != 0u;\n\t  var widthMul = 1.0;\n\t  var opacityMul = 1.0;\n\t  var rgbMul = vec3<f32>(1.0, 1.0, 1.0);\n\t  var rgbAdd = vec3<f32>(0.0, 0.0, 0.0);\n\t  var discardFlag = 0u;\n  let virtualHover = hover.edgeIndex != 0xffffffffu && edgeId == hover.edgeIndex && hover.edgeVirtual != 0u;\n  if (state == 0u) {\n    let scale = globals.edgeNoStateScale;\n    widthMul = widthMul * scale.x;\n    opacityMul = opacityMul * scale.y;\n    rgbMul = rgbMul * globals.edgeNoStateColorMul.rgb;\n    rgbAdd = rgbAdd + globals.edgeNoStateColorAdd.rgb;\n    discardFlag = select(0u, 1u, scale.w > 0.5);\n  } else {\n    for (var i = 0u; i < ${STATE_SLOTS}u; i = i + 1u) {\n      let enabled = (state >> i) & 1u;\n      if (enabled == 1u) {\n        let scale = globals.edgeStateScale[i];\n        widthMul = widthMul * scale.x;\n        opacityMul = opacityMul * scale.y;\n        rgbMul = rgbMul * globals.edgeStateColorMul[i].rgb;\n        rgbAdd = rgbAdd + globals.edgeStateColorAdd[i].rgb;\n        if (scale.w > 0.5) {\n          discardFlag = 1u;\n        }\n      }\n    }\n  }\n  if (virtualHover) {\n    let scale = hover.edgeHoverScale;\n    widthMul = widthMul * scale.x;\n    opacityMul = opacityMul * scale.y;\n    rgbMul = rgbMul * hover.edgeHoverColorMul.rgb;\n    rgbAdd = rgbAdd + hover.edgeHoverColorAdd.rgb;\n    if (scale.w > 0.5) {\n      discardFlag = 1u;\n    }\n    forceMaxAlpha = forceMaxAlpha || hover.edgeHoverColorMul.a > 1.5;\n  }\n\n  let endpointSize = select(globals.edgeEndpointSizeRaw, edgeEndpointSizes.data[edgeId], USE_EDGE_ENDPOINT_SIZE_BUFFER);\n  let endpointState = vec2<u32>(0u, 0u);\n  var startSizeMul = 1.0;\n  var endSizeMul = 1.0;\n  if (endpointState.x == 0u) {\n    startSizeMul = startSizeMul * globals.nodeNoStateScale.x;\n  } else {\n    for (var i = 0u; i < ${STATE_SLOTS}u; i = i + 1u) {\n      let slotMul = globals.nodeStateScale[i].x;\n      if (((endpointState.x >> i) & 1u) == 1u) {\n        startSizeMul = startSizeMul * slotMul;\n      }\n    }\n  }\n  if (endpointState.y == 0u) {\n    endSizeMul = endSizeMul * globals.nodeNoStateScale.x;\n  } else {\n    for (var i = 0u; i < ${STATE_SLOTS}u; i = i + 1u) {\n      let slotMul = globals.nodeStateScale[i].x;\n      if (((endpointState.y >> i) & 1u) == 1u) {\n        endSizeMul = endSizeMul * slotMul;\n      }\n    }\n  }\n  let dirRaw = endPos - startPos;\n  let dirLen = max(length(dirRaw), 1e-5);\n  let dir = dirRaw / vec3<f32>(dirLen);\n  let semanticScale = semanticZoomScale();\n  let startRadius = max((globals.nodeSize.x + globals.nodeSize.y * endpointSize.x) * startSizeMul, 0.0) * 0.5 * semanticScale;\n  let endRadius = max((globals.nodeSize.x + globals.nodeSize.y * endpointSize.y) * endSizeMul, 0.0) * 0.5 * semanticScale;\n  let trimStart = startRadius * globals.edgeTrim.x;\n  let trimEnd = endRadius * globals.edgeTrim.x;\n  startPos = startPos + dir * trimStart;\n  endPos = endPos - dir * trimEnd;\n  var position = startPos;\n  if ((vertexIndex & 1u) == 1u) {\n    position = endPos;\n  }\n  let colorStart = select(globals.edgeColorStart, edgeColors.data[edgeId * 2u], USE_EDGE_COLOR_BUFFER);\n  let colorEnd = select(globals.edgeColorEnd, edgeColors.data[edgeId * 2u + 1u], USE_EDGE_COLOR_BUFFER);\n  let endpointWidth = select(globals.edgeWidthRaw, edgeWidths.data[edgeId], USE_EDGE_WIDTH_BUFFER);\n  let opacityPair = select(globals.edgeOpacityRaw, edgeOpacities.data[edgeId], USE_EDGE_OPACITY_BUFFER);\n  let color = select(colorStart, colorEnd, (vertexIndex & 1u) == 1u);\n  var width = (globals.edgeWidth.x + globals.edgeWidth.y * select(endpointWidth.x, endpointWidth.y, (vertexIndex & 1u) == 1u)) * widthMul * semanticScale;\n  ${edgeWidthClampToNodeDiameter\n    ? `\n  let maxEndpointWidth = max(select(startRadius, endRadius, (vertexIndex & 1u) == 1u) * 2.0, 0.0);\n  width = min(max(width, 0.0), maxEndpointWidth);\n`\n    : ''}\n  let attrOpacity = select(opacityPair.x, opacityPair.y, (vertexIndex & 1u) == 1u);\n  let opacity = clamp(globals.edgeOpacity.x + globals.edgeOpacity.y * attrOpacity, 0.0, 1.0) * opacityMul;\n  let rgb = clamp(color.rgb * rgbMul + rgbAdd, vec3<f32>(0.0), vec3<f32>(1.0));\n  let weight = max(opacity * color.a, 0.0);\n  let alpha = clamp(weight, 0.0, 1.0);\n  var output : EdgeVertexOutput;\n  output.position = camera.viewProjection * vec4<f32>(position, 1.0);\n  output.color = vec4<f32>(rgb, select(alpha, 1.0, forceMaxAlpha));\n  output.weight = select(weight, max(weight, ${FORCE_VISIBILITY_BOOST.toFixed(1)}), forceMaxAlpha);\n  output.discardFlag = discardFlag;\n  return output;\n}\n\nstruct EdgeQuadInput {\n  @location(0) corner : vec2<f32>,\n  @builtin(instance_index) instance : u32,\n};\n\n@vertex\nfn edgeQuadVertex(input : EdgeQuadInput) -> EdgeVertexOutput {\n  var edgeId = input.instance;\n  if (USE_EDGE_INDICES) {\n    edgeId = edgeIndices.data[input.instance];\n  }\n  let base = edgeId * 6u;\n  var startPos = vec3<f32>(\n    edgeSegments.data[base + 0u],\n    edgeSegments.data[base + 1u],\n    edgeSegments.data[base + 2u]\n  );\n  var endPos = vec3<f32>(\n    edgeSegments.data[base + 3u],\n    edgeSegments.data[base + 4u],\n    edgeSegments.data[base + 5u]\n  );\n\t  var state = edgeStates.data[edgeId];\n\t  if (hover.edgeIndex != 0xffffffffu && edgeId == hover.edgeIndex) {\n\t    if (hover.edgeVirtual == 0u) {\n        state = state | hover.edgeState;\n      }\n\t  }\n    var forceMaxAlpha = (state & hover.edgeStateForceMaxAlphaMask) != 0u;\n\t  var widthMul = 1.0;\n\t  var opacityMul = 1.0;\n\t  var rgbMul = vec3<f32>(1.0, 1.0, 1.0);\n\t  var rgbAdd = vec3<f32>(0.0, 0.0, 0.0);\n\t  var discardFlag = 0u;\n  let virtualHover = hover.edgeIndex != 0xffffffffu && edgeId == hover.edgeIndex && hover.edgeVirtual != 0u;\n  if (state == 0u) {\n    let scale = globals.edgeNoStateScale;\n    widthMul = widthMul * scale.x;\n    opacityMul = opacityMul * scale.y;\n    rgbMul = rgbMul * globals.edgeNoStateColorMul.rgb;\n    rgbAdd = rgbAdd + globals.edgeNoStateColorAdd.rgb;\n    discardFlag = select(0u, 1u, scale.w > 0.5);\n  } else {\n    for (var i = 0u; i < ${STATE_SLOTS}u; i = i + 1u) {\n      let enabled = (state >> i) & 1u;\n      if (enabled == 1u) {\n        let scale = globals.edgeStateScale[i];\n        widthMul = widthMul * scale.x;\n        opacityMul = opacityMul * scale.y;\n        rgbMul = rgbMul * globals.edgeStateColorMul[i].rgb;\n        rgbAdd = rgbAdd + globals.edgeStateColorAdd[i].rgb;\n        if (scale.w > 0.5) {\n          discardFlag = 1u;\n        }\n      }\n    }\n  }\n  if (virtualHover) {\n    let scale = hover.edgeHoverScale;\n    widthMul = widthMul * scale.x;\n    opacityMul = opacityMul * scale.y;\n    rgbMul = rgbMul * hover.edgeHoverColorMul.rgb;\n    rgbAdd = rgbAdd + hover.edgeHoverColorAdd.rgb;\n    if (scale.w > 0.5) {\n      discardFlag = 1u;\n    }\n    forceMaxAlpha = forceMaxAlpha || hover.edgeHoverColorMul.a > 1.5;\n  }\n\n  let endpointSize = select(globals.edgeEndpointSizeRaw, edgeEndpointSizes.data[edgeId], USE_EDGE_ENDPOINT_SIZE_BUFFER);\n  let endpointWidth = select(globals.edgeWidthRaw, edgeWidths.data[edgeId], USE_EDGE_WIDTH_BUFFER);\n  let opacityPair = select(globals.edgeOpacityRaw, edgeOpacities.data[edgeId], USE_EDGE_OPACITY_BUFFER);\n  let endpointState = vec2<u32>(0u, 0u);\n  var startSizeMul = 1.0;\n  var endSizeMul = 1.0;\n  if (endpointState.x == 0u) {\n    startSizeMul = startSizeMul * globals.nodeNoStateScale.x;\n  } else {\n    for (var i = 0u; i < ${STATE_SLOTS}u; i = i + 1u) {\n      let slotMul = globals.nodeStateScale[i].x;\n      if (((endpointState.x >> i) & 1u) == 1u) {\n        startSizeMul = startSizeMul * slotMul;\n      }\n    }\n  }\n  if (endpointState.y == 0u) {\n    endSizeMul = endSizeMul * globals.nodeNoStateScale.x;\n  } else {\n    for (var i = 0u; i < ${STATE_SLOTS}u; i = i + 1u) {\n      let slotMul = globals.nodeStateScale[i].x;\n      if (((endpointState.y >> i) & 1u) == 1u) {\n        endSizeMul = endSizeMul * slotMul;\n      }\n    }\n  }\n  let cornerT = clamp(input.corner.x, 0.0, 1.0);\n  let semanticScale = semanticZoomScale();\n  var width = max((globals.edgeWidth.x + globals.edgeWidth.y * mix(endpointWidth.x, endpointWidth.y, cornerT)) * widthMul, 0.0) * semanticScale;\n  let dirRaw = endPos - startPos;\n  let dirLenWorld = max(length(dirRaw), 1e-5);\n  let dir = dirRaw / vec3<f32>(dirLenWorld);\n  let startRadius = max((globals.nodeSize.x + globals.nodeSize.y * endpointSize.x) * startSizeMul, 0.0) * 0.5 * semanticScale;\n  let endRadius = max((globals.nodeSize.x + globals.nodeSize.y * endpointSize.y) * endSizeMul, 0.0) * 0.5 * semanticScale;\n  ${edgeWidthClampToNodeDiameter\n    ? `\n  let maxSegmentWidth = max(mix(startRadius, endRadius, cornerT) * 2.0, 0.0);\n  width = min(max(width, 0.0), maxSegmentWidth);\n`\n    : ''}\n  let trimStart = startRadius * globals.edgeTrim.x;\n  let trimEnd = endRadius * globals.edgeTrim.x;\n  startPos = startPos + dir * trimStart;\n  endPos = endPos - dir * trimEnd;\n\n  let halfWidth = max(width, 1e-3) * 0.5;\n  let centerPos = mix(startPos, endPos, cornerT);\n  var widthDir = vec3<f32>(-dir.y, dir.x, 0.0);\n  if (camera.position.w <= 0.5) {\n    let viewDirRaw = camera.position.xyz - centerPos;\n    let viewDirLen = max(length(viewDirRaw), 1e-5);\n    let viewDir = viewDirRaw / vec3<f32>(viewDirLen);\n    widthDir = cross(viewDir, dir);\n    var widthDirLen = length(widthDir);\n    if (widthDirLen <= 1e-5) {\n      widthDir = cross(normalize(camera.up.xyz), dir);\n      widthDirLen = length(widthDir);\n    }\n    if (widthDirLen <= 1e-5) {\n      widthDir = cross(dir, normalize(camera.right.xyz));\n      widthDirLen = length(widthDir);\n    }\n    widthDir = select(\n      vec3<f32>(0.0, 1.0, 0.0),\n      widthDir / vec3<f32>(max(widthDirLen, 1e-5)),\n      widthDirLen > 1e-5\n    );\n  } else {\n    widthDir = normalize(widthDir);\n  }\n  let worldPos = centerPos + widthDir * halfWidth * input.corner.y;\n  let clipPos = camera.viewProjection * vec4<f32>(worldPos, 1.0);\n  var output : EdgeVertexOutput;\n  output.position = clipPos;\n  let colorStart = select(globals.edgeColorStart, edgeColors.data[edgeId * 2u], USE_EDGE_COLOR_BUFFER);\n  let colorEnd = select(globals.edgeColorEnd, edgeColors.data[edgeId * 2u + 1u], USE_EDGE_COLOR_BUFFER);\n  let blended = mix(colorStart, colorEnd, cornerT);\n  let blendedOpacity = mix(opacityPair.x, opacityPair.y, cornerT);\n  let opacity = clamp(globals.edgeOpacity.x + globals.edgeOpacity.y * blendedOpacity, 0.0, 1.0) * opacityMul;\n  let weight = max(opacity * blended.a, 0.0);\n  let alpha = clamp(weight, 0.0, 1.0);\n  let rgb = clamp(blended.rgb * rgbMul + rgbAdd, vec3<f32>(0.0), vec3<f32>(1.0));\n  output.color = vec4<f32>(rgb, select(alpha, 1.0, forceMaxAlpha));\n  output.weight = select(weight, max(weight, ${FORCE_VISIBILITY_BOOST.toFixed(1)}), forceMaxAlpha);\n  output.discardFlag = discardFlag;\n  return output;\n}\n\n@fragment\nfn edgeFragment(input : EdgeVertexOutput) -> @location(0) vec4<f32> {\n  if (input.discardFlag == 1u) {\n    discard;\n  }\n  return vec4<f32>(input.color.rgb, input.color.a);\n}\n\n@fragment\nfn edgePremulFragment(input : EdgeVertexOutput) -> @location(0) vec4<f32> {\n  if (input.discardFlag == 1u) {\n    discard;\n  }\n  return vec4<f32>(input.color.rgb * input.color.a, input.color.a);\n}\n`;\n\n  const EDGE_WEIGHTED_WGSL = /* wgsl */ `\n${EDGE_WGSL}\n\nstruct EdgeWeightedOutput {\n  @location(0) colorAccum : vec4<f32>,\n  @location(1) weightAccum : vec4<f32>,\n};\n\n@fragment\nfn edgeWeightedFragment(input : EdgeVertexOutput) -> EdgeWeightedOutput {\n  if (input.discardFlag == 1u) {\n    discard;\n  }\n  let weight = input.weight;\n  var output : EdgeWeightedOutput;\n  output.colorAccum = vec4<f32>(input.color.rgb * weight, weight);\n  output.weightAccum = vec4<f32>(weight, 0.0, 0.0, 0.0);\n  return output;\n}`;\n\n  return {\n    NODE_WGSL,\n    EDGE_WGSL,\n    EDGE_WEIGHTED_WGSL,\n  };\n}\n\nconst EDGE_WEIGHTED_RESOLVE_SHARED_WGSL = /* wgsl */ `\nstruct VertexOut {\n  @builtin(position) position : vec4<f32>,\n  @location(0) uv : vec2<f32>,\n};\n\n@vertex\nfn vs(@location(0) position : vec2<f32>, @location(1) uv : vec2<f32>) -> VertexOut {\n  var output : VertexOut;\n  output.position = vec4<f32>(position, 0.0, 1.0);\n  output.uv = uv;\n  return output;\n}\n\n@group(0) @binding(0) var textureSampler : sampler;\n@group(0) @binding(1) var colorTexture : texture_2d<f32>;\n@group(0) @binding(2) var weightTexture : texture_2d<f32>;\n\nfn resolveWeighted(uv : vec2<f32>) -> vec4<f32> {\n  // Render targets in WebGPU are addressed with a top-left origin, so the\n  // fullscreen quad UVs must flip Y to match clip-space rasterization.\n  let uvFlipped = vec2<f32>(uv.x, 1.0 - uv.y);\n  let accum = textureSample(colorTexture, textureSampler, uvFlipped).rgb;\n  let weight = textureSample(weightTexture, textureSampler, uvFlipped).r;\n  let denom = max(weight, 1e-4);\n  let resolved = accum / vec3<f32>(denom);\n  let alpha = clamp(weight, 0.0, 1.0);\n  return vec4<f32>(resolved * alpha, alpha);\n}\n`;\n\nexport const EDGE_WEIGHTED_RESOLVE_WGSL = /* wgsl */ `\n${EDGE_WEIGHTED_RESOLVE_SHARED_WGSL}\n\n@fragment\nfn fs(input : VertexOut) -> @location(0) vec4<f32> {\n  return resolveWeighted(input.uv);\n}`;\n\nexport function createEdgeWeightedResolveTonemapWGSL(options) {\n  const boost = options === 'boost' || options?.boost === true;\n  if (boost) {\n    return /* wgsl */ `\n${EDGE_WEIGHTED_RESOLVE_SHARED_WGSL}\n\n@fragment\nfn fs(input : VertexOut) -> @location(0) vec4<f32> {\n  let base = resolveWeighted(input.uv);\n  let alpha = base.a;\n  let unpremul = base.rgb / vec3<f32>(max(alpha, 1e-4));\n  let boost = clamp(alpha, 0.0, 4.0);\n  let boosted = unpremul * boost;\n  let tonemapped = boosted / (boosted + vec3<f32>(1.0));\n  return vec4<f32>(tonemapped * alpha, alpha);\n}`;\n  }\n  return /* wgsl */ `\n${EDGE_WEIGHTED_RESOLVE_SHARED_WGSL}\n\n@fragment\nfn fs(input : VertexOut) -> @location(0) vec4<f32> {\n  let base = resolveWeighted(input.uv);\n  let alpha = base.a;\n  let unpremul = base.rgb / vec3<f32>(max(alpha, 1e-4));\n  let tonemapped = unpremul / (unpremul + vec3<f32>(1.0));\n  return vec4<f32>(tonemapped * alpha, alpha);\n}`;\n}\n","// Minimal pass runner that executes a list of pass functions in order.\n// Each pass receives (context, resources) and may be async. Context is the\n// backend-specific per-frame context produced by the device.\nexport class FrameGraphRunner {\n  constructor() {\n    this.resources = Object.create(null);\n  }\n\n  setResource(name, value) {\n    this.resources[name] = value;\n  }\n\n  clearResources() {\n    this.resources = Object.create(null);\n  }\n\n  async run(passes, context) {\n    if (!Array.isArray(passes) || !passes.length) return;\n    for (const pass of passes) {\n      // Run sync passes without yielding; only await when a pass returns a promise.\n      const result = pass(context, this.resources);\n      if (result && typeof result.then === 'function') {\n        // eslint-disable-next-line no-await-in-loop\n        await result;\n      }\n    }\n  }\n}\n\nexport default FrameGraphRunner;\n","export function bumpCounter(current) {\n  const value = Number(current);\n  if (!Number.isFinite(value) || value < 0) return 0;\n  if (value >= Number.MAX_SAFE_INTEGER) return 0;\n  return value + 1;\n}\n\n","import {\n  createGraphWebGPUSources,\n  EDGE_WEIGHTED_RESOLVE_WGSL,\n  createEdgeWeightedResolveTonemapWGSL,\n} from './shaders/graphWebGPUBase.js';\nimport {\n  GraphLayer,\n  SHADED_LIGHT_DIRECTION_DEFAULT,\n  SHADED_LIGHT_COLOR_DEFAULT,\n  SHADED_AMBIENT_STRENGTH_DEFAULT,\n  SHADED_AMBIENT_TOP_COLOR_DEFAULT,\n  SHADED_AMBIENT_BOTTOM_COLOR_DEFAULT,\n  SHADED_DIFFUSE_STRENGTH_DEFAULT,\n  SHADED_SPECULAR_COLOR_DEFAULT,\n  SHADED_SPECULAR_STRENGTH_DEFAULT,\n  SHADED_SHININESS_DEFAULT,\n} from './GraphLayer.js';\nimport { FrameGraphRunner } from './framegraph/FrameGraphRunner.js';\nimport { bumpCounter } from '../../utilities/counters.js';\n\nexport class GraphLayerWebGPUBase extends GraphLayer {\n  constructor(options = {}) {\n    super(options);\n    this.device = null;\n\n    this.frameGraph = new FrameGraphRunner();\n\n    this.nodeBindGroupLayout = null;\n    this.nodeBindGroupLayoutOutline = null;\n    this.edgeBindGroupLayout = null;\n    this.nodePipelineCache = new Map();\n    this.nodeModules = new Map();\n    this.edgePipeline = null;\n    this.edgeQuadPipeline = null;\n    this.edgeWeightedPipeline = null;\n    this.edgeWeightedQuadPipeline = null;\n    this.edgeResolvePipeline = null;\n    this.edgeResolvePipelineCache = new Map();\n    this.edgeResolveModuleCache = new Map();\n    this.edgeResolveBindGroup = null;\n    this.edgeResolveLayout = null;\n    this.weightedSampler = null;\n    this.weightedTextures = null;\n    this.weightedSupported = null;\n    this.warnedWeightedFallback = false;\n    this.edgePipelineCache = new Map();\n    this.edgeQuadPipelineCache = new Map();\n    this.currentEdgeBlend = 'alpha';\n    this.edgeWeightedModule = null;\n    this.edgeResolveModule = null;\n    this.weightedPipelineFormats = null;\n    this.nodeBindGroup = null;\n    this.nodeBindGroupOutline = null;\n    this.edgeBindGroup = null;\n    this.edgeModules = new Map();\n    this.edgeWeightedModules = new Map();\n    this.edgeWeightedUseIndices = null;\n    this.baseDepthStencil = null;\n    this.cameraArray = null;\n    this.cameraBuffer = null;\n    this.globalsArray = null;\n    this.globalsBuffer = null;\n    this.hoverArray = null;\n    this.hoverU32Array = null;\n    this.hoverBuffer = null;\n    this.shadingArray = null;\n    this.shadingBuffer = null;\n    this.nodeBuffersGpu = {};\n    this.edgeBuffersGpu = {};\n    this.nodeQuadBufferGpu = null;\n    this.edgeQuadBufferGpu = null;\n    this._dummyIndexArray = new Uint32Array([0]);\n    this._nodeDataCache = { count: 0 };\n    this._edgeDataCache = { count: 0 };\n    this._nodeVersionsLast = null;\n    this._nodeVersionsLastOutline = null;\n    this._edgeVersionsLast = null;\n    this._shaderSources = null;\n    this.counters = { weightedAttachmentRenders: 0 };\n\n    this._nodeBuffersLastOutline = null;\n    this._nodeOutlineUseAttributesLast = this.nodeOutlineUseAttributes === true;\n  }\n\n  initialize(device, size) {\n    if (device?.type !== 'webgpu') {\n      throw new Error('GraphLayerWebGPU requires a WebGPU device.');\n    }\n    super.initialize(device, size);\n    this.device = device;\n    this.weightedSupported = Boolean((device?.device?.limits?.maxColorAttachments ?? 1) >= 2);\n    this.edgeTransparencyMode = this.normalizeEdgeTransparencyMode(this.edgeTransparencyMode);\n    this.initializeWebGPU(device);\n    this.resize(size);\n  }\n\n  resize(size) {\n    super.resize(size);\n  }\n\n  destroy() {\n    // GPU buffers are cached at the device level for reuse across passes.\n    // They are destroyed by the device cache on device teardown.\n    this.cameraBuffer?.destroy?.();\n    this.globalsBuffer?.destroy?.();\n    this.hoverBuffer?.destroy?.();\n    this.shadingBuffer?.destroy?.();\n    this.nodeQuadBufferGpu?.destroy?.();\n    this.edgeQuadBufferGpu?.destroy?.();\n    this.weightedTextures?.color?.destroy?.();\n    this.weightedTextures?.weight?.destroy?.();\n  }\n\n  setEdgeRenderingMode(mode) {\n    super.setEdgeRenderingMode(mode);\n  }\n\n  initializeWebGPU(device) {\n    this.cameraArray = new Float32Array(48);\n    this.cameraBuffer = device.device.createBuffer({\n      size: this.cameraArray.byteLength,\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n    });\n    const globalsFloats = 74 + this.stateSlotCount * 24;\n    this.globalsArray = new Float32Array(globalsFloats);\n    this.globalsBuffer = device.device.createBuffer({\n      size: this.globalsArray.byteLength,\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n    });\n    this.hoverArray = new Float32Array(32);\n    this.hoverU32Array = new Uint32Array(this.hoverArray.buffer);\n    this.hoverU32Array[0] = GraphLayer.NO_HOVER_INDEX;\n    this.hoverU32Array[2] = GraphLayer.NO_HOVER_INDEX;\n    this.hoverBuffer = device.device.createBuffer({\n      size: this.hoverArray.byteLength,\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n    });\n    this.shadingArray = new Float32Array(24);\n    this.shadingBuffer = device.device.createBuffer({\n      size: this.shadingArray.byteLength,\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n    });\n    const quad = new Float32Array([\n      -1, -1,\n      1, -1,\n      -1, 1,\n      1, 1,\n    ]);\n    this.nodeQuadBufferGpu = device.device.createBuffer({\n      size: quad.byteLength,\n      usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n      mappedAtCreation: true,\n    });\n    new Float32Array(this.nodeQuadBufferGpu.getMappedRange()).set(quad);\n    this.nodeQuadBufferGpu.unmap();\n    const edgeQuad = new Float32Array([\n      0, 1,\n      0, -1,\n      1, 1,\n      1, -1,\n    ]);\n    this.edgeQuadBufferGpu = device.device.createBuffer({\n      size: edgeQuad.byteLength,\n      usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n      mappedAtCreation: true,\n    });\n    new Float32Array(this.edgeQuadBufferGpu.getMappedRange()).set(edgeQuad);\n    this.edgeQuadBufferGpu.unmap();\n\n    this.nodeBindGroupLayout = device.device.createBindGroupLayout({\n      entries: [\n        { binding: 0, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n        { binding: 1, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n        { binding: 2, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n        { binding: 3, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n        {\n          binding: 4,\n          visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n          buffer: { type: 'read-only-storage' },\n        },\n        { binding: 5, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n        { binding: 6, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n        { binding: 7, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n        { binding: 10, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n      ],\n    });\n    this.nodeBindGroupLayoutOutline = device.device.createBindGroupLayout({\n      entries: [\n        { binding: 0, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n        { binding: 1, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n        { binding: 2, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n        { binding: 3, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n        {\n          binding: 4,\n          visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n          buffer: { type: 'read-only-storage' },\n        },\n        { binding: 5, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n        { binding: 6, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n        { binding: 7, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n        { binding: 8, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n        { binding: 9, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n        { binding: 10, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n      ],\n    });\n    this.edgeBindGroupLayout = device.device.createBindGroupLayout({\n      entries: [\n        { binding: 0, visibility: GPUShaderStage.VERTEX, buffer: { type: 'uniform' } },\n        { binding: 1, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n        { binding: 2, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n        {\n          binding: 3,\n          visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n          buffer: { type: 'read-only-storage' },\n        },\n        { binding: 4, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n        { binding: 5, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n        { binding: 6, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'read-only-storage' } },\n        { binding: 7, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'read-only-storage' } },\n        { binding: 8, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n        { binding: 9, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n        { binding: 10, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n      ],\n    });\n    this.nodeModules.clear();\n    this.edgeModules.clear();\n    this.edgeWeightedModules.clear();\n    this._shaderSources = null;\n    const depthStencil = {\n      format: device.depthFormat ?? 'depth24plus',\n      depthWriteEnabled: true,\n      depthCompare: 'less-equal',\n    };\n    this.baseDepthStencil = depthStencil;\n    const alphaBlend = {\n      color: {\n        srcFactor: 'src-alpha',\n        dstFactor: 'one-minus-src-alpha',\n        operation: 'add',\n      },\n      alpha: {\n        srcFactor: 'src-alpha',\n        dstFactor: 'one-minus-src-alpha',\n        operation: 'add',\n      },\n    };\n\n    this.nodePipelineCache.clear();\n    this.edgePipelineCache.clear();\n    this.edgeQuadPipelineCache.clear();\n  }\n\n  getVisualConfig(network) {\n    const cfg = network && network.__heliosVisualConfig;\n    return cfg && typeof cfg === 'object' ? cfg : null;\n  }\n\n  resolveNodeVariant(visualConfig) {\n    const nodeCfg = visualConfig?.node;\n    if (!nodeCfg) {\n      const outlineToggle = this.nodeOutlineUseAttributes === true;\n      return {\n        colorBuffer: true,\n        sizeBuffer: true,\n        outlineWidthBuffer: outlineToggle,\n        outlineColorBuffer: outlineToggle,\n      };\n    }\n    return {\n      colorBuffer: nodeCfg?.color?.mode !== 'uniform',\n      sizeBuffer: nodeCfg?.size?.mode !== 'uniform',\n      outlineWidthBuffer: nodeCfg?.outline?.mode !== 'uniform',\n      outlineColorBuffer: nodeCfg?.outlineColor?.mode !== 'uniform',\n    };\n  }\n\n  resolveEdgeVariant(visualConfig) {\n    const edgeCfg = visualConfig?.edge;\n    if (!edgeCfg) {\n      return {\n        colorBuffer: true,\n        widthBuffer: true,\n        opacityBuffer: true,\n        endpointSizeBuffer: true,\n        widthClampToNodeDiameter: this.edgeWidthClampToNodeDiameter !== false,\n      };\n    }\n    return {\n      colorBuffer: edgeCfg?.color?.mode !== 'uniform',\n      widthBuffer: edgeCfg?.width?.mode !== 'uniform',\n      opacityBuffer: edgeCfg?.opacity?.mode !== 'uniform',\n      endpointSizeBuffer: edgeCfg?.endpointSize?.mode !== 'uniform',\n      widthClampToNodeDiameter: this.edgeWidthClampToNodeDiameter !== false,\n    };\n  }\n\n  getNodeVariantKey(useIndices, variant) {\n    return [\n      useIndices ? 'idx' : 'id',\n      variant?.colorBuffer ? 'cB' : 'cU',\n      variant?.sizeBuffer ? 'sB' : 'sU',\n      variant?.outlineWidthBuffer ? 'owB' : 'owU',\n      variant?.outlineColorBuffer ? 'ocB' : 'ocU',\n    ].join('|');\n  }\n\n  getNodeModule(useIndices, variant) {\n    const key = this.getNodeVariantKey(useIndices, variant);\n    if (this.nodeModules.has(key)) return this.nodeModules.get(key);\n    const device = this.device?.device;\n    if (!device) return null;\n    const sources = createGraphWebGPUSources(this.stateSlotCount, {\n      useNodeIndices: useIndices,\n      useEdgeIndices: true,\n      node: {\n        color: variant?.colorBuffer ? 'buffer' : 'uniform',\n        size: variant?.sizeBuffer ? 'buffer' : 'uniform',\n        outline: variant?.outlineWidthBuffer ? 'buffer' : 'uniform',\n        outlineColor: variant?.outlineColorBuffer ? 'buffer' : 'uniform',\n      },\n    });\n    const module = device.createShaderModule({ code: sources.NODE_WGSL });\n    this.nodeModules.set(key, module);\n    return module;\n  }\n\n  getEdgeVariantKey(useIndices, variant) {\n    return [\n      useIndices ? 'idx' : 'id',\n      variant?.colorBuffer ? 'cB' : 'cU',\n      variant?.widthBuffer ? 'wB' : 'wU',\n      variant?.opacityBuffer ? 'oB' : 'oU',\n      variant?.endpointSizeBuffer ? 'esB' : 'esU',\n      variant?.widthClampToNodeDiameter ? 'wc1' : 'wc0',\n    ].join('|');\n  }\n\n  getEdgeModule(useIndices, variant) {\n    const key = this.getEdgeVariantKey(useIndices, variant);\n    if (this.edgeModules.has(key)) return this.edgeModules.get(key);\n    const device = this.device?.device;\n    if (!device) return null;\n    const sources = createGraphWebGPUSources(this.stateSlotCount, {\n      useNodeIndices: true,\n      useEdgeIndices: useIndices,\n      edge: {\n        color: variant?.colorBuffer ? 'buffer' : 'uniform',\n        width: variant?.widthBuffer ? 'buffer' : 'uniform',\n        opacity: variant?.opacityBuffer ? 'buffer' : 'uniform',\n        endpointSize: variant?.endpointSizeBuffer ? 'buffer' : 'uniform',\n        widthClampToNodeDiameter: variant?.widthClampToNodeDiameter === true,\n      },\n    });\n    const module = device.createShaderModule({ code: sources.EDGE_WGSL });\n    this.edgeModules.set(key, module);\n    return module;\n  }\n\n  getEdgeWeightedModule(useIndices, variant) {\n    const key = this.getEdgeVariantKey(useIndices, variant);\n    if (this.edgeWeightedModules.has(key)) return this.edgeWeightedModules.get(key);\n    const device = this.device?.device;\n    if (!device) return null;\n    const sources = createGraphWebGPUSources(this.stateSlotCount, {\n      useNodeIndices: true,\n      useEdgeIndices: useIndices,\n      edge: {\n        color: variant?.colorBuffer ? 'buffer' : 'uniform',\n        width: variant?.widthBuffer ? 'buffer' : 'uniform',\n        opacity: variant?.opacityBuffer ? 'buffer' : 'uniform',\n        endpointSize: variant?.endpointSizeBuffer ? 'buffer' : 'uniform',\n        widthClampToNodeDiameter: variant?.widthClampToNodeDiameter === true,\n      },\n    });\n    const module = device.createShaderModule({ code: sources.EDGE_WEIGHTED_WGSL });\n    this.edgeWeightedModules.set(key, module);\n    return module;\n  }\n\n  getNodePipeline(useIndices, variant, options = {}) {\n    const useOutlineAttributes = Boolean(variant?.outlineWidthBuffer || variant?.outlineColorBuffer);\n    const blendKey = options.blendKey ?? 'alpha';\n    const depthMode = options.depthMode ?? 'depth';\n    const sampleCount = Number.isFinite(options.sampleCount) && options.sampleCount > 1 ? 4 : 1;\n    const key = `${this.getNodeVariantKey(useIndices, variant)}|b:${blendKey}|d:${depthMode}|s:${sampleCount}`;\n    if (this.nodePipelineCache.has(key)) return this.nodePipelineCache.get(key);\n    const device = this.device?.device;\n    const nodeModule = this.getNodeModule(useIndices, variant);\n    const bindGroupLayout = useOutlineAttributes\n      ? this.nodeBindGroupLayoutOutline\n      : this.nodeBindGroupLayout;\n    if (!device || !nodeModule || !bindGroupLayout || !this.baseDepthStencil) return null;\n\n    const alphaBlend = {\n      color: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n      alpha: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n    };\n    const blend = options.blend ?? alphaBlend;\n    const depthStencil = depthMode === 'none'\n      ? { ...this.baseDepthStencil, depthWriteEnabled: false, depthCompare: 'always' }\n      : this.baseDepthStencil;\n\n    const pipeline = device.createRenderPipeline({\n      layout: device.createPipelineLayout({ bindGroupLayouts: [bindGroupLayout] }),\n      vertex: {\n        module: nodeModule,\n        entryPoint: 'nodeVertex',\n        buffers: [\n          {\n            arrayStride: 8,\n            attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x2' }],\n            stepMode: 'vertex',\n          },\n        ],\n      },\n      fragment: {\n        module: nodeModule,\n        entryPoint: 'nodeFragment',\n        targets: [{ format: this.device.format, blend }],\n      },\n      depthStencil,\n      multisample: { count: sampleCount },\n      primitive: { topology: 'triangle-strip' },\n    });\n\n    this.nodePipelineCache.set(key, pipeline);\n    return pipeline;\n  }\n\n  getBlendForMode(mode) {\n    switch (mode) {\n      case 'additive':\n        return { key: 'additive', fragment: 'edgeFragment', blend: { color: { srcFactor: 'src-alpha', dstFactor: 'one', operation: 'add' }, alpha: { srcFactor: 'src-alpha', dstFactor: 'one', operation: 'add' } } };\n      case 'screen':\n        return { key: 'screen', fragment: 'edgePremulFragment', blend: { color: { srcFactor: 'one', dstFactor: 'one-minus-src', operation: 'add' }, alpha: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' } } };\n      case 'max':\n        return { key: 'max', fragment: 'edgeFragment', blend: { color: { srcFactor: 'one', dstFactor: 'one', operation: 'max' }, alpha: { srcFactor: 'one', dstFactor: 'one', operation: 'max' } } };\n      default:\n        return {\n          key: 'alpha',\n          fragment: 'edgeFragment',\n          blend: {\n            color: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n            alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n          },\n        };\n    }\n  }\n\n  createEdgePipelines(key, blend, edgeModule, depthStencil, fragmentEntryPoint, useIndices, edgeVariant, depthWriteEnabled, sampleCount = 1) {\n    const device = this.device?.device;\n    if (!device || !edgeModule || !depthStencil) return;\n    const edgeLayout = this.edgeBindGroupLayout;\n    const linePipeline = device.createRenderPipeline({\n      layout: device.createPipelineLayout({ bindGroupLayouts: [edgeLayout] }),\n      vertex: { module: edgeModule, entryPoint: 'edgeVertex' },\n      fragment: {\n        module: edgeModule,\n        entryPoint: fragmentEntryPoint,\n        targets: [{ format: this.device.format, blend }],\n      },\n      depthStencil: { ...depthStencil, depthWriteEnabled: Boolean(depthWriteEnabled) },\n      multisample: { count: sampleCount },\n      primitive: { topology: 'line-list' },\n    });\n\n    const quadPipeline = device.createRenderPipeline({\n      layout: device.createPipelineLayout({ bindGroupLayouts: [edgeLayout] }),\n      vertex: {\n        module: edgeModule,\n        entryPoint: 'edgeQuadVertex',\n        buffers: [\n          {\n            arrayStride: 8,\n            attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x2' }],\n            stepMode: 'vertex',\n          },\n        ],\n      },\n      fragment: {\n        module: edgeModule,\n        entryPoint: fragmentEntryPoint,\n        targets: [{ format: this.device.format, blend }],\n      },\n      depthStencil: { ...depthStencil, depthWriteEnabled: Boolean(depthWriteEnabled) },\n      multisample: { count: sampleCount },\n      primitive: { topology: 'triangle-strip' },\n    });\n\n    const variantKey = this.getEdgeVariantKey(useIndices, edgeVariant);\n    const cacheKey = `${key}|${variantKey}|d${depthWriteEnabled ? 1 : 0}|s${sampleCount}`;\n    this.edgePipelineCache.set(cacheKey, linePipeline);\n    this.edgeQuadPipelineCache.set(cacheKey, quadPipeline);\n  }\n\n  getEdgePipelinesForMode(mode, gpuDevice, useIndices, edgeVariant, sampleCount = 1, depthWriteOverride = null) {\n    if (!gpuDevice) return null;\n    const { key, blend, fragment } = this.getBlendForMode(mode);\n    const variantKey = this.getEdgeVariantKey(useIndices, edgeVariant);\n    const depthWriteEnabled = depthWriteOverride == null\n      ? (this.edgeDepthWrite === true)\n      : (depthWriteOverride === true);\n    const resolvedSampleCount = Number.isFinite(sampleCount) && sampleCount > 1 ? 4 : 1;\n    const cacheKey = `${key}|${variantKey}|d${depthWriteEnabled ? 1 : 0}|s${resolvedSampleCount}`;\n    if (key === 'alpha' && this.edgePipelineCache.has(cacheKey)) {\n      return { line: this.edgePipelineCache.get(cacheKey), quad: this.edgeQuadPipelineCache.get(cacheKey) };\n    }\n    if (this.edgePipelineCache.has(cacheKey)) {\n      return { line: this.edgePipelineCache.get(cacheKey), quad: this.edgeQuadPipelineCache.get(cacheKey) };\n    }\n    const edgeModule = this.getEdgeModule(useIndices, edgeVariant);\n    this.createEdgePipelines(\n      key,\n      blend,\n      edgeModule,\n      this.baseDepthStencil,\n      fragment ?? 'edgeFragment',\n      useIndices,\n      edgeVariant,\n      depthWriteEnabled,\n      resolvedSampleCount,\n    );\n    return { line: this.edgePipelineCache.get(cacheKey), quad: this.edgeQuadPipelineCache.get(cacheKey) };\n  }\n\n  updateCameraUniformsGpu(camera, cameraUniforms) {\n    if (!this.device?.device || !this.cameraBuffer || !this.cameraArray) return;\n    const source = cameraUniforms ?? this.getCameraUniforms(camera);\n    if (!source) return;\n    this.cameraArray.set(source.viewProjection, 0);\n    this.cameraArray.set(source.view, 16);\n    this.cameraArray[32] = source.position?.[0] ?? 0;\n    this.cameraArray[33] = source.position?.[1] ?? 0;\n    this.cameraArray[34] = source.position?.[2] ?? 0;\n    this.cameraArray[35] = source.mode === '2d' ? 1 : 0;\n    this.cameraArray[36] = source.up?.[0] ?? 0;\n    this.cameraArray[37] = source.up?.[1] ?? 1;\n    this.cameraArray[38] = source.up?.[2] ?? 0;\n    this.cameraArray[39] = 0;\n    this.cameraArray[40] = source.right?.[0] ?? 1;\n    this.cameraArray[41] = source.right?.[1] ?? 0;\n    this.cameraArray[42] = source.right?.[2] ?? 0;\n    this.cameraArray[43] = 0;\n    const viewportWidth = source.viewport?.width ?? this.size?.width ?? 1;\n    const viewportHeight = source.viewport?.height ?? this.size?.height ?? 1;\n    const pixelRatio = source.viewport?.devicePixelRatio ?? this.size?.devicePixelRatio ?? 1;\n    const drawWidth = viewportWidth * pixelRatio;\n    const drawHeight = viewportHeight * pixelRatio;\n    this.cameraArray[44] = drawWidth;\n    this.cameraArray[45] = drawHeight;\n    this.cameraArray[46] = drawWidth > 0 ? 1 / drawWidth : 0;\n    this.cameraArray[47] = drawHeight > 0 ? 1 / drawHeight : 0;\n    this.device.device.queue.writeBuffer(this.cameraBuffer, 0, this.cameraArray);\n  }\n\n  updateGlobalsGpu(device, cameraUniforms, visualConfig = null) {\n    if (!device || !this.globalsBuffer || !this.globalsArray) return;\n    const nodeCfg = visualConfig?.node;\n    const edgeCfg = visualConfig?.edge;\n\n    const outlineColor = (nodeCfg?.outlineColor?.mode === 'uniform' && Array.isArray(nodeCfg?.outlineColor?.value))\n      ? nodeCfg.outlineColor.value\n      : (this.nodeOutlineColor || [0, 0, 0, 1]);\n\n    const nodeColor = (nodeCfg?.color?.mode === 'uniform' && Array.isArray(nodeCfg?.color?.value))\n      ? nodeCfg.color.value\n      : [1, 1, 1, 1];\n\n    const nodeSizeRaw = (nodeCfg?.size?.mode === 'uniform' && Number.isFinite(nodeCfg?.size?.value))\n      ? nodeCfg.size.value\n      : 0;\n\n    const nodeOutlineRaw = (nodeCfg?.outline?.mode === 'uniform' && Number.isFinite(nodeCfg?.outline?.value))\n      ? nodeCfg.outline.value\n      : 0;\n\n    const edgeColorPair = (edgeCfg?.color?.mode === 'uniform' && Array.isArray(edgeCfg?.color?.value))\n      ? edgeCfg.color.value\n      : null;\n    const edgeColorStart = Array.isArray(edgeColorPair?.[0]) ? edgeColorPair[0] : [1, 1, 1, 1];\n    const edgeColorEnd = Array.isArray(edgeColorPair?.[1]) ? edgeColorPair[1] : edgeColorStart;\n\n    const edgeWidthPair = (edgeCfg?.width?.mode === 'uniform' && Array.isArray(edgeCfg?.width?.value)) ? edgeCfg.width.value : [1, 1];\n    const edgeOpacityPair = (edgeCfg?.opacity?.mode === 'uniform' && Array.isArray(edgeCfg?.opacity?.value)) ? edgeCfg.opacity.value : [1, 1];\n    const edgeEndpointSizePair = (edgeCfg?.endpointSize?.mode === 'uniform' && Array.isArray(edgeCfg?.endpointSize?.value)) ? edgeCfg.endpointSize.value : [1, 1];\n    const semanticZoomExponent = Number.isFinite(this.semanticZoomExponent) ? this.semanticZoomExponent : 0;\n\n    let offset = 0;\n    this.globalsArray[offset++] = this.nodeOpacityBase;\n    this.globalsArray[offset++] = this.nodeOpacityScale;\n    this.globalsArray[offset++] = this.nodeSizeBase;\n    this.globalsArray[offset++] = this.nodeSizeScale;\n    this.globalsArray[offset++] = this.nodeOutlineWidthBase;\n    this.globalsArray[offset++] = this.nodeOutlineWidthScale;\n    this.globalsArray[offset++] = this.edgeOpacityBase;\n    this.globalsArray[offset++] = this.edgeOpacityScale;\n    this.globalsArray[offset++] = this.edgeWidthBase;\n    this.globalsArray[offset++] = this.edgeWidthScale;\n    // _pad0.x = semantic zoom exponent, _pad0.y reserved\n    this.globalsArray[offset++] = semanticZoomExponent;\n    this.globalsArray[offset++] = 0;\n\n    // nodeColor\n    this.globalsArray[offset++] = nodeColor[0] ?? 1;\n    this.globalsArray[offset++] = nodeColor[1] ?? 1;\n    this.globalsArray[offset++] = nodeColor[2] ?? 1;\n    this.globalsArray[offset++] = nodeColor[3] ?? 1;\n\n    // nodeRaw\n    this.globalsArray[offset++] = nodeSizeRaw;\n    this.globalsArray[offset++] = nodeOutlineRaw;\n\n    // _pad1\n    this.globalsArray[offset++] = 0;\n    this.globalsArray[offset++] = 0;\n\n    // nodeOutlineColor\n    this.globalsArray[offset++] = outlineColor[0] ?? 0;\n    this.globalsArray[offset++] = outlineColor[1] ?? 0;\n    this.globalsArray[offset++] = outlineColor[2] ?? 0;\n    this.globalsArray[offset++] = outlineColor[3] ?? 1;\n\n    // edgeColorStart\n    this.globalsArray[offset++] = edgeColorStart[0] ?? 1;\n    this.globalsArray[offset++] = edgeColorStart[1] ?? 1;\n    this.globalsArray[offset++] = edgeColorStart[2] ?? 1;\n    this.globalsArray[offset++] = edgeColorStart[3] ?? 1;\n\n    // edgeColorEnd\n    this.globalsArray[offset++] = edgeColorEnd[0] ?? 1;\n    this.globalsArray[offset++] = edgeColorEnd[1] ?? 1;\n    this.globalsArray[offset++] = edgeColorEnd[2] ?? 1;\n    this.globalsArray[offset++] = edgeColorEnd[3] ?? 1;\n\n    // edgeWidthRaw\n    this.globalsArray[offset++] = edgeWidthPair?.[0] ?? 1;\n    this.globalsArray[offset++] = edgeWidthPair?.[1] ?? 1;\n\n    // edgeOpacityRaw\n    this.globalsArray[offset++] = edgeOpacityPair?.[0] ?? 1;\n    this.globalsArray[offset++] = edgeOpacityPair?.[1] ?? 1;\n\n    // edgeEndpointSizeRaw\n    this.globalsArray[offset++] = edgeEndpointSizePair?.[0] ?? 1;\n    this.globalsArray[offset++] = edgeEndpointSizePair?.[1] ?? 1;\n\n    // _pad2\n    this.globalsArray[offset++] = 0;\n    this.globalsArray[offset++] = 0;\n\n    // edgeTrim + padding\n    this.globalsArray[offset++] = this.edgeEndpointTrim;\n    this.globalsArray[offset++] = 0;\n    this.globalsArray[offset++] = 0;\n    this.globalsArray[offset++] = 0;\n\n    const slots = this.stateSlotCount;\n    this.globalsArray.set(\n      this.nodeNoStateStyleEnabled === true ? this.nodeNoStateScale : [1, 1, 1, 0],\n      offset,\n    );\n    offset += 4;\n    this.globalsArray.set(\n      this.nodeNoStateStyleEnabled === true ? this.nodeNoStateColorMul : [1, 1, 1, 1],\n      offset,\n    );\n    offset += 4;\n    this.globalsArray.set(\n      this.nodeNoStateStyleEnabled === true ? this.nodeNoStateColorAdd : [0, 0, 0, 0],\n      offset,\n    );\n    offset += 4;\n    this.globalsArray.set(\n      this.edgeNoStateStyleEnabled === true ? this.edgeNoStateScale : [1, 1, 1, 0],\n      offset,\n    );\n    offset += 4;\n    this.globalsArray.set(\n      this.edgeNoStateStyleEnabled === true ? this.edgeNoStateColorMul : [1, 1, 1, 1],\n      offset,\n    );\n    offset += 4;\n    this.globalsArray.set(\n      this.edgeNoStateStyleEnabled === true ? this.edgeNoStateColorAdd : [0, 0, 0, 0],\n      offset,\n    );\n    offset += 4;\n    this.globalsArray.set(this.nodeStateScale, offset); offset += slots * 4;\n    this.globalsArray.set(this.nodeStateColorMul, offset); offset += slots * 4;\n    this.globalsArray.set(this.nodeStateColorAdd, offset); offset += slots * 4;\n    this.globalsArray.set(this.edgeStateScale, offset); offset += slots * 4;\n    this.globalsArray.set(this.edgeStateColorMul, offset); offset += slots * 4;\n    this.globalsArray.set(this.edgeStateColorAdd, offset); offset += slots * 4;\n    const interpolation = this.getPositionInterpolationState?.() ?? this.positionInterpolation ?? null;\n    this.globalsArray[offset++] = interpolation?.enabled === true\n      ? Math.max(0, Math.min(1, Number(interpolation.factor ?? 1)))\n      : 1;\n    this.globalsArray[offset++] = interpolation?.enabled === true ? 1 : 0;\n    this.globalsArray[offset++] = 0;\n    this.globalsArray[offset++] = 0;\n    device.queue.writeBuffer(this.globalsBuffer, 0, this.globalsArray);\n  }\n\n  updateHoverGpu(device) {\n    if (!device || !this.hoverBuffer || !this.hoverArray || !this.hoverU32Array) return;\n    const nodeIndex = this.hoveredNodeIndex >>> 0;\n    const nodeState = this.hoveredNodeState >>> 0;\n    const edgeIndex = this.hoveredEdgeIndex >>> 0;\n    const edgeState = this.hoveredEdgeState >>> 0;\n    const nodeForceMask = this.nodeStateForceMaxAlphaMask >>> 0;\n    const edgeForceMask = this.edgeStateForceMaxAlphaMask >>> 0;\n    const nodeVirtual = this.hoveredNodeIsVirtual ? 1 : 0;\n    const edgeVirtual = this.hoveredEdgeIsVirtual ? 1 : 0;\n    const prev = this._hoverLast;\n    if (\n      prev &&\n      prev.nodeIndex === nodeIndex &&\n      prev.nodeState === nodeState &&\n      prev.edgeIndex === edgeIndex &&\n      prev.edgeState === edgeState &&\n      prev.nodeForceMask === nodeForceMask &&\n      prev.edgeForceMask === edgeForceMask &&\n      prev.nodeVirtual === nodeVirtual &&\n      prev.edgeVirtual === edgeVirtual\n    ) {\n      return;\n    }\n    this.hoverU32Array[0] = nodeIndex;\n    this.hoverU32Array[1] = nodeState;\n    this.hoverU32Array[2] = edgeIndex;\n    this.hoverU32Array[3] = edgeState;\n    this.hoverU32Array[4] = nodeForceMask;\n    this.hoverU32Array[5] = edgeForceMask;\n    this.hoverU32Array[6] = nodeVirtual;\n    this.hoverU32Array[7] = edgeVirtual;\n    this.hoverArray.set(this.nodeHoverScale, 8);\n    this.hoverArray.set(this.nodeHoverColorMul, 12);\n    this.hoverArray.set(this.nodeHoverColorAdd, 16);\n    this.hoverArray[15] = this.nodeHoverForceMaxAlpha ? 2 : this.hoverArray[15];\n    this.hoverArray.set(this.edgeHoverScale, 20);\n    this.hoverArray.set(this.edgeHoverColorMul, 24);\n    this.hoverArray.set(this.edgeHoverColorAdd, 28);\n    this.hoverArray[27] = this.edgeHoverForceMaxAlpha ? 2 : this.hoverArray[27];\n    device.queue.writeBuffer(this.hoverBuffer, 0, this.hoverArray);\n    this._hoverLast = { nodeIndex, nodeState, edgeIndex, edgeState, nodeForceMask, edgeForceMask, nodeVirtual, edgeVirtual };\n  }\n\n  updateShadingGpu(device) {\n    if (!device || !this.shadingBuffer || !this.shadingArray) return;\n    const direction = Array.isArray(this.shadedLightDirection) || ArrayBuffer.isView(this.shadedLightDirection)\n      ? this.shadedLightDirection\n      : SHADED_LIGHT_DIRECTION_DEFAULT;\n    const lightColor = Array.isArray(this.shadedLightColor) || ArrayBuffer.isView(this.shadedLightColor)\n      ? this.shadedLightColor\n      : SHADED_LIGHT_COLOR_DEFAULT;\n    const ambientTop = Array.isArray(this.shadedAmbientTopColor) || ArrayBuffer.isView(this.shadedAmbientTopColor)\n      ? this.shadedAmbientTopColor\n      : SHADED_AMBIENT_TOP_COLOR_DEFAULT;\n    const ambientBottom = Array.isArray(this.shadedAmbientBottomColor) || ArrayBuffer.isView(this.shadedAmbientBottomColor)\n      ? this.shadedAmbientBottomColor\n      : SHADED_AMBIENT_BOTTOM_COLOR_DEFAULT;\n    const specularColor = Array.isArray(this.shadedSpecularColor) || ArrayBuffer.isView(this.shadedSpecularColor)\n      ? this.shadedSpecularColor\n      : SHADED_SPECULAR_COLOR_DEFAULT;\n    const diffuseStrength = Number.isFinite(Number(this.shadedDiffuseStrength))\n      ? Math.max(0, Number(this.shadedDiffuseStrength))\n      : SHADED_DIFFUSE_STRENGTH_DEFAULT;\n    const ambientStrength = Number.isFinite(Number(this.shadedAmbientStrength))\n      ? Math.max(0, Number(this.shadedAmbientStrength))\n      : SHADED_AMBIENT_STRENGTH_DEFAULT;\n    const specularStrength = Number.isFinite(Number(this.shadedSpecularStrength))\n      ? Math.max(0, Number(this.shadedSpecularStrength))\n      : SHADED_SPECULAR_STRENGTH_DEFAULT;\n    const shininess = Number.isFinite(Number(this.shadedShininess))\n      ? Math.max(1, Number(this.shadedShininess))\n      : SHADED_SHININESS_DEFAULT;\n\n    let offset = 0;\n    this.shadingArray[offset++] = direction[0] ?? SHADED_LIGHT_DIRECTION_DEFAULT[0];\n    this.shadingArray[offset++] = direction[1] ?? SHADED_LIGHT_DIRECTION_DEFAULT[1];\n    this.shadingArray[offset++] = direction[2] ?? SHADED_LIGHT_DIRECTION_DEFAULT[2];\n    this.shadingArray[offset++] = 0;\n    this.shadingArray[offset++] = lightColor[0] ?? SHADED_LIGHT_COLOR_DEFAULT[0];\n    this.shadingArray[offset++] = lightColor[1] ?? SHADED_LIGHT_COLOR_DEFAULT[1];\n    this.shadingArray[offset++] = lightColor[2] ?? SHADED_LIGHT_COLOR_DEFAULT[2];\n    this.shadingArray[offset++] = lightColor[3] ?? SHADED_LIGHT_COLOR_DEFAULT[3];\n    this.shadingArray[offset++] = ambientTop[0] ?? SHADED_AMBIENT_TOP_COLOR_DEFAULT[0];\n    this.shadingArray[offset++] = ambientTop[1] ?? SHADED_AMBIENT_TOP_COLOR_DEFAULT[1];\n    this.shadingArray[offset++] = ambientTop[2] ?? SHADED_AMBIENT_TOP_COLOR_DEFAULT[2];\n    this.shadingArray[offset++] = ambientTop[3] ?? SHADED_AMBIENT_TOP_COLOR_DEFAULT[3];\n    this.shadingArray[offset++] = ambientBottom[0] ?? SHADED_AMBIENT_BOTTOM_COLOR_DEFAULT[0];\n    this.shadingArray[offset++] = ambientBottom[1] ?? SHADED_AMBIENT_BOTTOM_COLOR_DEFAULT[1];\n    this.shadingArray[offset++] = ambientBottom[2] ?? SHADED_AMBIENT_BOTTOM_COLOR_DEFAULT[2];\n    this.shadingArray[offset++] = ambientBottom[3] ?? SHADED_AMBIENT_BOTTOM_COLOR_DEFAULT[3];\n    this.shadingArray[offset++] = specularColor[0] ?? SHADED_SPECULAR_COLOR_DEFAULT[0];\n    this.shadingArray[offset++] = specularColor[1] ?? SHADED_SPECULAR_COLOR_DEFAULT[1];\n    this.shadingArray[offset++] = specularColor[2] ?? SHADED_SPECULAR_COLOR_DEFAULT[2];\n    this.shadingArray[offset++] = specularColor[3] ?? SHADED_SPECULAR_COLOR_DEFAULT[3];\n    this.shadingArray[offset++] = specularStrength;\n    this.shadingArray[offset++] = shininess;\n    this.shadingArray[offset++] = diffuseStrength;\n    this.shadingArray[offset++] = ambientStrength;\n    device.queue.writeBuffer(this.shadingBuffer, 0, this.shadingArray);\n  }\n\n  prepareWeightedResources(context, cameraUniforms, useEdgeIndices, edgeVariant) {\n    const device = this.device?.device;\n    if (!device) return false;\n    const maxTargets = device.limits?.maxColorAttachments ?? 1;\n    if (maxTargets < 2) {\n      this.weightedSupported = false;\n      return false;\n    }\n\n    const viewport = cameraUniforms?.viewport;\n    const pixelRatio = viewport?.devicePixelRatio ?? this.size?.devicePixelRatio ?? 1;\n    const width = context?.width\n      ?? context?.target?.width\n      ?? Math.max(1, Math.floor((viewport?.width ?? this.size?.width ?? 1) * pixelRatio));\n    const height = context?.height\n      ?? context?.target?.height\n      ?? Math.max(1, Math.floor((viewport?.height ?? this.size?.height ?? 1) * pixelRatio));\n    if (!this.ensureWeightedTextures(device, width, height)) {\n      this.weightedSupported = false;\n      return false;\n    }\n    if (!this.ensureWeightedPipelines(device, context.format, useEdgeIndices, edgeVariant)) {\n      this.weightedSupported = false;\n      return false;\n    }\n    this.ensureWeightedResolveBindGroup(device);\n    const ready = Boolean(this.edgeWeightedPipeline && this.edgeResolveBindGroup && this.edgeResolveLayout);\n    this.weightedSupported = ready;\n    return ready;\n  }\n\n  ensureWeightedTextures(device, width, height) {\n    const targetWidth = Math.max(1, Math.floor(width));\n    const targetHeight = Math.max(1, Math.floor(height));\n    if (\n      this.weightedTextures &&\n      this.weightedTextures.width === targetWidth &&\n      this.weightedTextures.height === targetHeight\n    ) {\n      return true;\n    }\n\n    const destroyOld = () => {\n      this.weightedTextures?.color?.destroy?.();\n      this.weightedTextures?.weight?.destroy?.();\n    };\n\n    const usage = GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC;\n    try {\n      const color = device.createTexture({\n        size: { width: targetWidth, height: targetHeight, depthOrArrayLayers: 1 },\n        format: 'rgba16float',\n        usage,\n      });\n\n      let weightFormat = 'r16float';\n      let weight = null;\n      try {\n        weight = device.createTexture({\n          size: { width: targetWidth, height: targetHeight, depthOrArrayLayers: 1 },\n          format: weightFormat,\n          usage,\n        });\n      } catch (error) {\n        console.warn('GraphLayerWebGPUBase: r16float weighted transparency target allocation failed; falling back to rgba16float.', error);\n        weightFormat = 'rgba16float';\n        weight = device.createTexture({\n          size: { width: targetWidth, height: targetHeight, depthOrArrayLayers: 1 },\n          format: weightFormat,\n          usage,\n        });\n      }\n\n      destroyOld();\n      this.weightedTextures = {\n        color,\n        weight,\n        width: targetWidth,\n        height: targetHeight,\n        weightFormat,\n      };\n      return true;\n    } catch (error) {\n      console.warn('Unable to allocate weighted transparency targets; falling back to alpha.', error);\n      destroyOld();\n      this.weightedTextures = null;\n      return false;\n    }\n  }\n\n  ensureWeightedPipelines(device, swapchainFormat, useEdgeIndices, edgeVariant) {\n    const colorFormat = this.weightedTextures?.color?.format ?? 'rgba16float';\n    const weightFormat = this.weightedTextures?.weight?.format ?? 'r16float';\n    if (!colorFormat || !weightFormat) return false;\n\n    const additiveBlend = {\n      color: { srcFactor: 'one', dstFactor: 'one', operation: 'add' },\n      alpha: { srcFactor: 'one', dstFactor: 'one', operation: 'add' },\n    };\n\n    const depthWriteEnabled = this.edgeDepthWrite === true;\n    const needsRebuild =\n      !this.weightedPipelineFormats ||\n      this.weightedPipelineFormats.color !== colorFormat ||\n      this.weightedPipelineFormats.weight !== weightFormat ||\n      this.weightedPipelineFormats.swapchain !== swapchainFormat ||\n      this.weightedPipelineFormats.depthWriteEnabled !== depthWriteEnabled ||\n      this.edgeWeightedUseIndices !== useEdgeIndices ||\n      this.weightedPipelineFormats.edgeVariantKey !== this.getEdgeVariantKey(useEdgeIndices, edgeVariant);\n\n    const weightedModule = this.getEdgeWeightedModule(useEdgeIndices, edgeVariant);\n    if (!weightedModule) return false;\n    if (!this.edgeResolveModule) {\n      this.edgeResolveModule = device.createShaderModule({ code: EDGE_WEIGHTED_RESOLVE_WGSL });\n    }\n\n    if (needsRebuild) {\n      const depthStencilAccumulate = {\n        format: this.device.depthFormat ?? 'depth24plus',\n        depthWriteEnabled,\n        depthCompare: 'less-equal',\n      };\n\n      this.edgeWeightedPipeline = device.createRenderPipeline({\n        layout: device.createPipelineLayout({ bindGroupLayouts: [this.edgeBindGroupLayout] }),\n        vertex: { module: weightedModule, entryPoint: 'edgeVertex' },\n        fragment: {\n          module: weightedModule,\n          entryPoint: 'edgeWeightedFragment',\n          targets: [\n            { format: colorFormat, blend: additiveBlend },\n            { format: weightFormat, blend: additiveBlend },\n          ],\n        },\n        depthStencil: depthStencilAccumulate,\n        primitive: { topology: 'line-list' },\n      });\n\n      this.edgeWeightedQuadPipeline = device.createRenderPipeline({\n        layout: device.createPipelineLayout({ bindGroupLayouts: [this.edgeBindGroupLayout] }),\n        vertex: {\n          module: weightedModule,\n          entryPoint: 'edgeQuadVertex',\n          buffers: [\n            {\n              arrayStride: 8,\n              attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x2' }],\n              stepMode: 'vertex',\n            },\n          ],\n        },\n        fragment: {\n          module: weightedModule,\n          entryPoint: 'edgeWeightedFragment',\n          targets: [\n            { format: colorFormat, blend: additiveBlend },\n            { format: weightFormat, blend: additiveBlend },\n          ],\n        },\n        depthStencil: depthStencilAccumulate,\n        primitive: { topology: 'triangle-strip' },\n      });\n\n      this.weightedPipelineFormats = {\n        color: colorFormat,\n        weight: weightFormat,\n        swapchain: swapchainFormat,\n        depthWriteEnabled,\n        edgeVariantKey: this.getEdgeVariantKey(useEdgeIndices, edgeVariant),\n      };\n      this.edgeWeightedUseIndices = useEdgeIndices;\n    }\n\n    if (!this.edgeResolveLayout) {\n      this.edgeResolveLayout = device.createBindGroupLayout({\n        entries: [\n          { binding: 0, visibility: GPUShaderStage.FRAGMENT, sampler: {} },\n          { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'float' } },\n          { binding: 2, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'float' } },\n        ],\n      });\n    }\n\n    return Boolean(this.edgeWeightedPipeline);\n  }\n\n  ensureWeightedResolveBindGroup(device) {\n    if (!this.weightedTextures) return;\n    if (!this.weightedSampler) {\n      this.weightedSampler = device.createSampler({ magFilter: 'linear', minFilter: 'linear' });\n    }\n    this.edgeResolveBindGroup = device.createBindGroup({\n      layout: this.edgeResolveLayout,\n      entries: [\n        { binding: 0, resource: this.weightedSampler },\n        { binding: 1, resource: this.weightedTextures.color.createView() },\n        { binding: 2, resource: this.weightedTextures.weight.createView() },\n      ],\n    });\n  }\n\n  getResolvePipeline(mode, swapchainFormat, sampleCount = 1) {\n    const resolvedSampleCount = Number.isFinite(sampleCount) && sampleCount > 1 ? 4 : 1;\n    const key = `${mode ?? 'default'}|${swapchainFormat}|s:${resolvedSampleCount}`;\n    if (this.edgeResolvePipelineCache.has(key)) {\n      return this.edgeResolvePipelineCache.get(key);\n    }\n\n    const device = this.device?.device;\n    if (!device) return null;\n    const layout = this.edgeResolveLayout;\n    if (!layout) return null;\n\n    const shaderCode = (() => {\n      if (mode === 'additive-tonemapped') {\n        return createEdgeWeightedResolveTonemapWGSL({ boost: false });\n      }\n      if (mode === 'additive-normalized-bright') {\n        return createEdgeWeightedResolveTonemapWGSL({ boost: true });\n      }\n      return EDGE_WEIGHTED_RESOLVE_WGSL;\n    })();\n\n    let module = this.edgeResolveModuleCache.get(shaderCode);\n    if (!module) {\n      module = device.createShaderModule({ code: shaderCode });\n      this.edgeResolveModuleCache.set(shaderCode, module);\n    }\n\n    const pipeline = device.createRenderPipeline({\n      layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),\n      vertex: {\n        module,\n        entryPoint: 'vs',\n        buffers: [\n          {\n            arrayStride: 16,\n            attributes: [\n              { shaderLocation: 0, offset: 0, format: 'float32x2' },\n              { shaderLocation: 1, offset: 8, format: 'float32x2' },\n            ],\n          },\n        ],\n      },\n      fragment: {\n        module,\n        entryPoint: 'fs',\n        targets: [\n          {\n            format: swapchainFormat,\n            blend: {\n              color: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n              alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n            },\n          },\n        ],\n      },\n      depthStencil: {\n        format: this.device.depthFormat ?? 'depth24plus',\n        depthWriteEnabled: false,\n        depthCompare: 'always',\n      },\n      multisample: { count: resolvedSampleCount },\n      primitive: { topology: 'triangle-strip' },\n    });\n\n    this.edgeResolvePipelineCache.set(key, pipeline);\n    return pipeline;\n  }\n\n  renderWeighted(context, { geometry, is2D, drawNodes, nodeBlendWithEdges, mode }) {\n    this.counters.weightedAttachmentRenders = bumpCounter(this.counters.weightedAttachmentRenders);\n    const commandEncoder = context.commandEncoder;\n    const targetView = context.colorView;\n    const depthView = context.depthView;\n    const useQuads = (this.getEffectiveEdgeRenderingMode?.() ?? this.edgeRenderingMode) === 'quad' && this.edgeWeightedQuadPipeline;\n    const edgePipeline = useQuads ? this.edgeWeightedQuadPipeline : this.edgeWeightedPipeline;\n    const edgeVertexBuffer = useQuads ? this.edgeQuadBufferGpu : null;\n    const applyViewport = (pass) => {\n      if (context.viewport && pass?.setViewport) {\n        pass.setViewport(context.viewport.x, context.viewport.y, context.viewport.width, context.viewport.height, 0, 1);\n      }\n    };\n\n    // Draw nodes first for 3D to populate depth, mirroring the existing ordering.\n    if (!is2D && !nodeBlendWithEdges) {\n      drawNodes(context.passEncoder);\n    }\n\n    if (context.passEncoder) {\n      context.passEncoder.end();\n      context.passEncoder = null;\n    }\n\n    if (geometry.edges.count && edgePipeline) {\n      const accumulatePass = commandEncoder.beginRenderPass({\n        colorAttachments: [\n          {\n            view: this.weightedTextures.color.createView(),\n            clearValue: { r: 0, g: 0, b: 0, a: 0 },\n            loadOp: 'clear',\n            storeOp: 'store',\n          },\n          {\n            view: this.weightedTextures.weight.createView(),\n            clearValue: { r: 0, g: 0, b: 0, a: 0 },\n            loadOp: 'clear',\n            storeOp: 'store',\n          },\n        ],\n        ...(depthView\n          ? {\n              depthStencilAttachment: {\n                view: depthView,\n                depthLoadOp: 'load',\n                depthStoreOp: 'store',\n              },\n            }\n          : {}),\n      });\n          applyViewport(accumulatePass);\n      accumulatePass.setPipeline(edgePipeline);\n      accumulatePass.setBindGroup(0, this.edgeBindGroup);\n      if (edgeVertexBuffer) {\n        accumulatePass.setVertexBuffer(0, edgeVertexBuffer);\n        accumulatePass.draw(4, geometry.edges.count, 0, 0);\n      } else {\n        accumulatePass.draw(geometry.edges.count * 2, 1, 0, 0);\n      }\n      accumulatePass.end();\n    }\n\n    const resolvePass = commandEncoder.beginRenderPass({\n      colorAttachments: [\n        {\n          view: targetView,\n          ...(context.resolveTargetView ? { resolveTarget: context.resolveTargetView } : {}),\n          loadOp: 'load',\n          storeOp: 'store',\n        },\n      ],\n      ...(depthView\n        ? {\n            depthStencilAttachment: {\n              view: depthView,\n              depthLoadOp: 'load',\n              depthStoreOp: 'store',\n            },\n          }\n        : {}),\n    });\n    applyViewport(resolvePass);\n    resolvePass.setPipeline(this.getResolvePipeline(mode, context.format, context.sampleCount ?? 1));\n    resolvePass.setBindGroup(0, this.edgeResolveBindGroup);\n    resolvePass.setVertexBuffer(0, context.quad);\n    resolvePass.draw(4, 1, 0, 0);\n\n    if (is2D || nodeBlendWithEdges) {\n      drawNodes(resolvePass);\n    }\n\n    context.passEncoder = resolvePass;\n  }\n}\n","export function createGraphWebGPUSources(stateSlots = 4, options = {}) {\n  const STATE_SLOTS = Math.max(0, Math.min(32, Math.floor(Number(stateSlots) || 0)));\n  const FORCE_VISIBILITY_BOOST = 1000.0;\n  const useEdgeIndices = options.useEdgeIndices !== false;\n  const edgeOptions = options?.edge && typeof options.edge === 'object' ? options.edge : {};\n  const bindings = options?.bindings ?? null;\n  const defaultBindings = {\n    camera: 0,\n    edgeIndices: 1,\n    edgeEndpoints: 2,\n    nodePositions: 3,\n    nodePositionsFrom: 4,\n    nodeSizes: 5,\n    nodeColors: 6,\n    nodeStates: 7,\n    edgeColors: 8,\n    edgeWidths: 9,\n    edgeEndpointSizes: 10,\n    edgeOpacities: 11,\n    edgeStates: 12,\n    globals: 13,\n    hover: 14,\n    edgeNodeColorSource: 15,\n    edgeNodeWidthSource: 16,\n    edgeNodeOpacitySource: 17,\n    edgeNodeEndpointSizeSource: 18,\n    shading: 19,\n  };\n  const bindingMap = bindings ?? defaultBindings;\n  const hasBinding = (name) => {\n    if (bindings) {\n      return bindingMap[name] != null;\n    }\n    return Object.prototype.hasOwnProperty.call(defaultBindings, name);\n  };\n  const bindingIndex = (name) => bindingMap[name];\n\n  const normalizeEndpoints = (value) => {\n    if (value === 'source' || value === 'from') return 1;\n    if (value === 'destination' || value === 'target' || value === 'to') return 2;\n    return 0;\n  };\n\n  const normalizeEdgeOption = (entry, fallbackSource = 'edge') => {\n    if (!entry || typeof entry !== 'object') {\n      return { mode: 'buffer', source: fallbackSource, endpoints: 0, doubleWidth: true };\n    }\n    const mode = entry.mode ?? entry ?? 'buffer';\n    const source = entry.source ?? fallbackSource;\n    const endpoints = normalizeEndpoints(entry.endpoints);\n    const doubleWidth = entry.doubleWidth !== false;\n    return { mode, source, endpoints, doubleWidth };\n  };\n\n  const color = normalizeEdgeOption(edgeOptions.color, 'edge');\n  const width = normalizeEdgeOption(edgeOptions.width, 'edge');\n  const opacity = normalizeEdgeOption(edgeOptions.opacity, 'edge');\n  const endpointSize = normalizeEdgeOption(edgeOptions.endpointSize, 'edge');\n  const fastEdgePath = edgeOptions.fastPath === true;\n  const useEdgeShading = !fastEdgePath && edgeOptions.shading === true;\n  const positionInterpolationEnabled = edgeOptions.positionInterpolation === true;\n  const cameraMode = edgeOptions.cameraMode === '2d'\n    ? '2d'\n    : (edgeOptions.cameraMode === '3d' ? '3d' : 'dynamic');\n  const semanticZoomEnabled = !fastEdgePath && edgeOptions.semanticZoom !== false;\n  const trimEnabled = !fastEdgePath && edgeOptions.trim !== false;\n  const widthClampToNodeDiameter = !fastEdgePath && edgeOptions.widthClampToNodeDiameter !== false;\n  const endpointGeometryEnabled = trimEnabled || widthClampToNodeDiameter;\n  const edgeStateEnabled = !fastEdgePath && edgeOptions.edgeState !== false;\n  const propagateSelectedNodesToEdges = !fastEdgePath && edgeOptions.propagateSelectedNodesToEdges === true;\n  const endpointStateEnabled = !fastEdgePath\n    && (edgeOptions.endpointState !== false || propagateSelectedNodesToEdges)\n    && (endpointGeometryEnabled || propagateSelectedNodesToEdges);\n  const propagateHoveredNodeToEdges = !fastEdgePath && edgeOptions.propagateHoveredNodeToEdges === true;\n\n  const useEdgeColorBuffer = color.mode !== 'uniform' && color.source !== 'node';\n  const useEdgeColorNode = color.mode !== 'uniform' && color.source === 'node';\n  const useEdgeWidthBuffer = width.mode !== 'uniform' && width.source !== 'node';\n  const useEdgeWidthNode = width.mode !== 'uniform' && width.source === 'node';\n  const useEdgeOpacityBuffer = opacity.mode !== 'uniform' && opacity.source !== 'node';\n  const useEdgeOpacityNode = opacity.mode !== 'uniform' && opacity.source === 'node';\n  const useEdgeEndpointSizeBuffer = endpointSize.mode !== 'uniform' && endpointSize.source !== 'node';\n  const useEdgeEndpointSizeNode = endpointSize.mode !== 'uniform' && endpointSize.source === 'node';\n\n  const edgeColorBufferSnippet = useEdgeColorBuffer\n    ? `\n  colorStart = edgeColors.data[edgeId * 2u];\n  colorEnd = edgeColors.data[edgeId * 2u + 1u];\n`\n    : '';\n  const edgeColorNodeSnippet = useEdgeColorNode\n    ? `\n  let nodeColorsPair = selectNodeColor(edgeNodeColorSource.data[sourceId], edgeNodeColorSource.data[targetId], EDGE_COLOR_ENDPOINTS);\n  colorStart = nodeColorsPair.start;\n  colorEnd = nodeColorsPair.end;\n`\n    : '';\n  const edgeWidthBufferSnippet = useEdgeWidthBuffer\n    ? `\n  endpointWidth = edgeWidths.data[edgeId];\n`\n    : '';\n  const edgeWidthNodeSnippet = useEdgeWidthNode\n    ? `\n  endpointWidth = selectNodePair(edgeNodeWidthSource.data[sourceId], edgeNodeWidthSource.data[targetId], EDGE_WIDTH_ENDPOINTS);\n`\n    : '';\n  const edgeOpacityBufferSnippet = useEdgeOpacityBuffer\n    ? `\n  opacityPair = edgeOpacities.data[edgeId];\n`\n    : '';\n  const edgeOpacityNodeSnippet = useEdgeOpacityNode\n    ? `\n  opacityPair = selectNodePair(edgeNodeOpacitySource.data[sourceId], edgeNodeOpacitySource.data[targetId], EDGE_OPACITY_ENDPOINTS);\n`\n    : '';\n  const edgeEndpointSizeBufferSnippet = useEdgeEndpointSizeBuffer\n    ? `\n  endpointSize = edgeEndpointSizes.data[edgeId];\n`\n    : '';\n  const edgeEndpointSizeNodeSnippet = useEdgeEndpointSizeNode\n    ? `\n  let nodeSizesPair = selectNodePair(edgeNodeEndpointSizeSource.data[sourceId], edgeNodeEndpointSizeSource.data[targetId], EDGE_ENDPOINT_SIZE_ENDPOINTS);\n  endpointSize = nodeSizesPair;\n`\n    : '';\n  const semanticScaleExpr = (!semanticZoomEnabled || cameraMode === '3d') ? '1.0' : 'semanticZoomScale()';\n\n  const edgeIdVertexSnippet = useEdgeIndices\n    ? 'var edgeId = edgeIndices.data[edgeSlot];'\n    : 'var edgeId = edgeSlot;';\n  const edgeIdQuadSnippet = useEdgeIndices\n    ? 'var edgeId = edgeIndices.data[input.instance];'\n    : 'var edgeId = input.instance;';\n\n  const edgeStateSnippet = edgeStateEnabled\n    ? `\n  var state = edgeStates.data[edgeId];\n  let endpointStatePair = ${endpointStateEnabled ? 'vec2<u32>(nodeStates.data[sourceId], nodeStates.data[targetId])' : 'vec2<u32>(0u, 0u)'};\n  if (hover.edgeIndex != 0xffffffffu && edgeId == hover.edgeIndex) {\n    if (hover.edgeVirtual == 0u) {\n      state = state | hover.edgeState;\n    }\n  }\n  ${propagateHoveredNodeToEdges\n    ? `\n  if (hover.nodeIndex != 0xffffffffu && (sourceId == hover.nodeIndex || targetId == hover.nodeIndex)) {\n    if (hover.nodeVirtual == 0u) {\n      state = state | 4u;\n    }\n  }`\n    : ''}\n  ${propagateSelectedNodesToEdges\n    ? `\n  if (((endpointStatePair.x | endpointStatePair.y) & 2u) != 0u) {\n    state = state | 2u;\n  }`\n    : ''}\n  var forceMaxAlpha = (state & hover.edgeStateForceMaxAlphaMask) != 0u;\n  var widthMul = 1.0;\n  var opacityMul = 1.0;\n  var rgbMul = vec3<f32>(1.0, 1.0, 1.0);\n  var rgbAdd = vec3<f32>(0.0, 0.0, 0.0);\n  var discardFlag = 0u;\n  let virtualHover = (hover.edgeIndex != 0xffffffffu && edgeId == hover.edgeIndex && hover.edgeVirtual != 0u)${propagateHoveredNodeToEdges ? ' || (hover.nodeIndex != 0xffffffffu && (sourceId == hover.nodeIndex || targetId == hover.nodeIndex) && hover.nodeVirtual != 0u)' : ''};\n  if (state == 0u) {\n    let scale = globals.edgeNoStateScale;\n    widthMul = widthMul * scale.x;\n    opacityMul = opacityMul * scale.y;\n    rgbMul = rgbMul * globals.edgeNoStateColorMul.rgb;\n    rgbAdd = rgbAdd + globals.edgeNoStateColorAdd.rgb;\n    discardFlag = select(0u, 1u, scale.w > 0.5);\n  } else {\n    for (var i = 0u; i < ${STATE_SLOTS}u; i = i + 1u) {\n      let enabled = (state >> i) & 1u;\n      if (enabled == 1u) {\n        let scale = globals.edgeStateScale[i];\n        widthMul = widthMul * scale.x;\n        opacityMul = opacityMul * scale.y;\n        rgbMul = rgbMul * globals.edgeStateColorMul[i].rgb;\n        rgbAdd = rgbAdd + globals.edgeStateColorAdd[i].rgb;\n        if (scale.w > 0.5) {\n          discardFlag = 1u;\n        }\n      }\n    }\n  }\n  if (virtualHover) {\n    let scale = hover.edgeHoverScale;\n    widthMul = widthMul * scale.x;\n    opacityMul = opacityMul * scale.y;\n    rgbMul = rgbMul * hover.edgeHoverColorMul.rgb;\n    rgbAdd = rgbAdd + hover.edgeHoverColorAdd.rgb;\n    if (scale.w > 0.5) {\n      discardFlag = 1u;\n    }\n    forceMaxAlpha = forceMaxAlpha || hover.edgeHoverColorMul.a > 1.5;\n  }\n`\n    : `\n  let forceMaxAlpha = false;\n  var widthMul = 1.0;\n  var opacityMul = 1.0;\n  var rgbMul = vec3<f32>(1.0, 1.0, 1.0);\n  var rgbAdd = vec3<f32>(0.0, 0.0, 0.0);\n  var discardFlag = 0u;\n`;\n\n  const edgeEndpointGeometrySnippet = endpointGeometryEnabled\n    ? `\n  var endpointSize = globals.edgeEndpointSizeRaw;\n  ${edgeEndpointSizeBufferSnippet}\n  ${edgeEndpointSizeNodeSnippet}\n\n  var startSizeMul = 1.0;\n  var endSizeMul = 1.0;\n  ${endpointStateEnabled\n    ? `\n  let endpointState = vec2<u32>(nodeStates.data[sourceId], nodeStates.data[targetId]);\n  if (endpointState.x == 0u) {\n    startSizeMul = startSizeMul * globals.nodeNoStateScale.x;\n  } else {\n    for (var i = 0u; i < ${STATE_SLOTS}u; i = i + 1u) {\n      let slotMul = globals.nodeStateScale[i].x;\n      if (((endpointState.x >> i) & 1u) == 1u) {\n        startSizeMul = startSizeMul * slotMul;\n      }\n    }\n  }\n  if (endpointState.y == 0u) {\n    endSizeMul = endSizeMul * globals.nodeNoStateScale.x;\n  } else {\n    for (var i = 0u; i < ${STATE_SLOTS}u; i = i + 1u) {\n      let slotMul = globals.nodeStateScale[i].x;\n      if (((endpointState.y >> i) & 1u) == 1u) {\n        endSizeMul = endSizeMul * slotMul;\n      }\n    }\n  }\n`\n    : ''}\n  let dirRaw = endPos - startPos;\n  let dirLen = max(length(dirRaw), 1e-5);\n  let dir = dirRaw / vec3<f32>(dirLen);\n  let semanticScale = ${semanticScaleExpr};\n  let startRadius = max((globals.nodeSize.x + globals.nodeSize.y * endpointSize.x) * startSizeMul, 0.0) * 0.5 * semanticScale;\n  let endRadius = max((globals.nodeSize.x + globals.nodeSize.y * endpointSize.y) * endSizeMul, 0.0) * 0.5 * semanticScale;\n  ${trimEnabled\n    ? `\n  let trimStart = startRadius * globals.edgeTrim.x;\n  let trimEnd = endRadius * globals.edgeTrim.x;\n  startPos = startPos + dir * trimStart;\n  endPos = endPos - dir * trimEnd;\n`\n    : ''}\n`\n    : '';\n\n  const edgeGeometrySetupSnippet = endpointGeometryEnabled\n    ? ''\n    : `\n  let dirRaw = endPos - startPos;\n  let dirLen = max(length(dirRaw), 1e-5);\n  let dir = dirRaw / vec3<f32>(dirLen);\n  let semanticScale = ${semanticScaleExpr};\n`;\n\n  const edgeLineWidthClampSnippet = widthClampToNodeDiameter\n    ? `\n  let maxEndpointWidth = max(select(startRadius, endRadius, (vertexIndex & 1u) == 1u) * 2.0, 0.0);\n  width = min(max(width, 0.0), maxEndpointWidth);\n`\n    : '';\n\n  const edgeQuadWidthClampSnippet = widthClampToNodeDiameter\n    ? `\n  let maxSegmentWidth = max(mix(startRadius, endRadius, cornerT) * 2.0, 0.0);\n  width = min(max(width, 0.0), maxSegmentWidth);\n`\n    : '';\n\n  const edgeLineGeometrySnippet = fastEdgePath\n    ? `\n  var position = startPos;\n  if ((vertexIndex & 1u) == 1u) {\n    position = endPos;\n  }\n`\n    : `\n  ${edgeGeometrySetupSnippet}\n  ${edgeEndpointGeometrySnippet}\n  var position = startPos;\n  if ((vertexIndex & 1u) == 1u) {\n    position = endPos;\n  }\n`;\n\n  const edgeLineVisualSnippet = fastEdgePath\n    ? `\n  var colorStart = globals.edgeColorStart;\n  var colorEnd = globals.edgeColorEnd;\n  ${edgeColorBufferSnippet}\n  ${edgeColorNodeSnippet}\n  let color = select(colorStart, colorEnd, (vertexIndex & 1u) == 1u);\n  let attrOpacity = select(globals.edgeOpacityRaw.x, globals.edgeOpacityRaw.y, (vertexIndex & 1u) == 1u);\n`\n    : `\n  var colorStart = globals.edgeColorStart;\n  var colorEnd = globals.edgeColorEnd;\n  ${edgeColorBufferSnippet}\n  ${edgeColorNodeSnippet}\n\n  var endpointWidth = globals.edgeWidthRaw;\n  ${edgeWidthBufferSnippet}\n  ${edgeWidthNodeSnippet}\n\n  var opacityPair = globals.edgeOpacityRaw;\n  ${edgeOpacityBufferSnippet}\n  ${edgeOpacityNodeSnippet}\n\n  let color = select(colorStart, colorEnd, (vertexIndex & 1u) == 1u);\n  var width = (globals.edgeWidth.x + globals.edgeWidth.y * select(endpointWidth.x, endpointWidth.y, (vertexIndex & 1u) == 1u)) * widthMul * semanticScale;\n  ${edgeLineWidthClampSnippet}\n  let attrOpacity = select(opacityPair.x, opacityPair.y, (vertexIndex & 1u) == 1u);\n`;\n\n  const semanticZoomSnippet = (!semanticZoomEnabled || cameraMode === '3d')\n    ? `\nfn semanticZoomScale() -> f32 {\n  return 1.0;\n}\n`\n    : (cameraMode === '2d'\n      ? `\nfn semanticZoomScale() -> f32 {\n  let exponent = globals._pad0.x;\n  if (exponent <= 0.0 || exponent != exponent) {\n    return 1.0;\n  }\n  let zoom2D = max(abs(camera.view[0][0]), 1e-3);\n  if (exponent == 1.0) {\n    return 1.0 / zoom2D;\n  }\n  return 1.0 / pow(zoom2D, exponent);\n}\n`\n      : `\nfn semanticZoomScale() -> f32 {\n  let is2D = camera.position.w > 0.5;\n  if (!is2D) {\n    return 1.0;\n  }\n  let exponent = globals._pad0.x;\n  if (exponent <= 0.0 || exponent != exponent) {\n    return 1.0;\n  }\n  let zoom2D = max(abs(camera.view[0][0]), 1e-3);\n  if (exponent == 1.0) {\n    return 1.0 / zoom2D;\n  }\n  return 1.0 / pow(zoom2D, exponent);\n}\n`);\n\n  const edgeQuadWidthDirSnippet = cameraMode === '2d'\n    ? `\n  let widthDir = normalize(vec3<f32>(-dir.y, dir.x, 0.0));\n`\n    : (cameraMode === '3d'\n      ? `\n  let viewDirRaw = camera.position.xyz - centerPos;\n  let viewDirLen = max(length(viewDirRaw), 1e-5);\n  let viewDir = viewDirRaw / vec3<f32>(viewDirLen);\n  var widthDir = cross(viewDir, dir);\n  var widthDirLen = length(widthDir);\n  if (widthDirLen <= 1e-5) {\n    widthDir = cross(normalize(camera.up.xyz), dir);\n    widthDirLen = length(widthDir);\n  }\n  if (widthDirLen <= 1e-5) {\n    widthDir = cross(dir, normalize(camera.right.xyz));\n    widthDirLen = length(widthDir);\n  }\n  widthDir = select(\n    vec3<f32>(0.0, 1.0, 0.0),\n    widthDir / vec3<f32>(max(widthDirLen, 1e-5)),\n    widthDirLen > 1e-5\n  );\n`\n      : `\n  var widthDir = vec3<f32>(-dir.y, dir.x, 0.0);\n  if (camera.position.w <= 0.5) {\n    let viewDirRaw = camera.position.xyz - centerPos;\n    let viewDirLen = max(length(viewDirRaw), 1e-5);\n    let viewDir = viewDirRaw / vec3<f32>(viewDirLen);\n    widthDir = cross(viewDir, dir);\n    var widthDirLen = length(widthDir);\n    if (widthDirLen <= 1e-5) {\n      widthDir = cross(normalize(camera.up.xyz), dir);\n      widthDirLen = length(widthDir);\n    }\n    if (widthDirLen <= 1e-5) {\n      widthDir = cross(dir, normalize(camera.right.xyz));\n      widthDirLen = length(widthDir);\n    }\n    widthDir = select(\n      vec3<f32>(0.0, 1.0, 0.0),\n      widthDir / vec3<f32>(max(widthDirLen, 1e-5)),\n      widthDirLen > 1e-5\n    );\n  } else {\n    widthDir = normalize(widthDir);\n  }\n`);\n\n  const bindingLines = [];\n  const addBinding = (name, storage, type) => {\n    if (!hasBinding(name)) return;\n    const binding = bindingIndex(name);\n    const declaration = storage\n      ? `@group(0) @binding(${binding}) var<storage, read> ${name} : ${type};`\n      : `@group(0) @binding(${binding}) var<uniform> ${name} : ${type};`;\n    bindingLines.push(declaration);\n  };\n\n  addBinding('camera', false, 'Camera');\n  addBinding('edgeIndices', true, 'EdgeIndices');\n  addBinding('edgeEndpoints', true, 'EdgeEndpoints');\n  addBinding('nodePositions', true, 'NodePositions');\n  if (positionInterpolationEnabled) addBinding('nodePositionsFrom', true, 'NodePositionsFrom');\n  addBinding('nodeSizes', true, 'NodeSizes');\n  addBinding('nodeColors', true, 'NodeColors');\n  if (endpointStateEnabled) addBinding('nodeStates', true, 'NodeStates');\n  addBinding('edgeColors', true, 'EdgeColors');\n  addBinding('edgeWidths', true, 'EdgeWidths');\n  if (trimEnabled) addBinding('edgeEndpointSizes', true, 'EdgeEndpointSizes');\n  addBinding('edgeOpacities', true, 'EdgeOpacities');\n  if (edgeStateEnabled) addBinding('edgeStates', true, 'EdgeStates');\n  addBinding('globals', false, 'Globals');\n  addBinding('hover', false, 'Hover');\n  if (useEdgeShading) addBinding('shading', false, 'Shading');\n  addBinding('edgeNodeColorSource', true, 'EdgeNodeColorSource');\n  addBinding('edgeNodeWidthSource', true, 'EdgeNodeScalarSource');\n  addBinding('edgeNodeOpacitySource', true, 'EdgeNodeScalarSource');\n  if (trimEnabled) addBinding('edgeNodeEndpointSizeSource', true, 'EdgeNodeScalarSource');\n\n  const EDGE_WGSL = /* wgsl */ `\nconst EDGE_COLOR_ENDPOINTS : u32 = ${color.endpoints}u;\nconst EDGE_WIDTH_ENDPOINTS : u32 = ${width.endpoints}u;\nconst EDGE_OPACITY_ENDPOINTS : u32 = ${opacity.endpoints}u;\nconst EDGE_ENDPOINT_SIZE_ENDPOINTS : u32 = ${endpointSize.endpoints}u;\n\nstruct Camera {\n  viewProjection: mat4x4<f32>,\n  view: mat4x4<f32>,\n  position: vec4<f32>,\n  up: vec4<f32>,\n  right: vec4<f32>,\n  // viewport.xy = width/height in pixels, viewport.zw = 1/width,1/height\n  viewport: vec4<f32>,\n};\n\nstruct Globals {\n  nodeOpacity: vec2<f32>, // base, scale\n  nodeSize: vec2<f32>, // base, scale\n  nodeOutline: vec2<f32>, // base, scale (applied to node size attribute)\n  edgeOpacity: vec2<f32>, // base, scale\n  edgeWidth: vec2<f32>, // base, scale\n  _pad0: vec2<f32>, // x=semanticZoomExponent\n  nodeColor: vec4<f32>,\n  nodeRaw: vec2<f32>, // x=nodeSizeRaw y=nodeOutlineRaw\n  _pad1: vec2<f32>,\n  nodeOutlineColor: vec4<f32>,\n  edgeColorStart: vec4<f32>,\n  edgeColorEnd: vec4<f32>,\n  edgeWidthRaw: vec2<f32>,\n  edgeOpacityRaw: vec2<f32>,\n  edgeEndpointSizeRaw: vec2<f32>,\n  _pad2: vec2<f32>,\n  edgeTrim: vec4<f32>, // edgeTrim.x used, rest padding\n  nodeNoStateScale: vec4<f32>, // x=sizeMul y=opacityMul z=outlineMul w=discard(>0.5)\n  nodeNoStateColorMul: vec4<f32>,\n  nodeNoStateColorAdd: vec4<f32>,\n  edgeNoStateScale: vec4<f32>, // x=widthMul y=opacityMul w=discard(>0.5)\n  edgeNoStateColorMul: vec4<f32>,\n  edgeNoStateColorAdd: vec4<f32>,\n  nodeStateScale: array<vec4<f32>, ${STATE_SLOTS}>,\n  nodeStateColorMul: array<vec4<f32>, ${STATE_SLOTS}>,\n  nodeStateColorAdd: array<vec4<f32>, ${STATE_SLOTS}>,\n  edgeStateScale: array<vec4<f32>, ${STATE_SLOTS}>,\n  edgeStateColorMul: array<vec4<f32>, ${STATE_SLOTS}>,\n  edgeStateColorAdd: array<vec4<f32>, ${STATE_SLOTS}>,\n  positionInterpolation: vec4<f32>, // x=factor y=enabled\n};\n\nstruct EdgeIndices {\n  data: array<u32>,\n};\n\nstruct EdgeEndpoints {\n  data: array<vec2<u32>>,\n};\n\nstruct NodePositions {\n  data: array<f32>, // packed xyz triplets\n};\n\nstruct NodePositionsFrom {\n  data: array<f32>, // packed xyz triplets\n};\n\nstruct NodeSizes {\n  data: array<f32>,\n};\n\nstruct NodeColors {\n  data: array<vec4<f32>>,\n};\n\nstruct NodeStates {\n  data: array<u32>,\n};\n\nstruct EdgeColors {\n  data: array<vec4<f32>>,\n};\n\nstruct EdgeWidths {\n  data: array<vec2<f32>>,\n};\n\nstruct EdgeEndpointSizes {\n  data: array<vec2<f32>>,\n};\n\nstruct EdgeOpacities {\n  data: array<vec2<f32>>,\n};\n\nstruct EdgeStates {\n  data: array<u32>,\n};\n\nstruct EdgeNodeColorSource {\n  data: array<vec4<f32>>,\n};\n\nstruct EdgeNodeScalarSource {\n  data: array<f32>,\n};\n\nstruct Hover {\n  nodeIndex: u32,\n  nodeState: u32,\n  edgeIndex: u32,\n  edgeState: u32,\n  nodeStateForceMaxAlphaMask: u32,\n  edgeStateForceMaxAlphaMask: u32,\n  nodeVirtual: u32,\n  edgeVirtual: u32,\n  nodeHoverScale: vec4<f32>,\n  nodeHoverColorMul: vec4<f32>,\n  nodeHoverColorAdd: vec4<f32>,\n  edgeHoverScale: vec4<f32>,\n  edgeHoverColorMul: vec4<f32>,\n  edgeHoverColorAdd: vec4<f32>,\n};\n\nstruct Shading {\n  lightDirection: vec4<f32>,\n  lightColor: vec4<f32>,\n  ambientTopColor: vec4<f32>,\n  ambientBottomColor: vec4<f32>,\n  specularColor: vec4<f32>,\n  params: vec4<f32>, // x=specularStrength y=shininess z=diffuseStrength w=ambientStrength\n};\n\n${bindingLines.join('\\n')}\n\nfn selectNodePair(sourceValue: f32, targetValue: f32, endpoints: u32) -> vec2<f32> {\n  if (endpoints == 0u) {\n    return vec2<f32>(sourceValue, targetValue);\n  }\n  if (endpoints == 1u) {\n    return vec2<f32>(sourceValue, sourceValue);\n  }\n  return vec2<f32>(targetValue, targetValue);\n}\n\nstruct ColorPair {\n  start: vec4<f32>,\n  end: vec4<f32>,\n};\n\nfn selectNodeColor(sourceColor: vec4<f32>, targetColor: vec4<f32>, endpoints: u32) -> ColorPair {\n  if (endpoints == 0u) {\n    return ColorPair(sourceColor, targetColor);\n  }\n  if (endpoints == 1u) {\n    return ColorPair(sourceColor, sourceColor);\n  }\n  return ColorPair(targetColor, targetColor);\n}\n\nfn semanticZoomScale() -> f32 {\n  let is2D = camera.position.w > 0.5;\n  if (!is2D) {\n    return 1.0;\n  }\n  let exponent = globals._pad0.x;\n  if (exponent <= 0.0 || exponent != exponent) {\n    return 1.0;\n  }\n  let zoom2D = max(abs(camera.view[0][0]), 1e-3);\n  if (exponent == 1.0) {\n    return 1.0 / zoom2D;\n  }\n  return 1.0 / pow(zoom2D, exponent);\n}\n\n${useEdgeShading\n    ? `\nfn applyEdgeShading(baseColor: vec3<f32>, edgeYInput: f32, shadeBasis: vec2<f32>) -> vec3<f32> {\n  let edgeY = clamp(edgeYInput, -1.0, 1.0);\n  var basis = shadeBasis;\n  let basisLen = length(basis);\n  basis = select(vec2<f32>(0.0, 1.0), basis / vec2<f32>(max(basisLen, 1e-5)), basisLen > 1e-5);\n  let normal = normalize(vec3<f32>(basis * edgeY, sqrt(max(1.0 - edgeY * edgeY, 0.0))));\n  let lightDir = normalize(shading.lightDirection.xyz);\n  let ambient = mix(shading.ambientBottomColor.xyz, shading.ambientTopColor.xyz, normal.z * 0.5 + 0.5)\n    * shading.params.w;\n  let diffuse = max(dot(lightDir, normal), 0.0);\n  let reflection = reflect(-lightDir, normal);\n  let specular = pow(max(dot(vec3<f32>(0.0, 0.0, 1.0), reflection), 0.0), max(shading.params.y, 1.0))\n    * shading.params.x;\n  let shaded = baseColor * (ambient + shading.lightColor.xyz * (diffuse * shading.params.z))\n    + shading.specularColor.xyz * specular;\n  return clamp(shaded, vec3<f32>(0.0), vec3<f32>(1.0));\n}`\n    : ''}\n\nstruct EdgeVertexOutput {\n  @builtin(position) position : vec4<f32>,\n  @location(0) color : vec4<f32>,\n  @location(1) weight : f32,\n  @location(2) @interpolate(flat) discardFlag : u32,\n  ${useEdgeShading ? '@location(3) edgeLocal : vec2<f32>,' : ''}\n  ${useEdgeShading ? '@location(4) edgeShadeBasis : vec2<f32>,' : ''}\n  ${useEdgeShading ? '@location(5) @interpolate(flat) edgeShadeEnabled : u32,' : ''}\n};\n\n@vertex\nfn edgeVertex(@builtin(vertex_index) vertexIndex : u32) -> EdgeVertexOutput {\n  let edgeSlot = vertexIndex / 2u;\n  ${edgeIdVertexSnippet}\n  let endpoints = edgeEndpoints.data[edgeId];\n  let sourceId = endpoints.x;\n  let targetId = endpoints.y;\n  let sourceBase = sourceId * 3u;\n  let targetBase = targetId * 3u;\n  let startPosTo = vec3<f32>(\n    nodePositions.data[sourceBase + 0u],\n    nodePositions.data[sourceBase + 1u],\n    nodePositions.data[sourceBase + 2u]\n  );\n  let endPosTo = vec3<f32>(\n    nodePositions.data[targetBase + 0u],\n    nodePositions.data[targetBase + 1u],\n    nodePositions.data[targetBase + 2u]\n  );\n  var startPos = startPosTo;\n  var endPos = endPosTo;\n  ${positionInterpolationEnabled ? `\n  let startPosFrom = vec3<f32>(\n    nodePositionsFrom.data[sourceBase + 0u],\n    nodePositionsFrom.data[sourceBase + 1u],\n    nodePositionsFrom.data[sourceBase + 2u]\n  );\n  let endPosFrom = vec3<f32>(\n    nodePositionsFrom.data[targetBase + 0u],\n    nodePositionsFrom.data[targetBase + 1u],\n    nodePositionsFrom.data[targetBase + 2u]\n  );\n  let interpolationT = clamp(globals.positionInterpolation.x, 0.0, 1.0);\n  let interpolationEnabled = globals.positionInterpolation.y > 0.5;\n  startPos = select(startPosTo, mix(startPosFrom, startPosTo, interpolationT), interpolationEnabled);\n  endPos = select(endPosTo, mix(endPosFrom, endPosTo, interpolationT), interpolationEnabled);\n  ` : ''}\n  ${edgeStateSnippet}\n\n  ${edgeLineGeometrySnippet}\n  ${edgeLineVisualSnippet}\n  let opacity = clamp(globals.edgeOpacity.x + globals.edgeOpacity.y * attrOpacity, 0.0, 1.0) * opacityMul;\n  let rgb = clamp(color.rgb * rgbMul + rgbAdd, vec3<f32>(0.0), vec3<f32>(1.0));\n  let weight = max(opacity * color.a, 0.0);\n  let alpha = clamp(weight, 0.0, 1.0);\n  var output : EdgeVertexOutput;\n  output.position = camera.viewProjection * vec4<f32>(position, 1.0);\n  output.color = vec4<f32>(rgb, select(alpha, 1.0, forceMaxAlpha));\n  output.weight = select(weight, max(weight, ${FORCE_VISIBILITY_BOOST.toFixed(1)}), forceMaxAlpha);\n  output.discardFlag = discardFlag;\n  ${useEdgeShading ? 'output.edgeLocal = vec2<f32>(0.0, 0.0);\\n  output.edgeShadeBasis = vec2<f32>(0.0, 1.0);\\n  output.edgeShadeEnabled = 0u;' : ''}\n  return output;\n}\n\nstruct EdgeQuadInput {\n  @location(0) corner : vec2<f32>,\n  @builtin(instance_index) instance : u32,\n};\n\n@vertex\nfn edgeQuadVertex(input : EdgeQuadInput) -> EdgeVertexOutput {\n  ${edgeIdQuadSnippet}\n  let endpoints = edgeEndpoints.data[edgeId];\n  let sourceId = endpoints.x;\n  let targetId = endpoints.y;\n  let sourceBase = sourceId * 3u;\n  let targetBase = targetId * 3u;\n  let startPosTo = vec3<f32>(\n    nodePositions.data[sourceBase + 0u],\n    nodePositions.data[sourceBase + 1u],\n    nodePositions.data[sourceBase + 2u]\n  );\n  let endPosTo = vec3<f32>(\n    nodePositions.data[targetBase + 0u],\n    nodePositions.data[targetBase + 1u],\n    nodePositions.data[targetBase + 2u]\n  );\n  var startPos = startPosTo;\n  var endPos = endPosTo;\n  ${positionInterpolationEnabled ? `\n  let startPosFrom = vec3<f32>(\n    nodePositionsFrom.data[sourceBase + 0u],\n    nodePositionsFrom.data[sourceBase + 1u],\n    nodePositionsFrom.data[sourceBase + 2u]\n  );\n  let endPosFrom = vec3<f32>(\n    nodePositionsFrom.data[targetBase + 0u],\n    nodePositionsFrom.data[targetBase + 1u],\n    nodePositionsFrom.data[targetBase + 2u]\n  );\n  let interpolationT = clamp(globals.positionInterpolation.x, 0.0, 1.0);\n  let interpolationEnabled = globals.positionInterpolation.y > 0.5;\n  startPos = select(startPosTo, mix(startPosFrom, startPosTo, interpolationT), interpolationEnabled);\n  endPos = select(endPosTo, mix(endPosFrom, endPosTo, interpolationT), interpolationEnabled);\n  ` : ''}\n  ${edgeStateSnippet}\n\n  ${edgeGeometrySetupSnippet}\n  ${edgeEndpointGeometrySnippet}\n\n  var colorStart = globals.edgeColorStart;\n  var colorEnd = globals.edgeColorEnd;\n  ${edgeColorBufferSnippet}\n  ${edgeColorNodeSnippet}\n\n  var endpointWidth = globals.edgeWidthRaw;\n  ${edgeWidthBufferSnippet}\n  ${edgeWidthNodeSnippet}\n\n  var opacityPair = globals.edgeOpacityRaw;\n  ${edgeOpacityBufferSnippet}\n  ${edgeOpacityNodeSnippet}\n\n  let cornerT = clamp(input.corner.x, 0.0, 1.0);\n  var width = max((globals.edgeWidth.x + globals.edgeWidth.y * mix(endpointWidth.x, endpointWidth.y, cornerT)) * widthMul, 0.0) * semanticScale;\n  ${edgeQuadWidthClampSnippet}\n  let halfWidth = max(width, 1e-3) * 0.5;\n  let centerPos = mix(startPos, endPos, cornerT);\n  ${edgeQuadWidthDirSnippet}\n  var shadeBasis = vec2<f32>(\n    dot(widthDir, normalize(camera.right.xyz)),\n    dot(widthDir, normalize(camera.up.xyz))\n  );\n  let shadeBasisLen = length(shadeBasis);\n  shadeBasis = select(\n    vec2<f32>(0.0, 1.0),\n    shadeBasis / vec2<f32>(max(shadeBasisLen, 1e-5)),\n    shadeBasisLen > 1e-5\n  );\n  let worldPos = centerPos + widthDir * halfWidth * input.corner.y;\n  let clipPos = camera.viewProjection * vec4<f32>(worldPos, 1.0);\n\n  var output : EdgeVertexOutput;\n  output.position = clipPos;\n  let blended = mix(colorStart, colorEnd, cornerT);\n  let blendedOpacity = mix(opacityPair.x, opacityPair.y, cornerT);\n  let opacity = clamp(globals.edgeOpacity.x + globals.edgeOpacity.y * blendedOpacity, 0.0, 1.0) * opacityMul;\n  let weight = max(opacity * blended.a, 0.0);\n  let alpha = clamp(weight, 0.0, 1.0);\n  let rgb = clamp(blended.rgb * rgbMul + rgbAdd, vec3<f32>(0.0), vec3<f32>(1.0));\n  output.color = vec4<f32>(rgb, select(alpha, 1.0, forceMaxAlpha));\n  output.weight = select(weight, max(weight, ${FORCE_VISIBILITY_BOOST.toFixed(1)}), forceMaxAlpha);\n  output.discardFlag = discardFlag;\n  ${useEdgeShading ? 'output.edgeLocal = input.corner;\\n  output.edgeShadeBasis = shadeBasis;\\n  output.edgeShadeEnabled = 1u;' : ''}\n  return output;\n}\n\n@fragment\nfn edgeFragment(input : EdgeVertexOutput) -> @location(0) vec4<f32> {\n  if (input.discardFlag == 1u) {\n    discard;\n  }\n  let rgb = ${useEdgeShading\n    ? 'select(input.color.rgb, applyEdgeShading(input.color.rgb, input.edgeLocal.y, input.edgeShadeBasis), input.edgeShadeEnabled == 1u)'\n    : 'input.color.rgb'};\n  return vec4<f32>(rgb, input.color.a);\n}\n\n@fragment\nfn edgePremulFragment(input : EdgeVertexOutput) -> @location(0) vec4<f32> {\n  if (input.discardFlag == 1u) {\n    discard;\n  }\n  let rgb = ${useEdgeShading\n    ? 'select(input.color.rgb, applyEdgeShading(input.color.rgb, input.edgeLocal.y, input.edgeShadeBasis), input.edgeShadeEnabled == 1u)'\n    : 'input.color.rgb'};\n  return vec4<f32>(rgb * input.color.a, input.color.a);\n}\n`;\n\n  const EDGE_WEIGHTED_WGSL = /* wgsl */ `\n${EDGE_WGSL}\n\nstruct EdgeWeightedOutput {\n  @location(0) colorAccum : vec4<f32>,\n  @location(1) weightAccum : vec4<f32>,\n};\n\n@fragment\nfn edgeWeightedFragment(input : EdgeVertexOutput) -> EdgeWeightedOutput {\n  if (input.discardFlag == 1u) {\n    discard;\n  }\n  let rgb = ${useEdgeShading\n    ? 'select(input.color.rgb, applyEdgeShading(input.color.rgb, input.edgeLocal.y, input.edgeShadeBasis), input.edgeShadeEnabled == 1u)'\n    : 'input.color.rgb'};\n  let weight = input.weight;\n  var output : EdgeWeightedOutput;\n  output.colorAccum = vec4<f32>(rgb * weight, weight);\n  output.weightAccum = vec4<f32>(weight, 0.0, 0.0, 0.0);\n  return output;\n}`;\n\n  return {\n    EDGE_WGSL,\n    EDGE_WEIGHTED_WGSL,\n  };\n}\n","import { invertMat4, resolveContextViewport } from './AmbientOcclusionCommon.js';\nimport { normalizeAmbientOcclusionMode } from './AmbientOcclusionMode.js';\nimport { getAmbientOcclusionQualityPreset } from './AmbientOcclusionQuality.js';\n\nfunction formatFloat(value) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return '0.0';\n  const fixed = numeric.toFixed(8).replace(/0+$/, '').replace(/\\.$/, '');\n  return fixed.includes('.') ? fixed : `${fixed}.0`;\n}\n\nfunction createSmoothAoComputeSource(preset) {\n  const kernel = preset.smoothKernel\n    .map(([x, y]) => `  vec2<f32>(${formatFloat(x)}, ${formatFloat(y)})`)\n    .join(',\\n');\n  return /* wgsl */ `\nstruct AmbientOcclusionSettings {\n  invViewProjection : mat4x4<f32>,\n  viewProjection : mat4x4<f32>,\n  view : mat4x4<f32>,\n  cameraPosition : vec4<f32>,\n  sizes : vec4<f32>, // fullWidth, fullHeight, aoWidth, aoHeight\n  params : vec4<f32>, // radius, bias, depthSharpness, strength\n  altParams : vec4<f32>, // intensityScale, intensityShift, reserved, reserved\n};\n\n@group(0) @binding(0) var<uniform> settings : AmbientOcclusionSettings;\n@group(0) @binding(1) var depthTex : texture_depth_2d;\n@group(0) @binding(2) var aoOut : texture_storage_2d<rgba8unorm, write>;\n\nconst SAMPLE_COUNT : i32 = ${preset.smoothSampleCount};\nconst KERNEL : array<vec2<f32>, ${preset.smoothSampleCount}> = array<vec2<f32>, ${preset.smoothSampleCount}>(\n${kernel}\n);\n\nfn hash12(p : vec2<f32>) -> f32 {\n  let p3 = fract(vec3<f32>(p.x, p.y, p.x) * 0.1031);\n  let q = p3 + dot(p3, p3.yzx + vec3<f32>(33.33));\n  return fract((q.x + q.y) * q.z);\n}\n\nfn fullSize() -> vec2<i32> {\n  return vec2<i32>(i32(settings.sizes.x), i32(settings.sizes.y));\n}\n\nfn aoSize() -> vec2<i32> {\n  return vec2<i32>(i32(settings.sizes.z), i32(settings.sizes.w));\n}\n\nfn readDepthFromUv(uv : vec2<f32>) -> f32 {\n  let size = fullSize();\n  let px = clamp(vec2<i32>(vec2<f32>(size) * uv), vec2<i32>(0), size - vec2<i32>(1));\n  return textureLoad(depthTex, px, 0);\n}\n\nfn reconstructWorld(uv : vec2<f32>, depth : f32) -> vec3<f32> {\n  let uvClip = vec2<f32>(uv.x, 1.0 - uv.y);\n  let clip = vec4<f32>(uvClip * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);\n  let world = settings.invViewProjection * clip;\n  return world.xyz / max(world.w, 1e-6);\n}\n\nfn reconstructNormal(uv : vec2<f32>, centerDepth : f32, center : vec3<f32>) -> vec3<f32> {\n  let texel = vec2<f32>(1.0 / settings.sizes.x, 1.0 / settings.sizes.y);\n  let uvLeft = clamp(uv - vec2<f32>(texel.x, 0.0), vec2<f32>(0.0), vec2<f32>(1.0));\n  let uvRight = clamp(uv + vec2<f32>(texel.x, 0.0), vec2<f32>(0.0), vec2<f32>(1.0));\n  let uvDown = clamp(uv - vec2<f32>(0.0, texel.y), vec2<f32>(0.0), vec2<f32>(1.0));\n  let uvUp = clamp(uv + vec2<f32>(0.0, texel.y), vec2<f32>(0.0), vec2<f32>(1.0));\n  let depthLeft = readDepthFromUv(uvLeft);\n  let depthRight = readDepthFromUv(uvRight);\n  let depthDown = readDepthFromUv(uvDown);\n  let depthUp = readDepthFromUv(uvUp);\n  let pLeft = reconstructWorld(uvLeft, depthLeft);\n  let pRight = reconstructWorld(uvRight, depthRight);\n  let pDown = reconstructWorld(uvDown, depthDown);\n  let pUp = reconstructWorld(uvUp, depthUp);\n  var dx = center - pLeft;\n  if (abs(depthRight - centerDepth) <= abs(centerDepth - depthLeft)) {\n    dx = pRight - center;\n  }\n  var dy = center - pDown;\n  if (abs(depthUp - centerDepth) <= abs(centerDepth - depthDown)) {\n    dy = pUp - center;\n  }\n  var n = cross(dx, dy);\n  let lenN = length(n);\n  if (!(lenN > 1e-6)) {\n    return vec3<f32>(0.0, 0.0, 1.0);\n  }\n  n = n / lenN;\n  let viewDir = normalize(settings.cameraPosition.xyz - center);\n  if (dot(n, viewDir) < 0.0) {\n    n = -n;\n  }\n  return n;\n}\n\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n  let size = aoSize();\n  if (i32(gid.x) >= size.x || i32(gid.y) >= size.y) {\n    return;\n  }\n  let pixel = vec2<f32>(f32(gid.x), f32(gid.y));\n  let uv = (pixel + 0.5) / vec2<f32>(settings.sizes.z, settings.sizes.w);\n  let centerDepth = readDepthFromUv(uv);\n  if (centerDepth >= 0.999999) {\n    textureStore(aoOut, vec2<i32>(i32(gid.x), i32(gid.y)), vec4<f32>(1.0, 1.0, 1.0, 1.0));\n    return;\n  }\n\n  let center = reconstructWorld(uv, centerDepth);\n  let normal = reconstructNormal(uv, centerDepth, center);\n  let fullTexel = vec2<f32>(1.0 / settings.sizes.x, 1.0 / settings.sizes.y);\n  let radius = max(settings.params.x, 1.0);\n  let bias = max(settings.params.y, 0.0);\n  let angle = hash12(pixel) * 6.28318530718;\n  let rot = mat2x2<f32>(\n    vec2<f32>(cos(angle), sin(angle)),\n    vec2<f32>(-sin(angle), cos(angle))\n  );\n\n  var occlusion = 0.0;\n  var weightSum = 0.0;\n  for (var i = 0; i < SAMPLE_COUNT; i = i + 1) {\n    let offset = rot * KERNEL[i] * (radius * fullTexel);\n    let sampleUv = clamp(uv + offset, vec2<f32>(0.0), vec2<f32>(1.0));\n    let sampleDepth = readDepthFromUv(sampleUv);\n    if (sampleDepth >= 0.999999) {\n      continue;\n    }\n    let samplePos = reconstructWorld(sampleUv, sampleDepth);\n    let delta = samplePos - center;\n    let distanceSq = max(dot(delta, delta), 1e-5);\n    let deltaDir = normalize(delta);\n    let angular = max(dot(normal, deltaDir) - bias, 0.0);\n    let attenuation = 1.0 / (1.0 + distanceSq * 0.2);\n    occlusion = occlusion + angular * attenuation;\n    weightSum = weightSum + attenuation;\n  }\n\n  var ao = 1.0;\n  if (weightSum > 1e-5) {\n    ao = clamp(1.0 - (occlusion / weightSum) * ${formatFloat(preset.occlusionScale)}, 0.0, 1.0);\n  }\n  textureStore(aoOut, vec2<i32>(i32(gid.x), i32(gid.y)), vec4<f32>(ao, ao, ao, 1.0));\n}`;\n}\n\nfunction createAltAoComputeSource(preset) {\n  const kernel = preset.altKernel\n    .map(([x, y, z]) => `  vec3<f32>(${formatFloat(x)}, ${formatFloat(y)}, ${formatFloat(z)})`)\n    .join(',\\n');\n  return /* wgsl */ `\nstruct AmbientOcclusionSettings {\n  invViewProjection : mat4x4<f32>,\n  viewProjection : mat4x4<f32>,\n  view : mat4x4<f32>,\n  cameraPosition : vec4<f32>,\n  sizes : vec4<f32>,\n  params : vec4<f32>,\n  altParams : vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> settings : AmbientOcclusionSettings;\n@group(0) @binding(1) var depthTex : texture_depth_2d;\n@group(0) @binding(2) var aoOut : texture_storage_2d<rgba8unorm, write>;\n\nconst SAMPLE_COUNT : i32 = ${preset.altSampleCount};\nconst KERNEL : array<vec3<f32>, ${preset.altSampleCount}> = array<vec3<f32>, ${preset.altSampleCount}>(\n${kernel}\n);\n\nfn hash12(p : vec2<f32>) -> f32 {\n  let p3 = fract(vec3<f32>(p.x, p.y, p.x) * 0.1031);\n  let q = p3 + dot(p3, p3.yzx + vec3<f32>(33.33));\n  return fract((q.x + q.y) * q.z);\n}\n\nfn fullSize() -> vec2<i32> {\n  return vec2<i32>(i32(settings.sizes.x), i32(settings.sizes.y));\n}\n\nfn aoSize() -> vec2<i32> {\n  return vec2<i32>(i32(settings.sizes.z), i32(settings.sizes.w));\n}\n\nfn readDepthFromUv(uv : vec2<f32>) -> f32 {\n  let size = fullSize();\n  let px = clamp(vec2<i32>(vec2<f32>(size) * uv), vec2<i32>(0), size - vec2<i32>(1));\n  return textureLoad(depthTex, px, 0);\n}\n\nfn reconstructWorld(uv : vec2<f32>, depth : f32) -> vec3<f32> {\n  let uvClip = vec2<f32>(uv.x, 1.0 - uv.y);\n  let clip = vec4<f32>(uvClip * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);\n  let world = settings.invViewProjection * clip;\n  return world.xyz / max(world.w, 1e-6);\n}\n\nfn reconstructNormal(uv : vec2<f32>, centerDepth : f32, center : vec3<f32>) -> vec3<f32> {\n  let texel = vec2<f32>(1.0 / settings.sizes.x, 1.0 / settings.sizes.y);\n  let uvLeft = clamp(uv - vec2<f32>(texel.x, 0.0), vec2<f32>(0.0), vec2<f32>(1.0));\n  let uvRight = clamp(uv + vec2<f32>(texel.x, 0.0), vec2<f32>(0.0), vec2<f32>(1.0));\n  let uvDown = clamp(uv - vec2<f32>(0.0, texel.y), vec2<f32>(0.0), vec2<f32>(1.0));\n  let uvUp = clamp(uv + vec2<f32>(0.0, texel.y), vec2<f32>(0.0), vec2<f32>(1.0));\n  let depthLeft = readDepthFromUv(uvLeft);\n  let depthRight = readDepthFromUv(uvRight);\n  let depthDown = readDepthFromUv(uvDown);\n  let depthUp = readDepthFromUv(uvUp);\n  let pLeft = reconstructWorld(uvLeft, depthLeft);\n  let pRight = reconstructWorld(uvRight, depthRight);\n  let pDown = reconstructWorld(uvDown, depthDown);\n  let pUp = reconstructWorld(uvUp, depthUp);\n  var dx = center - pLeft;\n  if (abs(depthRight - centerDepth) <= abs(centerDepth - depthLeft)) {\n    dx = pRight - center;\n  }\n  var dy = center - pDown;\n  if (abs(depthUp - centerDepth) <= abs(centerDepth - depthDown)) {\n    dy = pUp - center;\n  }\n  var n = cross(dx, dy);\n  let lenN = length(n);\n  if (!(lenN > 1e-6)) {\n    return vec3<f32>(0.0, 0.0, 1.0);\n  }\n  n = n / lenN;\n  let viewDir = normalize(settings.cameraPosition.xyz - center);\n  if (dot(n, viewDir) < 0.0) {\n    n = -n;\n  }\n  return n;\n}\n\nfn orthogonal(normal : vec3<f32>) -> vec3<f32> {\n  if (abs(normal.z) < 0.999) {\n    return normalize(cross(normal, vec3<f32>(0.0, 0.0, 1.0)));\n  }\n  return normalize(cross(normal, vec3<f32>(0.0, 1.0, 0.0)));\n}\n\nfn worldToView(world : vec3<f32>) -> vec3<f32> {\n  return (settings.view * vec4<f32>(world, 1.0)).xyz;\n}\n\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n  let size = aoSize();\n  if (i32(gid.x) >= size.x || i32(gid.y) >= size.y) {\n    return;\n  }\n  let pixel = vec2<f32>(f32(gid.x), f32(gid.y));\n  let uv = (pixel + 0.5) / vec2<f32>(settings.sizes.z, settings.sizes.w);\n  let centerDepth = readDepthFromUv(uv);\n  if (centerDepth >= 0.999999) {\n    textureStore(aoOut, vec2<i32>(i32(gid.x), i32(gid.y)), vec4<f32>(1.0, 1.0, 1.0, 1.0));\n    return;\n  }\n\n  let center = reconstructWorld(uv, centerDepth);\n  let centerView = worldToView(center);\n  let normal = reconstructNormal(uv, centerDepth, center);\n  let fullTexel = vec2<f32>(1.0 / settings.sizes.x, 1.0 / settings.sizes.y);\n  let px = reconstructWorld(uv + vec2<f32>(fullTexel.x, 0.0), readDepthFromUv(uv + vec2<f32>(fullTexel.x, 0.0)));\n  let py = reconstructWorld(uv + vec2<f32>(0.0, fullTexel.y), readDepthFromUv(uv + vec2<f32>(0.0, fullTexel.y)));\n  let pixelWorld = max(0.5 * (length(px - center) + length(py - center)), 1e-4);\n  let worldRadius = max(settings.params.x, 1.0) * pixelWorld;\n  let bias = max(settings.params.y, 0.0);\n\n  let angle = hash12(pixel) * 6.28318530718;\n  let randomVec = vec3<f32>(cos(angle), sin(angle), 0.0);\n  var tangent = randomVec - normal * dot(randomVec, normal);\n  let tangentLength = length(tangent);\n  if (!(tangentLength > 1e-6)) {\n    tangent = orthogonal(normal);\n  } else {\n    tangent = tangent / tangentLength;\n  }\n  let bitangent = normalize(cross(normal, tangent));\n  let tbn = mat3x3<f32>(tangent, bitangent, normal);\n\n  var occlusion = 0.0;\n  for (var i = 0; i < SAMPLE_COUNT; i = i + 1) {\n    let sampleWorld = center + (tbn * KERNEL[i]) * worldRadius;\n    let sampleClip = settings.viewProjection * vec4<f32>(sampleWorld, 1.0);\n    if (!(sampleClip.w > 1e-6)) {\n      continue;\n    }\n    let sampleNdc = sampleClip.xyz / sampleClip.w;\n    let sampleUv = vec2<f32>(sampleNdc.x * 0.5 + 0.5, 1.0 - (sampleNdc.y * 0.5 + 0.5));\n    if (any(sampleUv < vec2<f32>(0.0)) || any(sampleUv > vec2<f32>(1.0))) {\n      continue;\n    }\n    let sampleDepth = readDepthFromUv(sampleUv);\n    if (sampleDepth >= 0.999999) {\n      continue;\n    }\n    let occluderWorld = reconstructWorld(sampleUv, sampleDepth);\n    let occluderView = worldToView(occluderWorld);\n    let sampleView = worldToView(sampleWorld);\n    let rangeCheck = smoothstep(0.0, 1.0, worldRadius / max(abs(centerView.z - occluderView.z), 1e-4));\n    let blocked = select(0.0, 1.0, occluderView.z >= sampleView.z + bias);\n    occlusion = occlusion + blocked * rangeCheck;\n  }\n\n  let occ = occlusion / f32(SAMPLE_COUNT);\n  let ao = 1.0 - clamp((occ - settings.altParams.y) * settings.altParams.x, 0.0, 1.0);\n  textureStore(aoOut, vec2<i32>(i32(gid.x), i32(gid.y)), vec4<f32>(ao, ao, ao, 1.0));\n}`;\n}\n\nfunction createBlurSource(preset) {\n  const radius = preset.blurRadius;\n  const weights = preset.blurWeights.map((value) => formatFloat(value)).join(', ');\n  return /* wgsl */ `\nstruct AmbientOcclusionSettings {\n  invViewProjection : mat4x4<f32>,\n  viewProjection : mat4x4<f32>,\n  view : mat4x4<f32>,\n  cameraPosition : vec4<f32>,\n  sizes : vec4<f32>,\n  params : vec4<f32>,\n  altParams : vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> settings : AmbientOcclusionSettings;\n@group(0) @binding(1) var depthTex : texture_depth_2d;\n@group(0) @binding(2) var aoIn : texture_2d<f32>;\n@group(0) @binding(3) var aoOut : texture_storage_2d<rgba8unorm, write>;\n@group(0) @binding(4) var<uniform> direction : vec4<f32>;\n\nconst BLUR_RADIUS : i32 = ${radius};\nconst BLUR_WEIGHTS : array<f32, ${radius + 1}> = array<f32, ${radius + 1}>(${weights});\n\nfn fullSize() -> vec2<i32> {\n  return vec2<i32>(i32(settings.sizes.x), i32(settings.sizes.y));\n}\n\nfn aoSize() -> vec2<i32> {\n  return vec2<i32>(i32(settings.sizes.z), i32(settings.sizes.w));\n}\n\nfn readDepthFromUv(uv : vec2<f32>) -> f32 {\n  let size = fullSize();\n  let px = clamp(vec2<i32>(vec2<f32>(size) * uv), vec2<i32>(0), size - vec2<i32>(1));\n  return textureLoad(depthTex, px, 0);\n}\n\nfn readAo(coord : vec2<i32>) -> f32 {\n  let size = aoSize();\n  let clamped = clamp(coord, vec2<i32>(0), size - vec2<i32>(1));\n  return textureLoad(aoIn, clamped, 0).x;\n}\n\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n  let size = aoSize();\n  if (i32(gid.x) >= size.x || i32(gid.y) >= size.y) {\n    return;\n  }\n  let coord = vec2<i32>(i32(gid.x), i32(gid.y));\n  let uv = (vec2<f32>(f32(gid.x), f32(gid.y)) + 0.5) / vec2<f32>(settings.sizes.z, settings.sizes.w);\n  let centerDepth = readDepthFromUv(uv);\n  var sum = readAo(coord) * BLUR_WEIGHTS[0];\n  var weightSum = BLUR_WEIGHTS[0];\n  for (var i = 1; i <= BLUR_RADIUS; i = i + 1) {\n    let spatial = BLUR_WEIGHTS[i];\n    let delta = vec2<i32>(\n      i32(round(direction.x * f32(i))),\n      i32(round(direction.y * f32(i)))\n    );\n    let coordA = coord + delta;\n    let coordB = coord - delta;\n    let uvA = (vec2<f32>(coordA) + 0.5) / vec2<f32>(settings.sizes.z, settings.sizes.w);\n    let uvB = (vec2<f32>(coordB) + 0.5) / vec2<f32>(settings.sizes.z, settings.sizes.w);\n    let depthA = readDepthFromUv(uvA);\n    let depthB = readDepthFromUv(uvB);\n    let weightA = spatial * exp(-abs(depthA - centerDepth) * settings.params.z);\n    let weightB = spatial * exp(-abs(depthB - centerDepth) * settings.params.z);\n    sum = sum + readAo(coordA) * weightA;\n    sum = sum + readAo(coordB) * weightB;\n    weightSum = weightSum + weightA + weightB;\n  }\n  let ao = sum / max(weightSum, 1e-5);\n  textureStore(aoOut, coord, vec4<f32>(ao, ao, ao, 1.0));\n}`;\n}\n\nconst AO_COMPOSITE_WGSL = /* wgsl */ `\nstruct VertexOut {\n  @builtin(position) position : vec4<f32>,\n  @location(0) uv : vec2<f32>,\n};\n\nstruct CompositeSettings {\n  strength : vec4<f32>,\n};\n\n@group(0) @binding(0) var textureSampler : sampler;\n@group(0) @binding(1) var aoTex : texture_2d<f32>;\n@group(0) @binding(2) var<uniform> settings : CompositeSettings;\n\n@vertex\nfn vs(@location(0) position : vec2<f32>, @location(1) uv : vec2<f32>) -> VertexOut {\n  var output : VertexOut;\n  output.position = vec4<f32>(position, 0.0, 1.0);\n  output.uv = uv;\n  return output;\n}\n\n@fragment\nfn fs(input : VertexOut) -> @location(0) vec4<f32> {\n  // Offscreen textures are addressed top-left in WebGPU, so fullscreen UVs must flip Y.\n  let uvFlipped = vec2<f32>(input.uv.x, 1.0 - input.uv.y);\n  let ao = textureSampleLevel(aoTex, textureSampler, uvFlipped, 0.0).x;\n  let alpha = clamp((1.0 - ao) * settings.strength.x, 0.0, 1.0);\n  return vec4<f32>(0.0, 0.0, 0.0, alpha);\n}`;\n\nexport class AmbientOcclusionWebGPU {\n  constructor(device) {\n    this.device = device;\n    this.gpu = device?.device ?? null;\n    this.sampler = null;\n    this.settingsBuffer = null;\n    this.settingsArray = new Float32Array(64);\n    this.blurHorizontalDirectionBuffer = null;\n    this.blurVerticalDirectionBuffer = null;\n    this.compositeSettingsBuffer = null;\n    this.compositeSettingsArray = new Float32Array(4);\n    this.prepassColor = null;\n    this.prepassDepth = null;\n    this.aoRaw = null;\n    this.aoPing = null;\n    this.aoPong = null;\n    this.fullSize = { width: 0, height: 0 };\n    this.aoSize = { width: 0, height: 0 };\n    this.aoPipelines = new Map();\n    this.blurPipelines = new Map();\n    this.compositePipeline = null;\n    this.aoBindGroupLayout = null;\n    this.blurBindGroupLayout = null;\n    this.compositeBindGroupLayout = null;\n    this.aoBindGroup = null;\n    this.blurHorizontalBindGroup = null;\n    this.blurVerticalBindGroup = null;\n    this.compositeBindGroup = null;\n    this.invViewProjection = new Float32Array(16);\n  }\n\n  destroy() {\n    this.prepassColor?.destroy?.();\n    this.prepassDepth?.destroy?.();\n    this.aoRaw?.destroy?.();\n    this.aoPing?.destroy?.();\n    this.aoPong?.destroy?.();\n    this.settingsBuffer?.destroy?.();\n    this.blurHorizontalDirectionBuffer?.destroy?.();\n    this.blurVerticalDirectionBuffer?.destroy?.();\n    this.compositeSettingsBuffer?.destroy?.();\n  }\n\n  ensureBuffers() {\n    if (!this.gpu || this.settingsBuffer) return;\n    this.settingsBuffer = this.gpu.createBuffer({\n      size: this.settingsArray.byteLength,\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n    });\n    this.blurHorizontalDirectionBuffer = this.gpu.createBuffer({\n      size: 16,\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n    });\n    this.blurVerticalDirectionBuffer = this.gpu.createBuffer({\n      size: 16,\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n    });\n    this.gpu.queue.writeBuffer(this.blurHorizontalDirectionBuffer, 0, new Float32Array([1, 0, 0, 0]));\n    this.gpu.queue.writeBuffer(this.blurVerticalDirectionBuffer, 0, new Float32Array([0, 1, 0, 0]));\n    this.compositeSettingsBuffer = this.gpu.createBuffer({\n      size: this.compositeSettingsArray.byteLength,\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n    });\n    this.sampler = this.gpu.createSampler({ magFilter: 'linear', minFilter: 'linear' });\n  }\n\n  ensureTextures(width, height, colorFormat, quality) {\n    if (!this.gpu) return false;\n    const fullWidth = Math.max(1, Math.floor(width));\n    const fullHeight = Math.max(1, Math.floor(height));\n    const aoWidth = Math.max(1, Math.round(fullWidth * quality.resolutionScale));\n    const aoHeight = Math.max(1, Math.round(fullHeight * quality.resolutionScale));\n\n    const recreateFull = this.fullSize.width !== fullWidth || this.fullSize.height !== fullHeight;\n    const recreateAo = this.aoSize.width !== aoWidth || this.aoSize.height !== aoHeight;\n\n    if (recreateFull) {\n      this.prepassColor?.destroy?.();\n      this.prepassDepth?.destroy?.();\n      this.prepassColor = this.gpu.createTexture({\n        size: { width: fullWidth, height: fullHeight, depthOrArrayLayers: 1 },\n        format: colorFormat,\n        usage: GPUTextureUsage.RENDER_ATTACHMENT,\n      });\n      this.prepassDepth = this.gpu.createTexture({\n        size: { width: fullWidth, height: fullHeight, depthOrArrayLayers: 1 },\n        format: this.device.depthFormat ?? 'depth24plus',\n        usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,\n      });\n      this.fullSize = { width: fullWidth, height: fullHeight };\n    }\n\n    if (recreateAo) {\n      this.aoRaw?.destroy?.();\n      this.aoPing?.destroy?.();\n      this.aoPong?.destroy?.();\n      const usage = GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC;\n      this.aoRaw = this.gpu.createTexture({\n        size: { width: aoWidth, height: aoHeight, depthOrArrayLayers: 1 },\n        format: 'rgba8unorm',\n        usage,\n      });\n      this.aoPing = this.gpu.createTexture({\n        size: { width: aoWidth, height: aoHeight, depthOrArrayLayers: 1 },\n        format: 'rgba8unorm',\n        usage,\n      });\n      this.aoPong = this.gpu.createTexture({\n        size: { width: aoWidth, height: aoHeight, depthOrArrayLayers: 1 },\n        format: 'rgba8unorm',\n        usage,\n      });\n      this.aoSize = { width: aoWidth, height: aoHeight };\n    }\n    return true;\n  }\n\n  ensurePipelines(mode, format, sampleCount = 1, quality) {\n    if (!this.gpu) return false;\n    this.ensureBuffers();\n    if (!this.aoBindGroupLayout) {\n      this.aoBindGroupLayout = this.gpu.createBindGroupLayout({\n        entries: [\n          { binding: 0, visibility: GPUShaderStage.COMPUTE, buffer: { type: 'uniform' } },\n          { binding: 1, visibility: GPUShaderStage.COMPUTE, texture: { sampleType: 'depth' } },\n          { binding: 2, visibility: GPUShaderStage.COMPUTE, storageTexture: { access: 'write-only', format: 'rgba8unorm' } },\n        ],\n      });\n      this.blurBindGroupLayout = this.gpu.createBindGroupLayout({\n        entries: [\n          { binding: 0, visibility: GPUShaderStage.COMPUTE, buffer: { type: 'uniform' } },\n          { binding: 1, visibility: GPUShaderStage.COMPUTE, texture: { sampleType: 'depth' } },\n          { binding: 2, visibility: GPUShaderStage.COMPUTE, texture: { sampleType: 'float' } },\n          { binding: 3, visibility: GPUShaderStage.COMPUTE, storageTexture: { access: 'write-only', format: 'rgba8unorm' } },\n          { binding: 4, visibility: GPUShaderStage.COMPUTE, buffer: { type: 'uniform' } },\n        ],\n      });\n      this.compositeBindGroupLayout = this.gpu.createBindGroupLayout({\n        entries: [\n          { binding: 0, visibility: GPUShaderStage.FRAGMENT, sampler: {} },\n          { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'float' } },\n          { binding: 2, visibility: GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n        ],\n      });\n    }\n    const aoKey = `${mode}|${quality.key}`;\n    if (!this.aoPipelines.has(aoKey)) {\n      const module = this.gpu.createShaderModule({\n        code: mode === 'fast' ? createAltAoComputeSource(quality) : createSmoothAoComputeSource(quality),\n      });\n      this.aoPipelines.set(aoKey, this.gpu.createComputePipeline({\n        layout: this.gpu.createPipelineLayout({ bindGroupLayouts: [this.aoBindGroupLayout] }),\n        compute: { module, entryPoint: 'main' },\n      }));\n    }\n    if (!this.blurPipelines.has(quality.key)) {\n      const module = this.gpu.createShaderModule({ code: createBlurSource(quality) });\n      this.blurPipelines.set(quality.key, this.gpu.createComputePipeline({\n        layout: this.gpu.createPipelineLayout({ bindGroupLayouts: [this.blurBindGroupLayout] }),\n        compute: { module, entryPoint: 'main' },\n      }));\n    }\n    const resolvedSampleCount = Number.isFinite(sampleCount) && sampleCount > 1 ? 4 : 1;\n    if (!this.compositePipeline || this._compositeKey !== `${format}|${resolvedSampleCount}`) {\n      const module = this.gpu.createShaderModule({ code: AO_COMPOSITE_WGSL });\n      this.compositePipeline = this.gpu.createRenderPipeline({\n        layout: this.gpu.createPipelineLayout({ bindGroupLayouts: [this.compositeBindGroupLayout] }),\n        vertex: {\n          module,\n          entryPoint: 'vs',\n          buffers: [\n            {\n              arrayStride: 16,\n              attributes: [\n                { shaderLocation: 0, offset: 0, format: 'float32x2' },\n                { shaderLocation: 1, offset: 8, format: 'float32x2' },\n              ],\n            },\n          ],\n        },\n        fragment: {\n          module,\n          entryPoint: 'fs',\n          targets: [{\n            format,\n            blend: {\n              color: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n              alpha: { srcFactor: 'zero', dstFactor: 'one', operation: 'add' },\n            },\n            writeMask: GPUColorWrite.RED | GPUColorWrite.GREEN | GPUColorWrite.BLUE,\n          }],\n        },\n        multisample: { count: resolvedSampleCount },\n        primitive: { topology: 'triangle-strip' },\n      });\n      this._compositeKey = `${format}|${resolvedSampleCount}`;\n    }\n    return true;\n  }\n\n  updateSettingsPacked(cameraUniforms, strength, radius, bias, quality, intensityScale, intensityShift) {\n    if (!this.gpu || !this.settingsBuffer || !invertMat4(this.invViewProjection, cameraUniforms?.viewProjection)) {\n      return false;\n    }\n    const packed = new Float32Array(64);\n    packed.set(this.invViewProjection, 0);\n    packed.set(cameraUniforms?.viewProjection ?? new Float32Array(16), 16);\n    packed.set(cameraUniforms?.view ?? new Float32Array(16), 32);\n    const position = cameraUniforms?.position ?? [0, 0, 1];\n    packed[48] = position[0] ?? 0;\n    packed[49] = position[1] ?? 0;\n    packed[50] = position[2] ?? 1;\n    packed[51] = 0;\n    packed[52] = this.fullSize.width;\n    packed[53] = this.fullSize.height;\n    packed[54] = this.aoSize.width;\n    packed[55] = this.aoSize.height;\n    packed[56] = Math.max(1, Number(radius) || 1);\n    packed[57] = Math.max(0, Number(bias) || 0);\n    packed[58] = quality.depthSharpness;\n    packed[59] = Math.max(0, Number(strength) || 0);\n    packed[60] = Math.max(0, Number(intensityScale) || 0);\n    packed[61] = Math.max(0, Number(intensityShift) || 0);\n    packed[62] = 0;\n    packed[63] = 0;\n    this.gpu.queue.writeBuffer(this.settingsBuffer, 0, packed);\n    return true;\n  }\n\n  ensureBindGroups() {\n    if (\n      !this.gpu\n      || !this.settingsBuffer\n      || !this.blurHorizontalDirectionBuffer\n      || !this.blurVerticalDirectionBuffer\n      || !this.prepassDepth\n      || !this.aoRaw\n      || !this.aoPing\n      || !this.aoPong\n    ) {\n      return false;\n    }\n    this.aoBindGroup = this.gpu.createBindGroup({\n      layout: this.aoBindGroupLayout,\n      entries: [\n        { binding: 0, resource: { buffer: this.settingsBuffer } },\n        { binding: 1, resource: this.prepassDepth.createView() },\n        { binding: 2, resource: this.aoRaw.createView() },\n      ],\n    });\n    this.blurHorizontalBindGroup = this.gpu.createBindGroup({\n      layout: this.blurBindGroupLayout,\n      entries: [\n        { binding: 0, resource: { buffer: this.settingsBuffer } },\n        { binding: 1, resource: this.prepassDepth.createView() },\n        { binding: 2, resource: this.aoRaw.createView() },\n        { binding: 3, resource: this.aoPing.createView() },\n        { binding: 4, resource: { buffer: this.blurHorizontalDirectionBuffer } },\n      ],\n    });\n    this.blurVerticalBindGroup = this.gpu.createBindGroup({\n      layout: this.blurBindGroupLayout,\n      entries: [\n        { binding: 0, resource: { buffer: this.settingsBuffer } },\n        { binding: 1, resource: this.prepassDepth.createView() },\n        { binding: 2, resource: this.aoPing.createView() },\n        { binding: 3, resource: this.aoPong.createView() },\n        { binding: 4, resource: { buffer: this.blurVerticalDirectionBuffer } },\n      ],\n    });\n    this.compositeBindGroup = this.gpu.createBindGroup({\n      layout: this.compositeBindGroupLayout,\n      entries: [\n        { binding: 0, resource: this.sampler },\n        { binding: 1, resource: this.aoPong.createView() },\n        { binding: 2, resource: { buffer: this.compositeSettingsBuffer } },\n      ],\n    });\n    return true;\n  }\n\n  render(context, options = {}) {\n    if (!this.gpu) return false;\n    const mode = normalizeAmbientOcclusionMode(options.mode);\n    const quality = getAmbientOcclusionQualityPreset(options.quality);\n    const viewport = resolveContextViewport(context, context?.width ?? 1, context?.height ?? 1);\n    if (!this.ensureTextures(viewport.width, viewport.height, this.device.format, quality)) return false;\n    if (!this.ensurePipelines(mode, context.format, context.sampleCount ?? 1, quality)) return false;\n    this.ensureBuffers();\n    if (!this.updateSettingsPacked(\n      options.cameraUniforms,\n      options.strength,\n      options.radius,\n      options.bias,\n      quality,\n      options.intensityScale,\n      options.intensityShift,\n    )) return false;\n    this.compositeSettingsArray[0] = Math.max(0, Number(options.strength) || 0);\n    this.gpu.queue.writeBuffer(this.compositeSettingsBuffer, 0, this.compositeSettingsArray);\n    if (!this.ensureBindGroups()) return false;\n    const aoPipeline = this.aoPipelines.get(`${mode}|${quality.key}`);\n    const blurPipeline = this.blurPipelines.get(quality.key);\n    if (!aoPipeline || !blurPipeline) return false;\n\n    if (context.passEncoder) {\n      context.passEncoder.end();\n      context.passEncoder = null;\n    }\n\n    const commandEncoder = context.commandEncoder;\n    const prepass = commandEncoder.beginRenderPass({\n      colorAttachments: [{\n        view: this.prepassColor.createView(),\n        clearValue: { r: 0, g: 0, b: 0, a: 0 },\n        loadOp: 'clear',\n        storeOp: 'store',\n      }],\n      depthStencilAttachment: {\n        view: this.prepassDepth.createView(),\n        depthClearValue: 1.0,\n        depthLoadOp: 'clear',\n        depthStoreOp: 'store',\n      },\n    });\n    prepass.setViewport(0, 0, viewport.width, viewport.height, 0, 1);\n    if (options.selection?.nodes) options.drawNodes?.(prepass);\n    if (options.selection?.edges) options.drawEdges?.(prepass);\n    prepass.end();\n\n    const aoPass = commandEncoder.beginComputePass();\n    aoPass.setPipeline(aoPipeline);\n    aoPass.setBindGroup(0, this.aoBindGroup);\n    aoPass.dispatchWorkgroups(Math.ceil(this.aoSize.width / 8), Math.ceil(this.aoSize.height / 8), 1);\n    aoPass.end();\n\n    const blurHorizontal = commandEncoder.beginComputePass();\n    blurHorizontal.setPipeline(blurPipeline);\n    blurHorizontal.setBindGroup(0, this.blurHorizontalBindGroup);\n    blurHorizontal.dispatchWorkgroups(Math.ceil(this.aoSize.width / 8), Math.ceil(this.aoSize.height / 8), 1);\n    blurHorizontal.end();\n\n    const blurVertical = commandEncoder.beginComputePass();\n    blurVertical.setPipeline(blurPipeline);\n    blurVertical.setBindGroup(0, this.blurVerticalBindGroup);\n    blurVertical.dispatchWorkgroups(Math.ceil(this.aoSize.width / 8), Math.ceil(this.aoSize.height / 8), 1);\n    blurVertical.end();\n\n    const compositePass = commandEncoder.beginRenderPass({\n      colorAttachments: [{\n        view: context.colorView,\n        ...(context.resolveTargetView ? { resolveTarget: context.resolveTargetView } : {}),\n        loadOp: 'load',\n        storeOp: 'store',\n      }],\n    });\n    if (context.viewport) {\n      compositePass.setViewport(context.viewport.x, context.viewport.y, context.viewport.width, context.viewport.height, 0, 1);\n    }\n    compositePass.setPipeline(this.compositePipeline);\n    compositePass.setBindGroup(0, this.compositeBindGroup);\n    compositePass.setVertexBuffer(0, context.quad);\n    compositePass.draw(4, 1, 0, 0);\n    context.passEncoder = compositePass;\n    return true;\n  }\n}\n\nexport default AmbientOcclusionWebGPU;\n","import { GraphLayerWebGPUBase } from './GraphLayerWebGPUBase.js';\nimport {\n  AMBIENT_OCCLUSION_BIAS_DEFAULT,\n  AMBIENT_OCCLUSION_RADIUS_DEFAULT,\n  AMBIENT_OCCLUSION_STRENGTH_DEFAULT,\n} from './GraphLayer.js';\nimport { createGraphWebGPUSources as createDynamicGraphWebGPUSources } from './shaders/graphWebGPU.js';\nimport { createGraphWebGPUSources as createBaseGraphWebGPUSources } from './shaders/graphWebGPUBase.js';\nimport { GraphVisualSchema } from '../schema/GraphVisualSchema.js';\nimport { VISUAL_ATTRIBUTE_NAMES } from '../../pipeline/constants.js';\nimport { AttributeType } from 'helios-network';\nimport { AmbientOcclusionWebGPU } from './AmbientOcclusionWebGPU.js';\nimport { normalizeAmbientOcclusionQuality } from './AmbientOcclusionQuality.js';\n\nconst {\n  NODE_COLOR_ATTRIBUTE,\n  NODE_POSITION_ATTRIBUTE,\n  NODE_SIZE_ATTRIBUTE,\n  NODE_STATE_ATTRIBUTE,\n  NODE_OUTLINE_COLOR_ATTRIBUTE,\n  NODE_OUTLINE_WIDTH_ATTRIBUTE,\n  EDGE_COLOR_ATTRIBUTE,\n  EDGE_OPACITY_ATTRIBUTE,\n  EDGE_WIDTH_ATTRIBUTE,\n  EDGE_STATE_ATTRIBUTE,\n  EDGE_ENDPOINTS_SIZE_ATTRIBUTE,\n} = VISUAL_ATTRIBUTE_NAMES;\nlet FALLBACK_TOPOLOGY_VERSION_COUNTER = 1;\n\nfunction normalizeEndpoints(value) {\n  if (value === 'source' || value === 'from') return 'source';\n  if (value === 'destination' || value === 'target' || value === 'to') return 'destination';\n  return 'both';\n}\n\nfunction warnOnce(owner, key, message, detail) {\n  if (!owner) return;\n  owner._warnedIssues ??= new Set();\n  if (owner._warnedIssues.has(key)) return;\n  owner._warnedIssues.add(key);\n  console.warn(message, detail);\n}\n\nfunction isMissingAttributeError(error) {\n  const message = typeof error?.message === 'string' ? error.message : '';\n  return (\n    message.includes('Unknown node attribute')\n    || message.includes('Unknown edge attribute')\n    || message.includes('Cannot perform attribute metadata lookup')\n  );\n}\n\nexport class GraphLayerWebGPU extends GraphLayerWebGPUBase {\n  constructor(options = {}) {\n    super(options);\n    this.nodeBindGroupLayouts = new Map();\n    this.nodeBindGroups = new Map();\n    this._nodeBuffersLastByKey = new Map();\n    this.edgeNodeSourceBuffers = {};\n    this.edgeNodeSourceBindings = null;\n    this.edgeBindGroupLayouts = new Map();\n    this.edgeBindGroups = new Map();\n    this._edgeBuffersLastByKey = new Map();\n  }\n\n  initializeWebGPU(device) {\n    super.initializeWebGPU(device);\n    const gpu = device?.device;\n    if (!gpu) return;\n    this.nodeBindGroupLayout = null;\n    this.nodeBindGroupLayoutOutline = null;\n    this.nodeBindGroup = null;\n    this.nodeBindGroupOutline = null;\n    this.nodeBindGroupLayouts.clear();\n    this.nodeBindGroups.clear();\n    this._nodeBuffersLastByKey.clear();\n    this.edgeBindGroupLayout = null;\n    this.edgeBindGroup = null;\n    this.edgeBindGroupLayouts.clear();\n    this.edgeBindGroups.clear();\n    this._edgeBuffersLastByKey.clear();\n    this.edgeModules.clear();\n    this.edgeWeightedModules.clear();\n    this.edgePipelineCache.clear();\n    this.edgeQuadPipelineCache.clear();\n    this.ambientOcclusion = new AmbientOcclusionWebGPU(device);\n  }\n\n  destroy() {\n    this.ambientOcclusion?.destroy?.();\n    this.ambientOcclusion = null;\n    super.destroy();\n  }\n\n  composeNodeVariantKey(useIndices, variant) {\n    return [\n      useIndices ? 'idx' : 'id',\n      `c:${variant?.colorBuffer ? 'B' : 'U'}`,\n      `s:${variant?.sizeBuffer ? 'B' : 'U'}`,\n      `st:${variant?.stateBuffer ? 'B' : '0'}`,\n      `ow:${variant?.outlineWidthBuffer ? 'B' : 'U'}`,\n      `oc:${variant?.outlineColorBuffer ? 'B' : 'U'}`,\n      `pi:${variant?.positionInterpolation ? 1 : 0}`,\n      `sh:${variant?.shading ? 1 : 0}`,\n    ].join('|');\n  }\n\n  resolveNodeVariant(visualConfig) {\n    const base = super.resolveNodeVariant(visualConfig);\n    return {\n      ...base,\n      stateBuffer: this.hasActiveNodeStateStyling(),\n      positionInterpolation: this.getPositionInterpolationState?.()?.enabled === true,\n      shading: this.isNodeShadingEnabled(),\n    };\n  }\n\n  resolveNodeBindings(useIndices, variant) {\n    const key = this.composeNodeVariantKey(useIndices, variant);\n    const cached = this.nodeBindGroupLayouts.get(key);\n    if (cached) return cached;\n    const device = this.device?.device;\n    if (!device) return null;\n\n    const specs = [];\n    let binding = 0;\n    const push = (name, visibility, type = 'read-only-storage') => {\n      specs.push({ name, binding, visibility, type });\n      binding += 1;\n    };\n\n    push('camera', GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, 'uniform');\n    if (useIndices) push('nodeIndices', GPUShaderStage.VERTEX);\n    push('nodePositions', GPUShaderStage.VERTEX);\n    if (variant?.sizeBuffer) push('nodeSizes', GPUShaderStage.VERTEX);\n    if (variant?.colorBuffer) push('nodeColors', GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT);\n    if (variant?.stateBuffer) push('nodeStates', GPUShaderStage.VERTEX);\n    push('globals', GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, 'uniform');\n    push('hover', GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, 'uniform');\n    if (variant?.shading) push('shading', GPUShaderStage.FRAGMENT, 'uniform');\n    if (variant?.outlineWidthBuffer) push('nodeOutlineWidths', GPUShaderStage.VERTEX);\n    if (variant?.outlineColorBuffer) push('nodeOutlineColors', GPUShaderStage.VERTEX);\n    if (variant?.positionInterpolation) push('nodePositionsFrom', GPUShaderStage.VERTEX);\n\n    const entries = specs.map((spec) => ({\n      binding: spec.binding,\n      visibility: spec.visibility,\n      buffer: { type: spec.type },\n    }));\n    const layout = device.createBindGroupLayout({ entries });\n    const bindings = {};\n    for (const spec of specs) bindings[spec.name] = spec.binding;\n    const result = { key, layout, bindings, specs, variant };\n    this.nodeBindGroupLayouts.set(key, result);\n    return result;\n  }\n\n  getNodeVariantKey(useIndices, variant) {\n    return this.composeNodeVariantKey(useIndices, variant);\n  }\n\n  getNodeModule(useIndices, variant) {\n    const key = this.getNodeVariantKey(useIndices, variant);\n    if (this.nodeModules.has(key)) return this.nodeModules.get(key);\n    const device = this.device?.device;\n    if (!device) return null;\n    const bindingInfo = this.resolveNodeBindings(useIndices, variant);\n    const sources = createBaseGraphWebGPUSources(this.stateSlotCount, {\n      useNodeIndices: useIndices,\n      useEdgeIndices: true,\n      bindings: bindingInfo?.bindings ?? null,\n      node: {\n        color: variant?.colorBuffer ? 'buffer' : 'uniform',\n        size: variant?.sizeBuffer ? 'buffer' : 'uniform',\n        state: variant?.stateBuffer ? 'buffer' : 'none',\n        outline: variant?.outlineWidthBuffer ? 'buffer' : 'uniform',\n        outlineColor: variant?.outlineColorBuffer ? 'buffer' : 'uniform',\n        positionInterpolation: variant?.positionInterpolation === true,\n        shading: variant?.shading === true,\n      },\n    });\n    const module = device.createShaderModule({ code: sources.NODE_WGSL });\n    this.nodeModules.set(key, module);\n    return module;\n  }\n\n  getNodePipeline(useIndices, variant, options = {}) {\n    const blendKey = options.blendKey ?? 'alpha';\n    const depthMode = options.depthMode ?? 'depth';\n    const sampleCount = Number.isFinite(options.sampleCount) && options.sampleCount > 1 ? 4 : 1;\n    const key = `${this.getNodeVariantKey(useIndices, variant)}|b:${blendKey}|d:${depthMode}|s:${sampleCount}`;\n    if (this.nodePipelineCache.has(key)) return this.nodePipelineCache.get(key);\n    const device = this.device?.device;\n    const nodeModule = this.getNodeModule(useIndices, variant);\n    const bindGroupLayout = this.resolveNodeBindings(useIndices, variant)?.layout ?? null;\n    if (!device || !nodeModule || !bindGroupLayout || !this.baseDepthStencil) return null;\n\n    const alphaBlend = {\n      color: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n      alpha: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n    };\n    const blend = options.blend ?? alphaBlend;\n    const depthStencil = depthMode === 'none'\n      ? { ...this.baseDepthStencil, depthWriteEnabled: false, depthCompare: 'always' }\n      : this.baseDepthStencil;\n\n    const pipeline = device.createRenderPipeline({\n      layout: device.createPipelineLayout({ bindGroupLayouts: [bindGroupLayout] }),\n      vertex: {\n        module: nodeModule,\n        entryPoint: 'nodeVertex',\n        buffers: [\n          {\n            arrayStride: 8,\n            attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x2' }],\n            stepMode: 'vertex',\n          },\n        ],\n      },\n      fragment: {\n        module: nodeModule,\n        entryPoint: 'nodeFragment',\n        targets: [{ format: this.device.format, blend }],\n      },\n      depthStencil,\n      multisample: { count: sampleCount },\n      primitive: { topology: 'triangle-strip' },\n    });\n\n    this.nodePipelineCache.set(key, pipeline);\n    return pipeline;\n  }\n\n  composeEdgeVariantKey(useIndices, variant) {\n    return [\n      useIndices ? 'idx' : 'id',\n      `f:${variant?.fastPath ? 1 : 0}`,\n      `cm:${variant?.cameraMode ?? '3d'}`,\n      `sz:${variant?.semanticZoom ? 1 : 0}`,\n      `tr:${variant?.trim ? 1 : 0}`,\n      `wc:${variant?.widthClampToNodeDiameter ? 1 : 0}`,\n      `st:${variant?.edgeState ? 1 : 0}`,\n      `et:${variant?.endpointState ? 1 : 0}`,\n      `ph:${variant?.propagateHoveredNodeToEdges ? 1 : 0}`,\n      `ps:${variant?.propagateSelectedNodesToEdges ? 1 : 0}`,\n      `pi:${variant?.positionInterpolation ? 1 : 0}`,\n      `sh:${variant?.shading ? 1 : 0}`,\n      `c:${variant?.colorBuffer ? 'B' : 'U'}:${variant?.colorSource}:${variant?.colorEndpoints}:${variant?.colorDoubleWidth ? 1 : 0}:${variant?.colorNodeAttribute ?? ''}`,\n      `w:${variant?.widthBuffer ? 'B' : 'U'}:${variant?.widthSource}:${variant?.widthEndpoints}:${variant?.widthDoubleWidth ? 1 : 0}:${variant?.widthNodeAttribute ?? ''}`,\n      `o:${variant?.opacityBuffer ? 'B' : 'U'}:${variant?.opacitySource}:${variant?.opacityEndpoints}:${variant?.opacityDoubleWidth ? 1 : 0}:${variant?.opacityNodeAttribute ?? ''}`,\n      `es:${variant?.endpointSizeBuffer ? 'B' : 'U'}:${variant?.endpointSizeSource}:${variant?.endpointSizeEndpoints}:${variant?.endpointSizeDoubleWidth ? 1 : 0}:${variant?.endpointSizeNodeAttribute ?? ''}`,\n    ].join('|');\n  }\n\n  countEdgeVariantVertexStorageBindings(useIndices, variant) {\n    let count = 0;\n    const pushStorage = (enabled) => {\n      if (enabled) count += 1;\n    };\n    if (useIndices) pushStorage(true);\n    pushStorage(true); // edgeEndpoints\n    pushStorage(true); // nodePositions\n    pushStorage(variant?.positionInterpolation === true);\n    pushStorage(variant?.endpointState === true);\n    pushStorage(variant?.edgeState === true);\n    pushStorage(variant?.colorBuffer === true);\n    pushStorage(variant?.widthBuffer === true);\n    pushStorage(variant?.opacityBuffer === true);\n    pushStorage(variant?.endpointSizeBuffer === true);\n    return count;\n  }\n\n  normalizeEdgeVariantForBudget(useIndices, variant) {\n    if (!variant || typeof variant !== 'object') return variant;\n    const limit = this.device?.device?.limits?.maxStorageBuffersPerShaderStage ?? Infinity;\n    if (!Number.isFinite(limit)) return variant;\n    const currentCount = this.countEdgeVariantVertexStorageBindings(useIndices, variant);\n    if (currentCount <= limit) return variant;\n\n    const downgraded = {\n      ...variant,\n      endpointState: false,\n      propagateSelectedNodesToEdges: false,\n    };\n    const downgradedCount = this.countEdgeVariantVertexStorageBindings(useIndices, downgraded);\n    if (downgradedCount <= limit) {\n      warnOnce(\n        this,\n        `webgpu-edge-budget:${this.composeEdgeVariantKey(useIndices, variant)}`,\n        'GraphLayerWebGPU: disabling endpoint-state edge specialization to stay within the WebGPU storage-buffer limit.',\n        {\n          requested: currentCount,\n          limit,\n          downgraded: downgradedCount,\n        },\n      );\n      return downgraded;\n    }\n\n    return variant;\n  }\n\n  resolveEdgeBindings(useIndices, variant) {\n    const effectiveVariant = this.normalizeEdgeVariantForBudget(useIndices, variant);\n    const key = this.composeEdgeVariantKey(useIndices, effectiveVariant);\n    const cached = this.edgeBindGroupLayouts.get(key);\n    if (cached) return cached;\n    const device = this.device?.device;\n    if (!device) return null;\n\n    const useEdgeColorBuffer = effectiveVariant?.colorBuffer && effectiveVariant?.colorSource !== 'node';\n    const useEdgeColorNode = effectiveVariant?.colorBuffer && effectiveVariant?.colorSource === 'node';\n    const useEdgeWidthBuffer = effectiveVariant?.widthBuffer && effectiveVariant?.widthSource !== 'node';\n    const useEdgeWidthNode = effectiveVariant?.widthBuffer && effectiveVariant?.widthSource === 'node';\n    const useEdgeOpacityBuffer = effectiveVariant?.opacityBuffer && effectiveVariant?.opacitySource !== 'node';\n    const useEdgeOpacityNode = effectiveVariant?.opacityBuffer && effectiveVariant?.opacitySource === 'node';\n    const useEdgeEndpointSizeBuffer = effectiveVariant?.endpointSizeBuffer && effectiveVariant?.endpointSizeSource !== 'node';\n    const useEdgeEndpointSizeNode = effectiveVariant?.endpointSizeBuffer && effectiveVariant?.endpointSizeSource === 'node';\n    const useEndpointState = effectiveVariant?.endpointState === true;\n    const useEdgeState = effectiveVariant?.edgeState === true;\n    const usePositionInterpolation = effectiveVariant?.positionInterpolation === true;\n\n    const specs = [];\n    let binding = 0;\n    const push = (name, visibility, type = 'read-only-storage') => {\n      specs.push({ name, binding, visibility, type });\n      binding += 1;\n    };\n\n    push('camera', GPUShaderStage.VERTEX, 'uniform');\n    if (useIndices) {\n      push('edgeIndices', GPUShaderStage.VERTEX);\n    }\n    push('edgeEndpoints', GPUShaderStage.VERTEX);\n    push('nodePositions', GPUShaderStage.VERTEX);\n    if (usePositionInterpolation) {\n      push('nodePositionsFrom', GPUShaderStage.VERTEX);\n    }\n    if (useEndpointState) {\n      push('nodeStates', GPUShaderStage.VERTEX);\n    }\n    if (useEdgeState) {\n      push('edgeStates', GPUShaderStage.VERTEX);\n    }\n    if (useEdgeColorNode) {\n      push('edgeNodeColorSource', GPUShaderStage.VERTEX);\n    } else if (useEdgeColorBuffer) {\n      push('edgeColors', GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT);\n    }\n    if (useEdgeWidthNode) {\n      push('edgeNodeWidthSource', GPUShaderStage.VERTEX);\n    } else if (useEdgeWidthBuffer) {\n      push('edgeWidths', GPUShaderStage.VERTEX);\n    }\n    if (useEdgeOpacityNode) {\n      push('edgeNodeOpacitySource', GPUShaderStage.VERTEX);\n    } else if (useEdgeOpacityBuffer) {\n      push('edgeOpacities', GPUShaderStage.VERTEX);\n    }\n    if (useEdgeEndpointSizeNode) {\n      push('edgeNodeEndpointSizeSource', GPUShaderStage.VERTEX);\n    } else if (useEdgeEndpointSizeBuffer) {\n      push('edgeEndpointSizes', GPUShaderStage.VERTEX);\n    }\n    push('globals', GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, 'uniform');\n    push('hover', GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, 'uniform');\n    if (effectiveVariant?.shading) {\n      push('shading', GPUShaderStage.FRAGMENT, 'uniform');\n    }\n\n    const entries = specs.map((spec) => ({\n      binding: spec.binding,\n      visibility: spec.visibility,\n      buffer: { type: spec.type },\n    }));\n    const layout = device.createBindGroupLayout({ entries });\n    const bindings = {};\n    for (const spec of specs) {\n      bindings[spec.name] = spec.binding;\n    }\n\n    const result = { key, layout, bindings, specs, variant: effectiveVariant };\n    this.edgeBindGroupLayouts.set(key, result);\n    return result;\n  }\n\n  resolveEdgeVariant(visualConfig, options = {}) {\n    const edgeCfg = visualConfig?.edge ?? null;\n    const fastPath = options.fastPath === true || this.isFastEdgeRenderingActive?.() === true;\n    const specialization = this.resolveEdgeSpecialization({\n      fastPath,\n      is2D: options.is2D === true,\n    });\n    const normalize = (entry, fallbackSource = 'edge') => {\n      if (!entry || typeof entry !== 'object') {\n        return {\n          mode: 'buffer',\n          source: fallbackSource,\n          endpoints: 'both',\n          doubleWidth: true,\n          nodeAttribute: null,\n        };\n      }\n      return {\n        mode: entry.mode ?? 'buffer',\n        source: entry.source ?? fallbackSource,\n        endpoints: normalizeEndpoints(entry.endpoints),\n        doubleWidth: entry.doubleWidth !== false,\n        nodeAttribute: entry.nodeAttribute ?? null,\n      };\n    };\n\n    const color = normalize(edgeCfg?.color, 'edge');\n    const width = normalize(edgeCfg?.width, 'edge');\n    const opacity = normalize(edgeCfg?.opacity, 'edge');\n    const endpointSize = normalize(edgeCfg?.endpointSize, 'edge');\n\n    if (fastPath) {\n      return {\n        colorBuffer: color.mode !== 'uniform',\n        colorSource: color.source,\n        colorEndpoints: color.endpoints,\n        colorDoubleWidth: color.doubleWidth,\n        colorNodeAttribute: color.nodeAttribute,\n        widthBuffer: false,\n        widthSource: 'edge',\n        widthEndpoints: 'both',\n        widthDoubleWidth: false,\n        widthNodeAttribute: null,\n        opacityBuffer: false,\n        opacitySource: 'edge',\n        opacityEndpoints: 'both',\n        opacityDoubleWidth: false,\n        opacityNodeAttribute: null,\n        endpointSizeBuffer: false,\n        endpointSizeSource: 'edge',\n        endpointSizeEndpoints: 'both',\n        endpointSizeDoubleWidth: false,\n        endpointSizeNodeAttribute: null,\n        shading: false,\n        cameraMode: specialization.cameraMode,\n        semanticZoom: specialization.semanticZoom,\n        trim: specialization.trim,\n        widthClampToNodeDiameter: specialization.widthClampToNodeDiameter,\n        edgeState: specialization.edgeState,\n        endpointState: specialization.endpointState,\n        propagateHoveredNodeToEdges: specialization.propagateHoveredNodeToEdges,\n        propagateSelectedNodesToEdges: specialization.propagateSelectedNodesToEdges,\n        positionInterpolation: this.getPositionInterpolationState?.()?.enabled === true,\n        fastPath: true,\n      };\n    }\n\n    return {\n      colorBuffer: color.mode !== 'uniform',\n      colorSource: color.source,\n      colorEndpoints: color.endpoints,\n      colorDoubleWidth: color.doubleWidth,\n      colorNodeAttribute: color.nodeAttribute,\n      widthBuffer: width.mode !== 'uniform',\n      widthSource: width.source,\n      widthEndpoints: width.endpoints,\n      widthDoubleWidth: width.doubleWidth,\n      widthNodeAttribute: width.nodeAttribute,\n      opacityBuffer: opacity.mode !== 'uniform',\n      opacitySource: opacity.source,\n      opacityEndpoints: opacity.endpoints,\n      opacityDoubleWidth: opacity.doubleWidth,\n      opacityNodeAttribute: opacity.nodeAttribute,\n      endpointSizeBuffer: (specialization.trim || specialization.widthClampToNodeDiameter) && endpointSize.mode !== 'uniform',\n      endpointSizeSource: endpointSize.source,\n      endpointSizeEndpoints: endpointSize.endpoints,\n      endpointSizeDoubleWidth: endpointSize.doubleWidth,\n      endpointSizeNodeAttribute: endpointSize.nodeAttribute,\n      shading: this.isEdgeShadingEnabled(),\n      cameraMode: specialization.cameraMode,\n      semanticZoom: specialization.semanticZoom,\n      trim: specialization.trim,\n      widthClampToNodeDiameter: specialization.widthClampToNodeDiameter,\n      edgeState: specialization.edgeState,\n      endpointState: specialization.endpointState,\n      propagateHoveredNodeToEdges: specialization.propagateHoveredNodeToEdges,\n      propagateSelectedNodesToEdges: specialization.propagateSelectedNodesToEdges,\n      positionInterpolation: this.getPositionInterpolationState?.()?.enabled === true,\n      fastPath: false,\n    };\n  }\n\n  getEdgeVariantKey(useIndices, variant) {\n    const effectiveVariant = this.normalizeEdgeVariantForBudget(useIndices, variant);\n    return this.composeEdgeVariantKey(useIndices, effectiveVariant);\n  }\n\n  getEdgeModule(useIndices, variant) {\n    const effectiveVariant = this.normalizeEdgeVariantForBudget(useIndices, variant);\n    const key = this.composeEdgeVariantKey(useIndices, effectiveVariant);\n    if (this.edgeModules.has(key)) return this.edgeModules.get(key);\n    const device = this.device?.device;\n    if (!device) return null;\n    const bindingInfo = this.resolveEdgeBindings(useIndices, effectiveVariant);\n    const sources = createDynamicGraphWebGPUSources(this.stateSlotCount, {\n      useEdgeIndices: useIndices,\n      bindings: bindingInfo?.bindings ?? null,\n      edge: {\n        fastPath: effectiveVariant?.fastPath === true,\n        cameraMode: effectiveVariant?.cameraMode ?? '3d',\n        semanticZoom: effectiveVariant?.semanticZoom === true,\n        trim: effectiveVariant?.trim === true,\n        widthClampToNodeDiameter: effectiveVariant?.widthClampToNodeDiameter === true,\n        edgeState: effectiveVariant?.edgeState === true,\n        endpointState: effectiveVariant?.endpointState === true,\n        propagateHoveredNodeToEdges: effectiveVariant?.propagateHoveredNodeToEdges === true,\n        propagateSelectedNodesToEdges: effectiveVariant?.propagateSelectedNodesToEdges === true,\n        shading: effectiveVariant?.shading === true,\n        color: {\n          mode: effectiveVariant?.colorBuffer ? 'buffer' : 'uniform',\n          source: effectiveVariant?.colorSource,\n          endpoints: effectiveVariant?.colorEndpoints,\n          doubleWidth: effectiveVariant?.colorDoubleWidth,\n        },\n        width: {\n          mode: effectiveVariant?.widthBuffer ? 'buffer' : 'uniform',\n          source: effectiveVariant?.widthSource,\n          endpoints: effectiveVariant?.widthEndpoints,\n          doubleWidth: effectiveVariant?.widthDoubleWidth,\n        },\n        opacity: {\n          mode: effectiveVariant?.opacityBuffer ? 'buffer' : 'uniform',\n          source: effectiveVariant?.opacitySource,\n          endpoints: effectiveVariant?.opacityEndpoints,\n          doubleWidth: effectiveVariant?.opacityDoubleWidth,\n        },\n        endpointSize: {\n          mode: effectiveVariant?.endpointSizeBuffer ? 'buffer' : 'uniform',\n          source: effectiveVariant?.endpointSizeSource,\n          endpoints: effectiveVariant?.endpointSizeEndpoints,\n          doubleWidth: effectiveVariant?.endpointSizeDoubleWidth,\n        },\n      },\n    });\n    const module = device.createShaderModule({ code: sources.EDGE_WGSL });\n    this.edgeModules.set(key, module);\n    return module;\n  }\n\n  getEdgeWeightedModule(useIndices, variant) {\n    const effectiveVariant = this.normalizeEdgeVariantForBudget(useIndices, variant);\n    const key = this.composeEdgeVariantKey(useIndices, effectiveVariant);\n    if (this.edgeWeightedModules.has(key)) return this.edgeWeightedModules.get(key);\n    const device = this.device?.device;\n    if (!device) return null;\n    const bindingInfo = this.resolveEdgeBindings(useIndices, effectiveVariant);\n    const sources = createDynamicGraphWebGPUSources(this.stateSlotCount, {\n      useEdgeIndices: useIndices,\n      bindings: bindingInfo?.bindings ?? null,\n      edge: {\n        fastPath: effectiveVariant?.fastPath === true,\n        cameraMode: effectiveVariant?.cameraMode ?? '3d',\n        semanticZoom: effectiveVariant?.semanticZoom === true,\n        trim: effectiveVariant?.trim === true,\n        widthClampToNodeDiameter: effectiveVariant?.widthClampToNodeDiameter === true,\n        edgeState: effectiveVariant?.edgeState === true,\n        endpointState: effectiveVariant?.endpointState === true,\n        propagateHoveredNodeToEdges: effectiveVariant?.propagateHoveredNodeToEdges === true,\n        propagateSelectedNodesToEdges: effectiveVariant?.propagateSelectedNodesToEdges === true,\n        shading: effectiveVariant?.shading === true,\n        color: {\n          mode: effectiveVariant?.colorBuffer ? 'buffer' : 'uniform',\n          source: effectiveVariant?.colorSource,\n          endpoints: effectiveVariant?.colorEndpoints,\n          doubleWidth: effectiveVariant?.colorDoubleWidth,\n        },\n        width: {\n          mode: effectiveVariant?.widthBuffer ? 'buffer' : 'uniform',\n          source: effectiveVariant?.widthSource,\n          endpoints: effectiveVariant?.widthEndpoints,\n          doubleWidth: effectiveVariant?.widthDoubleWidth,\n        },\n        opacity: {\n          mode: effectiveVariant?.opacityBuffer ? 'buffer' : 'uniform',\n          source: effectiveVariant?.opacitySource,\n          endpoints: effectiveVariant?.opacityEndpoints,\n          doubleWidth: effectiveVariant?.opacityDoubleWidth,\n        },\n        endpointSize: {\n          mode: effectiveVariant?.endpointSizeBuffer ? 'buffer' : 'uniform',\n          source: effectiveVariant?.endpointSizeSource,\n          endpoints: effectiveVariant?.endpointSizeEndpoints,\n          doubleWidth: effectiveVariant?.endpointSizeDoubleWidth,\n        },\n      },\n    });\n    const module = device.createShaderModule({ code: sources.EDGE_WEIGHTED_WGSL });\n    this.edgeWeightedModules.set(key, module);\n    return module;\n  }\n\n  createEdgePipelines(\n    key,\n    blend,\n    edgeModule,\n    depthStencil,\n    fragmentEntryPoint,\n    useIndices,\n    edgeVariant,\n    depthWriteEnabled,\n    sampleCount = 1,\n  ) {\n    const device = this.device?.device;\n    if (!device || !edgeModule || !depthStencil) return;\n    const bindingInfo = this.resolveEdgeBindings(useIndices, edgeVariant);\n    const edgeLayout = bindingInfo?.layout;\n    if (!edgeLayout) return;\n    const resolvedSampleCount = Number.isFinite(sampleCount) && sampleCount > 1 ? 4 : 1;\n    const linePipeline = device.createRenderPipeline({\n      layout: device.createPipelineLayout({ bindGroupLayouts: [edgeLayout] }),\n      vertex: { module: edgeModule, entryPoint: 'edgeVertex' },\n      fragment: {\n        module: edgeModule,\n        entryPoint: fragmentEntryPoint,\n        targets: [{ format: this.device.format, blend }],\n      },\n      depthStencil: { ...depthStencil, depthWriteEnabled: Boolean(depthWriteEnabled) },\n      multisample: { count: resolvedSampleCount },\n      primitive: { topology: 'line-list' },\n    });\n\n    const quadPipeline = device.createRenderPipeline({\n      layout: device.createPipelineLayout({ bindGroupLayouts: [edgeLayout] }),\n      vertex: {\n        module: edgeModule,\n        entryPoint: 'edgeQuadVertex',\n        buffers: [\n          {\n            arrayStride: 8,\n            attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x2' }],\n            stepMode: 'vertex',\n          },\n        ],\n      },\n      fragment: {\n        module: edgeModule,\n        entryPoint: fragmentEntryPoint,\n        targets: [{ format: this.device.format, blend }],\n      },\n      depthStencil: { ...depthStencil, depthWriteEnabled: Boolean(depthWriteEnabled) },\n      multisample: { count: resolvedSampleCount },\n      primitive: { topology: 'triangle-strip' },\n    });\n\n    const variantKey = this.getEdgeVariantKey(useIndices, edgeVariant);\n    const cacheKey = `${key}|${variantKey}|d${depthWriteEnabled ? 1 : 0}|s${resolvedSampleCount}`;\n    this.edgePipelineCache.set(cacheKey, linePipeline);\n    this.edgeQuadPipelineCache.set(cacheKey, quadPipeline);\n  }\n\n  ensureWeightedPipelines(device, swapchainFormat, useEdgeIndices, edgeVariant) {\n    const bindingInfo = this.resolveEdgeBindings(useEdgeIndices, edgeVariant);\n    if (!bindingInfo?.layout) return false;\n    const prevLayout = this.edgeBindGroupLayout;\n    this.edgeBindGroupLayout = bindingInfo.layout;\n    const result = super.ensureWeightedPipelines(device, swapchainFormat, useEdgeIndices, edgeVariant);\n    this.edgeBindGroupLayout = prevLayout;\n    return result;\n  }\n\n  updateNodeBuffersGpuIndirect(nodes, device, maxBindingSize, nodeVariant, uploads = {}, edgeSources = null) {\n    const {\n      positions,\n      positionBuffer,\n      sizes,\n      colors,\n      states,\n      outlineWidths,\n      outlineColors,\n      indices,\n      versions = {},\n      count,\n    } = nodes;\n    const nodeCount = Number.isFinite(count)\n      ? Math.max(0, Math.floor(count))\n      : Math.floor((indices?.length ?? 0));\n    const cache = this._nodeDataCache;\n    const v = nodeVariant && typeof nodeVariant === 'object'\n      ? nodeVariant\n      : {\n        colorBuffer: true,\n        sizeBuffer: true,\n        stateBuffer: this.hasActiveNodeStateStyling(),\n        outlineWidthBuffer: this.nodeOutlineUseAttributes === true,\n        outlineColorBuffer: this.nodeOutlineUseAttributes === true,\n        positionInterpolation: this.getPositionInterpolationState?.()?.enabled === true,\n      };\n    const uploadColors = Boolean(uploads.colors) || v.colorBuffer;\n    const uploadSizes = Boolean(uploads.sizes) || v.sizeBuffer;\n    const uploadPositions = uploads.positions !== false;\n    const uploadStates = Boolean(uploads.states) || v.stateBuffer;\n    if (!positions && !positionBuffer && nodeCount) {\n      throw new Error('Node positions buffer is missing for indirect rendering.');\n    }\n    if (uploadSizes && !sizes && nodeCount) {\n      throw new Error('Node sizes buffer is missing for indirect rendering.');\n    }\n    if (uploadColors && !colors && nodeCount) {\n      throw new Error('Node colors buffer is missing for indirect rendering.');\n    }\n    if (uploadStates && !states && nodeCount) {\n      throw new Error('Node states buffer is missing for indirect rendering.');\n    }\n\n    const storageUsage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX;\n    const resourceCache = this.device?.resourceCache?.webgpu;\n    if (!resourceCache) {\n      throw new Error('WebGPU resource cache is missing; expected device.resourceCache.webgpu.');\n    }\n\n    const checkBindingSize = (label, requiredBytes) => {\n      const aligned = Math.max(256, Math.ceil((requiredBytes ?? 0) / 256) * 256);\n      if (maxBindingSize && aligned > maxBindingSize) {\n        const message = `${label} requires ${aligned} bytes, exceeding maxStorageBufferBindingSize (${maxBindingSize}).`;\n        console.warn(message);\n        throw new Error(message);\n      }\n      return aligned;\n    };\n\n    const ensure = (key, requiredBytes, label) => {\n      checkBindingSize(label, requiredBytes);\n      return resourceCache.ensureBuffer(device, key, requiredBytes, storageUsage, label);\n    };\n    const interpolationState = this.getPositionInterpolationState?.() ?? this.positionInterpolation ?? null;\n    const interpolationEnabled = v.positionInterpolation === true && interpolationState?.enabled === true;\n    const interpolationSourceBuffer = interpolationState?.sourceWebGPUBuffer ?? null;\n    const interpolationSourceView = interpolationState?.sourceView ?? null;\n    const interpolationSourceVersion = Number.isFinite(interpolationState?.sourceVersion)\n      ? Number(interpolationState.sourceVersion)\n      : 0;\n    const interpolationSourceCount = Number.isFinite(interpolationState?.sourceCount)\n      ? Math.max(0, Math.floor(Number(interpolationState.sourceCount)))\n      : Math.floor((interpolationSourceView?.length ?? 0) / 3);\n    const delegatePositionBuffer = positionBuffer ?? null;\n\n    if (!indices && nodeCount) {\n      throw new Error('Node index buffer is missing for indirect rendering.');\n    }\n\n    this.nodeBuffersGpu.indices = ensure('indirect:node:indices', indices?.byteLength ?? 4, 'Node index buffer');\n    this.nodeBuffersGpu.positions = delegatePositionBuffer\n      ? { buffer: delegatePositionBuffer }\n      : ensure(\n        'indirect:node:positions',\n        positions?.byteLength ?? 12,\n        'Node position buffer',\n      );\n    this.nodeBuffersGpu.sizes = uploadSizes\n      ? ensure('indirect:node:sizes', sizes?.byteLength ?? 4, 'Node size buffer')\n      : null;\n    this.nodeBuffersGpu.colors = uploadColors\n      ? ensure('indirect:node:colors', colors?.byteLength ?? 16, 'Node color buffer')\n      : null;\n    this.nodeBuffersGpu.states = uploadStates\n      ? ensure('indirect:node:states', states?.byteLength ?? 4, 'Node state buffer')\n      : null;\n    if (interpolationEnabled) {\n      if (interpolationSourceBuffer) {\n        this.nodeBuffersGpu.positionsFrom = { buffer: interpolationSourceBuffer };\n      } else if (interpolationSourceView) {\n        this.nodeBuffersGpu.positionsFrom = ensure(\n          'indirect:node:positionsFrom',\n          interpolationSourceView?.byteLength ?? 12,\n          'Node interpolation source position buffer',\n        );\n      } else {\n        this.nodeBuffersGpu.positionsFrom = this.nodeBuffersGpu.positions;\n      }\n    } else {\n      this.nodeBuffersGpu.positionsFrom = null;\n    }\n\n    this.nodeBuffersGpu.outlineWidths = v.outlineWidthBuffer\n      ? ensure('indirect:node:outlineWidths', outlineWidths?.byteLength ?? 4, 'Node outline width buffer')\n      : null;\n    this.nodeBuffersGpu.outlineColors = v.outlineColorBuffer\n      ? ensure('indirect:node:outlineColors', outlineColors?.byteLength ?? 16, 'Node outline color buffer')\n      : null;\n\n    if (nodeCount > 0) {\n      resourceCache.uploadBuffer(device, device.queue, 'indirect:node:indices', indices, {\n        label: 'Node index buffer',\n        version: versions.indices ?? 0,\n        topologyVersion: versions.topology ?? 0,\n        count: nodeCount,\n        dirtyRange: nodes.indexDirtyRange ?? null,\n        trackViewIdentity: true,\n      }, storageUsage);\n      if (uploadPositions && !delegatePositionBuffer && positions) {\n        resourceCache.uploadBuffer(device, device.queue, 'indirect:node:positions', positions, {\n          label: 'Node position buffer',\n          version: versions.positions ?? 0,\n          topologyVersion: versions.topology ?? 0,\n          count: nodeCount,\n          trackViewIdentity: true,\n        }, storageUsage);\n      }\n      if (interpolationEnabled && !interpolationSourceBuffer && interpolationSourceView) {\n        resourceCache.uploadBuffer(device, device.queue, 'indirect:node:positionsFrom', interpolationSourceView, {\n          label: 'Node interpolation source position buffer',\n          version: interpolationSourceVersion,\n          topologyVersion: versions.topology ?? 0,\n          count: interpolationSourceCount || nodeCount,\n          trackViewIdentity: true,\n        }, storageUsage);\n      }\n      if (uploadSizes) {\n        resourceCache.uploadBuffer(device, device.queue, 'indirect:node:sizes', sizes, {\n          label: 'Node size buffer',\n          version: versions.sizes ?? 0,\n          topologyVersion: versions.topology ?? 0,\n          count: nodeCount,\n          trackViewIdentity: true,\n        }, storageUsage);\n      }\n      if (uploadColors) {\n        resourceCache.uploadBuffer(device, device.queue, 'indirect:node:colors', colors, {\n          label: 'Node color buffer',\n          version: versions.colors ?? 0,\n          topologyVersion: versions.topology ?? 0,\n          count: nodeCount,\n          trackViewIdentity: true,\n        }, storageUsage);\n      }\n      if (uploadStates) {\n        resourceCache.uploadBuffer(device, device.queue, 'indirect:node:states', states, {\n          label: 'Node state buffer',\n          version: versions.states ?? 0,\n          topologyVersion: versions.topology ?? 0,\n          count: nodeCount,\n          trackViewIdentity: true,\n        }, storageUsage);\n      }\n      if (v.outlineWidthBuffer && outlineWidths) {\n        resourceCache.uploadBuffer(device, device.queue, 'indirect:node:outlineWidths', outlineWidths, {\n          label: 'Node outline width buffer',\n          version: versions.outlineWidths ?? 0,\n          topologyVersion: versions.topology ?? 0,\n          count: nodeCount,\n          trackViewIdentity: true,\n        }, storageUsage);\n      }\n      if (v.outlineColorBuffer && outlineColors) {\n        resourceCache.uploadBuffer(device, device.queue, 'indirect:node:outlineColors', outlineColors, {\n          label: 'Node outline color buffer',\n          version: versions.outlineColors ?? 0,\n          topologyVersion: versions.topology ?? 0,\n          count: nodeCount,\n          trackViewIdentity: true,\n        }, storageUsage);\n      }\n      cache.count = nodeCount;\n    }\n\n    const edgeSourceEntries = edgeSources && typeof edgeSources === 'object' ? edgeSources : {};\n    const edgeSourceBuffers = this.edgeNodeSourceBuffers ?? {};\n    const uploadEdgeSource = (key, entry, label) => {\n      if (!entry?.view) {\n        edgeSourceBuffers[key] = null;\n        return;\n      }\n      const view = entry.view;\n      const bufferEntry = ensure(`indirect:node:edgeSource:${key}`, view.byteLength ?? 0, label);\n      edgeSourceBuffers[key] = bufferEntry;\n      if (nodeCount > 0) {\n        const dimension = entry.dimension ?? 1;\n        const count = Number.isFinite(entry.count)\n          ? entry.count\n          : (dimension > 0 ? Math.floor((view.length ?? 0) / dimension) : view.length ?? 0);\n        resourceCache.uploadBuffer(device, device.queue, `indirect:node:edgeSource:${key}`, view, {\n          label,\n          version: entry.version ?? 0,\n          topologyVersion: versions.topology ?? 0,\n          count,\n          trackViewIdentity: true,\n        }, storageUsage);\n      }\n    };\n\n    uploadEdgeSource('color', edgeSourceEntries.color, 'Edge node color source buffer');\n    uploadEdgeSource('width', edgeSourceEntries.width, 'Edge node width source buffer');\n    uploadEdgeSource('opacity', edgeSourceEntries.opacity, 'Edge node opacity source buffer');\n    uploadEdgeSource('endpointSize', edgeSourceEntries.endpointSize, 'Edge node endpoint size source buffer');\n\n    this.edgeNodeSourceBuffers = edgeSourceBuffers;\n    const defaultColorBuffer = this.nodeBuffersGpu.colors?.buffer ?? null;\n    const defaultScalarBuffer = this.nodeBuffersGpu.sizes?.buffer ?? null;\n    this.edgeNodeSourceBindings = {\n      color: edgeSourceBuffers.color?.buffer ?? defaultColorBuffer,\n      width: edgeSourceBuffers.width?.buffer ?? defaultScalarBuffer,\n      opacity: edgeSourceBuffers.opacity?.buffer ?? defaultScalarBuffer,\n      endpointSize: edgeSourceBuffers.endpointSize?.buffer ?? defaultScalarBuffer,\n    };\n    const bindingInfo = this.resolveNodeBindings(true, v);\n    const bindingMap = bindingInfo?.bindings ?? {};\n    const bindGroupKey = bindingInfo?.key ?? this.getNodeVariantKey(true, v);\n    const lastBuffers = this._nodeBuffersLastByKey.get(bindGroupKey) ?? null;\n    const currentBuffers = {\n      camera: this.cameraBuffer,\n      nodeIndices: this.nodeBuffersGpu.indices?.buffer ?? null,\n      nodePositions: this.nodeBuffersGpu.positions?.buffer ?? null,\n      nodeSizes: this.nodeBuffersGpu.sizes?.buffer ?? null,\n      nodeColors: this.nodeBuffersGpu.colors?.buffer ?? null,\n      nodeStates: this.nodeBuffersGpu.states?.buffer ?? null,\n      globals: this.globalsBuffer,\n      hover: this.hoverBuffer,\n      shading: this.shadingBuffer,\n      nodeOutlineWidths: this.nodeBuffersGpu.outlineWidths?.buffer ?? null,\n      nodeOutlineColors: this.nodeBuffersGpu.outlineColors?.buffer ?? null,\n      nodePositionsFrom: this.nodeBuffersGpu.positionsFrom?.buffer ?? null,\n    };\n\n    let buffersChanged = false;\n    for (const name of Object.keys(bindingMap)) {\n      if ((lastBuffers?.[name] ?? null) !== (currentBuffers[name] ?? null)) {\n        buffersChanged = true;\n        break;\n      }\n    }\n\n    if (buffersChanged || !this.nodeBindGroups.get(bindGroupKey)) {\n      const entries = [];\n      const push = (name, buffer) => {\n        const binding = bindingMap[name];\n        if (binding == null || !buffer) return;\n        entries.push({ binding, resource: { buffer } });\n      };\n      push('camera', currentBuffers.camera);\n      push('nodeIndices', currentBuffers.nodeIndices);\n      push('nodePositions', currentBuffers.nodePositions);\n      push('nodeSizes', currentBuffers.nodeSizes);\n      push('nodeColors', currentBuffers.nodeColors);\n      push('nodeStates', currentBuffers.nodeStates);\n      push('globals', currentBuffers.globals);\n      push('hover', currentBuffers.hover);\n      push('shading', currentBuffers.shading);\n      push('nodeOutlineWidths', currentBuffers.nodeOutlineWidths);\n      push('nodeOutlineColors', currentBuffers.nodeOutlineColors);\n      push('nodePositionsFrom', currentBuffers.nodePositionsFrom);\n      const bindGroup = device.createBindGroup({\n        layout: bindingInfo.layout,\n        entries,\n      });\n      this.nodeBindGroups.set(bindGroupKey, bindGroup);\n      const usedBuffers = {};\n      for (const name of Object.keys(bindingMap)) {\n        usedBuffers[name] = currentBuffers[name] ?? null;\n      }\n      this._nodeBuffersLastByKey.set(bindGroupKey, usedBuffers);\n    }\n\n    const bindGroup = this.nodeBindGroups.get(bindGroupKey) ?? null;\n    this.nodeBindGroup = bindGroup;\n    this.nodeBindGroupOutline = bindGroup;\n    this.nodeBindGroupLayout = bindingInfo?.layout ?? null;\n    this.nodeBindGroupLayoutOutline = bindingInfo?.layout ?? null;\n  }\n\n  updateEdgeBuffersGpuIndirect(edges, device, maxBindingSize, edgeVariant, useEdgeIndices = true) {\n    const {\n      endpoints,\n      colors,\n      indices,\n      widths,\n      endpointSizes,\n      opacities,\n      states,\n      versions = {},\n      count,\n    } = edges;\n    const edgeCount = Number.isFinite(count)\n      ? Math.max(0, Math.floor(count))\n      : Math.floor((indices?.length ?? 0));\n    const cache = this._edgeDataCache;\n    const useEdgeColorBuffer = edgeVariant?.colorBuffer && edgeVariant?.colorSource !== 'node';\n    const useEdgeWidthBuffer = edgeVariant?.widthBuffer && edgeVariant?.widthSource !== 'node';\n    const useEdgeOpacityBuffer = edgeVariant?.opacityBuffer && edgeVariant?.opacitySource !== 'node';\n    const useEdgeEndpointSizeBuffer = edgeVariant?.endpointSizeBuffer && edgeVariant?.endpointSizeSource !== 'node';\n    const useEdgeStateBuffer = edgeVariant?.edgeState === true;\n\n    if (useEdgeIndices && !indices && edgeCount) {\n      throw new Error('Edge index buffer is missing for indirect rendering.');\n    }\n    if (!endpoints && edgeCount) {\n      throw new Error('Edge endpoints buffer is missing for indirect rendering.');\n    }\n    if (useEdgeColorBuffer && !colors && edgeCount) {\n      throw new Error('Edge colors buffer is missing for indirect rendering.');\n    }\n    if (useEdgeWidthBuffer && !widths && edgeCount) {\n      throw new Error('Edge widths buffer is missing for indirect rendering.');\n    }\n    if (useEdgeOpacityBuffer && !opacities && edgeCount) {\n      throw new Error('Edge opacities buffer is missing for indirect rendering.');\n    }\n    if (useEdgeEndpointSizeBuffer && !endpointSizes && edgeCount) {\n      throw new Error('Edge endpoint sizes buffer is missing for indirect rendering.');\n    }\n    if (useEdgeStateBuffer && !states && edgeCount) {\n      throw new Error('Edge states buffer is missing for indirect rendering.');\n    }\n\n    const storageUsage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX;\n    const resourceCache = this.device?.resourceCache?.webgpu;\n    if (!resourceCache) {\n      throw new Error('WebGPU resource cache is missing; expected device.resourceCache.webgpu.');\n    }\n    const checkBindingSize = (label, requiredBytes) => {\n      const aligned = Math.max(256, Math.ceil((requiredBytes ?? 0) / 256) * 256);\n      if (maxBindingSize && aligned > maxBindingSize) {\n        const message = `${label} requires ${aligned} bytes, exceeding maxStorageBufferBindingSize (${maxBindingSize}).`;\n        console.warn(message);\n        throw new Error(message);\n      }\n      return aligned;\n    };\n    const ensure = (key, requiredBytes, label) => {\n      checkBindingSize(label, requiredBytes);\n      return resourceCache.ensureBuffer(device, key, requiredBytes, storageUsage, label);\n    };\n\n    if (useEdgeIndices) {\n      this.edgeBuffersGpu.indices = ensure('indirect:edge:indices', indices?.byteLength ?? 4, 'Edge index buffer');\n    }\n    this.edgeBuffersGpu.endpoints = ensure('indirect:edge:endpoints', endpoints?.byteLength ?? 8, 'Edge endpoints buffer');\n    this.edgeBuffersGpu.colors = ensure('indirect:edge:colors', useEdgeColorBuffer ? (colors?.byteLength ?? 32) : 32, 'Edge color buffer');\n    this.edgeBuffersGpu.widths = ensure('indirect:edge:widths', useEdgeWidthBuffer ? (widths?.byteLength ?? 4) : 4, 'Edge width buffer');\n    this.edgeBuffersGpu.endpointSizes = ensure(\n      'indirect:edge:endpointSizes',\n      useEdgeEndpointSizeBuffer ? (endpointSizes?.byteLength ?? 4) : 4,\n      'Edge endpoint size buffer',\n    );\n    this.edgeBuffersGpu.opacities = ensure('indirect:edge:opacities', useEdgeOpacityBuffer ? (opacities?.byteLength ?? 4) : 4, 'Edge opacity buffer');\n    this.edgeBuffersGpu.states = ensure('indirect:edge:states', useEdgeStateBuffer ? (states?.byteLength ?? 4) : 4, 'Edge state buffer');\n\n    const edgeSourceBindings = this.edgeNodeSourceBindings ?? {\n      color: this.nodeBuffersGpu.colors?.buffer ?? null,\n      width: this.nodeBuffersGpu.sizes?.buffer ?? null,\n      opacity: this.nodeBuffersGpu.sizes?.buffer ?? null,\n      endpointSize: this.nodeBuffersGpu.sizes?.buffer ?? null,\n    };\n\n    const bindingInfo = this.resolveEdgeBindings(useEdgeIndices, edgeVariant);\n    const bindingMap = bindingInfo?.bindings ?? {};\n    const bindGroupKey = bindingInfo?.key ?? this.getEdgeVariantKey(useEdgeIndices, edgeVariant);\n    const lastBuffers = this._edgeBuffersLastByKey.get(bindGroupKey) ?? null;\n    const currentBuffers = {\n      camera: this.cameraBuffer,\n      globals: this.globalsBuffer,\n      hover: this.hoverBuffer,\n      shading: this.shadingBuffer,\n      edgeIndices: this.edgeBuffersGpu.indices?.buffer ?? null,\n      edgeEndpoints: this.edgeBuffersGpu.endpoints?.buffer ?? null,\n      nodePositions: this.nodeBuffersGpu.positions?.buffer ?? null,\n      nodePositionsFrom: this.nodeBuffersGpu.positionsFrom?.buffer ?? this.nodeBuffersGpu.positions?.buffer ?? null,\n      nodeStates: this.nodeBuffersGpu.states?.buffer ?? null,\n      edgeStates: this.edgeBuffersGpu.states?.buffer ?? null,\n      edgeColors: this.edgeBuffersGpu.colors?.buffer ?? null,\n      edgeWidths: this.edgeBuffersGpu.widths?.buffer ?? null,\n      edgeEndpointSizes: this.edgeBuffersGpu.endpointSizes?.buffer ?? null,\n      edgeOpacities: this.edgeBuffersGpu.opacities?.buffer ?? null,\n      edgeNodeColorSource: edgeSourceBindings.color ?? null,\n      edgeNodeWidthSource: edgeSourceBindings.width ?? null,\n      edgeNodeOpacitySource: edgeSourceBindings.opacity ?? null,\n      edgeNodeEndpointSizeSource: edgeSourceBindings.endpointSize ?? null,\n    };\n    let buffersChanged = false;\n    for (const name of Object.keys(bindingMap)) {\n      if ((lastBuffers?.[name] ?? null) !== (currentBuffers[name] ?? null)) {\n        buffersChanged = true;\n        break;\n      }\n    }\n\n    if (edgeCount > 0) {\n      if (useEdgeIndices) {\n        resourceCache.uploadBuffer(device, device.queue, 'indirect:edge:indices', indices, {\n          label: 'Edge index buffer',\n          version: versions.indices ?? 0,\n          topologyVersion: versions.topology ?? 0,\n          count: edgeCount,\n          dirtyRange: edges.indexDirtyRange ?? null,\n          trackViewIdentity: true,\n        }, storageUsage);\n      }\n      resourceCache.uploadBuffer(device, device.queue, 'indirect:edge:endpoints', endpoints, {\n        label: 'Edge endpoints buffer',\n        version: versions.endpoints ?? versions.topology ?? 0,\n        topologyVersion: versions.topology ?? 0,\n        count: edgeCount,\n        trackViewIdentity: true,\n      }, storageUsage);\n      if (useEdgeColorBuffer) {\n        resourceCache.uploadBuffer(device, device.queue, 'indirect:edge:colors', colors, {\n          label: 'Edge color buffer',\n          version: versions.colors ?? 0,\n          topologyVersion: versions.topology ?? 0,\n          count: edgeCount,\n          trackViewIdentity: true,\n        }, storageUsage);\n      }\n      if (useEdgeWidthBuffer) {\n        resourceCache.uploadBuffer(device, device.queue, 'indirect:edge:widths', widths, {\n          label: 'Edge width buffer',\n          version: versions.widths ?? 0,\n          topologyVersion: versions.topology ?? 0,\n          count: edgeCount,\n          trackViewIdentity: true,\n        }, storageUsage);\n      }\n      if (useEdgeOpacityBuffer) {\n        resourceCache.uploadBuffer(device, device.queue, 'indirect:edge:opacities', opacities, {\n          label: 'Edge opacity buffer',\n          version: versions.opacities ?? 0,\n          topologyVersion: versions.topology ?? 0,\n          count: edgeCount,\n          trackViewIdentity: true,\n        }, storageUsage);\n      }\n      if (useEdgeEndpointSizeBuffer) {\n        resourceCache.uploadBuffer(device, device.queue, 'indirect:edge:endpointSizes', endpointSizes, {\n          label: 'Edge endpoint size buffer',\n          version: versions.endpointSizes ?? 0,\n          topologyVersion: versions.topology ?? 0,\n          count: edgeCount,\n          trackViewIdentity: true,\n        }, storageUsage);\n      }\n      if (useEdgeStateBuffer) {\n        resourceCache.uploadBuffer(device, device.queue, 'indirect:edge:states', states, {\n          label: 'Edge state buffer',\n          version: versions.states ?? 0,\n          topologyVersion: versions.topology ?? 0,\n          count: edgeCount,\n          trackViewIdentity: true,\n        }, storageUsage);\n      }\n      cache.count = edgeCount;\n    }\n\n    if (buffersChanged || !this.edgeBindGroups.get(bindGroupKey)) {\n      const entries = [];\n      const push = (name, buffer) => {\n        const binding = bindingMap[name];\n        if (binding == null || !buffer) return;\n        entries.push({ binding, resource: { buffer } });\n      };\n      push('camera', currentBuffers.camera);\n      push('edgeIndices', currentBuffers.edgeIndices);\n      push('edgeEndpoints', currentBuffers.edgeEndpoints);\n      push('nodePositions', currentBuffers.nodePositions);\n      push('nodePositionsFrom', currentBuffers.nodePositionsFrom);\n      push('nodeStates', currentBuffers.nodeStates);\n      push('edgeStates', currentBuffers.edgeStates);\n      push('edgeColors', currentBuffers.edgeColors);\n      push('edgeWidths', currentBuffers.edgeWidths);\n      push('edgeEndpointSizes', currentBuffers.edgeEndpointSizes);\n      push('edgeOpacities', currentBuffers.edgeOpacities);\n      push('edgeNodeColorSource', currentBuffers.edgeNodeColorSource);\n      push('edgeNodeWidthSource', currentBuffers.edgeNodeWidthSource);\n      push('edgeNodeOpacitySource', currentBuffers.edgeNodeOpacitySource);\n      push('edgeNodeEndpointSizeSource', currentBuffers.edgeNodeEndpointSizeSource);\n      push('globals', currentBuffers.globals);\n      push('hover', currentBuffers.hover);\n      push('shading', currentBuffers.shading);\n\n      const bindGroup = device.createBindGroup({\n        layout: bindingInfo.layout,\n        entries,\n      });\n      this.edgeBindGroups.set(bindGroupKey, bindGroup);\n      const usedBuffers = {};\n      for (const name of Object.keys(bindingMap)) {\n        usedBuffers[name] = currentBuffers[name] ?? null;\n      }\n      this._edgeBuffersLastByKey.set(bindGroupKey, usedBuffers);\n    }\n    this.edgeBindGroup = this.edgeBindGroups.get(bindGroupKey) ?? null;\n  }\n\n  getSharedSparseResources() {\n    const cacheBuffers = this.device?.resourceCache?.webgpu?.buffers ?? null;\n    const keys = [\n      'indirect:node:indices',\n      'indirect:node:positions',\n      'indirect:node:positionsFrom',\n      'indirect:node:sizes',\n      'indirect:node:states',\n      'indirect:node:outlineWidths',\n      'indirect:node:edgeSource:width',\n      'indirect:node:edgeSource:endpointSize',\n      'indirect:edge:indices',\n      'indirect:edge:endpoints',\n      'indirect:edge:widths',\n      'indirect:edge:endpointSizes',\n      'indirect:edge:states',\n    ];\n    const buffers = {};\n    for (const key of keys) {\n      buffers[key] = cacheBuffers?.get(key) ?? null;\n    }\n\n    const adoptActiveBuffer = (key, activeBuffer, fallback = {}) => {\n      if (!activeBuffer) return;\n      const existing = buffers[key] ?? null;\n      if (existing?.buffer === activeBuffer) {\n        buffers[key] = {\n          ...existing,\n          count: existing.count ?? fallback.count ?? null,\n          byteLength: existing.byteLength ?? activeBuffer?.size ?? fallback.byteLength ?? null,\n        };\n        return;\n      }\n      buffers[key] = {\n        buffer: activeBuffer,\n        version: fallback.version ?? null,\n        topologyVersion: fallback.topologyVersion ?? null,\n        count: fallback.count ?? null,\n        byteLength: activeBuffer?.size ?? fallback.byteLength ?? null,\n      };\n    };\n\n    const interpolation = this.getPositionInterpolationState?.() ?? this.positionInterpolation ?? null;\n    const nodeCount = this._nodeDataCache?.count ?? null;\n    adoptActiveBuffer('indirect:node:positions', this.nodeBuffersGpu.positions?.buffer ?? null, {\n      count: nodeCount,\n    });\n    adoptActiveBuffer('indirect:node:positionsFrom', this.nodeBuffersGpu.positionsFrom?.buffer ?? null, {\n      version: interpolation?.sourceVersion ?? null,\n      count: interpolation?.sourceCount ?? nodeCount,\n    });\n    adoptActiveBuffer('indirect:node:states', this.nodeBuffersGpu?.states?.buffer ?? null, {\n      count: nodeCount,\n    });\n    adoptActiveBuffer('indirect:edge:states', this.edgeBuffersGpu?.states?.buffer ?? null, {\n      count: this._edgeDataCache?.count ?? null,\n    });\n\n    return { buffers };\n  }\n\n  withSparseGraph(network, topologyVersions, indices, edgeNodeAttributes, fn) {\n    if (!network) return fn(null);\n    if (typeof network.withBufferAccess !== 'function') {\n      console.warn('GraphLayerWebGPU: network does not support buffer access sessions');\n      return false;\n    }\n    const hasNodeAttribute = (name) => (\n      Boolean(name) && (network._nodeAttributes?.has?.(name) ?? false)\n    );\n    const hasEdgeAttribute = (name) => (\n      Boolean(name) && (network._edgeAttributes?.has?.(name) ?? false)\n    );\n    return network.withBufferAccess(() => {\n      const nodeIndices = indices?.node ?? network.nodeIndices ?? null;\n      const edgeIndices = indices?.edge ?? network.edgeIndices ?? null;\n      const nodeIndexDirtyRange = typeof network.getActiveIndexDirtyRange === 'function'\n        ? network.getActiveIndexDirtyRange('node')\n        : null;\n      const edgeIndexDirtyRange = typeof network.getActiveIndexDirtyRange === 'function'\n        ? network.getActiveIndexDirtyRange('edge')\n        : null;\n      const safeGet = (scope, name) => {\n        if (!name) return null;\n        if (scope === 'node' && !hasNodeAttribute(name)) return null;\n        if (scope === 'edge' && !hasEdgeAttribute(name)) return null;\n        const getter = scope === 'node' ? network.getNodeAttributeBuffer : network.getEdgeAttributeBuffer;\n        if (typeof getter !== 'function') return null;\n        return getter.call(network, name);\n      };\n      const resolveNodeSource = (name, dimension, label) => {\n        if (!name) return null;\n        const buffer = safeGet('node', name);\n        if (!buffer || !buffer.view) {\n          throw new Error(`GraphLayerWebGPU: missing node attribute ${label ?? name}.`);\n        }\n        if (buffer.type !== AttributeType.Float) {\n          throw new Error(`GraphLayerWebGPU: node attribute ${label ?? name} must be Float.`);\n        }\n        if (typeof dimension === 'number' && buffer.dimension !== dimension) {\n          throw new Error(`GraphLayerWebGPU: node attribute ${label ?? name} must have dimension ${dimension}.`);\n        }\n        const resolvedDimension = buffer.dimension ?? dimension ?? 1;\n        const count = resolvedDimension > 0\n          ? Math.floor((buffer.view.length ?? 0) / resolvedDimension)\n          : buffer.view.length ?? 0;\n        return {\n          attribute: name,\n          view: buffer.view,\n          version: buffer.version ?? 0,\n          dimension: resolvedDimension,\n          count,\n        };\n      };\n      const nodePositions = safeGet('node', NODE_POSITION_ATTRIBUTE);\n      const nodeSizes = safeGet('node', NODE_SIZE_ATTRIBUTE);\n      const nodeColors = safeGet('node', NODE_COLOR_ATTRIBUTE);\n      const nodeStates = safeGet('node', NODE_STATE_ATTRIBUTE);\n      const nodeOutlineWidths = safeGet('node', NODE_OUTLINE_WIDTH_ATTRIBUTE);\n      const nodeOutlineColors = safeGet('node', NODE_OUTLINE_COLOR_ATTRIBUTE);\n\n      const edgeColors = safeGet('edge', EDGE_COLOR_ATTRIBUTE);\n      const edgeWidths = safeGet('edge', EDGE_WIDTH_ATTRIBUTE);\n      const edgeOpacities = safeGet('edge', EDGE_OPACITY_ATTRIBUTE);\n      const edgeEndpointSizes = safeGet('edge', EDGE_ENDPOINTS_SIZE_ATTRIBUTE);\n      const edgeStates = safeGet('edge', EDGE_STATE_ATTRIBUTE);\n      const positionOverride = this.resolvePositionSourceOverride(network, {\n        backend: 'webgpu',\n        device: this.device?.device ?? null,\n      });\n      const resolvedNodePositionBuffer = positionOverride?.webgpuBuffer ?? null;\n      const resolvedNodePositions = resolvedNodePositionBuffer\n        ? (positionOverride?.view ?? null)\n        : (positionOverride?.view ?? nodePositions?.view ?? null);\n      const resolvedNodePositionVersion = Number.isFinite(positionOverride?.version)\n        ? Number(positionOverride.version)\n        : (nodePositions?.version ?? 0);\n\n      const nodeEdgeSources = {\n        color: resolveNodeSource(edgeNodeAttributes?.color, 4, 'edge color source'),\n        width: resolveNodeSource(edgeNodeAttributes?.width, 1, 'edge width source'),\n        opacity: resolveNodeSource(edgeNodeAttributes?.opacity, 1, 'edge opacity source'),\n        endpointSize: resolveNodeSource(edgeNodeAttributes?.endpointSize, 1, 'edge endpoint size source'),\n      };\n\n      const nodes = {\n        positions: resolvedNodePositions,\n        positionBuffer: resolvedNodePositionBuffer,\n        sizes: nodeSizes?.view ?? null,\n        colors: nodeColors?.view ?? null,\n        states: nodeStates?.view ?? null,\n        outlineWidths: nodeOutlineWidths?.view ?? null,\n        outlineColors: nodeOutlineColors?.view ?? null,\n        indices: nodeIndices,\n        indexDirtyRange: nodeIndexDirtyRange,\n        count: nodeIndices?.length ?? 0,\n        versions: {\n          positions: resolvedNodePositionVersion,\n          sizes: nodeSizes?.version ?? 0,\n          colors: nodeColors?.version ?? 0,\n          states: nodeStates?.version ?? 0,\n          outlineWidths: nodeOutlineWidths?.version ?? 0,\n          outlineColors: nodeOutlineColors?.version ?? 0,\n          indices: nodeIndices?.version ?? topologyVersions?.node ?? 0,\n          topology: topologyVersions?.node ?? 0,\n        },\n      };\n\n      const edges = {\n        endpoints: network.edgesView ?? null,\n        colors: edgeColors?.view ?? null,\n        widths: edgeWidths?.view ?? null,\n        opacities: edgeOpacities?.view ?? null,\n        endpointSizes: edgeEndpointSizes?.view ?? null,\n        states: edgeStates?.view ?? null,\n        indices: edgeIndices,\n        indexDirtyRange: edgeIndexDirtyRange,\n        count: edgeIndices?.length ?? 0,\n        versions: {\n          endpoints: topologyVersions?.edge ?? 0,\n          colors: edgeColors?.version ?? 0,\n          widths: edgeWidths?.version ?? 0,\n          opacities: edgeOpacities?.version ?? 0,\n          endpointSizes: edgeEndpointSizes?.version ?? 0,\n          states: edgeStates?.version ?? 0,\n          indices: edgeIndices?.version ?? topologyVersions?.edge ?? 0,\n          topology: topologyVersions?.edge ?? 0,\n        },\n      };\n\n      return fn({ nodes, edges, nodeEdgeSources });\n    });\n  }\n\n  resolveNodeDepthMode(is2D, nodeBlendWithEdges) {\n    return (is2D === true || nodeBlendWithEdges === true) ? 'none' : 'depth';\n  }\n\n  render(context, frame) {\n    if (!context || context.type !== 'webgpu') return;\n    const network = frame?.network;\n    if (!network) return;\n    const { camera } = frame ?? {};\n    const gpuDevice = this.device?.device;\n    if (!gpuDevice) return;\n    const maxBindingSize = gpuDevice.limits?.maxStorageBufferBindingSize;\n    const cameraUniforms = this.getCameraUniforms(camera, context);\n    const fastEdges = this.isFastEdgeRenderingActive?.() === true;\n    const edgeRenderingMode = this.getEffectiveEdgeRenderingMode?.() ?? this.edgeRenderingMode;\n    const transparencyMode = fastEdges ? 'alpha' : this.edgeTransparencyMode;\n    const nodeBlendWithEdges = this.nodeBlendWithEdges === true;\n    const weightedRequested = !fastEdges && (transparencyMode === 'weighted'\n      || transparencyMode === 'additive-normalized'\n      || transparencyMode === 'additive-tonemapped'\n      || transparencyMode === 'additive-normalized-bright');\n    let weightedReady = false;\n    let nodeCount = 0;\n    let edgeCount = 0;\n    const useNodeIndices = true;\n    const useEdgeIndices = true;\n    let is2D = cameraUniforms?.mode === '2d';\n\n    const schema = GraphVisualSchema.fromNetwork(network, {\n      nodeOutlineUseAttributes: this.nodeOutlineUseAttributes === true,\n    });\n    const visualConfig = schema.visualConfig;\n    const nodeVariant = this.resolveNodeVariant(visualConfig);\n    const edgeVariant = this.resolveEdgeVariant(visualConfig, { fastPath: fastEdges, is2D });\n\n    let topologyVersions = { node: 0, edge: 0 };\n    if (typeof network.getTopologyVersions === 'function') {\n      try {\n        topologyVersions = network.getTopologyVersions();\n      } catch (error) {\n        FALLBACK_TOPOLOGY_VERSION_COUNTER += 1;\n        warnOnce(\n          this,\n          'topology-versions',\n          'GraphLayerWebGPU: failed to read topology versions; forcing buffer refresh for this frame.',\n          { error },\n        );\n        topologyVersions = {\n          node: FALLBACK_TOPOLOGY_VERSION_COUNTER,\n          edge: FALLBACK_TOPOLOGY_VERSION_COUNTER,\n        };\n      }\n    }\n\n    const edgeNodeAttributes = {\n      color: edgeVariant?.colorSource === 'node'\n        ? (edgeVariant.colorNodeAttribute ?? NODE_COLOR_ATTRIBUTE)\n        : null,\n      width: edgeVariant?.widthSource === 'node'\n        ? (edgeVariant.widthNodeAttribute ?? NODE_SIZE_ATTRIBUTE)\n        : null,\n      opacity: edgeVariant?.opacitySource === 'node'\n        ? (edgeVariant.opacityNodeAttribute ?? NODE_SIZE_ATTRIBUTE)\n        : null,\n      endpointSize: edgeVariant?.endpointSizeSource === 'node'\n        ? (edgeVariant.endpointSizeNodeAttribute ?? NODE_SIZE_ATTRIBUTE)\n        : null,\n    };\n    const customEdgeNodeAttributes = {\n      color: edgeNodeAttributes.color && edgeNodeAttributes.color !== NODE_COLOR_ATTRIBUTE\n        ? edgeNodeAttributes.color\n        : null,\n      width: edgeNodeAttributes.width && edgeNodeAttributes.width !== NODE_SIZE_ATTRIBUTE\n        ? edgeNodeAttributes.width\n        : null,\n      opacity: edgeNodeAttributes.opacity && edgeNodeAttributes.opacity !== NODE_SIZE_ATTRIBUTE\n        ? edgeNodeAttributes.opacity\n        : null,\n      endpointSize: edgeNodeAttributes.endpointSize && edgeNodeAttributes.endpointSize !== NODE_SIZE_ATTRIBUTE\n        ? edgeNodeAttributes.endpointSize\n        : null,\n    };\n\n    const usesDefaultNodeColor = Boolean(edgeNodeAttributes.color && edgeNodeAttributes.color === NODE_COLOR_ATTRIBUTE);\n    const usesDefaultNodeSize = Boolean(\n      (edgeNodeAttributes.width && edgeNodeAttributes.width === NODE_SIZE_ATTRIBUTE)\n      || (edgeNodeAttributes.opacity && edgeNodeAttributes.opacity === NODE_SIZE_ATTRIBUTE)\n      || (edgeNodeAttributes.endpointSize && edgeNodeAttributes.endpointSize === NODE_SIZE_ATTRIBUTE),\n    );\n\n    const passes = [];\n    const ok = this.withSparseGraph(\n      network,\n      topologyVersions,\n      null,\n      customEdgeNodeAttributes,\n      (geometry) => {\n      if (!geometry) return false;\n      nodeCount = geometry.nodes.count ?? 0;\n      edgeCount = geometry.edges.count ?? 0;\n      is2D = cameraUniforms?.mode === '2d';\n\n      this.updateGlobalsGpu(gpuDevice, cameraUniforms, visualConfig);\n      this.updateShadingGpu(gpuDevice);\n      this.updateCameraUniformsGpu(camera, cameraUniforms);\n      this.updateHoverGpu(gpuDevice);\n      if (!this.cameraBuffer) return false;\n\n      if (nodeCount) {\n        this.updateNodeBuffersGpuIndirect(geometry.nodes, gpuDevice, maxBindingSize, nodeVariant, {\n          positions: true,\n          sizes: Boolean(nodeVariant?.sizeBuffer || usesDefaultNodeSize),\n          colors: Boolean(nodeVariant?.colorBuffer || usesDefaultNodeColor),\n          states: true,\n        }, geometry.nodeEdgeSources);\n      } else {\n        this.nodeBindGroup = null;\n        this.nodeBindGroupOutline = null;\n        this._nodeVersionsLast = null;\n        this._nodeVersionsLastOutline = null;\n        this._nodeBuffersLastOutline = null;\n        this._nodeDataCache.count = 0;\n      }\n      if (edgeCount) {\n        this.updateEdgeBuffersGpuIndirect(geometry.edges, gpuDevice, maxBindingSize, edgeVariant, useEdgeIndices);\n      } else {\n        this.edgeBindGroup = null;\n        this._edgeVersionsLast = null;\n        this._edgeDataCache.count = 0;\n      }\n      return true;\n    });\n    if (!ok || !this.cameraBuffer) return;\n\n    const effectiveEdgeCount = this.shouldRenderEdges() ? edgeCount : 0;\n    weightedReady = weightedRequested && effectiveEdgeCount > 0\n      ? this.prepareWeightedResources(context, cameraUniforms, useEdgeIndices, edgeVariant)\n      : false;\n\n    const useNodeOutlineAttributes = Boolean(nodeVariant?.outlineWidthBuffer || nodeVariant?.outlineColorBuffer);\n    const nodeBlend = nodeBlendWithEdges ? this.getBlendForMode(transparencyMode) : this.getBlendForMode('alpha');\n    const nodePipeline = this.getNodePipeline(useNodeIndices, nodeVariant, {\n      blendKey: nodeBlend.key,\n      blend: nodeBlend.blend,\n      depthMode: this.resolveNodeDepthMode(is2D, nodeBlendWithEdges),\n      sampleCount: context.sampleCount ?? 1,\n    });\n    if (!nodePipeline) return;\n    const edgePipelines = this.getEdgePipelinesForMode(\n      transparencyMode,\n      gpuDevice,\n      useEdgeIndices,\n      edgeVariant,\n      context.sampleCount ?? 1,\n    );\n    const ambientOcclusionActive = !is2D && this.hasAmbientOcclusionSelection();\n    const ambientOcclusionNodePipeline = ambientOcclusionActive\n      ? this.getNodePipeline(useNodeIndices, nodeVariant, {\n        blendKey: 'alpha',\n        blend: this.getBlendForMode('alpha').blend,\n        depthMode: 'depth',\n        sampleCount: 1,\n      })\n      : null;\n    const ambientOcclusionEdgePipelines = ambientOcclusionActive\n      ? this.getEdgePipelinesForMode('alpha', gpuDevice, useEdgeIndices, edgeVariant, 1, true)\n      : null;\n\n    const drawNodes = (passEncoder) => {\n      const nodeBindGroup = useNodeOutlineAttributes ? this.nodeBindGroupOutline : this.nodeBindGroup;\n      if (!nodeCount || !nodeBindGroup || !passEncoder) return;\n      passEncoder.setPipeline(nodePipeline);\n      passEncoder.setBindGroup(0, nodeBindGroup);\n      passEncoder.setVertexBuffer(0, this.nodeQuadBufferGpu);\n      passEncoder.draw(4, nodeCount, 0, 0);\n    };\n\n    const drawEdgesAlpha = (passEncoder) => {\n      if (!effectiveEdgeCount || !this.edgeBindGroup || !passEncoder) return;\n      if (edgeRenderingMode === 'quad' && edgePipelines?.quad) {\n        passEncoder.setPipeline(edgePipelines.quad);\n        passEncoder.setBindGroup(0, this.edgeBindGroup);\n        passEncoder.setVertexBuffer(0, this.edgeQuadBufferGpu);\n        passEncoder.draw(4, effectiveEdgeCount, 0, 0);\n      } else if (edgePipelines?.line) {\n        passEncoder.setPipeline(edgePipelines.line);\n        passEncoder.setBindGroup(0, this.edgeBindGroup);\n        passEncoder.draw(effectiveEdgeCount * 2, 1, 0, 0);\n      }\n    };\n    const drawNodesAmbientOcclusion = (passEncoder) => {\n      const nodeBindGroup = useNodeOutlineAttributes ? this.nodeBindGroupOutline : this.nodeBindGroup;\n      if (!nodeCount || !nodeBindGroup || !passEncoder || !ambientOcclusionNodePipeline) return;\n      passEncoder.setPipeline(ambientOcclusionNodePipeline);\n      passEncoder.setBindGroup(0, nodeBindGroup);\n      passEncoder.setVertexBuffer(0, this.nodeQuadBufferGpu);\n      passEncoder.draw(4, nodeCount, 0, 0);\n    };\n    const drawEdgesAmbientOcclusion = (passEncoder) => {\n      if (!effectiveEdgeCount || !this.edgeBindGroup || !passEncoder) return;\n      if (edgeRenderingMode === 'quad' && ambientOcclusionEdgePipelines?.quad) {\n        passEncoder.setPipeline(ambientOcclusionEdgePipelines.quad);\n        passEncoder.setBindGroup(0, this.edgeBindGroup);\n        passEncoder.setVertexBuffer(0, this.edgeQuadBufferGpu);\n        passEncoder.draw(4, effectiveEdgeCount, 0, 0);\n      } else if (ambientOcclusionEdgePipelines?.line) {\n        passEncoder.setPipeline(ambientOcclusionEdgePipelines.line);\n        passEncoder.setBindGroup(0, this.edgeBindGroup);\n        passEncoder.draw(effectiveEdgeCount * 2, 1, 0, 0);\n      }\n    };\n\n    if (!weightedReady) {\n      if (weightedRequested && effectiveEdgeCount > 0) {\n        this.weightedSupported = false;\n        this.edgeTransparencyMode = this.normalizeEdgeTransparencyMode(this.edgeTransparencyMode);\n      }\n      if (weightedRequested && !this.warnedWeightedFallback && effectiveEdgeCount > 0) {\n        console.warn('Weighted edge transparency is not available; using alpha blending instead.');\n        this.warnedWeightedFallback = true;\n      }\n      if (is2D) {\n        passes.push(() => {\n          drawEdgesAlpha(context.passEncoder);\n          drawNodes(context.passEncoder);\n        });\n      } else {\n        passes.push(() => {\n          drawNodes(context.passEncoder);\n          drawEdgesAlpha(context.passEncoder);\n        });\n      }\n    } else {\n      if (!this.loggedWeightedActive) {\n        console.info(`GraphLayerWebGPU: using weighted multipass for '${transparencyMode}'`);\n        this.loggedWeightedActive = true;\n      }\n      passes.push(() => this.renderWeighted(context, {\n        geometry: { nodes: { count: nodeCount }, edges: { count: effectiveEdgeCount } },\n        is2D,\n        drawNodes,\n        nodeBlendWithEdges,\n        mode: transparencyMode,\n      }));\n    }\n\n    this.frameGraph.run(passes, context);\n    if (ambientOcclusionActive && this.ambientOcclusion?.render) {\n      this.ambientOcclusion.render(context, {\n        cameraUniforms,\n        selection: this.getAmbientOcclusionSelection(),\n        strength: Number.isFinite(Number(this.ambientOcclusionStrength))\n          ? Math.max(0, Number(this.ambientOcclusionStrength))\n          : AMBIENT_OCCLUSION_STRENGTH_DEFAULT,\n        radius: Number.isFinite(Number(this.ambientOcclusionRadius))\n          ? Math.max(1, Number(this.ambientOcclusionRadius))\n          : AMBIENT_OCCLUSION_RADIUS_DEFAULT,\n        bias: Number.isFinite(Number(this.ambientOcclusionBias))\n          ? Math.max(0, Number(this.ambientOcclusionBias))\n          : AMBIENT_OCCLUSION_BIAS_DEFAULT,\n        mode: this.ambientOcclusionMode,\n        intensityScale: Number.isFinite(Number(this.ambientOcclusionIntensityScale))\n          ? Math.max(0, Number(this.ambientOcclusionIntensityScale))\n          : 1.25,\n        intensityShift: Number.isFinite(Number(this.ambientOcclusionIntensityShift))\n          ? Math.max(0, Number(this.ambientOcclusionIntensityShift))\n          : 0.05,\n        quality: normalizeAmbientOcclusionQuality(this.ambientOcclusionQuality),\n        drawNodes: drawNodesAmbientOcclusion,\n        drawEdges: drawEdgesAmbientOcclusion,\n      });\n    }\n  }\n}\n\nexport default GraphLayerWebGPU;\n","export class WebGLResourceCache {\n  constructor() {\n    this.buffers = new Map();\n    this.programs = new Map();\n  }\n\n  ensureBuffer(gl, key) {\n    if (!gl) return null;\n    const existing = this.buffers.get(key);\n    if (existing?.buffer) return existing.buffer;\n    const buffer = gl.createBuffer();\n    const entry = existing && typeof existing === 'object' ? existing : {};\n    entry.buffer = buffer;\n    entry.byteLength = 0;\n    entry.version = null;\n    entry.topologyVersion = null;\n    entry.count = null;\n    entry.viewSig = null;\n    this.buffers.set(key, entry);\n    return buffer;\n  }\n\n  uploadArrayBuffer(gl, key, typedArray, meta = {}) {\n    if (!gl || !typedArray) return null;\n    const buffer = this.ensureBuffer(gl, key);\n    if (!buffer) return null;\n\n    const byteLength = typedArray.byteLength ?? 0;\n    if (!byteLength) return buffer;\n\n    const version = meta.version ?? null;\n    const topologyVersion = meta.topologyVersion ?? null;\n    const count = meta.count ?? null;\n    const viewSig = meta.trackViewIdentity\n      ? `${typedArray.buffer}|${typedArray.byteOffset}|${typedArray.byteLength}`\n      : null;\n\n    const entry = this.buffers.get(key);\n    const sameBytes = entry?.byteLength === byteLength;\n    const sameVersion = version == null || entry?.version === version;\n    const sameTopo = topologyVersion == null || entry?.topologyVersion === topologyVersion;\n    const sameCount = count == null || entry?.count === count;\n    const sameView = viewSig == null || entry?.viewSig === viewSig;\n\n    if (sameBytes && sameVersion && sameTopo && sameCount && sameView) {\n      return buffer;\n    }\n\n    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n    gl.bufferData(gl.ARRAY_BUFFER, typedArray, gl.DYNAMIC_DRAW);\n\n    entry.byteLength = byteLength;\n    entry.version = version;\n    entry.topologyVersion = topologyVersion;\n    entry.count = count;\n    entry.viewSig = viewSig;\n    this.buffers.set(key, entry);\n    return buffer;\n  }\n\n  getOrCreateProgram(key, factory) {\n    if (this.programs.has(key)) return this.programs.get(key);\n    const created = factory();\n    this.programs.set(key, created);\n    return created;\n  }\n\n  destroy(gl) {\n    if (!gl) return;\n    for (const entry of this.buffers.values()) {\n      if (entry?.buffer) gl.deleteBuffer(entry.buffer);\n    }\n    for (const entry of this.programs.values()) {\n      if (entry?.program) gl.deleteProgram(entry.program);\n    }\n    this.buffers.clear();\n    this.programs.clear();\n  }\n}\n","export class WebGPUResourceCache {\n  constructor() {\n    this.buffers = new Map();\n    this.shaderModules = new Map();\n    this.pipelines = new Map();\n  }\n\n  ensureBuffer(device, key, requiredBytes, usage, label = 'buffer') {\n    if (!device) return null;\n    const aligned = Math.max(256, Math.ceil((requiredBytes ?? 0) / 256) * 256);\n    const existing = this.buffers.get(key);\n    if (existing?.buffer && existing.size >= aligned && existing.usage === usage) {\n      return existing;\n    }\n    existing?.buffer?.destroy?.();\n    const buffer = device.createBuffer({ size: aligned, usage, label: `${label}:${key}` });\n    const entry = {\n      buffer,\n      size: aligned,\n      usage,\n      byteLength: 0,\n      version: null,\n      topologyVersion: null,\n      count: null,\n      viewSig: null,\n    };\n    this.buffers.set(key, entry);\n    return entry;\n  }\n\n  uploadBuffer(device, queue, key, typedArray, meta = {}, usage) {\n    if (!device || !queue || !typedArray) return null;\n    const byteLength = typedArray.byteLength ?? 0;\n    const entry = this.ensureBuffer(device, key, byteLength, usage, meta.label ?? 'storage');\n    if (!entry || !byteLength) return entry?.buffer ?? null;\n\n    const version = meta.version ?? null;\n    const topologyVersion = meta.topologyVersion ?? null;\n    const count = meta.count ?? null;\n    const viewSig = meta.trackViewIdentity\n      ? `${typedArray.buffer}|${typedArray.byteOffset}|${typedArray.byteLength}`\n      : null;\n\n    const sameBytes = entry.byteLength === byteLength;\n    const sameVersion = version == null || entry.version === version;\n    const sameTopo = topologyVersion == null || entry.topologyVersion === topologyVersion;\n    const sameCount = count == null || entry.count === count;\n    const sameView = viewSig == null || entry.viewSig === viewSig;\n\n    if (sameBytes && sameVersion && sameTopo && sameCount && sameView) {\n      return entry.buffer;\n    }\n\n    const dirtyRange = meta.dirtyRange ?? null;\n    if (\n      dirtyRange\n      && sameBytes\n      && sameTopo\n      && sameCount\n      && sameView\n      && entry.byteLength > 0\n      && Number.isFinite(Number(dirtyRange.start))\n      && Number.isFinite(Number(dirtyRange.count))\n      && Number(dirtyRange.count) > 0\n    ) {\n      const elementSize = typedArray.BYTES_PER_ELEMENT || 1;\n      const start = Math.max(0, Math.floor(Number(dirtyRange.start)));\n      const count = Math.max(0, Math.floor(Number(dirtyRange.count)));\n      const end = Math.min(typedArray.length ?? 0, start + count);\n      if (end > start) {\n        queue.writeBuffer(entry.buffer, start * elementSize, typedArray.subarray(start, end));\n        entry.byteLength = byteLength;\n        entry.version = version;\n        entry.topologyVersion = topologyVersion;\n        entry.count = meta.count ?? entry.count;\n        entry.viewSig = viewSig;\n        this.buffers.set(key, entry);\n        return entry.buffer;\n      }\n    }\n\n    queue.writeBuffer(entry.buffer, 0, typedArray);\n    entry.byteLength = byteLength;\n    entry.version = version;\n    entry.topologyVersion = topologyVersion;\n    entry.count = count;\n    entry.viewSig = viewSig;\n    this.buffers.set(key, entry);\n    return entry.buffer;\n  }\n\n  getOrCreateShaderModule(device, key, code) {\n    if (this.shaderModules.has(key)) return this.shaderModules.get(key);\n    const module = device.createShaderModule({ code });\n    this.shaderModules.set(key, module);\n    return module;\n  }\n\n  getOrCreatePipeline(key, factory) {\n    if (this.pipelines.has(key)) return this.pipelines.get(key);\n    const pipeline = factory();\n    this.pipelines.set(key, pipeline);\n    return pipeline;\n  }\n\n  destroy() {\n    for (const entry of this.buffers.values()) {\n      entry?.buffer?.destroy?.();\n    }\n    this.buffers.clear();\n    this.shaderModules.clear();\n    this.pipelines.clear();\n  }\n}\n","import { WebGLResourceCache } from './WebGLResourceCache.js';\nimport { WebGPUResourceCache } from './WebGPUResourceCache.js';\n\nexport class ResourceCache {\n  constructor(type) {\n    this.type = type;\n    this.webgl = type === 'webgl2' ? new WebGLResourceCache() : null;\n    this.webgpu = type === 'webgpu' ? new WebGPUResourceCache() : null;\n  }\n\n  destroy(deviceOrGl) {\n    if (this.webgl) {\n      const gl = deviceOrGl?.gl ?? deviceOrGl;\n      this.webgl.destroy(gl);\n    }\n    if (this.webgpu) {\n      this.webgpu.destroy();\n    }\n  }\n}\n","import { bumpCounter } from '../../utilities/counters.js';\nimport { ResourceCache } from '../resources/ResourceCache.js';\nimport { resolveWebGLContextAttributes } from '../qualityOptions.js';\n\nfunction warnOnce(owner, key, message, detail) {\n  if (!owner) return;\n  owner._warnedIssues ??= new Set();\n  if (owner._warnedIssues.has(key)) return;\n  owner._warnedIssues.add(key);\n  console.warn(message, detail);\n}\n\nfunction isDebugWebGLPickEnabled() {\n  if (globalThis.__HELIOS_DEBUG_WEBGL_PICK === true) return true;\n  try {\n    const search = globalThis.location?.search ?? '';\n    return search.includes('debugWebGLPick=1');\n  } catch (_) {\n    return false;\n  }\n}\n\nfunction debugWebGLPick(message, detail) {\n  if (!isDebugWebGLPickEnabled()) return;\n  console.warn(`[Helios][WebGLPick] ${message}`, detail);\n}\n\nfunction compileShader(gl, type, source) {\n  const shader = gl.createShader(type);\n  gl.shaderSource(shader, source);\n  gl.compileShader(shader);\n  if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n    const log = gl.getShaderInfoLog(shader);\n    gl.deleteShader(shader);\n    throw new Error(log || 'Shader compilation error');\n  }\n  return shader;\n}\n\nfunction createProgram(gl, vertexSource, fragmentSource) {\n  const vert = compileShader(gl, gl.VERTEX_SHADER, vertexSource);\n  const frag = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);\n  const program = gl.createProgram();\n  gl.attachShader(program, vert);\n  gl.attachShader(program, frag);\n  gl.linkProgram(program);\n  if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n    const log = gl.getProgramInfoLog(program);\n    gl.deleteProgram(program);\n    throw new Error(log || 'Program link error');\n  }\n  gl.deleteShader(vert);\n  gl.deleteShader(frag);\n  return program;\n}\n\nconst PRESENT_VERT = `#version 300 es\nprecision highp float;\nlayout (location = 0) in vec2 a_position;\nlayout (location = 1) in vec2 a_uv;\nout vec2 v_uv;\nvoid main() {\n  gl_Position = vec4(a_position, 0.0, 1.0);\n  v_uv = a_uv;\n}`;\n\nconst PRESENT_FRAG = `#version 300 es\nprecision highp float;\nin vec2 v_uv;\nuniform sampler2D u_texture;\nout vec4 fragColor;\nvoid main() {\n  fragColor = texture(u_texture, v_uv);\n}`;\n/**\n * Thin wrapper around a WebGL2RenderingContext that exposes a consistent API\n * for the modular renderer.\n */\nexport class WebGL2Device {\n  constructor(canvas, options = {}) {\n    this.canvas = canvas;\n    this.options = options;\n    this.gl = null;\n    this.presentProgram = null;\n    this.presentVAO = null;\n    this.presentTextureLocation = null;\n    this.size = { width: 1, height: 1, devicePixelRatio: 1 };\n    this.type = 'webgl2';\n    this.counters = { beginFrame: 0, presentFramebuffer: 0 };\n    this.resourceCache = new ResourceCache(this.type);\n    this._warnedIssues = new Set();\n  }\n\n  async initialize() {\n    this.contextAttributes = resolveWebGLContextAttributes(this.options);\n    this.antialias = this.contextAttributes.antialias !== false;\n    const gl = this.canvas.getContext('webgl2', this.contextAttributes);\n    if (!gl) {\n      throw new Error('WebGL2 is not available in this environment');\n    }\n    this.gl = gl;\n    gl.enable(gl.BLEND);\n    // Use standard straight-alpha blending for color while accumulating alpha coverage correctly.\n    gl.blendFuncSeparate?.(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n    if (typeof gl.blendFuncSeparate !== 'function') {\n      gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n    }\n    gl.enable(gl.DEPTH_TEST);\n    gl.depthFunc(gl.LEQUAL);\n    gl.clearDepth(1.0);\n    this.setupPresentPipeline();\n  }\n\n  setupPresentPipeline() {\n    const { gl } = this;\n    this.presentProgram = createProgram(gl, PRESENT_VERT, PRESENT_FRAG);\n    this.presentTextureLocation = gl.getUniformLocation(this.presentProgram, 'u_texture');\n    const vao = gl.createVertexArray();\n    gl.bindVertexArray(vao);\n    const buffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n    const vertices = new Float32Array([\n      -1, -1, 0, 0,\n      1, -1, 1, 0,\n      -1, 1, 0, 1,\n      -1, 1, 0, 1,\n      1, -1, 1, 0,\n      1, 1, 1, 1,\n    ]);\n    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(0);\n    gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 16, 0);\n    gl.enableVertexAttribArray(1);\n    gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 16, 8);\n    gl.bindVertexArray(null);\n    this.presentVAO = vao;\n  }\n\n  resize(size) {\n    this.size = size;\n    if (!this.gl) return;\n    this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n  }\n\n  beginFrame(renderTarget, clearColor, rect) {\n    this.counters.beginFrame = bumpCounter(this.counters.beginFrame);\n    const { gl } = this;\n    const target = renderTarget?.handle ?? null;\n    gl.bindFramebuffer(gl.FRAMEBUFFER, target);\n    const viewport = rect\n      ? [rect.x, rect.y, rect.width, rect.height]\n      : [0, 0, renderTarget?.width ?? this.canvas.width, renderTarget?.height ?? this.canvas.height];\n    gl.viewport(viewport[0], viewport[1], viewport[2], viewport[3]);\n    gl.colorMask(true, true, true, true);\n    gl.depthMask(true);\n    if (clearColor) {\n      gl.clearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);\n      gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n    } else {\n      gl.clear(gl.DEPTH_BUFFER_BIT);\n    }\n    return {\n      type: 'webgl2',\n      gl,\n      target: renderTarget,\n      viewport,\n    };\n  }\n\n  endFrame(context) {\n    context.gl.bindVertexArray(null);\n  }\n\n  createProgram(vertexSource, fragmentSource) {\n    return createProgram(this.gl, vertexSource, fragmentSource);\n  }\n\n  createFramebuffer(width, height) {\n    const { gl } = this;\n    const framebuffer = gl.createFramebuffer();\n    gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n    const texture = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n    gl.drawBuffers?.([gl.COLOR_ATTACHMENT0]);\n    gl.readBuffer?.(gl.COLOR_ATTACHMENT0);\n    const depth = gl.createRenderbuffer();\n    gl.bindRenderbuffer(gl.RENDERBUFFER, depth);\n    gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height);\n    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, depth);\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    gl.bindRenderbuffer?.(gl.RENDERBUFFER, null);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    return {\n      type: 'webgl2',\n      handle: framebuffer,\n      texture,\n      depth,\n      width,\n      height,\n    };\n  }\n\n  presentFramebuffer(framebuffer, rect) {\n    if (!framebuffer?.texture) return;\n    this.counters.presentFramebuffer = bumpCounter(this.counters.presentFramebuffer);\n    const { gl } = this;\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    const width = rect?.width ?? this.canvas.width;\n    const height = rect?.height ?? this.canvas.height;\n    const x = rect?.x ?? 0;\n    const y = rect?.y ?? 0;\n    gl.viewport(x, y, width, height);\n    gl.useProgram(this.presentProgram);\n    gl.activeTexture(gl.TEXTURE0);\n    gl.bindTexture(gl.TEXTURE_2D, framebuffer.texture);\n    gl.uniform1i(this.presentTextureLocation, 0);\n    gl.bindVertexArray(this.presentVAO);\n    gl.drawArrays(gl.TRIANGLES, 0, 6);\n    gl.bindVertexArray(null);\n  }\n\n  async readPixels(framebuffer, rect) {\n    const { gl } = this;\n    if (!gl || gl.isContextLost?.()) {\n      warnOnce(this, 'readPixels:context-lost', 'WebGL2Device: skipping readPixels because the context is unavailable or lost.');\n      return new Uint8Array(0);\n    }\n    const target = framebuffer?.handle ?? null;\n    const availableWidth = Math.max(0, Math.floor(framebuffer?.width ?? this.canvas.width ?? 0));\n    const availableHeight = Math.max(0, Math.floor(framebuffer?.height ?? this.canvas.height ?? 0));\n    const width = Math.max(0, Math.floor(rect?.width ?? availableWidth));\n    const height = Math.max(0, Math.floor(rect?.height ?? availableHeight));\n    const x = Math.max(0, Math.floor(rect?.x ?? 0));\n    const y = Math.max(0, Math.floor(rect?.y ?? 0));\n    debugWebGLPick('readPixels:start', {\n      framebuffer,\n      rect: { x, y, width, height },\n      availableWidth,\n      availableHeight,\n      canvas: {\n        width: this.canvas?.width ?? 0,\n        height: this.canvas?.height ?? 0,\n      },\n    });\n    if (\n      width <= 0\n      || height <= 0\n      || availableWidth <= 0\n      || availableHeight <= 0\n      || x >= availableWidth\n      || y >= availableHeight\n      || x + width > availableWidth\n      || y + height > availableHeight\n    ) {\n      return new Uint8Array(0);\n    }\n    if (target && typeof gl.isFramebuffer === 'function' && !gl.isFramebuffer(target)) {\n      warnOnce(this, 'readPixels:invalid-framebuffer', 'WebGL2Device: skipping readPixels for an invalid framebuffer target.', {\n        framebuffer,\n        rect: { x, y, width, height },\n      });\n      return new Uint8Array(0);\n    }\n    if (framebuffer?.texture && typeof gl.isTexture === 'function' && !gl.isTexture(framebuffer.texture)) {\n      warnOnce(this, 'readPixels:invalid-texture', 'WebGL2Device: skipping readPixels for a framebuffer with an invalid color texture.', {\n        framebuffer,\n        rect: { x, y, width, height },\n      });\n      return new Uint8Array(0);\n    }\n    const data = new Uint8Array(width * height * 4);\n    const readFramebufferTarget = gl.READ_FRAMEBUFFER ?? gl.FRAMEBUFFER;\n    gl.bindFramebuffer(gl.FRAMEBUFFER, target);\n    if (readFramebufferTarget !== gl.FRAMEBUFFER) {\n      gl.bindFramebuffer(readFramebufferTarget, target);\n    }\n    try {\n      if (target) {\n        const status = gl.checkFramebufferStatus?.(readFramebufferTarget);\n        if (status != null && status !== gl.FRAMEBUFFER_COMPLETE) {\n          warnOnce(this, `readPixels:framebuffer-status:${status}`, 'WebGL2Device: skipping readPixels for an incomplete framebuffer.', {\n            status,\n            framebuffer,\n            rect: { x, y, width, height },\n          });\n          return new Uint8Array(0);\n        }\n        const colorAttachment = gl.COLOR_ATTACHMENT0;\n        const attachmentTypeEnum = gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;\n        const noneEnum = gl.NONE;\n        if (colorAttachment != null && attachmentTypeEnum != null && typeof gl.getFramebufferAttachmentParameter === 'function') {\n          const attachmentType = gl.getFramebufferAttachmentParameter(\n            readFramebufferTarget,\n            colorAttachment,\n            attachmentTypeEnum,\n          );\n          const attachmentName = gl.getFramebufferAttachmentParameter?.(\n            readFramebufferTarget,\n            colorAttachment,\n            gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,\n          );\n          debugWebGLPick('readPixels:attachment', {\n            attachmentType,\n            attachmentName,\n            framebuffer,\n            rect: { x, y, width, height },\n          });\n          if (attachmentType == null || attachmentType === noneEnum) {\n            warnOnce(\n              this,\n              'readPixels:missing-color-attachment',\n              'WebGL2Device: skipping readPixels for a framebuffer without a readable color attachment.',\n              { framebuffer, rect: { x, y, width, height } },\n            );\n            return new Uint8Array(0);\n          }\n        }\n        try {\n          gl.readBuffer?.(gl.COLOR_ATTACHMENT0);\n        } catch (error) {\n          warnOnce(\n            this,\n            'readPixels:read-buffer-color-attachment0',\n            'WebGL2Device: failed to select COLOR_ATTACHMENT0 before readPixels.',\n            { error, framebuffer, rect: { x, y, width, height } },\n          );\n          return new Uint8Array(0);\n        }\n      }\n      gl.getError?.();\n      gl.readPixels(x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data);\n      const postError = gl.getError?.() ?? gl.NO_ERROR;\n      debugWebGLPick('readPixels:done', {\n        framebuffer,\n        rect: { x, y, width, height },\n        postError,\n        sample: Array.from(data.slice(0, 4)),\n      });\n      if (postError !== gl.NO_ERROR) {\n        warnOnce(this, `readPixels:gl-error:${postError}`, 'WebGL2Device: readPixels reported a WebGL error.', {\n          error: postError,\n          framebuffer,\n          rect: { x, y, width, height },\n        });\n        return new Uint8Array(0);\n      }\n      return data;\n    } catch (error) {\n      warnOnce(this, 'readPixels:exception', 'WebGL2Device: readPixels threw while reading the framebuffer.', {\n        error,\n        framebuffer,\n        rect: { x, y, width, height },\n      });\n      return new Uint8Array(0);\n    } finally {\n      gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n      gl.bindFramebuffer(readFramebufferTarget, null);\n    }\n  }\n\n  destroy() {\n    const { gl } = this;\n    if (!gl) return;\n    this.resourceCache?.destroy(gl);\n    if (this.presentVAO) gl.deleteVertexArray(this.presentVAO);\n    if (this.presentProgram) gl.deleteProgram(this.presentProgram);\n  }\n}\n","import { bumpCounter } from '../../utilities/counters.js';\nimport { ResourceCache } from '../resources/ResourceCache.js';\nimport { resolveWebGPUAdapterOptions, resolveWebGPUCanvasSampleCount, resolveWebGPURequestAdapterArgument } from '../qualityOptions.js';\n\nconst PRESENT_WGSL = /* wgsl */ `\nstruct VertexOut {\n  @builtin(position) position : vec4<f32>,\n  @location(0) uv : vec2<f32>,\n};\n\n@vertex\nfn vs(@location(0) position : vec2<f32>, @location(1) uv : vec2<f32>) -> VertexOut {\n  var output : VertexOut;\n  output.position = vec4<f32>(position, 0.0, 1.0);\n  output.uv = uv;\n  return output;\n}\n\n@group(0) @binding(0) var textureSampler : sampler;\n@group(0) @binding(1) var textureData : texture_2d<f32>;\n\n@fragment\nfn fs(input : VertexOut) -> @location(0) vec4<f32> {\n  return textureSample(textureData, textureSampler, input.uv);\n}`;\n\nfunction objectOption(value) {\n  return value && typeof value === 'object' ? value : {};\n}\n\nexport class WebGPUDevice {\n  constructor(canvas, options = {}) {\n    this.canvas = canvas;\n    this.options = options;\n    this.adapter = null;\n    this.device = null;\n    this.context = null;\n    this.format = null;\n    this.quadVertexBuffer = null;\n    this.presentPipeline = null;\n    this.presentBindGroup = null;\n    this.presentLayout = null;\n    this.sampler = null;\n    this.type = 'webgpu';\n    this.size = { width: 1, height: 1, devicePixelRatio: 1 };\n    this.depthTexture = null;\n    this.depthSize = { width: 0, height: 0, sampleCount: 1 };\n    this.colorTexture = null;\n    this.colorSize = { width: 0, height: 0, sampleCount: 1 };\n    this.depthFormat = 'depth24plus';\n    this.limits = null;\n    this.maxStorageBufferBindingSize = null;\n    this.requestedLimits = null;\n    this.counters = { beginFrame: 0, presentFramebuffer: 0 };\n    this.resourceCache = new ResourceCache(this.type);\n    this.sampleCount = 1;\n    this.adapterOptions = null;\n    this.deviceDescriptor = null;\n    this.canvasConfiguration = null;\n  }\n\n  static async isSupported() {\n    return typeof navigator !== 'undefined' && Boolean(navigator.gpu);\n  }\n\n  async initialize() {\n    if (!(await WebGPUDevice.isSupported())) {\n      throw new Error('WebGPU is not available in this environment');\n    }\n    this.adapterOptions = resolveWebGPUAdapterOptions(this.options);\n    this.adapter = await navigator.gpu.requestAdapter(resolveWebGPURequestAdapterArgument(this.options));\n    if (!this.adapter) {\n      throw new Error('Unable to acquire GPU adapter');\n    }\n    const storageLimitRatio = Math.min(Math.max(this.options.storageBufferLimitRatio ?? 0.75, 0), 1);\n    const bufferLimitRatio = Math.min(Math.max(this.options.bufferLimitRatio ?? 1, 0), 1);\n    const adapterStorageLimit = this.adapter.limits?.maxStorageBufferBindingSize;\n    const adapterBufferLimit = this.adapter.limits?.maxBufferSize;\n    const adapterStorageBuffersPerStage = this.adapter.limits?.maxStorageBuffersPerShaderStage;\n    // Request higher limits (browser default is often 128 MB for storage and 256 MB for buffers).\n    const baseStorageLimit = 128 * 1024 * 1024;\n    const baseBufferLimit = 256 * 1024 * 1024;\n    const requestedStorageLimit = adapterStorageLimit\n      ? Math.min(adapterStorageLimit, Math.max(baseStorageLimit, Math.floor(adapterStorageLimit * storageLimitRatio)))\n      : null;\n    const requestedBufferLimit = adapterBufferLimit\n      ? Math.min(adapterBufferLimit, Math.max(baseBufferLimit, Math.floor(adapterBufferLimit * bufferLimitRatio)))\n      : null;\n    const requiredLimits = {};\n    if (requestedStorageLimit) {\n      requiredLimits.maxStorageBufferBindingSize = requestedStorageLimit;\n    }\n    if (requestedBufferLimit) {\n      requiredLimits.maxBufferSize = requestedBufferLimit;\n    }\n    if (adapterStorageBuffersPerStage && adapterStorageBuffersPerStage > 8) {\n      requiredLimits.maxStorageBuffersPerShaderStage = Math.min(adapterStorageBuffersPerStage, 10);\n    }\n    const descriptor = { ...objectOption(this.options.webgpuDeviceDescriptor) };\n    const requestedLimits = {\n      ...requiredLimits,\n      ...objectOption(descriptor.requiredLimits),\n    };\n    this.requestedLimits = Object.keys(requestedLimits).length ? requestedLimits : null;\n    if (this.requestedLimits) {\n      descriptor.requiredLimits = this.requestedLimits;\n    }\n    this.deviceDescriptor = descriptor;\n    this.device = await this.adapter.requestDevice(descriptor);\n    this.limits = this.device.limits;\n    this.maxStorageBufferBindingSize = this.device.limits?.maxStorageBufferBindingSize ?? null;\n    this.context = this.canvas.getContext('webgpu');\n    if (!this.context) {\n      throw new Error('Unable to create WebGPU context');\n    }\n    const canvasConfigOverrides = objectOption(this.options.webgpuCanvasConfiguration);\n    this.format = canvasConfigOverrides.format ?? navigator.gpu.getPreferredCanvasFormat();\n    this.sampleCount = resolveWebGPUCanvasSampleCount(this.options);\n    this.canvasConfiguration = {\n      device: this.device,\n      format: this.format,\n      alphaMode: 'premultiplied',\n      ...canvasConfigOverrides,\n    };\n    this.canvasConfiguration.device = this.device;\n    this.format = this.canvasConfiguration.format;\n    this.context.configure(this.canvasConfiguration);\n    this.createQuadBuffer();\n    this.createPresentPipeline();\n  }\n\n  createQuadBuffer() {\n    // Triangle strip quad\n    const vertices = new Float32Array([\n      -1, -1, 0, 0,\n      1, -1, 1, 0,\n      -1, 1, 0, 1,\n      1, 1, 1, 1,\n    ]);\n    this.quadVertexBuffer = this.device.createBuffer({\n      size: vertices.byteLength,\n      usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n      mappedAtCreation: true,\n    });\n    new Float32Array(this.quadVertexBuffer.getMappedRange()).set(vertices);\n    this.quadVertexBuffer.unmap();\n  }\n\n  createPresentPipeline() {\n    const shaderModule = this.device.createShaderModule({ code: PRESENT_WGSL });\n    this.sampler = this.device.createSampler({ magFilter: 'linear', minFilter: 'linear' });\n    this.presentLayout = this.device.createBindGroupLayout({\n      entries: [\n        { binding: 0, visibility: GPUShaderStage.FRAGMENT, sampler: {} },\n        { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: {} },\n      ],\n    });\n    const pipelineLayout = this.device.createPipelineLayout({ bindGroupLayouts: [this.presentLayout] });\n    this.presentPipeline = this.device.createRenderPipeline({\n      layout: pipelineLayout,\n      vertex: {\n        module: shaderModule,\n        entryPoint: 'vs',\n        buffers: [\n          {\n            arrayStride: 16,\n            attributes: [\n              { shaderLocation: 0, offset: 0, format: 'float32x2' },\n              { shaderLocation: 1, offset: 8, format: 'float32x2' },\n            ],\n          },\n        ],\n      },\n      fragment: {\n        module: shaderModule,\n        entryPoint: 'fs',\n        targets: [{ format: this.format }],\n      },\n      primitive: { topology: 'triangle-strip' },\n    });\n  }\n\n  resize(size) {\n    this.size = size;\n  }\n\n  resolveFrameExtent(renderTarget, targetTexture) {\n    const textureWidth = Number.isFinite(targetTexture?.width) ? targetTexture.width : null;\n    const textureHeight = Number.isFinite(targetTexture?.height) ? targetTexture.height : null;\n    return {\n      width: renderTarget?.width ?? textureWidth ?? this.canvas.width,\n      height: renderTarget?.height ?? textureHeight ?? this.canvas.height,\n    };\n  }\n\n  beginFrame(renderTarget, clearColor, rect) {\n    this.counters.beginFrame = bumpCounter(this.counters.beginFrame);\n    const targetTexture = renderTarget ? renderTarget.texture : this.context.getCurrentTexture();\n    const { width, height } = this.resolveFrameExtent(renderTarget, targetTexture);\n    const sampleCount = renderTarget ? 1 : this.sampleCount;\n    const colorTexture = sampleCount > 1\n      ? this.ensureColorTexture(width, height, sampleCount)\n      : targetTexture;\n    const colorView = colorTexture.createView();\n    const resolveTargetView = sampleCount > 1 ? targetTexture.createView() : null;\n    const depthView = renderTarget?.depthTexture\n      ? renderTarget.depthTexture.createView()\n      : this.ensureDepthTexture(width, height, sampleCount)?.createView();\n\n    const encoder = this.device.createCommandEncoder();\n    const pass = encoder.beginRenderPass({\n      colorAttachments: [\n        {\n          view: colorView,\n          ...(resolveTargetView ? { resolveTarget: resolveTargetView } : {}),\n          clearValue: clearColor\n            ? { r: clearColor[0], g: clearColor[1], b: clearColor[2], a: clearColor[3] }\n            : { r: 0, g: 0, b: 0, a: 1 },\n          loadOp: 'clear',\n          storeOp: 'store',\n        },\n      ],\n      ...(depthView\n        ? {\n            depthStencilAttachment: {\n              view: depthView,\n              depthClearValue: 1.0,\n              depthLoadOp: 'clear',\n              depthStoreOp: 'store',\n            },\n          }\n        : {}),\n    });\n\n    if (rect) {\n      pass.setViewport(rect.x, rect.y, rect.width, rect.height, 0, 1);\n    }\n\n    return {\n      type: 'webgpu',\n      device: this.device,\n      passEncoder: pass,\n      commandEncoder: encoder,\n      format: this.format,\n      quad: this.quadVertexBuffer,\n      target: renderTarget,\n      colorView,\n      resolveTargetView,\n      depthView,\n      width,\n      height,\n      viewport: rect ?? null,\n      sampleCount,\n    };\n  }\n\n  endFrame(context) {\n    if (context.passEncoder) {\n      context.passEncoder.end();\n    }\n    this.device.queue.submit([context.commandEncoder.finish()]);\n  }\n\n  destroy() {\n    this.resourceCache?.destroy(this);\n    this.quadVertexBuffer?.destroy?.();\n    this.colorTexture?.destroy?.();\n    this.colorTexture = null;\n    this.depthTexture?.destroy?.();\n    this.depthTexture = null;\n  }\n\n  createFramebuffer(width, height) {\n    const texture = this.device.createTexture({\n      size: { width, height },\n      format: this.format,\n      usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC,\n    });\n    const depthTexture = this.device.createTexture({\n      size: { width, height, depthOrArrayLayers: 1 },\n      format: this.depthFormat,\n      usage: GPUTextureUsage.RENDER_ATTACHMENT,\n    });\n    return {\n      type: 'webgpu',\n      texture,\n      depthTexture,\n      width,\n      height,\n    };\n  }\n\n  presentFramebuffer(framebuffer, rect) {\n    if (!framebuffer?.texture) return;\n    this.counters.presentFramebuffer = bumpCounter(this.counters.presentFramebuffer);\n    const view = this.context.getCurrentTexture().createView();\n    const encoder = this.device.createCommandEncoder();\n    const pass = encoder.beginRenderPass({\n      colorAttachments: [\n        {\n          view,\n          clearValue: { r: 0, g: 0, b: 0, a: 1 },\n          loadOp: 'clear',\n          storeOp: 'store',\n        },\n      ],\n    });\n    if (rect) {\n      pass.setViewport(rect.x, rect.y, rect.width, rect.height, 0, 1);\n    }\n    const bindGroup = this.device.createBindGroup({\n      layout: this.presentLayout,\n      entries: [\n        { binding: 0, resource: this.sampler },\n        { binding: 1, resource: framebuffer.texture.createView() },\n      ],\n    });\n    pass.setPipeline(this.presentPipeline);\n    pass.setVertexBuffer(0, this.quadVertexBuffer);\n    pass.setBindGroup(0, bindGroup);\n    pass.draw(4, 1, 0, 0);\n    pass.end();\n    this.device.queue.submit([encoder.finish()]);\n  }\n\n  async readPixels(framebuffer, rect) {\n    const targetTexture = framebuffer?.texture ?? this.context.getCurrentTexture();\n    const width = rect?.width ?? framebuffer?.width ?? this.canvas.width;\n    const height = rect?.height ?? framebuffer?.height ?? this.canvas.height;\n    const x = rect?.x ?? 0;\n    const y = rect?.y ?? 0;\n    const encoder = this.device.createCommandEncoder();\n    const bytesPerPixel = 4;\n    const alignedBytesPerRow = Math.ceil((width * bytesPerPixel) / 256) * 256;\n    const readBuffer = this.device.createBuffer({\n      size: alignedBytesPerRow * height,\n      usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n    });\n    encoder.copyTextureToBuffer(\n      { texture: targetTexture, origin: { x, y, z: 0 } },\n      { buffer: readBuffer, bytesPerRow: alignedBytesPerRow },\n      { width, height, depthOrArrayLayers: 1 },\n    );\n    this.device.queue.submit([encoder.finish()]);\n    await readBuffer.mapAsync(GPUMapMode.READ);\n    const mapped = new Uint8Array(readBuffer.getMappedRange());\n    const result = new Uint8Array(width * height * bytesPerPixel);\n    for (let row = 0; row < height; row += 1) {\n      const srcStart = row * alignedBytesPerRow;\n      const dstStart = row * width * bytesPerPixel;\n      result.set(mapped.subarray(srcStart, srcStart + width * bytesPerPixel), dstStart);\n    }\n    readBuffer.destroy();\n    return result;\n  }\n\n  ensureDepthTexture(width, height, sampleCount = 1) {\n    if (!width || !height) return null;\n    if (\n      !this.depthTexture\n      || this.depthSize.width !== width\n      || this.depthSize.height !== height\n      || this.depthSize.sampleCount !== sampleCount\n    ) {\n      this.depthTexture?.destroy?.();\n      this.depthTexture = this.device.createTexture({\n        size: { width, height, depthOrArrayLayers: 1 },\n        format: this.depthFormat,\n        usage: GPUTextureUsage.RENDER_ATTACHMENT,\n        sampleCount,\n      });\n      this.depthSize = { width, height, sampleCount };\n    }\n    return this.depthTexture;\n  }\n\n  ensureColorTexture(width, height, sampleCount = 1) {\n    if (!width || !height || sampleCount <= 1) return null;\n    if (\n      !this.colorTexture\n      || this.colorSize.width !== width\n      || this.colorSize.height !== height\n      || this.colorSize.sampleCount !== sampleCount\n    ) {\n      this.colorTexture?.destroy?.();\n      this.colorTexture = this.device.createTexture({\n        size: { width, height, depthOrArrayLayers: 1 },\n        format: this.format,\n        usage: GPUTextureUsage.RENDER_ATTACHMENT,\n        sampleCount,\n      });\n      this.colorSize = { width, height, sampleCount };\n    }\n    return this.colorTexture;\n  }\n}\n","function toPointerArray(points) {\n  if (!points) return [];\n  if (Array.isArray(points)) return points.filter(Boolean);\n  if (points instanceof Map) return Array.from(points.values()).filter(Boolean);\n  return Array.from(points).filter(Boolean);\n}\n\nfunction sortPointers(points) {\n  return [...toPointerArray(points)].sort((a, b) => (a.pointerId ?? 0) - (b.pointerId ?? 0));\n}\n\nexport function computeGestureCentroid(points) {\n  const ordered = sortPointers(points);\n  if (!ordered.length) return { x: 0, y: 0 };\n  let sumX = 0;\n  let sumY = 0;\n  for (const point of ordered) {\n    sumX += point.clientX ?? 0;\n    sumY += point.clientY ?? 0;\n  }\n  return {\n    x: sumX / ordered.length,\n    y: sumY / ordered.length,\n  };\n}\n\nexport function computePinchDistance(points) {\n  const ordered = sortPointers(points);\n  if (ordered.length < 2) return 0;\n  const [a, b] = ordered;\n  return Math.hypot((b.clientX ?? 0) - (a.clientX ?? 0), (b.clientY ?? 0) - (a.clientY ?? 0));\n}\n\nexport function computeTwistAngle(points) {\n  const ordered = sortPointers(points);\n  if (ordered.length < 2) return 0;\n  const [a, b] = ordered;\n  return Math.atan2((b.clientY ?? 0) - (a.clientY ?? 0), (b.clientX ?? 0) - (a.clientX ?? 0));\n}\n\nexport function snapshotTouchGesture(points) {\n  const ordered = sortPointers(points);\n  return {\n    pointers: ordered,\n    count: ordered.length,\n    centroid: computeGestureCentroid(ordered),\n    distance: computePinchDistance(ordered),\n    angle: computeTwistAngle(ordered),\n  };\n}\n\nexport function classifyGestureForSuppression(startPoints, currentPoints, tolerancePx = 4) {\n  const orderedStart = sortPointers(startPoints);\n  const orderedCurrent = sortPointers(currentPoints);\n  const limit = Math.max(0, Number(tolerancePx) || 0);\n  const count = Math.min(orderedStart.length, orderedCurrent.length);\n  let maxPointerTravel = 0;\n  for (let i = 0; i < count; i += 1) {\n    const start = orderedStart[i];\n    const current = orderedCurrent[i];\n    const travel = Math.hypot(\n      (current?.clientX ?? 0) - (start?.clientX ?? 0),\n      (current?.clientY ?? 0) - (start?.clientY ?? 0),\n    );\n    if (travel > maxPointerTravel) maxPointerTravel = travel;\n  }\n  const startGesture = snapshotTouchGesture(orderedStart);\n  const currentGesture = snapshotTouchGesture(orderedCurrent);\n  const centroidDistance = Math.hypot(\n    currentGesture.centroid.x - startGesture.centroid.x,\n    currentGesture.centroid.y - startGesture.centroid.y,\n  );\n  const pinchDelta = currentGesture.distance - startGesture.distance;\n  const twistDelta = currentGesture.angle - startGesture.angle;\n  return {\n    pointerCount: orderedCurrent.length,\n    moved: maxPointerTravel > limit || centroidDistance > limit || Math.abs(pinchDelta) > limit,\n    maxPointerTravel,\n    centroidDistance,\n    pinchDelta,\n    twistDelta,\n  };\n}\n","import {\n  classifyGestureForSuppression,\n  snapshotTouchGesture,\n} from './touchGestureMath.js';\n\nfunction clamp(value, min, max) {\n  return Math.min(max, Math.max(min, value));\n}\n\nfunction createVec3(x = 0, y = 0, z = 0) {\n  return new Float32Array([x, y, z]);\n}\n\nfunction vec3Add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  out[2] = a[2] + b[2];\n  return out;\n}\n\nfunction vec3Sub(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  out[2] = a[2] - b[2];\n  return out;\n}\n\nfunction vec3Scale(out, a, s) {\n  out[0] = a[0] * s;\n  out[1] = a[1] * s;\n  out[2] = a[2] * s;\n  return out;\n}\n\nfunction vec3ScaleAndAdd(out, a, b, s) {\n  out[0] = a[0] + b[0] * s;\n  out[1] = a[1] + b[1] * s;\n  out[2] = a[2] + b[2] * s;\n  return out;\n}\n\nfunction vec3Cross(out, a, b) {\n  const ax = a[0];\n  const ay = a[1];\n  const az = a[2];\n  const bx = b[0];\n  const by = b[1];\n  const bz = b[2];\n  out[0] = ay * bz - az * by;\n  out[1] = az * bx - ax * bz;\n  out[2] = ax * by - ay * bx;\n  return out;\n}\n\nfunction vec3Normalize(out, a) {\n  const x = a[0];\n  const y = a[1];\n  const z = a[2];\n  const len = Math.hypot(x, y, z);\n  if (len > 0) {\n    const inv = 1 / len;\n    out[0] = x * inv;\n    out[1] = y * inv;\n    out[2] = z * inv;\n  }\n  return out;\n}\n\nfunction vec3TransformQuat(out, v, q) {\n  const x = v[0];\n  const y = v[1];\n  const z = v[2];\n  const qx = q[0];\n  const qy = q[1];\n  const qz = q[2];\n  const qw = q[3];\n\n  // calculate quat * vec\n  const ix = qw * x + qy * z - qz * y;\n  const iy = qw * y + qz * x - qx * z;\n  const iz = qw * z + qx * y - qy * x;\n  const iw = -qx * x - qy * y - qz * z;\n\n  // calculate result * inverse quat\n  out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n  out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n  out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n  return out;\n}\n\nfunction quatIdentity(out = new Float32Array(4)) {\n  out[0] = 0;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 1;\n  return out;\n}\n\nfunction quatNormalize(out, q) {\n  const len = Math.hypot(q[0], q[1], q[2], q[3]);\n  if (len > 0) {\n    const inv = 1 / len;\n    out[0] = q[0] * inv;\n    out[1] = q[1] * inv;\n    out[2] = q[2] * inv;\n    out[3] = q[3] * inv;\n  }\n  return out;\n}\n\nfunction quatMultiply(out, a, b) {\n  const ax = a[0];\n  const ay = a[1];\n  const az = a[2];\n  const aw = a[3];\n  const bx = b[0];\n  const by = b[1];\n  const bz = b[2];\n  const bw = b[3];\n  out[0] = aw * bx + ax * bw + ay * bz - az * by;\n  out[1] = aw * by - ax * bz + ay * bw + az * bx;\n  out[2] = aw * bz + ax * by - ay * bx + az * bw;\n  out[3] = aw * bw - ax * bx - ay * by - az * bz;\n  return out;\n}\n\nfunction quatFromAxisAngle(out, axis, rad) {\n  const half = rad * 0.5;\n  const s = Math.sin(half);\n  const ax = axis[0];\n  const ay = axis[1];\n  const az = axis[2];\n  const len = Math.hypot(ax, ay, az);\n  if (len < 1e-8) {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    return out;\n  }\n  const inv = 1 / len;\n  out[0] = ax * inv * s;\n  out[1] = ay * inv * s;\n  out[2] = az * inv * s;\n  out[3] = Math.cos(half);\n  return out;\n}\n\nfunction createMat4() {\n  const out = new Float32Array(16);\n  out[0] = 1;\n  out[5] = 1;\n  out[10] = 1;\n  out[15] = 1;\n  return out;\n}\n\nfunction mat4Identity(out) {\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = 1;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = 1;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n\nfunction mat4Multiply(out, a, b) {\n  const a00 = a[0];\n  const a01 = a[1];\n  const a02 = a[2];\n  const a03 = a[3];\n  const a10 = a[4];\n  const a11 = a[5];\n  const a12 = a[6];\n  const a13 = a[7];\n  const a20 = a[8];\n  const a21 = a[9];\n  const a22 = a[10];\n  const a23 = a[11];\n  const a30 = a[12];\n  const a31 = a[13];\n  const a32 = a[14];\n  const a33 = a[15];\n\n  const b00 = b[0];\n  const b01 = b[1];\n  const b02 = b[2];\n  const b03 = b[3];\n  const b10 = b[4];\n  const b11 = b[5];\n  const b12 = b[6];\n  const b13 = b[7];\n  const b20 = b[8];\n  const b21 = b[9];\n  const b22 = b[10];\n  const b23 = b[11];\n  const b30 = b[12];\n  const b31 = b[13];\n  const b32 = b[14];\n  const b33 = b[15];\n\n  out[0] = a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03;\n  out[1] = a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03;\n  out[2] = a02 * b00 + a12 * b01 + a22 * b02 + a32 * b03;\n  out[3] = a03 * b00 + a13 * b01 + a23 * b02 + a33 * b03;\n  out[4] = a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13;\n  out[5] = a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13;\n  out[6] = a02 * b10 + a12 * b11 + a22 * b12 + a32 * b13;\n  out[7] = a03 * b10 + a13 * b11 + a23 * b12 + a33 * b13;\n  out[8] = a00 * b20 + a10 * b21 + a20 * b22 + a30 * b23;\n  out[9] = a01 * b20 + a11 * b21 + a21 * b22 + a31 * b23;\n  out[10] = a02 * b20 + a12 * b21 + a22 * b22 + a32 * b23;\n  out[11] = a03 * b20 + a13 * b21 + a23 * b22 + a33 * b23;\n  out[12] = a00 * b30 + a10 * b31 + a20 * b32 + a30 * b33;\n  out[13] = a01 * b30 + a11 * b31 + a21 * b32 + a31 * b33;\n  out[14] = a02 * b30 + a12 * b31 + a22 * b32 + a32 * b33;\n  out[15] = a03 * b30 + a13 * b31 + a23 * b32 + a33 * b33;\n  return out;\n}\n\nfunction mat4Perspective(out, fovy, aspect, near, far) {\n  const f = 1.0 / Math.tan(fovy / 2);\n  const nf = 1 / (near - far);\n  out[0] = f / aspect;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = f;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = (far + near) * nf;\n  out[11] = -1;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 2 * far * near * nf;\n  out[15] = 0;\n  return out;\n}\n\nfunction mat4Ortho(out, left, right, bottom, top, near, far) {\n  const lr = 1 / (left - right);\n  const bt = 1 / (bottom - top);\n  const nf = 1 / (near - far);\n  out[0] = -2 * lr;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = -2 * bt;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = 2 * nf;\n  out[11] = 0;\n  out[12] = (left + right) * lr;\n  out[13] = (top + bottom) * bt;\n  out[14] = (far + near) * nf;\n  out[15] = 1;\n  return out;\n}\n\nfunction mat4LookAt(out, eye, center, up) {\n  // Based on gl-matrix lookAt, column-major layout.\n  const fx = center[0] - eye[0];\n  const fy = center[1] - eye[1];\n  const fz = center[2] - eye[2];\n\n  let f = createVec3(fx, fy, fz);\n  vec3Normalize(f, f);\n  if (!Number.isFinite(f[0]) || !Number.isFinite(f[1]) || !Number.isFinite(f[2])) {\n    f = createVec3(0, 0, -1);\n  }\n\n  let upVec = createVec3(up[0], up[1], up[2]);\n  vec3Normalize(upVec, upVec);\n  if (!Number.isFinite(upVec[0]) || !Number.isFinite(upVec[1]) || !Number.isFinite(upVec[2])) {\n    upVec = createVec3(0, 1, 0);\n  }\n\n  const s = createVec3();\n  vec3Cross(s, f, upVec);\n  if (Math.hypot(s[0], s[1], s[2]) < 1e-6) {\n    // Forward is parallel to up; choose an alternate up axis.\n    vec3Cross(s, f, new Float32Array([1, 0, 0]));\n  }\n  vec3Normalize(s, s);\n\n  const u = createVec3();\n  vec3Cross(u, s, f);\n\n  out[0] = s[0];\n  out[1] = u[0];\n  out[2] = -f[0];\n  out[3] = 0;\n  out[4] = s[1];\n  out[5] = u[1];\n  out[6] = -f[1];\n  out[7] = 0;\n  out[8] = s[2];\n  out[9] = u[2];\n  out[10] = -f[2];\n  out[11] = 0;\n  out[12] = -(s[0] * eye[0] + s[1] * eye[1] + s[2] * eye[2]);\n  out[13] = -(u[0] * eye[0] + u[1] * eye[1] + u[2] * eye[2]);\n  out[14] = f[0] * eye[0] + f[1] * eye[1] + f[2] * eye[2];\n  out[15] = 1;\n  return out;\n}\n\nfunction mat4Translate(out, a, v) {\n  const x = v[0];\n  const y = v[1];\n  const z = v[2];\n\n  if (a === out) {\n    out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n    out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n    out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n    out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n  } else {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n    out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n    out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n    out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n  }\n  return out;\n}\n\nfunction mat4Scale(out, a, v) {\n  const x = v[0];\n  const y = v[1];\n  const z = v[2];\n\n  out[0] = a[0] * x;\n  out[1] = a[1] * x;\n  out[2] = a[2] * x;\n  out[3] = a[3] * x;\n  out[4] = a[4] * y;\n  out[5] = a[5] * y;\n  out[6] = a[6] * y;\n  out[7] = a[7] * y;\n  out[8] = a[8] * z;\n  out[9] = a[9] * z;\n  out[10] = a[10] * z;\n  out[11] = a[11] * z;\n  out[12] = a[12];\n  out[13] = a[13];\n  out[14] = a[14];\n  out[15] = a[15];\n  return out;\n}\n\nexport class Camera {\n  constructor(canvas, options = {}) {\n    this.canvas = canvas;\n    this.mode = options.mode === '2d' ? '2d' : '3d';\n    this.projection = options.projection === 'orthographic' ? 'orthographic' : 'perspective';\n    this.suppressBrowserGestures = options.suppressBrowserGestures !== false;\n    this.fov = options.fov ?? 60;\n    this.near = options.near ?? 0.1;\n    this.far = options.far ?? 100000;\n    this.near2D = options.near2D ?? -1;\n    this.far2D = options.far2D ?? 1;\n    this.distance = options.distance ?? 800;\n    this.minDistance = options.minDistance ?? (10 / 3);\n    this.maxDistance = options.maxDistance ?? 75000;\n    this.zoom = options.zoom ?? 3;\n    this.minZoom = options.minZoom ?? (0.001 / 3);\n    this.maxZoom = options.maxZoom ?? 30;\n    this.rotation = quatIdentity(new Float32Array(4));\n    this.target = createVec3(0, 0, 0);\n    this.pan2D = createVec3();\n    this.pan3D = createVec3();\n    this.position = createVec3(0, 0, this.distance);\n    this.right = createVec3(1, 0, 0);\n    this.up = createVec3(0, -1, 0);\n    this.forward = createVec3(0, 0, -1);\n    this.viewport = { width: 1, height: 1, devicePixelRatio: 1 };\n\n    this.viewMatrix = createMat4();\n    this.projectionMatrix = createMat4();\n    this.viewProjectionMatrix = createMat4();\n    this._debugFrame = 0;\n\n    this._needsUpdate = true;\n    this._changeListener = typeof options.onChange === 'function' ? options.onChange : null;\n    this._pendingChangeDetail = null;\n    this.touchTwistEnabled = options.touchTwistEnabled === true;\n    this._activePointers = new Map();\n    this._gestureSnapshot = snapshotTouchGesture([]);\n    this._gestureStartSnapshot = snapshotTouchGesture([]);\n    this._gestureDragActive = false;\n    this.pointerMoveTolerancePx = Math.max(0, Number(options.pointerMoveTolerancePx ?? 4) || 0);\n    this.touchMoveTolerancePx = Math.max(0, Number(options.touchMoveTolerancePx ?? 8) || 0);\n    this._boundPointerDown = (event) => this.handlePointerDown(event);\n    this._boundMove = (event) => this.handlePointerMove(event);\n    this._boundUp = (event) => this.handlePointerUp(event);\n    this._boundCancel = (event) => this.handlePointerUp(event);\n    this._boundWheel = (event) => this.handleWheel(event);\n    this._firstStateLogged = false;\n    this._arcballLast = null;\n\n    // Default debug flag on so early state is captured.\n    // if (typeof window !== 'undefined' && window.__HELIOS_DEBUG_CAMERA !== false) {\n    //   window.__HELIOS_DEBUG_CAMERA = true;\n    // }\n\n    this.setViewport(options.viewport ?? this.viewport);\n    if (!options.disableControls) {\n      this.attachInput();\n    } else {\n      this.updateMatrices();\n    }\n  }\n\n  debugEnabled() {\n    return typeof window !== 'undefined' && window.__HELIOS_DEBUG_CAMERA;\n  }\n\n  logDebug(tag, payload) {\n    if (!this.debugEnabled()) return;\n    // eslint-disable-next-line no-console\n    console.debug(`[HeliosCamera:${tag}]`, payload);\n  }\n\n  setMode(mode) {\n    const normalized = mode === '3d' ? '3d' : '2d';\n    if (normalized !== this.mode) {\n      this.mode = normalized;\n      this._needsUpdate = true;\n      this.updateMatrices();\n    }\n  }\n\n  setProjectionMode(mode) {\n    const normalized = mode === 'orthographic' ? 'orthographic' : 'perspective';\n    if (normalized !== this.projection) {\n      this.projection = normalized;\n      this._needsUpdate = true;\n      this.updateMatrices();\n    }\n  }\n\n  setViewport(size) {\n    if (!size) return;\n    this.viewport = { ...this.viewport, ...size };\n    this._needsUpdate = true;\n    this.updateMatrices();\n  }\n\n  setTarget(target) {\n    if (!target) return;\n    this.target[0] = target[0] ?? this.target[0];\n    this.target[1] = target[1] ?? this.target[1];\n    this.target[2] = target[2] ?? this.target[2];\n    this._needsUpdate = true;\n    this.updateMatrices();\n  }\n\n  attachInput() {\n    if (!this.canvas || typeof this.canvas.addEventListener !== 'function') return;\n    this.canvas.addEventListener('pointerdown', this._boundPointerDown);\n    this.canvas.addEventListener('wheel', this._boundWheel, { passive: false });\n  }\n\n  _getInputEventTarget() {\n    return typeof window !== 'undefined' ? window : null;\n  }\n\n  setChangeListener(listener) {\n    this._changeListener = typeof listener === 'function' ? listener : null;\n  }\n\n  destroy() {\n    const target = this._getInputEventTarget();\n    this.canvas?.removeEventListener?.('wheel', this._boundWheel);\n    this.canvas?.removeEventListener?.('pointerdown', this._boundPointerDown);\n    target?.removeEventListener?.('pointermove', this._boundMove);\n    target?.removeEventListener?.('pointerup', this._boundUp);\n    target?.removeEventListener?.('pointercancel', this._boundCancel);\n    this._changeListener = null;\n  }\n\n  zoom2DAtClientPoint(clientX, clientY, scale) {\n    if (!Number.isFinite(scale) || scale <= 0) return false;\n    const rect = this.canvas?.getBoundingClientRect?.();\n    const newZoom = clamp(this.zoom * scale, this.minZoom, this.maxZoom);\n    if (!Number.isFinite(newZoom) || Math.abs(newZoom - this.zoom) <= 1e-9) {\n      return false;\n    }\n    const vpWidth = Math.max(1, this.viewport.width || 1);\n    const vpHeight = Math.max(1, this.viewport.height || 1);\n    const screenX = rect\n      ? ((clientX - rect.left) / Math.max(1, rect.width)) * vpWidth\n      : vpWidth * 0.5;\n    const screenY = rect\n      ? ((clientY - rect.top) / Math.max(1, rect.height)) * vpHeight\n      : vpHeight * 0.5;\n    const centerX = vpWidth * 0.5;\n    const centerY = vpHeight * 0.5;\n    const worldX = (screenX - centerX - this.pan2D[0]) / this.zoom;\n    const worldY = (centerY - screenY - this.pan2D[1]) / this.zoom;\n    this.zoom = newZoom;\n    // Keep the gesture center pinned to the same world-space position.\n    this.pan2D[0] = screenX - centerX - worldX * this.zoom;\n    this.pan2D[1] = centerY - screenY - worldY * this.zoom;\n    return true;\n  }\n\n  dollyByScale(scale) {\n    if (!Number.isFinite(scale) || scale <= 0) return false;\n    const next = this.distance / scale;\n    const clamped = clamp(Number.isFinite(next) ? next : this.minDistance, this.minDistance, this.maxDistance);\n    if (Math.abs(clamped - this.distance) <= 1e-9) return false;\n    this.distance = clamped;\n    return true;\n  }\n\n  rollBy(rad) {\n    if (!Number.isFinite(rad) || rad === 0) return;\n    this.updateBasis();\n    const delta = quatFromAxisAngle(new Float32Array(4), this.forward, -rad);\n    quatMultiply(this.rotation, delta, this.rotation);\n    quatNormalize(this.rotation, this.rotation);\n    if (!this.ensureFinite(this.rotation)) {\n      quatIdentity(this.rotation);\n    }\n  }\n\n  _syncGestureSnapshot() {\n    this._gestureSnapshot = snapshotTouchGesture(this._activePointers);\n    return this._gestureSnapshot;\n  }\n\n  _resetGestureStart() {\n    this._gestureStartSnapshot = snapshotTouchGesture(this._activePointers);\n    this._gestureDragActive = false;\n  }\n\n  _resolveMoveTolerance(snapshot) {\n    const pointers = snapshot?.pointers ?? [];\n    return pointers.some((pointer) => pointer.pointerType === 'touch')\n      ? this.touchMoveTolerancePx\n      : this.pointerMoveTolerancePx;\n  }\n\n  _updateArcballAnchor() {\n    const snapshot = this._gestureSnapshot ?? this._syncGestureSnapshot();\n    if (snapshot.count === 1) {\n      const pointer = snapshot.pointers[0];\n      this._arcballLast = this.projectToArcball(pointer.clientX, pointer.clientY);\n      return;\n    }\n    this._arcballLast = null;\n  }\n\n  handleWheel(event) {\n    event.preventDefault();\n    if (this.suppressBrowserGestures) event.stopPropagation();\n    if (this.mode === '2d') {\n      const scale = Math.exp(-event.deltaY * 0.001);\n      this.zoom2DAtClientPoint(event.clientX, event.clientY, scale);\n      this._pendingChangeDetail = {\n        origin: 'interaction',\n        type: 'wheel',\n        action: 'zoom',\n        mode: this.mode,\n      };\n    } else {\n      const scale = Math.exp(event.deltaY * 0.001);\n      const next = this.distance * scale;\n      this.distance = clamp(Number.isFinite(next) ? next : this.minDistance, this.minDistance, this.maxDistance);\n      this._pendingChangeDetail = {\n        origin: 'interaction',\n        type: 'wheel',\n        action: 'dolly',\n        mode: this.mode,\n      };\n    }\n    this.logDebug('wheel', {\n      mode: this.mode,\n      zoom: this.zoom,\n      distance: this.distance,\n      pan2D: Array.from(this.pan2D),\n    });\n    this._needsUpdate = true;\n    this.updateMatrices();\n  }\n\n  handlePointerDown(event) {\n    if ((event.pointerType === 'mouse' || event.pointerType === 'pen') && event.button !== 0) return;\n    if (event.pointerType === 'mouse' && this._activePointers.size > 0) return;\n    if (this.suppressBrowserGestures && event.pointerType === 'touch') {\n      event.preventDefault?.();\n      event.stopPropagation?.();\n    }\n    this._activePointers.set(event.pointerId, {\n      pointerId: event.pointerId,\n      pointerType: event.pointerType ?? 'mouse',\n      clientX: event.clientX,\n      clientY: event.clientY,\n      shiftKey: event.shiftKey === true,\n    });\n    this._syncGestureSnapshot();\n    this._resetGestureStart();\n    this._updateArcballAnchor();\n    const target = this._getInputEventTarget();\n    this.canvas?.setPointerCapture?.(event.pointerId);\n    target?.addEventListener?.('pointermove', this._boundMove);\n    target?.addEventListener?.('pointerup', this._boundUp);\n    target?.addEventListener?.('pointercancel', this._boundCancel);\n    this.logDebug('pointerdown', { mode: this.mode, shift: event.shiftKey });\n  }\n\n  handlePointerMove(event) {\n    const previousPointer = this._activePointers.get(event.pointerId);\n    if (!previousPointer) return;\n    if (this.suppressBrowserGestures && event.pointerType === 'touch') {\n      event.preventDefault?.();\n      event.stopPropagation?.();\n    }\n    const previousGesture = this._gestureSnapshot ?? this._syncGestureSnapshot();\n    this._activePointers.set(event.pointerId, {\n      ...previousPointer,\n      clientX: event.clientX,\n      clientY: event.clientY,\n      shiftKey: event.shiftKey === true,\n    });\n    const nextGesture = this._syncGestureSnapshot();\n    let previousForAction = previousGesture;\n    let dx = event.clientX - previousPointer.clientX;\n    let dy = event.clientY - previousPointer.clientY;\n    if (!this._gestureDragActive) {\n      const startGesture = this._gestureStartSnapshot ?? previousGesture;\n      const classification = classifyGestureForSuppression(\n        startGesture.pointers,\n        nextGesture.pointers,\n        this._resolveMoveTolerance(nextGesture),\n      );\n      if (!classification.moved) return;\n      this._gestureDragActive = true;\n      previousForAction = startGesture;\n      const startPointer = startGesture.pointers.find((pointer) => pointer.pointerId === event.pointerId);\n      if (startPointer) {\n        dx = event.clientX - (startPointer.clientX ?? event.clientX);\n        dy = event.clientY - (startPointer.clientY ?? event.clientY);\n      }\n    }\n    const primaryPointer = nextGesture.pointers[0] ?? null;\n    let action = null;\n\n    if (nextGesture.count >= 2) {\n      const centroidDx = nextGesture.centroid.x - previousForAction.centroid.x;\n      const centroidDy = nextGesture.centroid.y - previousForAction.centroid.y;\n      if (this.mode === '2d') {\n        this.pan2D[0] += centroidDx;\n        this.pan2D[1] -= centroidDy;\n        const scale = previousForAction.distance > 0 ? nextGesture.distance / previousForAction.distance : 1;\n        if (this.zoom2DAtClientPoint(nextGesture.centroid.x, nextGesture.centroid.y, scale)) {\n          action = 'pinch-pan';\n        } else {\n          action = 'pan';\n        }\n      } else {\n        this.pan3DBy(centroidDx, centroidDy);\n        const scale = previousForAction.distance > 0 ? nextGesture.distance / previousForAction.distance : 1;\n        const dollyChanged = this.dollyByScale(scale);\n        if (this.touchTwistEnabled && previousForAction.distance > 0) {\n          this.rollBy(nextGesture.angle - previousForAction.angle);\n        }\n        action = dollyChanged ? 'dolly-pan' : 'pan';\n      }\n      this._arcballLast = null;\n    } else if (primaryPointer) {\n      if (this.mode === '2d') {\n        this.pan2D[0] += dx;\n        this.pan2D[1] -= dy;\n        action = 'pan';\n      } else if (primaryPointer.pointerType === 'mouse' && primaryPointer.shiftKey) {\n        this.pan3DBy(dx, dy);\n        action = 'pan';\n      } else {\n        this.arcballRotate(primaryPointer.clientX, primaryPointer.clientY);\n        action = 'rotate';\n      }\n    }\n    if (!action) return;\n    this._pendingChangeDetail = {\n      origin: 'interaction',\n      type: nextGesture.count >= 2 ? 'touch' : 'pointer',\n      action,\n      mode: this.mode,\n      pointerCount: nextGesture.count,\n    };\n    this.logDebug('pointermove', {\n      mode: this.mode,\n      dx,\n      dy,\n      pointerCount: nextGesture.count,\n      pan2D: Array.from(this.pan2D),\n      pan3D: Array.from(this.pan3D),\n      quaternion: Array.from(this.rotation),\n    });\n    this._needsUpdate = true;\n    this.updateMatrices();\n  }\n\n  handlePointerUp(event) {\n    if (!this._activePointers.has(event.pointerId)) return;\n    this._activePointers.delete(event.pointerId);\n    this.canvas?.releasePointerCapture?.(event.pointerId);\n    this._syncGestureSnapshot();\n    this._resetGestureStart();\n    this._updateArcballAnchor();\n    if (this._activePointers.size > 0) return;\n    const target = this._getInputEventTarget();\n    target?.removeEventListener?.('pointermove', this._boundMove);\n    target?.removeEventListener?.('pointerup', this._boundUp);\n    target?.removeEventListener?.('pointercancel', this._boundCancel);\n  }\n\n  rotateBy(dx, dy) {\n    const yawDelta = -dx * 0.003;\n    const pitchDelta = -dy * 0.003;\n\n    // Rotation is stored as a quaternion to avoid gimbal lock.\n    const yawQuat = quatFromAxisAngle(new Float32Array([0, 1, 0]), yawDelta);\n    const rightAxis = vec3TransformQuat(new Float32Array(3), new Float32Array([1, 0, 0]), this.rotation);\n    const pitchQuat = quatFromAxisAngle(rightAxis, pitchDelta);\n    const delta = new Float32Array(4);\n    // Apply yaw then pitch in world space: dq = pitch * yaw\n    quatMultiply(delta, pitchQuat, yawQuat);\n    quatMultiply(this.rotation, delta, this.rotation);\n    quatNormalize(this.rotation, this.rotation);\n    if (!this.ensureFinite(this.rotation)) {\n      quatIdentity(this.rotation);\n    }\n  }\n\n  projectToArcball(clientX, clientY) {\n    if (!this.canvas) return null;\n    const rect = this.canvas.getBoundingClientRect();\n    const x = ((clientX - rect.left) / Math.max(1, rect.width)) * 2 - 1;\n    const y = ((rect.bottom - clientY) / Math.max(1, rect.height)) * 2 - 1;\n    const len2 = x * x + y * y;\n    const z = len2 > 1 ? 0 : Math.sqrt(1 - len2);\n    const v = new Float32Array([x, y, z]);\n    const l = Math.hypot(v[0], v[1], v[2]);\n    if (l > 0) {\n      v[0] /= l;\n      v[1] /= l;\n      v[2] /= l;\n    }\n    return v;\n  }\n\n  arcballRotate(clientX, clientY) {\n    const current = this.projectToArcball(clientX, clientY);\n    if (!current || !this._arcballLast) {\n      this._arcballLast = current;\n      return;\n    }\n    const v0 = this._arcballLast;\n    const v1 = current;\n    const dot = Math.max(-1, Math.min(1, v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2]));\n    const angle = Math.acos(dot);\n    if (angle === 0) {\n      this._arcballLast = current;\n      return;\n    }\n    const axisView = new Float32Array([\n      v0[1] * v1[2] - v0[2] * v1[1],\n      v0[2] * v1[0] - v0[0] * v1[2],\n      v0[0] * v1[1] - v0[1] * v1[0],\n    ]);\n    const axisWorld = vec3TransformQuat(new Float32Array(3), axisView, this.rotation);\n    const axisLen = Math.hypot(axisWorld[0], axisWorld[1], axisWorld[2]);\n    if (!Number.isFinite(axisLen) || axisLen < 1e-6) {\n      this._arcballLast = current;\n      return;\n    }\n    const distanceRatio = this.distance / Math.max(1e-6, this.minDistance);\n    const zoomGain = 1.0*clamp(Math.pow(distanceRatio, 0.6), 1.0, 5.0);\n    const delta = quatFromAxisAngle(new Float32Array(4), axisWorld, -angle * zoomGain);\n    quatMultiply(this.rotation, delta, this.rotation);\n    quatNormalize(this.rotation, this.rotation);\n    if (!this.ensureFinite(this.rotation)) {\n      quatIdentity(this.rotation);\n    }\n    this._arcballLast = current;\n  }\n\n  pan3DBy(dx, dy) {\n    if (!Number.isFinite(this.distance) || this.distance <= 0) {\n      this.distance = this.minDistance;\n    }\n    this.updateBasis();\n    const fovRad = (this.fov * Math.PI) / 180;\n    const height = Math.max(1, this.viewport.height);\n    const worldPerPixel =\n      this.projection === 'orthographic'\n        ? (2 * this.distance) / height\n        : (2 * this.distance * Math.tan(fovRad / 2)) / height;\n\n    vec3ScaleAndAdd(this.pan3D, this.pan3D, this.right, -dx * worldPerPixel);\n    vec3ScaleAndAdd(this.pan3D, this.pan3D, this.up, dy * worldPerPixel);\n  }\n\n  updateBasis() {\n    if (this.mode === '2d') {\n      this.right[0] = 1;\n      this.right[1] = 0;\n      this.right[2] = 0;\n      this.up[0] = 0;\n      this.up[1] = 1;\n      this.up[2] = 0;\n      this.forward[0] = 0;\n      this.forward[1] = 0;\n      this.forward[2] = -1;\n      return;\n    }\n    // Derive basis from quaternion only.\n    vec3TransformQuat(this.forward, new Float32Array([0, 0, -1]), this.rotation);\n    vec3TransformQuat(this.up, new Float32Array([0, 1, 0]), this.rotation);\n    if (!this.ensureFinite(this.forward) || !this.ensureFinite(this.up)) {\n      quatIdentity(this.rotation);\n      vec3TransformQuat(this.forward, new Float32Array([0, 0, -1]), this.rotation);\n      vec3TransformQuat(this.up, new Float32Array([0, 1, 0]), this.rotation);\n    }\n    vec3Normalize(this.forward, this.forward);\n    vec3Normalize(this.up, this.up);\n    vec3Cross(this.right, this.forward, this.up);\n    vec3Normalize(this.right, this.right);\n    vec3Cross(this.up, this.right, this.forward);\n    vec3Normalize(this.up, this.up);\n  }\n\n  updateMatrices() {\n    if (!this._needsUpdate) return;\n    const changeDetail = this._pendingChangeDetail;\n    this._pendingChangeDetail = null;\n    this._needsUpdate = false;\n    if (this.mode === '2d') {\n      this.update2D();\n    } else {\n      this.update3D();\n    }\n    if (!this.ensureFinite(this.viewProjectionMatrix)) {\n      this.resetCameraState();\n      this.updateBasis();\n      this.update3D();\n      this.logDebug('recover', {\n        yaw: this.yaw,\n        pitch: this.pitch,\n        distance: this.distance,\n        pan3D: Array.from(this.pan3D),\n      });\n    }\n    if (this.debugEnabled()) {\n      this._debugFrame += 1;\n      if (!this._firstStateLogged) {\n        this._firstStateLogged = true;\n        this.logDebug('state_initial', {\n          mode: this.mode,\n          distance: this.distance,\n          pan2D: Array.from(this.pan2D),\n          pan3D: Array.from(this.pan3D),\n          position: Array.from(this.position),\n          view: Array.from(this.viewMatrix.slice(0, 16)),\n          projection: Array.from(this.projectionMatrix.slice(0, 16)),\n          quaternion: Array.from(this.rotation),\n        });\n      }\n      if (this._debugFrame % 15 === 0) {\n        this.logDebug('state', {\n          mode: this.mode,\n          distance: this.distance,\n          pan2D: Array.from(this.pan2D),\n          pan3D: Array.from(this.pan3D),\n          position: Array.from(this.position),\n          view: Array.from(this.viewMatrix.slice(0, 16)),\n          projection: Array.from(this.projectionMatrix.slice(0, 16)),\n          quaternion: Array.from(this.rotation),\n        });\n      }\n    }\n    this._changeListener?.(changeDetail ?? null);\n  }\n\n  update2D() {\n    const { width = 1, height = 1 } = this.viewport;\n    mat4Identity(this.viewMatrix);\n    // Build a manual view matrix so translation is not scaled by the zoom factor.\n    this.viewMatrix[0] = this.zoom;\n    this.viewMatrix[5] = this.zoom;\n    this.viewMatrix[10] = 1;\n    this.viewMatrix[12] = this.pan2D[0];\n    this.viewMatrix[13] = this.pan2D[1];\n    this.viewMatrix[15] = 1;\n    // Center origin so world (0,0) maps to the viewport center by default.\n    mat4Ortho(\n      this.projectionMatrix,\n      -width * 0.5,\n      width * 0.5,\n      -height * 0.5,\n      height * 0.5,\n      this.near2D,\n      this.far2D,\n    );\n    mat4Multiply(this.viewProjectionMatrix, this.projectionMatrix, this.viewMatrix);\n    this.position[0] = -this.pan2D[0];\n    this.position[1] = -this.pan2D[1];\n    this.position[2] = 0;\n    this.updateBasis();\n  }\n\n  update3D() {\n    this.updateBasis();\n    const { width = 1, height = 1 } = this.viewport;\n    const aspect = Math.max(0.001, width / Math.max(1, height));\n    if (!this._center) {\n      this._center = createVec3();\n    }\n    const center = this._center;\n    vec3Add(center, this.target, this.pan3D);\n    const safeDistance = Number.isFinite(this.distance) ? this.distance : this.minDistance;\n    this.distance = clamp(safeDistance, this.minDistance, this.maxDistance);\n    // Orbit: position = center + q * (0, 0, radius) * q^-1\n    const offset = vec3TransformQuat(new Float32Array(3), new Float32Array([0, 0, this.distance]), this.rotation);\n    vec3Add(this.position, center, offset);\n    if (Number.isNaN(this.position[0]) || Number.isNaN(this.position[1]) || Number.isNaN(this.position[2])) {\n      this.resetCameraState();\n      vec3Add(center, this.target, this.pan3D);\n      vec3ScaleAndAdd(this.position, center, this.forward, -this.distance);\n    }\n    // Avoid eye == center, which causes lookAt to produce NaNs.\n    if (\n      Math.abs(this.position[0] - center[0]) < 1e-5 &&\n      Math.abs(this.position[1] - center[1]) < 1e-5 &&\n      Math.abs(this.position[2] - center[2]) < 1e-5\n    ) {\n      this.position[2] -= this.distance || 1;\n    }\n    if (this.projection === 'orthographic') {\n      const viewHeight = this.distance;\n      const viewWidth = viewHeight * aspect;\n      mat4Ortho(\n        this.projectionMatrix,\n        -viewWidth,\n        viewWidth,\n        viewHeight,\n        -viewHeight,\n        this.near,\n        this.far,\n      );\n    } else {\n      const fovRad = (this.fov * Math.PI) / 180;\n      mat4Perspective(this.projectionMatrix, fovRad, aspect, this.near, this.far);\n    }\n    mat4LookAt(this.viewMatrix, this.position, center, this.up);\n    if (!this.ensureFinite(this.viewMatrix)) {\n      // If still invalid, fall back to identity to avoid black frame.\n      mat4Identity(this.viewMatrix);\n      mat4Identity(this.projectionMatrix);\n    }\n    mat4Multiply(this.viewProjectionMatrix, this.projectionMatrix, this.viewMatrix);\n  }\n\n  ensureFinite(matrix) {\n    for (let i = 0; i < matrix.length; i += 1) {\n      if (!Number.isFinite(matrix[i])) return false;\n    }\n    return true;\n  }\n\n  resetCameraState() {\n    quatIdentity(this.rotation);\n    this.distance = clamp(this.distance || 800, this.minDistance, this.maxDistance);\n    this.pan3D[0] = 0;\n    this.pan3D[1] = 0;\n    this.pan3D[2] = 0;\n    this.pan2D[0] = 0;\n    this.pan2D[1] = 0;\n    this._activePointers.clear();\n    this._gestureSnapshot = snapshotTouchGesture([]);\n    this._arcballLast = null;\n  }\n\n  getUniforms() {\n    this.updateMatrices();\n    const finite =\n      this.ensureFinite(this.viewProjectionMatrix) &&\n      this.ensureFinite(this.viewMatrix) &&\n      this.ensureFinite(this.projectionMatrix);\n\n    if (!finite) {\n      this.logDebug('invalid_matrices', {\n        mode: this.mode,\n        yaw: this.yaw,\n        pitch: this.pitch,\n        distance: this.distance,\n        position: Array.from(this.position),\n        view: Array.from(this.viewMatrix),\n        projection: Array.from(this.projectionMatrix),\n      });\n      this.resetCameraState();\n      mat4Identity(this.viewMatrix);\n      mat4Identity(this.projectionMatrix);\n      mat4Identity(this.viewProjectionMatrix);\n    }\n\n    return {\n      view: this.viewMatrix,\n      projection: this.projectionMatrix,\n      viewProjection: this.viewProjectionMatrix,\n      position: this.position,\n      right: this.right,\n      up: this.up,\n      mode: this.mode,\n      projectionType: this.projection,\n      viewport: this.viewport,\n    };\n  }\n}\n\nexport default Camera;\n","import { GraphLayerWebGL } from './GraphLayerWebGL.js';\nimport { GraphLayerWebGPU } from './GraphLayerWebGPU.js';\nimport { WebGL2Device } from './WebGL2Device.js';\nimport { WebGPUDevice } from './WebGPUDevice.js';\nimport { Camera } from '../Camera.js';\nimport { getWindowDevicePixelRatio, resolveEffectiveDevicePixelRatio } from '../qualityOptions.js';\n\nfunction isDebugWebGLRenderEnabled() {\n  if (globalThis.__HELIOS_DEBUG_WEBGL_RENDER === true) return true;\n  try {\n    const search = globalThis.location?.search ?? '';\n    return search.includes('debugWebGLRender=1');\n  } catch (_) {\n    return false;\n  }\n}\n\nfunction debugWebGLRender(message, detail) {\n  if (!isDebugWebGLRenderEnabled()) return;\n  console.warn(`[Helios][WebGLRender] ${message}`, detail);\n}\n\n/**\n * High-level orchestrator that owns the underlying graphics device (WebGL2 or\n * WebGPU) and a set of render layers. Layers can be provided by the developer\n * to draw arbitrary accelerated content alongside the default network layer.\n */\nexport class LayeredRenderer {\n  constructor(canvas, options = {}) {\n    const pixelRatio = resolveEffectiveDevicePixelRatio(getWindowDevicePixelRatio(), options);\n    this.canvas = canvas;\n    this.options = options;\n    this.clearColor = options.clearColor ?? [0.01, 0.01, 0.02, 1];\n    this.layers = [];\n    this.device = null;\n    this.size = { width: 1, height: 1, devicePixelRatio: pixelRatio };\n    this.renderTarget = null;\n    this.presentRect = null;\n    this.camera = options.camera ?? new Camera(canvas, { ...options, viewport: this.size, target: null });\n\n    // Default graph drawing layer will be created once a device is chosen.\n    this.graphLayer = null;\n  }\n\n  /**\n   * Chooses the best available device (WebGPU preferred) and initializes all\n   * registered layers.\n   */\n  async initialize() {\n    if (this.device) return;\n    const { forceWebGL, forceWebGPU } = this.options;\n    const webgpuSupported = await WebGPUDevice.isSupported();\n    const shouldTryWebGPU = forceWebGPU || (!forceWebGL && webgpuSupported);\n\n    if (shouldTryWebGPU) {\n      try {\n        this.device = new WebGPUDevice(this.canvas, this.options);\n        await this.device.initialize();\n      } catch (error) {\n        if (forceWebGPU) {\n          throw error;\n        }\n        console.warn('WebGPU initialization failed, falling back to WebGL2', error);\n        this.device = null;\n      }\n    }\n\n    if (!this.device) {\n      this.device = new WebGL2Device(this.canvas, this.options);\n      await this.device.initialize();\n    }\n    this.device.resize(this.size);\n    if (this.camera && this.size) {\n      this.camera.setTarget([0, 0, 0]);\n    }\n    this.ensureGraphLayer();\n    for (const layer of this.layers) {\n      layer.initialize?.(this.device, this.size);\n    }\n  }\n\n  /**\n   * Adds a custom render layer. If the renderer is already initialized, the\n   * layer will be initialized immediately.\n   * @param {object} layer\n   * @param {object} [options]\n   */\n  addLayer(layer, options = {}) {\n    if (options.before) {\n      const index = this.layers.findIndex((entry) => entry === options.before || entry?.name === options.before);\n      if (index >= 0) {\n        this.layers.splice(index, 0, layer);\n      } else {\n        this.layers.push(layer);\n      }\n    } else {\n      this.layers.push(layer);\n    }\n    if (this.device) {\n      layer.initialize?.(this.device, this.size);\n    }\n  }\n\n  removeLayer(layerOrName) {\n    const index = this.layers.findIndex(\n      (entry) => entry === layerOrName || entry?.name === layerOrName || entry?.id === layerOrName,\n    );\n    if (index >= 0) {\n      const [removed] = this.layers.splice(index, 1);\n      removed?.destroy?.();\n    }\n  }\n\n  setRenderTarget(framebuffer) {\n    this.renderTarget = framebuffer;\n  }\n\n  /**\n   * Presents a framebuffer onto the default canvas. When a rect is provided,\n   * the framebuffer is drawn into that viewport without scaling the canvas\n   * size.\n   * @param {import('./types').FramebufferTarget} framebuffer\n   * @param {{ x: number, y: number, width: number, height: number }} [rect]\n   */\n  presentFramebuffer(framebuffer, rect) {\n    this.presentRect = rect ?? null;\n    this.device?.presentFramebuffer(framebuffer, rect);\n  }\n\n  setEdgeRenderingMode(mode) {\n    this.options.edgeRendering = mode;\n    this.graphLayer?.setEdgeRenderingMode?.(mode);\n  }\n\n  setEdgeTransparencyMode(mode) {\n    this.options.transparencyModeEdges = mode;\n    this.graphLayer?.setEdgeTransparencyMode?.(mode);\n  }\n\n  /**\n   * Allocates an off-screen framebuffer that can be used as a render target.\n   * @param {number} width\n   * @param {number} height\n   */\n  createFramebuffer(width, height) {\n    if (!this.device) {\n      throw new Error('Renderer not initialized. Call initialize() first.');\n    }\n    return this.device.createFramebuffer(width, height);\n  }\n\n  /**\n   * Returns a Float32Array in clip space (-1..1) for the supplied world-space\n   * pixel coordinates. Useful for recovering transformed vectors without\n   * re-deriving math inside layers.\n   * @param {[number, number]} vector\n   * @returns {[number, number]}\n   */\n  projectToClip(vector) {\n    const [x, y] = vector;\n    const clipX = (x / this.size.width) * 2 - 1;\n    const clipY = (y / this.size.height) * -2 + 1;\n    return [clipX, clipY];\n  }\n\n  /**\n   * Converts clip-space coordinates back to pixel space.\n   * @param {[number, number]} vector\n   * @returns {[number, number]}\n   */\n  unprojectFromClip(vector) {\n    const [x, y] = vector;\n    const worldX = ((x + 1) * 0.5) * this.size.width;\n    const worldY = ((-y + 1) * 0.5) * this.size.height;\n    return [worldX, worldY];\n  }\n\n  resize(size) {\n    this.size = size;\n    this.camera?.setViewport(size);\n    if (this.camera && size?.width && size?.height) {\n      this.camera.setTarget([0, 0, 0]);\n    }\n    this.device?.resize(size);\n    for (const layer of this.layers) {\n      layer.resize?.(size, this.device);\n    }\n  }\n\n  /**\n   * Captures pixels from a framebuffer. Falls back to the default canvas when\n   * no target is supplied.\n   */\n  async readPixels(framebuffer, rect) {\n    if (!this.device) return null;\n    return this.device.readPixels(framebuffer, rect);\n  }\n\n  /**\n   * Main render entry point. Each layer receives a per-frame context so\n   * additional accelerated content can be drawn.\n   */\n  render(frame) {\n    if (!this.device) return;\n    const renderPayload = frame ? { ...frame, camera: frame.camera ?? this.camera } : { camera: this.camera };\n    debugWebGLRender('renderer:frame:start', {\n      device: this.device?.type ?? null,\n      renderTarget: this.renderTarget ?? null,\n      presentRect: this.presentRect ?? null,\n      size: this.size,\n      layerCount: this.layers.length,\n      networkNodeCount: renderPayload?.network?.nodeCount ?? null,\n      networkEdgeCount: renderPayload?.network?.edgeCount ?? null,\n    });\n    const context = this.device.beginFrame(this.renderTarget, this.clearColor, this.presentRect);\n    for (const layer of this.layers) {\n      debugWebGLRender('renderer:layer:before', {\n        layer: layer?.name ?? layer?.id ?? layer?.constructor?.name ?? 'unknown',\n        contextType: context?.type ?? null,\n      });\n      const layerStart = performance.now();\n      layer.render?.(context, renderPayload, this.size);\n      if (layer && Object.prototype.hasOwnProperty.call(layer, 'lastRenderDurationMs')) {\n        layer.lastRenderDurationMs = performance.now() - layerStart;\n      }\n      debugWebGLRender('renderer:layer:after', {\n        layer: layer?.name ?? layer?.id ?? layer?.constructor?.name ?? 'unknown',\n      });\n    }\n    this.device.endFrame(context);\n    debugWebGLRender('renderer:frame:end', {\n      device: this.device?.type ?? null,\n    });\n    this.presentRect = null;\n  }\n\n  destroy() {\n    for (const layer of this.layers) {\n      layer.destroy?.();\n    }\n    this.device?.destroy?.();\n    this.camera?.destroy?.();\n  }\n\n  ensureGraphLayer() {\n    if (this.graphLayer) return;\n    const options = {\n      edgeRendering: this.options.edgeRendering,\n      transparencyModeEdges: this.options.transparencyModeEdges,\n      nodeOutlineColor: this.options.nodeOutlineColor,\n      edgeEndpointTrim: this.options.edgeEndpointTrim,\n      nodeBlendWithEdges: this.options.nodeBlendWithEdges,\n      edgeDepthWrite: this.options.edgeDepthWrite,\n      edgeFastRendering: this.options.edgeFastRendering,\n      ambientOcclusionEnabled: this.options.ambientOcclusionEnabled,\n      ambientOcclusionNodes: this.options.ambientOcclusionNodes,\n      ambientOcclusionEdges: this.options.ambientOcclusionEdges,\n      ambientOcclusionStrength: this.options.ambientOcclusionStrength,\n      ambientOcclusionRadius: this.options.ambientOcclusionRadius,\n      ambientOcclusionBias: this.options.ambientOcclusionBias,\n      ambientOcclusionMode: this.options.ambientOcclusionMode,\n      ambientOcclusionIntensityScale: this.options.ambientOcclusionIntensityScale,\n      ambientOcclusionIntensityShift: this.options.ambientOcclusionIntensityShift,\n      stateSlots: this.options.stateSlots,\n    };\n    if (this.device?.type === 'webgpu') {\n      this.graphLayer = new GraphLayerWebGPU(options);\n    } else {\n      this.graphLayer = new GraphLayerWebGL(options);\n    }\n    // Keep the graph layer first to match previous ordering.\n    this.layers.unshift(this.graphLayer);\n  }\n}\n\nexport default LayeredRenderer;\n","import { LayeredRenderer } from './engine/LayeredRenderer.js';\n\nexport async function createRenderer(canvas, options = {}) {\n  const renderer = new LayeredRenderer(canvas, options);\n  await renderer.initialize();\n  return renderer;\n}\n","function clamp(value, min, max) {\n  return Math.min(max, Math.max(min, value));\n}\n\nfunction lerp(a, b, t) {\n  return a + ((b - a) * t);\n}\n\nfunction clamp01(value) {\n  return clamp(Number(value) || 0, 0, 1);\n}\n\nfunction smoothstep(t) {\n  const x = clamp01(t);\n  return x * x * (3 - (2 * x));\n}\n\nfunction logLerp(a, b, t) {\n  const av = Number(a);\n  const bv = Number(b);\n  if (!(av > 0) || !(bv > 0)) return lerp(av || 0, bv || 0, t);\n  return Math.exp(lerp(Math.log(av), Math.log(bv), t));\n}\n\nfunction copyVec(source, length, fallback = 0) {\n  const out = new Float32Array(length);\n  for (let i = 0; i < length; i += 1) {\n    const value = source?.[i];\n    out[i] = Number.isFinite(value) ? value : fallback;\n  }\n  return out;\n}\n\nfunction mergeVec(base, next, length, fallback = 0) {\n  const out = new Float32Array(length);\n  for (let i = 0; i < length; i += 1) {\n    const candidate = next?.[i];\n    const fallbackValue = base?.[i];\n    out[i] = Number.isFinite(candidate)\n      ? candidate\n      : Number.isFinite(fallbackValue)\n        ? fallbackValue\n        : fallback;\n  }\n  return out;\n}\n\nfunction quatNormalize(out, q) {\n  const len = Math.hypot(q[0], q[1], q[2], q[3]);\n  if (len > 0) {\n    const inv = 1 / len;\n    out[0] = q[0] * inv;\n    out[1] = q[1] * inv;\n    out[2] = q[2] * inv;\n    out[3] = q[3] * inv;\n    return out;\n  }\n  out[0] = 0;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 1;\n  return out;\n}\n\nfunction quatMultiply(out, a, b) {\n  const ax = a[0];\n  const ay = a[1];\n  const az = a[2];\n  const aw = a[3];\n  const bx = b[0];\n  const by = b[1];\n  const bz = b[2];\n  const bw = b[3];\n  out[0] = aw * bx + ax * bw + ay * bz - az * by;\n  out[1] = aw * by - ax * bz + ay * bw + az * bx;\n  out[2] = aw * bz + ax * by - ay * bx + az * bw;\n  out[3] = aw * bw - ax * bx - ay * by - az * bz;\n  return out;\n}\n\nfunction quatFromAxisAngle(axis, radians) {\n  const out = new Float32Array(4);\n  const ax = Number(axis?.[0]) || 0;\n  const ay = Number(axis?.[1]) || 0;\n  const az = Number(axis?.[2]) || 0;\n  const len = Math.hypot(ax, ay, az);\n  if (len <= 1e-12) {\n    out[3] = 1;\n    return out;\n  }\n  const half = radians * 0.5;\n  const scale = Math.sin(half) / len;\n  out[0] = ax * scale;\n  out[1] = ay * scale;\n  out[2] = az * scale;\n  out[3] = Math.cos(half);\n  return out;\n}\n\nfunction quatSlerp(out, a, b, t) {\n  let bx = b[0];\n  let by = b[1];\n  let bz = b[2];\n  let bw = b[3];\n  let cosOmega = (a[0] * bx) + (a[1] * by) + (a[2] * bz) + (a[3] * bw);\n\n  if (cosOmega < 0) {\n    cosOmega = -cosOmega;\n    bx = -bx;\n    by = -by;\n    bz = -bz;\n    bw = -bw;\n  }\n\n  if (cosOmega > 0.9995) {\n    out[0] = lerp(a[0], bx, t);\n    out[1] = lerp(a[1], by, t);\n    out[2] = lerp(a[2], bz, t);\n    out[3] = lerp(a[3], bw, t);\n    return quatNormalize(out, out);\n  }\n\n  const omega = Math.acos(clamp(cosOmega, -1, 1));\n  const sinOmega = Math.sin(omega);\n  if (Math.abs(sinOmega) < 1e-12) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n  }\n\n  const scale0 = Math.sin((1 - t) * omega) / sinOmega;\n  const scale1 = Math.sin(t * omega) / sinOmega;\n  out[0] = (a[0] * scale0) + (bx * scale1);\n  out[1] = (a[1] * scale0) + (by * scale1);\n  out[2] = (a[2] * scale0) + (bz * scale1);\n  out[3] = (a[3] * scale0) + (bw * scale1);\n  return quatNormalize(out, out);\n}\n\n/**\n * Build a normalized camera rotation quaternion from yaw and pitch angles.\n *\n * @public\n * @apiSection Camera Helpers\n * @param {number} [yawRadians=0] - Horizontal rotation in radians.\n * @param {number} [pitchRadians=0] - Vertical rotation in radians.\n * @returns {Float32Array} Quaternion in `[x, y, z, w]` order.\n * @example\n * const rotation = createYawPitchQuaternion(Math.PI / 4, 0);\n */\nexport function createYawPitchQuaternion(yawRadians = 0, pitchRadians = 0) {\n  const yaw = quatFromAxisAngle([0, 1, 0], yawRadians);\n  const pitch = quatFromAxisAngle([1, 0, 0], pitchRadians);\n  const out = new Float32Array(4);\n  quatMultiply(out, pitch, yaw);\n  return quatNormalize(out, out);\n}\n\n/**\n * Capture a renderer camera into a serializable pose object.\n *\n * @public\n * @apiSection Camera Helpers\n * @param {object} camera - Camera object owned by the active renderer.\n * @returns {object|null} Pose snapshot, or `null` when no camera is supplied.\n * @example\n * const pose = captureCameraPose(helios.renderer.camera);\n */\nexport function captureCameraPose(camera) {\n  if (!camera) return null;\n  const mode = camera.mode === '3d' ? '3d' : '2d';\n  return {\n    mode,\n    projection: mode === '2d' || camera.projection === 'orthographic' ? 'orthographic' : 'perspective',\n    zoom: Number.isFinite(camera.zoom) ? camera.zoom : 1,\n    distance: Number.isFinite(camera.distance) ? camera.distance : 800,\n    fov: Number.isFinite(camera.fov) ? camera.fov : 60,\n    near: Number.isFinite(camera.near) ? camera.near : 0.1,\n    far: Number.isFinite(camera.far) ? camera.far : 100000,\n    near2D: Number.isFinite(camera.near2D) ? camera.near2D : -1,\n    far2D: Number.isFinite(camera.far2D) ? camera.far2D : 1,\n    viewport: camera.viewport ? { ...camera.viewport } : { width: 1, height: 1, devicePixelRatio: 1 },\n    target: copyVec(camera.target, 3, 0),\n    pan2D: copyVec(camera.pan2D, 3, 0),\n    pan3D: copyVec(camera.pan3D, 3, 0),\n    rotation: quatNormalize(new Float32Array(4), copyVec(camera.rotation, 4, 0)),\n  };\n}\n\n/**\n * Merge a partial camera pose into an existing pose.\n *\n * @public\n * @apiSection Camera Helpers\n * @param {object|null} basePose - Existing pose to use as defaults.\n * @param {object} [patch] - Pose fields to replace.\n * @returns {object} Normalized camera pose.\n * @example\n * const next = mergeCameraPose(currentPose, { zoom: 2 });\n */\nexport function mergeCameraPose(basePose, patch = {}) {\n  const base = basePose ?? {\n    mode: '2d',\n    projection: 'orthographic',\n    zoom: 1,\n    distance: 800,\n    fov: 60,\n    near: 0.1,\n    far: 100000,\n    near2D: -1,\n    far2D: 1,\n    viewport: { width: 1, height: 1, devicePixelRatio: 1 },\n    target: new Float32Array([0, 0, 0]),\n    pan2D: new Float32Array([0, 0, 0]),\n    pan3D: new Float32Array([0, 0, 0]),\n    rotation: new Float32Array([0, 0, 0, 1]),\n  };\n  return {\n    ...base,\n    ...patch,\n    mode: patch.mode === '3d' ? '3d' : (base.mode === '3d' ? '3d' : '2d'),\n    projection: patch.projection === 'orthographic'\n      ? 'orthographic'\n      : patch.projection === 'perspective'\n        ? 'perspective'\n        : base.projection,\n    zoom: Number.isFinite(patch.zoom) ? patch.zoom : base.zoom,\n    distance: Number.isFinite(patch.distance) ? patch.distance : base.distance,\n    fov: Number.isFinite(patch.fov) ? patch.fov : base.fov,\n    near: Number.isFinite(patch.near) ? patch.near : base.near,\n    far: Number.isFinite(patch.far) ? patch.far : base.far,\n    near2D: Number.isFinite(patch.near2D) ? patch.near2D : base.near2D,\n    far2D: Number.isFinite(patch.far2D) ? patch.far2D : base.far2D,\n    viewport: patch.viewport ? { ...(base.viewport ?? {}), ...patch.viewport } : { ...(base.viewport ?? {}) },\n    target: mergeVec(base.target, patch.target, 3, 0),\n    pan2D: mergeVec(base.pan2D, patch.pan2D, 3, 0),\n    pan3D: mergeVec(base.pan3D, patch.pan3D, 3, 0),\n    rotation: quatNormalize(new Float32Array(4), mergeVec(base.rotation, patch.rotation, 4, 0)),\n  };\n}\n\n/**\n * Apply a captured or merged pose to a renderer camera.\n *\n * @public\n * @apiSection Camera Helpers\n * @param {object} camera - Renderer camera to update.\n * @param {object} pose - Pose fields to apply.\n * @param {object} [options] - Application options.\n * @param {boolean} [options.update=true] - Run the camera update hook after applying values.\n * @returns {object|null} Updated camera, or `null` when no camera is supplied.\n * @example\n * applyCameraPose(helios.renderer.camera, pose);\n */\nexport function applyCameraPose(camera, pose, { update = true } = {}) {\n  if (!camera || !pose) return camera;\n  const mode = pose.mode === '3d' ? '3d' : '2d';\n  camera.mode = mode;\n  camera.projection = mode === '2d' || pose.projection === 'orthographic' ? 'orthographic' : 'perspective';\n\n  if (Number.isFinite(pose.zoom)) camera.zoom = pose.zoom;\n  if (Number.isFinite(pose.distance)) camera.distance = pose.distance;\n  if (Number.isFinite(pose.fov)) camera.fov = pose.fov;\n  if (Number.isFinite(pose.near)) camera.near = pose.near;\n  if (Number.isFinite(pose.far)) camera.far = pose.far;\n  if (Number.isFinite(pose.near2D)) camera.near2D = pose.near2D;\n  if (Number.isFinite(pose.far2D)) camera.far2D = pose.far2D;\n  if (pose.viewport) camera.viewport = { ...camera.viewport, ...pose.viewport };\n\n  if (ArrayBuffer.isView(camera.target) && pose.target) {\n    camera.target[0] = pose.target[0] ?? camera.target[0];\n    camera.target[1] = pose.target[1] ?? camera.target[1];\n    camera.target[2] = pose.target[2] ?? camera.target[2];\n  }\n  if (ArrayBuffer.isView(camera.pan2D) && pose.pan2D) {\n    camera.pan2D[0] = pose.pan2D[0] ?? camera.pan2D[0];\n    camera.pan2D[1] = pose.pan2D[1] ?? camera.pan2D[1];\n    camera.pan2D[2] = pose.pan2D[2] ?? camera.pan2D[2];\n  }\n  if (ArrayBuffer.isView(camera.pan3D) && pose.pan3D) {\n    camera.pan3D[0] = pose.pan3D[0] ?? camera.pan3D[0];\n    camera.pan3D[1] = pose.pan3D[1] ?? camera.pan3D[1];\n    camera.pan3D[2] = pose.pan3D[2] ?? camera.pan3D[2];\n  }\n  if (ArrayBuffer.isView(camera.rotation) && pose.rotation) {\n    camera.rotation[0] = pose.rotation[0] ?? camera.rotation[0];\n    camera.rotation[1] = pose.rotation[1] ?? camera.rotation[1];\n    camera.rotation[2] = pose.rotation[2] ?? camera.rotation[2];\n    camera.rotation[3] = pose.rotation[3] ?? camera.rotation[3];\n    quatNormalize(camera.rotation, camera.rotation);\n  }\n\n  if ('_needsUpdate' in camera) camera._needsUpdate = true;\n  if (update) camera.updateMatrices?.();\n  return camera;\n}\n\n/**\n * Interpolate between two camera poses.\n *\n * @public\n * @apiSection Camera Helpers\n * @param {object} fromPose - Starting pose.\n * @param {object} toPose - Target pose.\n * @param {number} t - Interpolation progress from `0` to `1`.\n * @returns {object} Interpolated camera pose.\n */\nexport function interpolateCameraPose(fromPose, toPose, t) {\n  const factor = smoothstep(t);\n  const pose = {\n    ...toPose,\n    target: new Float32Array(3),\n    pan2D: new Float32Array(3),\n    pan3D: new Float32Array(3),\n    rotation: new Float32Array(4),\n  };\n\n  for (let i = 0; i < 3; i += 1) {\n    pose.target[i] = lerp(fromPose.target[i], toPose.target[i], factor);\n    pose.pan2D[i] = lerp(fromPose.pan2D[i], toPose.pan2D[i], factor);\n    pose.pan3D[i] = lerp(fromPose.pan3D[i], toPose.pan3D[i], factor);\n  }\n  quatSlerp(pose.rotation, fromPose.rotation, toPose.rotation, factor);\n  pose.distance = logLerp(fromPose.distance, toPose.distance, factor);\n  pose.zoom = logLerp(fromPose.zoom, toPose.zoom, factor);\n  pose.fov = lerp(fromPose.fov, toPose.fov, factor);\n  pose.near = logLerp(fromPose.near, toPose.near, factor);\n  pose.far = logLerp(fromPose.far, toPose.far, factor);\n  pose.near2D = lerp(fromPose.near2D, toPose.near2D, factor);\n  pose.far2D = lerp(fromPose.far2D, toPose.far2D, factor);\n  return pose;\n}\n\n/**\n * Time-based camera transition controller used by Helios camera animations.\n *\n * @public\n * @apiSection Camera Helpers\n * @param {object} options - Controller dependencies.\n * @param {object} options.camera - Renderer camera to animate.\n * @param {Function} [options.requestRender] - Callback used to schedule a render.\n * @param {Function} [options.now] - Clock function returning milliseconds.\n */\nexport class CameraTransitionController {\n  constructor({ requestRender = null } = {}) {\n    this.requestRender = typeof requestRender === 'function' ? requestRender : null;\n    this._rafId = null;\n    this._resolve = null;\n  }\n\n  stop() {\n    if (this._rafId != null && typeof cancelAnimationFrame === 'function') {\n      cancelAnimationFrame(this._rafId);\n    }\n    this._rafId = null;\n    if (this._resolve) {\n      const resolve = this._resolve;\n      this._resolve = null;\n      resolve(false);\n    }\n  }\n\n  transition(camera, { fromPose, toPose, durationMs = 320 } = {}) {\n    this.stop();\n    if (!camera || !fromPose || !toPose) return Promise.resolve(false);\n\n    const duration = Math.max(0, Number(durationMs) || 0);\n    if (typeof requestAnimationFrame !== 'function' || duration <= 0) {\n      applyCameraPose(camera, toPose);\n      this.requestRender?.();\n      return Promise.resolve(true);\n    }\n\n    applyCameraPose(camera, fromPose);\n    this.requestRender?.();\n\n    return new Promise((resolve) => {\n      this._resolve = resolve;\n      const startedAt = performance.now();\n      const step = (timestamp) => {\n        const elapsed = timestamp - startedAt;\n        const t = duration <= 0 ? 1 : clamp01(elapsed / duration);\n        const pose = interpolateCameraPose(fromPose, toPose, t);\n        applyCameraPose(camera, pose);\n        this.requestRender?.();\n        if (t >= 1) {\n          this._rafId = null;\n          const finish = this._resolve;\n          this._resolve = null;\n          finish?.(true);\n          return;\n        }\n        this._rafId = requestAnimationFrame(step);\n      };\n      this._rafId = requestAnimationFrame(step);\n    });\n  }\n}\n\nexport default CameraTransitionController;\n","export class RenderTargetPool {\n  constructor() {\n    this.cache = new Map();\n  }\n\n  get(device, tag, width, height, options = {}) {\n    if (!device || !width || !height) return null;\n    const key = this.#makeKey(device.type, tag, width, height, options);\n    const existing = this.cache.get(key);\n    if (existing) return existing;\n    const created = device.type === 'webgl2'\n      ? this.#createWebGLTarget(device, width, height, options)\n      : this.#createWebGPUTarget(device, width, height, options);\n    this.cache.set(key, created);\n    return created;\n  }\n\n  releaseAll(device) {\n    if (!device) return;\n    for (const target of this.cache.values()) {\n      if (device.type === 'webgl2') {\n        const gl = device.gl;\n        if (target.handle) gl.deleteFramebuffer(target.handle);\n        if (target.texture) gl.deleteTexture(target.texture);\n        if (target.depth) gl.deleteRenderbuffer?.(target.depth);\n      } else if (device.type === 'webgpu') {\n        target.texture?.destroy?.();\n        target.depthTexture?.destroy?.();\n      }\n    }\n    this.cache.clear();\n  }\n\n  #makeKey(type, tag, width, height, options) {\n    const fmt = options.format ?? 'default';\n    const samples = options.samples ?? 1;\n    const depth = options.depth ? 'd1' : 'd0';\n    const filter = options.filter === 'nearest' ? 'n' : 'l';\n    return `${type}|${tag}|${width}x${height}|${fmt}|s${samples}|${depth}|f${filter}`;\n  }\n\n  #createWebGLTarget(device, width, height, options) {\n    const { gl } = device;\n    const framebuffer = gl.createFramebuffer();\n    gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n    const texture = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    const filter = options.filter === 'nearest' ? gl.NEAREST : gl.LINEAR;\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n    gl.drawBuffers?.([gl.COLOR_ATTACHMENT0]);\n    gl.readBuffer?.(gl.COLOR_ATTACHMENT0);\n    let depth = null;\n    if (options.depth) {\n      depth = gl.createRenderbuffer();\n      gl.bindRenderbuffer(gl.RENDERBUFFER, depth);\n      gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height);\n      gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, depth);\n    }\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    gl.bindRenderbuffer(gl.RENDERBUFFER, null);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    return {\n      type: 'webgl2',\n      handle: framebuffer,\n      texture,\n      depth,\n      width,\n      height,\n    };\n  }\n\n\t  #createWebGPUTarget(device, width, height, options) {\n\t    const format = options.format ?? device.format ?? 'rgba8unorm';\n\t    const usage =\n\t      GPUTextureUsage.RENDER_ATTACHMENT\n\t      | GPUTextureUsage.TEXTURE_BINDING\n\t      | GPUTextureUsage.COPY_SRC\n\t      | GPUTextureUsage.COPY_DST;\n\t    const texture = device.device.createTexture({\n\t      size: { width, height },\n\t      format,\n\t      usage,\n      sampleCount: options.samples ?? 1,\n    });\n    const depthTexture = options.depth\n      ? device.device.createTexture({\n          size: { width, height, depthOrArrayLayers: 1 },\n          format: device.depthFormat ?? 'depth24plus',\n          usage: GPUTextureUsage.RENDER_ATTACHMENT,\n          sampleCount: options.samples ?? 1,\n        })\n      : null;\n    return {\n      type: 'webgpu',\n      texture,\n      depthTexture,\n      width,\n      height,\n    };\n  }\n}\n","export function createAttributeWebGLSources(options = {}) {\n  const nodeOptions = options?.node && typeof options.node === 'object' ? options.node : {};\n  const edgeOptions = options?.edge && typeof options.edge === 'object' ? options.edge : {};\n\n  const useNodeSizeAttribute = nodeOptions.size !== 'uniform';\n  const useNodeOutlineAttribute = nodeOptions.outline !== 'uniform';\n  const useNodeEncodedAttribute = nodeOptions.encoded !== 'none';\n  const useEdgeWidthAttribute = edgeOptions.width !== 'uniform';\n  const useEdgeEndpointSizeAttribute = edgeOptions.endpointSize !== 'uniform';\n\n  const NODE_VERTEX_SIZE_DECL = useNodeSizeAttribute\n    ? /* glsl */ 'layout (location = 2) in float a_size;\\n'\n    : /* glsl */ 'uniform float u_nodeSize;\\n';\n  const NODE_VERTEX_SIZE_EXPR = useNodeSizeAttribute ? 'a_size' : 'u_nodeSize';\n\n  const NODE_VERTEX_OUTLINE_DECL = useNodeOutlineAttribute\n    ? /* glsl */ 'layout (location = 4) in float a_outline;\\n'\n    : /* glsl */ 'uniform float u_nodeOutline;\\n';\n  const NODE_VERTEX_OUTLINE_EXPR = useNodeOutlineAttribute ? 'a_outline' : 'u_nodeOutline';\n\n  const EDGE_VERTEX_ENDPOINT_DECL = useEdgeEndpointSizeAttribute\n    ? /* glsl */ 'layout (location = 3) in vec2 a_endpointSize;\\n'\n    : /* glsl */ 'uniform vec2 u_edgeEndpointSize;\\n';\n  const EDGE_VERTEX_ENDPOINT_EXPR = useEdgeEndpointSizeAttribute ? 'a_endpointSize' : 'u_edgeEndpointSize';\n\n  const EDGE_QUAD_WIDTH_DECL = useEdgeWidthAttribute\n    ? /* glsl */ 'layout (location = 3) in vec2 a_width;\\n'\n    : /* glsl */ 'uniform vec2 u_edgeWidth;\\n';\n  const EDGE_QUAD_WIDTH_EXPR = useEdgeWidthAttribute ? 'a_width' : 'u_edgeWidth';\n\n  const EDGE_QUAD_ENDPOINT_DECL = useEdgeEndpointSizeAttribute\n    ? /* glsl */ 'layout (location = 4) in vec2 a_endpointSize;\\n'\n    : /* glsl */ 'uniform vec2 u_edgeEndpointSize;\\n';\n  const EDGE_QUAD_ENDPOINT_EXPR = useEdgeEndpointSizeAttribute ? 'a_endpointSize' : 'u_edgeEndpointSize';\n\n  const NODE_VERTEX_ENCODED_DECL = useNodeEncodedAttribute\n    ? /* glsl */ 'layout (location = 3) in uvec4 a_encoded;\\n'\n    : /* glsl */ '';\n\n  const NODE_VERTEX_ENCODED_VARYING = useNodeEncodedAttribute\n    ? /* glsl */ 'flat out uvec4 v_encoded;\\n'\n    : /* glsl */ '';\n\n  const NODE_VERTEX_ENCODED_ASSIGN = useNodeEncodedAttribute\n    ? /* glsl */ '  v_encoded = a_encoded;\\n'\n    : /* glsl */ '';\n\n  const nodeVertex = /* glsl */ `#version 300 es\nlayout (location = 0) in vec2 a_corner;\nlayout (location = 1) in vec3 a_position;\n${NODE_VERTEX_SIZE_DECL}${NODE_VERTEX_ENCODED_DECL}\n${NODE_VERTEX_OUTLINE_DECL}\n\nuniform mat4 u_viewProjection;\nuniform mat4 u_view;\nuniform vec3 u_cameraPosition;\nuniform vec3 u_cameraUp;\nuniform vec3 u_cameraRight;\nuniform bool u_is2D;\nuniform float u_zoom2D;\nuniform float u_semanticZoomExponent;\nuniform float u_nodeSizeBase;\nuniform float u_nodeSizeScale;\nuniform float u_outlineWidthBase;\nuniform float u_outlineWidthScale;\n\nout vec2 v_local;\nout vec3 v_centerWorld;\nout vec3 v_rightWorld;\nout vec3 v_upWorld;\nout vec3 v_viewDir;\nout float v_radius;\n${NODE_VERTEX_ENCODED_VARYING}\n\nvoid main() {\n  float baseSize = u_nodeSizeBase + u_nodeSizeScale * ${NODE_VERTEX_SIZE_EXPR};\n  float outlineWidth = max(0.0, u_outlineWidthBase + u_outlineWidthScale * ${NODE_VERTEX_OUTLINE_EXPR});\n  float semanticScale = (u_is2D && u_semanticZoomExponent > 0.0)\n    ? (1.0 / pow(max(u_zoom2D, 1e-3), u_semanticZoomExponent))\n    : 1.0;\n  float fullSize = max(0.0, baseSize + outlineWidth) * semanticScale;\n  float radius = fullSize * 0.5;\n  vec3 right = u_cameraRight;\n  vec3 up = u_cameraUp;\n  vec3 viewDir = vec3(0.0, 0.0, 1.0);\n  if (u_is2D) {\n    right = normalize(right);\n    up = normalize(up);\n  } else {\n    viewDir = u_cameraPosition - a_position;\n    float viewLen = length(viewDir);\n    viewDir = viewLen > 1e-5 ? viewDir / viewLen : vec3(0.0, 0.0, 1.0);\n    right = u_cameraRight - viewDir * dot(u_cameraRight, viewDir);\n    float rightLen = length(right);\n    right = rightLen > 1e-5 ? right / rightLen : normalize(cross(u_cameraUp, viewDir));\n    up = normalize(cross(viewDir, right));\n  }\n  vec3 world = a_position + (right * a_corner.x + up * a_corner.y) * radius;\n  gl_Position = u_viewProjection * vec4(world, 1.0);\n  v_local = a_corner;\n  v_centerWorld = a_position;\n  v_rightWorld = right;\n  v_upWorld = up;\n  v_viewDir = viewDir;\n  v_radius = radius;\n${NODE_VERTEX_ENCODED_ASSIGN}\n}`;\n\n  const edgeVertex = /* glsl */ `#version 300 es\nlayout (location = 0) in vec3 a_start;\nlayout (location = 1) in vec3 a_end;\n${EDGE_VERTEX_ENDPOINT_DECL}layout (location = 4) in uvec4 a_encoded;\n\nuniform mat4 u_viewProjection;\nuniform float u_edgeWidthBase;\nuniform float u_edgeWidthScale;\nuniform float u_nodeSizeBase;\nuniform float u_nodeSizeScale;\nuniform float u_edgeEndpointTrim;\nuniform float u_zoom2D;\nuniform float u_semanticZoomExponent;\n\nflat out uvec4 v_encoded;\n\nvoid main() {\n  vec3 dir = a_end - a_start;\n  float dirLen = max(length(dir), 1e-5);\n  vec3 dirN = dir / dirLen;\n  float semanticScale = (u_semanticZoomExponent > 0.0)\n    ? (1.0 / pow(max(u_zoom2D, 1e-3), u_semanticZoomExponent))\n    : 1.0;\n  vec2 endpointSizePair = ${EDGE_VERTEX_ENDPOINT_EXPR};\n  float startRadius = max(u_nodeSizeBase + u_nodeSizeScale * endpointSizePair.x, 0.0) * 0.5 * semanticScale;\n  float endRadius = max(u_nodeSizeBase + u_nodeSizeScale * endpointSizePair.y, 0.0) * 0.5 * semanticScale;\n  float trimStart = startRadius * u_edgeEndpointTrim;\n  float trimEnd = endRadius * u_edgeEndpointTrim;\n  vec3 startPos = a_start + dirN * trimStart;\n  vec3 endPos = a_end - dirN * trimEnd;\n  bool isEnd = (gl_VertexID & 1) == 1;\n  vec3 pos = isEnd ? endPos : startPos;\n  gl_Position = u_viewProjection * vec4(pos, 1.0);\n  v_encoded = a_encoded;\n}`;\n\n  const edgeQuadVertex = /* glsl */ `#version 300 es\nlayout (location = 0) in vec2 a_corner;\nlayout (location = 1) in vec3 a_start;\nlayout (location = 2) in vec3 a_end;\n${EDGE_QUAD_WIDTH_DECL}${EDGE_QUAD_ENDPOINT_DECL}layout (location = 5) in uvec4 a_encoded;\n\nuniform mat4 u_viewProjection;\nuniform vec2 u_viewport;\nuniform float u_edgeWidthBase;\nuniform float u_edgeWidthScale;\nuniform float u_nodeSizeBase;\nuniform float u_nodeSizeScale;\nuniform float u_edgeEndpointTrim;\nuniform float u_zoom2D;\nuniform float u_semanticZoomExponent;\n\nflat out uvec4 v_encoded;\n\nvoid main() {\n  vec3 dir = a_end - a_start;\n  float dirLenWorld = max(length(dir), 1e-5);\n  vec3 dirN = dir / dirLenWorld;\n  float semanticScale = (u_semanticZoomExponent > 0.0)\n    ? (1.0 / pow(max(u_zoom2D, 1e-3), u_semanticZoomExponent))\n    : 1.0;\n  vec2 endpointSizePair = ${EDGE_QUAD_ENDPOINT_EXPR};\n  float startRadius = max(u_nodeSizeBase + u_nodeSizeScale * endpointSizePair.x, 0.0) * 0.5 * semanticScale;\n  float endRadius = max(u_nodeSizeBase + u_nodeSizeScale * endpointSizePair.y, 0.0) * 0.5 * semanticScale;\n  float trimStart = startRadius * u_edgeEndpointTrim;\n  float trimEnd = endRadius * u_edgeEndpointTrim;\n  vec3 startPos = a_start + dirN * trimStart;\n  vec3 endPos = a_end - dirN * trimEnd;\n\n  float segmentMix = clamp(a_corner.x, 0.0, 1.0);\n  vec2 widthPair = ${EDGE_QUAD_WIDTH_EXPR};\n  float width = max(u_edgeWidthBase + u_edgeWidthScale * mix(widthPair.x, widthPair.y, segmentMix), 0.0) * semanticScale;\n  vec4 clipStart = u_viewProjection * vec4(startPos, 1.0);\n  vec4 clipEnd = u_viewProjection * vec4(endPos, 1.0);\n  vec2 ndcStart = clipStart.xy / clipStart.w;\n  vec2 ndcEnd = clipEnd.xy / clipEnd.w;\n  vec2 ndcDir = ndcEnd - ndcStart;\n  float dirLen = max(length(ndcDir), 1e-5);\n  vec2 perp = vec2(-ndcDir.y, ndcDir.x) / dirLen;\n  float halfWidth = max(width, 1e-3) * 0.5;\n  vec2 pixelToNdc = vec2(2.0 / max(u_viewport.x, 1.0), 2.0 / max(u_viewport.y, 1.0));\n  vec2 offsetNdc = perp * halfWidth * pixelToNdc;\n  vec4 clipPos = mix(clipStart, clipEnd, segmentMix);\n  clipPos.xy += offsetNdc * a_corner.y * 1.5;\n  gl_Position = clipPos;\n  v_encoded = a_encoded;\n}`;\n\n  return { nodeVertex, edgeVertex, edgeQuadVertex };\n}\n\nconst DEFAULT_SOURCES = createAttributeWebGLSources();\nexport const NODE_ATTRIBUTE_VERTEX = DEFAULT_SOURCES.nodeVertex;\n\nexport const NODE_ATTRIBUTE_FRAGMENT = /* glsl */ `#version 300 es\nprecision highp float;\n\nin vec2 v_local;\nin vec3 v_centerWorld;\nin vec3 v_rightWorld;\nin vec3 v_upWorld;\nin vec3 v_viewDir;\nin float v_radius;\nflat in uvec4 v_encoded;\n\nuniform mat4 u_viewProjection;\nuniform bool u_is2D;\n\nout vec4 fragColor;\n\nvoid main() {\n  float dist = length(v_local);\n  if (dist > 1.0) {\n    discard;\n  }\n  if (!u_is2D) {\n    float radius = v_radius;\n    float xyLenSq = dot(v_local * radius, v_local * radius);\n    float zOffset = sqrt(max(radius * radius - xyLenSq, 0.0));\n    vec3 worldPos = v_centerWorld\n      + (v_rightWorld * v_local.x + v_upWorld * v_local.y) * radius\n      + normalize(v_viewDir) * zOffset;\n    vec4 clip = u_viewProjection * vec4(worldPos, 1.0);\n    float depth = clip.z / clip.w;\n    gl_FragDepth = depth * 0.5 + 0.5;\n  }\n  fragColor = vec4(vec4(v_encoded) / 255.0);\n}`;\n  export const EDGE_ATTRIBUTE_VERTEX = DEFAULT_SOURCES.edgeVertex;\n\nexport const EDGE_ATTRIBUTE_FRAGMENT = /* glsl */ `#version 300 es\nprecision highp float;\nflat in uvec4 v_encoded;\nout vec4 fragColor;\nvoid main() {\n  fragColor = vec4(vec4(v_encoded) / 255.0);\n}`;\nexport const EDGE_ATTRIBUTE_QUAD_VERTEX = DEFAULT_SOURCES.edgeQuadVertex;\n\nexport const EDGE_ATTRIBUTE_QUAD_FRAGMENT = EDGE_ATTRIBUTE_FRAGMENT;\n","export function createAttributeWebGPUSources(options = {}) {\n  const nodeOptions = options?.node && typeof options.node === 'object' ? options.node : {};\n  const edgeOptions = options?.edge && typeof options.edge === 'object' ? options.edge : {};\n  const encodedOutputMode = options?.encodedOutputMode === 'uint32' ? 'uint32' : 'rgba8';\n  const encodedInputMode = options?.encodedInputMode === 'uint32' ? 'uint32' : 'u8x4';\n  const useUintTarget = encodedOutputMode === 'uint32';\n  const useUintInput = encodedInputMode === 'uint32';\n\n  const useNodeSizeBuffer = nodeOptions.size !== 'uniform';\n  const useNodeOutlineBuffer = nodeOptions.outline !== 'uniform';\n  const useNodeEncodedBuffer = nodeOptions.encoded !== 'none';\n  const nodeIndexEncodedRaw = nodeOptions.indexEncodedRaw === true;\n  const useEdgeWidthBuffer = edgeOptions.width !== 'uniform';\n  const useEdgeEndpointSizeBuffer = edgeOptions.endpointSize !== 'uniform';\n  const edgeIndexEncodedRaw = edgeOptions.indexEncodedRaw === true;\n\n  const NODE_ENCODED_INPUT_DECL = useNodeEncodedBuffer\n    ? (useUintInput ? '@location(3) encoded : u32,' : '@location(3) encoded : vec4<u32>,')\n    : '';\n  const EDGE_ENCODED_INPUT_DECL = useUintInput ? 'u32' : 'vec4<u32>';\n  const NODE_ENCODED_ASSIGN = useNodeEncodedBuffer\n    ? (useUintInput\n      ? `output.encoded = input.encoded${nodeIndexEncodedRaw ? ' + 1u' : ''};`\n      : 'output.encoded = input.encoded;')\n    : '/* no encoded: occlusion pass */';\n  const EDGE_ENCODED_ASSIGN = useUintInput\n    ? `output.encoded = input.encoded${edgeIndexEncodedRaw ? ' + 1u' : ''};`\n    : 'output.encoded = input.encoded;';\n  const NODE_ENCODED_VARYING_DECL = useNodeEncodedBuffer\n    ? (useUintInput\n      ? '@location(6) @interpolate(flat) encoded : u32,'\n      : '@location(6) @interpolate(flat) encoded : vec4<u32>,')\n    : '';\n  const EDGE_ENCODED_VARYING_DECL = useUintInput ? 'u32' : 'vec4<u32>';\n  const NODE_FRAGMENT_COLOR_TYPE = useUintTarget ? 'u32' : 'vec4<f32>';\n  const NODE_FRAGMENT_ENCODED_EXPR = useNodeEncodedBuffer\n    ? (\n      useUintTarget\n        ? (\n          useUintInput\n            ? 'output.color = input.encoded;'\n            : 'output.color = input.encoded.x | (input.encoded.y << 8u) | (input.encoded.z << 16u) | (input.encoded.w << 24u);'\n        )\n        : (\n          useUintInput\n            ? 'output.color = vec4<f32>(f32(input.encoded & 255u), f32((input.encoded >> 8u) & 255u), f32((input.encoded >> 16u) & 255u), f32((input.encoded >> 24u) & 255u)) / vec4<f32>(255.0);'\n            : 'output.color = vec4<f32>(vec4<f32>(input.encoded) / vec4<f32>(255.0));'\n        )\n    )\n    : (useUintTarget ? 'output.color = 0u;' : 'output.color = vec4<f32>(0.0, 0.0, 0.0, 0.0);');\n  const EDGE_FRAGMENT_ENCODED_EXPR = useUintTarget\n    ? (\n      useUintInput\n        ? 'return input.encoded;'\n        : 'return input.encoded.x | (input.encoded.y << 8u) | (input.encoded.z << 16u) | (input.encoded.w << 24u);'\n    )\n    : (\n      useUintInput\n        ? 'return vec4<f32>(f32(input.encoded & 255u), f32((input.encoded >> 8u) & 255u), f32((input.encoded >> 16u) & 255u), f32((input.encoded >> 24u) & 255u)) / vec4<f32>(255.0);'\n        : 'return vec4<f32>(vec4<f32>(input.encoded) / vec4<f32>(255.0));'\n    );\n\n  const NODE_VERTEX_INPUT = `\nstruct VertexInput {\n  @location(0) corner : vec2<f32>,\n  @location(1) position : vec3<f32>,\n  ${useNodeSizeBuffer ? '@location(2) size : f32,' : ''}\n  ${NODE_ENCODED_INPUT_DECL}\n  ${useNodeOutlineBuffer ? '@location(4) outline : f32,' : ''}\n};\n`;\n\n  const NODE_SIZE_RAW_EXPR = useNodeSizeBuffer ? 'input.size' : 'globals.nodeRaw.x';\n  const NODE_OUTLINE_RAW_EXPR = useNodeOutlineBuffer ? 'input.outline' : 'globals.nodeRaw.y';\n\n  const EDGE_VERTEX_INPUT = `\nstruct EdgeVertexInput {\n  @location(0) start : vec3<f32>,\n  @location(1) end : vec3<f32>,\n  ${useEdgeEndpointSizeBuffer ? '@location(3) endpointSize : vec2<f32>,' : ''}\n  @location(4) encoded : ${EDGE_ENCODED_INPUT_DECL},\n};\n`;\n\n  const EDGE_QUAD_VERTEX_INPUT = `\nstruct EdgeQuadVertexInput {\n  @location(0) corner : vec2<f32>,\n  @location(1) start : vec3<f32>,\n  @location(2) end : vec3<f32>,\n  ${useEdgeWidthBuffer ? '@location(3) width : vec2<f32>,' : ''}\n  ${useEdgeEndpointSizeBuffer ? '@location(4) endpointSize : vec2<f32>,' : ''}\n  @location(5) encoded : ${EDGE_ENCODED_INPUT_DECL},\n};\n`;\n\n  const EDGE_WIDTH_PAIR_EXPR = useEdgeWidthBuffer ? 'input.width' : 'globals.edgeWidthRaw';\n  const EDGE_ENDPOINT_SIZE_PAIR_EXPR = useEdgeEndpointSizeBuffer ? 'input.endpointSize' : 'globals.edgeEndpointSizeRaw';\n\n  const NODE_WGSL = /* wgsl */ `\nstruct Camera {\n  viewProjection: mat4x4<f32>,\n  view: mat4x4<f32>,\n  position: vec4<f32>,\n  up: vec4<f32>,\n  right: vec4<f32>,\n  viewport: vec4<f32>,\n};\n\nstruct Globals {\n  nodeOpacity: vec2<f32>,\n  nodeSize: vec2<f32>,\n  nodeOutline: vec2<f32>,\n  edgeOpacity: vec2<f32>,\n  edgeWidth: vec2<f32>,\n  nodeRaw: vec2<f32>, // x=nodeSizeRaw y=nodeOutlineRaw\n  nodeOutlineColor: vec4<f32>,\n  edgeTrim: f32,\n  _pad0: f32,\n  edgeWidthRaw: vec2<f32>,\n  edgeEndpointSizeRaw: vec2<f32>,\n  _pad1: vec2<f32>,\n};\n\nfn semanticZoomScale(camera : Camera, globals : Globals) -> f32 {\n  let is2D = camera.position.w > 0.5;\n  if (!is2D) {\n    return 1.0;\n  }\n  let exponent = globals._pad0;\n  if (exponent <= 0.0 || exponent != exponent) {\n    return 1.0;\n  }\n  let zoom2D = max(abs(camera.view[0][0]), 1e-3);\n  if (exponent == 1.0) {\n    return 1.0 / zoom2D;\n  }\n  return 1.0 / pow(zoom2D, exponent);\n}\n\n${NODE_VERTEX_INPUT}\n\nstruct VertexOutput {\n  @builtin(position) position : vec4<f32>,\n  @location(0) local : vec2<f32>,\n  @location(1) centerWorld : vec3<f32>,\n  @location(2) rightWorld : vec3<f32>,\n  @location(3) upWorld : vec3<f32>,\n  @location(4) viewDir : vec3<f32>,\n  @location(5) radius : f32,\n  ${NODE_ENCODED_VARYING_DECL}\n};\n\n@group(0) @binding(0) var<uniform> camera : Camera;\n@group(0) @binding(1) var<uniform> globals : Globals;\n\n@vertex\nfn nodeVertex(input : VertexInput) -> VertexOutput {\n  let semanticScale = semanticZoomScale(camera, globals);\n  let baseSize = globals.nodeSize.x + globals.nodeSize.y * ${NODE_SIZE_RAW_EXPR};\n  let outlineWidth = max(0.0, globals.nodeOutline.x + globals.nodeOutline.y * ${NODE_OUTLINE_RAW_EXPR});\n  let fullSize = max(0.0, baseSize + outlineWidth) * semanticScale;\n  let radius = fullSize * 0.5;\n  var right = camera.right.xyz;\n  var up = camera.up.xyz;\n  var viewDir = vec3<f32>(0.0, 0.0, 1.0);\n  let is2D = camera.position.w > 0.5;\n  if (is2D) {\n    right = normalize(right);\n    up = normalize(up);\n  } else {\n    viewDir = camera.position.xyz - input.position;\n    let viewLen = length(viewDir);\n    if (viewLen > 1e-5) {\n      viewDir = viewDir / vec3<f32>(viewLen);\n    } else {\n      viewDir = vec3<f32>(0.0, 0.0, 1.0);\n    }\n    right = camera.right.xyz - viewDir * dot(camera.right.xyz, viewDir);\n    let rightLen = length(right);\n    if (rightLen > 1e-5) {\n      right = right / vec3<f32>(rightLen);\n    } else {\n      right = normalize(cross(camera.up.xyz, viewDir));\n    }\n    up = normalize(cross(viewDir, right));\n  }\n  let offset = right * input.corner.x + up * input.corner.y;\n  var output : VertexOutput;\n  output.position = camera.viewProjection * vec4<f32>(input.position + offset * radius, 1.0);\n  output.local = input.corner;\n  output.centerWorld = input.position;\n  output.rightWorld = right;\n  output.upWorld = up;\n  output.viewDir = viewDir;\n  output.radius = radius;\n  ${NODE_ENCODED_ASSIGN}\n  return output;\n}\n\nstruct FragmentOutput {\n  @location(0) color : ${NODE_FRAGMENT_COLOR_TYPE},\n  @builtin(frag_depth) depth : f32,\n};\n\nstruct DepthFragmentOutput {\n  @location(0) color : vec4<f32>,\n  @builtin(frag_depth) depth : f32,\n};\n\nfn packDepthToRGBA(v : f32) -> vec4<f32> {\n  let bitShift = vec4<f32>(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0);\n  let bitMask = vec4<f32>(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);\n  var res = fract(v * bitShift);\n  res = res - res.xxyz * bitMask;\n  return res;\n}\n\n@fragment\nfn nodeFragment(input : VertexOutput) -> FragmentOutput {\n  var output : FragmentOutput;\n  let dist = length(input.local);\n  if (dist > 1.0) {\n    discard;\n  }\n  let is2D = camera.position.w > 0.5;\n  if (!is2D) {\n    let radius = input.radius;\n    let xyLenSq = dot(input.local * radius, input.local * radius);\n    let zOffset = sqrt(max(radius * radius - xyLenSq, 0.0));\n    let worldPos = input.centerWorld\n      + (input.rightWorld * input.local.x + input.upWorld * input.local.y) * radius\n      + normalize(input.viewDir) * zOffset;\n    let clip = camera.viewProjection * vec4<f32>(worldPos, 1.0);\n    let depth = clip.z / clip.w;\n    output.depth = depth * 0.5 + 0.5;\n  } else {\n    output.depth = input.position.z / input.position.w;\n  }\n  ${NODE_FRAGMENT_ENCODED_EXPR}\n  return output;\n}\n\n@fragment\nfn nodeDepthFragment(input : VertexOutput) -> DepthFragmentOutput {\n  var output : DepthFragmentOutput;\n  let dist = length(input.local);\n  if (dist > 1.0) {\n    discard;\n  }\n  let is2D = camera.position.w > 0.5;\n  if (!is2D) {\n    let radius = input.radius;\n    let xyLenSq = dot(input.local * radius, input.local * radius);\n    let zOffset = sqrt(max(radius * radius - xyLenSq, 0.0));\n    let worldPos = input.centerWorld\n      + (input.rightWorld * input.local.x + input.upWorld * input.local.y) * radius\n      + normalize(input.viewDir) * zOffset;\n    let clip = camera.viewProjection * vec4<f32>(worldPos, 1.0);\n    let depth = clip.z / clip.w;\n    output.depth = depth * 0.5 + 0.5;\n  } else {\n    output.depth = input.position.z / input.position.w;\n  }\n  output.color = packDepthToRGBA(output.depth);\n  return output;\n}\n`;\n\n  const EDGE_WGSL = /* wgsl */ `\nstruct Camera {\n  viewProjection: mat4x4<f32>,\n  view: mat4x4<f32>,\n  position: vec4<f32>,\n  up: vec4<f32>,\n  right: vec4<f32>,\n  viewport: vec4<f32>,\n};\n\nstruct Globals {\n  nodeOpacity: vec2<f32>,\n  nodeSize: vec2<f32>,\n  nodeOutline: vec2<f32>,\n  edgeOpacity: vec2<f32>,\n  edgeWidth: vec2<f32>,\n  nodeRaw: vec2<f32>,\n  nodeOutlineColor: vec4<f32>,\n  edgeTrim: f32,\n  _pad0: f32,\n  edgeWidthRaw: vec2<f32>,\n  edgeEndpointSizeRaw: vec2<f32>,\n  _pad1: vec2<f32>,\n};\n\nfn semanticZoomScale(camera : Camera, globals : Globals) -> f32 {\n  let is2D = camera.position.w > 0.5;\n  if (!is2D) {\n    return 1.0;\n  }\n  let exponent = globals._pad0;\n  if (exponent <= 0.0 || exponent != exponent) {\n    return 1.0;\n  }\n  let zoom2D = max(abs(camera.view[0][0]), 1e-3);\n  if (exponent == 1.0) {\n    return 1.0 / zoom2D;\n  }\n  return 1.0 / pow(zoom2D, exponent);\n}\n\n${EDGE_VERTEX_INPUT}\n\n${EDGE_QUAD_VERTEX_INPUT}\n\nfn packDepthToRGBA(v : f32) -> vec4<f32> {\n  let bitShift = vec4<f32>(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0);\n  let bitMask = vec4<f32>(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);\n  var res = fract(v * bitShift);\n  res = res - res.xxyz * bitMask;\n  return res;\n}\n\nstruct EdgeVertexOutput {\n  @builtin(position) position : vec4<f32>,\n  @location(0) @interpolate(flat) encoded : ${EDGE_ENCODED_VARYING_DECL},\n};\n\n@group(0) @binding(0) var<uniform> camera : Camera;\n@group(0) @binding(1) var<uniform> globals : Globals;\n\n@vertex\nfn edgeVertex(input : EdgeVertexInput, @builtin(vertex_index) vertexIndex : u32) -> EdgeVertexOutput {\n  var output : EdgeVertexOutput;\n  let dir = input.end - input.start;\n  let dirLen = max(length(dir), 1e-5);\n  let dirN = dir / vec3<f32>(dirLen);\n  let endpointSizePair = ${EDGE_ENDPOINT_SIZE_PAIR_EXPR};\n  let semanticScale = semanticZoomScale(camera, globals);\n  let startRadius = max(globals.nodeSize.x + globals.nodeSize.y * endpointSizePair.x, 0.0) * 0.5 * semanticScale;\n  let endRadius = max(globals.nodeSize.x + globals.nodeSize.y * endpointSizePair.y, 0.0) * 0.5 * semanticScale;\n  let trimStart = startRadius * globals.edgeTrim;\n  let trimEnd = endRadius * globals.edgeTrim;\n  let startPos = input.start + dirN * trimStart;\n  let endPos = input.end - dirN * trimEnd;\n  let isEnd = (vertexIndex & 1u) == 1u;\n  let pos = select(startPos, endPos, isEnd);\n  output.position = camera.viewProjection * vec4<f32>(pos, 1.0);\n  ${EDGE_ENCODED_ASSIGN}\n  return output;\n}\n\n@vertex\nfn edgeQuadVertex(input : EdgeQuadVertexInput) -> EdgeVertexOutput {\n  var output : EdgeVertexOutput;\n  let dir = input.end - input.start;\n  let dirLenWorld = max(length(dir), 1e-5);\n  let dirN = dir / vec3<f32>(dirLenWorld);\n  let endpointSizePair = ${EDGE_ENDPOINT_SIZE_PAIR_EXPR};\n  let semanticScale = semanticZoomScale(camera, globals);\n  let startRadius = max(globals.nodeSize.x + globals.nodeSize.y * endpointSizePair.x, 0.0) * 0.5 * semanticScale;\n  let endRadius = max(globals.nodeSize.x + globals.nodeSize.y * endpointSizePair.y, 0.0) * 0.5 * semanticScale;\n  let trimStart = startRadius * globals.edgeTrim;\n  let trimEnd = endRadius * globals.edgeTrim;\n  let startPos = input.start + dirN * trimStart;\n  let endPos = input.end - dirN * trimEnd;\n  let segmentMix = clamp(input.corner.x, 0.0, 1.0);\n  let widthPair = ${EDGE_WIDTH_PAIR_EXPR};\n  let width = max(globals.edgeWidth.x + globals.edgeWidth.y * mix(widthPair.x, widthPair.y, segmentMix), 0.0) * semanticScale;\n  let clipStart = camera.viewProjection * vec4<f32>(startPos, 1.0);\n  let clipEnd = camera.viewProjection * vec4<f32>(endPos, 1.0);\n  let ndcStart = clipStart.xy / clipStart.w;\n  let ndcEnd = clipEnd.xy / clipEnd.w;\n  let ndcDir = ndcEnd - ndcStart;\n  let dirLen = max(length(ndcDir), 1e-5);\n  let perp = vec2<f32>(-ndcDir.y, ndcDir.x) / dirLen;\n  let halfWidth = max(width, 1e-3) * 0.5;\n  let pixelToNdc = vec2<f32>(2.0 / max(camera.viewport.x, 1.0), 2.0 / max(camera.viewport.y, 1.0));\n  let offsetNdc = perp * halfWidth * pixelToNdc;\n  var clipPos = mix(clipStart, clipEnd, segmentMix);\n  let offsetXY = offsetNdc * input.corner.y * 1.5;\n  clipPos = vec4<f32>(clipPos.xy + offsetXY, clipPos.z, clipPos.w);\n  output.position = clipPos;\n  ${EDGE_ENCODED_ASSIGN}\n  return output;\n}\n\n@fragment\nfn edgeFragment(input : EdgeVertexOutput) -> @location(0) ${useUintTarget ? 'u32' : 'vec4<f32>'} {\n  ${EDGE_FRAGMENT_ENCODED_EXPR}\n}\n\n@fragment\nfn edgeDepthFragment(input : EdgeVertexOutput) -> @location(0) vec4<f32> {\n  return packDepthToRGBA(input.position.z / input.position.w);\n}\n`;\n\n  return { nodeWGSL: NODE_WGSL, edgeWGSL: EDGE_WGSL };\n}\n\nexport function createAttributeWebGPUTrackSources(options = {}) {\n  const TRACK_STATE_SLOTS = 32;\n  const node = options?.node && typeof options.node === 'object' ? options.node : {};\n  const edge = options?.edge && typeof options.edge === 'object' ? options.edge : {};\n  const encodedOutputMode = options?.encodedOutputMode === 'uint32' ? 'uint32' : 'rgba8';\n  const useUintTarget = encodedOutputMode === 'uint32';\n\n  const nodeUseSizeBuffer = node.size !== 'uniform';\n  const nodeUseOutlineBuffer = node.outline !== 'uniform';\n  const nodeUseStateBuffer = node.stateBuffer === true;\n  const nodeTrackedMode = node.trackedMode === 'int'\n    ? 'int'\n    : (node.trackedMode === 'uint' ? 'uint' : 'index');\n\n  const edgeUseWidthBuffer = edge.width !== 'uniform';\n  const edgeUseEndpointSizeBuffer = edge.endpointSize !== 'uniform';\n  const edgeUseNodeStateBuffer = edge.nodeStateBuffer === true;\n  const edgeUseStateBuffer = edge.stateBuffer === true;\n  const edgeWidthSource = edge.widthSource === 'node' ? 'node' : 'edge';\n  const edgeEndpointSizeSource = edge.endpointSizeSource === 'node' ? 'node' : 'edge';\n  const edgeWidthEndpoints = Number.isFinite(edge.widthEndpointsMode) ? Number(edge.widthEndpointsMode) : 0;\n  const edgeEndpointSizeEndpoints = Number.isFinite(edge.endpointSizeEndpointsMode)\n    ? Number(edge.endpointSizeEndpointsMode)\n    : 0;\n  const edgeTrackedMode = edge.trackedMode === 'int'\n    ? 'int'\n    : (edge.trackedMode === 'uint' ? 'uint' : 'index');\n\n  const NODE_TRACKED_EXPR = nodeTrackedMode === 'int'\n    ? 'bitcast<u32>(nodeTrackedInt.data[nodeId] + 1)'\n    : (nodeTrackedMode === 'uint' ? '(nodeTrackedUint.data[nodeId] + 1u)' : '(nodeId + 1u)');\n  const EDGE_TRACKED_EXPR = edgeTrackedMode === 'int'\n    ? 'bitcast<u32>(edgeTrackedInt.data[edgeId] + 1)'\n    : (edgeTrackedMode === 'uint' ? '(edgeTrackedUint.data[edgeId] + 1u)' : '(edgeId + 1u)');\n\n  const NODE_SIZE_EXPR = nodeUseSizeBuffer ? 'nodeSizes.data[nodeId]' : 'globals.nodeRaw.x';\n  const NODE_OUTLINE_EXPR = nodeUseOutlineBuffer ? 'nodeOutlineWidths.data[nodeId]' : 'globals.nodeRaw.y';\n\n  const EDGE_WIDTH_PAIR_EXPR = !edgeUseWidthBuffer\n    ? 'globals.edgeWidthRaw'\n    : (edgeWidthSource === 'node'\n      ? `selectNodePair(nodeWidthSource.data[sourceId], nodeWidthSource.data[targetId], ${edgeWidthEndpoints}u)`\n      : 'edgeWidths.data[edgeId]');\n  const EDGE_ENDPOINT_SIZE_PAIR_EXPR = !edgeUseEndpointSizeBuffer\n    ? 'globals.edgeEndpointSizeRaw'\n    : (edgeEndpointSizeSource === 'node'\n      ? `selectNodePair(nodeEndpointSizeSource.data[sourceId], nodeEndpointSizeSource.data[targetId], ${edgeEndpointSizeEndpoints}u)`\n      : 'edgeEndpointSizes.data[edgeId]');\n\n  const ENCODE_OUT_FN = useUintTarget\n    ? 'return encoded;'\n    : 'return vec4<f32>(f32(encoded & 255u), f32((encoded >> 8u) & 255u), f32((encoded >> 16u) & 255u), f32((encoded >> 24u) & 255u)) / vec4<f32>(255.0);';\n\n  const NODE_COLOR_TYPE = useUintTarget ? 'u32' : 'vec4<f32>';\n  const EDGE_COLOR_TYPE = NODE_COLOR_TYPE;\n\n  const COMMON = /* wgsl */ `\nstruct Camera {\n  viewProjection: mat4x4<f32>,\n  view: mat4x4<f32>,\n  position: vec4<f32>,\n  up: vec4<f32>,\n  right: vec4<f32>,\n  viewport: vec4<f32>,\n};\n\nstruct Globals {\n  nodeOpacity: vec2<f32>,\n  nodeSize: vec2<f32>,\n  nodeOutline: vec2<f32>,\n  edgeOpacity: vec2<f32>,\n  edgeWidth: vec2<f32>,\n  nodeRaw: vec2<f32>,\n  nodeOutlineColor: vec4<f32>,\n  edgeTrim: f32,\n  _pad0: f32,\n  edgeWidthRaw: vec2<f32>,\n  edgeEndpointSizeRaw: vec2<f32>,\n  _pad1: vec2<f32>,\n};\n\nstruct TrackConfig {\n  hoverNode: vec4<u32>, // x=index y=state z=isVirtual\n  hoverEdge: vec4<u32>, // x=index y=state z=propHovered w=propSelected\n  stateMeta: vec4<u32>, // x=hasNodeStates y=hasEdgeStates z=stateSlotCount w=edgeHoverIsVirtual\n  nodeNoStateScale: vec4<f32>,\n  edgeNoStateScale: vec4<f32>,\n  nodeStateScale: array<vec4<f32>, ${TRACK_STATE_SLOTS}>,\n  edgeStateScale: array<vec4<f32>, ${TRACK_STATE_SLOTS}>,\n};\n\nstruct U32Data { data: array<u32>, };\nstruct I32Data { data: array<i32>, };\nstruct F32Data { data: array<f32>, };\nstruct U32PairData { data: array<vec2<u32>>, };\nstruct F32PairData { data: array<vec2<f32>>, };\n\nfn packDepthToRGBA(v : f32) -> vec4<f32> {\n  let bitShift = vec4<f32>(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0);\n  let bitMask = vec4<f32>(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);\n  var res = fract(v * bitShift);\n  res = res - res.xxyz * bitMask;\n  return res;\n}\n\nfn selectNodePair(sourceValue: f32, targetValue: f32, endpoints: u32) -> vec2<f32> {\n  if (endpoints == 0u) {\n    return vec2<f32>(sourceValue, targetValue);\n  }\n  if (endpoints == 1u) {\n    return vec2<f32>(sourceValue, sourceValue);\n  }\n  return vec2<f32>(targetValue, targetValue);\n}\n\nfn semanticZoomScale(camera : Camera, globals : Globals) -> f32 {\n  let is2D = camera.position.w > 0.5;\n  if (!is2D) {\n    return 1.0;\n  }\n  let exponent = globals._pad0;\n  if (exponent <= 0.0 || exponent != exponent) {\n    return 1.0;\n  }\n  let zoom2D = max(abs(camera.view[0][0]), 1e-3);\n  if (exponent == 1.0) {\n    return 1.0 / zoom2D;\n  }\n  return 1.0 / pow(zoom2D, exponent);\n}\n`;\n\n  const nodeWGSL = /* wgsl */ `\n${COMMON}\n\nstruct NodeVertexInput {\n  @location(0) corner : vec2<f32>,\n  @builtin(instance_index) instance : u32,\n};\n\nstruct NodeVertexOutput {\n  @builtin(position) position : vec4<f32>,\n  @location(0) local : vec2<f32>,\n  @location(1) centerWorld : vec3<f32>,\n  @location(2) rightWorld : vec3<f32>,\n  @location(3) upWorld : vec3<f32>,\n  @location(4) viewDir : vec3<f32>,\n  @location(5) radius : f32,\n  @location(6) @interpolate(flat) encoded : u32,\n};\n\n@group(0) @binding(0) var<uniform> camera : Camera;\n@group(0) @binding(1) var<uniform> globals : Globals;\n@group(0) @binding(2) var<storage, read> nodeIndices : U32Data;\n@group(0) @binding(3) var<storage, read> nodePositions : F32Data;\n${nodeUseSizeBuffer ? '@group(0) @binding(4) var<storage, read> nodeSizes : F32Data;' : ''}\n${nodeUseOutlineBuffer ? '@group(0) @binding(5) var<storage, read> nodeOutlineWidths : F32Data;' : ''}\n${nodeTrackedMode === 'int' ? '@group(0) @binding(6) var<storage, read> nodeTrackedInt : I32Data;' : ''}\n${nodeTrackedMode === 'uint' ? '@group(0) @binding(7) var<storage, read> nodeTrackedUint : U32Data;' : ''}\n${nodeUseStateBuffer ? '@group(0) @binding(8) var<storage, read> nodeStates : U32Data;' : ''}\n@group(0) @binding(9) var<uniform> track : TrackConfig;\n\n@vertex\nfn nodeVertex(input : NodeVertexInput) -> NodeVertexOutput {\n  let nodeId = nodeIndices.data[input.instance];\n  let base = nodeId * 3u;\n  let position = vec3<f32>(\n    nodePositions.data[base + 0u],\n    nodePositions.data[base + 1u],\n    nodePositions.data[base + 2u],\n  );\n  var state = 0u;\n  ${nodeUseStateBuffer ? `\n  if (track.stateMeta.x == 1u) {\n    state = nodeStates.data[nodeId];\n  }` : ''}\n  if (track.hoverNode.z == 0u && track.hoverNode.x != 0xffffffffu && nodeId == track.hoverNode.x) {\n    state = state | track.hoverNode.y;\n  }\n  var sizeMul = 1.0;\n  var outlineMul = 1.0;\n  if (state == 0u) {\n    sizeMul = sizeMul * track.nodeNoStateScale.x;\n    outlineMul = outlineMul * track.nodeNoStateScale.z;\n  } else {\n    for (var i = 0u; i < ${TRACK_STATE_SLOTS}u; i = i + 1u) {\n      if (i >= track.stateMeta.z) {\n        break;\n      }\n      if (((state >> i) & 1u) == 1u) {\n        let scale = track.nodeStateScale[i];\n        sizeMul = sizeMul * scale.x;\n        outlineMul = outlineMul * scale.z;\n      }\n    }\n  }\n  let rawSize = ${NODE_SIZE_EXPR};\n  let rawOutline = ${NODE_OUTLINE_EXPR};\n  let semanticScale = semanticZoomScale(camera, globals);\n  let outlineWidth = max(0.0, (globals.nodeOutline.x + globals.nodeOutline.y * rawOutline) * outlineMul);\n  let fullSize = max(0.0, (globals.nodeSize.x + globals.nodeSize.y * rawSize) * sizeMul + outlineWidth) * semanticScale;\n  let radius = fullSize * 0.5;\n\n  var right = camera.right.xyz;\n  var up = camera.up.xyz;\n  var viewDir = vec3<f32>(0.0, 0.0, 1.0);\n  let is2D = camera.position.w > 0.5;\n  if (is2D) {\n    right = normalize(right);\n    up = normalize(up);\n  } else {\n    viewDir = camera.position.xyz - position;\n    let viewLen = length(viewDir);\n    if (viewLen > 1e-5) {\n      viewDir = viewDir / vec3<f32>(viewLen);\n    } else {\n      viewDir = vec3<f32>(0.0, 0.0, 1.0);\n    }\n    right = camera.right.xyz - viewDir * dot(camera.right.xyz, viewDir);\n    let rightLen = length(right);\n    if (rightLen > 1e-5) {\n      right = right / vec3<f32>(rightLen);\n    } else {\n      right = normalize(cross(camera.up.xyz, viewDir));\n    }\n    up = normalize(cross(viewDir, right));\n  }\n\n  let offset = right * input.corner.x + up * input.corner.y;\n  var output : NodeVertexOutput;\n  output.position = camera.viewProjection * vec4<f32>(position + offset * radius, 1.0);\n  output.local = input.corner;\n  output.centerWorld = position;\n  output.rightWorld = right;\n  output.upWorld = up;\n  output.viewDir = viewDir;\n  output.radius = radius;\n  output.encoded = ${NODE_TRACKED_EXPR};\n  return output;\n}\n\nstruct NodeFragmentOutput {\n  @location(0) color : ${NODE_COLOR_TYPE},\n  @builtin(frag_depth) depth : f32,\n};\n\nstruct NodeDepthFragmentOutput {\n  @location(0) color : vec4<f32>,\n  @builtin(frag_depth) depth : f32,\n};\n\n@fragment\nfn nodeFragment(input : NodeVertexOutput) -> NodeFragmentOutput {\n  var output : NodeFragmentOutput;\n  let dist = length(input.local);\n  if (dist > 1.0) {\n    discard;\n  }\n  let is2D = camera.position.w > 0.5;\n  if (!is2D) {\n    let radius = input.radius;\n    let xyLenSq = dot(input.local * radius, input.local * radius);\n    let zOffset = sqrt(max(radius * radius - xyLenSq, 0.0));\n    let worldPos = input.centerWorld\n      + (input.rightWorld * input.local.x + input.upWorld * input.local.y) * radius\n      + normalize(input.viewDir) * zOffset;\n    let clip = camera.viewProjection * vec4<f32>(worldPos, 1.0);\n    output.depth = clip.z / clip.w * 0.5 + 0.5;\n  } else {\n    output.depth = input.position.z / input.position.w;\n  }\n  let encoded = input.encoded;\n  ${useUintTarget ? 'output.color = encoded;' : 'output.color = vec4<f32>(f32(encoded & 255u), f32((encoded >> 8u) & 255u), f32((encoded >> 16u) & 255u), f32((encoded >> 24u) & 255u)) / vec4<f32>(255.0);'}\n  return output;\n}\n\n@fragment\nfn nodeOcclusionFragment(input : NodeVertexOutput) -> NodeFragmentOutput {\n  var output : NodeFragmentOutput;\n  let dist = length(input.local);\n  if (dist > 1.0) {\n    discard;\n  }\n  let is2D = camera.position.w > 0.5;\n  if (!is2D) {\n    let radius = input.radius;\n    let xyLenSq = dot(input.local * radius, input.local * radius);\n    let zOffset = sqrt(max(radius * radius - xyLenSq, 0.0));\n    let worldPos = input.centerWorld\n      + (input.rightWorld * input.local.x + input.upWorld * input.local.y) * radius\n      + normalize(input.viewDir) * zOffset;\n    let clip = camera.viewProjection * vec4<f32>(worldPos, 1.0);\n    output.depth = clip.z / clip.w * 0.5 + 0.5;\n  } else {\n    output.depth = input.position.z / input.position.w;\n  }\n  ${useUintTarget ? 'output.color = 0u;' : 'output.color = vec4<f32>(0.0, 0.0, 0.0, 0.0);'}\n  return output;\n}\n\n@fragment\nfn nodeDepthFragment(input : NodeVertexOutput) -> NodeDepthFragmentOutput {\n  var output : NodeDepthFragmentOutput;\n  let dist = length(input.local);\n  if (dist > 1.0) {\n    discard;\n  }\n  let is2D = camera.position.w > 0.5;\n  if (!is2D) {\n    let radius = input.radius;\n    let xyLenSq = dot(input.local * radius, input.local * radius);\n    let zOffset = sqrt(max(radius * radius - xyLenSq, 0.0));\n    let worldPos = input.centerWorld\n      + (input.rightWorld * input.local.x + input.upWorld * input.local.y) * radius\n      + normalize(input.viewDir) * zOffset;\n    let clip = camera.viewProjection * vec4<f32>(worldPos, 1.0);\n    output.depth = clip.z / clip.w * 0.5 + 0.5;\n  } else {\n    output.depth = input.position.z / input.position.w;\n  }\n  output.color = packDepthToRGBA(output.depth);\n  return output;\n}\n`;\n\n  const edgeWGSL = /* wgsl */ `\n${COMMON}\n\nstruct EdgeLineVertexOutput {\n  @builtin(position) position : vec4<f32>,\n  @location(0) @interpolate(flat) encoded : u32,\n};\n\nstruct EdgeQuadInput {\n  @location(0) corner : vec2<f32>,\n  @builtin(instance_index) instance : u32,\n};\n\n@group(0) @binding(0) var<uniform> camera : Camera;\n@group(0) @binding(1) var<uniform> globals : Globals;\n@group(0) @binding(2) var<storage, read> edgeIndices : U32Data;\n@group(0) @binding(3) var<storage, read> edgeEndpoints : U32PairData;\n@group(0) @binding(4) var<storage, read> nodePositions : F32Data;\n${edgeUseWidthBuffer && edgeWidthSource === 'edge' ? '@group(0) @binding(5) var<storage, read> edgeWidths : F32PairData;' : ''}\n${edgeUseEndpointSizeBuffer && edgeEndpointSizeSource === 'edge' ? '@group(0) @binding(6) var<storage, read> edgeEndpointSizes : F32PairData;' : ''}\n${edgeUseWidthBuffer && edgeWidthSource === 'node' ? '@group(0) @binding(7) var<storage, read> nodeWidthSource : F32Data;' : ''}\n${edgeUseEndpointSizeBuffer && edgeEndpointSizeSource === 'node' ? '@group(0) @binding(8) var<storage, read> nodeEndpointSizeSource : F32Data;' : ''}\n${edgeTrackedMode === 'int' ? '@group(0) @binding(9) var<storage, read> edgeTrackedInt : I32Data;' : ''}\n${edgeTrackedMode === 'uint' ? '@group(0) @binding(10) var<storage, read> edgeTrackedUint : U32Data;' : ''}\n${edgeUseNodeStateBuffer ? '@group(0) @binding(11) var<storage, read> nodeStates : U32Data;' : ''}\n${edgeUseStateBuffer ? '@group(0) @binding(12) var<storage, read> edgeStates : U32Data;' : ''}\n@group(0) @binding(13) var<uniform> track : TrackConfig;\n\nfn edgeEncoded(edgeId: u32) -> u32 {\n  return ${EDGE_TRACKED_EXPR};\n}\n\nfn loadPos(nodeId: u32) -> vec3<f32> {\n  let base = nodeId * 3u;\n  return vec3<f32>(\n    nodePositions.data[base + 0u],\n    nodePositions.data[base + 1u],\n    nodePositions.data[base + 2u],\n  );\n}\n\nfn edgeWidthPair(edgeId: u32, sourceId: u32, targetId: u32) -> vec2<f32> {\n  return ${EDGE_WIDTH_PAIR_EXPR};\n}\n\nfn edgeEndpointSizePair(edgeId: u32, sourceId: u32, targetId: u32) -> vec2<f32> {\n  return ${EDGE_ENDPOINT_SIZE_PAIR_EXPR};\n}\n\n@vertex\nfn edgeVertex(@builtin(vertex_index) vertexIndex : u32, @builtin(instance_index) instance : u32) -> EdgeLineVertexOutput {\n  let edgeId = edgeIndices.data[instance];\n  let endpoints = edgeEndpoints.data[edgeId];\n  let sourceId = endpoints.x;\n  let targetId = endpoints.y;\n  let sourcePos = loadPos(sourceId);\n  let targetPos = loadPos(targetId);\n  let dirRaw = targetPos - sourcePos;\n  let dirLen = max(length(dirRaw), 1e-5);\n  let dir = dirRaw / vec3<f32>(dirLen);\n  let endpointPair = edgeEndpointSizePair(edgeId, sourceId, targetId);\n  let semanticScale = semanticZoomScale(camera, globals);\n  let startRadius = max(globals.nodeSize.x + globals.nodeSize.y * endpointPair.x, 0.0) * 0.5 * semanticScale;\n  let endRadius = max(globals.nodeSize.x + globals.nodeSize.y * endpointPair.y, 0.0) * 0.5 * semanticScale;\n  let trimStart = startRadius * globals.edgeTrim;\n  let trimEnd = endRadius * globals.edgeTrim;\n  let startPos = sourcePos + dir * trimStart;\n  let endPos = targetPos - dir * trimEnd;\n  let pos = select(startPos, endPos, (vertexIndex & 1u) == 1u);\n  var output : EdgeLineVertexOutput;\n  output.position = camera.viewProjection * vec4<f32>(pos, 1.0);\n  output.encoded = edgeEncoded(edgeId);\n  return output;\n}\n\n@vertex\nfn edgeQuadVertex(input : EdgeQuadInput) -> EdgeLineVertexOutput {\n  let edgeId = edgeIndices.data[input.instance];\n  let endpoints = edgeEndpoints.data[edgeId];\n  let sourceId = endpoints.x;\n  let targetId = endpoints.y;\n  let sourcePos = loadPos(sourceId);\n  let targetPos = loadPos(targetId);\n  let dirRaw = targetPos - sourcePos;\n  let dirLenWorld = max(length(dirRaw), 1e-5);\n  let dir = dirRaw / vec3<f32>(dirLenWorld);\n  var sourceState = 0u;\n  var targetState = 0u;\n  ${edgeUseNodeStateBuffer ? `\n  if (track.stateMeta.x == 1u) {\n    sourceState = nodeStates.data[sourceId];\n    targetState = nodeStates.data[targetId];\n  }` : ''}\n  if (track.hoverNode.z == 0u && track.hoverNode.x != 0xffffffffu) {\n    if (sourceId == track.hoverNode.x) {\n      sourceState = sourceState | track.hoverNode.y;\n    }\n    if (targetId == track.hoverNode.x) {\n      targetState = targetState | track.hoverNode.y;\n    }\n  }\n  let endpointPair = edgeEndpointSizePair(edgeId, sourceId, targetId);\n  let semanticScale = semanticZoomScale(camera, globals);\n  var startSizeMul = 1.0;\n  var endSizeMul = 1.0;\n  if (sourceState == 0u) {\n    startSizeMul = startSizeMul * track.nodeNoStateScale.x;\n  } else {\n    for (var i = 0u; i < ${TRACK_STATE_SLOTS}u; i = i + 1u) {\n      if (i >= track.stateMeta.z) {\n        break;\n      }\n      if (((sourceState >> i) & 1u) == 1u) {\n        startSizeMul = startSizeMul * track.nodeStateScale[i].x;\n      }\n    }\n  }\n  if (targetState == 0u) {\n    endSizeMul = endSizeMul * track.nodeNoStateScale.x;\n  } else {\n    for (var i = 0u; i < ${TRACK_STATE_SLOTS}u; i = i + 1u) {\n      if (i >= track.stateMeta.z) {\n        break;\n      }\n      if (((targetState >> i) & 1u) == 1u) {\n        endSizeMul = endSizeMul * track.nodeStateScale[i].x;\n      }\n    }\n  }\n  let startRadius = max((globals.nodeSize.x + globals.nodeSize.y * endpointPair.x) * startSizeMul, 0.0) * 0.5 * semanticScale;\n  let endRadius = max((globals.nodeSize.x + globals.nodeSize.y * endpointPair.y) * endSizeMul, 0.0) * 0.5 * semanticScale;\n  let trimStart = startRadius * globals.edgeTrim;\n  let trimEnd = endRadius * globals.edgeTrim;\n  let startPos = sourcePos + dir * trimStart;\n  let endPos = targetPos - dir * trimEnd;\n  let segmentMix = clamp(input.corner.x, 0.0, 1.0);\n  let widthPair = edgeWidthPair(edgeId, sourceId, targetId);\n  var state = 0u;\n  ${edgeUseStateBuffer ? `\n  if (track.stateMeta.y == 1u) {\n    state = edgeStates.data[edgeId];\n  }` : ''}\n  if (track.stateMeta.w == 0u && track.hoverEdge.x != 0xffffffffu && edgeId == track.hoverEdge.x) {\n    state = state | track.hoverEdge.y;\n  }\n  if (track.hoverNode.z == 0u && track.hoverEdge.z == 1u && track.hoverNode.x != 0xffffffffu && (sourceId == track.hoverNode.x || targetId == track.hoverNode.x)) {\n    state = state | 4u;\n  }\n  if (track.hoverEdge.w == 1u && ((sourceState | targetState) & 2u) != 0u) {\n    state = state | 2u;\n  }\n  var widthMul = 1.0;\n  if (state == 0u) {\n    widthMul = widthMul * track.edgeNoStateScale.x;\n  } else {\n    for (var i = 0u; i < ${TRACK_STATE_SLOTS}u; i = i + 1u) {\n      if (i >= track.stateMeta.z) {\n        break;\n      }\n      if (((state >> i) & 1u) == 1u) {\n        widthMul = widthMul * track.edgeStateScale[i].x;\n      }\n    }\n  }\n  let width = max((globals.edgeWidth.x + globals.edgeWidth.y * mix(widthPair.x, widthPair.y, segmentMix)) * widthMul, 0.0) * semanticScale;\n  let clipStart = camera.viewProjection * vec4<f32>(startPos, 1.0);\n  let clipEnd = camera.viewProjection * vec4<f32>(endPos, 1.0);\n  let ndcStart = clipStart.xy / clipStart.w;\n  let ndcEnd = clipEnd.xy / clipEnd.w;\n  let ndcDir = ndcEnd - ndcStart;\n  let dirLen = max(length(ndcDir), 1e-5);\n  let perp = vec2<f32>(-ndcDir.y, ndcDir.x) / dirLen;\n  let halfWidth = max(width, 1e-3) * 0.5;\n  let pixelToNdc = vec2<f32>(2.0 / max(camera.viewport.x, 1.0), 2.0 / max(camera.viewport.y, 1.0));\n  let offsetNdc = perp * halfWidth * pixelToNdc;\n  var clipPos = mix(clipStart, clipEnd, segmentMix);\n  clipPos = vec4<f32>(clipPos.xy + offsetNdc * input.corner.y * 1.5, clipPos.z, clipPos.w);\n  var output : EdgeLineVertexOutput;\n  output.position = clipPos;\n  output.encoded = edgeEncoded(edgeId);\n  return output;\n}\n\n@fragment\nfn edgeFragment(input : EdgeLineVertexOutput) -> @location(0) ${EDGE_COLOR_TYPE} {\n  let encoded = input.encoded;\n  ${ENCODE_OUT_FN}\n}\n\n@fragment\nfn edgeDepthFragment(input : EdgeLineVertexOutput) -> @location(0) vec4<f32> {\n  return packDepthToRGBA(input.position.z / input.position.w);\n}\n`;\n\n  return { nodeWGSL, edgeWGSL };\n}\n\nconst DEFAULT_SOURCES = createAttributeWebGPUSources();\nexport const NODE_ATTRIBUTE_WGSL = DEFAULT_SOURCES.nodeWGSL;\nexport const EDGE_ATTRIBUTE_WGSL = DEFAULT_SOURCES.edgeWGSL;\n","import { EDGE_WIDTH_SCALE_MULTIPLIER_GLOBAL } from './engine/GraphLayerCommon.js';\nimport { RenderTargetPool } from './engine/RenderTargetPool.js';\nimport { FrameGraphRunner } from './engine/framegraph/FrameGraphRunner.js';\nimport { bumpCounter } from '../utilities/counters.js';\nimport {\n  createAttributeWebGLSources,\n  NODE_ATTRIBUTE_FRAGMENT,\n  EDGE_ATTRIBUTE_FRAGMENT,\n  EDGE_ATTRIBUTE_QUAD_FRAGMENT,\n} from './engine/shaders/attributeWebGL.js';\nimport {\n  createAttributeWebGPUSources,\n  createAttributeWebGPUTrackSources,\n} from './engine/shaders/attributeWebGPU.js';\nimport { VISUAL_ATTRIBUTE_NAMES } from '../pipeline/constants.js';\nimport { GraphVisualSchema } from './schema/GraphVisualSchema.js';\n\nconst {\n  NODE_SIZE_ATTRIBUTE,\n} = VISUAL_ATTRIBUTE_NAMES;\nconst TRACK_STATE_SLOTS = 32;\nconst WARNING_KEYS_BY_OWNER = new WeakMap();\nlet FALLBACK_VERSION_COUNTER = 1;\n\nfunction warnOnce(owner, key, message, detail = undefined) {\n  if (typeof console === 'undefined' || typeof console.warn !== 'function') return;\n  const target = owner && (typeof owner === 'object' || typeof owner === 'function') ? owner : warnOnce;\n  let keys = WARNING_KEYS_BY_OWNER.get(target);\n  if (!keys) {\n    keys = new Set();\n    WARNING_KEYS_BY_OWNER.set(target, keys);\n  }\n  if (keys.has(key)) return;\n  keys.add(key);\n  if (detail === undefined) console.warn(message);\n  else console.warn(message, detail);\n}\n\nfunction nextFallbackVersion() {\n  FALLBACK_VERSION_COUNTER += 1;\n  return FALLBACK_VERSION_COUNTER;\n}\n\nconst PACK_DEPTH_GLSL = /* glsl */ `\nvec4 packDepthToRGBA(const in float v) {\n  const vec4 bitShift = vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0);\n  const vec4 bitMask = vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);\n  vec4 res = fract(v * bitShift);\n  res -= res.xxyz * bitMask;\n  return res;\n}`;\n\nconst NODE_DEPTH_FRAGMENT = /* glsl */ `#version 300 es\nprecision highp float;\n${PACK_DEPTH_GLSL}\n\nin vec2 v_local;\nin vec3 v_centerWorld;\nin vec3 v_rightWorld;\nin vec3 v_upWorld;\nin vec3 v_viewDir;\nin float v_radius;\n\nuniform mat4 u_viewProjection;\nuniform bool u_is2D;\n\nout vec4 fragColor;\n\nvoid main() {\n  float dist = length(v_local);\n  if (dist > 1.0) {\n    discard;\n  }\n  if (!u_is2D) {\n    float radius = v_radius;\n    float xyLenSq = dot(v_local * radius, v_local * radius);\n    float zOffset = sqrt(max(radius * radius - xyLenSq, 0.0));\n    vec3 worldPos = v_centerWorld\n      + (v_rightWorld * v_local.x + v_upWorld * v_local.y) * radius\n      + normalize(v_viewDir) * zOffset;\n    vec4 clip = u_viewProjection * vec4(worldPos, 1.0);\n    float depth = clip.z / clip.w;\n    gl_FragDepth = depth * 0.5 + 0.5;\n  }\n  fragColor = packDepthToRGBA(gl_FragCoord.z);\n}`;\n\nconst NODE_OCCLUSION_FRAGMENT = /* glsl */ `#version 300 es\nprecision highp float;\n\nin vec2 v_local;\nin vec3 v_centerWorld;\nin vec3 v_rightWorld;\nin vec3 v_upWorld;\nin vec3 v_viewDir;\nin float v_radius;\n\nuniform mat4 u_viewProjection;\nuniform bool u_is2D;\n\nout vec4 fragColor;\n\nvoid main() {\n  float dist = length(v_local);\n  if (dist > 1.0) {\n    discard;\n  }\n  if (!u_is2D) {\n    float radius = v_radius;\n    float xyLenSq = dot(v_local * radius, v_local * radius);\n    float zOffset = sqrt(max(radius * radius - xyLenSq, 0.0));\n    vec3 worldPos = v_centerWorld\n      + (v_rightWorld * v_local.x + v_upWorld * v_local.y) * radius\n      + normalize(v_viewDir) * zOffset;\n    vec4 clip = u_viewProjection * vec4(worldPos, 1.0);\n    float depth = clip.z / clip.w;\n    gl_FragDepth = depth * 0.5 + 0.5;\n  }\n  // Intentionally write zero: nodes are only here to populate depth so they occlude edges.\n  fragColor = vec4(0.0);\n}`;\n\nconst EDGE_DEPTH_FRAGMENT = /* glsl */ `#version 300 es\nprecision highp float;\n${PACK_DEPTH_GLSL}\nout vec4 fragColor;\nvoid main() {\n  fragColor = packDepthToRGBA(gl_FragCoord.z);\n}`;\n\nconst PACK_UINT_GLSL = /* glsl */ `\nuvec4 packUintToRGBA(uint value) {\n  return uvec4(\n    value & 255u,\n    (value >> 8u) & 255u,\n    (value >> 16u) & 255u,\n    (value >> 24u) & 255u\n  );\n}`;\n\nconst INDIRECT_TEXTURE_INDEX_GLSL = /* glsl */ `\nivec2 textureCoord(sampler2D tex, uint index) {\n  ivec2 size = textureSize(tex, 0);\n  int width = max(size.x, 1);\n  int i = int(index);\n  return ivec2(i % width, i / width);\n}\n\nivec2 textureCoord(usampler2D tex, uint index) {\n  ivec2 size = textureSize(tex, 0);\n  int width = max(size.x, 1);\n  int i = int(index);\n  return ivec2(i % width, i / width);\n}\n\nivec2 textureCoord(isampler2D tex, uint index) {\n  ivec2 size = textureSize(tex, 0);\n  int width = max(size.x, 1);\n  int i = int(index);\n  return ivec2(i % width, i / width);\n}`;\n\nconst WEBGL_INDIRECT_TRACK_NODE_VERTEX = /* glsl */ `#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp isampler2D;\nprecision highp usampler2D;\n${PACK_UINT_GLSL}\n${INDIRECT_TEXTURE_INDEX_GLSL}\n\nlayout(location = 0) in vec2 a_corner;\nlayout(location = 1) in uint a_nodeId;\n\nuniform mat4 u_viewProjection;\nuniform sampler2D u_nodePositions;\nuniform sampler2D u_nodeSizes;\nuniform sampler2D u_nodeOutlineWidths;\nuniform usampler2D u_nodeStates;\nuniform usampler2D u_nodeEncoded;\nuniform sampler2D u_nodeTrackedFloat;\nuniform isampler2D u_nodeTrackedInt;\nuniform usampler2D u_nodeTrackedUint;\nuniform vec3 u_cameraPosition;\nuniform vec3 u_cameraUp;\nuniform vec3 u_cameraRight;\nuniform int u_is2D;\nuniform float u_zoom2D;\nuniform float u_semanticZoomExponent;\nuniform int u_useNodeIdBuffer;\nuniform int u_useNodeSize;\nuniform int u_useNodeOutline;\nuniform int u_useEncodedTexture;\nuniform int u_trackedNodeValueMode;\nuniform int u_hasNodeStates;\nuniform uint u_hoverNodeIndex;\nuniform uint u_hoverNodeState;\nuniform uint u_hoverNodeIsVirtual;\nuniform int u_stateSlotCount;\nuniform float u_nodeSizeRaw;\nuniform float u_nodeSizeBase;\nuniform float u_nodeSizeScale;\nuniform float u_nodeOutline;\nuniform float u_outlineWidthBase;\nuniform float u_outlineWidthScale;\nuniform vec4 u_nodeNoStateScale;\nuniform vec4 u_nodeStateScale[${TRACK_STATE_SLOTS}];\n\nout vec4 v_encoded;\nout vec2 v_local;\n\nuvec4 encodeTrackedNode(uint nodeId) {\n  if (u_trackedNodeValueMode == 1) {\n    return texelFetch(u_nodeEncoded, textureCoord(u_nodeEncoded, nodeId), 0);\n  }\n  if (u_trackedNodeValueMode == 2) {\n    float raw = texelFetch(u_nodeTrackedFloat, textureCoord(u_nodeTrackedFloat, nodeId), 0).x;\n    int packed = int(trunc(raw));\n    return packUintToRGBA(uint(packed + 1));\n  }\n  if (u_trackedNodeValueMode == 3) {\n    int raw = texelFetch(u_nodeTrackedInt, textureCoord(u_nodeTrackedInt, nodeId), 0).x;\n    return packUintToRGBA(uint(raw + 1));\n  }\n  if (u_trackedNodeValueMode == 4) {\n    uint raw = texelFetch(u_nodeTrackedUint, textureCoord(u_nodeTrackedUint, nodeId), 0).x;\n    return packUintToRGBA(raw + 1u);\n  }\n  return packUintToRGBA(nodeId + 1u);\n}\n\nvoid main() {\n  uint nodeId = (u_useNodeIdBuffer == 1) ? a_nodeId : uint(gl_InstanceID);\n  vec3 position = texelFetch(u_nodePositions, textureCoord(u_nodePositions, nodeId), 0).xyz;\n  uint state = (u_hasNodeStates == 1) ? texelFetch(u_nodeStates, textureCoord(u_nodeStates, nodeId), 0).x : 0u;\n  if (u_hoverNodeIsVirtual == 0u && u_hoverNodeIndex != 4294967295u && nodeId == u_hoverNodeIndex) {\n    state |= u_hoverNodeState;\n  }\n  float sizeMul = 1.0;\n  float outlineMul = 1.0;\n  if (state == 0u) {\n    sizeMul *= u_nodeNoStateScale.x;\n    outlineMul *= u_nodeNoStateScale.z;\n  } else {\n    for (int i = 0; i < ${TRACK_STATE_SLOTS}; i += 1) {\n      if (i >= u_stateSlotCount) break;\n      float enabled = float((state >> uint(i)) & 1u);\n      vec4 scale = u_nodeStateScale[i];\n      sizeMul *= mix(1.0, scale.x, enabled);\n      outlineMul *= mix(1.0, scale.z, enabled);\n    }\n  }\n  float rawSize = (u_useNodeSize == 1)\n    ? texelFetch(u_nodeSizes, textureCoord(u_nodeSizes, nodeId), 0).x\n    : u_nodeSizeRaw;\n  float rawOutline = (u_useNodeOutline == 1)\n    ? texelFetch(u_nodeOutlineWidths, textureCoord(u_nodeOutlineWidths, nodeId), 0).x\n    : u_nodeOutline;\n  float outlineWidth = max(0.0, (u_outlineWidthBase + u_outlineWidthScale * rawOutline) * outlineMul);\n  float semanticScale = (u_is2D == 1 && u_semanticZoomExponent > 0.0)\n    ? (1.0 / pow(max(u_zoom2D, 1e-3), u_semanticZoomExponent))\n    : 1.0;\n  float fullSize = max(0.0, (u_nodeSizeBase + u_nodeSizeScale * rawSize) * sizeMul + outlineWidth) * semanticScale;\n  float radius = fullSize * 0.5;\n  vec3 right = u_cameraRight;\n  vec3 viewDir = vec3(0.0, 0.0, 1.0);\n  if (u_is2D == 0) {\n    viewDir = u_cameraPosition - position;\n    float viewLen = length(viewDir);\n    viewDir = viewLen > 1e-5 ? viewDir / viewLen : vec3(0.0, 0.0, 1.0);\n    right = u_cameraRight - viewDir * dot(u_cameraRight, viewDir);\n    float rightLen = length(right);\n    right = rightLen > 1e-5 ? right / rightLen : normalize(cross(u_cameraUp, viewDir));\n  } else {\n    right = normalize(right);\n  }\n  vec3 up = u_cameraUp;\n  if (u_is2D == 0) {\n    up = normalize(cross(viewDir, right));\n  } else {\n    up = normalize(up);\n  }\n  vec3 world = position + (right * a_corner.x + up * a_corner.y) * radius;\n  gl_Position = u_viewProjection * vec4(world, 1.0);\n  uvec4 encoded = encodeTrackedNode(nodeId);\n  v_encoded = vec4(encoded) / 255.0;\n  v_local = a_corner;\n}`;\n\nconst WEBGL_INDIRECT_TRACK_NODE_FRAGMENT = /* glsl */ `#version 300 es\nprecision highp float;\n\nin vec4 v_encoded;\nin vec2 v_local;\nout vec4 fragColor;\n\nvoid main() {\n  if (dot(v_local, v_local) > 1.0) discard;\n  fragColor = v_encoded;\n}`;\n\nconst WEBGL_INDIRECT_TRACK_NODE_OCCLUSION_FRAGMENT = /* glsl */ `#version 300 es\nprecision highp float;\n\nin vec2 v_local;\nout vec4 fragColor;\n\nvoid main() {\n  if (dot(v_local, v_local) > 1.0) discard;\n  fragColor = vec4(0.0);\n}`;\n\nconst WEBGL_INDIRECT_TRACK_NODE_DEPTH_FRAGMENT = /* glsl */ `#version 300 es\nprecision highp float;\n${PACK_DEPTH_GLSL}\n\nin vec2 v_local;\nout vec4 fragColor;\n\nvoid main() {\n  if (dot(v_local, v_local) > 1.0) discard;\n  fragColor = packDepthToRGBA(gl_FragCoord.z);\n}`;\n\nconst WEBGL_INDIRECT_TRACK_EDGE_VERTEX = /* glsl */ `#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp isampler2D;\nprecision highp usampler2D;\n${PACK_UINT_GLSL}\n${INDIRECT_TEXTURE_INDEX_GLSL}\n\nlayout(location = 0) in uint a_edgeId;\n\nuniform mat4 u_viewProjection;\nuniform sampler2D u_nodePositions;\nuniform usampler2D u_edgeEndpoints;\nuniform usampler2D u_edgeEncoded;\nuniform sampler2D u_edgeTrackedFloat;\nuniform isampler2D u_edgeTrackedInt;\nuniform usampler2D u_edgeTrackedUint;\nuniform int u_useEdgeIdBuffer;\nuniform int u_useEncodedTexture;\nuniform int u_trackedEdgeValueMode;\n\nout vec4 v_encoded;\n\nuvec4 encodeTrackedEdge(uint edgeId) {\n  if (u_trackedEdgeValueMode == 1) {\n    return texelFetch(u_edgeEncoded, textureCoord(u_edgeEncoded, edgeId), 0);\n  }\n  if (u_trackedEdgeValueMode == 2) {\n    float raw = texelFetch(u_edgeTrackedFloat, textureCoord(u_edgeTrackedFloat, edgeId), 0).x;\n    int packed = int(trunc(raw));\n    return packUintToRGBA(uint(packed + 1));\n  }\n  if (u_trackedEdgeValueMode == 3) {\n    int raw = texelFetch(u_edgeTrackedInt, textureCoord(u_edgeTrackedInt, edgeId), 0).x;\n    return packUintToRGBA(uint(raw + 1));\n  }\n  if (u_trackedEdgeValueMode == 4) {\n    uint raw = texelFetch(u_edgeTrackedUint, textureCoord(u_edgeTrackedUint, edgeId), 0).x;\n    return packUintToRGBA(raw + 1u);\n  }\n  return packUintToRGBA(edgeId + 1u);\n}\n\nvoid main() {\n  uint edgeId = (u_useEdgeIdBuffer == 1) ? a_edgeId : uint(gl_InstanceID);\n  uvec2 endpoints = texelFetch(u_edgeEndpoints, textureCoord(u_edgeEndpoints, edgeId), 0).xy;\n  uint nodeId = ((gl_VertexID & 1) == 0) ? endpoints.x : endpoints.y;\n  vec3 position = texelFetch(u_nodePositions, textureCoord(u_nodePositions, nodeId), 0).xyz;\n  gl_Position = u_viewProjection * vec4(position, 1.0);\n  uvec4 encoded = encodeTrackedEdge(edgeId);\n  v_encoded = vec4(encoded) / 255.0;\n}`;\n\nconst WEBGL_INDIRECT_TRACK_EDGE_QUAD_VERTEX = /* glsl */ `#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp isampler2D;\nprecision highp usampler2D;\n${PACK_UINT_GLSL}\n${INDIRECT_TEXTURE_INDEX_GLSL}\n\nlayout(location = 0) in vec2 a_corner;\nlayout(location = 1) in uint a_edgeId;\n\nuniform mat4 u_viewProjection;\nuniform vec2 u_viewport;\nuniform sampler2D u_nodePositions;\nuniform usampler2D u_edgeEndpoints;\nuniform usampler2D u_edgeEncoded;\nuniform sampler2D u_edgeTrackedFloat;\nuniform isampler2D u_edgeTrackedInt;\nuniform usampler2D u_edgeTrackedUint;\nuniform sampler2D u_edgeWidths;\nuniform sampler2D u_edgeEndpointSizes;\nuniform usampler2D u_edgeStates;\nuniform usampler2D u_nodeStates;\nuniform sampler2D u_nodeWidthSource;\nuniform sampler2D u_nodeEndpointSizeSource;\nuniform int u_useEdgeIdBuffer;\nuniform int u_useEncodedTexture;\nuniform int u_trackedEdgeValueMode;\nuniform int u_edgeWidthSource;\nuniform int u_edgeWidthEndpoints;\nuniform int u_edgeEndpointSizeSource;\nuniform int u_edgeEndpointSizeEndpoints;\nuniform int u_hasEdgeWidths;\nuniform int u_hasEdgeEndpointSizes;\nuniform int u_hasEdgeStates;\nuniform int u_hasNodeStates;\nuniform int u_hasNodeWidthSource;\nuniform int u_hasNodeEndpointSizeSource;\nuniform int u_propagateHoveredNodeToEdges;\nuniform int u_propagateSelectedNodesToEdges;\nuniform int u_stateSlotCount;\nuniform vec2 u_defaultEdgeWidth;\nuniform vec2 u_defaultEdgeEndpointSize;\nuniform vec4 u_nodeNoStateScale;\nuniform vec4 u_nodeStateScale[${TRACK_STATE_SLOTS}];\nuniform vec4 u_edgeNoStateScale;\nuniform vec4 u_edgeStateScale[${TRACK_STATE_SLOTS}];\nuniform float u_edgeWidthBase;\nuniform float u_edgeWidthScale;\nuniform float u_nodeSizeBase;\nuniform float u_nodeSizeScale;\nuniform float u_edgeEndpointTrim;\nuniform uint u_hoverNodeIndex;\nuniform uint u_hoverNodeState;\nuniform uint u_hoverNodeIsVirtual;\nuniform uint u_hoverEdgeIndex;\nuniform uint u_hoverEdgeState;\nuniform uint u_hoverEdgeIsVirtual;\n\nout vec4 v_encoded;\n\nvec3 fetchNodePos(uint id) {\n  return texelFetch(u_nodePositions, textureCoord(u_nodePositions, id), 0).xyz;\n}\n\nfloat fetchNodeScalar(sampler2D sourceTex, uint nodeId, int hasSource, float fallbackValue) {\n  if (hasSource == 0) return fallbackValue;\n  return texelFetch(sourceTex, textureCoord(sourceTex, nodeId), 0).x;\n}\n\nvec2 resolveNodePair(\n  sampler2D sourceTex,\n  uint sourceId,\n  uint targetId,\n  int hasSource,\n  int endpointsMode,\n  vec2 fallbackPair\n) {\n  float sourceValue = fetchNodeScalar(sourceTex, sourceId, hasSource, fallbackPair.x);\n  float targetValue = fetchNodeScalar(sourceTex, targetId, hasSource, fallbackPair.y);\n  if (endpointsMode == 1) return vec2(sourceValue, sourceValue);\n  if (endpointsMode == 2) return vec2(targetValue, targetValue);\n  return vec2(sourceValue, targetValue);\n}\n\nvec2 fetchEdgeWidthPair(uint edgeId, uint sourceId, uint targetId) {\n  if (u_edgeWidthSource == 1) {\n    return resolveNodePair(\n      u_nodeWidthSource,\n      sourceId,\n      targetId,\n      u_hasNodeWidthSource,\n      u_edgeWidthEndpoints,\n      u_defaultEdgeWidth\n    );\n  }\n  if (u_hasEdgeWidths == 0) return u_defaultEdgeWidth;\n  return texelFetch(u_edgeWidths, textureCoord(u_edgeWidths, edgeId), 0).xy;\n}\n\nvec2 fetchEdgeEndpointSizePair(uint edgeId, uint sourceId, uint targetId) {\n  if (u_edgeEndpointSizeSource == 1) {\n    return resolveNodePair(\n      u_nodeEndpointSizeSource,\n      sourceId,\n      targetId,\n      u_hasNodeEndpointSizeSource,\n      u_edgeEndpointSizeEndpoints,\n      u_defaultEdgeEndpointSize\n    );\n  }\n  if (u_hasEdgeEndpointSizes == 0) return u_defaultEdgeEndpointSize;\n  return texelFetch(u_edgeEndpointSizes, textureCoord(u_edgeEndpointSizes, edgeId), 0).xy;\n}\n\nuint fetchNodeState(uint nodeId) {\n  if (u_hasNodeStates == 0) return 0u;\n  return texelFetch(u_nodeStates, textureCoord(u_nodeStates, nodeId), 0).x;\n}\n\nuvec2 fetchEdgeEndpointStatePair(uint sourceId, uint targetId) {\n  return uvec2(fetchNodeState(sourceId), fetchNodeState(targetId));\n}\n\nuint fetchEdgeState(uint edgeId) {\n  if (u_hasEdgeStates == 0) return 0u;\n  return texelFetch(u_edgeStates, textureCoord(u_edgeStates, edgeId), 0).x;\n}\n\nuvec4 encodeTrackedEdge(uint edgeId) {\n  if (u_trackedEdgeValueMode == 1) {\n    return texelFetch(u_edgeEncoded, textureCoord(u_edgeEncoded, edgeId), 0);\n  }\n  if (u_trackedEdgeValueMode == 2) {\n    float raw = texelFetch(u_edgeTrackedFloat, textureCoord(u_edgeTrackedFloat, edgeId), 0).x;\n    int packed = int(trunc(raw));\n    return packUintToRGBA(uint(packed + 1));\n  }\n  if (u_trackedEdgeValueMode == 3) {\n    int raw = texelFetch(u_edgeTrackedInt, textureCoord(u_edgeTrackedInt, edgeId), 0).x;\n    return packUintToRGBA(uint(raw + 1));\n  }\n  if (u_trackedEdgeValueMode == 4) {\n    uint raw = texelFetch(u_edgeTrackedUint, textureCoord(u_edgeTrackedUint, edgeId), 0).x;\n    return packUintToRGBA(raw + 1u);\n  }\n  return packUintToRGBA(edgeId + 1u);\n}\n\nvoid main() {\n  uint edgeId = (u_useEdgeIdBuffer == 1) ? a_edgeId : uint(gl_InstanceID);\n  uvec2 endpoints = texelFetch(u_edgeEndpoints, textureCoord(u_edgeEndpoints, edgeId), 0).xy;\n  uint sourceId = endpoints.x;\n  uint targetId = endpoints.y;\n\n  vec3 sourcePos = fetchNodePos(sourceId);\n  vec3 targetPos = fetchNodePos(targetId);\n  vec3 dir = targetPos - sourcePos;\n  float dirLenWorld = max(length(dir), 1e-5);\n  vec3 dirN = dir / dirLenWorld;\n\n  uvec2 endpointStatePair = fetchEdgeEndpointStatePair(sourceId, targetId);\n  if (u_hoverNodeIsVirtual == 0u && u_hoverNodeIndex != 4294967295u) {\n    if (sourceId == u_hoverNodeIndex) endpointStatePair.x |= u_hoverNodeState;\n    if (targetId == u_hoverNodeIndex) endpointStatePair.y |= u_hoverNodeState;\n  }\n  float startSizeMul = 1.0;\n  float endSizeMul = 1.0;\n  if (endpointStatePair.x == 0u) {\n    startSizeMul *= u_nodeNoStateScale.x;\n  } else {\n    for (int i = 0; i < ${TRACK_STATE_SLOTS}; i += 1) {\n      if (i >= u_stateSlotCount) break;\n      float enabled = float((endpointStatePair.x >> uint(i)) & 1u);\n      startSizeMul *= mix(1.0, u_nodeStateScale[i].x, enabled);\n    }\n  }\n  if (endpointStatePair.y == 0u) {\n    endSizeMul *= u_nodeNoStateScale.x;\n  } else {\n    for (int i = 0; i < ${TRACK_STATE_SLOTS}; i += 1) {\n      if (i >= u_stateSlotCount) break;\n      float enabled = float((endpointStatePair.y >> uint(i)) & 1u);\n      endSizeMul *= mix(1.0, u_nodeStateScale[i].x, enabled);\n    }\n  }\n  vec2 endpointSizePair = fetchEdgeEndpointSizePair(edgeId, sourceId, targetId);\n  float startRadius = max((u_nodeSizeBase + u_nodeSizeScale * endpointSizePair.x) * startSizeMul, 0.0) * 0.5;\n  float endRadius = max((u_nodeSizeBase + u_nodeSizeScale * endpointSizePair.y) * endSizeMul, 0.0) * 0.5;\n  float trimStart = startRadius * u_edgeEndpointTrim;\n  float trimEnd = endRadius * u_edgeEndpointTrim;\n  vec3 startPos = sourcePos + dirN * trimStart;\n  vec3 endPos = targetPos - dirN * trimEnd;\n\n  uint state = fetchEdgeState(edgeId);\n  if (u_hoverEdgeIsVirtual == 0u && u_hoverEdgeIndex != 4294967295u && edgeId == u_hoverEdgeIndex) {\n    state |= u_hoverEdgeState;\n  }\n  if (u_hoverNodeIsVirtual == 0u && u_propagateHoveredNodeToEdges == 1 && u_hoverNodeIndex != 4294967295u && (sourceId == u_hoverNodeIndex || targetId == u_hoverNodeIndex)) {\n    state |= 4u;\n  }\n  if (u_propagateSelectedNodesToEdges == 1 && ((endpointStatePair.x | endpointStatePair.y) & 2u) != 0u) {\n    state |= 2u;\n  }\n  float widthMul = 1.0;\n  if (state == 0u) {\n    widthMul *= u_edgeNoStateScale.x;\n  } else {\n    for (int i = 0; i < ${TRACK_STATE_SLOTS}; i += 1) {\n      if (i >= u_stateSlotCount) break;\n      float enabled = float((state >> uint(i)) & 1u);\n      widthMul *= mix(1.0, u_edgeStateScale[i].x, enabled);\n    }\n  }\n  float segmentMix = clamp(a_corner.x, 0.0, 1.0);\n  vec2 widthPair = fetchEdgeWidthPair(edgeId, sourceId, targetId);\n  float rawWidth = mix(widthPair.x, widthPair.y, segmentMix);\n  float width = max((u_edgeWidthBase + u_edgeWidthScale * rawWidth) * widthMul, 0.0);\n\n  vec4 clipStart = u_viewProjection * vec4(startPos, 1.0);\n  vec4 clipEnd = u_viewProjection * vec4(endPos, 1.0);\n  vec2 ndcStart = clipStart.xy / clipStart.w;\n  vec2 ndcEnd = clipEnd.xy / clipEnd.w;\n  vec2 ndcDir = ndcEnd - ndcStart;\n  float dirLen = max(length(ndcDir), 1e-5);\n  vec2 perp = vec2(-ndcDir.y, ndcDir.x) / dirLen;\n  float halfWidth = max(width, 1e-3) * 0.5;\n  vec2 pixelToNdc = vec2(2.0 / max(u_viewport.x, 1.0), 2.0 / max(u_viewport.y, 1.0));\n  vec2 offsetNdc = perp * halfWidth * pixelToNdc;\n  vec4 clipPos = mix(clipStart, clipEnd, segmentMix);\n  clipPos.xy += offsetNdc * a_corner.y * 1.5;\n  gl_Position = clipPos;\n\n  uvec4 encoded = encodeTrackedEdge(edgeId);\n  v_encoded = vec4(encoded) / 255.0;\n}`;\n\nconst WEBGL_INDIRECT_TRACK_EDGE_FRAGMENT = /* glsl */ `#version 300 es\nprecision highp float;\n\nin vec4 v_encoded;\nout vec4 fragColor;\n\nvoid main() {\n  fragColor = v_encoded;\n}`;\n\nconst WEBGL_INDIRECT_TRACK_EDGE_DEPTH_FRAGMENT = /* glsl */ `#version 300 es\nprecision highp float;\n${PACK_DEPTH_GLSL}\n\nout vec4 fragColor;\n\nvoid main() {\n  fragColor = packDepthToRGBA(gl_FragCoord.z);\n}`;\n\nfunction decodePacked(bytes, offset = 0) {\n  const r = bytes[offset] ?? 0;\n  const g = bytes[offset + 1] ?? 0;\n  const b = bytes[offset + 2] ?? 0;\n  const a = bytes[offset + 3] ?? 0;\n  const value = r + (g << 8) + (b << 16) + (a << 24);\n  return value - 1;\n}\n\nfunction isDebugWebGLPickEnabled() {\n  if (globalThis.__HELIOS_DEBUG_WEBGL_PICK === true) return true;\n  try {\n    const search = globalThis.location?.search ?? '';\n    return search.includes('debugWebGLPick=1');\n  } catch (_) {\n    return false;\n  }\n}\n\nfunction debugWebGLPick(message, detail) {\n  if (!isDebugWebGLPickEnabled()) return;\n  console.warn(`[Helios][WebGLPick] ${message}`, detail);\n}\n\nfunction decodePackedUint32(bytes, offset = 0) {\n  if (!bytes) return -1;\n  if (bytes instanceof Uint32Array) {\n    const raw = bytes[offset] ?? 0;\n    return Number(raw) - 1;\n  }\n  const view = new DataView(bytes.buffer, bytes.byteOffset + offset * (bytes.BYTES_PER_ELEMENT ?? 1), 4);\n  return Number(view.getUint32(0, true)) - 1;\n}\n\nconst ENCODE_FORMAT = 'u8x4';\nconst INDEX_SENTINEL = '$index';\nconst TRACKED_VALUE_MODE = Object.freeze({\n  INDEX: 0,\n  ENCODED_TEXTURE: 1,\n  FLOAT_TEXTURE: 2,\n  INT_TEXTURE: 3,\n  UINT_TEXTURE: 4,\n});\n\nconst TRACKED_SOURCE_MODE = Object.freeze({\n  INDEX: 'index',\n  INT: 'int',\n  UINT: 'uint',\n});\n\nfunction unpackDepthRGBA(bytes, offset = 0) {\n  const inv255 = 1 / 255;\n  const r = (bytes[offset] ?? 0) * inv255;\n  const g = (bytes[offset + 1] ?? 0) * inv255;\n  const b = (bytes[offset + 2] ?? 0) * inv255;\n  const a = (bytes[offset + 3] ?? 0) * inv255;\n  // Inverse of packDepthToRGBA bit packing.\n  return (r * (1 / (256 * 256 * 256))) + (g * (1 / (256 * 256))) + (b * (1 / 256)) + a;\n}\n\nfunction getSparseEncodedName(scope, sourceName) {\n  return `_helios_sparse_encoded_${scope}_${sourceName || 'index'}`;\n}\n\nfunction getSparseEncodedApi(scope) {\n  return scope === 'node'\n    ? {\n      defineFn: 'defineSparseColorEncodedNodeAttribute',\n      updateFn: 'updateSparseColorEncodedNodeAttribute',\n      getFn: 'getSparseColorEncodedNodeAttributeView',\n    }\n    : {\n      defineFn: 'defineSparseColorEncodedEdgeAttribute',\n      updateFn: 'updateSparseColorEncodedEdgeAttribute',\n      getFn: 'getSparseColorEncodedEdgeAttributeView',\n    };\n}\n\nfunction getSparseEncodedDesc(network, scope, attrName) {\n  if (!network || !attrName) return null;\n  const source = attrName === 'index' ? INDEX_SENTINEL : attrName;\n  const encodedName = getSparseEncodedName(scope, source);\n  const api = getSparseEncodedApi(scope);\n  const getter = network?.[api.getFn];\n  if (typeof getter !== 'function') return null;\n  const desc = getter.call(network, encodedName);\n  return desc ?? null;\n}\n\nfunction ensureSparseEncodedReady(network, scope, attrName) {\n  if (!network || !attrName) return;\n  const source = attrName === 'index' ? INDEX_SENTINEL : attrName;\n  const encodedName = getSparseEncodedName(scope, source);\n  const api = getSparseEncodedApi(scope);\n  if (typeof network?.[api.defineFn] === 'function') {\n    network[api.defineFn](source, encodedName, { format: ENCODE_FORMAT });\n  }\n  if (typeof network?.[api.updateFn] === 'function') {\n    network[api.updateFn](encodedName);\n  }\n}\n\nfunction getAttributeVersionSafe(network, scope, attrName, owner = null) {\n  if (!network || !attrName) return null;\n  if (attrName === INDEX_SENTINEL || attrName === 'index' || attrName === '$index') return 0;\n  const getter = scope === 'node' ? network.getNodeAttributeVersion : network.getEdgeAttributeVersion;\n  if (typeof getter !== 'function') return null;\n  try {\n    const value = getter.call(network, attrName);\n    return Number.isFinite(value) ? Number(value) : null;\n  } catch (error) {\n    warnOnce(\n      owner ?? network,\n      `attribute-version:${scope}:${attrName}`,\n      `AttributeTracker: failed to read ${scope} attribute version for \"${attrName}\"; forcing sparse encoded refresh.`,\n      { error },\n    );\n    return nextFallbackVersion();\n  }\n}\n\nfunction ensureSparseEncodedReadyCached(cache, network, scope, attrName, topologyVersion = 0) {\n  if (!network || !attrName) return;\n  const source = attrName === 'index' ? INDEX_SENTINEL : attrName;\n  const slot = scope === 'node' ? 'node' : 'edge';\n  const topo = Number.isFinite(topologyVersion) ? Number(topologyVersion) : 0;\n  const attrVersion = getAttributeVersionSafe(network, scope, source, cache ?? network);\n  const previous = cache?.[slot] ?? null;\n  if (\n    previous\n    && previous.source === source\n    && previous.topologyVersion === topo\n    && (attrVersion == null || previous.attrVersion === attrVersion)\n  ) {\n    const desc = getSparseEncodedDesc(network, scope, attrName);\n    if (desc?.view) return;\n  }\n  ensureSparseEncodedReady(network, scope, attrName);\n  if (cache) {\n    cache[slot] = {\n      source,\n      topologyVersion: topo,\n      attrVersion,\n    };\n  }\n}\n\nfunction isSparseGraphLayer(layer) {\n  return Boolean(\n    layer\n    && typeof layer.withSparseGraph === 'function'\n    && typeof layer.resolveEdgeVariant === 'function',\n  );\n}\n\nfunction safeGetAttributeBuffer(network, scope, name) {\n  if (!network || !name) return null;\n  const getter = scope === 'node' ? network.getNodeAttributeBuffer : network.getEdgeAttributeBuffer;\n  if (typeof getter !== 'function') return null;\n  try {\n    return getter.call(network, name) ?? null;\n  } catch (_) {\n    return null;\n  }\n}\n\nfunction isSupportedTrackedIntegerBuffer(desc) {\n  const view = desc?.view ?? null;\n  if (!view) return false;\n  const dimension = desc?.dimension ?? 1;\n  if (dimension !== 1) return false;\n  return (\n    view instanceof Int8Array\n    || view instanceof Int16Array\n    || view instanceof Int32Array\n    || view instanceof Uint8Array\n    || view instanceof Uint16Array\n    || view instanceof Uint32Array\n  );\n}\n\nfunction resolveTrackedSourceDescriptor(network, scope, attrName) {\n  if (!attrName || attrName === INDEX_SENTINEL || attrName === 'index' || attrName === '$index') {\n    return { mode: TRACKED_SOURCE_MODE.INDEX, view: null, version: 0, count: 0 };\n  }\n  const desc = safeGetAttributeBuffer(network, scope, attrName);\n  if (!isSupportedTrackedIntegerBuffer(desc)) return null;\n  const view = desc.view;\n  return {\n    mode: (view instanceof Int8Array || view instanceof Int16Array || view instanceof Int32Array)\n      ? TRACKED_SOURCE_MODE.INT\n      : TRACKED_SOURCE_MODE.UINT,\n    view,\n    version: desc.version ?? 0,\n    count: view.length ?? 0,\n  };\n}\n\nfunction normalizeNodeSourceEndpoints(value) {\n  if (value === 'source' || value === 'from') return 1;\n  if (value === 'destination' || value === 'target' || value === 'to') return 2;\n  return 0;\n}\n\nfunction toPackedInteger(value) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return null;\n  return Math.trunc(numeric);\n}\n\nfunction writeEncodedValue(bytes, offset, value) {\n  const packedValue = toPackedInteger(value);\n  if (packedValue == null) {\n    bytes[offset] = 0;\n    bytes[offset + 1] = 0;\n    bytes[offset + 2] = 0;\n    bytes[offset + 3] = 0;\n    return;\n  }\n  const encoded = (packedValue + 1) >>> 0;\n  bytes[offset] = encoded & 0xff;\n  bytes[offset + 1] = (encoded >>> 8) & 0xff;\n  bytes[offset + 2] = (encoded >>> 16) & 0xff;\n  bytes[offset + 3] = (encoded >>> 24) & 0xff;\n}\n\nfunction mixVersions(primary, secondary = 0) {\n  const a = Number.isFinite(primary) ? Number(primary) : 0;\n  const b = Number.isFinite(secondary) ? Number(secondary) : 0;\n  return ((a >>> 0) * 1315423911 + (b >>> 0)) >>> 0;\n}\n\nfunction packActiveValues(source, indices, dimension) {\n  if (!source || !indices) return null;\n  const count = indices.length ?? 0;\n  if (!count) return new Float32Array(0);\n  const dim = Math.max(1, Math.floor(dimension || 1));\n  const packed = new Float32Array(count * dim);\n  for (let i = 0; i < count; i += 1) {\n    const sourceIndex = indices[i] ?? 0;\n    const sourceBase = sourceIndex * dim;\n    const targetBase = i * dim;\n    for (let d = 0; d < dim; d += 1) {\n      packed[targetBase + d] = source[sourceBase + d] ?? 0;\n    }\n  }\n  return packed;\n}\n\nfunction isIdentityIndices(indices, count) {\n  if (!indices) return false;\n  const expected = Math.max(0, count ?? 0);\n  const length = indices.length ?? 0;\n  if (length !== expected) return false;\n  for (let i = 0; i < length; i += 1) {\n    if ((indices[i] ?? 0) !== i) return false;\n  }\n  return true;\n}\n\nfunction selectActiveValues(source, indices, dimension) {\n  if (!source || !indices) return { view: null, direct: false };\n  const dim = Math.max(1, Math.floor(dimension || 1));\n  const count = indices.length ?? 0;\n  if (!count) return { view: new Float32Array(0), direct: false };\n  const sourceCount = Math.floor((source.length ?? 0) / dim);\n  if (count === sourceCount && isIdentityIndices(indices, count)) {\n    return { view: source, direct: true };\n  }\n  return { view: packActiveValues(source, indices, dim), direct: false };\n}\n\nfunction packEdgeSegmentsFromSparse(nodePositions, edgeEndpoints, edgeIndices) {\n  if (!nodePositions || !edgeEndpoints || !edgeIndices) return null;\n  const edgeCount = edgeIndices.length ?? 0;\n  if (!edgeCount) return new Float32Array(0);\n  const packed = new Float32Array(edgeCount * 6);\n  for (let i = 0; i < edgeCount; i += 1) {\n    const edgeId = edgeIndices[i] ?? 0;\n    const edgeBase = edgeId * 2;\n    const sourceId = edgeEndpoints[edgeBase] ?? 0;\n    const targetId = edgeEndpoints[edgeBase + 1] ?? 0;\n    const sourceBase = sourceId * 3;\n    const targetBase = targetId * 3;\n    const outBase = i * 6;\n    packed[outBase + 0] = nodePositions[sourceBase + 0] ?? 0;\n    packed[outBase + 1] = nodePositions[sourceBase + 1] ?? 0;\n    packed[outBase + 2] = nodePositions[sourceBase + 2] ?? 0;\n    packed[outBase + 3] = nodePositions[targetBase + 0] ?? 0;\n    packed[outBase + 4] = nodePositions[targetBase + 1] ?? 0;\n    packed[outBase + 5] = nodePositions[targetBase + 2] ?? 0;\n  }\n  return packed;\n}\n\nfunction packNodeSourcedEdgePairs(nodeValues, edgeEndpoints, edgeIndices, endpointsMode) {\n  if (!nodeValues || !edgeEndpoints || !edgeIndices) return null;\n  const edgeCount = edgeIndices.length ?? 0;\n  if (!edgeCount) return new Float32Array(0);\n  const packed = new Float32Array(edgeCount * 2);\n  for (let i = 0; i < edgeCount; i += 1) {\n    const edgeId = edgeIndices[i] ?? 0;\n    const edgeBase = edgeId * 2;\n    const sourceId = edgeEndpoints[edgeBase] ?? 0;\n    const targetId = edgeEndpoints[edgeBase + 1] ?? 0;\n    const sourceValue = nodeValues[sourceId] ?? 0;\n    const targetValue = nodeValues[targetId] ?? 0;\n    const outBase = i * 2;\n    if (endpointsMode === 1) {\n      packed[outBase + 0] = sourceValue;\n      packed[outBase + 1] = sourceValue;\n    } else if (endpointsMode === 2) {\n      packed[outBase + 0] = targetValue;\n      packed[outBase + 1] = targetValue;\n    } else {\n      packed[outBase + 0] = sourceValue;\n      packed[outBase + 1] = targetValue;\n    }\n  }\n  return packed;\n}\n\nfunction encodeActiveValues(attrName, attrView, activeIndices) {\n  if (!attrName || !activeIndices) return null;\n  const count = activeIndices.length ?? 0;\n  if (!count) return new Uint8Array(0);\n  const encoded = new Uint8Array(count * 4);\n  const useIndex = attrName === INDEX_SENTINEL || attrName === 'index' || attrName === '$index';\n  for (let i = 0; i < count; i += 1) {\n    const sourceIndex = activeIndices[i] ?? 0;\n    const sourceValue = useIndex ? sourceIndex : attrView?.[sourceIndex];\n    writeEncodedValue(encoded, i * 4, sourceValue);\n  }\n  return encoded;\n}\n\nfunction encodeActiveValuesUint32(attrName, attrView, activeIndices) {\n  if (!attrName || !activeIndices) return null;\n  const count = activeIndices.length ?? 0;\n  if (!count) return new Uint32Array(0);\n  const encoded = new Uint32Array(count);\n  const useIndex = attrName === INDEX_SENTINEL || attrName === 'index' || attrName === '$index';\n  for (let i = 0; i < count; i += 1) {\n    const sourceIndex = activeIndices[i] ?? 0;\n    const sourceValue = useIndex ? sourceIndex : attrView?.[sourceIndex];\n    const packedValue = toPackedInteger(sourceValue);\n    encoded[i] = packedValue == null ? 0 : ((packedValue + 1) >>> 0);\n  }\n  return encoded;\n}\n\nfunction packActiveEncodedValues(encodedDesc, activeIndices) {\n  if (!encodedDesc || !activeIndices) return null;\n  const count = activeIndices.length ?? 0;\n  if (!count) return new Uint8Array(0);\n  const source = encodedDesc?.view ?? encodedDesc;\n  if (!source || typeof source.length !== 'number') return null;\n  const packed = new Uint8Array(count * 4);\n\n  if (source.BYTES_PER_ELEMENT === 1) {\n    for (let i = 0; i < count; i += 1) {\n      const sourceIndex = activeIndices[i] ?? 0;\n      const sourceBase = sourceIndex * 4;\n      const outBase = i * 4;\n      packed[outBase + 0] = source[sourceBase + 0] ?? 0;\n      packed[outBase + 1] = source[sourceBase + 1] ?? 0;\n      packed[outBase + 2] = source[sourceBase + 2] ?? 0;\n      packed[outBase + 3] = source[sourceBase + 3] ?? 0;\n    }\n    return packed;\n  }\n\n  if (source.BYTES_PER_ELEMENT === 4) {\n    for (let i = 0; i < count; i += 1) {\n      const sourceIndex = activeIndices[i] ?? 0;\n      const value = source[sourceIndex] ?? 0;\n      packed[i * 4 + 0] = value & 0xff;\n      packed[i * 4 + 1] = (value >>> 8) & 0xff;\n      packed[i * 4 + 2] = (value >>> 16) & 0xff;\n      packed[i * 4 + 3] = (value >>> 24) & 0xff;\n    }\n    return packed;\n  }\n\n  return null;\n}\n\nexport class WebGLAttributeRenderer {\n  constructor(graphLayer, pool, runner) {\n    this.graphLayer = graphLayer;\n    this.pool = pool;\n    this.runner = runner;\n    this.gl = null;\n    this.device = null;\n    this.trackDepth = false;\n    this.depthBits = 16;\n    this.depthReadSupported = true;\n    this.targets = { node: null, edge: null };\n    this.depthTargets = { node: null, edge: null };\n    this.size = null;\n\n    this.programs = {\n      node: null,\n      nodeOcclusion: null,\n      nodeDepth: null,\n      edge: null,\n      edgeQuad: null,\n      edgeDepth: null,\n      edgeQuadDepth: null,\n    };\n    this.uniforms = {\n      node: null,\n      nodeOcclusion: null,\n      nodeDepth: null,\n      edge: null,\n      edgeDepth: null,\n    };\n\n    this.nodeVao = null;\n    this.edgeVao = null;\n    this.edgeQuadVao = null;\n    this.edgeQuadBuffer = null;\n    this.nodeQuadBuffer = null;\n    this.nodeIdBuffer = null;\n    this.edgeIdBuffer = null;\n    this.bufferMeta = {\n      nodeIds: null,\n      edgeIds: null,\n    };\n\n    this.textures = {\n      nodePositions: null,\n      nodeSizes: null,\n      nodeOutlineWidths: null,\n      nodeStates: null,\n      nodeEncoded: null,\n      nodeTrackedFloat: null,\n      nodeTrackedInt: null,\n      nodeTrackedUint: null,\n      edgeEndpoints: null,\n      edgeStates: null,\n      edgeWidths: null,\n      edgeEndpointSizes: null,\n      nodeWidthSource: null,\n      nodeEndpointSizeSource: null,\n      edgeEncoded: null,\n      edgeTrackedFloat: null,\n      edgeTrackedInt: null,\n      edgeTrackedUint: null,\n    };\n    this.textureMeta = {\n      nodePositions: null,\n      nodeSizes: null,\n      nodeOutlineWidths: null,\n      nodeStates: null,\n      nodeEncoded: null,\n      nodeTrackedFloat: null,\n      nodeTrackedInt: null,\n      nodeTrackedUint: null,\n      edgeEndpoints: null,\n      edgeStates: null,\n      edgeWidths: null,\n      edgeEndpointSizes: null,\n      nodeWidthSource: null,\n      nodeEndpointSizeSource: null,\n      edgeEncoded: null,\n      edgeTrackedFloat: null,\n      edgeTrackedInt: null,\n      edgeTrackedUint: null,\n    };\n    this._uploadScratch = new Map();\n    this.sparseEncodedReadyCache = { node: null, edge: null };\n  }\n\n  initialize(device) {\n    if (this.gl) return;\n    if (!device || device.type !== 'webgl2') return;\n    this.device = device;\n    this.gl = device.gl;\n    this.initializePrograms();\n    this.initializeGeometry();\n    this.initializeTextures();\n  }\n\n  initializePrograms() {\n    const { gl, device } = this;\n    const resolveUniforms = (program, names) => {\n      const out = {};\n      for (const name of names) out[name] = gl.getUniformLocation(program, name);\n      return out;\n    };\n\n    this.programs.node = device.createProgram(\n      WEBGL_INDIRECT_TRACK_NODE_VERTEX,\n      WEBGL_INDIRECT_TRACK_NODE_FRAGMENT,\n    );\n    this.programs.nodeOcclusion = device.createProgram(\n      WEBGL_INDIRECT_TRACK_NODE_VERTEX,\n      WEBGL_INDIRECT_TRACK_NODE_OCCLUSION_FRAGMENT,\n    );\n    this.programs.nodeDepth = device.createProgram(\n      WEBGL_INDIRECT_TRACK_NODE_VERTEX,\n      WEBGL_INDIRECT_TRACK_NODE_DEPTH_FRAGMENT,\n    );\n    this.programs.edge = device.createProgram(\n      WEBGL_INDIRECT_TRACK_EDGE_VERTEX,\n      WEBGL_INDIRECT_TRACK_EDGE_FRAGMENT,\n    );\n    this.programs.edgeQuad = device.createProgram(\n      WEBGL_INDIRECT_TRACK_EDGE_QUAD_VERTEX,\n      WEBGL_INDIRECT_TRACK_EDGE_FRAGMENT,\n    );\n    this.programs.edgeDepth = device.createProgram(\n      WEBGL_INDIRECT_TRACK_EDGE_VERTEX,\n      WEBGL_INDIRECT_TRACK_EDGE_DEPTH_FRAGMENT,\n    );\n    this.programs.edgeQuadDepth = device.createProgram(\n      WEBGL_INDIRECT_TRACK_EDGE_QUAD_VERTEX,\n      WEBGL_INDIRECT_TRACK_EDGE_DEPTH_FRAGMENT,\n    );\n\n    const nodeUniformNames = [\n      'u_viewProjection',\n      'u_nodePositions',\n      'u_nodeSizes',\n      'u_nodeOutlineWidths',\n      'u_nodeStates',\n      'u_nodeEncoded',\n      'u_nodeTrackedFloat',\n      'u_nodeTrackedInt',\n      'u_nodeTrackedUint',\n      'u_cameraPosition',\n      'u_cameraUp',\n      'u_cameraRight',\n      'u_is2D',\n      'u_zoom2D',\n      'u_semanticZoomExponent',\n      'u_useNodeIdBuffer',\n      'u_useNodeSize',\n      'u_useNodeOutline',\n      'u_useEncodedTexture',\n      'u_trackedNodeValueMode',\n      'u_hasNodeStates',\n      'u_hoverNodeIndex',\n      'u_hoverNodeState',\n      'u_hoverNodeIsVirtual',\n      'u_stateSlotCount',\n      'u_nodeSizeRaw',\n      'u_nodeSizeBase',\n      'u_nodeSizeScale',\n      'u_nodeOutline',\n      'u_outlineWidthBase',\n      'u_outlineWidthScale',\n      'u_nodeNoStateScale',\n      'u_nodeStateScale[0]',\n    ];\n    this.uniforms.node = resolveUniforms(this.programs.node, nodeUniformNames);\n    this.uniforms.nodeOcclusion = resolveUniforms(this.programs.nodeOcclusion, nodeUniformNames);\n    this.uniforms.nodeDepth = resolveUniforms(this.programs.nodeDepth, nodeUniformNames);\n    this.uniforms.edge = resolveUniforms(this.programs.edge, [\n      'u_viewProjection',\n      'u_nodePositions',\n      'u_edgeEndpoints',\n      'u_edgeEncoded',\n      'u_edgeTrackedFloat',\n      'u_edgeTrackedInt',\n      'u_edgeTrackedUint',\n      'u_useEdgeIdBuffer',\n      'u_useEncodedTexture',\n      'u_trackedEdgeValueMode',\n    ]);\n    this.uniforms.edgeDepth = resolveUniforms(this.programs.edgeDepth, [\n      'u_viewProjection',\n      'u_nodePositions',\n      'u_edgeEndpoints',\n      'u_edgeEncoded',\n      'u_edgeTrackedFloat',\n      'u_edgeTrackedInt',\n      'u_edgeTrackedUint',\n      'u_useEdgeIdBuffer',\n      'u_useEncodedTexture',\n      'u_trackedEdgeValueMode',\n    ]);\n    const edgeQuadUniformNames = [\n      'u_viewProjection',\n      'u_viewport',\n      'u_nodePositions',\n      'u_edgeEndpoints',\n      'u_edgeEncoded',\n      'u_edgeTrackedFloat',\n      'u_edgeTrackedInt',\n      'u_edgeTrackedUint',\n      'u_edgeWidths',\n      'u_edgeEndpointSizes',\n      'u_edgeStates',\n      'u_nodeStates',\n      'u_nodeWidthSource',\n      'u_nodeEndpointSizeSource',\n      'u_useEdgeIdBuffer',\n      'u_useEncodedTexture',\n      'u_trackedEdgeValueMode',\n      'u_edgeWidthSource',\n      'u_edgeWidthEndpoints',\n      'u_edgeEndpointSizeSource',\n      'u_edgeEndpointSizeEndpoints',\n      'u_hasEdgeWidths',\n      'u_hasEdgeEndpointSizes',\n      'u_hasEdgeStates',\n      'u_hasNodeStates',\n      'u_hasNodeWidthSource',\n      'u_hasNodeEndpointSizeSource',\n      'u_propagateHoveredNodeToEdges',\n      'u_propagateSelectedNodesToEdges',\n      'u_stateSlotCount',\n      'u_defaultEdgeWidth',\n      'u_defaultEdgeEndpointSize',\n      'u_nodeNoStateScale',\n      'u_nodeStateScale[0]',\n      'u_edgeNoStateScale',\n      'u_edgeStateScale[0]',\n      'u_edgeWidthBase',\n      'u_edgeWidthScale',\n      'u_nodeSizeBase',\n      'u_nodeSizeScale',\n      'u_edgeEndpointTrim',\n      'u_hoverNodeIndex',\n      'u_hoverNodeState',\n      'u_hoverNodeIsVirtual',\n      'u_hoverEdgeIndex',\n      'u_hoverEdgeState',\n      'u_hoverEdgeIsVirtual',\n      'u_zoom2D',\n      'u_semanticZoomExponent',\n    ];\n    this.uniforms.edgeQuad = resolveUniforms(this.programs.edgeQuad, edgeQuadUniformNames);\n    this.uniforms.edgeQuadDepth = resolveUniforms(this.programs.edgeQuadDepth, edgeQuadUniformNames);\n  }\n\n  initializeGeometry() {\n    const { gl } = this;\n    this.nodeIdBuffer = gl.createBuffer();\n    this.edgeIdBuffer = gl.createBuffer();\n    this.nodeQuadBuffer = gl.createBuffer();\n    this.edgeQuadBuffer = gl.createBuffer();\n\n    const nodeQuadCorners = new Float32Array([\n      -1, -1,\n      1, -1,\n      -1, 1,\n      1, 1,\n    ]);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.nodeQuadBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, nodeQuadCorners, gl.STATIC_DRAW);\n\n    this.nodeVao = gl.createVertexArray();\n    gl.bindVertexArray(this.nodeVao);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.nodeQuadBuffer);\n    gl.enableVertexAttribArray(0);\n    gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 8, 0);\n    gl.vertexAttribDivisor(0, 0);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.nodeIdBuffer);\n    gl.enableVertexAttribArray(1);\n    gl.vertexAttribIPointer(1, 1, gl.UNSIGNED_INT, 4, 0);\n    gl.vertexAttribDivisor(1, 1);\n\n    this.edgeVao = gl.createVertexArray();\n    gl.bindVertexArray(this.edgeVao);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.edgeIdBuffer);\n    gl.enableVertexAttribArray(0);\n    gl.vertexAttribIPointer(0, 1, gl.UNSIGNED_INT, 4, 0);\n    gl.vertexAttribDivisor(0, 1);\n\n    const edgeQuadCorners = new Float32Array([\n      0, 1,\n      0, -1,\n      1, 1,\n      1, -1,\n    ]);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.edgeQuadBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, edgeQuadCorners, gl.STATIC_DRAW);\n\n    this.edgeQuadVao = gl.createVertexArray();\n    gl.bindVertexArray(this.edgeQuadVao);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.edgeQuadBuffer);\n    gl.enableVertexAttribArray(0);\n    gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 8, 0);\n    gl.vertexAttribDivisor(0, 0);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.edgeIdBuffer);\n    gl.enableVertexAttribArray(1);\n    gl.vertexAttribIPointer(1, 1, gl.UNSIGNED_INT, 4, 0);\n    gl.vertexAttribDivisor(1, 1);\n\n    gl.bindVertexArray(null);\n    gl.bindBuffer(gl.ARRAY_BUFFER, null);\n  }\n\n  createTexture() {\n    const { gl } = this;\n    const tex = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, tex);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    return tex;\n  }\n\n  initializeTextures() {\n    const { gl } = this;\n    this.textures.nodePositions = this.createTexture();\n    this.textures.nodeSizes = this.createTexture();\n    this.textures.nodeOutlineWidths = this.createTexture();\n    this.textures.nodeStates = this.createTexture();\n    this.textures.nodeEncoded = this.createTexture();\n    this.textures.nodeTrackedFloat = this.createTexture();\n    this.textures.nodeTrackedInt = this.createTexture();\n    this.textures.nodeTrackedUint = this.createTexture();\n    this.textures.edgeEndpoints = this.createTexture();\n    this.textures.edgeStates = this.createTexture();\n    this.textures.edgeWidths = this.createTexture();\n    this.textures.edgeEndpointSizes = this.createTexture();\n    this.textures.nodeWidthSource = this.createTexture();\n    this.textures.nodeEndpointSizeSource = this.createTexture();\n    this.textures.edgeEncoded = this.createTexture();\n    this.textures.edgeTrackedFloat = this.createTexture();\n    this.textures.edgeTrackedInt = this.createTexture();\n    this.textures.edgeTrackedUint = this.createTexture();\n\n    gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.nodePositions);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB32F, 1, 1, 0, gl.RGB, gl.FLOAT, new Float32Array([0, 0, 0]));\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.nodeSizes);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32F, 1, 1, 0, gl.RED, gl.FLOAT, new Float32Array([1]));\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.nodeOutlineWidths);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32F, 1, 1, 0, gl.RED, gl.FLOAT, new Float32Array([0]));\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.nodeStates);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32UI, 1, 1, 0, gl.RED_INTEGER, gl.UNSIGNED_INT, null);\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.nodeEncoded);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8UI, 1, 1, 0, gl.RGBA_INTEGER, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 0]));\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.nodeTrackedFloat);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32F, 1, 1, 0, gl.RED, gl.FLOAT, new Float32Array([0]));\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.nodeTrackedInt);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32I, 1, 1, 0, gl.RED_INTEGER, gl.INT, new Int32Array([0]));\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.nodeTrackedUint);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32UI, 1, 1, 0, gl.RED_INTEGER, gl.UNSIGNED_INT, new Uint32Array([0]));\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.edgeEndpoints);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RG32UI, 1, 1, 0, gl.RG_INTEGER, gl.UNSIGNED_INT, new Uint32Array([0, 0]));\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.edgeStates);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32UI, 1, 1, 0, gl.RED_INTEGER, gl.UNSIGNED_INT, null);\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.edgeWidths);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RG32F, 1, 1, 0, gl.RG, gl.FLOAT, new Float32Array([1, 1]));\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.edgeEndpointSizes);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RG32F, 1, 1, 0, gl.RG, gl.FLOAT, new Float32Array([1, 1]));\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.nodeWidthSource);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32F, 1, 1, 0, gl.RED, gl.FLOAT, new Float32Array([1]));\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.nodeEndpointSizeSource);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32F, 1, 1, 0, gl.RED, gl.FLOAT, new Float32Array([1]));\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.edgeEncoded);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8UI, 1, 1, 0, gl.RGBA_INTEGER, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 0]));\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.edgeTrackedFloat);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32F, 1, 1, 0, gl.RED, gl.FLOAT, new Float32Array([0]));\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.edgeTrackedInt);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32I, 1, 1, 0, gl.RED_INTEGER, gl.INT, new Int32Array([0]));\n\n    gl.bindTexture(gl.TEXTURE_2D, this.textures.edgeTrackedUint);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32UI, 1, 1, 0, gl.RED_INTEGER, gl.UNSIGNED_INT, new Uint32Array([0]));\n    gl.bindTexture(gl.TEXTURE_2D, null);\n  }\n\n  destroy() {\n    const { gl } = this;\n    if (!gl) return;\n    Object.values(this.programs).forEach((program) => {\n      if (program) gl.deleteProgram(program);\n    });\n    if (this.nodeVao) gl.deleteVertexArray(this.nodeVao);\n    if (this.edgeVao) gl.deleteVertexArray(this.edgeVao);\n    if (this.edgeQuadVao) gl.deleteVertexArray(this.edgeQuadVao);\n    if (this.nodeQuadBuffer) gl.deleteBuffer(this.nodeQuadBuffer);\n    if (this.nodeIdBuffer) gl.deleteBuffer(this.nodeIdBuffer);\n    if (this.edgeIdBuffer) gl.deleteBuffer(this.edgeIdBuffer);\n    if (this.edgeQuadBuffer) gl.deleteBuffer(this.edgeQuadBuffer);\n    Object.values(this.textures).forEach((texture) => {\n      if (texture) gl.deleteTexture(texture);\n    });\n    this.targets = { node: null, edge: null };\n    this.depthTargets = { node: null, edge: null };\n    this.gl = null;\n    this.device = null;\n  }\n\n  resize(size, scale, trackDepth) {\n    if (!size) return;\n    const pixelRatio = size.devicePixelRatio ?? 1;\n    const width = Math.max(1, Math.floor((size.width ?? 1) * pixelRatio * scale));\n    const height = Math.max(1, Math.floor((size.height ?? 1) * pixelRatio * scale));\n    if (this.size && this.size.width === width && this.size.height === height && this.trackDepth === (trackDepth === true)) {\n      return;\n    }\n    this.trackDepth = trackDepth === true;\n    this.size = { width, height };\n    const tagNode = this.trackDepth ? 'attr-node-indirect-depth-cap' : 'attr-node-indirect';\n    const tagEdge = this.trackDepth ? 'attr-edge-indirect-depth-cap' : 'attr-edge-indirect';\n    this.targets.node = this.pool.get(this.device, tagNode, width, height, { depth: true, filter: 'nearest' });\n    this.targets.edge = this.pool.get(this.device, tagEdge, width, height, { depth: true, filter: 'nearest' });\n    this.depthTargets.node = this.trackDepth\n      ? this.pool.get(this.device, 'attr-node-indirect-depth-color', width, height, { depth: true, filter: 'nearest' })\n      : null;\n    this.depthTargets.edge = this.trackDepth\n      ? this.pool.get(this.device, 'attr-edge-indirect-depth-color', width, height, { depth: true, filter: 'nearest' })\n      : null;\n    this.depthBits = this.trackDepth ? 16 : this.depthBits;\n  }\n\n  getTextureLayout(count) {\n    const max = this.gl.getParameter(this.gl.MAX_TEXTURE_SIZE) ?? 16384;\n    const safeCount = Math.max(1, Math.floor(Number(count) || 0));\n    const width = Math.min(max, safeCount);\n    const height = Math.ceil(safeCount / width);\n    if (height > max) {\n      throw new Error(\n        `WebGL indirect attribute tracking requires texture dimensions <= MAX_TEXTURE_SIZE (${max}), `\n        + `got ${safeCount} texels -> ${width}x${height}.`,\n      );\n    }\n    return { width, height };\n  }\n\n  uploadTexture2D(texture, view, components, count, formatInfo, type) {\n    const { gl } = this;\n    const { width, height } = this.getTextureLayout(count);\n    const valueCount = width * height * components;\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n    gl.pixelStorei(gl.UNPACK_ROW_LENGTH, 0);\n    const directView = (view.length === valueCount) ? view : this._packTextureUpload(view, valueCount);\n    gl.texImage2D(\n      gl.TEXTURE_2D,\n      0,\n      formatInfo.internalFormat,\n      width,\n      height,\n      0,\n      formatInfo.format,\n      type,\n      directView,\n    );\n  }\n\n  _packTextureUpload(view, valueCount) {\n    const ctor = typeof view?.constructor === 'function' ? view.constructor : Float32Array;\n    const key = ctor.name || 'TypedArray';\n    let scratch = this._uploadScratch.get(key) ?? null;\n    if (!(scratch instanceof ctor) || scratch.length < valueCount) {\n      scratch = new ctor(valueCount);\n      this._uploadScratch.set(key, scratch);\n    }\n    scratch.fill(0, 0, valueCount);\n    if (view && typeof view.subarray === 'function' && view.length > 0) {\n      scratch.set(view.subarray(0, Math.min(view.length, valueCount)), 0);\n    }\n    return scratch.length === valueCount ? scratch : scratch.subarray(0, valueCount);\n  }\n\n  isSameView(meta, view, version, count) {\n    return Boolean(\n      meta\n      && meta.version === (version ?? 0)\n      && meta.count === count\n      && meta.buffer === view?.buffer\n      && meta.byteOffset === (view?.byteOffset ?? 0)\n      && meta.byteLength === (view?.byteLength ?? 0),\n    );\n  }\n\n  rememberView(slot, view, version, count) {\n    this.textureMeta[slot] = {\n      version: version ?? 0,\n      count,\n      buffer: view?.buffer ?? null,\n      byteOffset: view?.byteOffset ?? 0,\n      byteLength: view?.byteLength ?? 0,\n    };\n  }\n\n  uploadFloatTexture(slot, texture, view, components, count, version) {\n    if (!view || !texture || !count) return false;\n    if (this.isSameView(this.textureMeta[slot], view, version, count)) return true;\n    const { gl } = this;\n    const formatInfo = components === 1\n      ? { internalFormat: gl.R32F, format: gl.RED }\n      : (components === 2\n        ? { internalFormat: gl.RG32F, format: gl.RG }\n        : (components === 3\n          ? { internalFormat: gl.RGB32F, format: gl.RGB }\n          : { internalFormat: gl.RGBA32F, format: gl.RGBA }));\n    this.uploadTexture2D(texture, view, components, count, formatInfo, gl.FLOAT);\n    this.rememberView(slot, view, version, count);\n    return true;\n  }\n\n  uploadUintTexture(slot, texture, view, components, count, version) {\n    if (!view || !texture || !count) return false;\n    if (this.isSameView(this.textureMeta[slot], view, version, count)) return true;\n    const { gl } = this;\n    const formatInfo = components === 2\n      ? { internalFormat: gl.RG32UI, format: gl.RG_INTEGER }\n      : { internalFormat: gl.R32UI, format: gl.RED_INTEGER };\n    this.uploadTexture2D(texture, view, components, count, formatInfo, gl.UNSIGNED_INT);\n    this.rememberView(slot, view, version, count);\n    return true;\n  }\n\n  uploadTrackedIntTexture(slot, texture, view, count, version) {\n    if (!view || !texture || !count) return false;\n    if (this.isSameView(this.textureMeta[slot], view, version, count)) return true;\n    const { gl } = this;\n    let internalFormat = gl.R32I;\n    let type = gl.INT;\n    if (view instanceof Int8Array) {\n      internalFormat = gl.R8I;\n      type = gl.BYTE;\n    } else if (view instanceof Int16Array) {\n      internalFormat = gl.R16I;\n      type = gl.SHORT;\n    } else if (!(view instanceof Int32Array)) {\n      return false;\n    }\n    this.uploadTexture2D(\n      texture,\n      view,\n      1,\n      count,\n      { internalFormat, format: gl.RED_INTEGER },\n      type,\n    );\n    this.rememberView(slot, view, version, count);\n    return true;\n  }\n\n  uploadTrackedUintTexture(slot, texture, view, count, version) {\n    if (!view || !texture || !count) return false;\n    if (this.isSameView(this.textureMeta[slot], view, version, count)) return true;\n    const { gl } = this;\n    let internalFormat = gl.R32UI;\n    let type = gl.UNSIGNED_INT;\n    if (view instanceof Uint8Array) {\n      internalFormat = gl.R8UI;\n      type = gl.UNSIGNED_BYTE;\n    } else if (view instanceof Uint16Array) {\n      internalFormat = gl.R16UI;\n      type = gl.UNSIGNED_SHORT;\n    } else if (!(view instanceof Uint32Array)) {\n      return false;\n    }\n    this.uploadTexture2D(\n      texture,\n      view,\n      1,\n      count,\n      { internalFormat, format: gl.RED_INTEGER },\n      type,\n    );\n    this.rememberView(slot, view, version, count);\n    return true;\n  }\n\n  normalizeEncodedDescriptor(desc) {\n    const sourceView = desc?.view ?? null;\n    if (!sourceView) return null;\n    if (sourceView.BYTES_PER_ELEMENT === 1) {\n      const count = Math.floor((sourceView.length ?? 0) / 4);\n      return count > 0\n        ? { sourceView, bytesView: sourceView, count, version: desc?.version ?? 0 }\n        : null;\n    }\n    if (sourceView.BYTES_PER_ELEMENT === 4) {\n      const count = sourceView.length ?? 0;\n      const bytesView = new Uint8Array(sourceView.buffer, sourceView.byteOffset, sourceView.byteLength);\n      return count > 0\n        ? { sourceView, bytesView, count, version: desc?.version ?? 0 }\n        : null;\n    }\n    return null;\n  }\n\n  uploadEncodedTexture(slot, texture, encoded) {\n    if (!encoded || !texture || !encoded.count) return false;\n    if (this.isSameView(this.textureMeta[slot], encoded.sourceView, encoded.version, encoded.count)) return true;\n    const { gl } = this;\n    this.uploadTexture2D(\n      texture,\n      encoded.bytesView,\n      4,\n      encoded.count,\n      { internalFormat: gl.RGBA8UI, format: gl.RGBA_INTEGER },\n      gl.UNSIGNED_BYTE,\n    );\n    this.rememberView(slot, encoded.sourceView, encoded.version, encoded.count);\n    return true;\n  }\n\n  uploadIdBuffer(slot, buffer, view, version, count, dirtyRange = null) {\n    if (!view || !buffer) return false;\n    const meta = this.bufferMeta[slot];\n    const same = Boolean(\n      meta\n      && meta.version === (version ?? 0)\n      && meta.count === count\n      && meta.buffer === view.buffer\n      && meta.byteOffset === view.byteOffset\n      && meta.byteLength === view.byteLength,\n    );\n    if (!same) {\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, buffer);\n      const canSubData = Boolean(\n        dirtyRange\n        && meta\n        && meta.count === count\n        && meta.buffer === view.buffer\n        && meta.byteOffset === view.byteOffset\n        && meta.byteLength === view.byteLength\n        && Number.isFinite(Number(dirtyRange.start))\n        && Number.isFinite(Number(dirtyRange.count))\n        && Number(dirtyRange.count) > 0\n      );\n      if (canSubData) {\n        const start = Math.max(0, Math.floor(Number(dirtyRange.start)));\n        const dirtyCount = Math.max(0, Math.floor(Number(dirtyRange.count)));\n        const end = Math.min(view.length ?? 0, start + dirtyCount);\n        if (end > start) {\n          this.gl.bufferSubData(\n            this.gl.ARRAY_BUFFER,\n            start * (view.BYTES_PER_ELEMENT || Uint32Array.BYTES_PER_ELEMENT),\n            view.subarray(start, end),\n          );\n        } else {\n          this.gl.bufferData(this.gl.ARRAY_BUFFER, view, this.gl.DYNAMIC_DRAW);\n        }\n      } else {\n        this.gl.bufferData(this.gl.ARRAY_BUFFER, view, this.gl.DYNAMIC_DRAW);\n      }\n      this.bufferMeta[slot] = {\n        version: version ?? 0,\n        count,\n        buffer: view.buffer,\n        byteOffset: view.byteOffset,\n        byteLength: view.byteLength,\n      };\n    }\n    return true;\n  }\n\n  bindTexture(unit, texture) {\n    const { gl } = this;\n    gl.activeTexture(gl.TEXTURE0 + unit);\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n  }\n\n  isIndexAttribute(name) {\n    return name === INDEX_SENTINEL || name === 'index' || name === '$index';\n  }\n\n  resolveTrackedAttributeDescriptor(network, scope, attrName) {\n    if (!attrName || this.isIndexAttribute(attrName)) return null;\n    const desc = safeGetAttributeBuffer(network, scope, attrName);\n    const view = desc?.view ?? null;\n    if (!view) return null;\n    const dimension = desc?.dimension ?? 1;\n    if (dimension !== 1) return null;\n    const count = view.length ?? 0;\n    const version = desc?.version ?? 0;\n    if (view instanceof Int8Array || view instanceof Int16Array || view instanceof Int32Array) {\n      return { mode: TRACKED_VALUE_MODE.INT_TEXTURE, view, count, version };\n    }\n    if (view instanceof Uint8Array || view instanceof Uint16Array || view instanceof Uint32Array) {\n      return { mode: TRACKED_VALUE_MODE.UINT_TEXTURE, view, count, version };\n    }\n    return null;\n  }\n\n  mapEndpointMode(value) {\n    return value === 'source' ? 1 : (value === 'destination' ? 2 : 0);\n  }\n\n  getSharedGraphResources() {\n    const provider = this.graphLayer?.getSharedSparseResources;\n    if (typeof provider !== 'function') return null;\n    try {\n      return provider.call(this.graphLayer);\n    } catch (error) {\n      warnOnce(\n        this,\n        'shared-sparse-resources:webgl',\n        'AttributeTracker: shared sparse-resource provider failed for WebGL tracking; using local fallback resources.',\n        { error },\n      );\n      return null;\n    }\n  }\n\n  resolveSharedTexture({\n    slot,\n    localTexture,\n    sharedResources,\n    sharedTextureKey,\n    sharedMetaKey,\n    view,\n    version,\n    count,\n    upload,\n  }) {\n    const sharedTexture = sharedResources?.textures?.[sharedTextureKey] ?? null;\n    const sharedMeta = sharedResources?.textureMeta?.[sharedMetaKey] ?? null;\n    if (sharedTexture && view && count > 0 && this.isSameView(sharedMeta, view, version, count)) {\n      // Keep local meta invalidated so fallback uploads cannot be skipped.\n      this.textureMeta[slot] = null;\n      return sharedTexture;\n    }\n    upload?.();\n    return localTexture;\n  }\n\n  toPair(value, fallback = [1, 1]) {\n    if (Array.isArray(value)) {\n      const a = Number(value[0]);\n      const b = Number(value[1]);\n      return [Number.isFinite(a) ? a : fallback[0], Number.isFinite(b) ? b : fallback[1]];\n    }\n    const scalar = Number(value);\n    if (Number.isFinite(scalar)) return [scalar, scalar];\n    return fallback;\n  }\n\n  resolveEdgeVariant(visualConfig) {\n    if (typeof this.graphLayer?.resolveEdgeVariant === 'function') {\n      return this.graphLayer.resolveEdgeVariant(visualConfig);\n    }\n    const edgeCfg = visualConfig?.edge ?? null;\n    const normalize = (entry, fallbackSource = 'edge') => ({\n      mode: entry?.mode ?? 'buffer',\n      source: entry?.source ?? fallbackSource,\n      endpoints: entry?.endpoints ?? 'both',\n      nodeAttribute: entry?.nodeAttribute ?? null,\n    });\n    const color = normalize(edgeCfg?.color, 'edge');\n    const width = normalize(edgeCfg?.width, 'edge');\n    const opacity = normalize(edgeCfg?.opacity, 'edge');\n    const endpointSize = normalize(edgeCfg?.endpointSize, 'edge');\n    return {\n      colorBuffer: color.mode !== 'uniform',\n      colorSource: color.source,\n      colorEndpoints: color.endpoints,\n      colorNodeAttribute: color.nodeAttribute,\n      widthBuffer: width.mode !== 'uniform',\n      widthSource: width.source,\n      widthEndpoints: width.endpoints,\n      widthNodeAttribute: width.nodeAttribute,\n      opacityBuffer: opacity.mode !== 'uniform',\n      opacitySource: opacity.source,\n      opacityEndpoints: opacity.endpoints,\n      opacityNodeAttribute: opacity.nodeAttribute,\n      endpointSizeBuffer: endpointSize.mode !== 'uniform',\n      endpointSizeSource: endpointSize.source,\n      endpointSizeEndpoints: endpointSize.endpoints,\n      endpointSizeNodeAttribute: endpointSize.nodeAttribute,\n    };\n  }\n\n  setNodeUniforms(uniforms, cameraUniforms, options) {\n    const { gl } = this;\n    if (!uniforms || !cameraUniforms) return false;\n    const set1ui = (location, value) => {\n      if (!location) return;\n      if (typeof gl.uniform1ui === 'function') gl.uniform1ui(location, value);\n      else gl.uniform1i(location, value);\n    };\n    const set4f = (location, x, y, z, w) => {\n      if (!location) return;\n      if (typeof gl.uniform4f === 'function') gl.uniform4f(location, x, y, z, w);\n      else if (typeof gl.uniform4fv === 'function') gl.uniform4fv(location, [x, y, z, w]);\n    };\n    const set4fv = (location, value) => {\n      if (!location || typeof gl.uniform4fv !== 'function') return;\n      gl.uniform4fv(location, value);\n    };\n    const is2D = cameraUniforms?.mode === '2d';\n    const zoom2D = is2D ? Math.max(1e-3, cameraUniforms?.view?.[0] ?? 1) : 1;\n    const semanticZoomExponent = Number.isFinite(this.graphLayer?.semanticZoomExponent)\n      ? this.graphLayer.semanticZoomExponent\n      : 0;\n    gl.uniformMatrix4fv(uniforms.u_viewProjection, false, cameraUniforms.viewProjection);\n    gl.uniform1i(uniforms.u_nodePositions, 0);\n    gl.uniform1i(uniforms.u_nodeSizes, 1);\n    gl.uniform1i(uniforms.u_nodeOutlineWidths, 9);\n    gl.uniform1i(uniforms.u_nodeStates, 13);\n    gl.uniform1i(uniforms.u_nodeEncoded, 2);\n    gl.uniform1i(uniforms.u_nodeTrackedFloat, 10);\n    gl.uniform1i(uniforms.u_nodeTrackedInt, 11);\n    gl.uniform1i(uniforms.u_nodeTrackedUint, 12);\n    gl.uniform3f(\n      uniforms.u_cameraPosition,\n      cameraUniforms.position?.[0] ?? 0,\n      cameraUniforms.position?.[1] ?? 0,\n      cameraUniforms.position?.[2] ?? 1,\n    );\n    gl.uniform3f(\n      uniforms.u_cameraUp,\n      cameraUniforms.up?.[0] ?? 0,\n      cameraUniforms.up?.[1] ?? 1,\n      cameraUniforms.up?.[2] ?? 0,\n    );\n    gl.uniform3f(\n      uniforms.u_cameraRight,\n      cameraUniforms.right?.[0] ?? 1,\n      cameraUniforms.right?.[1] ?? 0,\n      cameraUniforms.right?.[2] ?? 0,\n    );\n    gl.uniform1i(uniforms.u_is2D, cameraUniforms.mode === '2d' ? 1 : 0);\n    gl.uniform1f(uniforms.u_zoom2D, zoom2D);\n    gl.uniform1f(uniforms.u_semanticZoomExponent, semanticZoomExponent);\n    gl.uniform1i(uniforms.u_useNodeIdBuffer, options.useNodeIdBuffer ? 1 : 0);\n    gl.uniform1i(uniforms.u_useNodeSize, options.useNodeSize ? 1 : 0);\n    gl.uniform1i(uniforms.u_useNodeOutline, options.useNodeOutline ? 1 : 0);\n    gl.uniform1i(uniforms.u_useEncodedTexture, options.useEncodedTexture ? 1 : 0);\n    gl.uniform1i(uniforms.u_trackedNodeValueMode, options.trackedNodeValueMode ?? TRACKED_VALUE_MODE.INDEX);\n    gl.uniform1i(uniforms.u_hasNodeStates, options.hasNodeStates ? 1 : 0);\n    set1ui(uniforms.u_hoverNodeIndex, this.graphLayer.hoveredNodeIndex >>> 0);\n    set1ui(uniforms.u_hoverNodeState, this.graphLayer.hoveredNodeState >>> 0);\n    set1ui(uniforms.u_hoverNodeIsVirtual, this.graphLayer.hoveredNodeIsVirtual ? 1 : 0);\n    gl.uniform1i(uniforms.u_stateSlotCount, this.graphLayer.stateSlotCount ?? 0);\n    gl.uniform1f(uniforms.u_nodeSizeRaw, options.nodeSizeValue ?? 1);\n    gl.uniform1f(uniforms.u_nodeSizeBase, this.graphLayer.nodeSizeBase ?? 0);\n    gl.uniform1f(uniforms.u_nodeSizeScale, this.graphLayer.nodeSizeScale ?? 1);\n    gl.uniform1f(uniforms.u_nodeOutline, options.nodeOutlineValue ?? 0);\n    gl.uniform1f(uniforms.u_outlineWidthBase, this.graphLayer.nodeOutlineWidthBase ?? 0);\n    gl.uniform1f(uniforms.u_outlineWidthScale, this.graphLayer.nodeOutlineWidthScale ?? 0);\n    const nodeNoStateEnabled = this.graphLayer.nodeNoStateStyleEnabled === true;\n    set4f(\n      uniforms.u_nodeNoStateScale,\n      nodeNoStateEnabled ? this.graphLayer.nodeNoStateScale[0] : 1,\n      nodeNoStateEnabled ? this.graphLayer.nodeNoStateScale[1] : 1,\n      nodeNoStateEnabled ? this.graphLayer.nodeNoStateScale[2] : 1,\n      nodeNoStateEnabled ? this.graphLayer.nodeNoStateScale[3] : 0,\n    );\n    set4fv(uniforms['u_nodeStateScale[0]'], this.graphLayer.nodeStateScale);\n    return true;\n  }\n\n  setEdgeUniforms(uniforms, cameraUniforms, options) {\n    const { gl } = this;\n    if (!uniforms || !cameraUniforms) return false;\n    gl.uniformMatrix4fv(uniforms.u_viewProjection, false, cameraUniforms.viewProjection);\n    gl.uniform1i(uniforms.u_nodePositions, 0);\n    gl.uniform1i(uniforms.u_edgeEndpoints, 3);\n    gl.uniform1i(uniforms.u_edgeEncoded, 4);\n    gl.uniform1i(uniforms.u_edgeTrackedFloat, 10);\n    gl.uniform1i(uniforms.u_edgeTrackedInt, 11);\n    gl.uniform1i(uniforms.u_edgeTrackedUint, 12);\n    gl.uniform1i(uniforms.u_useEdgeIdBuffer, options.useEdgeIdBuffer ? 1 : 0);\n    gl.uniform1i(uniforms.u_useEncodedTexture, options.useEncodedTexture ? 1 : 0);\n    gl.uniform1i(uniforms.u_trackedEdgeValueMode, options.trackedEdgeValueMode ?? TRACKED_VALUE_MODE.INDEX);\n    return true;\n  }\n\n  setEdgeQuadUniforms(uniforms, cameraUniforms, options) {\n    const { gl } = this;\n    const set1ui = (location, value) => {\n      if (!location) return;\n      if (typeof gl.uniform1ui === 'function') gl.uniform1ui(location, value);\n      else gl.uniform1i(location, value);\n    };\n    const set4f = (location, x, y, z, w) => {\n      if (!location) return;\n      if (typeof gl.uniform4f === 'function') gl.uniform4f(location, x, y, z, w);\n      else if (typeof gl.uniform4fv === 'function') gl.uniform4fv(location, [x, y, z, w]);\n    };\n    const set4fv = (location, value) => {\n      if (!location || typeof gl.uniform4fv !== 'function') return;\n      gl.uniform4fv(location, value);\n    };\n    const is2D = cameraUniforms?.mode === '2d';\n    const zoom2D = is2D ? Math.max(1e-3, cameraUniforms?.view?.[0] ?? 1) : 1;\n    const semanticZoomExponent = Number.isFinite(this.graphLayer?.semanticZoomExponent)\n      ? this.graphLayer.semanticZoomExponent\n      : 0;\n    const edgeWidthFactor = is2D ? (zoom2D / EDGE_WIDTH_SCALE_MULTIPLIER_GLOBAL) : 1.0;\n    const globalEdgeWidthBase = (this.graphLayer.edgeWidthBase ?? 0)\n      * EDGE_WIDTH_SCALE_MULTIPLIER_GLOBAL\n      * edgeWidthFactor;\n    const globalEdgeWidthScale = (this.graphLayer.edgeWidthScale ?? 1)\n      * EDGE_WIDTH_SCALE_MULTIPLIER_GLOBAL\n      * edgeWidthFactor;\n    gl.uniformMatrix4fv(uniforms.u_viewProjection, false, cameraUniforms.viewProjection);\n    gl.uniform2f(uniforms.u_viewport, this.size.width, this.size.height);\n    gl.uniform1i(uniforms.u_nodePositions, 0);\n    gl.uniform1i(uniforms.u_edgeEndpoints, 3);\n    gl.uniform1i(uniforms.u_edgeEncoded, 4);\n    gl.uniform1i(uniforms.u_edgeTrackedFloat, 10);\n    gl.uniform1i(uniforms.u_edgeTrackedInt, 11);\n    gl.uniform1i(uniforms.u_edgeTrackedUint, 12);\n    gl.uniform1i(uniforms.u_edgeWidths, 5);\n    gl.uniform1i(uniforms.u_edgeEndpointSizes, 6);\n    gl.uniform1i(uniforms.u_edgeStates, 13);\n    gl.uniform1i(uniforms.u_nodeStates, 14);\n    gl.uniform1i(uniforms.u_nodeWidthSource, 7);\n    gl.uniform1i(uniforms.u_nodeEndpointSizeSource, 8);\n    gl.uniform1i(uniforms.u_useEdgeIdBuffer, options.useEdgeIdBuffer ? 1 : 0);\n    gl.uniform1i(uniforms.u_useEncodedTexture, options.useEncodedTexture ? 1 : 0);\n    gl.uniform1i(uniforms.u_trackedEdgeValueMode, options.trackedEdgeValueMode ?? TRACKED_VALUE_MODE.INDEX);\n    gl.uniform1i(uniforms.u_edgeWidthSource, options.edgeWidthSource === 'node' ? 1 : 0);\n    gl.uniform1i(uniforms.u_edgeWidthEndpoints, this.mapEndpointMode(options.edgeWidthEndpoints));\n    gl.uniform1i(uniforms.u_edgeEndpointSizeSource, options.edgeEndpointSizeSource === 'node' ? 1 : 0);\n    gl.uniform1i(\n      uniforms.u_edgeEndpointSizeEndpoints,\n      this.mapEndpointMode(options.edgeEndpointSizeEndpoints),\n    );\n    gl.uniform1i(uniforms.u_hasEdgeWidths, options.hasEdgeWidths ? 1 : 0);\n    gl.uniform1i(uniforms.u_hasEdgeEndpointSizes, options.hasEdgeEndpointSizes ? 1 : 0);\n    gl.uniform1i(uniforms.u_hasEdgeStates, options.hasEdgeStates ? 1 : 0);\n    gl.uniform1i(uniforms.u_hasNodeStates, options.hasNodeStates ? 1 : 0);\n    gl.uniform1i(uniforms.u_hasNodeWidthSource, options.hasNodeWidthSource ? 1 : 0);\n    gl.uniform1i(\n      uniforms.u_hasNodeEndpointSizeSource,\n      options.hasNodeEndpointSizeSource ? 1 : 0,\n    );\n    gl.uniform1i(uniforms.u_propagateHoveredNodeToEdges, this.graphLayer.propagateHoveredNodeToEdges === true ? 1 : 0);\n    gl.uniform1i(uniforms.u_propagateSelectedNodesToEdges, this.graphLayer.propagateSelectedNodesToEdges === true ? 1 : 0);\n    gl.uniform1i(uniforms.u_stateSlotCount, this.graphLayer.stateSlotCount ?? 0);\n    gl.uniform2f(uniforms.u_defaultEdgeWidth, options.defaultEdgeWidth[0], options.defaultEdgeWidth[1]);\n    gl.uniform2f(\n      uniforms.u_defaultEdgeEndpointSize,\n      options.defaultEdgeEndpointSize[0],\n      options.defaultEdgeEndpointSize[1],\n    );\n    const nodeNoStateEnabled = this.graphLayer.nodeNoStateStyleEnabled === true;\n    set4f(\n      uniforms.u_nodeNoStateScale,\n      nodeNoStateEnabled ? this.graphLayer.nodeNoStateScale[0] : 1,\n      nodeNoStateEnabled ? this.graphLayer.nodeNoStateScale[1] : 1,\n      nodeNoStateEnabled ? this.graphLayer.nodeNoStateScale[2] : 1,\n      nodeNoStateEnabled ? this.graphLayer.nodeNoStateScale[3] : 0,\n    );\n    set4fv(uniforms['u_nodeStateScale[0]'], this.graphLayer.nodeStateScale);\n    const edgeNoStateEnabled = this.graphLayer.edgeNoStateStyleEnabled === true;\n    set4f(\n      uniforms.u_edgeNoStateScale,\n      edgeNoStateEnabled ? this.graphLayer.edgeNoStateScale[0] : 1,\n      edgeNoStateEnabled ? this.graphLayer.edgeNoStateScale[1] : 1,\n      edgeNoStateEnabled ? this.graphLayer.edgeNoStateScale[2] : 1,\n      edgeNoStateEnabled ? this.graphLayer.edgeNoStateScale[3] : 0,\n    );\n    set4fv(uniforms['u_edgeStateScale[0]'], this.graphLayer.edgeStateScale);\n    gl.uniform1f(uniforms.u_edgeWidthBase, globalEdgeWidthBase);\n    gl.uniform1f(uniforms.u_edgeWidthScale, globalEdgeWidthScale);\n    gl.uniform1f(uniforms.u_nodeSizeBase, this.graphLayer.nodeSizeBase ?? 0);\n    gl.uniform1f(uniforms.u_nodeSizeScale, this.graphLayer.nodeSizeScale ?? 1);\n    gl.uniform1f(uniforms.u_edgeEndpointTrim, this.graphLayer.edgeEndpointTrim ?? 0.8);\n    set1ui(uniforms.u_hoverNodeIndex, this.graphLayer.hoveredNodeIndex >>> 0);\n    set1ui(uniforms.u_hoverNodeState, this.graphLayer.hoveredNodeState >>> 0);\n    set1ui(uniforms.u_hoverNodeIsVirtual, this.graphLayer.hoveredNodeIsVirtual ? 1 : 0);\n    set1ui(uniforms.u_hoverEdgeIndex, this.graphLayer.hoveredEdgeIndex >>> 0);\n    set1ui(uniforms.u_hoverEdgeState, this.graphLayer.hoveredEdgeState >>> 0);\n    set1ui(uniforms.u_hoverEdgeIsVirtual, this.graphLayer.hoveredEdgeIsVirtual ? 1 : 0);\n    gl.uniform1f(uniforms.u_zoom2D, zoom2D);\n    gl.uniform1f(uniforms.u_semanticZoomExponent, semanticZoomExponent);\n  }\n\n  render(frame, size, config) {\n    if (!this.gl || !frame?.network) return null;\n    if (\n      this.device?.createProgram\n      && (!this.programs.node || !this.uniforms.node || !this.uniforms.nodeOcclusion || !this.uniforms.nodeDepth)\n    ) {\n      this.initializePrograms();\n    }\n    if (this.device?.createProgram && (!this.nodeVao || !this.edgeVao || !this.edgeQuadVao)) {\n      this.initializeGeometry();\n    }\n    if (this.device?.createProgram && (!this.textures.nodePositions || !this.textures.edgeEndpoints)) {\n      this.initializeTextures();\n    }\n    const network = frame.network;\n    const camera = frame.camera;\n    const scale = config.resolutionScale ?? 1;\n    this.resize(size, scale, config.trackDepth);\n    const cameraUniforms = this.graphLayer.getCameraUniforms(camera);\n    if (!cameraUniforms) return null;\n    const schema = GraphVisualSchema.fromNetwork(network, {\n      nodeOutlineUseAttributes: this.graphLayer?.nodeOutlineUseAttributes === true,\n    });\n    const visualConfig = schema?.visualConfig ?? null;\n    const nodeConfig = visualConfig?.node ?? null;\n    const nodeVariant = schema?.getNodeVariant?.() ?? null;\n    const edgeConfig = visualConfig?.edge ?? null;\n    const edgeVariant = this.resolveEdgeVariant(visualConfig);\n    const useQuads = (this.graphLayer?.getEffectiveEdgeRenderingMode?.() ?? this.graphLayer?.edgeRenderingMode) === 'quad';\n    const nodeSizeUniform = nodeVariant ? (nodeVariant.sizeBuffer === false) : false;\n    const nodeSizeValue = nodeSizeUniform\n      ? Number(nodeConfig?.size?.value ?? 0)\n      : 1;\n    const nodeOutlineUniform = nodeVariant ? (nodeVariant.outlineWidthBuffer === false) : true;\n    const nodeOutlineValue = nodeConfig?.outline?.mode === 'uniform'\n      ? Number(nodeConfig?.outline?.value ?? 0)\n      : 0;\n    const defaultEdgeWidth = this.toPair(edgeConfig?.width?.value, [1, 1]);\n    const defaultEdgeEndpointSize = this.toPair(edgeConfig?.endpointSize?.value, [1, 1]);\n    const edgeNodeAttributes = {\n      width: edgeVariant?.widthSource === 'node'\n        ? (edgeVariant.widthNodeAttribute ?? NODE_SIZE_ATTRIBUTE)\n        : null,\n      opacity: edgeVariant?.opacitySource === 'node'\n        ? (edgeVariant.opacityNodeAttribute ?? NODE_SIZE_ATTRIBUTE)\n        : null,\n      endpointSize: edgeVariant?.endpointSizeSource === 'node'\n        ? (edgeVariant.endpointSizeNodeAttribute ?? NODE_SIZE_ATTRIBUTE)\n        : null,\n    };\n    const customEdgeNodeAttributes = {\n      width: edgeNodeAttributes.width && edgeNodeAttributes.width !== NODE_SIZE_ATTRIBUTE\n        ? edgeNodeAttributes.width\n        : null,\n      opacity: edgeNodeAttributes.opacity && edgeNodeAttributes.opacity !== NODE_SIZE_ATTRIBUTE\n        ? edgeNodeAttributes.opacity\n        : null,\n      endpointSize: edgeNodeAttributes.endpointSize && edgeNodeAttributes.endpointSize !== NODE_SIZE_ATTRIBUTE\n        ? edgeNodeAttributes.endpointSize\n        : null,\n    };\n    const usesDefaultNodeSize = Boolean(\n      (edgeNodeAttributes.width && edgeNodeAttributes.width === NODE_SIZE_ATTRIBUTE)\n      || (edgeNodeAttributes.opacity && edgeNodeAttributes.opacity === NODE_SIZE_ATTRIBUTE)\n      || (edgeNodeAttributes.endpointSize && edgeNodeAttributes.endpointSize === NODE_SIZE_ATTRIBUTE),\n    );\n\n    let topologyVersions = { node: 0, edge: 0 };\n    if (typeof network.getTopologyVersions === 'function') {\n      try {\n        topologyVersions = network.getTopologyVersions() ?? topologyVersions;\n      } catch (error) {\n        const fallbackVersion = nextFallbackVersion();\n        warnOnce(\n          this,\n          'webgl-topology-versions',\n          'AttributeTracker: failed to read topology versions for WebGL tracking; forcing cache refresh.',\n          { error },\n        );\n        topologyVersions = { node: fallbackVersion, edge: fallbackVersion };\n      }\n    }\n\n    const nodeIsIndex = this.isIndexAttribute(config.nodeAttribute);\n    const edgeIsIndex = this.isIndexAttribute(config.edgeAttribute);\n\n    return this.graphLayer.withSparseGraph(\n      network,\n      topologyVersions,\n      null,\n      customEdgeNodeAttributes,\n      (sparse) => {\n        if (!sparse) return null;\n        const { gl } = this;\n        const nodes = sparse.nodes ?? {};\n        const edges = sparse.edges ?? {};\n        const nodePositions = nodes.positions ?? null;\n        const delegateNodePositionTexture = nodes.positionTexture ?? null;\n        const delegateNodePositionTextureCount = Number.isFinite(nodes.positionTextureCount)\n          ? Math.max(0, Math.floor(Number(nodes.positionTextureCount)))\n          : 0;\n        const nodeSizes = nodes.sizes ?? null;\n        const nodeOutlineWidths = nodes.outlineWidths ?? null;\n        const nodeStates = nodes.states ?? null;\n        const nodeWidthSource = sparse.nodeEdgeSources?.width?.view ?? (usesDefaultNodeSize ? nodeSizes : null);\n        const nodeEndpointSizeSource = sparse.nodeEdgeSources?.endpointSize?.view\n          ?? (usesDefaultNodeSize ? nodeSizes : null);\n        const edgeEndpoints = edges.endpoints ?? null;\n        const edgeStates = edges.states ?? null;\n\n        const totalNodeCount = delegateNodePositionTextureCount || Math.floor((nodePositions?.length ?? 0) / 3);\n        const totalEdgeCount = Math.floor((edgeEndpoints?.length ?? 0) / 2);\n        const drawNodeCount = nodes.indices ? (nodes.indices.length ?? 0) : totalNodeCount;\n        const drawEdgeCount = edges.indices ? (edges.indices.length ?? 0) : totalEdgeCount;\n\n        if ((config.nodeAttribute || config.edgeAttribute) && drawNodeCount > 0 && !nodePositions && !delegateNodePositionTexture) {\n          throw new Error('AttributeTracker: indirect WebGL mode requires sparse node positions.');\n        }\n        if (config.edgeAttribute && drawEdgeCount > 0 && !edgeEndpoints) {\n          throw new Error('AttributeTracker: indirect WebGL mode requires sparse edge endpoints.');\n        }\n\n        const sharedResources = this.getSharedGraphResources();\n        const drawTextures = {\n          nodePositions: this.textures.nodePositions,\n          nodeSizes: this.textures.nodeSizes,\n          nodeOutlineWidths: this.textures.nodeOutlineWidths,\n          nodeStates: this.textures.nodeStates,\n          nodeEncoded: this.textures.nodeEncoded,\n          nodeTrackedFloat: this.textures.nodeTrackedFloat,\n          nodeTrackedInt: this.textures.nodeTrackedInt,\n          nodeTrackedUint: this.textures.nodeTrackedUint,\n          edgeEndpoints: this.textures.edgeEndpoints,\n          edgeStates: this.textures.edgeStates,\n          edgeWidths: this.textures.edgeWidths,\n          edgeEndpointSizes: this.textures.edgeEndpointSizes,\n          nodeWidthSource: this.textures.nodeWidthSource,\n          nodeEndpointSizeSource: this.textures.nodeEndpointSizeSource,\n          edgeEncoded: this.textures.edgeEncoded,\n          edgeTrackedFloat: this.textures.edgeTrackedFloat,\n          edgeTrackedInt: this.textures.edgeTrackedInt,\n          edgeTrackedUint: this.textures.edgeTrackedUint,\n        };\n\n        const nodePositionVersion = nodes.versions?.positions ?? 0;\n        const nodeSizeVersion = nodes.versions?.sizes ?? 0;\n        const nodeOutlineVersion = nodes.versions?.outlineWidths ?? 0;\n        const nodeStateVersion = nodes.versions?.states ?? 0;\n        const nodeWidthSourceVersion = sparse.nodeEdgeSources?.width?.version ?? nodeSizeVersion;\n        const nodeEndpointSizeSourceVersion = sparse.nodeEdgeSources?.endpointSize?.version ?? nodeSizeVersion;\n        const edgeEndpointsVersion = edges.versions?.endpoints ?? 0;\n        const edgeStateVersion = edges.versions?.states ?? 0;\n        const edgeWidthVersion = edges.versions?.widths ?? 0;\n        const edgeEndpointSizeVersion = edges.versions?.endpointSizes ?? 0;\n\n        if (totalNodeCount > 0) {\n          if (delegateNodePositionTexture) {\n            drawTextures.nodePositions = delegateNodePositionTexture;\n            this.textureMeta.nodePositions = null;\n          } else if (nodePositions) {\n            drawTextures.nodePositions = this.resolveSharedTexture({\n              slot: 'nodePositions',\n              localTexture: this.textures.nodePositions,\n              sharedResources,\n              sharedTextureKey: 'nodePositions',\n              sharedMetaKey: 'nodePositions',\n              view: nodePositions,\n              version: nodePositionVersion,\n              count: totalNodeCount,\n              upload: () => this.uploadFloatTexture(\n                'nodePositions',\n                this.textures.nodePositions,\n                nodePositions,\n                3,\n                totalNodeCount,\n                nodePositionVersion,\n              ),\n            });\n          }\n        }\n        if (totalNodeCount > 0 && nodeSizes) {\n          const sizeCount = nodeSizes.length ?? 0;\n          drawTextures.nodeSizes = this.resolveSharedTexture({\n            slot: 'nodeSizes',\n            localTexture: this.textures.nodeSizes,\n            sharedResources,\n            sharedTextureKey: 'nodeSizes',\n            sharedMetaKey: 'nodeSizes',\n            view: nodeSizes,\n            version: nodeSizeVersion,\n            count: sizeCount,\n            upload: () => this.uploadFloatTexture(\n              'nodeSizes',\n              this.textures.nodeSizes,\n              nodeSizes,\n              1,\n              sizeCount,\n              nodeSizeVersion,\n            ),\n          });\n        }\n        if (totalNodeCount > 0 && nodeOutlineWidths) {\n          const outlineCount = nodeOutlineWidths.length ?? 0;\n          drawTextures.nodeOutlineWidths = this.resolveSharedTexture({\n            slot: 'nodeOutlineWidths',\n            localTexture: this.textures.nodeOutlineWidths,\n            sharedResources,\n            sharedTextureKey: 'nodeOutlineWidths',\n            sharedMetaKey: 'nodeOutlineWidths',\n            view: nodeOutlineWidths,\n            version: nodeOutlineVersion,\n            count: outlineCount,\n            upload: () => this.uploadFloatTexture(\n              'nodeOutlineWidths',\n              this.textures.nodeOutlineWidths,\n              nodeOutlineWidths,\n              1,\n              outlineCount,\n              nodeOutlineVersion,\n            ),\n          });\n        }\n        if (totalNodeCount > 0 && nodeStates) {\n          const stateCount = nodeStates.length ?? 0;\n          drawTextures.nodeStates = this.resolveSharedTexture({\n            slot: 'nodeStates',\n            localTexture: this.textures.nodeStates,\n            sharedResources,\n            sharedTextureKey: 'nodeStates',\n            sharedMetaKey: 'nodeStates',\n            view: nodeStates,\n            version: nodeStateVersion,\n            count: stateCount,\n            upload: () => this.uploadUintTexture(\n              'nodeStates',\n              this.textures.nodeStates,\n              nodeStates,\n              1,\n              stateCount,\n              nodeStateVersion,\n            ),\n          });\n        }\n        if (totalNodeCount > 0 && nodeWidthSource) {\n          const sourceCount = nodeWidthSource.length ?? 0;\n          drawTextures.nodeWidthSource = this.resolveSharedTexture({\n            slot: 'nodeWidthSource',\n            localTexture: this.textures.nodeWidthSource,\n            sharedResources,\n            sharedTextureKey: 'nodeWidthSource',\n            sharedMetaKey: 'nodeEdgeWidths',\n            view: nodeWidthSource,\n            version: nodeWidthSourceVersion,\n            count: sourceCount,\n            upload: () => this.uploadFloatTexture(\n              'nodeWidthSource',\n              this.textures.nodeWidthSource,\n              nodeWidthSource,\n              1,\n              sourceCount,\n              nodeWidthSourceVersion,\n            ),\n          });\n        }\n        if (totalNodeCount > 0 && nodeEndpointSizeSource) {\n          const sourceCount = nodeEndpointSizeSource.length ?? 0;\n          drawTextures.nodeEndpointSizeSource = this.resolveSharedTexture({\n            slot: 'nodeEndpointSizeSource',\n            localTexture: this.textures.nodeEndpointSizeSource,\n            sharedResources,\n            sharedTextureKey: 'nodeEndpointSizeSource',\n            sharedMetaKey: 'nodeEdgeEndpointSizes',\n            view: nodeEndpointSizeSource,\n            version: nodeEndpointSizeSourceVersion,\n            count: sourceCount,\n            upload: () => this.uploadFloatTexture(\n              'nodeEndpointSizeSource',\n              this.textures.nodeEndpointSizeSource,\n              nodeEndpointSizeSource,\n              1,\n              sourceCount,\n              nodeEndpointSizeSourceVersion,\n            ),\n          });\n        }\n        if (totalEdgeCount > 0 && edgeEndpoints) {\n          drawTextures.edgeEndpoints = this.resolveSharedTexture({\n            slot: 'edgeEndpoints',\n            localTexture: this.textures.edgeEndpoints,\n            sharedResources,\n            sharedTextureKey: 'edgeEndpoints',\n            sharedMetaKey: 'edgeEndpoints',\n            view: edgeEndpoints,\n            version: edgeEndpointsVersion,\n            count: totalEdgeCount,\n            upload: () => this.uploadUintTexture(\n              'edgeEndpoints',\n              this.textures.edgeEndpoints,\n              edgeEndpoints,\n              2,\n              totalEdgeCount,\n              edgeEndpointsVersion,\n            ),\n          });\n        }\n        if (totalEdgeCount > 0 && edgeStates) {\n          const edgeStateCount = edgeStates.length ?? 0;\n          drawTextures.edgeStates = this.resolveSharedTexture({\n            slot: 'edgeStates',\n            localTexture: this.textures.edgeStates,\n            sharedResources,\n            sharedTextureKey: 'edgeStates',\n            sharedMetaKey: 'edgeStates',\n            view: edgeStates,\n            version: edgeStateVersion,\n            count: edgeStateCount,\n            upload: () => this.uploadUintTexture(\n              'edgeStates',\n              this.textures.edgeStates,\n              edgeStates,\n              1,\n              edgeStateCount,\n              edgeStateVersion,\n            ),\n          });\n        }\n        if (totalEdgeCount > 0 && edges.widths) {\n          const edgeWidthCount = Math.floor((edges.widths.length ?? 0) / 2);\n          drawTextures.edgeWidths = this.resolveSharedTexture({\n            slot: 'edgeWidths',\n            localTexture: this.textures.edgeWidths,\n            sharedResources,\n            sharedTextureKey: 'edgeWidths',\n            sharedMetaKey: 'edgeWidths',\n            view: edges.widths,\n            version: edgeWidthVersion,\n            count: edgeWidthCount,\n            upload: () => this.uploadFloatTexture(\n              'edgeWidths',\n              this.textures.edgeWidths,\n              edges.widths,\n              2,\n              edgeWidthCount,\n              edgeWidthVersion,\n            ),\n          });\n        }\n        if (totalEdgeCount > 0 && edges.endpointSizes) {\n          const edgeEndpointSizeCount = Math.floor((edges.endpointSizes.length ?? 0) / 2);\n          drawTextures.edgeEndpointSizes = this.resolveSharedTexture({\n            slot: 'edgeEndpointSizes',\n            localTexture: this.textures.edgeEndpointSizes,\n            sharedResources,\n            sharedTextureKey: 'edgeEndpointSizes',\n            sharedMetaKey: 'edgeEndpointSizes',\n            view: edges.endpointSizes,\n            version: edgeEndpointSizeVersion,\n            count: edgeEndpointSizeCount,\n            upload: () => this.uploadFloatTexture(\n              'edgeEndpointSizes',\n              this.textures.edgeEndpointSizes,\n              edges.endpointSizes,\n              2,\n              edgeEndpointSizeCount,\n              edgeEndpointSizeVersion,\n            ),\n          });\n        }\n\n        const nodeTracked = (!nodeIsIndex && config.nodeAttribute)\n          ? this.resolveTrackedAttributeDescriptor(network, 'node', config.nodeAttribute)\n          : null;\n        const edgeTracked = (!edgeIsIndex && config.edgeAttribute)\n          ? this.resolveTrackedAttributeDescriptor(network, 'edge', config.edgeAttribute)\n          : null;\n\n        let trackedNodeValueMode = TRACKED_VALUE_MODE.INDEX;\n        let trackedEdgeValueMode = TRACKED_VALUE_MODE.INDEX;\n\n        if (config.nodeAttribute && !nodeIsIndex) {\n          if (drawNodeCount > 0 && !nodeTracked) {\n            throw new Error(\n              `AttributeTracker: indirect WebGL tracking attribute \"${config.nodeAttribute}\" `\n              + 'must be a scalar Integer/UnsignedInteger/Category-style buffer.',\n            );\n          }\n          if (nodeTracked?.mode === TRACKED_VALUE_MODE.INT_TEXTURE) {\n            this.uploadTrackedIntTexture(\n              'nodeTrackedInt',\n              this.textures.nodeTrackedInt,\n              nodeTracked.view,\n              nodeTracked.count,\n              nodeTracked.version,\n            );\n            trackedNodeValueMode = TRACKED_VALUE_MODE.INT_TEXTURE;\n          } else if (nodeTracked?.mode === TRACKED_VALUE_MODE.UINT_TEXTURE) {\n            this.uploadTrackedUintTexture(\n              'nodeTrackedUint',\n              this.textures.nodeTrackedUint,\n              nodeTracked.view,\n              nodeTracked.count,\n              nodeTracked.version,\n            );\n            trackedNodeValueMode = TRACKED_VALUE_MODE.UINT_TEXTURE;\n          }\n        }\n\n        if (config.edgeAttribute && !edgeIsIndex) {\n          if (drawEdgeCount > 0 && !edgeTracked) {\n            throw new Error(\n              `AttributeTracker: indirect WebGL tracking attribute \"${config.edgeAttribute}\" `\n              + 'must be a scalar Integer/UnsignedInteger/Category-style buffer.',\n            );\n          }\n          if (edgeTracked?.mode === TRACKED_VALUE_MODE.INT_TEXTURE) {\n            this.uploadTrackedIntTexture(\n              'edgeTrackedInt',\n              this.textures.edgeTrackedInt,\n              edgeTracked.view,\n              edgeTracked.count,\n              edgeTracked.version,\n            );\n            trackedEdgeValueMode = TRACKED_VALUE_MODE.INT_TEXTURE;\n          } else if (edgeTracked?.mode === TRACKED_VALUE_MODE.UINT_TEXTURE) {\n            this.uploadTrackedUintTexture(\n              'edgeTrackedUint',\n              this.textures.edgeTrackedUint,\n              edgeTracked.view,\n              edgeTracked.count,\n              edgeTracked.version,\n            );\n            trackedEdgeValueMode = TRACKED_VALUE_MODE.UINT_TEXTURE;\n          }\n        }\n\n        const useNodeIdBuffer = Boolean(nodes.indices && drawNodeCount > 0);\n        const useEdgeIdBuffer = Boolean(edges.indices && drawEdgeCount > 0);\n        if (useNodeIdBuffer) {\n          this.uploadIdBuffer('nodeIds', this.nodeIdBuffer, nodes.indices, nodes.versions?.indices, drawNodeCount, nodes.indexDirtyRange);\n        }\n        if (useEdgeIdBuffer) {\n          this.uploadIdBuffer('edgeIds', this.edgeIdBuffer, edges.indices, edges.versions?.indices, drawEdgeCount, edges.indexDirtyRange);\n        }\n\n        const drawNodeArgs = {\n          useNodeIdBuffer,\n          useNodeSize: !nodeSizeUniform && Boolean(nodeSizes),\n          nodeSizeValue,\n          useNodeOutline: !nodeOutlineUniform && Boolean(nodeOutlineWidths),\n          nodeOutlineValue: nodeOutlineValue,\n          useEncodedTexture: trackedNodeValueMode === TRACKED_VALUE_MODE.ENCODED_TEXTURE,\n          trackedNodeValueMode,\n          hasNodeStates: Boolean(nodeStates),\n        };\n        const drawEdgeArgs = {\n          useEdgeIdBuffer,\n          useEncodedTexture: trackedEdgeValueMode === TRACKED_VALUE_MODE.ENCODED_TEXTURE,\n          trackedEdgeValueMode,\n          useQuads,\n          edgeWidthSource: edgeVariant?.widthSource ?? 'edge',\n          edgeWidthEndpoints: edgeVariant?.widthEndpoints ?? 'both',\n          edgeEndpointSizeSource: edgeVariant?.endpointSizeSource ?? 'edge',\n          edgeEndpointSizeEndpoints: edgeVariant?.endpointSizeEndpoints ?? 'both',\n          hasEdgeWidths: Boolean(edgeVariant?.widthBuffer && edgeVariant?.widthSource !== 'node' && edges.widths),\n          hasEdgeEndpointSizes: Boolean(\n            edgeVariant?.endpointSizeBuffer\n            && edgeVariant?.endpointSizeSource !== 'node'\n            && edges.endpointSizes,\n          ),\n          hasEdgeStates: Boolean(edgeStates),\n          hasNodeStates: Boolean(nodeStates),\n          hasNodeWidthSource: Boolean(nodeWidthSource),\n          hasNodeEndpointSizeSource: Boolean(nodeEndpointSizeSource),\n          defaultEdgeWidth,\n          defaultEdgeEndpointSize,\n        };\n\n        const setupNodeDraw = (program, uniforms) => {\n          gl.useProgram(program);\n          if (!this.setNodeUniforms(uniforms, cameraUniforms, drawNodeArgs)) return;\n          this.bindTexture(0, drawTextures.nodePositions);\n          this.bindTexture(1, drawTextures.nodeSizes);\n          this.bindTexture(9, drawTextures.nodeOutlineWidths);\n          this.bindTexture(13, drawTextures.nodeStates);\n          this.bindTexture(2, drawTextures.nodeEncoded);\n          this.bindTexture(10, drawTextures.nodeTrackedFloat);\n          this.bindTexture(11, drawTextures.nodeTrackedInt);\n          this.bindTexture(12, drawTextures.nodeTrackedUint);\n          gl.bindVertexArray(this.nodeVao);\n          gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, drawNodeCount);\n        };\n\n        const setupEdgeDraw = (program, uniforms) => {\n          gl.useProgram(program);\n          if (drawEdgeArgs.useQuads) {\n            this.setEdgeQuadUniforms(uniforms, cameraUniforms, drawEdgeArgs);\n          } else {\n            if (!this.setEdgeUniforms(uniforms, cameraUniforms, drawEdgeArgs)) return;\n          }\n          this.bindTexture(0, drawTextures.nodePositions);\n          this.bindTexture(3, drawTextures.edgeEndpoints);\n          this.bindTexture(4, drawTextures.edgeEncoded);\n          this.bindTexture(10, drawTextures.edgeTrackedFloat);\n          this.bindTexture(11, drawTextures.edgeTrackedInt);\n          this.bindTexture(12, drawTextures.edgeTrackedUint);\n          if (drawEdgeArgs.useQuads) {\n            this.bindTexture(5, drawTextures.edgeWidths);\n            this.bindTexture(6, drawTextures.edgeEndpointSizes);\n            this.bindTexture(7, drawTextures.nodeWidthSource);\n            this.bindTexture(8, drawTextures.nodeEndpointSizeSource);\n            this.bindTexture(13, drawTextures.edgeStates);\n            this.bindTexture(14, drawTextures.nodeStates);\n            gl.bindVertexArray(this.edgeQuadVao);\n            gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, drawEdgeCount);\n          } else {\n            gl.bindVertexArray(this.edgeVao);\n            gl.drawArraysInstanced(gl.LINES, 0, 2, drawEdgeCount);\n          }\n        };\n\n        gl.disable(gl.BLEND);\n        gl.enable(gl.DEPTH_TEST);\n        gl.depthMask(true);\n        gl.depthFunc(gl.LEQUAL);\n\n        const passes = [];\n\n        if (config.nodeAttribute && drawNodeCount > 0) {\n          passes.push(() => {\n            gl.bindFramebuffer(gl.FRAMEBUFFER, this.targets.node?.handle ?? null);\n            gl.drawBuffers?.([gl.COLOR_ATTACHMENT0]);\n            gl.readBuffer?.(gl.COLOR_ATTACHMENT0);\n            gl.viewport(0, 0, this.size.width, this.size.height);\n            gl.clearColor(0, 0, 0, 0);\n            gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n            setupNodeDraw(this.programs.node, this.uniforms.node);\n          });\n        }\n\n        if (config.edgeAttribute && drawEdgeCount > 0) {\n          passes.push(() => {\n            gl.bindFramebuffer(gl.FRAMEBUFFER, this.targets.edge?.handle ?? null);\n            gl.drawBuffers?.([gl.COLOR_ATTACHMENT0]);\n            gl.readBuffer?.(gl.COLOR_ATTACHMENT0);\n            gl.viewport(0, 0, this.size.width, this.size.height);\n            gl.clearColor(0, 0, 0, 0);\n            gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n            if (drawNodeCount > 0) {\n              setupNodeDraw(this.programs.nodeOcclusion, this.uniforms.nodeOcclusion);\n            }\n            setupEdgeDraw(\n              drawEdgeArgs.useQuads ? this.programs.edgeQuad : this.programs.edge,\n              drawEdgeArgs.useQuads ? this.uniforms.edgeQuad : this.uniforms.edge,\n            );\n          });\n        }\n\n        if (config.trackDepth) {\n          if (config.nodeAttribute && drawNodeCount > 0 && this.depthTargets.node) {\n            passes.push(() => {\n              gl.bindFramebuffer(gl.FRAMEBUFFER, this.depthTargets.node.handle);\n              gl.drawBuffers?.([gl.COLOR_ATTACHMENT0]);\n              gl.readBuffer?.(gl.COLOR_ATTACHMENT0);\n              gl.viewport(0, 0, this.size.width, this.size.height);\n              gl.clearColor(0, 0, 0, 0);\n              gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n              setupNodeDraw(this.programs.nodeDepth, this.uniforms.nodeDepth);\n            });\n          }\n          if (config.edgeAttribute && drawEdgeCount > 0 && this.depthTargets.edge) {\n            passes.push(() => {\n              gl.bindFramebuffer(gl.FRAMEBUFFER, this.depthTargets.edge.handle);\n              gl.drawBuffers?.([gl.COLOR_ATTACHMENT0]);\n              gl.readBuffer?.(gl.COLOR_ATTACHMENT0);\n              gl.viewport(0, 0, this.size.width, this.size.height);\n              gl.clearColor(0, 0, 0, 0);\n              gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n              if (drawNodeCount > 0) {\n                setupNodeDraw(this.programs.nodeDepth, this.uniforms.nodeDepth);\n              }\n              setupEdgeDraw(\n                drawEdgeArgs.useQuads ? this.programs.edgeQuadDepth : this.programs.edgeDepth,\n                drawEdgeArgs.useQuads ? this.uniforms.edgeQuadDepth : this.uniforms.edgeDepth,\n              );\n            });\n          }\n        }\n\n        passes.push(() => {\n          gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n          gl.bindVertexArray(null);\n          gl.enable(gl.BLEND);\n          gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n          gl.depthMask(true);\n          gl.enable(gl.DEPTH_TEST);\n          gl.depthFunc(gl.LEQUAL);\n        });\n\n        this.runner?.run?.(passes, { gl, device: this.device });\n        return { ...this.targets, depthTargets: this.depthTargets };\n      },\n    );\n  }\n\n  readDepth(target, x, y) {\n    if (!this.trackDepth || !this.depthReadSupported) return null;\n    if (!target?.depthTexture && !target?.depthRenderbuffer) return null;\n    const { gl } = this;\n    const type = target.depthType\n      ?? (target.depthFormat === gl.DEPTH_COMPONENT32F ? gl.FLOAT : gl.UNSIGNED_SHORT);\n    const pixel = type === gl.UNSIGNED_INT\n      ? new Uint32Array(1)\n      : (type === gl.UNSIGNED_SHORT ? new Uint16Array(1) : new Float32Array(1));\n    gl.bindFramebuffer(gl.FRAMEBUFFER, target.handle);\n    gl.getError();\n    try {\n      gl.readPixels(x, y, 1, 1, gl.DEPTH_COMPONENT, type, pixel);\n    } catch (error) {\n      console.warn('AttributeTracker: depth read failed', error);\n      gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n      return null;\n    }\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    const postErr = gl.getError();\n    if (postErr !== gl.NO_ERROR) {\n      const canTryFloat = target.depthFormat === gl.DEPTH_COMPONENT32F && type !== gl.FLOAT;\n      if (canTryFloat) {\n        return this.readDepth({ ...target, depthType: gl.FLOAT }, x, y);\n      }\n      console.warn('AttributeTracker: depth readPixels error', { postErr, type, depthFormat: target.depthFormat });\n      this.depthReadSupported = false;\n      return null;\n    }\n    let depth = pixel[0];\n    if (type === gl.UNSIGNED_INT || type === gl.UNSIGNED_SHORT) {\n      const bits = target.depthBits ?? this.depthBits ?? (type === gl.UNSIGNED_SHORT ? 16 : 24);\n      const maxVal = Math.max(1, (2 ** bits) - 1);\n      depth = depth / maxVal;\n    }\n    return Number.isFinite(depth) ? depth : null;\n  }\n}\n\nexport class WebGPUAttributeRenderer {\n  constructor(graphLayer, pool, runner) {\n    this.graphLayer = graphLayer;\n    this.pool = pool;\n    this.runner = runner;\n    this.device = null;\n    this.targetFormat = 'rgba8unorm';\n    this.depthColorFormat = 'rgba8unorm';\n    this.trackDepth = false;\n    this.nodePipeline = null;\n    this.nodeDepthPipeline = null;\n    this.edgePipeline = null;\n    this.edgeDepthPipeline = null;\n    this.edgeQuadPipeline = null;\n    this.edgeQuadDepthPipeline = null;\n    this.nodeBindGroupLayout = null;\n    this.edgeBindGroupLayout = null;\n    this.nodeIndirectBindGroupLayout = null;\n    this.nodeIndirectBindGroupLayouts = new Map();\n    this.edgeIndirectBindGroupLayout = null;\n    this.edgeIndirectBindGroupLayouts = new Map();\n    this.nodeBindGroup = null;\n    this.edgeBindGroup = null;\n\t    this.nodeBuffers = {};\n\t    this.edgeBuffers = {};\n\t    this.nodeCache = {};\n\t    this.edgeCache = {};\n    this._outlineFallback = null;\n    this._indirectPipelineCache = new Map();\n    this._zeroStorageBuffer = null;\n    this.cornerBuffer = null;\n    this.edgeCornerBuffer = null;\n    this.targets = { node: null, edge: null };\n    this.depthTargets = { node: null, edge: null };\n    this.size = null;\n    this.sparseEncodedReadyCache = { node: null, edge: null };\n  }\n\n  canUseR32UintTarget(gpu) {\n    if (!gpu) return false;\n    try {\n      const probe = gpu.createTexture({\n        size: { width: 1, height: 1, depthOrArrayLayers: 1 },\n        format: 'r32uint',\n        usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,\n      });\n      probe.destroy?.();\n      return true;\n    } catch (_) {\n      return false;\n    }\n  }\n\n  initialize(device) {\n    if (this.device) return;\n    if (!device || device.type !== 'webgpu') return;\n    this.device = device;\n    const sparseMode = isSparseGraphLayer(this.graphLayer);\n    if (sparseMode && this.canUseR32UintTarget(device.device)) {\n      this.targetFormat = 'r32uint';\n      this.depthColorFormat = 'rgba8unorm';\n    } else {\n      // Prefer a linear format for attribute targets so encoded indices round-trip without swizzling/gamma.\n      const preferredFormat = (device.format && !device.format.includes('srgb')) ? device.format : null;\n      this.targetFormat = preferredFormat && preferredFormat.startsWith('rgba') ? preferredFormat : 'rgba8unorm';\n      this.depthColorFormat = this.targetFormat;\n    }\n    const cache = device.resourceCache?.webgpu;\n    const quad = new Float32Array([\n      -1, -1,\n      1, -1,\n      -1, 1,\n      1, 1,\n    ]);\n    const cornerUsage = GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST;\n    if (cache) {\n      cache.ensureBuffer(device.device, 'attr:webgpu:corner', quad.byteLength, cornerUsage, 'AttributeTracker corner buffer');\n      cache.uploadBuffer(device.device, device.device.queue, 'attr:webgpu:corner', quad, {\n        label: 'AttributeTracker corner buffer',\n        version: 1,\n        topologyVersion: 0,\n        count: 4,\n        trackViewIdentity: true,\n      }, cornerUsage);\n      this.cornerBuffer = cache.buffers.get('attr:webgpu:corner')?.buffer ?? null;\n    } else {\n      this.cornerBuffer = device.device.createBuffer({\n        size: quad.byteLength,\n        usage: cornerUsage,\n        mappedAtCreation: true,\n      });\n      new Float32Array(this.cornerBuffer.getMappedRange()).set(quad);\n      this.cornerBuffer.unmap();\n    }\n\n    const edgeQuad = new Float32Array([\n      0, 1,\n      0, -1,\n      1, 1,\n      1, -1,\n    ]);\n    if (cache) {\n      cache.ensureBuffer(device.device, 'attr:webgpu:edgeCorner', edgeQuad.byteLength, cornerUsage, 'AttributeTracker edge corner buffer');\n      cache.uploadBuffer(device.device, device.device.queue, 'attr:webgpu:edgeCorner', edgeQuad, {\n        label: 'AttributeTracker edge corner buffer',\n        version: 1,\n        topologyVersion: 0,\n        count: 4,\n        trackViewIdentity: true,\n      }, cornerUsage);\n      this.edgeCornerBuffer = cache.buffers.get('attr:webgpu:edgeCorner')?.buffer ?? null;\n    } else {\n      this.edgeCornerBuffer = device.device.createBuffer({\n        size: edgeQuad.byteLength,\n        usage: cornerUsage,\n        mappedAtCreation: true,\n      });\n      new Float32Array(this.edgeCornerBuffer.getMappedRange()).set(edgeQuad);\n      this.edgeCornerBuffer.unmap();\n    }\n\n    this.nodeBindGroupLayout = device.device.createBindGroupLayout({\n      entries: [\n        { binding: 0, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n        { binding: 1, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n      ],\n    });\n    this.edgeBindGroupLayout = device.device.createBindGroupLayout({\n      entries: [\n        { binding: 0, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n        { binding: 1, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n      ],\n    });\n\n    this.nodeIndirectBindGroupLayouts = new Map();\n    this.edgeIndirectBindGroupLayouts = new Map();\n    this.nodeIndirectBindGroupLayout = this.resolveNodeIndirectBindGroupLayout({\n      nodeSizeUniform: true,\n      nodeOutlineUniform: true,\n      nodeTrackedMode: TRACKED_SOURCE_MODE.INDEX,\n      nodeStateBuffer: false,\n    })?.layout ?? null;\n    this.edgeIndirectBindGroupLayout = this.resolveEdgeIndirectBindGroupLayout({\n      edgeWidthUniform: true,\n      edgeEndpointSizeUniform: true,\n      edgeWidthSource: 'edge',\n      edgeEndpointSizeSource: 'edge',\n      edgeTrackedMode: TRACKED_SOURCE_MODE.INDEX,\n      nodeStateBuffer: false,\n      edgeStateBuffer: false,\n    })?.layout ?? null;\n\n    this._pipelineCache = new Map();\n    this._shaderModuleCache = new Map();\n    this._indirectPipelineCache = new Map();\n  }\n\n  composeNodeIndirectVariantKey({\n    nodeSizeUniform = false,\n    nodeOutlineUniform = false,\n    nodeTrackedMode = TRACKED_SOURCE_MODE.INDEX,\n    nodeStateBuffer = false,\n  } = {}) {\n    return [\n      nodeSizeUniform ? 'nSizeU' : 'nSizeB',\n      nodeOutlineUniform ? 'nOutU' : 'nOutB',\n      `nTrack:${nodeTrackedMode}`,\n      `nState:${nodeStateBuffer ? 1 : 0}`,\n    ].join(':');\n  }\n\n  resolveNodeIndirectBindGroupLayout(options = {}) {\n    const gpu = this.device?.device;\n    if (!gpu) return null;\n    const key = this.composeNodeIndirectVariantKey(options);\n    const cached = this.nodeIndirectBindGroupLayouts.get(key);\n    if (cached) return cached;\n\n    const bindingSlots = {\n      camera: 0,\n      globals: 1,\n      nodeIndices: 2,\n      nodePositions: 3,\n      nodeSizes: 4,\n      nodeOutlineWidths: 5,\n      nodeTrackedInt: 6,\n      nodeTrackedUint: 7,\n      nodeStates: 8,\n      track: 9,\n    };\n    const entries = [\n      { binding: bindingSlots.camera, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n      { binding: bindingSlots.globals, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n      { binding: bindingSlots.nodeIndices, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n      { binding: bindingSlots.nodePositions, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n      { binding: bindingSlots.track, visibility: GPUShaderStage.VERTEX, buffer: { type: 'uniform' } },\n    ];\n    const bindings = {\n      camera: bindingSlots.camera,\n      globals: bindingSlots.globals,\n      nodeIndices: bindingSlots.nodeIndices,\n      nodePositions: bindingSlots.nodePositions,\n      track: bindingSlots.track,\n    };\n    if (!options.nodeSizeUniform) {\n      entries.push({ binding: bindingSlots.nodeSizes, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } });\n      bindings.nodeSizes = bindingSlots.nodeSizes;\n    }\n    if (!options.nodeOutlineUniform) {\n      entries.push({ binding: bindingSlots.nodeOutlineWidths, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } });\n      bindings.nodeOutlineWidths = bindingSlots.nodeOutlineWidths;\n    }\n    if (options.nodeTrackedMode === TRACKED_SOURCE_MODE.INT) {\n      entries.push({ binding: bindingSlots.nodeTrackedInt, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } });\n      bindings.nodeTrackedInt = bindingSlots.nodeTrackedInt;\n    }\n    if (options.nodeTrackedMode === TRACKED_SOURCE_MODE.UINT) {\n      entries.push({ binding: bindingSlots.nodeTrackedUint, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } });\n      bindings.nodeTrackedUint = bindingSlots.nodeTrackedUint;\n    }\n    if (options.nodeStateBuffer === true) {\n      entries.push({ binding: bindingSlots.nodeStates, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } });\n      bindings.nodeStates = bindingSlots.nodeStates;\n    }\n\n    const result = {\n      key,\n      layout: gpu.createBindGroupLayout({ entries }),\n      bindings,\n      entries,\n      options: { ...options },\n    };\n    this.nodeIndirectBindGroupLayouts.set(key, result);\n    return result;\n  }\n\n  composeEdgeIndirectVariantKey({\n    edgeWidthUniform = false,\n    edgeEndpointSizeUniform = false,\n    edgeWidthSource = 'edge',\n    edgeEndpointSizeSource = 'edge',\n    edgeTrackedMode = TRACKED_SOURCE_MODE.INDEX,\n    nodeStateBuffer = false,\n    edgeStateBuffer = false,\n  } = {}) {\n    return [\n      edgeWidthUniform ? 'eWidthU' : `eWidthB:${edgeWidthSource}`,\n      edgeEndpointSizeUniform ? 'eEndU' : `eEndB:${edgeEndpointSizeSource}`,\n      `eTrack:${edgeTrackedMode}`,\n      `nState:${nodeStateBuffer ? 1 : 0}`,\n      `eState:${edgeStateBuffer ? 1 : 0}`,\n    ].join(':');\n  }\n\n  resolveEdgeIndirectBindGroupLayout(options = {}) {\n    const gpu = this.device?.device;\n    if (!gpu) return null;\n    const key = this.composeEdgeIndirectVariantKey(options);\n    const cached = this.edgeIndirectBindGroupLayouts.get(key);\n    if (cached) return cached;\n\n    const bindingSlots = {\n      camera: 0,\n      globals: 1,\n      edgeIndices: 2,\n      edgeEndpoints: 3,\n      nodePositions: 4,\n      edgeWidths: 5,\n      edgeEndpointSizes: 6,\n      nodeWidthSource: 7,\n      nodeEndpointSizeSource: 8,\n      edgeTrackedInt: 9,\n      edgeTrackedUint: 10,\n      nodeStates: 11,\n      edgeStates: 12,\n      track: 13,\n    };\n    const entries = [\n      { binding: bindingSlots.camera, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n      { binding: bindingSlots.globals, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n      { binding: bindingSlots.edgeIndices, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n      { binding: bindingSlots.edgeEndpoints, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n      { binding: bindingSlots.nodePositions, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n      { binding: bindingSlots.track, visibility: GPUShaderStage.VERTEX, buffer: { type: 'uniform' } },\n    ];\n    const bindings = {\n      camera: bindingSlots.camera,\n      globals: bindingSlots.globals,\n      edgeIndices: bindingSlots.edgeIndices,\n      edgeEndpoints: bindingSlots.edgeEndpoints,\n      nodePositions: bindingSlots.nodePositions,\n      track: bindingSlots.track,\n    };\n    if (!options.edgeWidthUniform) {\n      if (options.edgeWidthSource === 'node') {\n        entries.push({ binding: bindingSlots.nodeWidthSource, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } });\n        bindings.nodeWidthSource = bindingSlots.nodeWidthSource;\n      } else {\n        entries.push({ binding: bindingSlots.edgeWidths, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } });\n        bindings.edgeWidths = bindingSlots.edgeWidths;\n      }\n    }\n    if (!options.edgeEndpointSizeUniform) {\n      if (options.edgeEndpointSizeSource === 'node') {\n        entries.push({ binding: bindingSlots.nodeEndpointSizeSource, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } });\n        bindings.nodeEndpointSizeSource = bindingSlots.nodeEndpointSizeSource;\n      } else {\n        entries.push({ binding: bindingSlots.edgeEndpointSizes, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } });\n        bindings.edgeEndpointSizes = bindingSlots.edgeEndpointSizes;\n      }\n    }\n    if (options.edgeTrackedMode === TRACKED_SOURCE_MODE.INT) {\n      entries.push({ binding: bindingSlots.edgeTrackedInt, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } });\n      bindings.edgeTrackedInt = bindingSlots.edgeTrackedInt;\n    }\n    if (options.edgeTrackedMode === TRACKED_SOURCE_MODE.UINT) {\n      entries.push({ binding: bindingSlots.edgeTrackedUint, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } });\n      bindings.edgeTrackedUint = bindingSlots.edgeTrackedUint;\n    }\n    if (options.nodeStateBuffer === true) {\n      entries.push({ binding: bindingSlots.nodeStates, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } });\n      bindings.nodeStates = bindingSlots.nodeStates;\n    }\n    if (options.edgeStateBuffer === true) {\n      entries.push({ binding: bindingSlots.edgeStates, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } });\n      bindings.edgeStates = bindingSlots.edgeStates;\n    }\n\n    const result = {\n      key,\n      layout: gpu.createBindGroupLayout({ entries }),\n      bindings,\n      entries,\n      options: { ...options },\n    };\n    this.edgeIndirectBindGroupLayouts.set(key, result);\n    return result;\n  }\n\n  getPipelinesForVariant({\n    nodeSizeUniform,\n    nodeOutlineUniform,\n    edgeWidthUniform,\n    edgeEndpointSizeUniform,\n    nodeIndexEncodedRaw = false,\n    edgeIndexEncodedRaw = false,\n  } = {}) {\n    const gpu = this.device?.device;\n    if (!gpu) return null;\n\n    const key = [\n      nodeSizeUniform ? 'nSizeU' : 'nSizeB',\n      nodeOutlineUniform ? 'nOutU' : 'nOutB',\n      edgeWidthUniform ? 'eWidthU' : 'eWidthB',\n      edgeEndpointSizeUniform ? 'eEndU' : 'eEndB',\n      nodeIndexEncodedRaw ? 'nIdxRaw' : 'nIdxEnc',\n      edgeIndexEncodedRaw ? 'eIdxRaw' : 'eIdxEnc',\n      (this.graphLayer?.getEffectiveEdgeRenderingMode?.() ?? this.graphLayer?.edgeRenderingMode) === 'quad' ? 'quad' : 'line',\n      this.targetFormat,\n      this.depthColorFormat,\n      this.device?.depthFormat ?? 'depth24plus',\n    ].join(':');\n\n    if (this._pipelineCache?.has(key)) return this._pipelineCache.get(key);\n\n    const sources = createAttributeWebGPUSources({\n      node: {\n        size: nodeSizeUniform ? 'uniform' : 'buffer',\n        outline: nodeOutlineUniform ? 'uniform' : 'buffer',\n        indexEncodedRaw: nodeIndexEncodedRaw,\n      },\n      edge: {\n        width: edgeWidthUniform ? 'uniform' : 'buffer',\n        endpointSize: edgeEndpointSizeUniform ? 'uniform' : 'buffer',\n        indexEncodedRaw: edgeIndexEncodedRaw,\n      },\n      encodedOutputMode: this.targetFormat === 'r32uint' ? 'uint32' : 'rgba8',\n      encodedInputMode: this.targetFormat === 'r32uint' ? 'uint32' : 'u8x4',\n    });\n\n    const nodeModule = gpu.createShaderModule({ code: sources.nodeWGSL });\n    const edgeModule = gpu.createShaderModule({ code: sources.edgeWGSL });\n\n    const depthFormat = this.device?.depthFormat ?? 'depth24plus';\n\n    const nodeVertexBuffers = [\n      { arrayStride: 8, attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x2' }], stepMode: 'vertex' },\n      { arrayStride: 12, attributes: [{ shaderLocation: 1, offset: 0, format: 'float32x3' }], stepMode: 'instance' },\n      ...(!nodeSizeUniform ? [{ arrayStride: 4, attributes: [{ shaderLocation: 2, offset: 0, format: 'float32' }], stepMode: 'instance' }] : []),\n      { arrayStride: 4, attributes: [{ shaderLocation: 3, offset: 0, format: this.targetFormat === 'r32uint' ? 'uint32' : 'uint8x4' }], stepMode: 'instance' },\n      ...(!nodeOutlineUniform ? [{ arrayStride: 4, attributes: [{ shaderLocation: 4, offset: 0, format: 'float32' }], stepMode: 'instance' }] : []),\n    ];\n    const nodeSlots = [\n      'corner',\n      'position',\n      ...(!nodeSizeUniform ? ['size'] : []),\n      'encoded',\n      ...(!nodeOutlineUniform ? ['outline'] : []),\n    ];\n\n    const edgeLineVertexBuffers = [\n      {\n        arrayStride: 24,\n        attributes: [\n          { shaderLocation: 0, offset: 0, format: 'float32x3' },\n          { shaderLocation: 1, offset: 12, format: 'float32x3' },\n        ],\n        stepMode: 'instance',\n      },\n      ...(!edgeEndpointSizeUniform ? [{ arrayStride: 8, attributes: [{ shaderLocation: 3, offset: 0, format: 'float32x2' }], stepMode: 'instance' }] : []),\n      { arrayStride: 4, attributes: [{ shaderLocation: 4, offset: 0, format: this.targetFormat === 'r32uint' ? 'uint32' : 'uint8x4' }], stepMode: 'instance' },\n    ];\n    const edgeLineSlots = [\n      'segments',\n      ...(!edgeEndpointSizeUniform ? ['endpointSizes'] : []),\n      'encoded',\n    ];\n\n    const edgeQuadVertexBuffers = [\n      { arrayStride: 8, attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x2' }], stepMode: 'vertex' },\n      {\n        arrayStride: 24,\n        attributes: [\n          { shaderLocation: 1, offset: 0, format: 'float32x3' },\n          { shaderLocation: 2, offset: 12, format: 'float32x3' },\n        ],\n        stepMode: 'instance',\n      },\n      ...(!edgeWidthUniform ? [{ arrayStride: 8, attributes: [{ shaderLocation: 3, offset: 0, format: 'float32x2' }], stepMode: 'instance' }] : []),\n      ...(!edgeEndpointSizeUniform ? [{ arrayStride: 8, attributes: [{ shaderLocation: 4, offset: 0, format: 'float32x2' }], stepMode: 'instance' }] : []),\n      { arrayStride: 4, attributes: [{ shaderLocation: 5, offset: 0, format: this.targetFormat === 'r32uint' ? 'uint32' : 'uint8x4' }], stepMode: 'instance' },\n    ];\n    const edgeQuadSlots = [\n      'edgeCorner',\n      'segments',\n      ...(!edgeWidthUniform ? ['widths'] : []),\n      ...(!edgeEndpointSizeUniform ? ['endpointSizes'] : []),\n      'encoded',\n    ];\n\n    const nodeLayout = gpu.createPipelineLayout({ bindGroupLayouts: [this.nodeBindGroupLayout] });\n    const edgeLayout = gpu.createPipelineLayout({ bindGroupLayouts: [this.edgeBindGroupLayout] });\n\n    const nodePipeline = gpu.createRenderPipeline({\n      layout: nodeLayout,\n      vertex: { module: nodeModule, entryPoint: 'nodeVertex', buffers: nodeVertexBuffers },\n      fragment: { module: nodeModule, entryPoint: 'nodeFragment', targets: [{ format: this.targetFormat }] },\n      depthStencil: { format: depthFormat, depthWriteEnabled: true, depthCompare: 'less-equal' },\n      primitive: { topology: 'triangle-strip' },\n    });\n    const nodeDepthPipeline = gpu.createRenderPipeline({\n      layout: nodeLayout,\n      vertex: { module: nodeModule, entryPoint: 'nodeVertex', buffers: nodeVertexBuffers },\n      fragment: { module: nodeModule, entryPoint: 'nodeDepthFragment', targets: [{ format: this.depthColorFormat }] },\n      depthStencil: { format: depthFormat, depthWriteEnabled: true, depthCompare: 'less-equal' },\n      primitive: { topology: 'triangle-strip' },\n    });\n\n    const edgePipeline = gpu.createRenderPipeline({\n      layout: edgeLayout,\n      vertex: { module: edgeModule, entryPoint: 'edgeVertex', buffers: edgeLineVertexBuffers },\n      fragment: { module: edgeModule, entryPoint: 'edgeFragment', targets: [{ format: this.targetFormat }] },\n      depthStencil: { format: depthFormat, depthWriteEnabled: true, depthCompare: 'less-equal' },\n      primitive: { topology: 'line-list' },\n    });\n    const edgeDepthPipeline = gpu.createRenderPipeline({\n      layout: edgeLayout,\n      vertex: { module: edgeModule, entryPoint: 'edgeVertex', buffers: edgeLineVertexBuffers },\n      fragment: { module: edgeModule, entryPoint: 'edgeDepthFragment', targets: [{ format: this.depthColorFormat }] },\n      depthStencil: { format: depthFormat, depthWriteEnabled: true, depthCompare: 'less-equal' },\n      primitive: { topology: 'line-list' },\n    });\n\n    const edgeQuadPipeline = gpu.createRenderPipeline({\n      layout: edgeLayout,\n      vertex: { module: edgeModule, entryPoint: 'edgeQuadVertex', buffers: edgeQuadVertexBuffers },\n      fragment: { module: edgeModule, entryPoint: 'edgeFragment', targets: [{ format: this.targetFormat }] },\n      depthStencil: { format: depthFormat, depthWriteEnabled: true, depthCompare: 'less-equal' },\n      primitive: { topology: 'triangle-strip' },\n    });\n    const edgeQuadDepthPipeline = gpu.createRenderPipeline({\n      layout: edgeLayout,\n      vertex: { module: edgeModule, entryPoint: 'edgeQuadVertex', buffers: edgeQuadVertexBuffers },\n      fragment: { module: edgeModule, entryPoint: 'edgeDepthFragment', targets: [{ format: this.depthColorFormat }] },\n      depthStencil: { format: depthFormat, depthWriteEnabled: true, depthCompare: 'less-equal' },\n      primitive: { topology: 'triangle-strip' },\n    });\n\n    const entry = {\n      key,\n      nodePipeline,\n      nodeDepthPipeline,\n      edgePipeline,\n      edgeDepthPipeline,\n      edgeQuadPipeline,\n      edgeQuadDepthPipeline,\n      nodeSlots,\n      edgeLineSlots,\n      edgeQuadSlots,\n    };\n\n    this._pipelineCache?.set(key, entry);\n    return entry;\n  }\n\n  ensureZeroStorageBuffer() {\n    if (this._zeroStorageBuffer) return this._zeroStorageBuffer;\n    const gpu = this.device?.device;\n    const cache = this.device?.resourceCache?.webgpu;\n    const usage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX;\n    if (cache && gpu) {\n      const zero = new Uint32Array([0, 0, 0, 0]);\n      cache.ensureBuffer(gpu, 'attr:webgpu:zeroStorage', zero.byteLength, usage, 'AttributeTracker zero storage');\n      cache.uploadBuffer(gpu, gpu.queue, 'attr:webgpu:zeroStorage', zero, {\n        label: 'AttributeTracker zero storage',\n        version: 1,\n        topologyVersion: 0,\n        count: 1,\n        trackViewIdentity: false,\n      }, usage);\n      this._zeroStorageBuffer = cache.buffers.get('attr:webgpu:zeroStorage')?.buffer ?? null;\n      return this._zeroStorageBuffer;\n    }\n    if (!gpu) return null;\n    const buffer = gpu.createBuffer({\n      size: 16,\n      usage,\n      mappedAtCreation: true,\n    });\n    new Uint32Array(buffer.getMappedRange()).set([0, 0, 0, 0]);\n    buffer.unmap();\n    this._zeroStorageBuffer = buffer;\n    return this._zeroStorageBuffer;\n  }\n\n  getIndirectPipelinesForVariant({\n    nodeSizeUniform,\n    nodeOutlineUniform,\n    edgeWidthUniform,\n    edgeEndpointSizeUniform,\n    edgeWidthSource = 'edge',\n    edgeEndpointSizeSource = 'edge',\n    edgeWidthEndpoints = 0,\n    edgeEndpointSizeEndpoints = 0,\n    nodeTrackedMode = TRACKED_SOURCE_MODE.INDEX,\n    edgeTrackedMode = TRACKED_SOURCE_MODE.INDEX,\n    nodeStateBuffer = false,\n    edgeNodeStateBuffer = false,\n    edgeStateBuffer = false,\n  } = {}) {\n    const gpu = this.device?.device;\n    if (!gpu) return null;\n    const nodeBindingInfo = this.resolveNodeIndirectBindGroupLayout({\n      nodeSizeUniform,\n      nodeOutlineUniform,\n      nodeTrackedMode,\n      nodeStateBuffer,\n    });\n    const edgeBindingInfo = this.resolveEdgeIndirectBindGroupLayout({\n      edgeWidthUniform,\n      edgeEndpointSizeUniform,\n      edgeWidthSource,\n      edgeEndpointSizeSource,\n      edgeTrackedMode,\n      nodeStateBuffer: edgeNodeStateBuffer,\n      edgeStateBuffer,\n    });\n    const key = [\n      nodeBindingInfo?.key ?? this.composeNodeIndirectVariantKey({\n        nodeSizeUniform,\n        nodeOutlineUniform,\n        nodeTrackedMode,\n        nodeStateBuffer,\n      }),\n      edgeBindingInfo?.key ?? this.composeEdgeIndirectVariantKey({\n        edgeWidthUniform,\n        edgeEndpointSizeUniform,\n        edgeWidthSource,\n        edgeEndpointSizeSource,\n        edgeTrackedMode,\n        nodeStateBuffer: edgeNodeStateBuffer,\n        edgeStateBuffer,\n      }),\n      `eWend:${edgeWidthEndpoints}`,\n      `eEend:${edgeEndpointSizeEndpoints}`,\n      this.targetFormat,\n      this.depthColorFormat,\n      this.device?.depthFormat ?? 'depth24plus',\n    ].join(':');\n    if (this._indirectPipelineCache.has(key)) return this._indirectPipelineCache.get(key);\n\n    const sources = createAttributeWebGPUTrackSources({\n      node: {\n        size: nodeSizeUniform ? 'uniform' : 'buffer',\n        outline: nodeOutlineUniform ? 'uniform' : 'buffer',\n        trackedMode: nodeTrackedMode,\n        stateBuffer: nodeStateBuffer,\n      },\n      edge: {\n        width: edgeWidthUniform ? 'uniform' : 'buffer',\n        endpointSize: edgeEndpointSizeUniform ? 'uniform' : 'buffer',\n        widthSource: edgeWidthSource,\n        endpointSizeSource: edgeEndpointSizeSource,\n        widthEndpointsMode: edgeWidthEndpoints,\n        endpointSizeEndpointsMode: edgeEndpointSizeEndpoints,\n        trackedMode: edgeTrackedMode,\n        nodeStateBuffer: edgeNodeStateBuffer,\n        stateBuffer: edgeStateBuffer,\n      },\n      encodedOutputMode: this.targetFormat === 'r32uint' ? 'uint32' : 'rgba8',\n    });\n\n    const nodeModule = gpu.createShaderModule({ code: sources.nodeWGSL });\n    const edgeModule = gpu.createShaderModule({ code: sources.edgeWGSL });\n    const depthFormat = this.device?.depthFormat ?? 'depth24plus';\n\n    const nodeLayout = gpu.createPipelineLayout({ bindGroupLayouts: [nodeBindingInfo.layout] });\n    const edgeLayout = gpu.createPipelineLayout({ bindGroupLayouts: [edgeBindingInfo.layout] });\n\n    const nodeVertexBuffers = [\n      { arrayStride: 8, attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x2' }], stepMode: 'vertex' },\n    ];\n    const edgeQuadVertexBuffers = [\n      { arrayStride: 8, attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x2' }], stepMode: 'vertex' },\n    ];\n\n    const nodePipeline = gpu.createRenderPipeline({\n      layout: nodeLayout,\n      vertex: { module: nodeModule, entryPoint: 'nodeVertex', buffers: nodeVertexBuffers },\n      fragment: { module: nodeModule, entryPoint: 'nodeFragment', targets: [{ format: this.targetFormat }] },\n      depthStencil: { format: depthFormat, depthWriteEnabled: true, depthCompare: 'less-equal' },\n      primitive: { topology: 'triangle-strip' },\n    });\n    const nodeOcclusionPipeline = gpu.createRenderPipeline({\n      layout: nodeLayout,\n      vertex: { module: nodeModule, entryPoint: 'nodeVertex', buffers: nodeVertexBuffers },\n      fragment: { module: nodeModule, entryPoint: 'nodeOcclusionFragment', targets: [{ format: this.targetFormat }] },\n      depthStencil: { format: depthFormat, depthWriteEnabled: true, depthCompare: 'less-equal' },\n      primitive: { topology: 'triangle-strip' },\n    });\n    const nodeDepthPipeline = gpu.createRenderPipeline({\n      layout: nodeLayout,\n      vertex: { module: nodeModule, entryPoint: 'nodeVertex', buffers: nodeVertexBuffers },\n      fragment: { module: nodeModule, entryPoint: 'nodeDepthFragment', targets: [{ format: this.depthColorFormat }] },\n      depthStencil: { format: depthFormat, depthWriteEnabled: true, depthCompare: 'less-equal' },\n      primitive: { topology: 'triangle-strip' },\n    });\n\n    const edgePipeline = gpu.createRenderPipeline({\n      layout: edgeLayout,\n      vertex: { module: edgeModule, entryPoint: 'edgeVertex', buffers: [] },\n      fragment: { module: edgeModule, entryPoint: 'edgeFragment', targets: [{ format: this.targetFormat }] },\n      depthStencil: { format: depthFormat, depthWriteEnabled: true, depthCompare: 'less-equal' },\n      primitive: { topology: 'line-list' },\n    });\n    const edgeDepthPipeline = gpu.createRenderPipeline({\n      layout: edgeLayout,\n      vertex: { module: edgeModule, entryPoint: 'edgeVertex', buffers: [] },\n      fragment: { module: edgeModule, entryPoint: 'edgeDepthFragment', targets: [{ format: this.depthColorFormat }] },\n      depthStencil: { format: depthFormat, depthWriteEnabled: true, depthCompare: 'less-equal' },\n      primitive: { topology: 'line-list' },\n    });\n    const edgeQuadPipeline = gpu.createRenderPipeline({\n      layout: edgeLayout,\n      vertex: { module: edgeModule, entryPoint: 'edgeQuadVertex', buffers: edgeQuadVertexBuffers },\n      fragment: { module: edgeModule, entryPoint: 'edgeFragment', targets: [{ format: this.targetFormat }] },\n      depthStencil: { format: depthFormat, depthWriteEnabled: true, depthCompare: 'less-equal' },\n      primitive: { topology: 'triangle-strip' },\n    });\n    const edgeQuadDepthPipeline = gpu.createRenderPipeline({\n      layout: edgeLayout,\n      vertex: { module: edgeModule, entryPoint: 'edgeQuadVertex', buffers: edgeQuadVertexBuffers },\n      fragment: { module: edgeModule, entryPoint: 'edgeDepthFragment', targets: [{ format: this.depthColorFormat }] },\n      depthStencil: { format: depthFormat, depthWriteEnabled: true, depthCompare: 'less-equal' },\n      primitive: { topology: 'triangle-strip' },\n    });\n\n    const entry = {\n      key,\n      nodeBindGroupLayout: nodeBindingInfo.layout,\n      nodeBindings: nodeBindingInfo.bindings,\n      edgeBindGroupLayout: edgeBindingInfo.layout,\n      edgeBindings: edgeBindingInfo.bindings,\n      edgeTrackedMode,\n      nodeTrackedMode,\n      nodePipeline,\n      nodeOcclusionPipeline,\n      nodeDepthPipeline,\n      edgePipeline,\n      edgeDepthPipeline,\n      edgeQuadPipeline,\n      edgeQuadDepthPipeline,\n    };\n    this._indirectPipelineCache.set(key, entry);\n    return entry;\n  }\n\n\t  ensureVertexBuffer(map, key, requiredBytes) {\n\t    // Align to 256 bytes to avoid borderline validation issues on some WebGPU implementations\n\t    // when vertex buffers are exactly the minimum required size.\n\t    const aligned = Math.ceil(Math.max(4, requiredBytes) / 256) * 256;\n\t    const size = Math.max(256, aligned);\n\t    const current = map[key];\n\t    if (!current || size > current.size) {\n\t      if (current?.buffer) current.buffer.destroy();\n\t      else current?.destroy?.();\n\t      map[key] = {\n        buffer: this.device.device.createBuffer({ size, usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST }),\n        size,\n      };\n    }\n    return map[key];\n  }\n\n  uploadVertexBuffer(map, key, source) {\n    if (!source) return null;\n    const bytes = source.byteLength ?? (source.length * source.BYTES_PER_ELEMENT) ?? 0;\n    if (!bytes) return null;\n    const entry = this.ensureVertexBuffer(map, key, bytes);\n    this.device.device.queue.writeBuffer(entry.buffer, 0, source);\n    return entry.buffer;\n  }\n\n\t  uploadVertexBufferCached(map, key, source, cache, count, version = null) {\n\t    if (!source) return null;\n\t    const prev = cache[key];\n\t    const sameView = prev\n\t      && prev.buffer === source.buffer\n\t      && prev.byteOffset === source.byteOffset\n\t      && prev.byteLength === source.byteLength;\n\t    const sameCount = prev && prev.count === count;\n\t    const sameVersion = version == null || (prev && prev.version === version);\n\t    if (sameView && sameCount && sameVersion && map[key]?.buffer) {\n\t      return map[key].buffer;\n\t    }\n\t    const buffer = this.uploadVertexBuffer(map, key, source);\n\t    cache[key] = {\n\t      buffer: source.buffer,\n\t      byteOffset: source.byteOffset,\n\t      byteLength: source.byteLength,\n\t      count,\n\t      version,\n\t    };\n\t    return buffer;\n\t  }\n\n  getNodeOcclusionPipelinesForVariant({\n    nodeSizeUniform,\n    nodeOutlineUniform,\n  } = {}) {\n    const gpu = this.device?.device;\n    if (!gpu) return null;\n\n    const key = [\n      'nodeOcc',\n      nodeSizeUniform ? 'nSizeU' : 'nSizeB',\n      nodeOutlineUniform ? 'nOutU' : 'nOutB',\n      this.targetFormat,\n      this.depthColorFormat,\n      this.device?.depthFormat ?? 'depth24plus',\n    ].join(':');\n\n    this._pipelineCache ??= new Map();\n    if (this._pipelineCache.has(key)) return this._pipelineCache.get(key);\n\n    const sources = createAttributeWebGPUSources({\n      node: {\n        size: nodeSizeUniform ? 'uniform' : 'buffer',\n        outline: nodeOutlineUniform ? 'uniform' : 'buffer',\n        encoded: 'none',\n      },\n      edge: {\n        width: 'uniform',\n        endpointSize: 'uniform',\n      },\n      encodedOutputMode: this.targetFormat === 'r32uint' ? 'uint32' : 'rgba8',\n      encodedInputMode: this.targetFormat === 'r32uint' ? 'uint32' : 'u8x4',\n    });\n\n    const nodeModule = gpu.createShaderModule({ code: sources.nodeWGSL });\n    const depthFormat = this.device?.depthFormat ?? 'depth24plus';\n\n    const nodeVertexBuffers = [\n      { arrayStride: 8, attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x2' }], stepMode: 'vertex' },\n      { arrayStride: 12, attributes: [{ shaderLocation: 1, offset: 0, format: 'float32x3' }], stepMode: 'instance' },\n      ...(!nodeSizeUniform ? [{ arrayStride: 4, attributes: [{ shaderLocation: 2, offset: 0, format: 'float32' }], stepMode: 'instance' }] : []),\n      ...(!nodeOutlineUniform ? [{ arrayStride: 4, attributes: [{ shaderLocation: 4, offset: 0, format: 'float32' }], stepMode: 'instance' }] : []),\n    ];\n    const nodeSlots = [\n      'corner',\n      'position',\n      ...(!nodeSizeUniform ? ['size'] : []),\n      ...(!nodeOutlineUniform ? ['outline'] : []),\n    ];\n\n    const nodeLayout = gpu.createPipelineLayout({ bindGroupLayouts: [this.nodeBindGroupLayout] });\n    const nodePipeline = gpu.createRenderPipeline({\n      layout: nodeLayout,\n      vertex: { module: nodeModule, entryPoint: 'nodeVertex', buffers: nodeVertexBuffers },\n      fragment: { module: nodeModule, entryPoint: 'nodeFragment', targets: [{ format: this.targetFormat }] },\n      depthStencil: { format: depthFormat, depthWriteEnabled: true, depthCompare: 'less-equal' },\n      primitive: { topology: 'triangle-strip' },\n    });\n    const nodeDepthPipeline = gpu.createRenderPipeline({\n      layout: nodeLayout,\n      vertex: { module: nodeModule, entryPoint: 'nodeVertex', buffers: nodeVertexBuffers },\n      fragment: { module: nodeModule, entryPoint: 'nodeDepthFragment', targets: [{ format: this.depthColorFormat }] },\n      depthStencil: { format: depthFormat, depthWriteEnabled: true, depthCompare: 'less-equal' },\n      primitive: { topology: 'triangle-strip' },\n    });\n\n    const entry = {\n      key,\n      nodePipeline,\n      nodeDepthPipeline,\n      nodeSlots,\n    };\n    this._pipelineCache.set(key, entry);\n    return entry;\n  }\n\n  destroy() {\n    const shared = this.device?.resourceCache?.webgpu;\n    // Shared buffers are owned by the device cache.\n    if (!shared) {\n      const destroyEntry = (entry) => {\n        if (!entry) return;\n        if (entry.buffer) {\n          entry.buffer.destroy();\n        } else {\n          entry.destroy?.();\n        }\n      };\n      destroyEntry(this.cornerBuffer);\n      destroyEntry(this.edgeCornerBuffer);\n      Object.values(this.nodeBuffers).forEach(destroyEntry);\n      Object.values(this.edgeBuffers).forEach(destroyEntry);\n    }\n    this.cornerBuffer = null;\n    this.edgeCornerBuffer = null;\n    this._zeroStorageBuffer = null;\n    this._indirectPipelineCache?.clear?.();\n    this.depthTargets = { node: null, edge: null };\n  }\n\n  resize(size, scale, trackDepth) {\n    if (!size || !this.device) return;\n    const pixelRatio = size.devicePixelRatio ?? 1;\n    const width = Math.max(1, Math.floor((size.width ?? 1) * pixelRatio * scale));\n    const height = Math.max(1, Math.floor((size.height ?? 1) * pixelRatio * scale));\n    if (this.size && this.size.width === width && this.size.height === height && this.trackDepth === (trackDepth === true)) {\n      return;\n    }\n    this.size = { width, height };\n    this.trackDepth = trackDepth === true;\n    this.targets.node = this.pool.get(this.device, 'attr-node', width, height, {\n      depth: true,\n      filter: 'nearest',\n      format: this.targetFormat,\n    });\n    this.targets.edge = this.pool.get(this.device, 'attr-edge', width, height, {\n      depth: true,\n      filter: 'nearest',\n      format: this.targetFormat,\n    });\n    this.depthTargets.node = this.trackDepth\n      ? this.pool.get(this.device, 'attr-node-depth-color', width, height, {\n        depth: true,\n        filter: 'nearest',\n        format: this.depthColorFormat,\n      })\n      : null;\n    this.depthTargets.edge = this.trackDepth\n      ? this.pool.get(this.device, 'attr-edge-depth-color', width, height, {\n        depth: true,\n        filter: 'nearest',\n        format: this.depthColorFormat,\n      })\n      : null;\n  }\n\n  getIndirectEdgeSourceRequests(edgeVariant) {\n    if (!edgeVariant || typeof edgeVariant !== 'object') {\n      return { width: null, endpointSize: null };\n    }\n    const widthSource = edgeVariant.widthSource === 'node'\n      ? (edgeVariant.widthNodeAttribute ?? NODE_SIZE_ATTRIBUTE)\n      : null;\n    const endpointSizeSource = edgeVariant.endpointSizeSource === 'node'\n      ? (edgeVariant.endpointSizeNodeAttribute ?? NODE_SIZE_ATTRIBUTE)\n      : null;\n    return {\n      width: widthSource && widthSource !== NODE_SIZE_ATTRIBUTE ? widthSource : null,\n      endpointSize: endpointSizeSource && endpointSizeSource !== NODE_SIZE_ATTRIBUTE ? endpointSizeSource : null,\n    };\n  }\n\n  getSharedGraphResources() {\n    const provider = this.graphLayer?.getSharedSparseResources;\n    if (typeof provider !== 'function') return null;\n    try {\n      return provider.call(this.graphLayer);\n    } catch (error) {\n      warnOnce(\n        this,\n        'shared-sparse-resources:webgpu',\n        'AttributeTracker: shared sparse-resource provider failed for WebGPU tracking; using local fallback resources.',\n        { error },\n      );\n      return null;\n    }\n  }\n\n  resolveSharedWebGPUBuffer(sharedResources, candidate, uploadFallback) {\n    const key = candidate?.key;\n    if (key) {\n      const entry = sharedResources?.buffers?.[key] ?? null;\n      const vertexUsageBit = (typeof GPUBufferUsage !== 'undefined' && Number.isFinite(GPUBufferUsage?.VERTEX))\n        ? GPUBufferUsage.VERTEX\n        : 0;\n      const hasVertexUsage = (vertexUsageBit === 0 || entry?.usage == null)\n        ? true\n        : ((entry.usage & vertexUsageBit) !== 0);\n      const sameVersion = candidate?.version == null || entry?.version === candidate.version;\n      const sameTopology = candidate?.topologyVersion == null || entry?.topologyVersion === candidate.topologyVersion;\n      const sameCount = candidate?.count == null || entry?.count === candidate.count;\n      const sameByteLength = candidate?.byteLength == null || entry?.byteLength === candidate.byteLength;\n      if (entry?.buffer && hasVertexUsage && sameVersion && sameTopology && sameCount && sameByteLength) {\n        return entry.buffer;\n      }\n    }\n    return uploadFallback?.() ?? null;\n  }\n\n  buildIndirectPreparedGeometry(network, sparse, config, options = {}) {\n    const {\n      useQuads = true,\n      nodeSizeUniform = false,\n      nodeOutlineUniform = true,\n      edgeWidthUniform = false,\n      edgeEndpointSizeUniform = true,\n      edgeVariant = null,\n      useIntegerEncoding = this.targetFormat === 'r32uint',\n    } = options;\n\n    const nodeIndices = sparse?.nodes?.indices ?? null;\n    const edgeIndices = sparse?.edges?.indices ?? null;\n    const nodeCount = nodeIndices?.length ?? 0;\n    const edgeCount = edgeIndices?.length ?? 0;\n\n    const nodePositionsSelection = selectActiveValues(sparse?.nodes?.positions, nodeIndices, 3);\n    const nodePositions = nodePositionsSelection.view;\n    if (nodeCount && (!nodePositions || nodePositions.length !== nodeCount * 3)) {\n      throw new Error('AttributeTracker: indirect mode requires sparse node positions.');\n    }\n\n    const nodeSizesSelection = !nodeSizeUniform\n      ? selectActiveValues(sparse?.nodes?.sizes, nodeIndices, 1)\n      : null;\n    const nodeOutlineSelection = !nodeOutlineUniform\n      ? selectActiveValues(sparse?.nodes?.outlineWidths, nodeIndices, 1)\n      : null;\n    const nodeSizes = nodeSizesSelection?.view ?? null;\n    const nodeOutlineWidths = nodeOutlineSelection?.view ?? null;\n    if (!nodeSizeUniform && nodeCount && (!nodeSizes || nodeSizes.length !== nodeCount)) {\n      throw new Error('AttributeTracker: indirect mode requires sparse node sizes.');\n    }\n    if (!nodeOutlineUniform && nodeCount && (!nodeOutlineWidths || nodeOutlineWidths.length !== nodeCount)) {\n      throw new Error('AttributeTracker: indirect mode requires sparse node outline widths.');\n    }\n\n    const edgeSegments = (config.edgeAttribute && edgeCount)\n      ? packEdgeSegmentsFromSparse(sparse?.nodes?.positions, sparse?.edges?.endpoints, edgeIndices)\n      : null;\n    if (config.edgeAttribute && edgeCount && (!edgeSegments || edgeSegments.length !== edgeCount * 6)) {\n      throw new Error('AttributeTracker: indirect mode requires sparse edge endpoints and node positions.');\n    }\n\n    const widthFromNode = edgeVariant?.widthSource === 'node';\n    const endpointSizeFromNode = edgeVariant?.endpointSizeSource === 'node';\n    const widthEndpointsMode = normalizeNodeSourceEndpoints(edgeVariant?.widthEndpoints);\n    const endpointSizeEndpointsMode = normalizeNodeSourceEndpoints(edgeVariant?.endpointSizeEndpoints);\n\n    let edgeWidths = null;\n    let edgeWidthsDirect = false;\n    if (config.edgeAttribute && useQuads && !edgeWidthUniform) {\n      if (widthFromNode) {\n        const widthSource = sparse?.nodeEdgeSources?.width?.view ?? sparse?.nodes?.sizes;\n        edgeWidths = packNodeSourcedEdgePairs(widthSource, sparse?.edges?.endpoints, edgeIndices, widthEndpointsMode);\n      } else {\n        const widthSelection = selectActiveValues(sparse?.edges?.widths, edgeIndices, 2);\n        edgeWidths = widthSelection.view;\n        edgeWidthsDirect = widthSelection.direct;\n      }\n      if (edgeCount && (!edgeWidths || edgeWidths.length !== edgeCount * 2)) {\n        throw new Error('AttributeTracker: indirect mode requires edge widths (or node width source) for quad edges.');\n      }\n    }\n\n    let edgeEndpointSizes = null;\n    let edgeEndpointSizesDirect = false;\n    if (config.edgeAttribute && !edgeEndpointSizeUniform) {\n      if (endpointSizeFromNode) {\n        const endpointSource = sparse?.nodeEdgeSources?.endpointSize?.view ?? sparse?.nodes?.sizes;\n        edgeEndpointSizes = packNodeSourcedEdgePairs(\n          endpointSource,\n          sparse?.edges?.endpoints,\n          edgeIndices,\n          endpointSizeEndpointsMode,\n        );\n      } else {\n        const endpointSelection = selectActiveValues(sparse?.edges?.endpointSizes, edgeIndices, 2);\n        edgeEndpointSizes = endpointSelection.view;\n        edgeEndpointSizesDirect = endpointSelection.direct;\n      }\n      if (edgeCount && (!edgeEndpointSizes || edgeEndpointSizes.length !== edgeCount * 2)) {\n        throw new Error('AttributeTracker: indirect mode requires edge endpoint sizes.');\n      }\n    }\n\n    const nodeAttrName = config.nodeAttribute;\n    const edgeAttrName = config.edgeAttribute;\n    const nodeIsIndex = nodeAttrName === INDEX_SENTINEL || nodeAttrName === 'index' || nodeAttrName === '$index';\n    const edgeIsIndex = edgeAttrName === INDEX_SENTINEL || edgeAttrName === 'index' || edgeAttrName === '$index';\n    const sparseNodeEncoded = useIntegerEncoding ? null : getSparseEncodedDesc(network, 'node', nodeAttrName);\n    const sparseEdgeEncoded = useIntegerEncoding ? null : getSparseEncodedDesc(network, 'edge', edgeAttrName);\n\n    const nodeAttr = (nodeAttrName && nodeAttrName !== INDEX_SENTINEL && nodeAttrName !== 'index')\n      ? safeGetAttributeBuffer(network, 'node', nodeAttrName)\n      : null;\n    const edgeAttr = (edgeAttrName && edgeAttrName !== INDEX_SENTINEL && edgeAttrName !== 'index')\n      ? safeGetAttributeBuffer(network, 'edge', edgeAttrName)\n      : null;\n\n    if (nodeAttrName && nodeAttrName !== INDEX_SENTINEL && nodeAttrName !== 'index' && nodeCount && !nodeAttr?.view && !sparseNodeEncoded?.view) {\n      throw new Error(`AttributeTracker: missing sparse node attribute \"${nodeAttrName}\" for indirect tracking.`);\n    }\n    if (edgeAttrName && edgeAttrName !== INDEX_SENTINEL && edgeAttrName !== 'index' && edgeCount && !edgeAttr?.view && !sparseEdgeEncoded?.view) {\n      throw new Error(`AttributeTracker: missing sparse edge attribute \"${edgeAttrName}\" for indirect tracking.`);\n    }\n    if (nodeAttrName && nodeAttrName !== INDEX_SENTINEL && nodeAttrName !== 'index' && nodeCount) {\n      if (!isSupportedTrackedIntegerBuffer(nodeAttr)) {\n        throw new Error(\n          `AttributeTracker: indirect WebGPU tracking attribute \"${nodeAttrName}\" `\n          + 'must be a scalar Integer/UnsignedInteger/Category-style buffer.',\n        );\n      }\n    }\n    if (edgeAttrName && edgeAttrName !== INDEX_SENTINEL && edgeAttrName !== 'index' && edgeCount) {\n      if (!isSupportedTrackedIntegerBuffer(edgeAttr)) {\n        throw new Error(\n          `AttributeTracker: indirect WebGPU tracking attribute \"${edgeAttrName}\" `\n          + 'must be a scalar Integer/UnsignedInteger/Category-style buffer.',\n        );\n      }\n    }\n\n    const nodeEncodedFromSparse = useIntegerEncoding ? null : packActiveEncodedValues(sparseNodeEncoded, nodeIndices);\n    const edgeEncodedFromSparse = useIntegerEncoding ? null : packActiveEncodedValues(sparseEdgeEncoded, edgeIndices);\n\n    const nodeEncodedRawIndex = Boolean(useIntegerEncoding && nodeIsIndex && nodeIndices);\n    const edgeEncodedRawIndex = Boolean(useIntegerEncoding && edgeIsIndex && edgeIndices);\n\n    const nodeEncodedView = nodeEncodedRawIndex\n      ? nodeIndices\n      : (\n        useIntegerEncoding\n          ? encodeActiveValuesUint32(nodeAttrName, nodeAttr?.view ?? null, nodeIndices)\n          : (nodeEncodedFromSparse ?? encodeActiveValues(nodeAttrName, nodeAttr?.view ?? null, nodeIndices))\n      );\n    const edgeEncodedView = edgeEncodedRawIndex\n      ? edgeIndices\n      : (\n        useIntegerEncoding\n          ? encodeActiveValuesUint32(edgeAttrName, edgeAttr?.view ?? null, edgeIndices)\n          : (edgeEncodedFromSparse ?? encodeActiveValues(edgeAttrName, edgeAttr?.view ?? null, edgeIndices))\n      );\n\n    const nodeTopologyVersion = sparse?.nodes?.versions?.topology ?? 0;\n    const edgeTopologyVersion = sparse?.edges?.versions?.topology ?? 0;\n    const nodeWidthVersion = sparse?.nodeEdgeSources?.width?.version ?? sparse?.nodes?.versions?.sizes ?? 0;\n    const nodeEndpointSizeVersion = sparse?.nodeEdgeSources?.endpointSize?.version ?? sparse?.nodes?.versions?.sizes ?? 0;\n    const edgeSegmentVersion = mixVersions(\n      sparse?.edges?.versions?.endpoints ?? 0,\n      sparse?.nodes?.versions?.positions ?? 0,\n    );\n    const nodePositionVersion = sparse?.nodes?.versions?.positions ?? 0;\n    const nodeSizeVersion = sparse?.nodes?.versions?.sizes ?? 0;\n    const nodeOutlineVersion = sparse?.nodes?.versions?.outlineWidths ?? 0;\n    const edgeWidthVersion = sparse?.edges?.versions?.widths ?? 0;\n    const edgeEndpointSizeVersion = sparse?.edges?.versions?.endpointSizes ?? 0;\n\n    const geometry = {\n      nodes: {\n        positions: nodePositions,\n        sizes: nodeSizes,\n        outlineWidths: nodeOutlineWidths,\n        count: nodeCount,\n        versions: {\n          positions: sparse?.nodes?.versions?.positions ?? 0,\n          sizes: sparse?.nodes?.versions?.sizes ?? 0,\n          outlineWidths: sparse?.nodes?.versions?.outlineWidths ?? 0,\n          topology: nodeTopologyVersion,\n        },\n      },\n      edges: {\n        segments: edgeSegments,\n        widths: edgeWidths,\n        endpointSizes: edgeEndpointSizes,\n        count: edgeCount,\n        versions: {\n          segments: edgeSegmentVersion,\n          widths: widthFromNode ? nodeWidthVersion : (sparse?.edges?.versions?.widths ?? 0),\n          endpointSizes: endpointSizeFromNode ? nodeEndpointSizeVersion : (sparse?.edges?.versions?.endpointSizes ?? 0),\n          topology: edgeTopologyVersion,\n        },\n      },\n    };\n\n    const encoded = {\n      nodeEncoded: nodeEncodedView\n        ? {\n          view: nodeEncodedView,\n          version: nodeEncodedRawIndex\n            ? (sparse?.nodes?.versions?.indices ?? nodeTopologyVersion)\n            : mixVersions(\n              sparseNodeEncoded?.version ?? nodeAttr?.version ?? nodeTopologyVersion,\n              nodeTopologyVersion,\n            ),\n          rawIndex: nodeEncodedRawIndex,\n        }\n        : null,\n      edgeEncoded: edgeEncodedView\n        ? {\n          view: edgeEncodedView,\n          version: edgeEncodedRawIndex\n            ? (sparse?.edges?.versions?.indices ?? edgeTopologyVersion)\n            : mixVersions(\n              sparseEdgeEncoded?.version ?? edgeAttr?.version ?? edgeTopologyVersion,\n              edgeTopologyVersion,\n            ),\n          rawIndex: edgeEncodedRawIndex,\n        }\n        : null,\n    };\n\n    const shared = {\n      nodePositions: nodePositionsSelection.direct\n        ? {\n          key: 'indirect:node:positions',\n          version: nodePositionVersion,\n          topologyVersion: nodeTopologyVersion,\n          count: nodeCount,\n          byteLength: nodePositions?.byteLength ?? 0,\n        }\n        : null,\n      nodeSizes: nodeSizesSelection?.direct\n        ? {\n          key: 'indirect:node:sizes',\n          version: nodeSizeVersion,\n          topologyVersion: nodeTopologyVersion,\n          count: nodeCount,\n          byteLength: nodeSizes?.byteLength ?? 0,\n        }\n        : null,\n      nodeOutlineWidths: nodeOutlineSelection?.direct\n        ? {\n          key: 'indirect:node:outlineWidths',\n          version: nodeOutlineVersion,\n          topologyVersion: nodeTopologyVersion,\n          count: nodeCount,\n          byteLength: nodeOutlineWidths?.byteLength ?? 0,\n        }\n        : null,\n      nodeIndices: nodeEncodedRawIndex\n        ? {\n          key: 'indirect:node:indices',\n          version: sparse?.nodes?.versions?.indices ?? nodeTopologyVersion,\n          topologyVersion: nodeTopologyVersion,\n          count: nodeCount,\n          byteLength: nodeIndices?.byteLength ?? 0,\n        }\n        : null,\n      edgeWidths: (edgeWidthsDirect && !widthFromNode)\n        ? {\n          key: 'indirect:edge:widths',\n          version: edgeWidthVersion,\n          topologyVersion: edgeTopologyVersion,\n          count: edgeCount,\n          byteLength: edgeWidths?.byteLength ?? 0,\n        }\n        : null,\n      edgeEndpointSizes: (edgeEndpointSizesDirect && !endpointSizeFromNode)\n        ? {\n          key: 'indirect:edge:endpointSizes',\n          version: edgeEndpointSizeVersion,\n          topologyVersion: edgeTopologyVersion,\n          count: edgeCount,\n          byteLength: edgeEndpointSizes?.byteLength ?? 0,\n        }\n        : null,\n      edgeIndices: edgeEncodedRawIndex\n        ? {\n          key: 'indirect:edge:indices',\n          version: sparse?.edges?.versions?.indices ?? edgeTopologyVersion,\n          topologyVersion: edgeTopologyVersion,\n          count: edgeCount,\n          byteLength: edgeIndices?.byteLength ?? 0,\n        }\n        : null,\n    };\n\n    return { geometry, encoded, shared };\n  }\n\n  renderPreparedGeometry(geometry, encoded, config, options = {}) {\n    if (!geometry) return null;\n    const {\n      size,\n      cameraUniforms,\n      useQuads,\n      nodeSizeUniform,\n      nodeOutlineUniform,\n      edgeWidthUniform,\n      edgeEndpointSizeUniform,\n      nodeCfg,\n      edgeCfg,\n      sharedCandidates = null,\n    } = options;\n\n    const nodeSizes = (!nodeSizeUniform) ? geometry.nodes.sizes : null;\n    const nodeOutlineWidths = (!nodeOutlineUniform) ? geometry.nodes.outlineWidths : null;\n    const edgeWidths = (useQuads && !edgeWidthUniform) ? geometry.edges.widths : null;\n    const edgeEndpointSizes = (!edgeEndpointSizeUniform) ? geometry.edges.endpointSizes : null;\n\n    const gpu = this.device.device;\n\n    const pipelines = this.getPipelinesForVariant({\n      nodeSizeUniform,\n      nodeOutlineUniform,\n      edgeWidthUniform,\n      edgeEndpointSizeUniform,\n      nodeIndexEncodedRaw: encoded.nodeEncoded?.rawIndex === true,\n      edgeIndexEncodedRaw: encoded.edgeEncoded?.rawIndex === true,\n    });\n    if (!pipelines) return null;\n\n    const occlusionPipelines = this.getNodeOcclusionPipelinesForVariant({\n      nodeSizeUniform,\n      nodeOutlineUniform,\n    });\n    const is2D = cameraUniforms.mode === '2d';\n    const zoom2D = is2D ? Math.max(1e-3, cameraUniforms.view?.[0] ?? 1) : 1;\n    const semanticZoomExponent = Number.isFinite(this.graphLayer?.semanticZoomExponent)\n      ? this.graphLayer.semanticZoomExponent\n      : 0;\n    const edgeWidthFactor = is2D ? (zoom2D / EDGE_WIDTH_SCALE_MULTIPLIER_GLOBAL) : 1.0;\n    const edgeWidthBase = this.graphLayer.edgeWidthBase * EDGE_WIDTH_SCALE_MULTIPLIER_GLOBAL * edgeWidthFactor;\n    const edgeWidthScale = this.graphLayer.edgeWidthScale * EDGE_WIDTH_SCALE_MULTIPLIER_GLOBAL * edgeWidthFactor;\n\n    const cameraBuffer = gpu.createBuffer({\n      size: 48 * 4,\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n      mappedAtCreation: true,\n    });\n    const cameraArray = new Float32Array(cameraBuffer.getMappedRange());\n    cameraArray.set(cameraUniforms.viewProjection, 0);\n    cameraArray.set(cameraUniforms.view, 16);\n    cameraArray.set(cameraUniforms.position ?? [0, 0, 0], 32);\n    cameraArray[35] = is2D ? 1 : 0;\n    cameraArray.set(cameraUniforms.up ?? [0, 1, 0], 36);\n    cameraArray.set(cameraUniforms.right ?? [1, 0, 0], 40);\n    const viewportWidth = cameraUniforms.viewport?.width ?? size.width ?? 1;\n    const viewportHeight = cameraUniforms.viewport?.height ?? size.height ?? 1;\n    const pixelRatio = cameraUniforms.viewport?.devicePixelRatio ?? size.devicePixelRatio ?? 1;\n    const drawWidth = viewportWidth * pixelRatio;\n    const drawHeight = viewportHeight * pixelRatio;\n    cameraArray[44] = drawWidth;\n    cameraArray[45] = drawHeight;\n    cameraArray[46] = drawWidth > 0 ? 1 / drawWidth : 0;\n    cameraArray[47] = drawHeight > 0 ? 1 / drawHeight : 0;\n    cameraBuffer.unmap();\n\n    const globalsBuffer = gpu.createBuffer({\n      size: 24 * 4,\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n      mappedAtCreation: true,\n    });\n    const globalsArray = new Float32Array(globalsBuffer.getMappedRange());\n    globalsArray[0] = this.graphLayer.nodeOpacityBase;\n    globalsArray[1] = this.graphLayer.nodeOpacityScale;\n    globalsArray[2] = this.graphLayer.nodeSizeBase;\n    globalsArray[3] = this.graphLayer.nodeSizeScale;\n    globalsArray[4] = this.graphLayer.nodeOutlineWidthBase;\n    globalsArray[5] = this.graphLayer.nodeOutlineWidthScale;\n    globalsArray[6] = this.graphLayer.edgeOpacityBase;\n    globalsArray[7] = this.graphLayer.edgeOpacityScale;\n    globalsArray[8] = edgeWidthBase;\n    globalsArray[9] = edgeWidthScale;\n    globalsArray[10] = nodeSizeUniform ? Number(nodeCfg?.size?.value ?? 0) : 0;\n    globalsArray[11] = nodeOutlineUniform ? Number(nodeCfg?.outline?.value ?? 0) : 0;\n    globalsArray[12] = this.graphLayer.nodeOutlineColor?.[0] ?? 0;\n    globalsArray[13] = this.graphLayer.nodeOutlineColor?.[1] ?? 0;\n    globalsArray[14] = this.graphLayer.nodeOutlineColor?.[2] ?? 0;\n    globalsArray[15] = this.graphLayer.nodeOutlineColor?.[3] ?? 1;\n    globalsArray[16] = this.graphLayer.edgeEndpointTrim;\n    globalsArray[17] = semanticZoomExponent;\n    const edgeWidthPair = edgeCfg?.width?.value;\n    globalsArray[18] = edgeWidthUniform ? Number(edgeWidthPair?.[0] ?? 1) : 1;\n    globalsArray[19] = edgeWidthUniform ? Number(edgeWidthPair?.[1] ?? 1) : 1;\n    const edgeEndpointPair = edgeCfg?.endpointSize?.value;\n    globalsArray[20] = edgeEndpointSizeUniform ? Number(edgeEndpointPair?.[0] ?? 1) : 1;\n    globalsArray[21] = edgeEndpointSizeUniform ? Number(edgeEndpointPair?.[1] ?? 1) : 1;\n    globalsArray[22] = 0;\n    globalsArray[23] = 0;\n    globalsBuffer.unmap();\n\n    this.nodeBindGroup = gpu.createBindGroup({\n      layout: this.nodeBindGroupLayout,\n      entries: [\n        { binding: 0, resource: { buffer: cameraBuffer } },\n        { binding: 1, resource: { buffer: globalsBuffer } },\n      ],\n    });\n    this.edgeBindGroup = geometry.edges.count\n      ? gpu.createBindGroup({\n        layout: this.edgeBindGroupLayout,\n        entries: [\n          { binding: 0, resource: { buffer: cameraBuffer } },\n          { binding: 1, resource: { buffer: globalsBuffer } },\n        ],\n      })\n      : null;\n\n    const encoder = gpu.createCommandEncoder();\n    const passes = [];\n\n    const resourceCache = this.device?.resourceCache?.webgpu;\n    const sharedResources = this.getSharedGraphResources();\n    const vertexUsage = GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST;\n    const uploadVertex = (key, source, meta) => {\n      if (!resourceCache || !source) return null;\n      return resourceCache.uploadBuffer(gpu, gpu.queue, key, source, { ...meta, trackViewIdentity: true }, vertexUsage);\n    };\n\n    const bindVertexSlots = (pass, slots, buffersBySlot) => {\n      for (let i = 0; i < slots.length; i += 1) {\n        const slot = slots[i];\n        const buf = buffersBySlot[slot];\n        if (!buf) return false;\n        pass.setVertexBuffer(i, buf);\n      }\n      return true;\n    };\n\n    const nodePositionBuffer = geometry.nodes.count\n      ? this.resolveSharedWebGPUBuffer(\n        sharedResources,\n        sharedCandidates?.nodePositions ?? null,\n        () => uploadVertex('attr:webgpu:node:positions', geometry.nodes.positions, {\n          label: 'AttributeTracker node positions',\n          version: geometry.nodes.versions?.positions ?? 0,\n          topologyVersion: geometry.nodes.versions?.topology ?? 0,\n          count: geometry.nodes.count,\n        }),\n      )\n      : null;\n\n    const needNodeSize = pipelines.nodeSlots.includes('size');\n    const needNodeOutline = pipelines.nodeSlots.includes('outline');\n\n    const nodeSizeBuffer = (geometry.nodes.count && needNodeSize)\n      ? this.resolveSharedWebGPUBuffer(\n        sharedResources,\n        sharedCandidates?.nodeSizes ?? null,\n        () => uploadVertex('attr:webgpu:node:sizes', nodeSizes, {\n          label: 'AttributeTracker node sizes',\n          version: geometry.nodes.versions?.sizes ?? 0,\n          topologyVersion: geometry.nodes.versions?.topology ?? 0,\n          count: geometry.nodes.count,\n        }),\n      )\n      : null;\n\n    const nodeOutlineBuffer = (geometry.nodes.count && needNodeOutline)\n      ? this.resolveSharedWebGPUBuffer(\n        sharedResources,\n        sharedCandidates?.nodeOutlineWidths ?? null,\n        () => uploadVertex('attr:webgpu:node:outlineWidths', nodeOutlineWidths, {\n          label: 'AttributeTracker node outline widths',\n          version: geometry.nodes.versions?.outlineWidths ?? 0,\n          topologyVersion: geometry.nodes.versions?.topology ?? 0,\n          count: geometry.nodes.count,\n        }),\n      )\n      : null;\n\n    if (needNodeSize && (!nodeSizes || nodeSizes.length !== geometry.nodes.count)) {\n      throw new Error('AttributeTracker: expected node sizes buffer but it was missing or wrong length');\n    }\n    if (needNodeOutline && (!nodeOutlineWidths || nodeOutlineWidths.length !== geometry.nodes.count)) {\n      throw new Error('AttributeTracker: expected node outlineWidths buffer but it was missing or wrong length');\n    }\n    const nodeEncodedBuffer = (geometry.nodes.count && encoded.nodeEncoded?.view && config.nodeAttribute)\n      ? this.resolveSharedWebGPUBuffer(\n        sharedResources,\n        encoded.nodeEncoded?.rawIndex ? (sharedCandidates?.nodeIndices ?? null) : null,\n        () => resourceCache?.uploadBuffer(\n          gpu,\n          gpu.queue,\n          `attr:webgpu:node:encoded:${config.nodeAttribute || 'index'}`,\n          encoded.nodeEncoded.view,\n          {\n            label: 'AttributeTracker node encoded',\n            version: encoded.nodeEncoded.version ?? 0,\n            topologyVersion: 0,\n            count: geometry.nodes.count,\n            trackViewIdentity: encoded.nodeEncoded?.rawIndex === true,\n          },\n          vertexUsage,\n        ),\n      )\n      : null;\n\n    const edgeSegmentsBuffer = (geometry.edges.count && config.edgeAttribute)\n      ? uploadVertex('attr:webgpu:edge:segments', geometry.edges.segments, {\n        label: 'AttributeTracker edge segments',\n        version: geometry.edges.versions?.segments ?? 0,\n        topologyVersion: geometry.edges.versions?.topology ?? 0,\n        count: geometry.edges.count,\n      })\n      : null;\n\n    const edgeSlots = config.edgeAttribute\n      ? (useQuads ? pipelines.edgeQuadSlots : pipelines.edgeLineSlots)\n      : [];\n    const needEdgeWidths = config.edgeAttribute && edgeSlots.includes('widths');\n    const needEdgeEndpointSizes = config.edgeAttribute && edgeSlots.includes('endpointSizes');\n\n    if (needEdgeWidths) {\n      const expected = (geometry.edges.count ?? 0) * 2;\n      if (!edgeWidths || edgeWidths.length !== expected) {\n        throw new Error('AttributeTracker: expected edge widths buffer (vec2 per edge) but it was missing or wrong length');\n      }\n    }\n    if (needEdgeEndpointSizes) {\n      const expected = (geometry.edges.count ?? 0) * 2;\n      if (!edgeEndpointSizes || edgeEndpointSizes.length !== expected) {\n        throw new Error('AttributeTracker: expected edge endpointSizes buffer (vec2 per edge) but it was missing or wrong length');\n      }\n    }\n\n    const edgeWidthsBuffer = (geometry.edges.count && needEdgeWidths)\n      ? this.resolveSharedWebGPUBuffer(\n        sharedResources,\n        sharedCandidates?.edgeWidths ?? null,\n        () => uploadVertex('attr:webgpu:edge:widths', edgeWidths, {\n          label: 'AttributeTracker edge widths',\n          version: geometry.edges.versions?.widths ?? 0,\n          topologyVersion: geometry.edges.versions?.topology ?? 0,\n          count: geometry.edges.count,\n        }),\n      )\n      : null;\n\n    const edgeEndpointSizeBuffer = (geometry.edges.count && needEdgeEndpointSizes)\n      ? this.resolveSharedWebGPUBuffer(\n        sharedResources,\n        sharedCandidates?.edgeEndpointSizes ?? null,\n        () => uploadVertex('attr:webgpu:edge:endpointSizes', edgeEndpointSizes, {\n          label: 'AttributeTracker edge endpoint sizes',\n          version: geometry.edges.versions?.endpointSizes ?? 0,\n          topologyVersion: geometry.edges.versions?.topology ?? 0,\n          count: geometry.edges.count,\n        }),\n      )\n      : null;\n    const edgeEncodedBuffer = (geometry.edges.count && encoded.edgeEncoded?.view && config.edgeAttribute)\n      ? this.resolveSharedWebGPUBuffer(\n        sharedResources,\n        encoded.edgeEncoded?.rawIndex ? (sharedCandidates?.edgeIndices ?? null) : null,\n        () => resourceCache?.uploadBuffer(\n          gpu,\n          gpu.queue,\n          `attr:webgpu:edge:encoded:${config.edgeAttribute || 'index'}`,\n          encoded.edgeEncoded.view,\n          {\n            label: 'AttributeTracker edge encoded',\n            version: encoded.edgeEncoded.version ?? 0,\n            topologyVersion: 0,\n            count: geometry.edges.count,\n            trackViewIdentity: encoded.edgeEncoded?.rawIndex === true,\n          },\n          vertexUsage,\n        ),\n      )\n      : null;\n\n    const nodeBuffersBySlot = {\n      corner: this.cornerBuffer,\n      position: nodePositionBuffer,\n      size: nodeSizeBuffer,\n      encoded: nodeEncodedBuffer,\n      outline: nodeOutlineBuffer,\n    };\n    const canBindNode = geometry.nodes.count && config.nodeAttribute\n      ? pipelines.nodeSlots.every((slot) => Boolean(nodeBuffersBySlot[slot]))\n      : false;\n\n    const edgeLineBuffersBySlot = {\n      segments: edgeSegmentsBuffer,\n      endpointSizes: edgeEndpointSizeBuffer,\n      encoded: edgeEncodedBuffer,\n    };\n    const edgeQuadBuffersBySlot = {\n      edgeCorner: this.edgeCornerBuffer,\n      segments: edgeSegmentsBuffer,\n      widths: edgeWidthsBuffer,\n      endpointSizes: edgeEndpointSizeBuffer,\n      encoded: edgeEncodedBuffer,\n    };\n    const canBindEdge = geometry.edges.count && config.edgeAttribute\n      ? (useQuads\n        ? pipelines.edgeQuadSlots.every((slot) => Boolean(edgeQuadBuffersBySlot[slot]))\n        : pipelines.edgeLineSlots.every((slot) => Boolean(edgeLineBuffersBySlot[slot])))\n      : false;\n\n    if (canBindNode) {\n      passes.push(() => {\n        const pass = encoder.beginRenderPass({\n          colorAttachments: [{\n            view: this.targets.edge.texture.createView(),\n            clearValue: { r: 0, g: 0, b: 0, a: 0 },\n            loadOp: 'clear',\n            storeOp: 'store',\n          }],\n          depthStencilAttachment: {\n            view: this.targets.edge.depthTexture.createView(),\n            depthClearValue: 1,\n            depthLoadOp: 'clear',\n            depthStoreOp: 'store',\n          },\n        });\n        pass.setPipeline(pipelines.nodePipeline);\n        pass.setBindGroup(0, this.nodeBindGroup);\n        bindVertexSlots(pass, pipelines.nodeSlots, nodeBuffersBySlot);\n        pass.draw(4, geometry.nodes.count, 0, 0);\n        pass.end();\n      });\n\n      passes.push(() => {\n        encoder.copyTextureToTexture(\n          { texture: this.targets.edge.texture, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },\n          { texture: this.targets.node.texture, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },\n          { width: this.targets.edge.width, height: this.targets.edge.height, depthOrArrayLayers: 1 },\n        );\n      });\n    }\n\n    if (canBindEdge) {\n      passes.push(() => {\n        const occlusionNodeBuffers = {\n          corner: this.cornerBuffer,\n          position: nodePositionBuffer,\n          size: nodeSizeBuffer,\n          outline: nodeOutlineBuffer,\n        };\n        const canBindOcclusion = Boolean(occlusionPipelines)\n          && occlusionPipelines.nodeSlots.every((slot) => Boolean(occlusionNodeBuffers[slot]));\n        const pass = encoder.beginRenderPass({\n          colorAttachments: [{\n            view: this.targets.edge.texture.createView(),\n            clearValue: { r: 0, g: 0, b: 0, a: 0 },\n            loadOp: 'clear',\n            storeOp: 'store',\n          }],\n          depthStencilAttachment: {\n            view: this.targets.edge.depthTexture.createView(),\n            depthClearValue: 1,\n            depthLoadOp: 'clear',\n            depthStoreOp: 'store',\n          },\n        });\n        if (geometry.nodes.count && this.nodeBindGroup && canBindOcclusion) {\n          pass.setPipeline(occlusionPipelines.nodePipeline);\n          pass.setBindGroup(0, this.nodeBindGroup);\n          bindVertexSlots(pass, occlusionPipelines.nodeSlots, occlusionNodeBuffers);\n          pass.draw(4, geometry.nodes.count, 0, 0);\n        }\n\n        const useQuad = (this.graphLayer.getEffectiveEdgeRenderingMode?.() ?? this.graphLayer.edgeRenderingMode) === 'quad';\n        pass.setPipeline(useQuad ? pipelines.edgeQuadPipeline : pipelines.edgePipeline);\n        pass.setBindGroup(0, this.edgeBindGroup);\n        if (useQuad) {\n          bindVertexSlots(pass, pipelines.edgeQuadSlots, edgeQuadBuffersBySlot);\n          pass.draw(4, geometry.edges.count, 0, 0);\n        } else {\n          bindVertexSlots(pass, pipelines.edgeLineSlots, edgeLineBuffersBySlot);\n          pass.draw(2, geometry.edges.count, 0, 0);\n        }\n        pass.end();\n      });\n    }\n\n    if (config.trackDepth) {\n      const nodeDepthBuffersBySlot = {\n        ...nodeBuffersBySlot,\n      };\n      const canBindNodeDepth = geometry.nodes.count\n        && this.depthTargets.node\n        && this.nodeBindGroup\n        && pipelines.nodeSlots.every((slot) => Boolean(nodeDepthBuffersBySlot[slot]));\n\n      const canBindEdgeDepth = geometry.edges.count\n        && this.depthTargets.edge\n        && this.edgeBindGroup\n        && (useQuads\n          ? pipelines.edgeQuadSlots.every((slot) => Boolean(edgeQuadBuffersBySlot[slot]))\n          : pipelines.edgeLineSlots.every((slot) => Boolean(edgeLineBuffersBySlot[slot])));\n\n      if (canBindNodeDepth && this.depthTargets.edge) {\n        passes.push(() => {\n          const pass = encoder.beginRenderPass({\n            colorAttachments: [{\n              view: this.depthTargets.edge.texture.createView(),\n              clearValue: { r: 0, g: 0, b: 0, a: 0 },\n              loadOp: 'clear',\n              storeOp: 'store',\n            }],\n            depthStencilAttachment: {\n              view: this.depthTargets.edge.depthTexture.createView(),\n              depthClearValue: 1,\n              depthLoadOp: 'clear',\n              depthStoreOp: 'store',\n            },\n          });\n          pass.setPipeline(pipelines.nodeDepthPipeline);\n          pass.setBindGroup(0, this.nodeBindGroup);\n          bindVertexSlots(pass, pipelines.nodeSlots, nodeDepthBuffersBySlot);\n          pass.draw(4, geometry.nodes.count, 0, 0);\n          pass.end();\n        });\n\n        passes.push(() => {\n          encoder.copyTextureToTexture(\n            { texture: this.depthTargets.edge.texture, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },\n            { texture: this.depthTargets.node.texture, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },\n            { width: this.depthTargets.edge.width, height: this.depthTargets.edge.height, depthOrArrayLayers: 1 },\n          );\n        });\n      }\n\n      if (canBindEdgeDepth) {\n        passes.push(() => {\n          const useQuad = (this.graphLayer.getEffectiveEdgeRenderingMode?.() ?? this.graphLayer.edgeRenderingMode) === 'quad';\n          const occlusionNodeBuffers = {\n            corner: this.cornerBuffer,\n            position: nodePositionBuffer,\n            size: nodeSizeBuffer,\n            outline: nodeOutlineBuffer,\n          };\n          const canBindOcclusion = Boolean(occlusionPipelines)\n            && occlusionPipelines.nodeSlots.every((slot) => Boolean(occlusionNodeBuffers[slot]));\n          const pass = encoder.beginRenderPass({\n            colorAttachments: [{\n              view: this.depthTargets.edge.texture.createView(),\n              clearValue: { r: 0, g: 0, b: 0, a: 0 },\n              loadOp: 'clear',\n              storeOp: 'store',\n            }],\n            depthStencilAttachment: {\n              view: this.depthTargets.edge.depthTexture.createView(),\n              depthClearValue: 1,\n              depthLoadOp: 'clear',\n              depthStoreOp: 'store',\n            },\n          });\n          if (geometry.nodes.count && this.nodeBindGroup && canBindOcclusion) {\n            pass.setPipeline(occlusionPipelines.nodeDepthPipeline);\n            pass.setBindGroup(0, this.nodeBindGroup);\n            bindVertexSlots(pass, occlusionPipelines.nodeSlots, occlusionNodeBuffers);\n            pass.draw(4, geometry.nodes.count, 0, 0);\n          }\n          pass.setPipeline(useQuad ? pipelines.edgeQuadDepthPipeline : pipelines.edgeDepthPipeline);\n          pass.setBindGroup(0, this.edgeBindGroup);\n          if (useQuad) {\n            bindVertexSlots(pass, pipelines.edgeQuadSlots, edgeQuadBuffersBySlot);\n            pass.draw(4, geometry.edges.count, 0, 0);\n          } else {\n            bindVertexSlots(pass, pipelines.edgeLineSlots, edgeLineBuffersBySlot);\n            pass.draw(2, geometry.edges.count, 0, 0);\n          }\n          pass.end();\n        });\n      }\n    }\n\n    passes.push(() => {\n      gpu.queue.submit([encoder.finish()]);\n      cameraBuffer.destroy();\n      globalsBuffer.destroy();\n    });\n\n    this.runner?.run?.(passes, { device: this.device });\n    return { ...this.targets, depthTargets: this.depthTargets };\n  }\n\n  renderIndirectSparseGeometry(network, sparse, config, options = {}) {\n    if (!sparse) return null;\n    const {\n      size,\n      cameraUniforms,\n      useQuads,\n      nodeSizeUniform,\n      nodeOutlineUniform,\n      edgeWidthUniform,\n      edgeEndpointSizeUniform,\n      nodeCfg,\n      edgeCfg,\n      edgeVariant = null,\n    } = options;\n    const gpu = this.device?.device;\n    if (!gpu) return null;\n    const nodes = sparse.nodes ?? {};\n    const edges = sparse.edges ?? {};\n    const nodeIndices = nodes.indices ?? null;\n    const edgeIndices = edges.indices ?? null;\n    const nodeCount = nodeIndices?.length ?? 0;\n    const edgeCount = edgeIndices?.length ?? 0;\n\n    if (config.nodeAttribute && nodeCount > 0 && !nodeIndices) {\n      throw new Error('AttributeTracker: missing sparse node indices for indirect WebGPU tracking.');\n    }\n    if (config.edgeAttribute && edgeCount > 0 && !edgeIndices) {\n      throw new Error('AttributeTracker: missing sparse edge indices for indirect WebGPU tracking.');\n    }\n\n    const nodeTracked = resolveTrackedSourceDescriptor(network, 'node', config.nodeAttribute);\n    const edgeTracked = resolveTrackedSourceDescriptor(network, 'edge', config.edgeAttribute);\n    if (config.nodeAttribute && nodeCount > 0 && !nodeTracked) {\n      throw new Error(\n        `AttributeTracker: indirect WebGPU tracking attribute \"${config.nodeAttribute}\" `\n        + 'must be a scalar Integer/UnsignedInteger/Category-style buffer.',\n      );\n    }\n    if (config.edgeAttribute && edgeCount > 0 && !edgeTracked) {\n      throw new Error(\n        `AttributeTracker: indirect WebGPU tracking attribute \"${config.edgeAttribute}\" `\n        + 'must be a scalar Integer/UnsignedInteger/Category-style buffer.',\n      );\n    }\n\n    const edgeWidthSource = edgeVariant?.widthSource === 'node' ? 'node' : 'edge';\n    const edgeEndpointSizeSource = edgeVariant?.endpointSizeSource === 'node' ? 'node' : 'edge';\n    const edgeWidthEndpoints = normalizeNodeSourceEndpoints(edgeVariant?.widthEndpoints);\n    const edgeEndpointSizeEndpoints = normalizeNodeSourceEndpoints(edgeVariant?.endpointSizeEndpoints);\n    const useNodeStateBuffer = Boolean(\n      nodes.states\n      && ((config.nodeAttribute && nodeCount > 0) || (config.edgeAttribute && edgeCount > 0)),\n    );\n    const useEdgeNodeStateBuffer = Boolean(config.edgeAttribute && edgeCount > 0 && nodes.states);\n    const useEdgeStateBuffer = Boolean(config.edgeAttribute && edgeCount > 0 && edges.states);\n\n    const pipelines = this.getIndirectPipelinesForVariant({\n      nodeSizeUniform,\n      nodeOutlineUniform,\n      edgeWidthUniform,\n      edgeEndpointSizeUniform,\n      edgeWidthSource,\n      edgeEndpointSizeSource,\n      edgeWidthEndpoints,\n      edgeEndpointSizeEndpoints,\n      nodeTrackedMode: nodeTracked?.mode ?? TRACKED_SOURCE_MODE.INDEX,\n      edgeTrackedMode: edgeTracked?.mode ?? TRACKED_SOURCE_MODE.INDEX,\n      nodeStateBuffer: useNodeStateBuffer,\n      edgeNodeStateBuffer: useEdgeNodeStateBuffer,\n      edgeStateBuffer: useEdgeStateBuffer,\n    });\n    if (!pipelines) return null;\n\n    const is2D = cameraUniforms.mode === '2d';\n    const zoom2D = is2D ? Math.max(1e-3, cameraUniforms.view?.[0] ?? 1) : 1;\n    const semanticZoomExponent = Number.isFinite(this.graphLayer?.semanticZoomExponent)\n      ? this.graphLayer.semanticZoomExponent\n      : 0;\n    const edgeWidthFactor = is2D ? (zoom2D / EDGE_WIDTH_SCALE_MULTIPLIER_GLOBAL) : 1.0;\n    const edgeWidthBase = this.graphLayer.edgeWidthBase * EDGE_WIDTH_SCALE_MULTIPLIER_GLOBAL * edgeWidthFactor;\n    const edgeWidthScale = this.graphLayer.edgeWidthScale * EDGE_WIDTH_SCALE_MULTIPLIER_GLOBAL * edgeWidthFactor;\n\n    const cameraBuffer = gpu.createBuffer({\n      size: 48 * 4,\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n      mappedAtCreation: true,\n    });\n    const cameraArray = new Float32Array(cameraBuffer.getMappedRange());\n    cameraArray.set(cameraUniforms.viewProjection, 0);\n    cameraArray.set(cameraUniforms.view, 16);\n    cameraArray.set(cameraUniforms.position ?? [0, 0, 0], 32);\n    cameraArray[35] = is2D ? 1 : 0;\n    cameraArray.set(cameraUniforms.up ?? [0, 1, 0], 36);\n    cameraArray.set(cameraUniforms.right ?? [1, 0, 0], 40);\n    const viewportWidth = cameraUniforms.viewport?.width ?? size.width ?? 1;\n    const viewportHeight = cameraUniforms.viewport?.height ?? size.height ?? 1;\n    const pixelRatio = cameraUniforms.viewport?.devicePixelRatio ?? size.devicePixelRatio ?? 1;\n    const drawWidth = viewportWidth * pixelRatio;\n    const drawHeight = viewportHeight * pixelRatio;\n    cameraArray[44] = drawWidth;\n    cameraArray[45] = drawHeight;\n    cameraArray[46] = drawWidth > 0 ? 1 / drawWidth : 0;\n    cameraArray[47] = drawHeight > 0 ? 1 / drawHeight : 0;\n    cameraBuffer.unmap();\n\n    const globalsBuffer = gpu.createBuffer({\n      size: 24 * 4,\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n      mappedAtCreation: true,\n    });\n    const globalsArray = new Float32Array(globalsBuffer.getMappedRange());\n    globalsArray[0] = this.graphLayer.nodeOpacityBase;\n    globalsArray[1] = this.graphLayer.nodeOpacityScale;\n    globalsArray[2] = this.graphLayer.nodeSizeBase;\n    globalsArray[3] = this.graphLayer.nodeSizeScale;\n    globalsArray[4] = this.graphLayer.nodeOutlineWidthBase;\n    globalsArray[5] = this.graphLayer.nodeOutlineWidthScale;\n    globalsArray[6] = this.graphLayer.edgeOpacityBase;\n    globalsArray[7] = this.graphLayer.edgeOpacityScale;\n    globalsArray[8] = edgeWidthBase;\n    globalsArray[9] = edgeWidthScale;\n    globalsArray[10] = nodeSizeUniform ? Number(nodeCfg?.size?.value ?? 0) : 0;\n    globalsArray[11] = nodeOutlineUniform ? Number(nodeCfg?.outline?.value ?? 0) : 0;\n    globalsArray[12] = this.graphLayer.nodeOutlineColor?.[0] ?? 0;\n    globalsArray[13] = this.graphLayer.nodeOutlineColor?.[1] ?? 0;\n    globalsArray[14] = this.graphLayer.nodeOutlineColor?.[2] ?? 0;\n    globalsArray[15] = this.graphLayer.nodeOutlineColor?.[3] ?? 1;\n    globalsArray[16] = this.graphLayer.edgeEndpointTrim;\n    globalsArray[17] = semanticZoomExponent;\n    const edgeWidthPair = edgeCfg?.width?.value;\n    globalsArray[18] = edgeWidthUniform ? Number(edgeWidthPair?.[0] ?? 1) : 1;\n    globalsArray[19] = edgeWidthUniform ? Number(edgeWidthPair?.[1] ?? 1) : 1;\n    const edgeEndpointPair = edgeCfg?.endpointSize?.value;\n    globalsArray[20] = edgeEndpointSizeUniform ? Number(edgeEndpointPair?.[0] ?? 1) : 1;\n    globalsArray[21] = edgeEndpointSizeUniform ? Number(edgeEndpointPair?.[1] ?? 1) : 1;\n    globalsArray[22] = 0;\n    globalsArray[23] = 0;\n    globalsBuffer.unmap();\n\n    const resourceCache = this.device?.resourceCache?.webgpu;\n    const storageUsage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX;\n    const sharedResources = this.getSharedGraphResources();\n    const zeroStorage = this.ensureZeroStorageBuffer();\n\n    const uploadStorage = (key, source, meta) => {\n      if (!source || !resourceCache) return null;\n      return resourceCache.uploadBuffer(gpu, gpu.queue, key, source, { ...meta, trackViewIdentity: false }, storageUsage);\n    };\n\n    const resolveStorage = (candidate, fallback) => {\n      return this.resolveSharedWebGPUBuffer(sharedResources, candidate, fallback) ?? zeroStorage;\n    };\n\n    const nodeTopology = nodes.versions?.topology ?? 0;\n    const edgeTopology = edges.versions?.topology ?? 0;\n\n    const nodePositionsView = nodes.positions ?? null;\n    const nodePositionsDirectBuffer = nodes.positionBuffer ?? null;\n    const nodeSizesView = nodes.sizes ?? null;\n    const nodeStatesView = nodes.states ?? null;\n    const nodeOutlineView = nodes.outlineWidths ?? null;\n    const edgeEndpointsView = edges.endpoints ?? null;\n    const edgeWidthsView = edges.widths ?? null;\n    const edgeEndpointSizesView = edges.endpointSizes ?? null;\n    const edgeStatesView = edges.states ?? null;\n    const nodeWidthSourceView = sparse.nodeEdgeSources?.width?.view ?? nodeSizesView;\n    const nodeEndpointSourceView = sparse.nodeEdgeSources?.endpointSize?.view ?? nodeSizesView;\n\n    if (\n      ((config.nodeAttribute && nodeCount > 0) || (config.edgeAttribute && edgeCount > 0))\n      && !nodePositionsView\n      && !nodePositionsDirectBuffer\n    ) {\n      throw new Error('AttributeTracker: indirect WebGPU mode requires sparse node positions.');\n    }\n    if (config.nodeAttribute && nodeCount > 0 && !nodeSizeUniform && !nodeSizesView) {\n      throw new Error('AttributeTracker: indirect WebGPU mode requires sparse node sizes.');\n    }\n    if (config.nodeAttribute && nodeCount > 0 && !nodeOutlineUniform && !nodeOutlineView) {\n      throw new Error('AttributeTracker: indirect WebGPU mode requires sparse node outline widths.');\n    }\n    if (config.edgeAttribute && edgeCount > 0 && !edgeEndpointsView) {\n      throw new Error('AttributeTracker: indirect WebGPU mode requires sparse edge endpoints.');\n    }\n    if (config.edgeAttribute && edgeCount > 0 && !edgeWidthUniform && edgeWidthSource === 'edge' && !edgeWidthsView) {\n      throw new Error('AttributeTracker: indirect WebGPU mode requires sparse edge widths.');\n    }\n    if (config.edgeAttribute && edgeCount > 0 && !edgeWidthUniform && edgeWidthSource === 'node' && !nodeWidthSourceView) {\n      throw new Error('AttributeTracker: indirect WebGPU mode requires node width source values.');\n    }\n    if (config.edgeAttribute && edgeCount > 0 && !edgeEndpointSizeUniform && edgeEndpointSizeSource === 'edge' && !edgeEndpointSizesView) {\n      throw new Error('AttributeTracker: indirect WebGPU mode requires sparse edge endpoint sizes.');\n    }\n    if (config.edgeAttribute && edgeCount > 0 && !edgeEndpointSizeUniform && edgeEndpointSizeSource === 'node' && !nodeEndpointSourceView) {\n      throw new Error('AttributeTracker: indirect WebGPU mode requires node endpoint-size source values.');\n    }\n\n    const nodeIndicesBuffer = (config.nodeAttribute && nodeCount > 0)\n      ? resolveStorage({\n        key: 'indirect:node:indices',\n        version: nodes.versions?.indices ?? nodeTopology,\n        topologyVersion: nodeTopology,\n        byteLength: nodeIndices?.byteLength ?? 0,\n      }, () => uploadStorage('indirect:node:indices', nodeIndices, {\n        label: 'AttributeTracker node indices',\n        version: nodes.versions?.indices ?? nodeTopology,\n        topologyVersion: nodeTopology,\n        count: nodeCount,\n        dirtyRange: nodes.indexDirtyRange ?? null,\n      }))\n      : zeroStorage;\n\n    const edgeIndicesBuffer = (config.edgeAttribute && edgeCount > 0)\n      ? resolveStorage({\n        key: 'indirect:edge:indices',\n        version: edges.versions?.indices ?? edgeTopology,\n        topologyVersion: edgeTopology,\n        byteLength: edgeIndices?.byteLength ?? 0,\n      }, () => uploadStorage('indirect:edge:indices', edgeIndices, {\n        label: 'AttributeTracker edge indices',\n        version: edges.versions?.indices ?? edgeTopology,\n        topologyVersion: edgeTopology,\n        count: edgeCount,\n        dirtyRange: edges.indexDirtyRange ?? null,\n      }))\n      : zeroStorage;\n\n    const nodePositionsBuffer = ((config.nodeAttribute && nodeCount > 0) || (config.edgeAttribute && edgeCount > 0))\n      ? (nodePositionsDirectBuffer ?? resolveStorage({\n        key: 'indirect:node:positions',\n        version: nodes.versions?.positions ?? 0,\n        topologyVersion: nodeTopology,\n        byteLength: nodePositionsView?.byteLength ?? 0,\n      }, () => uploadStorage('indirect:node:positions', nodePositionsView, {\n        label: 'AttributeTracker node positions',\n        version: nodes.versions?.positions ?? 0,\n        topologyVersion: nodeTopology,\n        count: nodeCount,\n      })))\n      : zeroStorage;\n\n    const nodeSizesBuffer = (config.nodeAttribute && !nodeSizeUniform && nodeCount > 0)\n      ? resolveStorage({\n        key: 'indirect:node:sizes',\n        version: nodes.versions?.sizes ?? 0,\n        topologyVersion: nodeTopology,\n        byteLength: nodeSizesView?.byteLength ?? 0,\n      }, () => uploadStorage('indirect:node:sizes', nodeSizesView, {\n        label: 'AttributeTracker node sizes',\n        version: nodes.versions?.sizes ?? 0,\n        topologyVersion: nodeTopology,\n        count: nodeCount,\n      }))\n      : zeroStorage;\n\n    const nodeOutlineBuffer = (config.nodeAttribute && !nodeOutlineUniform && nodeCount > 0)\n      ? resolveStorage({\n        key: 'indirect:node:outlineWidths',\n        version: nodes.versions?.outlineWidths ?? 0,\n        topologyVersion: nodeTopology,\n        byteLength: nodeOutlineView?.byteLength ?? 0,\n      }, () => uploadStorage('indirect:node:outlineWidths', nodeOutlineView, {\n        label: 'AttributeTracker node outline widths',\n        version: nodes.versions?.outlineWidths ?? 0,\n        topologyVersion: nodeTopology,\n        count: nodeCount,\n      }))\n      : zeroStorage;\n\n    const nodeStatesBuffer = (((config.nodeAttribute && nodeCount > 0) || (config.edgeAttribute && edgeCount > 0)) && nodeStatesView)\n      ? resolveStorage({\n        key: 'indirect:node:states',\n        version: nodes.versions?.states ?? 0,\n        topologyVersion: nodeTopology,\n        byteLength: nodeStatesView?.byteLength ?? 0,\n      }, () => uploadStorage('indirect:node:states', nodeStatesView, {\n        label: 'AttributeTracker node states',\n        version: nodes.versions?.states ?? 0,\n        topologyVersion: nodeTopology,\n        count: nodeCount,\n      }))\n      : zeroStorage;\n\n    const edgeEndpointsBuffer = (config.edgeAttribute && edgeCount > 0)\n      ? resolveStorage({\n        key: 'indirect:edge:endpoints',\n        version: edges.versions?.endpoints ?? edgeTopology,\n        topologyVersion: edgeTopology,\n        byteLength: edgeEndpointsView?.byteLength ?? 0,\n      }, () => uploadStorage('indirect:edge:endpoints', edgeEndpointsView, {\n        label: 'AttributeTracker edge endpoints',\n        version: edges.versions?.endpoints ?? edgeTopology,\n        topologyVersion: edgeTopology,\n        count: edgeCount,\n      }))\n      : zeroStorage;\n\n    const edgeWidthsBuffer = (config.edgeAttribute && edgeCount > 0 && !edgeWidthUniform && edgeWidthSource === 'edge')\n      ? resolveStorage({\n        key: 'indirect:edge:widths',\n        version: edges.versions?.widths ?? 0,\n        topologyVersion: edgeTopology,\n        byteLength: edgeWidthsView?.byteLength ?? 0,\n      }, () => uploadStorage('indirect:edge:widths', edgeWidthsView, {\n        label: 'AttributeTracker edge widths',\n        version: edges.versions?.widths ?? 0,\n        topologyVersion: edgeTopology,\n        count: edgeCount,\n      }))\n      : zeroStorage;\n\n    const edgeEndpointSizesBuffer = (config.edgeAttribute && edgeCount > 0 && !edgeEndpointSizeUniform && edgeEndpointSizeSource === 'edge')\n      ? resolveStorage({\n        key: 'indirect:edge:endpointSizes',\n        version: edges.versions?.endpointSizes ?? 0,\n        topologyVersion: edgeTopology,\n        byteLength: edgeEndpointSizesView?.byteLength ?? 0,\n      }, () => uploadStorage('indirect:edge:endpointSizes', edgeEndpointSizesView, {\n        label: 'AttributeTracker edge endpoint sizes',\n        version: edges.versions?.endpointSizes ?? 0,\n        topologyVersion: edgeTopology,\n        count: edgeCount,\n      }))\n      : zeroStorage;\n\n    const edgeStatesBuffer = (config.edgeAttribute && edgeCount > 0 && edgeStatesView)\n      ? resolveStorage({\n        key: 'indirect:edge:states',\n        version: edges.versions?.states ?? 0,\n        topologyVersion: edgeTopology,\n        byteLength: edgeStatesView?.byteLength ?? 0,\n      }, () => uploadStorage('indirect:edge:states', edgeStatesView, {\n        label: 'AttributeTracker edge states',\n        version: edges.versions?.states ?? 0,\n        topologyVersion: edgeTopology,\n        count: edgeCount,\n      }))\n      : zeroStorage;\n\n    const nodeWidthSourceBuffer = (config.edgeAttribute && edgeCount > 0 && !edgeWidthUniform && edgeWidthSource === 'node')\n      ? resolveStorage({\n        key: 'indirect:node:edgeSource:width',\n        version: sparse.nodeEdgeSources?.width?.version ?? nodes.versions?.sizes ?? 0,\n        topologyVersion: nodeTopology,\n        byteLength: nodeWidthSourceView?.byteLength ?? 0,\n      }, () => uploadStorage('indirect:node:edgeSource:width', nodeWidthSourceView, {\n        label: 'AttributeTracker node edge width source',\n        version: sparse.nodeEdgeSources?.width?.version ?? nodes.versions?.sizes ?? 0,\n        topologyVersion: nodeTopology,\n        count: nodeCount,\n      }))\n      : zeroStorage;\n\n    const nodeEndpointSourceBuffer = (config.edgeAttribute && edgeCount > 0 && !edgeEndpointSizeUniform && edgeEndpointSizeSource === 'node')\n      ? resolveStorage({\n        key: 'indirect:node:edgeSource:endpointSize',\n        version: sparse.nodeEdgeSources?.endpointSize?.version ?? nodes.versions?.sizes ?? 0,\n        topologyVersion: nodeTopology,\n        byteLength: nodeEndpointSourceView?.byteLength ?? 0,\n      }, () => uploadStorage('indirect:node:edgeSource:endpointSize', nodeEndpointSourceView, {\n        label: 'AttributeTracker node edge endpoint-size source',\n        version: sparse.nodeEdgeSources?.endpointSize?.version ?? nodes.versions?.sizes ?? 0,\n        topologyVersion: nodeTopology,\n        count: nodeCount,\n      }))\n      : zeroStorage;\n\n    const nodeTrackedIntBuffer = (nodeTracked?.mode === TRACKED_SOURCE_MODE.INT && nodeCount > 0)\n      ? uploadStorage(`attr:webgpu:node:trackedInt:${config.nodeAttribute}`, nodeTracked.view, {\n        label: 'AttributeTracker node tracked int',\n        version: nodeTracked.version ?? 0,\n        topologyVersion: nodeTopology,\n        count: nodeTracked.count ?? 0,\n      })\n      : zeroStorage;\n    const nodeTrackedUintBuffer = (nodeTracked?.mode === TRACKED_SOURCE_MODE.UINT && nodeCount > 0)\n      ? uploadStorage(`attr:webgpu:node:trackedUint:${config.nodeAttribute}`, nodeTracked.view, {\n        label: 'AttributeTracker node tracked uint',\n        version: nodeTracked.version ?? 0,\n        topologyVersion: nodeTopology,\n        count: nodeTracked.count ?? 0,\n      })\n      : zeroStorage;\n\n    const edgeTrackedIntBuffer = (edgeTracked?.mode === TRACKED_SOURCE_MODE.INT && edgeCount > 0)\n      ? uploadStorage(`attr:webgpu:edge:trackedInt:${config.edgeAttribute}`, edgeTracked.view, {\n        label: 'AttributeTracker edge tracked int',\n        version: edgeTracked.version ?? 0,\n        topologyVersion: edgeTopology,\n        count: edgeTracked.count ?? 0,\n      })\n      : zeroStorage;\n    const edgeTrackedUintBuffer = (edgeTracked?.mode === TRACKED_SOURCE_MODE.UINT && edgeCount > 0)\n      ? uploadStorage(`attr:webgpu:edge:trackedUint:${config.edgeAttribute}`, edgeTracked.view, {\n        label: 'AttributeTracker edge tracked uint',\n        version: edgeTracked.version ?? 0,\n        topologyVersion: edgeTopology,\n        count: edgeTracked.count ?? 0,\n      })\n      : zeroStorage;\n\n    const trackConfigBuffer = gpu.createBuffer({\n      size: 1104,\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n      mappedAtCreation: true,\n    });\n    const trackConfigBytes = trackConfigBuffer.getMappedRange();\n    const trackConfigView = new DataView(trackConfigBytes);\n    const writeU32 = (index, value) => trackConfigView.setUint32(index * 4, value >>> 0, true);\n    const writeF32 = (index, value) => trackConfigView.setFloat32(index * 4, Number(value) || 0, true);\n    writeU32(0, this.graphLayer.hoveredNodeIndex >>> 0);\n    writeU32(1, this.graphLayer.hoveredNodeState >>> 0);\n    writeU32(2, this.graphLayer.hoveredNodeIsVirtual ? 1 : 0);\n    writeU32(4, this.graphLayer.hoveredEdgeIndex >>> 0);\n    writeU32(5, this.graphLayer.hoveredEdgeState >>> 0);\n    writeU32(6, this.graphLayer.propagateHoveredNodeToEdges === true ? 1 : 0);\n    writeU32(7, this.graphLayer.propagateSelectedNodesToEdges === true ? 1 : 0);\n    writeU32(8, nodeStatesView ? 1 : 0);\n    writeU32(9, edgeStatesView ? 1 : 0);\n    writeU32(10, TRACK_STATE_SLOTS);\n    writeU32(11, this.graphLayer.hoveredEdgeIsVirtual ? 1 : 0);\n    const nodeNoStateScale = this.graphLayer.nodeNoStateStyleEnabled === true\n      ? this.graphLayer.nodeNoStateScale\n      : [1, 1, 1, 0];\n    const edgeNoStateScale = this.graphLayer.edgeNoStateStyleEnabled === true\n      ? this.graphLayer.edgeNoStateScale\n      : [1, 1, 1, 0];\n    for (let i = 0; i < 4; i += 1) writeF32(12 + i, nodeNoStateScale[i]);\n    for (let i = 0; i < 4; i += 1) writeF32(16 + i, edgeNoStateScale[i]);\n    const nodeStateScale = this.graphLayer.nodeStateScale ?? null;\n    const edgeStateScale = this.graphLayer.edgeStateScale ?? null;\n    for (let i = 0; i < TRACK_STATE_SLOTS * 4; i += 1) {\n      const defaultValue = (i % 4) === 3 ? 0 : 1;\n      writeF32(20 + i, nodeStateScale?.[i] ?? defaultValue);\n    }\n    for (let i = 0; i < TRACK_STATE_SLOTS * 4; i += 1) {\n      const defaultValue = (i % 4) === 3 ? 0 : 1;\n      writeF32(20 + (TRACK_STATE_SLOTS * 4) + i, edgeStateScale?.[i] ?? defaultValue);\n    }\n    trackConfigBuffer.unmap();\n\n    const pushBindGroupEntries = (bindings, sourceMap) => {\n      const entries = [];\n      for (const [name, binding] of Object.entries(bindings ?? {})) {\n        const buffer = sourceMap[name] ?? null;\n        if (binding == null || !buffer) continue;\n        entries.push({ binding, resource: { buffer } });\n      }\n      return entries;\n    };\n\n    const nodeBindGroup = gpu.createBindGroup({\n      layout: pipelines.nodeBindGroupLayout ?? this.nodeIndirectBindGroupLayout,\n      entries: pushBindGroupEntries(pipelines.nodeBindings, {\n        camera: cameraBuffer,\n        globals: globalsBuffer,\n        nodeIndices: nodeIndicesBuffer ?? zeroStorage,\n        nodePositions: nodePositionsBuffer ?? zeroStorage,\n        nodeSizes: nodeSizesBuffer ?? zeroStorage,\n        nodeOutlineWidths: nodeOutlineBuffer ?? zeroStorage,\n        nodeTrackedInt: nodeTrackedIntBuffer ?? zeroStorage,\n        nodeTrackedUint: nodeTrackedUintBuffer ?? zeroStorage,\n        nodeStates: nodeStatesBuffer ?? zeroStorage,\n        track: trackConfigBuffer,\n      }),\n    });\n\n    const edgeBindGroup = gpu.createBindGroup({\n      layout: pipelines.edgeBindGroupLayout ?? this.edgeIndirectBindGroupLayout,\n      entries: pushBindGroupEntries(pipelines.edgeBindings, {\n        camera: cameraBuffer,\n        globals: globalsBuffer,\n        edgeIndices: edgeIndicesBuffer ?? zeroStorage,\n        edgeEndpoints: edgeEndpointsBuffer ?? zeroStorage,\n        nodePositions: nodePositionsBuffer ?? zeroStorage,\n        edgeWidths: edgeWidthsBuffer ?? zeroStorage,\n        edgeEndpointSizes: edgeEndpointSizesBuffer ?? zeroStorage,\n        nodeWidthSource: nodeWidthSourceBuffer ?? zeroStorage,\n        nodeEndpointSizeSource: nodeEndpointSourceBuffer ?? zeroStorage,\n        edgeTrackedInt: edgeTrackedIntBuffer ?? zeroStorage,\n        edgeTrackedUint: edgeTrackedUintBuffer ?? zeroStorage,\n        nodeStates: nodeStatesBuffer ?? zeroStorage,\n        edgeStates: edgeStatesBuffer ?? zeroStorage,\n        track: trackConfigBuffer,\n      }),\n    });\n\n    const encoder = gpu.createCommandEncoder();\n    const passes = [];\n    const canBindNode = Boolean(config.nodeAttribute && nodeCount > 0 && nodeIndicesBuffer && nodePositionsBuffer);\n    const canBindEdge = Boolean(config.edgeAttribute && edgeCount > 0 && edgeIndicesBuffer && edgeEndpointsBuffer && nodePositionsBuffer);\n\n    if (canBindNode) {\n      passes.push(() => {\n        const pass = encoder.beginRenderPass({\n          colorAttachments: [{\n            view: this.targets.edge.texture.createView(),\n            clearValue: { r: 0, g: 0, b: 0, a: 0 },\n            loadOp: 'clear',\n            storeOp: 'store',\n          }],\n          depthStencilAttachment: {\n            view: this.targets.edge.depthTexture.createView(),\n            depthClearValue: 1,\n            depthLoadOp: 'clear',\n            depthStoreOp: 'store',\n          },\n        });\n        pass.setPipeline(pipelines.nodePipeline);\n        pass.setBindGroup(0, nodeBindGroup);\n        pass.setVertexBuffer(0, this.cornerBuffer);\n        pass.draw(4, nodeCount, 0, 0);\n        pass.end();\n      });\n      passes.push(() => {\n        encoder.copyTextureToTexture(\n          { texture: this.targets.edge.texture, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },\n          { texture: this.targets.node.texture, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },\n          { width: this.targets.edge.width, height: this.targets.edge.height, depthOrArrayLayers: 1 },\n        );\n      });\n    }\n\n    if (canBindEdge) {\n      passes.push(() => {\n        const pass = encoder.beginRenderPass({\n          colorAttachments: [{\n            view: this.targets.edge.texture.createView(),\n            clearValue: { r: 0, g: 0, b: 0, a: 0 },\n            loadOp: 'clear',\n            storeOp: 'store',\n          }],\n          depthStencilAttachment: {\n            view: this.targets.edge.depthTexture.createView(),\n            depthClearValue: 1,\n            depthLoadOp: 'clear',\n            depthStoreOp: 'store',\n          },\n        });\n        if (canBindNode) {\n          pass.setPipeline(pipelines.nodeOcclusionPipeline);\n          pass.setBindGroup(0, nodeBindGroup);\n          pass.setVertexBuffer(0, this.cornerBuffer);\n          pass.draw(4, nodeCount, 0, 0);\n        }\n        if (useQuads) {\n          pass.setPipeline(pipelines.edgeQuadPipeline);\n          pass.setBindGroup(0, edgeBindGroup);\n          pass.setVertexBuffer(0, this.edgeCornerBuffer);\n          pass.draw(4, edgeCount, 0, 0);\n        } else {\n          pass.setPipeline(pipelines.edgePipeline);\n          pass.setBindGroup(0, edgeBindGroup);\n          pass.draw(2, edgeCount, 0, 0);\n        }\n        pass.end();\n      });\n    }\n\n    if (config.trackDepth) {\n      if (canBindNode && this.depthTargets.edge) {\n        passes.push(() => {\n          const pass = encoder.beginRenderPass({\n            colorAttachments: [{\n              view: this.depthTargets.edge.texture.createView(),\n              clearValue: { r: 0, g: 0, b: 0, a: 0 },\n              loadOp: 'clear',\n              storeOp: 'store',\n            }],\n            depthStencilAttachment: {\n              view: this.depthTargets.edge.depthTexture.createView(),\n              depthClearValue: 1,\n              depthLoadOp: 'clear',\n              depthStoreOp: 'store',\n            },\n          });\n          pass.setPipeline(pipelines.nodeDepthPipeline);\n          pass.setBindGroup(0, nodeBindGroup);\n          pass.setVertexBuffer(0, this.cornerBuffer);\n          pass.draw(4, nodeCount, 0, 0);\n          pass.end();\n        });\n        passes.push(() => {\n          encoder.copyTextureToTexture(\n            { texture: this.depthTargets.edge.texture, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },\n            { texture: this.depthTargets.node.texture, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },\n            { width: this.depthTargets.edge.width, height: this.depthTargets.edge.height, depthOrArrayLayers: 1 },\n          );\n        });\n      }\n      if (canBindEdge && this.depthTargets.edge) {\n        passes.push(() => {\n          const pass = encoder.beginRenderPass({\n            colorAttachments: [{\n              view: this.depthTargets.edge.texture.createView(),\n              clearValue: { r: 0, g: 0, b: 0, a: 0 },\n              loadOp: 'clear',\n              storeOp: 'store',\n            }],\n            depthStencilAttachment: {\n              view: this.depthTargets.edge.depthTexture.createView(),\n              depthClearValue: 1,\n              depthLoadOp: 'clear',\n              depthStoreOp: 'store',\n            },\n          });\n          if (canBindNode) {\n            pass.setPipeline(pipelines.nodeDepthPipeline);\n            pass.setBindGroup(0, nodeBindGroup);\n            pass.setVertexBuffer(0, this.cornerBuffer);\n            pass.draw(4, nodeCount, 0, 0);\n          }\n          if (useQuads) {\n            pass.setPipeline(pipelines.edgeQuadDepthPipeline);\n            pass.setBindGroup(0, edgeBindGroup);\n            pass.setVertexBuffer(0, this.edgeCornerBuffer);\n            pass.draw(4, edgeCount, 0, 0);\n          } else {\n            pass.setPipeline(pipelines.edgeDepthPipeline);\n            pass.setBindGroup(0, edgeBindGroup);\n            pass.draw(2, edgeCount, 0, 0);\n          }\n          pass.end();\n        });\n      }\n    }\n\n    passes.push(() => {\n      gpu.queue.submit([encoder.finish()]);\n      cameraBuffer.destroy();\n      globalsBuffer.destroy();\n      trackConfigBuffer.destroy();\n    });\n\n    this.runner?.run?.(passes, { device: this.device });\n    return { ...this.targets, depthTargets: this.depthTargets };\n  }\n\n  render(frame, size, config) {\n    if (!this.device || !frame?.network) return null;\n    const network = frame.network;\n    const camera = frame.camera;\n    const scale = config.resolutionScale ?? 1;\n    this.resize(size, scale, config.trackDepth);\n    const cameraUniforms = this.graphLayer.getCameraUniforms(camera);\n    if (!cameraUniforms) return null;\n    const useQuads = (this.graphLayer.getEffectiveEdgeRenderingMode?.() ?? this.graphLayer.edgeRenderingMode) === 'quad';\n    const sparseMode = isSparseGraphLayer(this.graphLayer);\n\n    const schema = GraphVisualSchema.fromNetwork(network, {\n      nodeOutlineUseAttributes: this.graphLayer?.nodeOutlineUseAttributes === true,\n    });\n    const nodeVariant = schema?.getNodeVariant?.() ?? null;\n    const edgeVariant = schema?.getEdgeVariant?.() ?? null;\n    const visualConfig = schema?.visualConfig ?? null;\n    const nodeCfg = visualConfig?.node ?? null;\n    const edgeCfg = visualConfig?.edge ?? null;\n\n    const nodeSizeUniform = nodeVariant ? (nodeVariant.sizeBuffer === false) : false;\n    const nodeOutlineUniform = nodeVariant ? (nodeVariant.outlineWidthBuffer === false) : true;\n    const edgeWidthUniform = edgeVariant ? (edgeVariant.widthBuffer === false) : false;\n    const edgeEndpointSizeUniform = edgeVariant ? (edgeVariant.endpointSizeBuffer === false) : true;\n\n    const renderOptions = {\n      size,\n      cameraUniforms,\n      useQuads,\n      nodeSizeUniform,\n      nodeOutlineUniform,\n      edgeWidthUniform,\n      edgeEndpointSizeUniform,\n      nodeCfg,\n      edgeCfg,\n    };\n\n    if (!sparseMode) {\n      console.warn('AttributeTracker: sparse graph layer is required for WebGPU tracking.');\n      return null;\n    }\n\n    const useIntegerEncoding = this.targetFormat === 'r32uint';\n    const canUseDirectIndirectPath = Boolean(\n      this.device?.device\n      && this.nodeIndirectBindGroupLayout\n      && ((this.edgeIndirectBindGroupLayouts?.size ?? 0) > 0),\n    );\n    let topologyVersions = { node: 0, edge: 0 };\n    if (typeof network.getTopologyVersions === 'function') {\n      try {\n        topologyVersions = network.getTopologyVersions() ?? topologyVersions;\n      } catch (error) {\n        const fallbackVersion = nextFallbackVersion();\n        warnOnce(\n          this,\n          'webgpu-topology-versions',\n          'AttributeTracker: failed to read topology versions for WebGPU tracking; forcing cache refresh.',\n          { error },\n        );\n        topologyVersions = { node: fallbackVersion, edge: fallbackVersion };\n      }\n    }\n    // Only prepare sparse encoded attributes for the legacy prepared-geometry fallback path.\n    // The direct indirect path can encode from tracked int/uint sources in-shader even when\n    // the target format is rgba8 (i.e. when r32uint attachments are unavailable).\n    if (!useIntegerEncoding && !canUseDirectIndirectPath) {\n      ensureSparseEncodedReadyCached(\n        this.sparseEncodedReadyCache,\n        network,\n        'node',\n        config.nodeAttribute,\n        topologyVersions.node,\n      );\n      ensureSparseEncodedReadyCached(\n        this.sparseEncodedReadyCache,\n        network,\n        'edge',\n        config.edgeAttribute,\n        topologyVersions.edge,\n      );\n    }\n    const indirectEdgeVariant = this.graphLayer.resolveEdgeVariant?.(visualConfig) ?? null;\n    const edgeSourceRequests = this.getIndirectEdgeSourceRequests(indirectEdgeVariant);\n    return this.graphLayer.withSparseGraph(\n      network,\n      topologyVersions,\n      null,\n      edgeSourceRequests,\n      (sparseGeometry) => {\n        if (!sparseGeometry) return null;\n        if (!canUseDirectIndirectPath) {\n          const prepared = this.buildIndirectPreparedGeometry(network, sparseGeometry, config, {\n            useQuads,\n            nodeSizeUniform,\n            nodeOutlineUniform,\n            edgeWidthUniform,\n            edgeEndpointSizeUniform,\n            edgeVariant: indirectEdgeVariant,\n            useIntegerEncoding,\n          });\n          return this.renderPreparedGeometry(prepared.geometry, prepared.encoded, config, {\n            ...renderOptions,\n            sharedCandidates: prepared.shared ?? null,\n          });\n        }\n        return this.renderIndirectSparseGeometry(network, sparseGeometry, config, {\n          ...renderOptions,\n          edgeVariant: indirectEdgeVariant,\n        });\n      },\n    );\n  }\n}\n\nexport class AttributeTracker {\n  constructor(renderer) {\n    this.renderer = renderer;\n    this.graphLayer = renderer?.graphLayer ?? null;\n    this.nodeAttribute = null;\n    this.edgeAttribute = null;\n    this.options = { resolutionScale: 0.5, autoRender: true };\n    this.webgl = null;\n    this._activeWebglRenderer = null;\n    this.webgpu = null;\n    this.size = renderer?.size ?? null;\n    this.lastTargets = null;\n    this.targetPool = new RenderTargetPool();\n    this.runner = new FrameGraphRunner();\n    this.counters = {\n      renders: 0,\n      node: 0,\n      edge: 0,\n      nodeDepth: 0,\n      edgeDepth: 0,\n    };\n    this._lastSignature = null;\n  }\n\n  _hashMat4(mat) {\n    if (!mat || mat.length < 16) return 0;\n    let hash = 2166136261;\n    for (let i = 0; i < 16; i += 1) {\n      const v = mat[i] ?? 0;\n      const n = Number.isFinite(v) ? v : 0;\n      const bits = (Math.fround(n) * 1e6) | 0;\n      hash ^= bits;\n      hash = Math.imul(hash, 16777619);\n    }\n    return hash >>> 0;\n  }\n\n  _hashArray(values) {\n    if (!values || typeof values.length !== 'number') return 0;\n    let hash = 2166136261;\n    for (let i = 0; i < values.length; i += 1) {\n      const v = values[i] ?? 0;\n      const n = Number.isFinite(v) ? v : 0;\n      const bits = (Math.fround(n) * 1e6) | 0;\n      hash ^= bits;\n      hash = Math.imul(hash, 16777619);\n    }\n    return hash >>> 0;\n  }\n\n  _safeVersion(fn, key = 'version') {\n    try {\n      const v = fn();\n      return Number.isFinite(v) ? v : 0;\n    } catch (error) {\n      warnOnce(\n        this,\n        `signature-version:${key}`,\n        `AttributeTracker: failed to read ${key}; forcing signature refresh.`,\n        { error },\n      );\n      return nextFallbackVersion();\n    }\n  }\n\n  _attributeVersionIfPresent(network, scope, name) {\n    if (!network || !name) return 0;\n    if (name === '$index') {\n      return this._safeVersion(() => network.getTopologyVersions?.()?.[scope] ?? 0, `${scope}:index-topology`);\n    }\n    const present = scope === 'node'\n      ? (network._nodeAttributes?.has?.(name) ?? false)\n      : (network._edgeAttributes?.has?.(name) ?? false);\n    if (!present) return 0;\n    return scope === 'node'\n      ? this._safeVersion(() => network.getNodeAttributeVersion?.(name), `${scope}:${name}`)\n      : this._safeVersion(() => network.getEdgeAttributeVersion?.(name), `${scope}:${name}`);\n  }\n\n  _computeSignature(frame, size, options) {\n    const network = frame?.network;\n    if (!network || !this.graphLayer) return null;\n    const camera = frame?.camera ?? this.renderer?.camera ?? null;\n    const scale = options.resolutionScale ?? 1;\n    const pixelRatio = (size?.devicePixelRatio ?? 1);\n    const widthPx = Math.max(1, Math.floor((size?.width ?? 1) * pixelRatio * scale));\n    const heightPx = Math.max(1, Math.floor((size?.height ?? 1) * pixelRatio * scale));\n    const trackDepth = options.trackDepth === true ? 1 : 0;\n\n    const topology = this._safeVersion(() => {\n      const t = network.getTopologyVersions?.();\n      return t ? ((t.node ?? 0) * 1315423911) ^ (t.edge ?? 0) : 0;\n    }, 'topology-signature');\n\n    const visuals = VISUAL_ATTRIBUTE_NAMES;\n    const nodePos = this._attributeVersionIfPresent(network, 'node', visuals.NODE_POSITION_ATTRIBUTE);\n    const nodeSize = this._attributeVersionIfPresent(network, 'node', visuals.NODE_SIZE_ATTRIBUTE);\n    const nodeState = this._attributeVersionIfPresent(network, 'node', visuals.NODE_STATE_ATTRIBUTE);\n    const nodeOutline = this._attributeVersionIfPresent(network, 'node', visuals.NODE_OUTLINE_WIDTH_ATTRIBUTE);\n    const edgeWidth = this._attributeVersionIfPresent(network, 'edge', visuals.EDGE_WIDTH_ATTRIBUTE);\n    const edgeEndSize = this._attributeVersionIfPresent(network, 'edge', visuals.EDGE_ENDPOINTS_SIZE_ATTRIBUTE);\n    const edgeState = this._attributeVersionIfPresent(network, 'edge', visuals.EDGE_STATE_ATTRIBUTE);\n\n    const nodeAttr = this.nodeAttribute ?? '';\n    const edgeAttr = this.edgeAttribute ?? '';\n    const nodeAttrVer = nodeAttr ? this._attributeVersionIfPresent(network, 'node', nodeAttr) : 0;\n    const edgeAttrVer = edgeAttr ? this._attributeVersionIfPresent(network, 'edge', edgeAttr) : 0;\n\n    const camHash = this._hashMat4(camera?.viewProjectionMatrix);\n    const edgeMode = this.graphLayer.getEffectiveEdgeRenderingMode?.() ?? this.graphLayer.edgeRenderingMode ?? 'quad';\n    const projection = camera?.projection ?? '';\n    const mode = camera?.mode ?? '';\n    const graphLayer = this.graphLayer ?? null;\n    const interpolation = this.graphLayer.getPositionInterpolationState?.()\n      ?? this.graphLayer.positionInterpolation\n      ?? null;\n    const interpolationEnabled = interpolation?.enabled === true ? 1 : 0;\n    const interpolationSourceVersion = Number.isFinite(interpolation?.sourceVersion)\n      ? Number(interpolation.sourceVersion)\n      : 0;\n    const interpolationSourceCount = Number.isFinite(interpolation?.sourceCount)\n      ? Math.max(0, Math.floor(Number(interpolation.sourceCount)))\n      : 0;\n    const interpolationFactor = Number.isFinite(interpolation?.factor)\n      ? Math.round(Math.max(0, Math.min(1, Number(interpolation.factor))) * 1e6)\n      : 1000000;\n    const delegateVersion = this._safeVersion(() => this.graphLayer?.positionDelegate?.version ?? 0, 'delegate-version');\n    const nodeStateScaleHash = this._hashArray(graphLayer?.nodeStateScale);\n    const edgeStateScaleHash = this._hashArray(graphLayer?.edgeStateScale);\n    const nodeNoStateScaleHash = graphLayer\n      ? this._hashArray([\n        graphLayer.nodeNoStateStyleEnabled === true ? graphLayer.nodeNoStateScale[0] : 1,\n        graphLayer.nodeNoStateStyleEnabled === true ? graphLayer.nodeNoStateScale[1] : 1,\n        graphLayer.nodeNoStateStyleEnabled === true ? graphLayer.nodeNoStateScale[2] : 1,\n        graphLayer.nodeNoStateStyleEnabled === true ? graphLayer.nodeNoStateScale[3] : 0,\n      ])\n      : 0;\n    const edgeNoStateScaleHash = graphLayer\n      ? this._hashArray([\n        graphLayer.edgeNoStateStyleEnabled === true ? graphLayer.edgeNoStateScale[0] : 1,\n        graphLayer.edgeNoStateStyleEnabled === true ? graphLayer.edgeNoStateScale[1] : 1,\n        graphLayer.edgeNoStateStyleEnabled === true ? graphLayer.edgeNoStateScale[2] : 1,\n        graphLayer.edgeNoStateStyleEnabled === true ? graphLayer.edgeNoStateScale[3] : 0,\n      ])\n      : 0;\n\n    return [\n      this.renderer?.device?.type ?? '',\n      widthPx,\n      heightPx,\n      scale,\n      trackDepth,\n      mode,\n      projection,\n      camHash,\n      edgeMode,\n      interpolationEnabled,\n      interpolationFactor,\n      interpolationSourceVersion,\n      interpolationSourceCount,\n      delegateVersion,\n      graphLayer?.hoveredNodeIndex ?? 0xffffffff,\n      graphLayer?.hoveredNodeState ?? 0,\n      graphLayer?.hoveredNodeIsVirtual === true ? 1 : 0,\n      graphLayer?.hoveredEdgeIndex ?? 0xffffffff,\n      graphLayer?.hoveredEdgeState ?? 0,\n      graphLayer?.hoveredEdgeIsVirtual === true ? 1 : 0,\n      graphLayer?.propagateHoveredNodeToEdges === true ? 1 : 0,\n      graphLayer?.propagateSelectedNodesToEdges === true ? 1 : 0,\n      nodeStateScaleHash,\n      edgeStateScaleHash,\n      nodeNoStateScaleHash,\n      edgeNoStateScaleHash,\n      // Visuals drive geometry; include their versions.\n      topology,\n      nodePos,\n      nodeSize,\n      nodeState,\n      nodeOutline,\n      edgeWidth,\n      edgeEndSize,\n      edgeState,\n      // Tracked attributes drive encoded buffers.\n      nodeAttr,\n      nodeAttrVer,\n      edgeAttr,\n      edgeAttrVer,\n    ].join('|');\n  }\n\n  enable(nodeAttribute, edgeAttribute, options = {}) {\n    this.nodeAttribute = nodeAttribute || null;\n    this.edgeAttribute = edgeAttribute || null;\n    this._lastSignature = null;\n    if (options.resolutionScale != null) {\n      const scale = Number(options.resolutionScale);\n      this.options.resolutionScale = Number.isFinite(scale) && scale > 0 ? scale : 1;\n    }\n    this.options.trackDepth = options.trackDepth === true;\n    this.options.autoRender = options.autoRender !== false;\n    if (options.edgeRenderingMode) {\n      this.graphLayer?.setEdgeRenderingMode?.(options.edgeRenderingMode);\n    }\n    return this;\n  }\n\n  disable(scope) {\n    if (scope === 'node') {\n      this.nodeAttribute = null;\n    } else if (scope === 'edge') {\n      this.edgeAttribute = null;\n    } else {\n      this.nodeAttribute = null;\n      this.edgeAttribute = null;\n    }\n    this._lastSignature = null;\n  }\n\n  resize(size) {\n    this.size = size;\n    this.webgl?.resize?.(size, this.options.resolutionScale);\n    this.webgpu?.resize?.(size, this.options.resolutionScale);\n    this._lastSignature = null;\n  }\n\n  async render(frame, force = false) {\n    if (!this.renderer?.device || !this.graphLayer || (!this.nodeAttribute && !this.edgeAttribute)) return null;\n    const signature = this._computeSignature(frame, this.size ?? this.renderer.size, this.options);\n    if (!force && signature && this.lastTargets && signature === this._lastSignature) {\n      return this.lastTargets;\n    }\n    if (!this.options.autoRender && !force) return this.lastTargets;\n    const device = this.renderer.device;\n    const hadNode = Boolean(this.nodeAttribute);\n    const hadEdge = Boolean(this.edgeAttribute);\n    const trackDepth = this.options.trackDepth === true;\n    let didRender = false;\n    if (device.type === 'webgl2') {\n      if (!this.webgl) {\n        this.webgl = new WebGLAttributeRenderer(this.graphLayer, this.targetPool, this.runner);\n        this.webgl.initialize(device);\n      }\n      this._activeWebglRenderer = this.webgl;\n      this.lastTargets = this.webgl.render(frame, this.size ?? this.renderer.size, {\n        nodeAttribute: this.nodeAttribute,\n        edgeAttribute: this.edgeAttribute,\n        resolutionScale: this.options.resolutionScale,\n        trackDepth: this.options.trackDepth,\n      });\n      debugWebGLPick('tracker:render:webgl', {\n        force,\n        size: this.size ?? this.renderer.size ?? null,\n        nodeAttribute: this.nodeAttribute,\n        edgeAttribute: this.edgeAttribute,\n        targets: this.lastTargets,\n      });\n      didRender = Boolean(this.lastTargets);\n    } else if (device.type === 'webgpu') {\n      if (!this.webgpu) {\n        this.webgpu = new WebGPUAttributeRenderer(this.graphLayer, this.targetPool, this.runner);\n        this.webgpu.initialize(device);\n      }\n      this.lastTargets = this.webgpu.render(frame, this.size ?? this.renderer.size, {\n        nodeAttribute: this.nodeAttribute,\n        edgeAttribute: this.edgeAttribute,\n        resolutionScale: this.options.resolutionScale,\n        trackDepth: this.options.trackDepth,\n      });\n      didRender = Boolean(this.lastTargets);\n    }\n    if (didRender) {\n      this._lastSignature = signature;\n      this.counters.renders = bumpCounter(this.counters.renders);\n      if (hadNode) {\n        this.counters.node = bumpCounter(this.counters.node);\n        if (trackDepth) this.counters.nodeDepth = bumpCounter(this.counters.nodeDepth);\n      }\n      if (hadEdge) {\n        this.counters.edge = bumpCounter(this.counters.edge);\n        if (trackDepth) this.counters.edgeDepth = bumpCounter(this.counters.edgeDepth);\n      }\n    }\n    return this.lastTargets;\n  }\n\n  async pick(clientX, clientY) {\n    if (!this.renderer?.device || !this.lastTargets) {\n      return { node: -1, edge: -1 };\n    }\n    const size = this.size ?? this.renderer.size ?? { width: 1, height: 1, devicePixelRatio: 1 };\n    const pixelRatio = size.devicePixelRatio ?? 1;\n    const scale = this.options.resolutionScale ?? 1;\n    const x = Math.floor(clientX * pixelRatio * scale);\n    const yRaw = Math.floor(clientY * pixelRatio * scale);\n    const targets = this.lastTargets;\n    const results = { node: -1, edge: -1, nodeDepth: null, edgeDepth: null };\n    const device = this.renderer.device;\n    debugWebGLPick('tracker:pick:start', {\n      clientX,\n      clientY,\n      pixelRatio,\n      scale,\n      x,\n      yRaw,\n      targets,\n      size,\n    });\n    const readTarget = async (target, key) => {\n      if (!target || !target.width || !target.height) return;\n      const clampedX = Math.max(0, Math.min(x, target.width - 1));\n      const y = device.type === 'webgl2'\n        ? Math.max(0, target.height - 1 - yRaw)\n        : yRaw;\n      const clampedY = Math.max(0, Math.min(y, target.height - 1));\n      debugWebGLPick('tracker:pick:target', {\n        key,\n        target,\n        clampedX,\n        clampedY,\n        yRaw,\n        transformedY: y,\n      });\n      const pixels = await device.readPixels(target, { x: clampedX, y: clampedY, width: 1, height: 1 });\n      if (!(pixels instanceof Uint8Array) || pixels.length < 4) return;\n      const format = device.type === 'webgpu'\n        ? (this.webgpu?.targetFormat || device.format)\n        : device.format;\n      const useUintTarget = device.type === 'webgpu' && format === 'r32uint';\n      const useBgra = device.type === 'webgpu' && typeof format === 'string' && format.startsWith('bgra');\n      const decoded = useUintTarget\n        ? decodePackedUint32(pixels, 0)\n        : (useBgra\n          ? decodePacked(new Uint8Array([pixels[2], pixels[1], pixels[0], pixels[3]]), 0)\n          : decodePacked(pixels, 0));\n      results[key] = decoded;\n      if (this.options.trackDepth) {\n        if (device.type === 'webgl2') {\n          const webglTracker = this._activeWebglRenderer ?? this.webgl;\n          const depthTarget = key === 'node' ? webglTracker?.depthTargets?.node : webglTracker?.depthTargets?.edge;\n          if (depthTarget) {\n            const depthPixels = await device.readPixels(depthTarget, { x: clampedX, y: clampedY, width: 1, height: 1 });\n            if (!(depthPixels instanceof Uint8Array) || depthPixels.length < 4) return;\n            const depthBytes = depthPixels instanceof Uint8Array ? depthPixels : new Uint8Array(depthPixels);\n            const reordered = useBgra\n              ? new Uint8Array([depthBytes[2], depthBytes[1], depthBytes[0], depthBytes[3]])\n              : depthBytes;\n            results[`${key}Depth`] = unpackDepthRGBA(reordered, 0);\n          } else {\n            const depth = webglTracker?.readDepth?.(target, clampedX, clampedY);\n            results[`${key}Depth`] = depth;\n          }\n        } else if (device.type === 'webgpu') {\n          const depthTarget = key === 'node' ? this.webgpu?.depthTargets?.node : this.webgpu?.depthTargets?.edge;\n          if (depthTarget?.texture) {\n            const depthPixels = await device.readPixels(depthTarget, { x: clampedX, y: clampedY, width: 1, height: 1 });\n            if (!(depthPixels instanceof Uint8Array) || depthPixels.length < 4) return;\n            const depthBytes = depthPixels instanceof Uint8Array ? depthPixels : new Uint8Array(depthPixels);\n            const reordered = useBgra\n              ? new Uint8Array([depthBytes[2], depthBytes[1], depthBytes[0], depthBytes[3]])\n              : depthBytes;\n            results[`${key}Depth`] = unpackDepthRGBA(reordered, 0);\n          }\n        }\n      }\n    };\n    if (this.nodeAttribute) {\n      await readTarget(targets.node, 'node');\n    }\n    if (this.edgeAttribute) {\n      await readTarget(targets.edge, 'edge');\n    }\n    return results;\n  }\n\n  destroy() {\n    this.webgl?.destroy?.();\n    this.webgpu?.destroy?.();\n    this.webgl = null;\n    this._activeWebglRenderer = null;\n    this.webgpu = null;\n    this.lastTargets = null;\n    this.targetPool?.releaseAll?.(this.renderer?.device);\n  }\n}\n","export class PerformanceMonitor {\n  constructor({ enabled = true, windowSize = 60, logEvery = 60 } = {}) {\n    this.enabled = enabled;\n    this.windowSize = windowSize;\n    this.logEvery = logEvery;\n    this.samples = new Map();\n    this.frameCounter = 0;\n  }\n\n  setEnabled(enabled) {\n    this.enabled = enabled;\n  }\n\n  record(label, durationMs) {\n    if (!this.enabled || !Number.isFinite(durationMs)) return;\n    const bucket = this.samples.get(label) ?? [];\n    bucket.push(durationMs);\n    if (bucket.length > this.windowSize) {\n      bucket.shift();\n    }\n    this.samples.set(label, bucket);\n  }\n\n  average(label) {\n    const bucket = this.samples.get(label);\n    if (!bucket || !bucket.length) return null;\n    const total = bucket.reduce((sum, value) => sum + value, 0);\n    return total / bucket.length;\n  }\n\n  getSummary() {\n    const summary = {};\n    for (const [label, values] of this.samples.entries()) {\n      if (!values.length) continue;\n      summary[label] = {\n        avg: this.round(this.average(label)),\n        min: this.round(Math.min(...values)),\n        max: this.round(Math.max(...values)),\n        samples: values.length,\n        window: this.windowSize,\n      };\n    }\n    return summary;\n  }\n\n  logIfDue() {\n    if (!this.enabled || !this.logEvery) return;\n    this.frameCounter += 1;\n    if (this.frameCounter % this.logEvery !== 0) return;\n    const summary = this.getSummary();\n    const labels = Object.keys(summary);\n    if (!labels.length) return;\n    console.log(`[Helios perf avg] over last ~${this.windowSize} samples:`, summary);\n  }\n\n  round(value) {\n    if (!Number.isFinite(value)) return value;\n    return Math.round(value * 100) / 100;\n  }\n}\n","export default function(specifier) {\n  var n = specifier.length / 6 | 0, colors = new Array(n), i = 0;\n  while (i < n) colors[i] = \"#\" + specifier.slice(i * 6, ++i * 6);\n  return colors;\n}\n","import colors from \"../colors.js\";\n\nexport default colors(\"1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"4269d0efb118ff725c6cc5b03ca951ff8ab7a463f297bbf59c6b4e9498a0\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab\");\n","export default function(constructor, factory, prototype) {\n  constructor.prototype = factory.prototype = prototype;\n  prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n  var prototype = Object.create(parent.prototype);\n  for (var key in definition) prototype[key] = definition[key];\n  return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n    reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n    reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n    reHex = /^#([0-9a-f]{3,8})$/,\n    reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n    reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n    reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n    reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n    reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n    reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n  aliceblue: 0xf0f8ff,\n  antiquewhite: 0xfaebd7,\n  aqua: 0x00ffff,\n  aquamarine: 0x7fffd4,\n  azure: 0xf0ffff,\n  beige: 0xf5f5dc,\n  bisque: 0xffe4c4,\n  black: 0x000000,\n  blanchedalmond: 0xffebcd,\n  blue: 0x0000ff,\n  blueviolet: 0x8a2be2,\n  brown: 0xa52a2a,\n  burlywood: 0xdeb887,\n  cadetblue: 0x5f9ea0,\n  chartreuse: 0x7fff00,\n  chocolate: 0xd2691e,\n  coral: 0xff7f50,\n  cornflowerblue: 0x6495ed,\n  cornsilk: 0xfff8dc,\n  crimson: 0xdc143c,\n  cyan: 0x00ffff,\n  darkblue: 0x00008b,\n  darkcyan: 0x008b8b,\n  darkgoldenrod: 0xb8860b,\n  darkgray: 0xa9a9a9,\n  darkgreen: 0x006400,\n  darkgrey: 0xa9a9a9,\n  darkkhaki: 0xbdb76b,\n  darkmagenta: 0x8b008b,\n  darkolivegreen: 0x556b2f,\n  darkorange: 0xff8c00,\n  darkorchid: 0x9932cc,\n  darkred: 0x8b0000,\n  darksalmon: 0xe9967a,\n  darkseagreen: 0x8fbc8f,\n  darkslateblue: 0x483d8b,\n  darkslategray: 0x2f4f4f,\n  darkslategrey: 0x2f4f4f,\n  darkturquoise: 0x00ced1,\n  darkviolet: 0x9400d3,\n  deeppink: 0xff1493,\n  deepskyblue: 0x00bfff,\n  dimgray: 0x696969,\n  dimgrey: 0x696969,\n  dodgerblue: 0x1e90ff,\n  firebrick: 0xb22222,\n  floralwhite: 0xfffaf0,\n  forestgreen: 0x228b22,\n  fuchsia: 0xff00ff,\n  gainsboro: 0xdcdcdc,\n  ghostwhite: 0xf8f8ff,\n  gold: 0xffd700,\n  goldenrod: 0xdaa520,\n  gray: 0x808080,\n  green: 0x008000,\n  greenyellow: 0xadff2f,\n  grey: 0x808080,\n  honeydew: 0xf0fff0,\n  hotpink: 0xff69b4,\n  indianred: 0xcd5c5c,\n  indigo: 0x4b0082,\n  ivory: 0xfffff0,\n  khaki: 0xf0e68c,\n  lavender: 0xe6e6fa,\n  lavenderblush: 0xfff0f5,\n  lawngreen: 0x7cfc00,\n  lemonchiffon: 0xfffacd,\n  lightblue: 0xadd8e6,\n  lightcoral: 0xf08080,\n  lightcyan: 0xe0ffff,\n  lightgoldenrodyellow: 0xfafad2,\n  lightgray: 0xd3d3d3,\n  lightgreen: 0x90ee90,\n  lightgrey: 0xd3d3d3,\n  lightpink: 0xffb6c1,\n  lightsalmon: 0xffa07a,\n  lightseagreen: 0x20b2aa,\n  lightskyblue: 0x87cefa,\n  lightslategray: 0x778899,\n  lightslategrey: 0x778899,\n  lightsteelblue: 0xb0c4de,\n  lightyellow: 0xffffe0,\n  lime: 0x00ff00,\n  limegreen: 0x32cd32,\n  linen: 0xfaf0e6,\n  magenta: 0xff00ff,\n  maroon: 0x800000,\n  mediumaquamarine: 0x66cdaa,\n  mediumblue: 0x0000cd,\n  mediumorchid: 0xba55d3,\n  mediumpurple: 0x9370db,\n  mediumseagreen: 0x3cb371,\n  mediumslateblue: 0x7b68ee,\n  mediumspringgreen: 0x00fa9a,\n  mediumturquoise: 0x48d1cc,\n  mediumvioletred: 0xc71585,\n  midnightblue: 0x191970,\n  mintcream: 0xf5fffa,\n  mistyrose: 0xffe4e1,\n  moccasin: 0xffe4b5,\n  navajowhite: 0xffdead,\n  navy: 0x000080,\n  oldlace: 0xfdf5e6,\n  olive: 0x808000,\n  olivedrab: 0x6b8e23,\n  orange: 0xffa500,\n  orangered: 0xff4500,\n  orchid: 0xda70d6,\n  palegoldenrod: 0xeee8aa,\n  palegreen: 0x98fb98,\n  paleturquoise: 0xafeeee,\n  palevioletred: 0xdb7093,\n  papayawhip: 0xffefd5,\n  peachpuff: 0xffdab9,\n  peru: 0xcd853f,\n  pink: 0xffc0cb,\n  plum: 0xdda0dd,\n  powderblue: 0xb0e0e6,\n  purple: 0x800080,\n  rebeccapurple: 0x663399,\n  red: 0xff0000,\n  rosybrown: 0xbc8f8f,\n  royalblue: 0x4169e1,\n  saddlebrown: 0x8b4513,\n  salmon: 0xfa8072,\n  sandybrown: 0xf4a460,\n  seagreen: 0x2e8b57,\n  seashell: 0xfff5ee,\n  sienna: 0xa0522d,\n  silver: 0xc0c0c0,\n  skyblue: 0x87ceeb,\n  slateblue: 0x6a5acd,\n  slategray: 0x708090,\n  slategrey: 0x708090,\n  snow: 0xfffafa,\n  springgreen: 0x00ff7f,\n  steelblue: 0x4682b4,\n  tan: 0xd2b48c,\n  teal: 0x008080,\n  thistle: 0xd8bfd8,\n  tomato: 0xff6347,\n  turquoise: 0x40e0d0,\n  violet: 0xee82ee,\n  wheat: 0xf5deb3,\n  white: 0xffffff,\n  whitesmoke: 0xf5f5f5,\n  yellow: 0xffff00,\n  yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n  copy(channels) {\n    return Object.assign(new this.constructor, this, channels);\n  },\n  displayable() {\n    return this.rgb().displayable();\n  },\n  hex: color_formatHex, // Deprecated! Use color.formatHex.\n  formatHex: color_formatHex,\n  formatHex8: color_formatHex8,\n  formatHsl: color_formatHsl,\n  formatRgb: color_formatRgb,\n  toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n  return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n  return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n  return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n  return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n  var m, l;\n  format = (format + \"\").trim().toLowerCase();\n  return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n      : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n      : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n      : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n      : null) // invalid hex\n      : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n      : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n      : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n      : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n      : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n      : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n      : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n      : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n      : null;\n}\n\nfunction rgbn(n) {\n  return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n  if (a <= 0) r = g = b = NaN;\n  return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n  if (!(o instanceof Color)) o = color(o);\n  if (!o) return new Rgb;\n  o = o.rgb();\n  return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n  return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n  this.r = +r;\n  this.g = +g;\n  this.b = +b;\n  this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n  brighter(k) {\n    k = k == null ? brighter : Math.pow(brighter, k);\n    return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n  },\n  darker(k) {\n    k = k == null ? darker : Math.pow(darker, k);\n    return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n  },\n  rgb() {\n    return this;\n  },\n  clamp() {\n    return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n  },\n  displayable() {\n    return (-0.5 <= this.r && this.r < 255.5)\n        && (-0.5 <= this.g && this.g < 255.5)\n        && (-0.5 <= this.b && this.b < 255.5)\n        && (0 <= this.opacity && this.opacity <= 1);\n  },\n  hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n  formatHex: rgb_formatHex,\n  formatHex8: rgb_formatHex8,\n  formatRgb: rgb_formatRgb,\n  toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n  return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n  return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n  const a = clampa(this.opacity);\n  return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n  return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n  return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n  value = clampi(value);\n  return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n  if (a <= 0) h = s = l = NaN;\n  else if (l <= 0 || l >= 1) h = s = NaN;\n  else if (s <= 0) h = NaN;\n  return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n  if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n  if (!(o instanceof Color)) o = color(o);\n  if (!o) return new Hsl;\n  if (o instanceof Hsl) return o;\n  o = o.rgb();\n  var r = o.r / 255,\n      g = o.g / 255,\n      b = o.b / 255,\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      h = NaN,\n      s = max - min,\n      l = (max + min) / 2;\n  if (s) {\n    if (r === max) h = (g - b) / s + (g < b) * 6;\n    else if (g === max) h = (b - r) / s + 2;\n    else h = (r - g) / s + 4;\n    s /= l < 0.5 ? max + min : 2 - max - min;\n    h *= 60;\n  } else {\n    s = l > 0 && l < 1 ? 0 : h;\n  }\n  return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n  return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n  this.h = +h;\n  this.s = +s;\n  this.l = +l;\n  this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n  brighter(k) {\n    k = k == null ? brighter : Math.pow(brighter, k);\n    return new Hsl(this.h, this.s, this.l * k, this.opacity);\n  },\n  darker(k) {\n    k = k == null ? darker : Math.pow(darker, k);\n    return new Hsl(this.h, this.s, this.l * k, this.opacity);\n  },\n  rgb() {\n    var h = this.h % 360 + (this.h < 0) * 360,\n        s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n        l = this.l,\n        m2 = l + (l < 0.5 ? l : 1 - l) * s,\n        m1 = 2 * l - m2;\n    return new Rgb(\n      hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n      hsl2rgb(h, m1, m2),\n      hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n      this.opacity\n    );\n  },\n  clamp() {\n    return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n  },\n  displayable() {\n    return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n        && (0 <= this.l && this.l <= 1)\n        && (0 <= this.opacity && this.opacity <= 1);\n  },\n  formatHsl() {\n    const a = clampa(this.opacity);\n    return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n  }\n}));\n\nfunction clamph(value) {\n  value = (value || 0) % 360;\n  return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n  return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n  return (h < 60 ? m1 + (m2 - m1) * h / 60\n      : h < 180 ? m2\n      : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n      : m1) * 255;\n}\n","export const radians = Math.PI / 180;\nexport const degrees = 180 / Math.PI;\n","import define, {extend} from \"./define.js\";\nimport {Color, rgbConvert, Rgb, darker, brighter} from \"./color.js\";\nimport {degrees, radians} from \"./math.js\";\n\nvar A = -0.14861,\n    B = +1.78277,\n    C = -0.29227,\n    D = -0.90649,\n    E = +1.97294,\n    ED = E * D,\n    EB = E * B,\n    BC_DA = B * C - D * A;\n\nfunction cubehelixConvert(o) {\n  if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n  if (!(o instanceof Rgb)) o = rgbConvert(o);\n  var r = o.r / 255,\n      g = o.g / 255,\n      b = o.b / 255,\n      l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n      bl = b - l,\n      k = (E * (g - l) - C * bl) / D,\n      s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1\n      h = s ? Math.atan2(k, bl) * degrees - 120 : NaN;\n  return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\n\nexport default function cubehelix(h, s, l, opacity) {\n  return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\n\nexport function Cubehelix(h, s, l, opacity) {\n  this.h = +h;\n  this.s = +s;\n  this.l = +l;\n  this.opacity = +opacity;\n}\n\ndefine(Cubehelix, cubehelix, extend(Color, {\n  brighter(k) {\n    k = k == null ? brighter : Math.pow(brighter, k);\n    return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n  },\n  darker(k) {\n    k = k == null ? darker : Math.pow(darker, k);\n    return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n  },\n  rgb() {\n    var h = isNaN(this.h) ? 0 : (this.h + 120) * radians,\n        l = +this.l,\n        a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n        cosh = Math.cos(h),\n        sinh = Math.sin(h);\n    return new Rgb(\n      255 * (l + a * (A * cosh + B * sinh)),\n      255 * (l + a * (C * cosh + D * sinh)),\n      255 * (l + a * (E * cosh)),\n      this.opacity\n    );\n  }\n}));\n","export function basis(t1, v0, v1, v2, v3) {\n  var t2 = t1 * t1, t3 = t2 * t1;\n  return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n      + (4 - 6 * t2 + 3 * t3) * v1\n      + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n      + t3 * v3) / 6;\n}\n\nexport default function(values) {\n  var n = values.length - 1;\n  return function(t) {\n    var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n        v1 = values[i],\n        v2 = values[i + 1],\n        v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n        v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n    return basis((t - i / n) * n, v0, v1, v2, v3);\n  };\n}\n","export default x => () => x;\n","import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n  return function(t) {\n    return a + t * d;\n  };\n}\n\nfunction exponential(a, b, y) {\n  return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n    return Math.pow(a + t * b, y);\n  };\n}\n\nexport function hue(a, b) {\n  var d = b - a;\n  return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n  return (y = +y) === 1 ? nogamma : function(a, b) {\n    return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n  };\n}\n\nexport default function nogamma(a, b) {\n  var d = b - a;\n  return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n  var color = gamma(y);\n\n  function rgb(start, end) {\n    var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n        g = color(start.g, end.g),\n        b = color(start.b, end.b),\n        opacity = nogamma(start.opacity, end.opacity);\n    return function(t) {\n      start.r = r(t);\n      start.g = g(t);\n      start.b = b(t);\n      start.opacity = opacity(t);\n      return start + \"\";\n    };\n  }\n\n  rgb.gamma = rgbGamma;\n\n  return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n  return function(colors) {\n    var n = colors.length,\n        r = new Array(n),\n        g = new Array(n),\n        b = new Array(n),\n        i, color;\n    for (i = 0; i < n; ++i) {\n      color = colorRgb(colors[i]);\n      r[i] = color.r || 0;\n      g[i] = color.g || 0;\n      b[i] = color.b || 0;\n    }\n    r = spline(r);\n    g = spline(g);\n    b = spline(b);\n    color.opacity = 1;\n    return function(t) {\n      color.r = r(t);\n      color.g = g(t);\n      color.b = b(t);\n      return color + \"\";\n    };\n  };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","import {cubehelix as colorCubehelix} from \"d3-color\";\nimport color, {hue} from \"./color.js\";\n\nfunction cubehelix(hue) {\n  return (function cubehelixGamma(y) {\n    y = +y;\n\n    function cubehelix(start, end) {\n      var h = hue((start = colorCubehelix(start)).h, (end = colorCubehelix(end)).h),\n          s = color(start.s, end.s),\n          l = color(start.l, end.l),\n          opacity = color(start.opacity, end.opacity);\n      return function(t) {\n        start.h = h(t);\n        start.s = s(t);\n        start.l = l(Math.pow(t, y));\n        start.opacity = opacity(t);\n        return start + \"\";\n      };\n    }\n\n    cubehelix.gamma = cubehelixGamma;\n\n    return cubehelix;\n  })(1);\n}\n\nexport default cubehelix(hue);\nexport var cubehelixLong = cubehelix(color);\n","import {interpolateRgbBasis} from \"d3-interpolate\";\n\nexport default scheme => interpolateRgbBasis(scheme[scheme.length - 1]);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"d8b365f5f5f55ab4ac\",\n  \"a6611adfc27d80cdc1018571\",\n  \"a6611adfc27df5f5f580cdc1018571\",\n  \"8c510ad8b365f6e8c3c7eae55ab4ac01665e\",\n  \"8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e\",\n  \"8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e\",\n  \"8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e\",\n  \"5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30\",\n  \"5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"af8dc3f7f7f77fbf7b\",\n  \"7b3294c2a5cfa6dba0008837\",\n  \"7b3294c2a5cff7f7f7a6dba0008837\",\n  \"762a83af8dc3e7d4e8d9f0d37fbf7b1b7837\",\n  \"762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837\",\n  \"762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837\",\n  \"762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837\",\n  \"40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b\",\n  \"40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"e9a3c9f7f7f7a1d76a\",\n  \"d01c8bf1b6dab8e1864dac26\",\n  \"d01c8bf1b6daf7f7f7b8e1864dac26\",\n  \"c51b7de9a3c9fde0efe6f5d0a1d76a4d9221\",\n  \"c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221\",\n  \"c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221\",\n  \"c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221\",\n  \"8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419\",\n  \"8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"998ec3f7f7f7f1a340\",\n  \"5e3c99b2abd2fdb863e66101\",\n  \"5e3c99b2abd2f7f7f7fdb863e66101\",\n  \"542788998ec3d8daebfee0b6f1a340b35806\",\n  \"542788998ec3d8daebf7f7f7fee0b6f1a340b35806\",\n  \"5427888073acb2abd2d8daebfee0b6fdb863e08214b35806\",\n  \"5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806\",\n  \"2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08\",\n  \"2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"ef8a62f7f7f767a9cf\",\n  \"ca0020f4a58292c5de0571b0\",\n  \"ca0020f4a582f7f7f792c5de0571b0\",\n  \"b2182bef8a62fddbc7d1e5f067a9cf2166ac\",\n  \"b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac\",\n  \"b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac\",\n  \"b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac\",\n  \"67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061\",\n  \"67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"ef8a62ffffff999999\",\n  \"ca0020f4a582bababa404040\",\n  \"ca0020f4a582ffffffbababa404040\",\n  \"b2182bef8a62fddbc7e0e0e09999994d4d4d\",\n  \"b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d\",\n  \"b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d\",\n  \"b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d\",\n  \"67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a\",\n  \"67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"fc8d59ffffbf91bfdb\",\n  \"d7191cfdae61abd9e92c7bb6\",\n  \"d7191cfdae61ffffbfabd9e92c7bb6\",\n  \"d73027fc8d59fee090e0f3f891bfdb4575b4\",\n  \"d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4\",\n  \"d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4\",\n  \"d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4\",\n  \"a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695\",\n  \"a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"fc8d59ffffbf91cf60\",\n  \"d7191cfdae61a6d96a1a9641\",\n  \"d7191cfdae61ffffbfa6d96a1a9641\",\n  \"d73027fc8d59fee08bd9ef8b91cf601a9850\",\n  \"d73027fc8d59fee08bffffbfd9ef8b91cf601a9850\",\n  \"d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850\",\n  \"d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850\",\n  \"a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837\",\n  \"a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"fc8d59ffffbf99d594\",\n  \"d7191cfdae61abdda42b83ba\",\n  \"d7191cfdae61ffffbfabdda42b83ba\",\n  \"d53e4ffc8d59fee08be6f59899d5943288bd\",\n  \"d53e4ffc8d59fee08bffffbfe6f59899d5943288bd\",\n  \"d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd\",\n  \"d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd\",\n  \"9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2\",\n  \"9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"e5f5f999d8c92ca25f\",\n  \"edf8fbb2e2e266c2a4238b45\",\n  \"edf8fbb2e2e266c2a42ca25f006d2c\",\n  \"edf8fbccece699d8c966c2a42ca25f006d2c\",\n  \"edf8fbccece699d8c966c2a441ae76238b45005824\",\n  \"f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824\",\n  \"f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"e0ecf49ebcda8856a7\",\n  \"edf8fbb3cde38c96c688419d\",\n  \"edf8fbb3cde38c96c68856a7810f7c\",\n  \"edf8fbbfd3e69ebcda8c96c68856a7810f7c\",\n  \"edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b\",\n  \"f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b\",\n  \"f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"e0f3dba8ddb543a2ca\",\n  \"f0f9e8bae4bc7bccc42b8cbe\",\n  \"f0f9e8bae4bc7bccc443a2ca0868ac\",\n  \"f0f9e8ccebc5a8ddb57bccc443a2ca0868ac\",\n  \"f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e\",\n  \"f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e\",\n  \"f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"fee8c8fdbb84e34a33\",\n  \"fef0d9fdcc8afc8d59d7301f\",\n  \"fef0d9fdcc8afc8d59e34a33b30000\",\n  \"fef0d9fdd49efdbb84fc8d59e34a33b30000\",\n  \"fef0d9fdd49efdbb84fc8d59ef6548d7301f990000\",\n  \"fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000\",\n  \"fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"ece2f0a6bddb1c9099\",\n  \"f6eff7bdc9e167a9cf02818a\",\n  \"f6eff7bdc9e167a9cf1c9099016c59\",\n  \"f6eff7d0d1e6a6bddb67a9cf1c9099016c59\",\n  \"f6eff7d0d1e6a6bddb67a9cf3690c002818a016450\",\n  \"fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450\",\n  \"fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"ece7f2a6bddb2b8cbe\",\n  \"f1eef6bdc9e174a9cf0570b0\",\n  \"f1eef6bdc9e174a9cf2b8cbe045a8d\",\n  \"f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d\",\n  \"f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b\",\n  \"fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b\",\n  \"fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"e7e1efc994c7dd1c77\",\n  \"f1eef6d7b5d8df65b0ce1256\",\n  \"f1eef6d7b5d8df65b0dd1c77980043\",\n  \"f1eef6d4b9dac994c7df65b0dd1c77980043\",\n  \"f1eef6d4b9dac994c7df65b0e7298ace125691003f\",\n  \"f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f\",\n  \"f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"fde0ddfa9fb5c51b8a\",\n  \"feebe2fbb4b9f768a1ae017e\",\n  \"feebe2fbb4b9f768a1c51b8a7a0177\",\n  \"feebe2fcc5c0fa9fb5f768a1c51b8a7a0177\",\n  \"feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177\",\n  \"fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177\",\n  \"fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"edf8b17fcdbb2c7fb8\",\n  \"ffffcca1dab441b6c4225ea8\",\n  \"ffffcca1dab441b6c42c7fb8253494\",\n  \"ffffccc7e9b47fcdbb41b6c42c7fb8253494\",\n  \"ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84\",\n  \"ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84\",\n  \"ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"f7fcb9addd8e31a354\",\n  \"ffffccc2e69978c679238443\",\n  \"ffffccc2e69978c67931a354006837\",\n  \"ffffccd9f0a3addd8e78c67931a354006837\",\n  \"ffffccd9f0a3addd8e78c67941ab5d238443005a32\",\n  \"ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32\",\n  \"ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"fff7bcfec44fd95f0e\",\n  \"ffffd4fed98efe9929cc4c02\",\n  \"ffffd4fed98efe9929d95f0e993404\",\n  \"ffffd4fee391fec44ffe9929d95f0e993404\",\n  \"ffffd4fee391fec44ffe9929ec7014cc4c028c2d04\",\n  \"ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04\",\n  \"ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"ffeda0feb24cf03b20\",\n  \"ffffb2fecc5cfd8d3ce31a1c\",\n  \"ffffb2fecc5cfd8d3cf03b20bd0026\",\n  \"ffffb2fed976feb24cfd8d3cf03b20bd0026\",\n  \"ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026\",\n  \"ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026\",\n  \"ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"deebf79ecae13182bd\",\n  \"eff3ffbdd7e76baed62171b5\",\n  \"eff3ffbdd7e76baed63182bd08519c\",\n  \"eff3ffc6dbef9ecae16baed63182bd08519c\",\n  \"eff3ffc6dbef9ecae16baed64292c62171b5084594\",\n  \"f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594\",\n  \"f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"e5f5e0a1d99b31a354\",\n  \"edf8e9bae4b374c476238b45\",\n  \"edf8e9bae4b374c47631a354006d2c\",\n  \"edf8e9c7e9c0a1d99b74c47631a354006d2c\",\n  \"edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32\",\n  \"f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32\",\n  \"f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"f0f0f0bdbdbd636363\",\n  \"f7f7f7cccccc969696525252\",\n  \"f7f7f7cccccc969696636363252525\",\n  \"f7f7f7d9d9d9bdbdbd969696636363252525\",\n  \"f7f7f7d9d9d9bdbdbd969696737373525252252525\",\n  \"fffffff0f0f0d9d9d9bdbdbd969696737373525252252525\",\n  \"fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"efedf5bcbddc756bb1\",\n  \"f2f0f7cbc9e29e9ac86a51a3\",\n  \"f2f0f7cbc9e29e9ac8756bb154278f\",\n  \"f2f0f7dadaebbcbddc9e9ac8756bb154278f\",\n  \"f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486\",\n  \"fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486\",\n  \"fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"fee0d2fc9272de2d26\",\n  \"fee5d9fcae91fb6a4acb181d\",\n  \"fee5d9fcae91fb6a4ade2d26a50f15\",\n  \"fee5d9fcbba1fc9272fb6a4ade2d26a50f15\",\n  \"fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d\",\n  \"fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d\",\n  \"fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n  \"fee6cefdae6be6550d\",\n  \"feeddefdbe85fd8d3cd94701\",\n  \"feeddefdbe85fd8d3ce6550da63603\",\n  \"feeddefdd0a2fdae6bfd8d3ce6550da63603\",\n  \"feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04\",\n  \"fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04\",\n  \"fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704\"\n).map(colors);\n\nexport default ramp(scheme);\n","export default function(t) {\n  t = Math.max(0, Math.min(1, t));\n  return \"rgb(\"\n      + Math.max(0, Math.min(255, Math.round(-4.54 - t * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - t * 2710.57))))))) + \", \"\n      + Math.max(0, Math.min(255, Math.round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - t * 67.37))))))) + \", \"\n      + Math.max(0, Math.min(255, Math.round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - t * 2475.67)))))))\n      + \")\";\n}\n","import {cubehelix} from \"d3-color\";\nimport {interpolateCubehelixLong} from \"d3-interpolate\";\n\nexport default interpolateCubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));\n","import {cubehelix} from \"d3-color\";\nimport {interpolateCubehelixLong} from \"d3-interpolate\";\n\nexport var warm = interpolateCubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));\n\nexport var cool = interpolateCubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));\n\nvar c = cubehelix();\n\nexport default function(t) {\n  if (t < 0 || t > 1) t -= Math.floor(t);\n  var ts = Math.abs(t - 0.5);\n  c.h = 360 * t - 100;\n  c.s = 1.5 - 1.5 * ts;\n  c.l = 0.8 - 0.9 * ts;\n  return c + \"\";\n}\n","import {rgb} from \"d3-color\";\n\nvar c = rgb(),\n    pi_1_3 = Math.PI / 3,\n    pi_2_3 = Math.PI * 2 / 3;\n\nexport default function(t) {\n  var x;\n  t = (0.5 - t) * Math.PI;\n  c.r = 255 * (x = Math.sin(t)) * x;\n  c.g = 255 * (x = Math.sin(t + pi_1_3)) * x;\n  c.b = 255 * (x = Math.sin(t + pi_2_3)) * x;\n  return c + \"\";\n}\n","export default function(t) {\n  t = Math.max(0, Math.min(1, t));\n  return \"rgb(\"\n      + Math.max(0, Math.min(255, Math.round(34.61 + t * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - t * 14825.05))))))) + \", \"\n      + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + t * 707.56))))))) + \", \"\n      + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66)))))))\n      + \")\";\n}\n","import colors from \"../colors.js\";\n\nfunction ramp(range) {\n  var n = range.length;\n  return function(t) {\n    return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n  };\n}\n\nexport default ramp(colors(\"44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725\"));\n\nexport var magma = ramp(colors(\"00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf\"));\n\nexport var inferno = ramp(colors(\"00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4\"));\n\nexport var plasma = ramp(colors(\"0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921\"));\n","import * as d3Chromatic from 'd3-scale-chromatic';\nimport rawColormapData from './ColormapData.json' with { type: 'json' };\n\nfunction clamp01(value) {\n  if (!Number.isFinite(value)) return 0;\n  if (value < 0) return 0;\n  if (value > 1) return 1;\n  return value;\n}\n\nfunction lerp(a, b, t) {\n  return a + (b - a) * t;\n}\n\nfunction lerpColor(a, b, t) {\n  const aLen = Array.isArray(a) ? a.length : 0;\n  const bLen = Array.isArray(b) ? b.length : 0;\n  const size = Math.max(3, Math.min(Math.max(aLen, bLen), 4));\n  const next = new Array(size);\n  for (let i = 0; i < size; i += 1) {\n    const av = a?.[i] ?? a?.[0] ?? 0;\n    const bv = b?.[i] ?? b?.[0] ?? av;\n    next[i] = lerp(av, bv, t);\n  }\n  if (size === 3) next.push(1);\n  if (size === 4 && (next[3] == null || Number.isNaN(next[3]))) next[3] = 1;\n  return next;\n}\n\n/**\n * Decode base64-encoded binary colormap data.\n *\n * @public\n * @apiSection Colormaps\n * @param {string} b64 - Base64-encoded byte payload.\n * @returns {Uint8Array} Decoded bytes.\n */\nexport function base64ToUint8Array(b64) {\n  if (typeof atob === 'function') {\n    return Uint8Array.from(atob(b64), (c) => c.charCodeAt(0));\n  }\n  return Uint8Array.from(Buffer.from(b64, 'base64'));\n}\n\n/**\n * Decode packed RGB colormap bytes into color tuples.\n *\n * @public\n * @apiSection Colormaps\n * @param {string} b64 - Base64-encoded RGB byte payload.\n * @param {number} [expectedN] - Expected number of colors.\n * @returns {Array<Array<number>>} RGB colors in byte space.\n */\nexport function decodeColormapData(b64, expectedN) {\n  const bytes = base64ToUint8Array(b64);\n  if (expectedN != null && bytes.length !== expectedN * 3) {\n    console.warn(\n      `Colormap length mismatch: expected ${expectedN * 3} bytes, got ${bytes.length}`,\n    );\n  }\n  const colors = [];\n  for (let i = 0; i < bytes.length; i += 3) {\n    colors.push([bytes[i], bytes[i + 1], bytes[i + 2]]);\n  }\n  return colors;\n}\n\nfunction normalizeCssColor(value) {\n  const fallback = [0, 0, 0, 1];\n  if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n    if (value.length === 4) {\n      const needsScale = value.some((v, i) => i < 3 && v > 1);\n      return needsScale ? value.map((v, i) => (i < 3 ? (v ?? 0) / 255 : v ?? 1)) : [...value];\n    }\n    if (value.length === 3) {\n      const needsScale = value.some((v) => v > 1);\n      const scaled = needsScale ? value.map((v) => (v ?? 0) / 255) : value;\n      return [scaled[0] ?? 0, scaled[1] ?? 0, scaled[2] ?? 0, 1];\n    }\n  }\n  if (typeof value === 'number') {\n    const v = value > 1 ? value / 255 : value;\n    return [v, v, v, 1];\n  }\n  if (typeof value !== 'string') return fallback;\n  const color = value.trim();\n  const hexMatch = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(color);\n  if (hexMatch) {\n    const raw = hexMatch[1];\n    const expand = raw.length === 3 ? raw.split('').map((c) => c + c).join('') : raw;\n    const int = parseInt(expand, 16);\n    return [(int >> 16) / 255, ((int >> 8) & 255) / 255, (int & 255) / 255, 1];\n  }\n  const rgbMatch = /^rgba?\\(([^)]+)\\)$/i.exec(color);\n  if (rgbMatch) {\n    const parts = rgbMatch[1]\n      .split(',')\n      .map((v) => parseFloat(v.trim()))\n      .filter((v) => Number.isFinite(v));\n    if (parts.length >= 3) {\n      const [r, g, b, a = 1] = parts;\n      return [clamp01(r / 255), clamp01(g / 255), clamp01(b / 255), clamp01(a)];\n    }\n  }\n  return fallback;\n}\n\nfunction normalizeColors(colors) {\n  return colors.map((c) => normalizeCssColor(c));\n}\n\nfunction basisBlend(t, v0, v1, v2, v3) {\n  const t2 = t * t;\n  const t3 = t2 * t;\n  return ((1 - 3 * t + 3 * t2 - t3) * v0\n    + (4 - 6 * t2 + 3 * t3) * v1\n    + (1 + 3 * t + 3 * t2 - 3 * t3) * v2\n    + t3 * v3) / 6;\n}\n\nfunction basisVector(t, a, b, c, d) {\n  const size = Math.max(3, Math.min(4, Math.max(a?.length ?? 0, b?.length ?? 0, c?.length ?? 0, d?.length ?? 0)));\n  const out = new Array(size);\n  for (let i = 0; i < size; i += 1) {\n    const av = a?.[i] ?? a?.[0] ?? 0;\n    const bv = b?.[i] ?? b?.[0] ?? av;\n    const cv = c?.[i] ?? c?.[0] ?? bv;\n    const dv = d?.[i] ?? d?.[0] ?? cv;\n    out[i] = basisBlend(t, av, bv, cv, dv);\n  }\n  if (size === 3) out.push(1);\n  if (size === 4 && (out[3] == null || Number.isNaN(out[3]))) out[3] = 1;\n  return out;\n}\n\nfunction createInterpolatorFromList(colors, alreadyNormalized = false, closed = false) {\n  const list = alreadyNormalized ? colors.map((c) => [...c]) : normalizeColors(colors);\n  const n = list.length;\n  if (n === 0) return () => [0, 0, 0, 1];\n  if (n === 1) return () => [...list[0]];\n  return (tRaw) => {\n    const t = clamp01(tRaw);\n    if (closed) {\n      const scaled = t * n;\n      const i = Math.floor(scaled);\n      const localT = scaled - i;\n      const v0 = list[(i - 1 + n) % n];\n      const v1 = list[i % n];\n      const v2 = list[(i + 1) % n];\n      const v3 = list[(i + 2) % n];\n      return basisVector(localT, v0, v1, v2, v3);\n    }\n    const scaled = t * (n - 1);\n    const i = Math.floor(scaled);\n    const localT = scaled - i;\n    const v0 = i > 0 ? list[i - 1] : list[0];\n    const v1 = list[i];\n    const v2 = i + 1 < n ? list[i + 1] : list[n - 1];\n    const v3 = i + 2 < n ? list[i + 2] : list[n - 1];\n    return basisVector(localT, v0, v1, v2, v3);\n  };\n}\n\nfunction sampleColorsFromInterpolator(interpolator, count, alpha) {\n  const safeCount = Math.max(1, count ?? 1);\n  const result = [];\n  const denom = Math.max(1, safeCount - 1);\n  for (let i = 0; i < safeCount; i += 1) {\n    const t = denom === 0 ? 0 : i / denom;\n    const value = interpolator(t);\n    const normalized = normalizeCssColor(value);\n    normalized[3] = alpha ?? normalized[3] ?? 1;\n    result.push(normalized);\n  }\n  return result;\n}\n\nfunction sampleColorsFromList(colors, count, alreadyNormalized = false) {\n  if (!colors?.length) return [];\n  const normalized = alreadyNormalized ? colors : normalizeColors(colors);\n  if (!count || count >= normalized.length) return normalized.map((c) => [...c]);\n  const result = [];\n  const step = (normalized.length - 1) / Math.max(1, count - 1);\n  for (let i = 0; i < count; i += 1) {\n    const pos = i * step;\n    const i0 = Math.max(0, Math.min(normalized.length - 1, Math.floor(pos)));\n    const i1 = Math.max(0, Math.min(normalized.length - 1, i0 + 1));\n    const localT = pos - i0;\n    result.push(lerpColor(normalized[i0], normalized[i1], localT));\n  }\n  return result;\n}\n\nconst CATEGORY18_COLORS = [\n  '#1f77b4',\n  '#ff7f0e',\n  '#2ca02c',\n  '#d62728',\n  '#9467bd',\n  '#8c564b',\n  '#e377c2',\n  '#bcbd22',\n  '#17becf',\n  '#aec7e8',\n  '#ffbb78',\n  '#98df8a',\n  '#ff9896',\n  '#c5b0d5',\n  '#c49c94',\n  '#f7b6d2',\n  '#dbdb8d',\n  '#9edae5',\n];\n\nfunction createRepeatingSchemeDescriptor(name, colors, source = 'helios') {\n  const normalized = normalizeColors(colors);\n  const interpolator = createInterpolatorFromList(normalized, true, false);\n  return {\n    name,\n    source,\n    isScheme: true,\n    interpolate: (t) => interpolator(t),\n    scheme: (count) => {\n      const target = Math.max(1, Math.floor(Number(count) || normalized.length));\n      return Array.from({ length: target }, (_, index) => [...normalized[index % normalized.length]]);\n    },\n  };\n}\n\nfunction buildJsonColormapDescriptor(name, entry, source) {\n  let cached = null;\n  const load = () => {\n    if (cached) return cached;\n    const decoded = decodeColormapData(entry.data, entry.n).map((c) => [c[0] / 255, c[1] / 255, c[2] / 255, 1]);\n    cached = decoded;\n    return cached;\n  };\n  return {\n    name,\n    source,\n    isScheme: !!entry.isScheme,\n    interpolate: (() => {\n      const interpolator = createInterpolatorFromList(load(), true, false);\n      return (t) => interpolator(t);\n    })(),\n    scheme: (count) => sampleColorsFromList(load(), count ?? entry.n ?? load().length, true),\n  };\n}\n\nfunction buildD3Descriptors() {\n  const RAMP_SIZE = 1024;\n  const result = {};\n  for (const [name, value] of Object.entries(d3Chromatic)) {\n    if (!value) continue;\n    if (typeof value === 'function') {\n      // Build a ramp once from the d3 interpolator to avoid per-sample CSS parsing.\n      const ramp = new Float32Array(RAMP_SIZE * 4);\n      for (let i = 0; i < RAMP_SIZE; i += 1) {\n        const t = i / (RAMP_SIZE - 1);\n        const color = normalizeCssColor(value(clamp01(t)));\n        const offset = i * 4;\n        ramp[offset] = color[0];\n        ramp[offset + 1] = color[1];\n        ramp[offset + 2] = color[2];\n        ramp[offset + 3] = color[3];\n      }\n      const rampInterpolator = (tRaw) => {\n        const t = clamp01(tRaw);\n        const scaled = t * (RAMP_SIZE - 1);\n        const i0 = Math.max(0, Math.min(RAMP_SIZE - 1, Math.floor(scaled)));\n        const i1 = Math.max(0, Math.min(RAMP_SIZE - 1, i0 + 1));\n        const localT = scaled - i0;\n        const offset0 = i0 * 4;\n        const offset1 = i1 * 4;\n        return [\n          lerp(ramp[offset0], ramp[offset1], localT),\n          lerp(ramp[offset0 + 1], ramp[offset1 + 1], localT),\n          lerp(ramp[offset0 + 2], ramp[offset1 + 2], localT),\n          lerp(ramp[offset0 + 3], ramp[offset1 + 3], localT),\n        ];\n      };\n      result[name] = {\n        name,\n        source: 'd3',\n        isScheme: false,\n        interpolate: rampInterpolator,\n        scheme: (count) => sampleColorsFromInterpolator(rampInterpolator, count ?? 10),\n      };\n    } else if (Array.isArray(value)) {\n      const colorsByCount = new Map();\n      value.forEach((entry, index) => {\n        if (!Array.isArray(entry)) return;\n        colorsByCount.set(index, normalizeColors(entry));\n      });\n      const maxKey = Math.max(...colorsByCount.keys(), 0);\n      const fallback = Array.isArray(value[0]) ? normalizeColors(value[value.length - 1]) : normalizeColors(value);\n      const baseColors = value.find((entry) => Array.isArray(entry) && entry.length >= 2) ?? fallback;\n      const baseInterpolator = createInterpolatorFromList(baseColors, true, false);\n      result[name] = {\n        name,\n        source: 'd3',\n        isScheme: true,\n        scheme: (count) => {\n          if (!colorsByCount.size) return fallback;\n          const keys = [...colorsByCount.keys()].sort((a, b) => a - b);\n          const target = count ?? keys[keys.length - 1];\n          let chosen = null;\n          for (const key of keys) {\n            if (key === target) {\n              chosen = colorsByCount.get(key);\n              break;\n            }\n            if (key > target) {\n              chosen = colorsByCount.get(chosen ?? key) ?? colorsByCount.get(key);\n              break;\n            }\n            chosen = colorsByCount.get(key) ?? chosen;\n          }\n          return chosen ?? fallback;\n        },\n        interpolate: (t) => baseInterpolator(t),\n      };\n    }\n  }\n  return result;\n}\n\nconst d3Descriptors = buildD3Descriptors();\n\nfunction buildJsonDescriptors() {\n  const CET = {};\n  const cmasher = {};\n  const helios = {};\n  for (const [name, entry] of Object.entries(rawColormapData)) {\n    const descriptor = buildJsonColormapDescriptor(name, entry, name.startsWith('CET') ? 'CET' : name.startsWith('cmasher') ? 'cmasher' : 'helios');\n    if (name.startsWith('CET')) {\n      CET[name] = descriptor;\n    } else if (name.startsWith('cmasher')) {\n      cmasher[name] = descriptor;\n    } else {\n      helios[name] = descriptor;\n    }\n  }\n  return { CET, cmasher, helios };\n}\n\nconst { CET: CETDescriptors, cmasher: cmasherDescriptors, helios: heliosDescriptors } = buildJsonDescriptors();\nheliosDescriptors.category18 = createRepeatingSchemeDescriptor('category18', CATEGORY18_COLORS, 'helios');\n\nconst registry = new Map();\nfunction registerDescriptor(descriptor) {\n  if (!descriptor?.name) return;\n  registry.set(descriptor.name.toLowerCase(), descriptor);\n}\n\nfunction primeRegistry() {\n  for (const desc of Object.values(d3Descriptors)) registerDescriptor(desc);\n  for (const desc of Object.values(CETDescriptors)) registerDescriptor(desc);\n  for (const desc of Object.values(cmasherDescriptors)) registerDescriptor(desc);\n  for (const desc of Object.values(heliosDescriptors)) registerDescriptor(desc);\n}\n\nprimeRegistry();\n\n/**\n * Built-in color map registry grouped by source collection.\n *\n * @public\n * @apiSection Colormaps\n * @returns {object} D3, CET, cmasher, and Helios colormap collections.\n */\nexport const colormaps = {\n  d3: d3Descriptors,\n  CET: CETDescriptors,\n  cmasher: cmasherDescriptors,\n  helios: heliosDescriptors,\n};\n\n/**\n * Default node colormap used by Helios when no explicit node color mapper is set.\n *\n * @public\n * @apiSection Colormaps\n */\nexport const DEFAULT_NODE_COLORMAP = 'CET_L08-NeonBurst';\n\n/**\n * Resolve a colormap name, descriptor, or function to a descriptor.\n *\n * @public\n * @apiSection Colormaps\n * @param {string|Function|object} input - Colormap reference.\n * @returns {object|null} Resolved descriptor, or `null` when not found.\n * @example\n * const viridis = resolveColormap('interpolateViridis');\n */\nexport function resolveColormap(input) {\n  if (!input) return null;\n  if (typeof input === 'function') {\n    return {\n      name: input.name || 'custom-interpolator',\n      source: 'custom',\n      isScheme: false,\n      interpolate: (t) => normalizeCssColor(input(clamp01(t))),\n      scheme: (count) => sampleColorsFromInterpolator((v) => input(clamp01(v)), count ?? 10),\n    };\n  }\n  if (Array.isArray(input)) {\n    return {\n      name: 'custom-scheme',\n      source: 'custom',\n      isScheme: true,\n      interpolate: (t) => createInterpolatorFromList(input)(t),\n      scheme: (count) => sampleColorsFromList(input, count ?? input.length),\n    };\n  }\n  if (typeof input === 'object' && typeof input.interpolate === 'function') {\n    return input;\n  }\n  if (typeof input === 'object' && Array.isArray(input.colors)) {\n    return {\n      name: input.name ?? 'custom-colors',\n      source: input.source ?? 'custom',\n      isScheme: !!input.isScheme,\n      interpolate: (t) => createInterpolatorFromList(input.colors)(t),\n      scheme: (count) => sampleColorsFromList(input.colors, count ?? input.colors.length),\n    };\n  }\n  if (typeof input !== 'string') return null;\n  const normalizedInput = input.trim();\n  const key = normalizedInput\n    .toLowerCase()\n    .replace(/^d3:\\s*/, '')\n    .replace(/^cmasher:\\s*/, 'cmasher_')\n    .replace(/^cet:\\s*/, 'cet_');\n  if (registry.has(key)) return registry.get(key);\n  if (registry.has(normalizedInput.toLowerCase())) return registry.get(normalizedInput.toLowerCase());\n  return null;\n}\n\n/**\n * Resolve a colormap to an interpolation function.\n *\n * @public\n * @apiSection Colormaps\n * @param {string|Function|object} input - Colormap reference.\n * @returns {Function|null} Function that maps `0..1` values to colors.\n */\nexport function colormapToInterpolator(input) {\n  const resolved = resolveColormap(input);\n  if (!resolved?.interpolate) throw new Error(`Unknown colormap: ${input}`);\n  return resolved.interpolate;\n}\n\n/**\n * Resolve a colormap to a discrete color scheme.\n *\n * @public\n * @apiSection Colormaps\n * @param {string|Function|object} input - Colormap reference.\n * @param {number} count - Number of colors to sample.\n * @returns {Array<Array<number>>|null} Sampled RGBA colors.\n */\nexport function colormapToScheme(input, count) {\n  const resolved = resolveColormap(input);\n  if (!resolved?.scheme) throw new Error(`Unknown colormap: ${input}`);\n  return resolved.scheme(count ?? 10);\n}\n\n/**\n * Create a numeric colormap scale.\n *\n * @public\n * @apiSection Colormaps\n * @param {string|Function|object} colormapInput - Colormap reference.\n * @param {object} [options] - Scale options.\n * @param {Array<number>} [options.domain] - Numeric input domain.\n * @param {number} [options.alpha] - Output alpha override.\n * @returns {Function} Function that maps values to RGBA colors.\n * @example\n * const color = createColormapScale('interpolateViridis', { domain: [0, 1] });\n */\nexport function createColormapScale(colormapInput, options = {}) {\n  const { domain = [0, 1], clamp = true, alpha } = options;\n  const clampSpec = (() => {\n    if (clamp && typeof clamp === 'object') {\n      return { min: clamp.min !== false, max: clamp.max !== false };\n    }\n    if (clamp === false) return { min: false, max: false };\n    return { min: true, max: true };\n  })();\n  const interpolator = colormapToInterpolator(colormapInput);\n  const sample = interpolator(0.5);\n  const isArrayLike = (value) =>\n    (Array.isArray(value) || ArrayBuffer.isView(value)) &&\n    typeof value.length === 'number' &&\n    value.length >= 3;\n  const interpolatorReturnsArray =\n    isArrayLike(sample) && Array.from(sample).every((v) => Number.isFinite(v));\n  const [d0, d1] = domain;\n  const denom = d1 - d0 || 1;\n  return (value) => {\n    if (!clampSpec.min || !clampSpec.max) {\n      const lo = Math.min(d0, d1);\n      const hi = Math.max(d0, d1);\n      if (!clampSpec.min && value < lo) return undefined;\n      if (!clampSpec.max && value > hi) return undefined;\n    }\n    const tRaw = (value - d0) / denom;\n    const shouldClamp = clampSpec.min || clampSpec.max;\n    const t = shouldClamp ? clamp01(tRaw) : tRaw;\n    const color = interpolatorReturnsArray ? [...interpolator(t)] : normalizeCssColor(interpolator(t));\n    if (alpha != null) {\n      color[3] = alpha;\n    }\n    return color;\n  };\n}\n\n/**\n * Create a categorical palette from a colormap.\n *\n * @public\n * @apiSection Colormaps\n * @param {string|Function|object} colormapInput - Colormap reference.\n * @param {number} count - Number of categories.\n * @returns {Array<Array<number>>} RGBA colors for categories.\n */\nexport function createCategoricalColormap(colormapInput, count) {\n  return colormapToScheme(colormapInput, count);\n}\n\nexport default colormaps;\n","import { AttributeType } from 'helios-network';\nimport { DEFAULT_NODE_COLORMAP, createColormapScale } from '../colors/colormaps.js';\nimport { VISUAL_ATTRIBUTE_NAMES, DEFAULT_VISUALS, VISUAL_ATTRIBUTE_MAP } from './constants.js';\n\nconst {\n  EDGE_COLOR_ATTRIBUTE,\n  EDGE_ENDPOINTS_SIZE_ATTRIBUTE,\n  EDGE_OPACITY_ATTRIBUTE,\n  EDGE_WIDTH_ATTRIBUTE,\n  NODE_COLOR_ATTRIBUTE,\n  NODE_OUTLINE_COLOR_ATTRIBUTE,\n  NODE_OUTLINE_WIDTH_ATTRIBUTE,\n  NODE_POSITION_ATTRIBUTE,\n  NODE_SIZE_ATTRIBUTE,\n} = VISUAL_ATTRIBUTE_NAMES;\n\nconst { DEFAULT_NODE_OUTLINE_COLOR, DEFAULT_NODE_OUTLINE_WIDTH, DEFAULT_NODE_SIZE } = DEFAULT_VISUALS;\nconst INDEX_ATTRIBUTE = '$index';\nconst DEFAULT_CATEGORICAL_COLOR = '#888888ff';\nconst WARNING_KEYS_BY_OWNER = new WeakMap();\n\nfunction warnOnce(owner, key, message, detail = undefined) {\n  if (typeof console === 'undefined' || typeof console.warn !== 'function') return;\n  const target = owner && (typeof owner === 'object' || typeof owner === 'function') ? owner : warnOnce;\n  let keys = WARNING_KEYS_BY_OWNER.get(target);\n  if (!keys) {\n    keys = new Set();\n    WARNING_KEYS_BY_OWNER.set(target, keys);\n  }\n  if (keys.has(key)) return;\n  keys.add(key);\n  if (detail === undefined) console.warn(message);\n  else console.warn(message, detail);\n}\n\nfunction isMissingAttributeError(error, scope = null) {\n  const msg = error instanceof Error ? error.message : String(error ?? '');\n  if (/does not exist/i.test(msg) || /not defined/i.test(msg)) return true;\n  if (/missing (node|edge) attr/i.test(msg)) return true;\n  if (/unknown (node|edge) attribute/i.test(msg)) return true;\n  if (scope === 'node' && /unknown node attribute/i.test(msg)) return true;\n  if (scope === 'edge' && /unknown edge attribute/i.test(msg)) return true;\n  return false;\n}\n\nfunction isExpectedMetadataLookupError(error) {\n  const msg = error instanceof Error ? error.message : String(error ?? '');\n  return /outside buffer access/i.test(msg) || /wrap it in withBufferAccess/i.test(msg);\n}\n\nfunction validateAttribute(buffer, name, expectedType, expectedDimension) {\n  if (!buffer) {\n    throw new Error(`Attribute ${name} is missing on the network`);\n  }\n  if (buffer.dimension !== expectedDimension) {\n    throw new Error(\n      `Attribute ${name} has dimension ${buffer.dimension ?? 'unknown'}, expected ${expectedDimension}`,\n    );\n  }\n  if (buffer.type != null && expectedType != null && buffer.type !== expectedType) {\n    throw new Error(`Attribute ${name} has type ${buffer.type}, expected ${expectedType}`);\n  }\n}\n\nfunction resolveAttributeMetadata(network, scope, name) {\n  if (!network || !name) return null;\n  const internalMap = scope === 'node' ? network._nodeAttributes : network._edgeAttributes;\n  const cached = internalMap?.get?.(name) ?? null;\n  if (cached) return cached;\n  const infoGetter = scope === 'node' ? 'getNodeAttributeInfo' : 'getEdgeAttributeInfo';\n  const info = network[infoGetter]?.(name) ?? null;\n  if (info) return info;\n  const bufferGetter = scope === 'node' ? 'getNodeAttributeBuffer' : 'getEdgeAttributeBuffer';\n  try {\n    return network[bufferGetter]?.(name) ?? null;\n  } catch (error) {\n    if (!isMissingAttributeError(error, scope) && !isExpectedMetadataLookupError(error)) {\n      warnOnce(\n        network,\n        `metadata:${scope}:${name}`,\n        `Mapper: failed to resolve ${scope} attribute metadata for \"${name}\".`,\n        { error },\n      );\n    }\n    return null;\n  }\n}\n\nfunction clamp01(value) {\n  if (!Number.isFinite(value)) return 0;\n  if (value < 0) return 0;\n  if (value > 1) return 1;\n  return value;\n}\n\nfunction lerp(a, b, t) {\n  return a + (b - a) * t;\n}\n\nfunction hslToHex(h, s, l) {\n  const a = s * Math.min(l, 1 - l);\n  const f = (n) => {\n    const k = (n + h / 30) % 12;\n    const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n    return Math.round(255 * color);\n  };\n  return `#${[f(0), f(8), f(4)]\n    .map((c) => c.toString(16).padStart(2, '0'))\n    .join('')}`;\n}\n\nfunction colorFromIndex(index = 0) {\n  const hue = (index * 137.508) % 360; // golden angle for spread\n  return hslToHex(hue, 0.6, 0.55);\n}\n\nfunction normalizeAttributes(attributes) {\n  if (attributes == null) return [];\n  return Array.isArray(attributes) ? attributes : [attributes];\n}\n\nfunction isNil(value) {\n  return value === undefined || value === null;\n}\n\nfunction resolveNodeEndpoints(item, context) {\n  const getNode = (id) => {\n    if (id == null) return null;\n    if (typeof id === 'object') return id;\n    if (context?.getNodeById) return context.getNodeById(id);\n    if (context?.nodesById && id in context.nodesById) return context.nodesById[id];\n    if (Array.isArray(context?.nodes) && context.nodes[id]) return context.nodes[id];\n    return null;\n  };\n  const source = item?.source ?? item?.from ?? null;\n  const target = item?.target ?? item?.to ?? null;\n  return [getNode(source), getNode(target)];\n}\n\nfunction normalizeEndpoints(value) {\n  if (value === 'source' || value === 'from') return 'source';\n  if (value === 'destination' || value === 'target' || value === 'to') return 'destination';\n  return 'both';\n}\n\nfunction normalizeAttributeName(name) {\n  if (typeof name !== 'string') return name;\n  const trimmed = name.replace(/^@nodes?\\./, '');\n  return VISUAL_ATTRIBUTE_MAP[trimmed] ?? trimmed;\n}\n\nconst NODE_ATTRIBUTE_TO_CHANNEL = {\n  [NODE_COLOR_ATTRIBUTE]: 'color',\n  [NODE_SIZE_ATTRIBUTE]: 'size',\n  [NODE_OUTLINE_WIDTH_ATTRIBUTE]: 'outline',\n  [NODE_OUTLINE_COLOR_ATTRIBUTE]: 'outlineColor',\n  [NODE_POSITION_ATTRIBUTE]: 'position',\n};\n\nfunction computePassthroughTargetDimension(sourceDimension = 1, endpoints = 'both', doubleWidth = true) {\n  const base = Math.max(1, sourceDimension || 1);\n  if (endpoints === 'both') return base * 2;\n  return doubleWidth ? base * 2 : base;\n}\n\nfunction resolveValueFromItem(item, key) {\n  if (!item) return undefined;\n  if (item.attributes && key in item.attributes) {\n    return item.attributes[key];\n  }\n  if (key in item) {\n    return item[key];\n  }\n  return undefined;\n}\n\nfunction resolveAttribute(attr, item, context) {\n  if (attr === '$index') {\n    return context?.index ?? item?.index ?? item?.id ?? 0;\n  }\n  if (typeof attr === 'function') {\n    return attr(item, context);\n  }\n  if (typeof attr === 'string' && attr.startsWith('@node.')) {\n    const key = attr.slice(6);\n    const [src, tgt] = resolveNodeEndpoints(item, context);\n    return [resolveValueFromItem(src, key), resolveValueFromItem(tgt, key)];\n  }\n  if (typeof attr === 'string' && attr.startsWith('@nodes.')) {\n    const key = attr.slice(7);\n    const [src, tgt] = resolveNodeEndpoints(item, context);\n    return [resolveValueFromItem(src, key), resolveValueFromItem(tgt, key)];\n  }\n  if (typeof attr === 'string' && attr in (context?.attributes ?? {})) {\n    return context.attributes[attr];\n  }\n  return resolveValueFromItem(item, attr);\n}\n\nfunction collectInputs(attrSpec, item, context) {\n  const attributes = normalizeAttributes(attrSpec);\n  if (!attributes.length) return undefined;\n  const values = [];\n  const objectInputs = {};\n  let containsNode = false;\n  for (const attr of attributes) {\n    const value = resolveAttribute(attr, item, context);\n    if (Array.isArray(value) && typeof attr === 'string' && attr.startsWith('@node.')) {\n      containsNode = true;\n      values.push(...value);\n    } else if (Array.isArray(value) && typeof attr === 'string' && attr.startsWith('@nodes.')) {\n      containsNode = true;\n      values.push(...value);\n    } else {\n      values.push(value);\n      if (typeof attr === 'string' && !containsNode) {\n        objectInputs[attr] = value;\n      }\n    }\n  }\n  if (attributes.length === 1 && !containsNode) {\n    return values[0];\n  }\n  if (!containsNode && Object.keys(objectInputs).length === attributes.length) {\n    return objectInputs;\n  }\n  return values;\n}\n\nfunction linearScale(value, domain, range) {\n  const [d0, d1] = domain ?? [0, 1];\n  const [r0, r1] = range ?? [0, 1];\n  const denom = d1 - d0;\n  if (!Number.isFinite(denom) || Math.abs(denom) < 1e-9) return r0;\n  const t = clamp01((value - d0) / denom);\n  return lerp(r0, r1, t);\n}\n\nfunction categoricalScale(value, domain = [], range = []) {\n  const index = domain.findIndex((entry) => entry === value);\n  if (index === -1) return undefined;\n  if (index >= range.length) return undefined;\n  return range[index];\n}\n\nfunction applyBuiltinTransform(transformType, value, power = 1) {\n  const v = Number(value);\n  if (!Number.isFinite(v)) return value;\n  if (!transformType || transformType === 'linear') return v;\n\n  if (transformType === 'log') {\n    if (v <= 0) return undefined;\n    return Math.log(v);\n  }\n\n  if (transformType === 'log1p') {\n    if (v <= -1) return undefined;\n    return Math.log1p(v);\n  }\n\n  if (transformType === 'logit') {\n    // Avoid infinities for values near 0/1.\n    const eps = 1e-12;\n    const clamped = Math.max(eps, Math.min(1 - eps, v));\n    return Math.log(clamped / (1 - clamped));\n  }\n\n  if (transformType === 'power') {\n    const p = Number(power);\n    if (!Number.isFinite(p)) return undefined;\n    const out = Math.pow(v, p);\n    return Number.isFinite(out) ? out : undefined;\n  }\n\n  return v;\n}\n\nfunction isPercentileTransformType(transformType) {\n  return transformType === 'percentile' || transformType === 'quantile';\n}\n\nfunction applyPercentileTransform(config, inputs) {\n  const value = Array.isArray(inputs) ? (inputs.length === 1 ? inputs[0] : undefined) : inputs;\n  const v = Number(value);\n  if (!Number.isFinite(v)) return undefined;\n  const lookup = config?.__percentileLookup;\n  if (typeof lookup !== 'function') return v;\n  return lookup(v);\n}\n\nfunction clampForDomainTransform(transformType, value) {\n  const v = Number(value);\n  if (!Number.isFinite(v)) return value;\n  const eps = 1e-12;\n  if (!transformType || transformType === 'linear') return v;\n  if (transformType === 'log') return Math.max(eps, v);\n  if (transformType === 'log1p') return Math.max(-1 + eps, v);\n  if (transformType === 'logit') return Math.max(eps, Math.min(1 - eps, v));\n  return v;\n}\n\nfunction transformDomainIfNeeded(config, domain) {\n  const type = config?.transformType;\n  if (!type || type === 'linear') return domain;\n  if (isPercentileTransformType(type)) return domain;\n  if (!Array.isArray(domain) || domain.length !== 2) return domain;\n  const power = config?.transformPower;\n  const d0 = clampForDomainTransform(type, domain[0]);\n  const d1 = clampForDomainTransform(type, domain[1]);\n  const t0 = applyBuiltinTransform(type, d0, power);\n  const t1 = applyBuiltinTransform(type, d1, power);\n  if (!Number.isFinite(t0) || !Number.isFinite(t1)) return domain;\n  return [t0, t1];\n}\n\nfunction resolveTransformFn(config) {\n  const type = config?.transformType;\n  if (!type || type === 'linear') return undefined;\n  if (isPercentileTransformType(type)) {\n    return (inputs) => applyPercentileTransform(config, inputs);\n  }\n  const power = config?.transformPower;\n  return (inputs) => applyBuiltinTransform(type, inputs, power);\n}\n\nfunction applyScale(config, value, inputs, item, context) {\n  if (config.type === 'colormap' || config.colormap) {\n    const baseDomain = resolveDivergentDomain(config, config.domain);\n    const domain = transformDomainIfNeeded(config, baseDomain);\n    const clamp = config.clamp ?? true;\n    if (!Number.isFinite(Number(value))) return undefined;\n    const scaleKey = config.colormap ?? config.scale ?? config.range;\n    const scaleSignature = JSON.stringify({\n      key: scaleKey,\n      domain: Array.isArray(domain) ? domain : null,\n      alpha: config.alpha ?? null,\n      clamp,\n    });\n    if (config.__colormapScaleSignature !== scaleSignature) {\n      config.__colormapScale = createColormapScale(scaleKey, { domain, alpha: config.alpha, clamp });\n      config.__colormapScaleSignature = scaleSignature;\n    }\n    const scale = config.__colormapScale;\n    if (typeof scale === 'function' && Array.isArray(domain) && domain.length === 2) {\n      const [d0, d1] = domain;\n      const lo = Math.min(d0, d1);\n      const hi = Math.max(d0, d1);\n      const clampMin = typeof clamp === 'object' ? clamp.min !== false : clamp !== false;\n      const clampMax = typeof clamp === 'object' ? clamp.max !== false : clamp !== false;\n      if (!clampMin && Number.isFinite(lo) && value < lo) return undefined;\n      if (!clampMax && Number.isFinite(hi) && value > hi) return undefined;\n    }\n    return scale(value, inputs, item, context);\n  }\n  if (config.type === 'linear') {\n    const domain = transformDomainIfNeeded(config, config.domain);\n    return linearScale(value, domain, config.range);\n  }\n  if (config.type === 'categorical') {\n    return categoricalScale(value, config.domain, config.range);\n  }\n  if (typeof config.scale === 'function') {\n    return config.scale(value, inputs, item, context);\n  }\n  return value;\n}\n\nfunction resolveDivergentDomain(config, domain) {\n  if (!config?.divergent || isPercentileTransformType(config.transformType)) return domain;\n  if (!Array.isArray(domain) || domain.length !== 2) return [-1, 1];\n  const maxAbs = Math.max(Math.abs(domain[0] ?? 0), Math.abs(domain[1] ?? 0));\n  if (!Number.isFinite(maxAbs) || maxAbs === 0) return [-1, 1];\n  return [-maxAbs, maxAbs];\n}\n\nfunction buildPercentileLookup(values) {\n  if (!Array.isArray(values) || values.length === 0) return null;\n  const sorted = values.slice().sort((a, b) => a - b);\n  const denom = Math.max(1, sorted.length - 1);\n  return (value) => {\n    const v = Number(value);\n    if (!Number.isFinite(v)) return undefined;\n    let lo = 0;\n    let hi = sorted.length;\n    while (lo < hi) {\n      const mid = (lo + hi) >> 1;\n      if (sorted[mid] <= v) {\n        lo = mid + 1;\n      } else {\n        hi = mid;\n      }\n    }\n    const idx = Math.max(0, lo - 1);\n    return denom === 0 ? 0 : idx / denom;\n  };\n}\n\nfunction buildPercentileLookupForIndex(count) {\n  const size = Number(count);\n  if (!Number.isFinite(size) || size <= 0) return null;\n  const denom = Math.max(1, size - 1);\n  return (value) => {\n    const v = Number(value);\n    if (!Number.isFinite(v)) return undefined;\n    const idx = Math.max(0, Math.min(size - 1, Math.floor(v)));\n    return denom === 0 ? 0 : idx / denom;\n  };\n}\n\nfunction resolvePercentileLookup(mapper, config) {\n  const network = mapper?.network;\n  if (!network) return null;\n  const attrs = normalizeAttributes(config?.attributes);\n  if (attrs.length !== 1) return null;\n  const attr = attrs[0];\n  if (typeof attr !== 'string') return null;\n  if (attr === '$index') {\n    const count = mapper.mode === 'edge'\n      ? (network.edgeCount ?? network.edgesCount ?? null)\n      : (network.nodeCount ?? network.nodesCount ?? null);\n    return buildPercentileLookupForIndex(count);\n  }\n  const isNodeProxy = mapper.mode === 'edge' && (attr.startsWith('@node.') || attr.startsWith('@nodes.'));\n  const name = attr.replace(/^@nodes?\\./, '');\n  const resolved = normalizeAttributeName(name);\n  const compute = () => {\n    try {\n      const indices = mapper.mode === 'edge' && !isNodeProxy ? network.edgeIndices : network.nodeIndices;\n      if (!indices || typeof indices.length !== 'number') return null;\n      const buffer = isNodeProxy\n        ? network.getNodeAttributeBuffer?.(resolved)\n        : (mapper.mode === 'edge' ? network.getEdgeAttributeBuffer?.(resolved) : network.getNodeAttributeBuffer?.(resolved));\n      if (!buffer?.view) return null;\n      if (Number.isFinite(buffer.dimension) && buffer.dimension !== 1) return null;\n      const values = [];\n      for (let i = 0; i < indices.length; i += 1) {\n        const idx = indices[i];\n        const v = Number(buffer.view[idx]);\n        if (Number.isFinite(v)) values.push(v);\n      }\n      return buildPercentileLookup(values);\n    } catch (_) {\n      return null;\n    }\n  };\n  if (typeof network.withBufferAccess === 'function') {\n    return network.withBufferAccess(compute);\n  }\n  return compute();\n}\n\nfunction buildNodeToEdgeValue(inputs) {\n  if (Array.isArray(inputs)) {\n    const [source, target] = inputs;\n    if (inputs.length >= 2) {\n      return { source, target };\n    }\n    if (inputs.length === 1) {\n      return { source, target: source };\n    }\n  }\n  return { source: inputs, target: inputs };\n}\n\nfunction computeChannelValue(config, item, context) {\n  const inputs = collectInputs(config.attributes, item, context);\n  if (config.type === 'constant') {\n    return config.value;\n  }\n  if (config.type === 'passthrough') {\n    if (Array.isArray(inputs)) return inputs.length === 1 ? inputs[0] : inputs;\n    return inputs;\n  }\n  if (config.type === 'nodeAttribute') {\n    if (!Array.isArray(inputs)) return inputs;\n    const [sourceValue, targetValue] = inputs;\n    const endpoints = normalizeEndpoints(config.endpoints);\n    if (endpoints === 'source') {\n      return { source: sourceValue, target: sourceValue };\n    }\n    if (endpoints === 'destination') {\n      return { source: targetValue, target: targetValue };\n    }\n    return { source: sourceValue, target: targetValue };\n  }\n  if (config.type === 'nodeToEdge') {\n    return buildNodeToEdgeValue(inputs);\n  }\n\n  const base = typeof config.transform === 'function' ? config.transform(inputs, item, context) : inputs;\n  const scaled = applyScale(config, base, inputs, item, context);\n  if (!config.rules?.length) {\n    return isNil(scaled) ? config.defaultValue : scaled;\n  }\n  for (const rule of config.rules) {\n    const ruleInputs = collectInputs(rule.attributes ?? config.attributes, item, context);\n    const predicate = typeof rule.when === 'function' ? rule.when(ruleInputs, item, context) : true;\n    if (!predicate) continue;\n    if (rule.type === 'nodeToEdge') {\n      return buildNodeToEdgeValue(ruleInputs);\n    }\n    if (rule.type === 'nodeAttribute') {\n      const endpoints = normalizeEndpoints(rule.endpoints ?? config.endpoints);\n      const [sourceValue, targetValue] = Array.isArray(ruleInputs) ? ruleInputs : [ruleInputs, ruleInputs];\n      if (endpoints === 'source') {\n        return { source: sourceValue, target: sourceValue };\n      }\n      if (endpoints === 'destination') {\n        return { source: targetValue, target: targetValue };\n      }\n      return { source: sourceValue, target: targetValue };\n    }\n    if (rule.type === 'passthrough') {\n      return Array.isArray(ruleInputs) && ruleInputs.length === 1 ? ruleInputs[0] : ruleInputs;\n    }\n    if (rule.value !== undefined) {\n      return rule.value;\n    }\n    const ruleBase =\n      typeof rule.transform === 'function' ? rule.transform(ruleInputs, item, context) : ruleInputs ?? base;\n    const ruleScaled = applyScale(rule, ruleBase, ruleInputs, item, context);\n    return isNil(ruleScaled) ? rule.defaultValue ?? config.defaultValue : ruleScaled;\n  }\n  return isNil(scaled) ? config.defaultValue : scaled;\n}\n\nfunction normalizeChannelConfig(name, config) {\n  const normalized = {\n    name,\n    meta: config.meta && typeof config.meta === 'object' ? { ...config.meta } : undefined,\n    attributes: config.attributes ?? config.from ?? undefined,\n    transform: config.transform,\n    transformType: config.transformType,\n    transformPower: config.transformPower,\n    type: config.type ?? config.mode ?? undefined,\n    colormap: config.colormap,\n    alpha: config.alpha,\n    clamp: config.clamp,\n    divergent: config.divergent,\n    endpoints: normalizeEndpoints(config.endpoints ?? config.endpoint ?? 'both'),\n    nodeAttribute: config.nodeAttribute ?? config.nodeAttr ?? undefined,\n    domain: config.domain,\n    range: config.range,\n    scale: config.scale,\n    value: config.value,\n    defaultValue: config.defaultValue,\n    rules: (config.rules ?? []).map((rule) => ({ ...rule })),\n  };\n\n  if ((normalized.type === 'colormap' || normalized.colormap) && normalized.defaultValue === undefined) {\n    const clamp = normalized.clamp;\n    const clampMin = clamp && typeof clamp === 'object' ? clamp.min !== false : clamp !== false;\n    const clampMax = clamp && typeof clamp === 'object' ? clamp.max !== false : clamp !== false;\n    if (!clampMin && !clampMax) {\n      normalized.defaultValue = DEFAULT_CATEGORICAL_COLOR;\n    }\n  }\n\n  if (\n    normalized.type === 'categorical'\n    && normalized.defaultValue === undefined\n    && (name === 'color' || name === 'outlineColor')\n  ) {\n    normalized.defaultValue = DEFAULT_CATEGORICAL_COLOR;\n  }\n\n  if (typeof normalized.transform !== 'function') {\n    const fn = resolveTransformFn(normalized);\n    if (typeof fn === 'function') normalized.transform = fn;\n  }\n  if (normalized.type === 'constant' && normalized.value === undefined) {\n    normalized.value = config.defaultValue;\n  }\n  if (normalized.type === 'nodeToEdge') {\n    normalized.rules = [];\n  }\n  if (normalized.type === 'nodeAttribute') {\n    normalized.rules = [];\n    if (!normalized.nodeAttribute && typeof normalized.attributes === 'string') {\n      normalized.nodeAttribute = normalized.attributes.replace('@nodes.', '').replace('@node.', '');\n    }\n    if (!normalized.attributes && normalized.nodeAttribute) {\n      normalized.attributes = `@node.${normalized.nodeAttribute}`;\n    }\n    normalized.endpoints = normalizeEndpoints(config.endpoints ?? config.endpoint ?? 'both');\n    normalized.transform = undefined;\n    normalized.scale = undefined;\n    normalized.domain = undefined;\n    normalized.range = undefined;\n  }\n  return normalized;\n}\n\nfunction isConstantChannel(config) {\n  return config?.type === 'constant' && (!config.rules || config.rules.length === 0);\n}\n\nfunction isEdgeNodePassthrough(config, def) {\n  return (\n    config &&\n    def?.nodeSource &&\n    (config.type === 'passthrough' || config.type === 'nodeToEdge' || config.type === 'nodeAttribute')\n  );\n}\n\nfunction resolveNodeChannelNameFromConfig(config, def) {\n  const attrs = normalizeAttributes(config?.attributes);\n  const hasAttributes = attrs.length > 0;\n  for (const attr of attrs) {\n    if (typeof attr !== 'string') continue;\n    if (!/^@nodes?\\./.test(attr)) continue;\n    const normalized = normalizeAttributeName(attr);\n    const channelName = NODE_ATTRIBUTE_TO_CHANNEL[normalized];\n    if (channelName) return channelName;\n  }\n  if (config?.nodeAttribute) {\n    const normalized = normalizeAttributeName(config.nodeAttribute);\n    return NODE_ATTRIBUTE_TO_CHANNEL[normalized] ?? null;\n  }\n  if (!hasAttributes && def?.nodeSource) {\n    const normalized = normalizeAttributeName(def.nodeSource);\n    return NODE_ATTRIBUTE_TO_CHANNEL[normalized] ?? null;\n  }\n  return null;\n}\n\nfunction removeEdgeAttributeSafe(network, name, debug) {\n  if (!network?.removeEdgeAttribute || !name) return;\n  try {\n    network.removeEdgeAttribute(name);\n  } catch (error) {\n    if (isMissingAttributeError(error, 'edge')) {\n      return;\n    }\n    debug?.log?.('mapper', 'Failed to remove edge attribute', { name, error });\n    console.warn(`Mapper: failed to remove edge attribute \"${name}\".`, error);\n  }\n}\n\nfunction removeNodeToEdgeAttributeSafe(network, name, debug) {\n  if (!network?.removeNodeToEdgeAttribute || !name) return;\n  try {\n    network.removeNodeToEdgeAttribute(name);\n  } catch (error) {\n    if (isMissingAttributeError(error, 'edge')) return;\n    debug?.log?.('mapper', 'Failed to remove node-to-edge attribute', { name, error });\n    console.warn(`Mapper: failed to remove node-to-edge attribute \"${name}\".`, error);\n  }\n}\n\nfunction resolveEdgeChannelEntriesForNodeConstants(channelEntries, nodeMapper, network, debug) {\n  if (!channelEntries || !nodeMapper?.channels) return { entries: channelEntries, changed: false };\n  let changed = false;\n  for (const [name, config] of channelEntries.entries()) {\n    const def = CHANNEL_DEFS.edge?.[name];\n    if (!def) continue;\n    if (!isEdgeNodePassthrough(config, def)) continue;\n    const nodeChannelName = resolveNodeChannelNameFromConfig(config, def);\n    if (!nodeChannelName) continue;\n    const nodeConfig = nodeMapper.channels.get(nodeChannelName);\n    if (!isConstantChannel(nodeConfig)) continue;\n    const constantValue = nodeConfig?.value ?? nodeConfig?.defaultValue;\n    if (constantValue === undefined) continue;\n    removeNodeToEdgeAttributeSafe(network, def.attribute, debug);\n    removeEdgeAttributeSafe(network, def.attribute, debug);\n    channelEntries.set(name, {\n      ...config,\n      type: 'constant',\n      value: constantValue,\n      attributes: undefined,\n      nodeAttribute: undefined,\n      endpoints: undefined,\n      transform: undefined,\n      scale: undefined,\n      domain: undefined,\n      range: undefined,\n      rules: [],\n    });\n    changed = true;\n  }\n  return { entries: channelEntries, changed };\n}\n\nexport function resolveEdgeMapperForNodeConstants(edgeMapper, nodeMapper, options = {}) {\n  if (!edgeMapper || edgeMapper.mode !== 'edge' || !nodeMapper?.channels) return edgeMapper;\n  const network = options.network ?? edgeMapper.network ?? nodeMapper.network ?? null;\n  const debug = options.debug ?? null;\n  const entries = new Map();\n  for (const [name, config] of edgeMapper.channels.entries()) {\n    entries.set(name, { ...config, attributes: config.attributes ?? config.from });\n  }\n  const resolved = resolveEdgeChannelEntriesForNodeConstants(entries, nodeMapper, network, debug);\n  if (!resolved.changed) return edgeMapper;\n  const derived = new Mapper({ mode: 'edge', network });\n  for (const [name, config] of resolved.entries.entries()) {\n    derived.setChannel(name, config);\n  }\n  return derived;\n}\n\nclass ChannelBuilder {\n  constructor(mapper, name) {\n    this.mapper = mapper;\n    this.name = name;\n    this.config = { name, rules: [] };\n  }\n\n  from(attributes) {\n    this.config.attributes = attributes;\n    return this;\n  }\n\n  transform(fn) {\n    this.config.transform = fn;\n    return this;\n  }\n\n  linear(domain, range) {\n    this.config.type = 'linear';\n    this.config.domain = domain;\n    this.config.range = range;\n    return this;\n  }\n\n  categorical(domain, range) {\n    this.config.type = 'categorical';\n    this.config.domain = domain;\n    this.config.range = range;\n    return this;\n  }\n\n  scale(fn) {\n    this.config.scale = fn;\n    return this;\n  }\n\n  colormap(nameOrDescriptor, options = {}) {\n    this.config.type = 'colormap';\n    this.config.colormap = nameOrDescriptor;\n    if (options?.domain) this.config.domain = options.domain;\n    if (options?.alpha != null) this.config.alpha = options.alpha;\n    if (options?.clamp != null) this.config.clamp = options.clamp;\n    if (options?.divergent != null) this.config.divergent = options.divergent;\n    return this;\n  }\n\n  default(value) {\n    this.config.defaultValue = value;\n    return this;\n  }\n\n  rule(ruleConfig) {\n    if (!this.config.rules) this.config.rules = [];\n    this.config.rules.push({ ...ruleConfig });\n    return this;\n  }\n\n  passthrough() {\n    this.config.type = 'passthrough';\n    return this;\n  }\n\n  nodeAttribute(name, endpoints = 'both') {\n    this.config.type = 'nodeAttribute';\n    this.config.nodeAttribute = name;\n    this.config.endpoints = normalizeEndpoints(endpoints);\n    this.config.attributes = [`@node.${name}`];\n    this.config.transform = undefined;\n    this.config.scale = undefined;\n    this.config.domain = undefined;\n    this.config.range = undefined;\n    this.config.rules = [];\n    return this;\n  }\n\n  nodeToEdge() {\n    this.config.type = 'nodeToEdge';\n    this.config.rules = [];\n    this.config.transform = undefined;\n    this.config.scale = undefined;\n    this.config.domain = undefined;\n    this.config.range = undefined;\n    return this;\n  }\n\n  constant(value) {\n    this.config.type = 'constant';\n    this.config.value = value;\n    return this;\n  }\n\n  done() {\n    this.mapper.setChannel(this.name, this.config);\n    return this.mapper;\n  }\n}\n\nconst CHANNEL_DEFS = {\n  node: {\n    color: { attribute: NODE_COLOR_ATTRIBUTE, type: AttributeType.Float, dimension: 4 },\n    size: { attribute: NODE_SIZE_ATTRIBUTE, type: AttributeType.Float, dimension: 1 },\n    outline: { attribute: NODE_OUTLINE_WIDTH_ATTRIBUTE, type: AttributeType.Float, dimension: 1 },\n    outlineColor: { attribute: NODE_OUTLINE_COLOR_ATTRIBUTE, type: AttributeType.Float, dimension: 4 },\n    position: { attribute: NODE_POSITION_ATTRIBUTE, type: AttributeType.Float, dimension: 3 },\n  },\n  edge: {\n    color: {\n      attribute: EDGE_COLOR_ATTRIBUTE,\n      type: AttributeType.Float,\n      dimension: 8,\n      nodeSource: NODE_COLOR_ATTRIBUTE,\n      nodeSourceDimension: 4,\n      nodePassthroughEndpoints: 'both',\n      nodePassthroughDoubleWidth: true,\n    },\n    opacity: { attribute: EDGE_OPACITY_ATTRIBUTE, type: AttributeType.Float, dimension: 2 },\n    width: { attribute: EDGE_WIDTH_ATTRIBUTE, type: AttributeType.Float, dimension: 2 },\n    endpointSize: {\n      attribute: EDGE_ENDPOINTS_SIZE_ATTRIBUTE,\n      type: AttributeType.Float,\n      dimension: 2,\n      nodeSource: NODE_SIZE_ATTRIBUTE,\n      nodeSourceDimension: 1,\n      nodePassthroughEndpoints: 'both',\n      nodePassthroughDoubleWidth: true,\n      nodeSourceIndirect: true,\n    },\n  },\n};\n\n/**\n * Low-level mapper for one node or edge visual mode.\n *\n * @public\n * @param {object} [options] - Mapper mode (`node` or `edge`), network, and\n * optional bookkeeping dependencies.\n * @returns {Mapper} Mapper with an initially empty channel set.\n * @remarks Most applications should use `MapperCollection` or\n * `MappersBehavior`. Direct mapper access is still public for custom pipelines\n * that need to build visual attributes programmatically.\n */\nexport class Mapper {\n  constructor(options = {}) {\n    this.mode = options.mode ?? 'node';\n    this.network = options.network ?? null;\n    this.channels = new Map();\n    this.nodeToEdgeRegistrations = new Set();\n  }\n\n  channel(name) {\n    return new ChannelBuilder(this, name);\n  }\n\n  setChannel(name, config) {\n    const previous = this.channels.get(name);\n    if (previous) {\n      this.unregisterChannel(previous);\n    }\n    const normalized = normalizeChannelConfig(name, config ?? {});\n    this.ensurePercentileLookup(normalized);\n    this.ensureBuffersForChannel(normalized);\n    this.channels.set(name, normalized);\n    return this;\n  }\n\n  getChannel(name) {\n    return this.channels.get(name);\n  }\n\n  mapItem(item, context = {}) {\n    const result = {};\n    for (const [name, config] of this.channels.entries()) {\n      this.ensurePercentileLookup(config);\n      result[name] = computeChannelValue(config, item, context);\n    }\n    return result;\n  }\n\n  mapItems(items, context = {}) {\n    return items.map((item, index) => this.mapItem(item, { ...context, index }));\n  }\n\n  ensurePercentileLookup(config) {\n    if (!isPercentileTransformType(config?.transformType)) return;\n    if (typeof config.__percentileLookup === 'function') return;\n    const lookup = resolvePercentileLookup(this, config);\n    if (typeof lookup === 'function') {\n      config.__percentileLookup = lookup;\n    }\n  }\n\n  ensureBuffersForChannel(config) {\n    if (!this.network) return;\n    const defs = CHANNEL_DEFS[this.mode] ?? {};\n    const def = defs[config.name];\n    if (!def) return;\n    if (!this.shouldEnsureChannelBuffer(config, def)) {\n      return;\n    }\n    const { attribute, type, dimension } = def;\n    if (this.isNodePassthroughChannel(config, def)) {\n      const sourceAttribute = this.resolveNodeSourceAttribute(config, def);\n      if (!sourceAttribute) {\n        console.warn(`Mapper: unable to resolve node attribute for ${config.name} passthrough`);\n        return;\n      }\n      const sourceDimension = this.resolveNodeSourceDimension(sourceAttribute, def);\n      if (def.nodeSourceIndirect === true) {\n        this.ensureNodeSourceAttribute(sourceAttribute, def.type, sourceDimension, config.name);\n        this.nodeToEdgeRegistrations.delete(attribute);\n        return;\n      }\n      const passthrough = this.resolvePassthroughConfig(config, def, sourceDimension, dimension);\n      this.configureNodeToEdgeAttribute({\n        attribute,\n        sourceAttribute,\n        sourceDimension,\n        type,\n        channelName: config.name,\n        ...passthrough,\n      });\n      return;\n    }\n\n    const info = resolveAttributeMetadata(this.network, this.mode, attribute);\n    if (!info) {\n      if (this.mode === 'node') {\n        this.network.defineNodeAttribute(attribute, type, dimension);\n      } else {\n        this.network.defineEdgeAttribute(attribute, type, dimension);\n      }\n    }\n\n    if (this.mode === 'node') {\n      const info = resolveAttributeMetadata(this.network, 'node', attribute);\n      validateAttribute(info, attribute, type, dimension);\n    } else {\n      const info = resolveAttributeMetadata(this.network, 'edge', attribute);\n      validateAttribute(info, attribute, type, dimension);\n    }\n  }\n\n  shouldEnsureChannelBuffer(config, def) {\n    if (!def) return false;\n    if (config.type === 'constant' && (!config.rules || config.rules.length === 0)) {\n      return def.attribute === NODE_POSITION_ATTRIBUTE;\n    }\n    return true;\n  }\n\n  isNodePassthroughChannel(config, def) {\n    return (\n      this.mode === 'edge' &&\n      def?.nodeSource &&\n      (config.type === 'passthrough' || config.type === 'nodeToEdge' || config.type === 'nodeAttribute')\n    );\n  }\n\n  resolveNodeSourceAttribute(config, def) {\n    if (!def?.nodeSource) return null;\n    if (config.nodeAttribute) return normalizeAttributeName(config.nodeAttribute);\n    const attrs = normalizeAttributes(config.attributes);\n    for (const attr of attrs) {\n      if (typeof attr === 'string' && /^@nodes?\\./.test(attr)) {\n        return normalizeAttributeName(attr);\n      }\n    }\n    return normalizeAttributeName(def.nodeSource);\n  }\n\n  resolveNodeSourceDimension(sourceAttribute, def) {\n    if (!sourceAttribute) return null;\n    const info = resolveAttributeMetadata(this.network, 'node', sourceAttribute);\n    if (info?.dimension != null) {\n      return info.dimension;\n    }\n    if (def?.nodeSourceDimension) {\n      return def.nodeSourceDimension;\n    }\n    if (def?.dimension && def?.nodePassthroughEndpoints) {\n      const estimatedEndpoints = normalizeEndpoints(def.nodePassthroughEndpoints);\n      const estimate = estimatedEndpoints === 'both' ? def.dimension / 2 : def.dimension;\n      return Math.max(1, Math.round(estimate));\n    }\n    return def?.dimension ?? 1;\n  }\n\n  resolvePassthroughConfig(config, def, sourceDimension, expectedDimension) {\n    const preferredEndpoints = normalizeEndpoints(config.endpoints ?? def.nodePassthroughEndpoints ?? 'both');\n    const defaultDoubleWidth = def.nodePassthroughDoubleWidth ?? true;\n    let endpoints = preferredEndpoints;\n    let doubleWidth = defaultDoubleWidth;\n    let targetDimension = computePassthroughTargetDimension(sourceDimension, endpoints, doubleWidth);\n    const desired = expectedDimension ?? def?.dimension;\n\n    if (desired && targetDimension !== desired) {\n      const flipDoubleWidth = computePassthroughTargetDimension(sourceDimension, endpoints, !doubleWidth);\n      if (flipDoubleWidth === desired) {\n        doubleWidth = !doubleWidth;\n        targetDimension = flipDoubleWidth;\n      } else {\n        const candidates = ['source', 'destination', 'both'];\n        for (const candidate of candidates) {\n          const candidateDoubleWidth =\n            def.nodePassthroughDoubleWidth ??\n            (candidate === 'both' ? true : doubleWidth);\n          const candidateDimension = computePassthroughTargetDimension(\n            sourceDimension,\n            candidate,\n            candidateDoubleWidth,\n          );\n          if (candidateDimension === desired) {\n            endpoints = candidate;\n            doubleWidth = candidateDoubleWidth;\n            targetDimension = candidateDimension;\n            break;\n          }\n        }\n      }\n    }\n\n    return { endpoints, doubleWidth, targetDimension };\n  }\n\n  ensureNodeSourceAttribute(sourceAttribute, type, sourceDimension, channelName) {\n    const sourceInfo = resolveAttributeMetadata(this.network, 'node', sourceAttribute);\n    if (!sourceInfo) {\n      this.network.defineNodeAttribute(sourceAttribute, type, sourceDimension);\n      return;\n    }\n    try {\n      validateAttribute(sourceInfo, sourceAttribute, type, sourceDimension);\n    } catch (error) {\n      console.warn(`Mapper found incompatible node attribute ${sourceAttribute} for ${channelName}:`, error);\n      throw error;\n    }\n  }\n\n  configureNodeToEdgeAttribute({\n    attribute,\n    sourceAttribute,\n    sourceDimension,\n    type,\n    endpoints,\n    doubleWidth,\n    targetDimension,\n    channelName,\n  }) {\n    if (!attribute || !sourceAttribute) return;\n    this.unregisterNodeToEdge(attribute);\n    if (resolveAttributeMetadata(this.network, 'edge', attribute)) {\n      try {\n        this.removeEdgeAttribute(attribute);\n      } catch (error) {\n        console.warn(`Mapper: failed to remove existing edge attribute \"${attribute}\" before node-to-edge registration; retry path will verify registration.`, error);\n        // The registration path below retries removal if the edge attribute still exists.\n      }\n    }\n    const sourceInfo = resolveAttributeMetadata(this.network, 'node', sourceAttribute);\n    if (!sourceInfo) {\n      this.network.defineNodeAttribute(sourceAttribute, type, sourceDimension);\n    } else {\n      try {\n        validateAttribute(sourceInfo, sourceAttribute, type, sourceDimension);\n      } catch (error) {\n        console.warn(`Mapper found incompatible node attribute ${sourceAttribute} for ${channelName}:`, error);\n        return;\n      }\n    }\n    let passthroughOk = false;\n    try {\n      this.network.defineNodeToEdgeAttribute(sourceAttribute, attribute, endpoints, doubleWidth);\n      passthroughOk = true;\n    } catch (error) {\n      const msg = error instanceof Error ? error.message : '';\n      if (typeof this.network?.removeEdgeAttribute === 'function' && /already exists/i.test(msg)) {\n        // Retry once so endpoint changes don't get ignored when removal fails silently.\n        try {\n          this.network.removeEdgeAttribute(attribute);\n          this.network.defineNodeToEdgeAttribute(sourceAttribute, attribute, endpoints, doubleWidth);\n          passthroughOk = true;\n        } catch (retryError) {\n          console.warn(`Mapper failed to redefine node-to-edge attribute for ${channelName}:`, retryError);\n        }\n      } else {\n        console.warn(`Mapper failed to define node-to-edge attribute for ${channelName}:`, error);\n      }\n    }\n    if (passthroughOk && typeof this.network?.hasNodeToEdgeAttribute === 'function') {\n      try {\n        passthroughOk = Boolean(this.network.hasNodeToEdgeAttribute(attribute));\n      } catch (error) {\n        console.warn(`Mapper: failed to verify node-to-edge attribute \"${attribute}\" after registration.`, error);\n        passthroughOk = false;\n      }\n    }\n    const resolvedSourceInfo = resolveAttributeMetadata(this.network, 'node', sourceAttribute);\n    const edgeInfo = resolveAttributeMetadata(this.network, 'edge', attribute);\n    const expected = targetDimension ?? computePassthroughTargetDimension(sourceDimension, endpoints, doubleWidth);\n    validateAttribute(resolvedSourceInfo, sourceAttribute, type, sourceDimension);\n    validateAttribute(edgeInfo, attribute, type, expected);\n    if (passthroughOk) {\n      this.nodeToEdgeRegistrations.add(attribute);\n    } else {\n      this.nodeToEdgeRegistrations.delete(attribute);\n    }\n\n    // No explicit buffer bumps here: renderer invalidation for node-to-edge\n    // passthrough config changes is handled centrally in GraphLayer (derived\n    // version augmentation) to avoid surprising side-effects.\n  }\n\n  removeEdgeAttribute(name) {\n    if (!this.network?.removeEdgeAttribute || !name) return;\n    try {\n      this.network.removeEdgeAttribute(name);\n    } catch (error) {\n      const msg = error instanceof Error ? error.message : '';\n      if (/unknown edge attribute/i.test(msg) || /does not exist/i.test(msg) || /not defined/i.test(msg)) {\n        return;\n      }\n      throw error;\n    }\n  }\n\n  unregisterNodeToEdge(attribute) {\n    if (!this.network?.removeNodeToEdgeAttribute || !attribute) return;\n    try {\n      this.network.removeNodeToEdgeAttribute(attribute);\n    } catch (error) {\n      if (!isMissingAttributeError(error, 'edge')) {\n        console.warn(`Mapper: failed to unregister node-to-edge attribute \"${attribute}\".`, error);\n        throw error;\n      }\n    }\n    this.nodeToEdgeRegistrations.delete(attribute);\n  }\n\n  unregisterChannel(config) {\n    if (this.mode !== 'edge' || !config) return;\n    const defs = CHANNEL_DEFS[this.mode] ?? {};\n    const def = defs[config.name];\n    if (!def?.attribute || !def?.nodeSource) return;\n    if (config.type === 'passthrough' || config.type === 'nodeToEdge' || config.type === 'nodeAttribute') {\n      if (def.nodeSourceIndirect === true) {\n        this.nodeToEdgeRegistrations.delete(def.attribute);\n        return;\n      }\n      this.unregisterNodeToEdge(def.attribute);\n    }\n  }\n}\n\n/**\n * Create the default node and edge mapper collections for a network.\n *\n * @public\n * @param {import('helios-network').default} network - Source graph.\n * @returns {{nodeMapper:Mapper,edgeMapper:Mapper}} Default node and edge\n * mappers used when Helios is constructed without custom mappers.\n */\nexport function createDefaultMappers(network) {\n  const denom = Math.max(1, (network?.nodeCount ?? network?.nodeCapacity ?? 1) - 1);\n  const defaultNodeColor = createColormapScale(DEFAULT_NODE_COLORMAP, { domain: [0, 1], alpha: 1 })(0.6);\n  const nodeMapper = new Mapper({ mode: 'node', network });\n  nodeMapper\n    .channel('color')\n    .from('$index')\n    .colormap(DEFAULT_NODE_COLORMAP, { domain: [0, denom + 1], alpha: 1, clamp: true })\n    .default(defaultNodeColor)\n    .done();\n  nodeMapper.channel('size').constant(DEFAULT_NODE_SIZE).done();\n  nodeMapper.channel('outline').constant(DEFAULT_NODE_OUTLINE_WIDTH).done();\n  nodeMapper.channel('outlineColor').constant(DEFAULT_NODE_OUTLINE_COLOR).done();\n\n  const edgeMapper = new Mapper({ mode: 'edge', network });\n  edgeMapper.channel('color').from('@node.color').nodeToEdge().done();\n  edgeMapper.channel('width').constant(1).done();\n  edgeMapper.channel('opacity').constant(1).done();\n\n  return { nodeMapper, edgeMapper };\n}\n\n/**\n * Map of public mapper channel names to internal Helios visual attribute names.\n *\n * @public\n * @apiSection Mappers\n */\nexport const VISUAL_ATTRIBUTES = VISUAL_ATTRIBUTE_MAP;\n\n/**\n * Convenience container that can hold multiple mappers of the same mode and\n * build a combined mapper when applying visuals.\n */\n/**\n * Collection of named mappers for either node or edge visuals.\n *\n * @public\n * @param {'node'|'edge'} mode - Visual target scope.\n * @param {import('helios-network').default} network - Source graph.\n * @param {Function} [onChange] - Callback invoked when mapper configuration\n * changes.\n * @returns {MapperCollection} Collection with a default mapper.\n * @remarks Collections let apps keep multiple named mapper presets and combine\n * them before applying visual attributes.\n */\nexport class MapperCollection {\n  constructor(mode, network, onChange, debug) {\n    this.mode = mode;\n    this.network = network;\n    this.mappers = new Map();\n    this.onChange = onChange;\n    this.debug = debug;\n    this.defaultMapper = this.createMapper('default');\n    this.debug?.log('mapper', `Created ${mode} mapper collection`);\n  }\n\n  /**\n   * Returns a ChannelBuilder bound to the default mapper. Calling `.done()`\n   * will mark the collection dirty.\n  */\n  channel(name) {\n    const builder = this.defaultMapper.channel(name);\n    const originalDone = builder.done.bind(builder);\n    builder.done = () => {\n      const result = originalDone();\n      this.debug?.log('mapper', `Updated ${this.mode} channel \"${name}\"`);\n      this.touch();\n      return result;\n    };\n    return builder;\n  }\n\n  /**\n   * Adds a Mapper instance or a descriptor object describing channels.\n   * @param {Mapper | object} entry\n   * @param {string} [name]\n   */\n  add(entry, name) {\n    let mapper = null;\n    if (entry instanceof Mapper) {\n      mapper = entry;\n    } else {\n      mapper = this.buildFromDescriptor(entry);\n    }\n    const key = name ?? entry?.name ?? `mapper-${this.mappers.size + 1}`;\n    this.mappers.set(key, mapper);\n    this.debug?.log('mapper', `Added ${this.mode} mapper`, { name: key });\n    this.touch();\n    return mapper;\n  }\n\n  /**\n   * Replaces the default mapper.\n   * @param {Mapper} mapper\n   */\n  setDefault(mapper) {\n    if (!(mapper instanceof Mapper)) return;\n    this.defaultMapper = mapper;\n    this.mappers.set('default', mapper);\n    this.debug?.log('mapper', `Replaced default ${this.mode} mapper`);\n    this.touch();\n  }\n\n  createMapper(name) {\n    const mapper = new Mapper({ mode: this.mode, network: this.network });\n    this.mappers.set(name ?? `mapper-${this.mappers.size + 1}`, mapper);\n    return mapper;\n  }\n\n  buildFromDescriptor(descriptor) {\n    const mapper = new Mapper({ mode: this.mode, network: this.network });\n    if (!descriptor) return mapper;\n    const entries = Array.isArray(descriptor.channels)\n      ? descriptor.channels.map((entry) => [entry.name, entry.config ?? entry])\n      : Object.entries(descriptor).filter(([key]) => key !== 'name');\n    for (const [channelName, config] of entries) {\n      if (!channelName || !config) continue;\n      mapper.setChannel(channelName, config);\n    }\n    return mapper;\n  }\n\n  /**\n   * Merges all registered mappers into a single Mapper (channels override in\n   * insertion order).\n   */\n  toCombinedMapper(options = {}) {\n    const nodeMapper = options?.nodeMapper ?? null;\n    this.debug?.log('mapper', `Combining ${this.mode} mappers`, { count: this.mappers.size });\n    if (this.mappers.size === 1 && !(this.mode === 'edge' && nodeMapper)) {\n      // Fast path: no need to merge when only one mapper is registered.\n      return this.mappers.values().next().value;\n    }\n    const combined = new Mapper({ mode: this.mode, network: this.network });\n    const channelEntries = new Map();\n    for (const mapper of this.mappers.values()) {\n      for (const [name, config] of mapper.channels.entries()) {\n        const cloned = { ...config, attributes: config.attributes ?? config.from };\n        channelEntries.set(name, cloned);\n      }\n    }\n    if (this.mode === 'edge') {\n      resolveEdgeChannelEntriesForNodeConstants(channelEntries, nodeMapper, this.network, this.debug);\n    }\n    for (const [name, config] of channelEntries.entries()) {\n      combined.setChannel(name, config);\n    }\n    this.debug?.log('mapper', `Combined ${this.mode} mappers`, { channels: combined.channels.size });\n    return combined;\n  }\n\n  touch() {\n    this.onChange?.();\n  }\n}\n","import { AttributeType } from 'helios-network';\nimport { VISUAL_ATTRIBUTE_NAMES, DEFAULT_VISUALS, VISUAL_ATTRIBUTE_MAP } from './constants.js';\nimport { resolveEdgeMapperForNodeConstants } from './Mapper.js';\n\nconst {\n  NODE_COLOR_ATTRIBUTE,\n  NODE_POSITION_ATTRIBUTE,\n  NODE_SIZE_ATTRIBUTE,\n  NODE_STATE_ATTRIBUTE,\n  NODE_OUTLINE_COLOR_ATTRIBUTE,\n  NODE_OUTLINE_WIDTH_ATTRIBUTE,\n  EDGE_COLOR_ATTRIBUTE,\n  EDGE_OPACITY_ATTRIBUTE,\n  EDGE_WIDTH_ATTRIBUTE,\n  EDGE_STATE_ATTRIBUTE,\n  EDGE_ENDPOINTS_SIZE_ATTRIBUTE,\n} = VISUAL_ATTRIBUTE_NAMES;\nconst INDEX_ATTRIBUTE = '$index';\n\nconst {\n  DEFAULT_EDGE_COLOR,\n  DEFAULT_EDGE_OPACITY,\n  DEFAULT_EDGE_WIDTH,\n  DEFAULT_NODE_COLOR,\n  DEFAULT_NODE_SIZE,\n  DEFAULT_NODE_OUTLINE_COLOR,\n  DEFAULT_NODE_OUTLINE_WIDTH,\n} = DEFAULT_VISUALS;\n\nconst EDGE_CHANNEL_TO_ATTRIBUTE = {\n  color: EDGE_COLOR_ATTRIBUTE,\n  width: EDGE_WIDTH_ATTRIBUTE,\n  opacity: EDGE_OPACITY_ATTRIBUTE,\n  endpointSize: EDGE_ENDPOINTS_SIZE_ATTRIBUTE,\n};\n\nconst EDGE_CHANNEL_DEFAULT_NODE_ATTRIBUTE = {\n  color: NODE_COLOR_ATTRIBUTE,\n  width: NODE_SIZE_ATTRIBUTE,\n  opacity: NODE_SIZE_ATTRIBUTE,\n  endpointSize: NODE_SIZE_ATTRIBUTE,\n};\n\nconst LOW_DISCREPANCY_X = 0.7548776662466927;\nconst LOW_DISCREPANCY_Y = 0.5698402909980532;\nconst LOW_DISCREPANCY_Z = 0.4389596329181167;\nconst DEFAULT_SEED_SPREAD = 0.7;\nconst WARNING_KEYS_BY_OWNER = new WeakMap();\n\nfunction warnOnce(owner, key, message, detail = undefined) {\n  if (typeof console === 'undefined' || typeof console.warn !== 'function') return;\n  const target = owner && (typeof owner === 'object' || typeof owner === 'function') ? owner : warnOnce;\n  let keys = WARNING_KEYS_BY_OWNER.get(target);\n  if (!keys) {\n    keys = new Set();\n    WARNING_KEYS_BY_OWNER.set(target, keys);\n  }\n  if (keys.has(key)) return;\n  keys.add(key);\n  if (detail === undefined) console.warn(message);\n  else console.warn(message, detail);\n}\n\nfunction fract(value) {\n  return value - Math.floor(value);\n}\n\nfunction normalizeEndpoints(value) {\n  if (value === 'source' || value === 'from') return 'source';\n  if (value === 'destination' || value === 'target' || value === 'to') return 'destination';\n  return 'both';\n}\n\nfunction normalizeAttributeName(name) {\n  if (typeof name !== 'string') return name;\n  const trimmed = name.replace(/^@nodes?\\./, '');\n  return VISUAL_ATTRIBUTE_MAP[trimmed] ?? trimmed;\n}\n\nfunction validateAttribute(buffer, name, expected) {\n  if (!buffer) {\n    throw new Error(`Attribute ${name} is missing`);\n  }\n  if (typeof expected.dimension === 'number' && buffer.dimension !== expected.dimension) {\n    throw new Error(\n      `Attribute ${name} has dimension ${buffer.dimension ?? 'unknown'}, expected ${expected.dimension}`,\n    );\n  }\n  if (typeof expected.type === 'number' && buffer.type != null && buffer.type !== expected.type) {\n    throw new Error(`Attribute ${name} has type ${buffer.type}, expected ${expected.type}`);\n  }\n}\n\nfunction attributeInfoMismatched(info, expected) {\n  if (!info) return false;\n  const dimensionMismatch =\n    typeof expected.dimension === 'number' && info.dimension != null && info.dimension !== expected.dimension;\n  const typeMismatch = typeof expected.type === 'number' && info.type != null && info.type !== expected.type;\n  return dimensionMismatch || typeMismatch;\n}\n\nfunction expandAttributeData({ view, count, fromDimension, toDimension }) {\n  const result = new Float32Array(count * toDimension);\n  if (!view || !view.length || fromDimension <= 0 || toDimension <= 0) return result;\n  const ratio = toDimension / fromDimension;\n  const duplicateEach = Number.isInteger(ratio) && ratio === 2 ? 2 : 1;\n  for (let i = 0; i < count; i += 1) {\n    const baseFrom = i * fromDimension;\n    const baseTo = i * toDimension;\n    for (let k = 0; k < toDimension; k += 1) {\n      if (duplicateEach === 2 && toDimension === fromDimension * 2) {\n        const sourceIndex = baseFrom + Math.floor(k / 2);\n        result[baseTo + k] = view[sourceIndex] ?? 0;\n      } else {\n        const sourceIndex = baseFrom + Math.min(k, fromDimension - 1);\n        result[baseTo + k] = view[sourceIndex] ?? 0;\n      }\n    }\n  }\n  return result;\n}\n\nfunction computeSeedPosition(nodeId, nodeCount, bounds = {}) {\n  const mode = bounds.mode === '3d' ? '3d' : '2d';\n  const width = Math.max(1, Number(bounds.width) || 1);\n  const height = Math.max(1, Number(bounds.height) || 1);\n  const depth = Math.max(0, Number(bounds.depth) || 0);\n  const side3D = mode === '3d' ? Math.max(width, height, depth, 1) : 1;\n  const center = Array.isArray(bounds.center) ? bounds.center : [0, 0, 0];\n  const cx = Number.isFinite(center[0]) ? center[0] : 0;\n  const cy = Number.isFinite(center[1]) ? center[1] : 0;\n  const cz = Number.isFinite(center[2]) ? center[2] : 0;\n  const order = Math.max(0, Math.floor(Number(nodeId) || 0));\n  const count = Math.max(1, Math.floor(Number(nodeCount) || 1));\n\n  if (count <= 1) {\n    return [cx, cy, cz];\n  }\n\n  const index = order + 0.5;\n  const countOffset = fract(count * 0.1031);\n  const xNorm = fract((index * LOW_DISCREPANCY_X) + countOffset);\n  const yNorm = fract((index * LOW_DISCREPANCY_Y) + (countOffset * 0.5) + 0.33);\n  const spreadX = (mode === '3d' ? side3D : width) * DEFAULT_SEED_SPREAD;\n  const spreadY = (mode === '3d' ? side3D : height) * DEFAULT_SEED_SPREAD;\n\n  if (mode === '3d') {\n    const spreadZ = side3D * DEFAULT_SEED_SPREAD;\n    const zNorm = fract((index * LOW_DISCREPANCY_Z) + (countOffset * 0.25) + 0.67);\n    return [\n      cx + ((xNorm - 0.5) * spreadX),\n      cy + ((yNorm - 0.5) * spreadY),\n      cz + ((zNorm - 0.5) * spreadZ),\n    ];\n  }\n\n  return [\n    cx + ((xNorm - 0.5) * spreadX),\n    cy + ((yNorm - 0.5) * spreadY),\n    cz,\n  ];\n}\n\n/**\n * Ensures required visual attributes exist on the Helios network, seeds defaults,\n * and provides helpers to apply mappers into sparse buffers.\n */\nexport class VisualAttributes {\n  /**\n   * @param {import('helios-network').default} network\n   */\n  constructor(network, debug) {\n    this.network = network;\n    this.debug = debug;\n    this.maxInitializedNodeId = -1;\n    this._bufferAccessDepth = 0;\n    this._pendingNodeAttributeBumps = new Set();\n    this._pendingEdgeAttributeBumps = new Set();\n    this.ensureAttributes();\n    this.seedMissingEdgeOpacity();\n  }\n\n  get nodePositions() {\n    return this.getNodeAttributeView(NODE_POSITION_ATTRIBUTE);\n  }\n\n  get nodeColors() {\n    return this.getNodeAttributeView(NODE_COLOR_ATTRIBUTE);\n  }\n\n  get nodeSizes() {\n    return this.getNodeAttributeView(NODE_SIZE_ATTRIBUTE);\n  }\n\n  get nodeStates() {\n    return this.getNodeAttributeView(NODE_STATE_ATTRIBUTE);\n  }\n\n  get nodeOutlineWidths() {\n    return this.getNodeAttributeView(NODE_OUTLINE_WIDTH_ATTRIBUTE);\n  }\n\n  get nodeOutlineColors() {\n    return this.getNodeAttributeView(NODE_OUTLINE_COLOR_ATTRIBUTE);\n  }\n\n  get edgeColors() {\n    return this.getEdgeAttributeView(EDGE_COLOR_ATTRIBUTE);\n  }\n\n  get edgeWidths() {\n    return this.getEdgeAttributeView(EDGE_WIDTH_ATTRIBUTE);\n  }\n\n  get edgeOpacities() {\n    return this.getEdgeAttributeView(EDGE_OPACITY_ATTRIBUTE);\n  }\n\n  get edgeStates() {\n    return this.getEdgeAttributeView(EDGE_STATE_ATTRIBUTE);\n  }\n\n  getNodeAttributeView(name) {\n    if (!this.network) return null;\n    return this.network.getNodeAttributeBuffer(name)?.view ?? null;\n  }\n\n  getEdgeAttributeView(name) {\n    if (!this.network) return null;\n    return this.network.getEdgeAttributeBuffer(name)?.view ?? null;\n  }\n\n  normalizeLookupName(name) {\n    return VISUAL_ATTRIBUTE_MAP[name] ?? name;\n  }\n\n  prepareNodeAttributeLookups(names, { allowMissing = false } = {}) {\n    const prepared = [];\n    if (!names) return prepared;\n    for (const entry of names) {\n      const name = typeof entry === 'string' ? entry : entry?.name;\n      if (!name) continue;\n      const lookup = this.normalizeLookupName(name);\n      if (lookup === INDEX_ATTRIBUTE) {\n        prepared.push({ name, lookup, synthetic: 'index', dimension: 1 });\n        continue;\n      }\n      const info = this.network?.getNodeAttributeInfo?.(lookup) ?? null;\n      if (!info) {\n        if (allowMissing) continue;\n        throw new Error(`Unknown node attribute \"${lookup}\"`);\n      }\n      prepared.push({ name, lookup, info });\n    }\n    return prepared;\n  }\n\n  prepareEdgeAttributeLookups(names, { allowMissing = false } = {}) {\n    const prepared = [];\n    if (!names) return prepared;\n    for (const entry of names) {\n      const name = typeof entry === 'string' ? entry : entry?.name;\n      if (!name) continue;\n      const lookup = this.normalizeLookupName(name);\n      if (lookup === INDEX_ATTRIBUTE) {\n        prepared.push({ name, lookup, synthetic: 'index', dimension: 1 });\n        continue;\n      }\n      const info = this.network?.getEdgeAttributeInfo?.(lookup) ?? null;\n      if (!info) {\n        if (allowMissing) continue;\n        throw new Error(`Unknown edge attribute \"${lookup}\"`);\n      }\n      prepared.push({ name, lookup, info });\n    }\n    return prepared;\n  }\n\n  getPreparedNodeAttributeView(prepared, name) {\n    const lookup = this.normalizeLookupName(name);\n    if (lookup === INDEX_ATTRIBUTE) return null;\n    if (!prepared?.some?.((entry) => entry?.lookup === lookup && entry?.synthetic !== 'index')) {\n      return null;\n    }\n    return this.network.getNodeAttributeBuffer(lookup)?.view ?? null;\n  }\n\n  getPreparedEdgeAttributeView(prepared, name) {\n    const lookup = this.normalizeLookupName(name);\n    if (lookup === INDEX_ATTRIBUTE) return null;\n    if (!prepared?.some?.((entry) => entry?.lookup === lookup && entry?.synthetic !== 'index')) {\n      return null;\n    }\n    return this.network.getEdgeAttributeBuffer(lookup)?.view ?? null;\n  }\n\n  /**\n   * When networks are populated before Helios is created, edge opacity buffers\n   * start at zero which hides edges entirely. Seed a reasonable default for any\n   * active edge that still has an uninitialized (zero/invalid) opacity.\n   */\n  seedMissingEdgeOpacity() {\n    const preparedOpacity = this.prepareEdgeAttributeLookups([EDGE_OPACITY_ATTRIBUTE], { allowMissing: true });\n    this.withBufferAccess(() => {\n      const edgeIndices = this.network?.edgeIndices;\n      if (!edgeIndices?.length) return;\n      const opacities = this.getPreparedEdgeAttributeView(preparedOpacity, EDGE_OPACITY_ATTRIBUTE);\n      if (!opacities) return;\n      let touched = false;\n      for (let i = 0; i < edgeIndices.length; i += 1) {\n        const edgeId = edgeIndices[i];\n        const offset = edgeId * 2;\n        const a = opacities[offset];\n        const b = opacities[offset + 1];\n        const invalidA = !Number.isFinite(a) || a === 0;\n        const invalidB = !Number.isFinite(b) || b === 0;\n        if (invalidA && invalidB) {\n          opacities[offset] = DEFAULT_EDGE_OPACITY;\n          opacities[offset + 1] = DEFAULT_EDGE_OPACITY;\n          touched = true;\n        }\n      }\n      if (touched) {\n        this.bumpEdgeAttributes(EDGE_OPACITY_ATTRIBUTE);\n      }\n    });\n  }\n\n  applyMappers({ nodeMapper, edgeMapper } = {}) {\n    this.debug?.log('mapper', 'Applying mappers to visuals');\n    const resolvedEdgeMapper =\n      nodeMapper && edgeMapper\n        ? resolveEdgeMapperForNodeConstants(edgeMapper, nodeMapper, { network: this.network, debug: this.debug })\n        : edgeMapper;\n    const visualConfig = this.buildVisualConstantConfig({ nodeMapper, edgeMapper: resolvedEdgeMapper });\n    this.ensureVisualAttributesForConfig({ nodeMapper, edgeMapper: resolvedEdgeMapper, visualConfig });\n    this.setNetworkVisualConfig(visualConfig);\n    if (nodeMapper) this.applyNodeMapper(nodeMapper, visualConfig);\n    if (resolvedEdgeMapper) this.applyEdgeMapper(resolvedEdgeMapper, visualConfig);\n    this.debug?.log('mapper', 'Finished applying mappers');\n  }\n\n  setNetworkVisualConfig(config) {\n    if (!this.network) return;\n    Object.defineProperty(this.network, '__heliosVisualConfig', {\n      value: config,\n      writable: true,\n      configurable: true,\n    });\n  }\n\n  buildVisualConstantConfig({ nodeMapper, edgeMapper } = {}) {\n    const node = this.buildNodeConstantConfig(nodeMapper);\n    return {\n      node,\n      edge: this.buildEdgeConstantConfig(edgeMapper, node),\n    };\n  }\n\n  buildNodeConstantConfig(mapper) {\n    const channels = mapper?.channels;\n    const get = (name) => channels?.get?.(name);\n    const normalizeNumber = (v) => (Number.isFinite(Number(v)) ? Number(v) : undefined);\n    const normalizeRgba = (v) => (v != null ? this.toRgba(v) : undefined);\n\n    const color = get('color');\n    const size = get('size');\n    const outline = get('outline');\n    const outlineColor = get('outlineColor');\n\n    return {\n      color: color?.type === 'constant' ? { mode: 'uniform', value: normalizeRgba(color.value) } : { mode: 'buffer' },\n      size: size?.type === 'constant' ? { mode: 'uniform', value: normalizeNumber(size.value) } : { mode: 'buffer' },\n      outline: outline?.type === 'constant' ? { mode: 'uniform', value: normalizeNumber(outline.value) } : { mode: 'buffer' },\n      outlineColor: outlineColor?.type === 'constant'\n        ? { mode: 'uniform', value: normalizeRgba(outlineColor.value) }\n        : { mode: 'buffer' },\n    };\n  }\n\n  buildEdgeConstantConfig(mapper, nodeConfig = null) {\n    const channels = mapper?.channels;\n    const get = (name) => channels?.get?.(name);\n    const normalizePair = (v) => {\n      if (v == null) return undefined;\n      const [a, b] = this.resolveEdgeScalarPair(v);\n      if (!Number.isFinite(a) || !Number.isFinite(b)) return undefined;\n      return [a, b];\n    };\n    const normalizeColorPair = (v) => {\n      if (v == null) return undefined;\n      const [start, end] = this.resolveEdgeColorPair(v);\n      return [start, end];\n    };\n\n    const color = get('color');\n    const width = get('width');\n    const opacity = get('opacity');\n    const endpointSize = get('endpointSize');\n    const nodeSizeFallback = nodeConfig?.size?.mode === 'uniform'\n      ? normalizePair(nodeConfig?.size?.value)\n      : undefined;\n    const nodeSizeBufferFallback = Boolean(nodeConfig?.size && nodeConfig.size.mode !== 'uniform');\n\n    const config = {\n      color: color?.type === 'constant' ? { mode: 'uniform', value: normalizeColorPair(color.value) } : { mode: 'buffer' },\n      width: width?.type === 'constant' ? { mode: 'uniform', value: normalizePair(width.value) } : { mode: 'buffer' },\n      opacity: opacity?.type === 'constant'\n        ? { mode: 'uniform', value: normalizePair(opacity.value) }\n        : (opacity == null\n          ? { mode: 'uniform', value: normalizePair(DEFAULT_EDGE_OPACITY) }\n          : { mode: 'buffer' }),\n      endpointSize: endpointSize?.type === 'constant'\n        ? { mode: 'uniform', value: normalizePair(endpointSize.value) }\n        : (endpointSize == null && nodeSizeFallback\n          ? { mode: 'uniform', value: nodeSizeFallback }\n          : (endpointSize == null && nodeSizeBufferFallback\n            ? { mode: 'buffer', source: 'node', nodeAttribute: NODE_SIZE_ATTRIBUTE, endpoints: 'both', doubleWidth: true }\n            : { mode: 'buffer' })),\n    };\n    return this.augmentEdgeSourceConfig(config, mapper);\n  }\n\n  augmentEdgeSourceConfig(edgeConfig, mapper) {\n    if (!edgeConfig) return edgeConfig;\n    const passthroughs = typeof this.network?.getNodeToEdgePassthroughs === 'function'\n      ? this.network.getNodeToEdgePassthroughs()\n      : null;\n    const passthroughMap = new Map();\n    if (Array.isArray(passthroughs)) {\n      for (const entry of passthroughs) {\n        if (!entry?.edgeName) continue;\n        passthroughMap.set(entry.edgeName, entry);\n      }\n    }\n\n    const inferNodeAttributeFromConfig = (config) => {\n      if (!config) return null;\n      if (typeof config.nodeAttribute === 'string') {\n        return normalizeAttributeName(config.nodeAttribute);\n      }\n      const attrs = config.attributes ?? config.from;\n      const list = Array.isArray(attrs) ? attrs : (attrs ? [attrs] : []);\n      for (const attr of list) {\n        if (typeof attr !== 'string') continue;\n        if (!/^@nodes?\\\\./.test(attr)) continue;\n        return normalizeAttributeName(attr);\n      }\n      return null;\n    };\n\n    const inferNodeSourceFromMapper = (channelName) => {\n      const channel = mapper?.channels?.get?.(channelName);\n      if (!channel) return null;\n      const type = channel.type ?? channel.mode;\n      if (type !== 'passthrough' && type !== 'nodeToEdge' && type !== 'nodeAttribute') return null;\n      return {\n        source: 'node',\n        endpoints: normalizeEndpoints(channel.endpoints ?? channel.endpoint),\n        doubleWidth: channel.doubleWidth !== false,\n        nodeAttribute: inferNodeAttributeFromConfig(channel),\n      };\n    };\n\n    const channels = ['color', 'width', 'opacity', 'endpointSize'];\n    for (const channelName of channels) {\n      const entry = edgeConfig[channelName];\n      if (!entry || typeof entry !== 'object') continue;\n      const mode = entry.mode ?? 'buffer';\n      if (mode === 'uniform') {\n        entry.source = entry.source ?? 'uniform';\n        continue;\n      }\n      const edgeAttr = EDGE_CHANNEL_TO_ATTRIBUTE[channelName];\n      const passthrough = edgeAttr ? passthroughMap.get(edgeAttr) : null;\n      if (passthrough) {\n        entry.source = 'node';\n        entry.nodeAttribute = passthrough.sourceName ?? entry.nodeAttribute;\n        entry.endpoints = normalizeEndpoints(passthrough.endpoints);\n        entry.doubleWidth = passthrough.doubleWidth !== false;\n      } else {\n        const inferred = inferNodeSourceFromMapper(channelName);\n        if (inferred) {\n          entry.source = inferred.source;\n          entry.nodeAttribute = inferred.nodeAttribute ?? entry.nodeAttribute;\n          entry.endpoints = inferred.endpoints;\n          entry.doubleWidth = inferred.doubleWidth;\n        } else if (!entry.source) {\n          entry.source = 'edge';\n        }\n      }\n      if (entry.source === 'node') {\n        entry.endpoints = normalizeEndpoints(entry.endpoints);\n        if (entry.doubleWidth == null) entry.doubleWidth = true;\n        if (!entry.nodeAttribute) {\n          entry.nodeAttribute = EDGE_CHANNEL_DEFAULT_NODE_ATTRIBUTE[channelName] ?? null;\n        } else if (typeof entry.nodeAttribute === 'string') {\n          entry.nodeAttribute = normalizeAttributeName(entry.nodeAttribute);\n        }\n      }\n    }\n\n    return edgeConfig;\n  }\n\n  applyNodeMapper(mapper, visualConfig) {\n    if (!mapper?.channels?.size) return;\n    const nodeCount = this.network?.nodeCount ?? 0;\n    const nodeChannels = [...mapper.channels.keys()];\n    const attributes = this.collectAttributeNames(mapper, 'node');\n    const preparedInputNodeBuffers = this.prepareNodeAttributeLookups(attributes.node, { allowMissing: true });\n    const preparedNodeVisualBuffers = this.prepareNodeAttributeLookups([\n      NODE_POSITION_ATTRIBUTE,\n      ...(visualConfig?.node?.color?.mode === 'uniform' ? [] : [NODE_COLOR_ATTRIBUTE]),\n      ...(visualConfig?.node?.size?.mode === 'uniform' ? [] : [NODE_SIZE_ATTRIBUTE]),\n      ...(visualConfig?.node?.outline?.mode === 'uniform' ? [] : [NODE_OUTLINE_WIDTH_ATTRIBUTE]),\n      ...(visualConfig?.node?.outlineColor?.mode === 'uniform' ? [] : [NODE_OUTLINE_COLOR_ATTRIBUTE]),\n    ]);\n    this.debug?.log('mapper', 'Applying node mapper', {\n      nodes: nodeCount,\n      channels: mapper.channels.size,\n      channelNames: nodeChannels,\n    });\n    for (const channel of nodeChannels) {\n      this.debug?.log('mapper', 'Applying node channel start', {\n        channel,\n        nodes: nodeCount,\n      });\n    }\n    this.withBufferAccess(() => {\n      const nodeIndices = this.network?.nodeIndices;\n      const buffers = this.resolveNodeAttributeBuffers(preparedInputNodeBuffers);\n      const visuals = {\n        color: this.getPreparedNodeAttributeView(preparedNodeVisualBuffers, NODE_COLOR_ATTRIBUTE),\n        size: this.getPreparedNodeAttributeView(preparedNodeVisualBuffers, NODE_SIZE_ATTRIBUTE),\n        outline: this.getPreparedNodeAttributeView(preparedNodeVisualBuffers, NODE_OUTLINE_WIDTH_ATTRIBUTE),\n        outlineColor: this.getPreparedNodeAttributeView(preparedNodeVisualBuffers, NODE_OUTLINE_COLOR_ATTRIBUTE),\n        position: this.getPreparedNodeAttributeView(preparedNodeVisualBuffers, NODE_POSITION_ATTRIBUTE),\n      };\n      if (!nodeIndices?.length) return;\n      for (let i = 0; i < nodeIndices.length; i += 1) {\n        const nodeId = nodeIndices[i];\n        const inputs = this.buildAttributeObject(buffers, nodeId);\n        const mapped = mapper.mapItem({ attributes: inputs }, { index: nodeId });\n        this.writeNodeVisuals(nodeId, mapped, visuals);\n      }\n\n      const bumpNode = [NODE_POSITION_ATTRIBUTE];\n      if (visuals.color) bumpNode.push(NODE_COLOR_ATTRIBUTE);\n      if (visuals.size) bumpNode.push(NODE_SIZE_ATTRIBUTE);\n      if (visuals.outline) bumpNode.push(NODE_OUTLINE_WIDTH_ATTRIBUTE);\n      if (visuals.outlineColor) bumpNode.push(NODE_OUTLINE_COLOR_ATTRIBUTE);\n      this.bumpNodeAttributes(...bumpNode);\n    });\n    for (const channel of nodeChannels) {\n      this.debug?.log('mapper', 'Applying node channel finish', {\n        channel,\n        nodes: nodeCount,\n      });\n    }\n    this.debug?.log('mapper', 'Node mapper applied', { nodes: nodeCount });\n  }\n\n  applyEdgeMapper(mapper, visualConfig) {\n    if (!mapper?.channels?.size) return;\n    const edgeCount = this.network?.edgeCount ?? 0;\n    const edgeChannels = [...mapper.channels.keys()];\n    const attributes = this.collectAttributeNames(mapper, 'edge');\n    const nodeToEdgeRegistrations = mapper?.nodeToEdgeRegistrations ?? new Set();\n    const skipColor = nodeToEdgeRegistrations.has(EDGE_COLOR_ATTRIBUTE);\n    const skipOpacity = nodeToEdgeRegistrations.has(EDGE_OPACITY_ATTRIBUTE);\n    const skipEndpointSize = nodeToEdgeRegistrations.has(EDGE_ENDPOINTS_SIZE_ATTRIBUTE)\n      || visualConfig?.edge?.endpointSize?.source === 'node';\n    const preparedEdgeBuffers = this.prepareEdgeAttributeLookups(attributes.edge, { allowMissing: true });\n    const preparedNodeBuffers = this.prepareNodeAttributeLookups(attributes.node, { allowMissing: true });\n    const preparedEdgeVisualBuffers = this.prepareEdgeAttributeLookups([\n      ...(skipColor || visualConfig?.edge?.color?.mode === 'uniform' ? [] : [EDGE_COLOR_ATTRIBUTE]),\n      ...(skipOpacity || visualConfig?.edge?.opacity?.mode === 'uniform' ? [] : [EDGE_OPACITY_ATTRIBUTE]),\n      ...(visualConfig?.edge?.width?.mode === 'uniform' ? [] : [EDGE_WIDTH_ATTRIBUTE]),\n      ...(skipEndpointSize || visualConfig?.edge?.endpointSize?.mode === 'uniform' ? [] : [EDGE_ENDPOINTS_SIZE_ATTRIBUTE]),\n    ]);\n    this.debug?.log('mapper', 'Applying edge mapper', {\n      edges: edgeCount,\n      channels: mapper.channels.size,\n      channelNames: edgeChannels,\n    });\n    for (const channel of edgeChannels) {\n      this.debug?.log('mapper', 'Applying edge channel start', {\n        channel,\n        edges: edgeCount,\n      });\n    }\n    this.withBufferAccess(() => {\n      const edgeIndices = this.network?.edgeIndices;\n      const edgeBuffers = this.resolveEdgeAttributeBuffers(preparedEdgeBuffers);\n      const nodeBuffers = this.resolveNodeAttributeBuffers(preparedNodeBuffers);\n      const visuals = {\n        color: this.getPreparedEdgeAttributeView(preparedEdgeVisualBuffers, EDGE_COLOR_ATTRIBUTE),\n        opacity: this.getPreparedEdgeAttributeView(preparedEdgeVisualBuffers, EDGE_OPACITY_ATTRIBUTE),\n        width: this.getPreparedEdgeAttributeView(preparedEdgeVisualBuffers, EDGE_WIDTH_ATTRIBUTE),\n        endpointSize: this.getPreparedEdgeAttributeView(preparedEdgeVisualBuffers, EDGE_ENDPOINTS_SIZE_ATTRIBUTE),\n      };\n      const edgesView = this.network?.edgesView;\n      if (!edgeIndices?.length) return;\n      for (let i = 0; i < edgeIndices.length; i += 1) {\n        const edgeId = edgeIndices[i];\n        const edgeInputs = this.buildEdgeAttributeObject(edgeBuffers, edgeId);\n        const sourceId = edgesView ? edgesView[edgeId * 2] : null;\n        const targetId = edgesView ? edgesView[edgeId * 2 + 1] : null;\n        const sourceAttributes = sourceId != null ? this.buildAttributeObject(nodeBuffers, sourceId) : {};\n        const targetAttributes = targetId != null ? this.buildAttributeObject(nodeBuffers, targetId) : {};\n        const mapped = mapper.mapItem(\n          { attributes: edgeInputs, source: { attributes: sourceAttributes }, target: { attributes: targetAttributes } },\n          { index: edgeId },\n        );\n        this.writeEdgeVisuals(edgeId, mapped, visuals);\n      }\n\n      const bumpEdge = [];\n      if (visuals.color) bumpEdge.push(EDGE_COLOR_ATTRIBUTE);\n      if (visuals.opacity) bumpEdge.push(EDGE_OPACITY_ATTRIBUTE);\n      if (visuals.width) bumpEdge.push(EDGE_WIDTH_ATTRIBUTE);\n      if (visuals.endpointSize) bumpEdge.push(EDGE_ENDPOINTS_SIZE_ATTRIBUTE);\n      if (bumpEdge.length) this.bumpEdgeAttributes(...bumpEdge);\n    });\n    for (const channel of edgeChannels) {\n      this.debug?.log('mapper', 'Applying edge channel finish', {\n        channel,\n        edges: edgeCount,\n      });\n    }\n    this.debug?.log('mapper', 'Edge mapper applied', { edges: edgeCount });\n  }\n\n\n  ensureVisualAttributesForConfig({ nodeMapper, edgeMapper, visualConfig } = {}) {\n    if (!this.network) return;\n    const nodeCfg = visualConfig?.node ?? null;\n    const edgeCfg = visualConfig?.edge ?? null;\n    const nodeSizeBuffer = nodeCfg?.size?.mode !== 'uniform';\n    const edgeEndpointSizeBuffer = edgeCfg?.endpointSize?.mode !== 'uniform';\n    const edgeEndpointSizeFromEdge = edgeEndpointSizeBuffer && edgeCfg?.endpointSize?.source !== 'node';\n    const endpointSizeChannel = edgeMapper?.channels?.get?.('endpointSize') ?? null;\n    const nodeToEdgeRegistrations = edgeMapper?.nodeToEdgeRegistrations ?? new Set();\n\n    const edgeUsesNodeColor = edgeCfg?.color?.source === 'node';\n    const edgeUsesNodeSize = edgeCfg?.width?.source === 'node'\n      || edgeCfg?.opacity?.source === 'node'\n      || edgeCfg?.endpointSize?.source === 'node';\n\n    if (nodeCfg?.color?.mode !== 'uniform') {\n      this.ensureNodeAttribute(NODE_COLOR_ATTRIBUTE, AttributeType.Float, 4);\n    }\n    if (edgeUsesNodeColor) {\n      this.ensureNodeAttribute(NODE_COLOR_ATTRIBUTE, AttributeType.Float, 4);\n    }\n    if (nodeSizeBuffer) {\n      this.ensureNodeAttribute(NODE_SIZE_ATTRIBUTE, AttributeType.Float, 1);\n    }\n    if (edgeUsesNodeSize) {\n      this.ensureNodeAttribute(NODE_SIZE_ATTRIBUTE, AttributeType.Float, 1);\n    }\n    if (nodeCfg?.outline?.mode !== 'uniform') {\n      this.ensureNodeAttribute(NODE_OUTLINE_WIDTH_ATTRIBUTE, AttributeType.Float, 1);\n    }\n    if (nodeCfg?.outlineColor?.mode !== 'uniform') {\n      this.ensureNodeAttribute(NODE_OUTLINE_COLOR_ATTRIBUTE, AttributeType.Float, 4);\n    }\n\n    if (edgeCfg?.color?.mode !== 'uniform' && !nodeToEdgeRegistrations.has(EDGE_COLOR_ATTRIBUTE)) {\n      this.ensureEdgeAttribute(EDGE_COLOR_ATTRIBUTE, AttributeType.Float, 8);\n    }\n    if (edgeCfg?.opacity?.mode !== 'uniform') {\n      this.ensureEdgeAttribute(EDGE_OPACITY_ATTRIBUTE, AttributeType.Float, 2);\n    }\n    if (edgeCfg?.width?.mode !== 'uniform') {\n      this.ensureEdgeAttribute(EDGE_WIDTH_ATTRIBUTE, AttributeType.Float, 2);\n    }\n\n    if (edgeEndpointSizeFromEdge && endpointSizeChannel) {\n      this.ensureEdgeAttribute(EDGE_ENDPOINTS_SIZE_ATTRIBUTE, AttributeType.Float, 2);\n    }\n  }\n\n  ensureAttributes() {\n    this.ensureNodeAttribute(NODE_POSITION_ATTRIBUTE, AttributeType.Float, 3);\n    this.ensureNodeAttribute(NODE_STATE_ATTRIBUTE, AttributeType.UnsignedInteger, 1);\n    this.ensureEdgeAttribute(EDGE_STATE_ATTRIBUTE, AttributeType.UnsignedInteger, 1);\n  }\n\n  bumpNodeAttributes(...names) {\n    const targets =\n      names && names.length\n        ? names\n        : [\n            NODE_POSITION_ATTRIBUTE,\n            NODE_COLOR_ATTRIBUTE,\n            NODE_SIZE_ATTRIBUTE,\n            NODE_STATE_ATTRIBUTE,\n            NODE_OUTLINE_WIDTH_ATTRIBUTE,\n            NODE_OUTLINE_COLOR_ATTRIBUTE,\n          ];\n    for (const name of targets) {\n      const hasAttribute = this.network?._nodeAttributes?.has?.(name)\n        ?? Boolean(this.network?.getNodeAttributeInfo?.(name));\n      if (!hasAttribute) {\n        continue;\n      }\n      if (this._bufferAccessDepth > 0) {\n        this._pendingNodeAttributeBumps.add(name);\n        continue;\n      }\n      this.network?.bumpNodeAttributeVersion?.(name);\n    }\n  }\n\n  bumpEdgeAttributes(...names) {\n    const targets =\n      names && names.length\n        ? names\n        : [\n            EDGE_COLOR_ATTRIBUTE,\n            EDGE_OPACITY_ATTRIBUTE,\n            EDGE_WIDTH_ATTRIBUTE,\n            EDGE_STATE_ATTRIBUTE,\n            EDGE_ENDPOINTS_SIZE_ATTRIBUTE,\n          ];\n    for (const name of targets) {\n      const hasAttribute = this.network?._edgeAttributes?.has?.(name)\n        ?? Boolean(this.network?.getEdgeAttributeInfo?.(name));\n      if (!hasAttribute) {\n        continue;\n      }\n      if (this._bufferAccessDepth > 0) {\n        this._pendingEdgeAttributeBumps.add(name);\n        continue;\n      }\n      this.network?.bumpEdgeAttributeVersion?.(name);\n    }\n  }\n\n  markPositionsDirty() {\n    this.bumpNodeAttributes(NODE_POSITION_ATTRIBUTE, NODE_SIZE_ATTRIBUTE);\n  }\n\n  /**\n   * Initializes basic node visuals. Can be re-used whenever nodes are added.\n   * @param {Iterable<number>} [indices]\n   */\n  applyNodeDefaults(indices) {\n    const preparedNodeVisualBuffers = this.prepareNodeAttributeLookups([\n      NODE_POSITION_ATTRIBUTE,\n      NODE_COLOR_ATTRIBUTE,\n      NODE_SIZE_ATTRIBUTE,\n      NODE_STATE_ATTRIBUTE,\n      NODE_OUTLINE_WIDTH_ATTRIBUTE,\n      NODE_OUTLINE_COLOR_ATTRIBUTE,\n    ], { allowMissing: true });\n    this.withBufferAccess(() => {\n      const targetIndices = indices ?? this.network?.nodeIndices;\n      const color = DEFAULT_NODE_COLOR;\n      const size = DEFAULT_NODE_SIZE;\n      const outlineWidth = DEFAULT_NODE_OUTLINE_WIDTH;\n      const outlineColor = DEFAULT_NODE_OUTLINE_COLOR;\n      const positionView = this.getPreparedNodeAttributeView(preparedNodeVisualBuffers, NODE_POSITION_ATTRIBUTE);\n      const colorView = this.getPreparedNodeAttributeView(preparedNodeVisualBuffers, NODE_COLOR_ATTRIBUTE);\n      const sizeView = this.getPreparedNodeAttributeView(preparedNodeVisualBuffers, NODE_SIZE_ATTRIBUTE);\n      const stateView = this.getPreparedNodeAttributeView(preparedNodeVisualBuffers, NODE_STATE_ATTRIBUTE);\n      const outlineWidthView = this.getPreparedNodeAttributeView(preparedNodeVisualBuffers, NODE_OUTLINE_WIDTH_ATTRIBUTE);\n      const outlineColorView = this.getPreparedNodeAttributeView(preparedNodeVisualBuffers, NODE_OUTLINE_COLOR_ATTRIBUTE);\n\n      if (targetIndices) {\n        for (const index of targetIndices) {\n          this.writeNodeDefaults(\n            index,\n            color,\n            size,\n            outlineWidth,\n            outlineColor,\n            positionView,\n            colorView,\n            sizeView,\n            outlineWidthView,\n            outlineColorView,\n          );\n          if (stateView) {\n            stateView[index] = typeof stateView[0] === 'bigint' ? 0n : 0;\n          }\n        }\n      }\n\n      const bumpNode = [];\n      if (positionView) bumpNode.push(NODE_POSITION_ATTRIBUTE);\n      if (colorView) bumpNode.push(NODE_COLOR_ATTRIBUTE);\n      if (sizeView) bumpNode.push(NODE_SIZE_ATTRIBUTE);\n      if (stateView) bumpNode.push(NODE_STATE_ATTRIBUTE);\n      if (outlineWidthView) bumpNode.push(NODE_OUTLINE_WIDTH_ATTRIBUTE);\n      if (outlineColorView) bumpNode.push(NODE_OUTLINE_COLOR_ATTRIBUTE);\n      if (bumpNode.length) this.bumpNodeAttributes(...bumpNode);\n    });\n  }\n\n  /**\n   * Initializes basic edge visuals. Can be re-used whenever edges are added.\n   * @param {Iterable<number>} [indices]\n   */\n  applyEdgeDefaults(indices) {\n    const preparedEdgeVisualBuffers = this.prepareEdgeAttributeLookups([\n      EDGE_COLOR_ATTRIBUTE,\n      EDGE_OPACITY_ATTRIBUTE,\n      EDGE_WIDTH_ATTRIBUTE,\n      EDGE_STATE_ATTRIBUTE,\n    ], { allowMissing: true });\n    this.withBufferAccess(() => {\n      const targetIndices = indices ?? this.network?.edgeIndices;\n      const color = DEFAULT_EDGE_COLOR;\n      const opacity = DEFAULT_EDGE_OPACITY;\n      const width = DEFAULT_EDGE_WIDTH;\n      const colorView = this.getPreparedEdgeAttributeView(preparedEdgeVisualBuffers, EDGE_COLOR_ATTRIBUTE);\n      const opacityView = this.getPreparedEdgeAttributeView(preparedEdgeVisualBuffers, EDGE_OPACITY_ATTRIBUTE);\n      const widthView = this.getPreparedEdgeAttributeView(preparedEdgeVisualBuffers, EDGE_WIDTH_ATTRIBUTE);\n      const stateView = this.getPreparedEdgeAttributeView(preparedEdgeVisualBuffers, EDGE_STATE_ATTRIBUTE);\n\n      if (targetIndices) {\n        for (const index of targetIndices) {\n          this.writeEdgeDefaults(index, color, width, opacity, colorView, widthView, opacityView);\n          if (stateView) {\n            stateView[index] = typeof stateView[0] === 'bigint' ? 0n : 0;\n          }\n        }\n      }\n\n      const bumpEdge = [];\n      if (colorView) bumpEdge.push(EDGE_COLOR_ATTRIBUTE);\n      if (opacityView) bumpEdge.push(EDGE_OPACITY_ATTRIBUTE);\n      if (widthView) bumpEdge.push(EDGE_WIDTH_ATTRIBUTE);\n      if (stateView) bumpEdge.push(EDGE_STATE_ATTRIBUTE);\n      if (bumpEdge.length) this.bumpEdgeAttributes(...bumpEdge);\n    });\n  }\n\n  /**\n   * Seeds missing node positions with random values so downstream layouts/renderers\n   * always have finite coordinates to start with.\n   * @param {{width?: number, height?: number, depth?: number, mode?: string, center?: number[]}} [bounds]\n   */\n  seedMissingPositions(bounds = {}) {\n    const preparedNodePositions = this.prepareNodeAttributeLookups([NODE_POSITION_ATTRIBUTE], { allowMissing: true });\n    this.withBufferAccess(() => {\n      const nodeIndices = this.network?.nodeIndices;\n      const width = Math.max(1, bounds.width ?? 1);\n      const height = Math.max(1, bounds.height ?? 1);\n      const depth = Math.max(0, bounds.depth ?? 0);\n      const mode = bounds.mode === '3d' ? '3d' : '2d';\n      const center = Array.isArray(bounds.center) ? bounds.center : null;\n      const cx = Number.isFinite(center?.[0]) ? center[0] : 0;\n      const cy = Number.isFinite(center?.[1]) ? center[1] : 0;\n      const cz = Number.isFinite(center?.[2]) ? center[2] : 0;\n      const pos = this.getPreparedNodeAttributeView(preparedNodePositions, NODE_POSITION_ATTRIBUTE);\n      if (!pos || !nodeIndices?.length) return;\n      let touched = false;\n      const previousMaxNodeId = this.maxInitializedNodeId ?? -1;\n      let maxNodeId = previousMaxNodeId;\n      let hasAnyNonZero = false;\n\n      for (let i = 0; i < nodeIndices.length; i += 1) {\n        const nodeId = nodeIndices[i];\n        const offset = nodeId * 3;\n        const missing =\n          !Number.isFinite(pos[offset]) ||\n          !Number.isFinite(pos[offset + 1]) ||\n          !Number.isFinite(pos[offset + 2]);\n        const zeroVector = pos[offset] === 0 && pos[offset + 1] === 0 && pos[offset + 2] === 0;\n        if (!missing && !zeroVector) {\n          hasAnyNonZero = true;\n        }\n        if (nodeId > maxNodeId) {\n          maxNodeId = nodeId;\n        }\n      }\n\n      const seedCount = Math.max(1, maxNodeId + 1);\n      const seedBounds = {\n        width,\n        height,\n        depth,\n        mode,\n        center: [cx, cy, cz],\n      };\n      const seededNodeIds = [];\n      const assignSeededPosition = (nodeId, offset) => {\n        const [x, y, z] = computeSeedPosition(nodeId, seedCount, seedBounds);\n        pos[offset] = x;\n        pos[offset + 1] = y;\n        pos[offset + 2] = z;\n        seededNodeIds.push(nodeId);\n        touched = true;\n      };\n\n      for (let i = 0; i < nodeIndices.length; i += 1) {\n        const nodeId = nodeIndices[i];\n        const offset = nodeId * 3;\n        const missing =\n          !Number.isFinite(pos[offset]) ||\n          !Number.isFinite(pos[offset + 1]) ||\n          !Number.isFinite(pos[offset + 2]);\n        if (missing) {\n          assignSeededPosition(nodeId, offset);\n          hasAnyNonZero = true;\n        }\n      }\n\n      const zeroSeedBaseline = hasAnyNonZero\n        ? (previousMaxNodeId >= 0 ? previousMaxNodeId : maxNodeId)\n        : -1;\n      for (let i = 0; i < nodeIndices.length; i += 1) {\n        const nodeId = nodeIndices[i];\n        const offset = nodeId * 3;\n        const zeroVector = pos[offset] === 0 && pos[offset + 1] === 0 && pos[offset + 2] === 0;\n        const isNewNode = nodeId > zeroSeedBaseline;\n        if (zeroVector && (!hasAnyNonZero || isNewNode)) {\n          assignSeededPosition(nodeId, offset);\n        }\n      }\n\n      if (seededNodeIds.length > 1) {\n        let sumX = 0;\n        let sumY = 0;\n        let sumZ = 0;\n        for (const nodeId of seededNodeIds) {\n          const offset = nodeId * 3;\n          sumX += pos[offset];\n          sumY += pos[offset + 1];\n          sumZ += pos[offset + 2];\n        }\n        const shiftX = (sumX / seededNodeIds.length) - cx;\n        const shiftY = (sumY / seededNodeIds.length) - cy;\n        const shiftZ = mode === '3d' ? ((sumZ / seededNodeIds.length) - cz) : 0;\n        for (const nodeId of seededNodeIds) {\n          const offset = nodeId * 3;\n          pos[offset] -= shiftX;\n          pos[offset + 1] -= shiftY;\n          pos[offset + 2] = mode === '3d' ? (pos[offset + 2] - shiftZ) : cz;\n        }\n      }\n      this.maxInitializedNodeId = Math.max(maxNodeId, this.maxInitializedNodeId ?? -1);\n      if (touched) {\n        this.bumpNodeAttributes(NODE_POSITION_ATTRIBUTE);\n      }\n    });\n  }\n\n  ensureNodeAttribute(name, type, dimension) {\n    const expected = { dimension, type };\n    const info = this.network.getNodeAttributeInfo(name);\n    const hasAttribute = this.network.hasNodeAttribute(name);\n\n    if (!hasAttribute) {\n      try {\n        this.network.defineNodeAttribute(name, type, dimension);\n      } catch (error) {\n        const msg = error instanceof Error ? error.message : '';\n        if (!/already/i.test(msg)) throw error;\n      }\n    } else if (attributeInfoMismatched(info, expected)) {\n      const currentDim = info?.dimension ?? dimension;\n      const shouldExpand = currentDim > 0 && currentDim < dimension;\n      const hasExistingRows = (this.network.nodeCapacity ?? this.network.nodeCount ?? 0) > 0;\n      let preserved = null;\n      if (shouldExpand && hasExistingRows) {\n        try {\n          const buffer = this.network.getNodeAttributeBuffer(name);\n          const view = buffer?.view ?? null;\n          const count = view ? Math.floor(view.length / currentDim) : 0;\n          preserved = this.withBufferAccess(() => {\n            return expandAttributeData({\n              view,\n              count,\n              fromDimension: currentDim,\n              toDimension: dimension,\n            });\n          });\n        } catch (error) {\n          warnOnce(this, `node-preserve:${name}`, `VisualAttributes: failed to preserve node attribute \"${name}\" while expanding metadata; aborting redefinition.`, { error });\n          throw error;\n        }\n      }\n      console.warn(\n        `Attribute ${name} metadata mismatch: redefining with dimension ${dimension} type ${type} (saw dimension ${info?.dimension ?? 'unknown'}, type ${info?.type ?? 'unknown'}).` +\n          (shouldExpand ? ' Existing data was expanded and padded to the new dimension.' : ''),\n      );\n      this.network.removeNodeAttribute(name);\n      this.network.defineNodeAttribute(name, type, dimension);\n      if (preserved) {\n        this.withBufferAccess(() => {\n          const buffer = this.network.getNodeAttributeBuffer(name);\n          if (buffer?.view) {\n            buffer.view.set(preserved.subarray(0, buffer.view.length));\n          }\n        });\n      }\n    }\n\n    try {\n      this.withBufferAccess(() => {\n        const buffer = this.network.getNodeAttributeBuffer(name);\n        validateAttribute(buffer, name, expected);\n      });\n    } catch (error) {\n      // If no node capacity is allocated yet, buffer pointers may be unavailable; defer validation.\n      if (this.network.nodeCapacity > 0) throw error;\n    }\n  }\n\n  ensureEdgeAttribute(name, type, dimension) {\n    const expected = { dimension, type };\n    const info = this.network.getEdgeAttributeInfo(name);\n    const hasAttribute = this.network.hasEdgeAttribute(name, true);\n\n    if (!hasAttribute) {\n      try {\n        this.network.defineEdgeAttribute(name, type, dimension);\n      } catch (error) {\n        const msg = error instanceof Error ? error.message : '';\n        if (!/already/i.test(msg)) throw error;\n      }\n    } else if (attributeInfoMismatched(info, expected)) {\n      const currentDim = info?.dimension ?? dimension;\n      const shouldExpand = currentDim > 0 && currentDim < dimension;\n      const hasExistingRows = (this.network.edgeCapacity ?? this.network.edgeCount ?? 0) > 0;\n      let preserved = null;\n      if (shouldExpand && hasExistingRows) {\n        try {\n          const buffer = this.network.getEdgeAttributeBuffer(name);\n          const view = buffer?.view ?? null;\n          const count = view ? Math.floor(view.length / currentDim) : 0;\n          preserved = this.withBufferAccess(() => {\n            return expandAttributeData({\n              view,\n              count,\n              fromDimension: currentDim,\n              toDimension: dimension,\n            });\n          });\n        } catch (error) {\n          warnOnce(this, `edge-preserve:${name}`, `VisualAttributes: failed to preserve edge attribute \"${name}\" while expanding metadata; aborting redefinition.`, { error });\n          throw error;\n        }\n      }\n      console.warn(\n        `Edge attribute ${name} metadata mismatch: redefining with dimension ${dimension} type ${type} (saw dimension ${info?.dimension ?? 'unknown'}, type ${info?.type ?? 'unknown'}).` +\n          (shouldExpand ? ' Existing data was expanded and padded to the new dimension.' : ''),\n      );\n      this.network.removeEdgeAttribute(name);\n      this.network.defineEdgeAttribute(name, type, dimension);\n      if (preserved) {\n        this.withBufferAccess(() => {\n          const buffer = this.network.getEdgeAttributeBuffer(name);\n          if (buffer?.view) {\n            buffer.view.set(preserved.subarray(0, buffer.view.length));\n          }\n        });\n      }\n    }\n\n    try {\n      this.withBufferAccess(() => {\n        const buffer = this.network.getEdgeAttributeBuffer(name);\n        validateAttribute(buffer, name, expected);\n      });\n    } catch (error) {\n      // If no edge capacity is allocated yet, buffer pointers may be unavailable; defer validation.\n      if (this.network.edgeCapacity > 0) throw error;\n    }\n  }\n\n  ensureNodeToEdgeAttribute(sourceName, edgeName, sourceDimension) {\n    const targetDimension = sourceDimension * 2;\n    const expected = { dimension: targetDimension, type: AttributeType.Float };\n    const info = this.network.getEdgeAttributeInfo(edgeName);\n    const hasAttribute = this.network.hasEdgeAttribute(edgeName);\n\n    if (!hasAttribute) {\n      this.network.defineNodeToEdgeAttribute(sourceName, edgeName, 'both');\n    } else if (attributeInfoMismatched(info, expected)) {\n      const currentDim = info?.dimension ?? targetDimension;\n      const shouldExpand = currentDim > 0 && currentDim < targetDimension;\n      const hasExistingRows = (this.network.edgeCapacity ?? this.network.edgeCount ?? 0) > 0;\n      let preserved = null;\n      if (shouldExpand && hasExistingRows) {\n        try {\n          const buffer = this.network.getEdgeAttributeBuffer(edgeName);\n          const view = buffer?.view ?? null;\n          const count = view ? Math.floor(view.length / currentDim) : 0;\n          preserved = this.withBufferAccess(() => {\n            return expandAttributeData({\n              view,\n              count,\n              fromDimension: currentDim,\n              toDimension: targetDimension,\n            });\n          });\n        } catch (error) {\n          warnOnce(this, `node-to-edge-preserve:${edgeName}`, `VisualAttributes: failed to preserve edge attribute \"${edgeName}\" while expanding node-to-edge metadata; aborting redefinition.`, { error });\n          throw error;\n        }\n      }\n      console.warn(\n        `Edge attribute ${edgeName} metadata mismatch: redefining with dimension ${targetDimension} type ${AttributeType.Float} (saw dimension ${info?.dimension ?? 'unknown'}, type ${info?.type ?? 'unknown'})` +\n          (shouldExpand ? ' Existing data was expanded and padded to the new dimension.' : ''),\n      );\n      this.network.removeEdgeAttribute(edgeName);\n      this.network.defineNodeToEdgeAttribute(sourceName, edgeName, 'both');\n      if (preserved) {\n        this.withBufferAccess(() => {\n          const buffer = this.network.getEdgeAttributeBuffer(edgeName);\n          if (buffer?.view) {\n            buffer.view.set(preserved.subarray(0, buffer.view.length));\n          }\n        });\n      }\n    }\n\n    try {\n      this.withBufferAccess(() => {\n        const buffer = this.network.getEdgeAttributeBuffer(edgeName);\n        validateAttribute(buffer, edgeName, expected);\n      });\n    } catch (error) {\n      // If no edge capacity is allocated yet, buffer pointers may be unavailable; defer validation.\n      if (this.network.edgeCapacity > 0) throw error;\n    }\n  }\n\n  collectAttributeNames(mapper, mode) {\n    const node = new Set();\n    const edge = new Set();\n    const add = (attr) => {\n      if (!attr) return;\n      const list = Array.isArray(attr) ? attr : [attr];\n      for (const entry of list) {\n        if (typeof entry !== 'string') continue;\n        if (entry.startsWith('@node.') || entry.startsWith('@nodes.')) {\n          node.add(entry.replace('@nodes.', '').replace('@node.', ''));\n        } else {\n          (mode === 'edge' ? edge : node).add(entry);\n        }\n      }\n    };\n    for (const config of mapper.channels.values()) {\n      add(config.attributes ?? config.from);\n      if (config.rules) {\n        for (const rule of config.rules) {\n          add(rule.attributes);\n        }\n      }\n    }\n    return { node, edge };\n  }\n\n  resolveNodeAttributeBuffers(names) {\n    const buffers = new Map();\n    if (!names?.length && !names?.size) return buffers;\n    for (const entry of names) {\n      const name = typeof entry === 'string' ? entry : entry?.name;\n      const lookup = typeof entry === 'string' ? this.normalizeLookupName(entry) : entry?.lookup;\n      const synthetic = typeof entry === 'string' ? (lookup === INDEX_ATTRIBUTE ? 'index' : null) : entry?.synthetic;\n      if (synthetic === 'index') {\n        buffers.set(name, { synthetic: 'index', dimension: 1 });\n        continue;\n      }\n      const buffer = this.network.getNodeAttributeBuffer(lookup);\n      if (buffer?.view) {\n        const dimension = buffer.dimension ?? 1;\n        buffers.set(name, { view: buffer.view, dimension: dimension > 0 ? dimension : 1 });\n      }\n    }\n    return buffers;\n  }\n\n  resolveEdgeAttributeBuffers(names) {\n    const buffers = new Map();\n    if (!names?.length && !names?.size) return buffers;\n    for (const entry of names) {\n      const name = typeof entry === 'string' ? entry : entry?.name;\n      const lookup = typeof entry === 'string' ? this.normalizeLookupName(entry) : entry?.lookup;\n      const synthetic = typeof entry === 'string' ? (lookup === INDEX_ATTRIBUTE ? 'index' : null) : entry?.synthetic;\n      if (synthetic === 'index') {\n        buffers.set(name, { synthetic: 'index', dimension: 1 });\n        continue;\n      }\n      const buffer = this.network.getEdgeAttributeBuffer(lookup);\n      if (buffer?.view) {\n        buffers.set(name, { view: buffer.view, dimension: buffer.dimension ?? 1 });\n      }\n    }\n    return buffers;\n  }\n\n  buildAttributeObject(buffers, index) {\n    const result = {};\n    for (const [name, info] of buffers.entries()) {\n      const { view, dimension, synthetic } = info;\n      if (synthetic === 'index') {\n        result[name] = index;\n        continue;\n      }\n      if (!view) continue;\n      if (dimension === 1) {\n        result[name] = view[index];\n      } else {\n        const start = index * dimension;\n        // Expose a view into the buffer to avoid per-item copies; callers should treat as read-only.\n        result[name] = view.subarray(start, start + dimension);\n      }\n    }\n    return result;\n  }\n\n  buildEdgeAttributeObject(buffers, edgeId) {\n    return this.buildAttributeObject(buffers, edgeId);\n  }\n\n  writeNodeVisuals(nodeId, mapped, visuals) {\n    if (!mapped) return;\n    if (mapped.color && visuals.color) {\n      const rgba = this.toRgba(mapped.color);\n      const offset = nodeId * 4;\n      visuals.color[offset + 0] = rgba[0];\n      visuals.color[offset + 1] = rgba[1];\n      visuals.color[offset + 2] = rgba[2];\n      visuals.color[offset + 3] = rgba[3];\n    }\n    if (Number.isFinite(mapped.size) && visuals.size) {\n      visuals.size[nodeId] = mapped.size;\n    }\n    if (Number.isFinite(mapped.outline) && visuals.outline) {\n      visuals.outline[nodeId] = mapped.outline;\n    }\n    if (mapped.outlineColor && visuals.outlineColor) {\n      const rgba = this.toRgba(mapped.outlineColor);\n      const offset = nodeId * 4;\n      visuals.outlineColor[offset + 0] = rgba[0];\n      visuals.outlineColor[offset + 1] = rgba[1];\n      visuals.outlineColor[offset + 2] = rgba[2];\n      visuals.outlineColor[offset + 3] = rgba[3];\n    }\n    const isArrayLikePosition = Array.isArray(mapped.position) || ArrayBuffer.isView(mapped.position);\n    if (isArrayLikePosition && visuals.position) {\n      const offset = nodeId * 3;\n      visuals.position[offset + 0] = mapped.position[0] ?? visuals.position[offset + 0];\n      visuals.position[offset + 1] = mapped.position[1] ?? visuals.position[offset + 1];\n      visuals.position[offset + 2] = mapped.position[2] ?? visuals.position[offset + 2];\n    }\n  }\n\n  writeEdgeVisuals(edgeId, mapped, visuals) {\n    if (!mapped) return;\n    if (mapped.color && visuals.color) {\n      const [startColor, endColor] = this.resolveEdgeColorPair(mapped.color);\n      const offset = edgeId * 8;\n      visuals.color[offset + 0] = startColor[0];\n      visuals.color[offset + 1] = startColor[1];\n      visuals.color[offset + 2] = startColor[2];\n      visuals.color[offset + 3] = startColor[3];\n      visuals.color[offset + 4] = endColor[0];\n      visuals.color[offset + 5] = endColor[1];\n      visuals.color[offset + 6] = endColor[2];\n      visuals.color[offset + 7] = endColor[3];\n    }\n    if (mapped.width != null && visuals.width) {\n      const [startWidth, endWidth] = this.resolveEdgeScalarPair(mapped.width);\n      const offset = edgeId * 2;\n      visuals.width[offset + 0] = startWidth;\n      visuals.width[offset + 1] = endWidth;\n    }\n    if (mapped.opacity != null && visuals.opacity) {\n      const [startOpacity, endOpacity] = this.resolveEdgeScalarPair(mapped.opacity);\n      const offset = edgeId * 2;\n      visuals.opacity[offset + 0] = startOpacity;\n      visuals.opacity[offset + 1] = endOpacity;\n    }\n    if (mapped.endpointSize && visuals.endpointSize) {\n      const value = Array.isArray(mapped.endpointSize)\n        ? mapped.endpointSize\n        : [mapped.endpointSize?.source, mapped.endpointSize?.target];\n      const offset = edgeId * 2;\n      visuals.endpointSize[offset + 0] = value?.[0] ?? visuals.endpointSize[offset + 0];\n      visuals.endpointSize[offset + 1] = value?.[1] ?? visuals.endpointSize[offset + 1];\n    }\n  }\n\n  toRgba(value) {\n    const fallback = [0, 0, 0, 1];\n    const isArrayLike = Array.isArray(value) || ArrayBuffer.isView(value);\n    if (isArrayLike) {\n      if (value.length === 4) {\n        const eps = 1e-6;\n        const maxRgb = Math.max(Number(value[0] ?? 0), Number(value[1] ?? 0), Number(value[2] ?? 0));\n        const needsScale = Number.isFinite(maxRgb) && maxRgb > 1 + eps;\n        if (needsScale) {\n          const a = Number(value[3] ?? 1);\n          return [\n            (Number(value[0] ?? 0) || 0) / 255,\n            (Number(value[1] ?? 0) || 0) / 255,\n            (Number(value[2] ?? 0) || 0) / 255,\n            a > 1 + eps ? a / 255 : a,\n          ].map((v) => Math.min(1, Math.max(0, v)));\n        }\n        return [\n          Math.min(1, Math.max(0, Number(value[0] ?? 0) || 0)),\n          Math.min(1, Math.max(0, Number(value[1] ?? 0) || 0)),\n          Math.min(1, Math.max(0, Number(value[2] ?? 0) || 0)),\n          Math.min(1, Math.max(0, Number(value[3] ?? 1) || 0)),\n        ];\n      }\n      if (value.length === 3) {\n        const eps = 1e-6;\n        const maxRgb = Math.max(Number(value[0] ?? 0), Number(value[1] ?? 0), Number(value[2] ?? 0));\n        const needsScale = Number.isFinite(maxRgb) && maxRgb > 1 + eps;\n        const scale = needsScale ? 1 / 255 : 1;\n        return [\n          Math.min(1, Math.max(0, (Number(value[0] ?? 0) || 0) * scale)),\n          Math.min(1, Math.max(0, (Number(value[1] ?? 0) || 0) * scale)),\n          Math.min(1, Math.max(0, (Number(value[2] ?? 0) || 0) * scale)),\n          1,\n        ];\n      }\n    }\n    if (typeof value === 'string') {\n      const hex = value.trim();\n      if (/^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(hex)) {\n        const raw = hex.slice(1);\n        const expand =\n          raw.length === 3 || raw.length === 4\n            ? raw\n                .split('')\n                .map((c) => c + c)\n                .join('')\n            : raw;\n        const hasAlpha = expand.length === 8;\n        const rgb = expand.slice(0, 6);\n        const int = parseInt(rgb, 16);\n        const r = (int >> 16) & 255;\n        const g = (int >> 8) & 255;\n        const b = int & 255;\n        const a = hasAlpha ? parseInt(expand.slice(6, 8), 16) / 255 : 1;\n        return [r / 255, g / 255, b / 255, a];\n      }\n    }\n    if (typeof value === 'number') {\n      const v = value > 1 ? value / 255 : value;\n      return [v, v, v, 1];\n    }\n    if (value && typeof value === 'object' && 'source' in value) {\n      return this.toRgba(value.source);\n    }\n    return fallback;\n  }\n\n  resolveEdgeColorPair(value) {\n    if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n      if (value.length >= 8) {\n        const start = [value[0], value[1], value[2], value[3]];\n        const end = [value[4], value[5], value[6], value[7]];\n        return [this.toRgba(start), this.toRgba(end)];\n      }\n      if (value.length === 4) {\n        const rgba = this.toRgba(value);\n        return [rgba, rgba];\n      }\n    }\n    if (value && typeof value === 'object') {\n      const start = 'source' in value ? this.toRgba(value.source) : this.toRgba(value);\n      const end = 'target' in value ? this.toRgba(value.target) : start;\n      return [start, end];\n    }\n    const rgba = this.toRgba(value);\n    return [rgba, rgba];\n  }\n\n  resolveEdgeScalarPair(value) {\n    if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n      if (value.length >= 2) {\n        const start = Number.isFinite(value[0]) ? Number(value[0]) : 0;\n        const end = Number.isFinite(value[1]) ? Number(value[1]) : start;\n        return [start, end];\n      }\n      if (value.length === 1) {\n        const v = Number(value[0]) ?? 0;\n        return [v, v];\n      }\n    }\n    if (value && typeof value === 'object') {\n      const start = 'source' in value ? Number(value.source) : Number(value);\n      const end = 'target' in value ? Number(value.target) : start;\n      const startSafe = Number.isFinite(start) ? start : 0;\n      const endSafe = Number.isFinite(end) ? end : startSafe;\n      return [startSafe, endSafe];\n    }\n    const scalar = Number.isFinite(value) ? value : 0;\n    return [scalar, scalar];\n  }\n\n  writeNodeDefaults(\n    index,\n    color,\n    size,\n    outlineWidth,\n    outlineColor,\n    positionView,\n    colorView,\n    sizeView,\n    outlineWidthView,\n    outlineColorView,\n  ) {\n    if (colorView) {\n      const colorOffset = index * 4;\n      colorView[colorOffset + 0] = color[0];\n      colorView[colorOffset + 1] = color[1];\n      colorView[colorOffset + 2] = color[2];\n      colorView[colorOffset + 3] = color[3];\n    }\n\n    if (sizeView) {\n      const sizeOffset = index;\n      sizeView[sizeOffset] = size;\n    }\n\n    if (outlineWidthView) {\n      const sizeOffset = index;\n      outlineWidthView[sizeOffset] = outlineWidth;\n    }\n    if (outlineColorView) {\n      const outlineOffset = index * 4;\n      outlineColorView[outlineOffset + 0] = outlineColor[0];\n      outlineColorView[outlineOffset + 1] = outlineColor[1];\n      outlineColorView[outlineOffset + 2] = outlineColor[2];\n      outlineColorView[outlineOffset + 3] = outlineColor[3];\n    }\n\n    if (positionView) {\n      const posOffset = index * 3;\n      if (!Number.isFinite(positionView[posOffset])) {\n        positionView[posOffset] = 0;\n      }\n      if (!Number.isFinite(positionView[posOffset + 1])) {\n        positionView[posOffset + 1] = 0;\n      }\n      if (!Number.isFinite(positionView[posOffset + 2])) {\n        positionView[posOffset + 2] = 0;\n      }\n    }\n  }\n\n  writeEdgeDefaults(index, color, width, opacity, colorView, widthView, opacityView) {\n    if (colorView) {\n      const colorOffset = index * 8;\n      const rgba = this.toRgba(color);\n      colorView[colorOffset + 0] = rgba[0];\n      colorView[colorOffset + 1] = rgba[1];\n      colorView[colorOffset + 2] = rgba[2];\n      colorView[colorOffset + 3] = rgba[3];\n      colorView[colorOffset + 4] = rgba[0];\n      colorView[colorOffset + 5] = rgba[1];\n      colorView[colorOffset + 6] = rgba[2];\n      colorView[colorOffset + 7] = rgba[3];\n    }\n\n    if (widthView) {\n      const widthOffset = index * 2;\n      widthView[widthOffset] = width;\n      widthView[widthOffset + 1] = width;\n    }\n\n    if (opacityView) {\n      const opacityOffset = index * 2;\n      opacityView[opacityOffset] = opacity;\n      opacityView[opacityOffset + 1] = opacity;\n    }\n  }\n\n  withBufferAccess(fn) {\n    this._bufferAccessDepth += 1;\n    let result;\n    let completed = false;\n    try {\n      if (typeof this.network?.withBufferAccess === 'function') {\n        result = this.network.withBufferAccess(fn);\n      } else {\n        result = fn();\n      }\n      completed = true;\n      return result;\n    } finally {\n      this._bufferAccessDepth = Math.max(0, this._bufferAccessDepth - 1);\n      if (completed && this._bufferAccessDepth === 0) {\n        this.flushPendingAttributeBumps();\n      }\n    }\n  }\n\n  flushPendingAttributeBumps() {\n    if (!this.network) return;\n    const nodeNames = Array.from(this._pendingNodeAttributeBumps);\n    const edgeNames = Array.from(this._pendingEdgeAttributeBumps);\n    for (const name of nodeNames) {\n      this.network.bumpNodeAttributeVersion?.(name);\n      this._pendingNodeAttributeBumps.delete(name);\n    }\n    for (const name of edgeNames) {\n      this.network.bumpEdgeAttributeVersion?.(name);\n      this._pendingEdgeAttributeBumps.delete(name);\n    }\n  }\n}\n\nexport default VisualAttributes;\n","import { AttributeType } from 'helios-network';\nimport { VISUAL_ATTRIBUTE_NAMES, DEFAULT_NODE_SIZE, DEFAULT_NODE_OUTLINE_WIDTH } from '../pipeline/constants.js';\n\nconst {\n  NODE_POSITION_ATTRIBUTE,\n  NODE_SIZE_ATTRIBUTE,\n  NODE_STATE_ATTRIBUTE,\n  NODE_OUTLINE_WIDTH_ATTRIBUTE,\n} = VISUAL_ATTRIBUTE_NAMES;\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\nconst INTEGER_LIKE_TYPES = new Set([\n  AttributeType.Integer,\n  AttributeType.UnsignedInteger,\n  AttributeType.Category,\n  AttributeType.BigInteger,\n  AttributeType.UnsignedBigInteger,\n]);\n\nconst DEFAULT_CONFIG = Object.freeze({\n  enabled: false,\n  source: null,\n  selectionMode: 'ranked',\n  pinnedNodes: [],\n  selectedOnlySpaceAware: true,\n  hoveredNodeEnabled: false,\n  hoveredNodeSource: null,\n  fallbackSources: ['Label', 'Name', '$id'],\n  maxVisible: 120,\n  minScreenRadiusPx: 0,\n  maxUpdateFps: 20,\n  keepBoost: 1.08,\n  selectedBoost: 2.0,\n  hoveredBoost: 3.0,\n  fontFamily: 'ui-sans-serif, system-ui, -apple-system, Segoe UI, sans-serif',\n  illustratorCompatible: false,\n  fontSizeScale: 1,\n  fill: '#f4f7ff',\n  outlineColor: '#001426cc',\n  outlineWidth: 2,\n  offsetRadiusFactor: 1,\n  offsetPx: 4,\n  maxChars: 45,\n  maxRows: 2,\n  collisionPaddingPx: 2,\n  collisionCellPx: 18,\n  delegateSnapshotMaxFps: 4,\n});\n\nconst LARGE_GRAPH_LABEL_RANK_NODE_THRESHOLD = 100_000;\nconst LARGE_GRAPH_LABEL_INTERACTION_FULL_FPS = 2;\nconst LARGE_GRAPH_LABEL_VIEW_SETTLE_MS = 160;\nconst LARGE_GRAPH_LABEL_PROGRESSIVE_CHUNK_SIZE = 20_000;\nconst WARNING_KEYS_BY_OWNER = new WeakMap();\n\nfunction warnOnce(owner, key, message, detail = undefined) {\n  if (typeof console === 'undefined' || typeof console.warn !== 'function') return;\n  const target = owner && (typeof owner === 'object' || typeof owner === 'function') ? owner : warnOnce;\n  let keys = WARNING_KEYS_BY_OWNER.get(target);\n  if (!keys) {\n    keys = new Set();\n    WARNING_KEYS_BY_OWNER.set(target, keys);\n  }\n  const normalizedKey = String(key ?? message);\n  if (keys.has(normalizedKey)) return;\n  keys.add(normalizedKey);\n  if (detail === undefined) console.warn(message);\n  else console.warn(message, detail);\n}\n\nfunction clamp(value, min, max) {\n  const v = Number(value);\n  if (!Number.isFinite(v)) return min;\n  if (v < min) return min;\n  if (v > max) return max;\n  return v;\n}\n\nfunction clampInt(value, min, max) {\n  return Math.floor(clamp(value, min, max));\n}\n\nfunction clamp01(value) {\n  return clamp(value, 0, 1);\n}\n\nfunction toFinite(value, fallback = 0) {\n  const n = Number(value);\n  return Number.isFinite(n) ? n : fallback;\n}\n\nfunction quantize(value, step = 1e-3) {\n  const n = Number(value);\n  if (!Number.isFinite(n)) return 0;\n  return Math.round(n / step) * step;\n}\n\nfunction normalizeColorString(value, fallback) {\n  if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n    const r = Math.round(clamp01(value[0]) * 255);\n    const g = Math.round(clamp01(value[1]) * 255);\n    const b = Math.round(clamp01(value[2]) * 255);\n    const a = clamp01(value?.[3] ?? 1);\n    return `rgba(${r}, ${g}, ${b}, ${a})`;\n  }\n  if (typeof value === 'string' && value.trim()) return value.trim();\n  return fallback;\n}\n\nfunction normalizePinnedNodes(value) {\n  return Array.from(new Set(Array.from(value ?? [], (entry) => Number(entry))\n    .filter((entry) => Number.isInteger(entry) && entry >= 0)));\n}\n\nfunction colorStringToSvgPaint(value, fallback = '#000000') {\n  const raw = String(value ?? '').trim();\n  if (!raw) return { color: fallback, opacity: null };\n  if (raw.startsWith('#')) {\n    const hex = raw.slice(1);\n    if (hex.length === 8) {\n      const color = `#${hex.slice(0, 6)}`;\n      const alpha = Number.parseInt(hex.slice(6, 8), 16) / 255;\n      return { color, opacity: Number.isFinite(alpha) && alpha < 1 ? alpha : null };\n    }\n    if (hex.length === 4) {\n      const color = `#${hex.slice(0, 3)}`;\n      const alpha = Number.parseInt(`${hex[3]}${hex[3]}`, 16) / 255;\n      return { color, opacity: Number.isFinite(alpha) && alpha < 1 ? alpha : null };\n    }\n    return { color: raw, opacity: null };\n  }\n  const rgba = /^rgba?\\(([^)]+)\\)$/iu.exec(raw);\n  if (rgba) {\n    const parts = rgba[1].split(',').map((part) => part.trim());\n    if (parts.length >= 3) {\n      const r = clampInt(parts[0], 0, 255);\n      const g = clampInt(parts[1], 0, 255);\n      const b = clampInt(parts[2], 0, 255);\n      const a = parts.length >= 4 ? clamp01(parts[3]) : 1;\n      return {\n        color: `rgb(${r}, ${g}, ${b})`,\n        opacity: a < 1 ? a : null,\n      };\n    }\n  }\n  return { color: raw, opacity: null };\n}\n\nfunction composeViewSignature(uniforms) {\n  const viewport = uniforms?.viewport ?? {};\n  const vp = uniforms?.viewProjection;\n  if (!vp) return 'na';\n  const parts = [\n    `${Math.floor(viewport.width ?? 0)}x${Math.floor(viewport.height ?? 0)}`,\n    uniforms?.mode ?? '',\n    uniforms?.projectionType ?? '',\n  ];\n  for (let i = 0; i < 16; i += 1) {\n    parts.push(String(quantize(vp[i] ?? 0, 1e-4)));\n  }\n  return parts.join('|');\n}\n\nfunction projectPointInto(out, viewProjection, width, height, x, y, z) {\n  const cx = viewProjection[0] * x + viewProjection[4] * y + viewProjection[8] * z + viewProjection[12];\n  const cy = viewProjection[1] * x + viewProjection[5] * y + viewProjection[9] * z + viewProjection[13];\n  const cz = viewProjection[2] * x + viewProjection[6] * y + viewProjection[10] * z + viewProjection[14];\n  const cw = viewProjection[3] * x + viewProjection[7] * y + viewProjection[11] * z + viewProjection[15];\n  if (!Number.isFinite(cx) || !Number.isFinite(cy) || !Number.isFinite(cz) || !Number.isFinite(cw)) return null;\n  if (Math.abs(cw) < 1e-12) return null;\n  const invW = 1 / cw;\n  const ndcX = cx * invW;\n  const ndcY = cy * invW;\n  const ndcZ = cz * invW;\n  const screenX = (ndcX * 0.5 + 0.5) * width;\n  const screenY = (1 - (ndcY * 0.5 + 0.5)) * height;\n  out.ndcX = ndcX;\n  out.ndcY = ndcY;\n  out.ndcZ = ndcZ;\n  out.w = cw;\n  out.screenX = screenX;\n  out.screenY = screenY;\n  return out;\n}\n\nfunction readPositionInto(positions, id, out) {\n  if (!positions) return null;\n  if (typeof positions.getInto === 'function') return positions.getInto(id, out);\n  const point = positions.get?.(id);\n  if (!point) return null;\n  out[0] = point[0];\n  out[1] = point[1];\n  out[2] = point[2];\n  return out;\n}\n\nfunction estimateTextWidthPx(text, fontSizePx) {\n  const len = typeof text === 'string' ? text.length : 0;\n  return Math.max(6, len * fontSizePx * 0.58 + 4);\n}\n\nfunction pushMinHeap(heap, entry) {\n  heap.push(entry);\n  let i = heap.length - 1;\n  while (i > 0) {\n    const parent = (i - 1) >> 1;\n    if (heap[parent].score < heap[i].score) break;\n    if (heap[parent].score === heap[i].score && heap[parent].id <= heap[i].id) break;\n    const tmp = heap[parent];\n    heap[parent] = heap[i];\n    heap[i] = tmp;\n    i = parent;\n  }\n}\n\nfunction replaceHeapRoot(heap, entry) {\n  if (!heap.length) return;\n  heap[0] = entry;\n  let i = 0;\n  const n = heap.length;\n  while (true) {\n    const left = i * 2 + 1;\n    const right = left + 1;\n    let next = i;\n    if (left < n) {\n      if (heap[left].score < heap[next].score || (heap[left].score === heap[next].score && heap[left].id < heap[next].id)) {\n        next = left;\n      }\n    }\n    if (right < n) {\n      if (heap[right].score < heap[next].score || (heap[right].score === heap[next].score && heap[right].id < heap[next].id)) {\n        next = right;\n      }\n    }\n    if (next === i) break;\n    const tmp = heap[i];\n    heap[i] = heap[next];\n    heap[next] = tmp;\n    i = next;\n  }\n}\n\nfunction maskHasSelected(view, id, selectedMask) {\n  if (!view) return false;\n  const raw = view[id];\n  if (typeof raw === 'bigint') {\n    return (raw & BigInt(selectedMask)) !== 0n;\n  }\n  return ((Number(raw ?? 0) >>> 0) & selectedMask) !== 0;\n}\n\nfunction normalizeFallbackSources(value) {\n  if (Array.isArray(value)) {\n    return value\n      .map((entry) => String(entry ?? '').trim())\n      .filter(Boolean);\n  }\n  return [...DEFAULT_CONFIG.fallbackSources];\n}\n\nfunction normalizeSelectionMode(value, fallback = DEFAULT_CONFIG.selectionMode) {\n  const raw = String(value ?? fallback).trim().toLowerCase();\n  if (raw === 'hover' || raw === 'hovered' || raw === 'hovered-node' || raw === 'hovered_node') {\n    return 'hovered-node';\n  }\n  if (raw === 'selected' || raw === 'selected-only' || raw === 'selected_only') {\n    return 'selected-only';\n  }\n  return 'ranked';\n}\n\nexport class SvgLabelController {\n  constructor(helios, options = {}) {\n    this.helios = helios ?? null;\n    this._config = { ...DEFAULT_CONFIG };\n    this._needsFullReselect = true;\n    this._viewSignature = '';\n    this._dataSignature = '';\n    this._lastFullUpdateAt = -Infinity;\n    this._viewSettleTimer = null;\n    this._lastRankedCandidateCount = 0;\n    this._progressiveRankJob = null;\n    this._progressiveRankTimer = null;\n    this._progressiveRankSerial = 0;\n    this._lastVisibleSet = new Set();\n    this._visibleEntries = [];\n    this._pool = [];\n    this._scratchCollision = new Set();\n    this._lastReason = 'init';\n    this._delegateSnapshot = null;\n    this._delegateSnapshotAt = -Infinity;\n    this._delegateSnapshotPending = false;\n    this._sparsePositionSnapshot = null;\n    this._sparsePositionSignature = '';\n    this._sparsePositionAt = -Infinity;\n    this._sparsePositionPending = false;\n    this._sparsePositionSnapshots = new Map();\n    this._sparsePositionPendingSignatures = new Set();\n    this._fallbackNameCache = { key: '', values: ['Label', 'Name'] };\n    this._hoveredNode = -1;\n\n    const svg = this.helios?.layers?.svg ?? null;\n    if (!svg || typeof document === 'undefined') {\n      this.svg = null;\n      this.group = null;\n      return;\n    }\n    this.svg = svg;\n    this.group = document.createElementNS(SVG_NS, 'g');\n    this.group.setAttribute('class', 'helios-label-layer');\n    this.group.setAttribute('pointer-events', 'none');\n    this.svg.appendChild(this.group);\n    this.setConfig(options);\n  }\n\n  destroy() {\n    this._clearViewSettleTimer();\n    this._cancelProgressiveRankJob();\n    this._visibleEntries.length = 0;\n    this._lastVisibleSet.clear();\n    this._pool.length = 0;\n    this._delegateSnapshot = null;\n    this._sparsePositionSnapshot = null;\n    this._sparsePositionSignature = '';\n    this._sparsePositionPending = false;\n    this._sparsePositionSnapshots?.clear?.();\n    this._sparsePositionPendingSignatures?.clear?.();\n    if (this.group) {\n      this.group.remove();\n    }\n    this.group = null;\n    this.svg = null;\n  }\n\n  requestFullReselect(reason = 'manual') {\n    this._cancelProgressiveRankJob();\n    this._needsFullReselect = true;\n    this._lastReason = reason;\n  }\n\n  getConfig() {\n    return {\n      ...this._config,\n      pinnedNodes: [...this._config.pinnedNodes],\n      fallbackSources: [...this._config.fallbackSources],\n    };\n  }\n\n  setConfig(options = {}) {\n    if (options == null) options = {};\n    const next = { ...this._config };\n    if (Object.prototype.hasOwnProperty.call(options, 'enabled')) {\n      next.enabled = options.enabled === true;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'source')) {\n      const value = options.source;\n      next.source = typeof value === 'function'\n        ? value\n        : (value == null || String(value).trim() === '' ? null : String(value).trim());\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'selectionMode')) {\n      next.selectionMode = normalizeSelectionMode(options.selectionMode, this._config.selectionMode);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'selectedOnlySpaceAware')) {\n      next.selectedOnlySpaceAware = options.selectedOnlySpaceAware === true;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'pinnedNodes')) {\n      next.pinnedNodes = normalizePinnedNodes(options.pinnedNodes);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'hoveredNodeEnabled')) {\n      next.hoveredNodeEnabled = options.hoveredNodeEnabled === true;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'hoveredNodeSource')) {\n      const value = options.hoveredNodeSource;\n      next.hoveredNodeSource = typeof value === 'function'\n        ? value\n        : (value == null || String(value).trim() === '' ? null : String(value).trim());\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'fallbackSources')) {\n      next.fallbackSources = normalizeFallbackSources(options.fallbackSources);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'maxVisible')) {\n      next.maxVisible = clampInt(options.maxVisible, 0, 5000);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'minScreenRadiusPx')) {\n      next.minScreenRadiusPx = clamp(options.minScreenRadiusPx, 0, 500);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'maxUpdateFps')) {\n      next.maxUpdateFps = clamp(options.maxUpdateFps, 1, 120);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'keepBoost')) {\n      next.keepBoost = clamp(options.keepBoost, 1, 4);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'selectedBoost')) {\n      next.selectedBoost = clamp(options.selectedBoost, 1, 8);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'hoveredBoost')) {\n      next.hoveredBoost = clamp(options.hoveredBoost, 1, 16);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'fontFamily')) {\n      const family = String(options.fontFamily ?? '').trim();\n      next.fontFamily = family || DEFAULT_CONFIG.fontFamily;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'illustratorCompatible')) {\n      next.illustratorCompatible = options.illustratorCompatible === true;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'fontSizeScale')) {\n      next.fontSizeScale = clamp(options.fontSizeScale, 0.25, 8);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'fill')) {\n      next.fill = normalizeColorString(options.fill, DEFAULT_CONFIG.fill);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'outlineColor')) {\n      next.outlineColor = normalizeColorString(options.outlineColor, DEFAULT_CONFIG.outlineColor);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'outlineWidth')) {\n      next.outlineWidth = clamp(options.outlineWidth, 0, 16);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'offsetRadiusFactor')) {\n      next.offsetRadiusFactor = clamp(options.offsetRadiusFactor, -8, 8);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'offsetPx')) {\n      next.offsetPx = clamp(options.offsetPx, -256, 256);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'maxChars')) {\n      next.maxChars = clampInt(options.maxChars, 0, 512);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'maxRows')) {\n      next.maxRows = clampInt(options.maxRows, 1, 8);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'collisionPaddingPx')) {\n      next.collisionPaddingPx = clamp(options.collisionPaddingPx, 0, 32);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'collisionCellPx')) {\n      next.collisionCellPx = clamp(options.collisionCellPx, 4, 128);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'delegateSnapshotMaxFps')) {\n      next.delegateSnapshotMaxFps = clamp(options.delegateSnapshotMaxFps, 1, 60);\n    }\n    this._config = next;\n    this._applyGroupStyles();\n    this.requestFullReselect('config');\n  }\n\n  update({ timestamp } = {}) {\n    if (!this.group || !this.helios) return false;\n    const now = Number.isFinite(timestamp) ? Number(timestamp) : performance.now();\n    if (!this._usesBaseLabels() && !this._usesHoveredNodeOverlay()) {\n      this._hideAll();\n      return false;\n    }\n    const renderer = this.helios.renderer ?? null;\n    const camera = renderer?.camera ?? null;\n    if (!renderer || !camera) {\n      this._hideAll();\n      return false;\n    }\n    const uniforms = camera.getUniforms?.() ?? null;\n    const viewProjection = uniforms?.viewProjection ?? null;\n    const viewport = uniforms?.viewport ?? null;\n    if (!viewProjection || !viewport) {\n      this._hideAll();\n      return false;\n    }\n\n    const hoveredNode = this._currentHoveredNode();\n    if (hoveredNode !== this._hoveredNode) {\n      this._hoveredNode = hoveredNode;\n      this.requestFullReselect('hover');\n    }\n\n    const viewSignature = composeViewSignature(uniforms);\n    const dataSignature = this._composeDataSignature();\n    const viewChanged = viewSignature !== this._viewSignature;\n    const dataChanged = dataSignature !== this._dataSignature;\n    if (this._progressiveRankJob && (viewChanged || dataChanged || this._needsFullReselect)) {\n      this._cancelProgressiveRankJob();\n    }\n    const network = this._getRenderNetwork();\n    const useAdaptiveViewUpdates = this._shouldUseAdaptiveViewUpdates(network, viewChanged, dataChanged);\n    const fullIntervalMs = this._resolveFullUpdateIntervalMs(useAdaptiveViewUpdates);\n    const canRunPeriodicFull = (now - this._lastFullUpdateAt) >= fullIntervalMs;\n    const runFull = this._needsFullReselect || dataChanged || (viewChanged && canRunPeriodicFull);\n\n    let changed = false;\n    if (runFull) {\n      this._clearViewSettleTimer();\n      changed = this._runFullUpdate(uniforms, now) || changed;\n      this._lastFullUpdateAt = now;\n      this._needsFullReselect = false;\n    } else if (viewChanged) {\n      changed = this._reprojectVisible(uniforms, now) || changed;\n      if (useAdaptiveViewUpdates) this._scheduleViewSettleFullReselect();\n    }\n\n    this._viewSignature = viewSignature;\n    this._dataSignature = dataSignature;\n    return changed;\n  }\n\n  _resolveFullUpdateIntervalMs(useAdaptiveViewUpdates = false) {\n    const maxUpdateFps = Math.max(1, this._config.maxUpdateFps);\n    const fps = useAdaptiveViewUpdates\n      ? Math.min(maxUpdateFps, LARGE_GRAPH_LABEL_INTERACTION_FULL_FPS)\n      : maxUpdateFps;\n    return 1000 / Math.max(1, fps);\n  }\n\n  _shouldUseAdaptiveViewUpdates(network, viewChanged, dataChanged) {\n    if (!viewChanged || dataChanged || this._needsFullReselect) return false;\n    if (!this._visibleEntries.length) return false;\n    if (!this._usesBaseLabels()) return false;\n    return this._isLargeGraphLabelRanking(network);\n  }\n\n  _isLargeGraphLabelRanking(network) {\n    if (this._usesSelectedOnlySelectionMode() && this._hasSparseSelectedNodeSource()) return false;\n    const nodeCount = toFinite(network?.nodeCount, 0);\n    const rankedCount = toFinite(this._lastRankedCandidateCount, 0);\n    return Math.max(nodeCount, rankedCount) >= LARGE_GRAPH_LABEL_RANK_NODE_THRESHOLD;\n  }\n\n  _scheduleViewSettleFullReselect() {\n    if (!this.helios?.scheduler?.requestRender) return;\n    this._clearViewSettleTimer();\n    this._viewSettleTimer = setTimeout(() => {\n      this._viewSettleTimer = null;\n      if (!this.group || !this.helios) return;\n      this.requestFullReselect('view-settle');\n      this.helios?.scheduler?.requestRender?.();\n    }, LARGE_GRAPH_LABEL_VIEW_SETTLE_MS);\n    this._viewSettleTimer?.unref?.();\n  }\n\n  _clearViewSettleTimer() {\n    if (this._viewSettleTimer != null) {\n      clearTimeout(this._viewSettleTimer);\n      this._viewSettleTimer = null;\n    }\n  }\n\n  _cancelProgressiveRankJob() {\n    if (this._progressiveRankTimer != null) {\n      clearTimeout(this._progressiveRankTimer);\n      this._progressiveRankTimer = null;\n    }\n    if (this._progressiveRankJob) {\n      this._progressiveRankJob.cancelled = true;\n      this._progressiveRankJob = null;\n    }\n  }\n\n  createSnapshot(options = {}) {\n    if (!this.helios || typeof document === 'undefined') return null;\n    const renderer = this.helios.renderer ?? null;\n    const camera = renderer?.camera ?? null;\n    const uniforms = options.uniforms ?? camera?.getUniforms?.() ?? null;\n    if (!renderer || !camera || !uniforms?.viewProjection || !uniforms?.viewport) return null;\n\n    const previousConfig = this._config;\n    if (options.config && typeof options.config === 'object') {\n      this._config = { ...this._config, ...options.config };\n    }\n\n    try {\n      if (!this._usesBaseLabels() && !this._usesHoveredNodeOverlay()) return null;\n      const now = Number.isFinite(options.timestamp) ? Number(options.timestamp) : performance.now();\n      const network = this._getRenderNetwork();\n      if (!network) return null;\n      const run = () => this._runFullUpdateUnsafe(uniforms, now, { render: false, progressive: false });\n      if (typeof network.withBufferAccess === 'function') {\n        try {\n          network.withBufferAccess(run, { nodeIndices: this._needsNodeIndicesForFullUpdate() });\n        } catch (error) {\n          warnOnce(\n            this,\n            'snapshot-buffer-access',\n            'SvgLabelController: failed to create label snapshot inside buffer access; skipping snapshot.',\n            { error },\n          );\n          return null;\n        }\n      } else {\n        run();\n      }\n      if (!this._visibleEntries.length) return null;\n      return this._buildSnapshotGroup(this._visibleEntries);\n    } finally {\n      this._config = previousConfig;\n    }\n  }\n\n  _currentHoveredNode() {\n    const hover = this.helios?._picking?.hover ?? null;\n    if (hover?.kind === 'node' && Number.isInteger(hover.index) && hover.index >= 0) {\n      return hover.index;\n    }\n    return -1;\n  }\n\n  _getRenderNetwork() {\n    return this.helios?._getRenderNetwork?.() ?? this.helios?.network ?? null;\n  }\n\n  _composeDataSignature() {\n    const network = this._getRenderNetwork();\n    const source = this.helios?.positions?.() ?? { source: 'network', delegate: null };\n    const topology = this._safe(() => network?.getTopologyVersions?.()) ?? {};\n    const topoNode = toFinite(topology.node, 0);\n    const topoEdge = toFinite(topology.edge, 0);\n    const sizeVersion = this._safe(() => network?.getNodeAttributeVersion?.(NODE_SIZE_ATTRIBUTE), 0);\n    const stateVersion = this._safe(() => network?.getNodeAttributeVersion?.(NODE_STATE_ATTRIBUTE), 0);\n    const labelVersion = this._resolveLabelSourceVersion();\n    const positionVersion = source.source === 'delegate'\n      ? toFinite(source?.delegate?.version ?? 0, 0)\n      : this._safe(() => network?.getNodeAttributeVersion?.(NODE_POSITION_ATTRIBUTE), 0);\n    const nodeCount = toFinite(network?.nodeCount, 0);\n    return [\n      topoNode,\n      topoEdge,\n      nodeCount,\n      positionVersion,\n      sizeVersion,\n      stateVersion,\n      labelVersion,\n      this._hoveredNode,\n      this._config.pinnedNodes.join(','),\n    ].join('|');\n  }\n\n  _usesHoveredNodeSelectionMode() {\n    return this._config.selectionMode === 'hovered-node' && this._usesHoveredNodeOverlay() !== true;\n  }\n\n  _usesBaseLabels() {\n    if (this._config.enabled !== true) return false;\n    if (this._usesHoveredNodeSelectionMode()) return true;\n    return this._config.maxVisible > 0;\n  }\n\n  _usesSelectedOnlySelectionMode() {\n    return this._config.selectionMode === 'selected-only';\n  }\n\n  _getSelectionSelectedNodes() {\n    const selection = this.helios?.behaviors?.get?.('selection') ?? this.helios?.behavior?.selection ?? null;\n    const selectedNodes = selection?.state?.selectedNodes ?? null;\n    if (!selectedNodes || typeof selectedNodes[Symbol.iterator] !== 'function') return null;\n    return selectedNodes;\n  }\n\n  _hasSparseSelectedNodeSource() {\n    return this._getSelectionSelectedNodes() != null;\n  }\n\n  _filterSparseNodeIdsForRenderNetwork(network, ids) {\n    if (!ids.length) return ids;\n    if (typeof network?.hasNodeIndices === 'function') {\n      const visible = this._safe(() => network.hasNodeIndices(ids), null);\n      if (Array.isArray(visible) || ArrayBuffer.isView(visible)) {\n        return ids.filter((id, index) => visible[index] === true);\n      }\n    }\n    if (typeof network?.hasNodeIndex === 'function') {\n      return ids.filter((id) => this._safe(() => network.hasNodeIndex(id), false) === true);\n    }\n    return ids;\n  }\n\n  _collectSparseSelectedNodeIds(network, pinnedNodes) {\n    const selectedNodes = this._getSelectionSelectedNodes();\n    if (!selectedNodes) return null;\n    const ids = [];\n    const seen = new Set();\n    const selectedSet = new Set();\n    const add = (raw, selected = false) => {\n      const id = Number(raw);\n      if (!Number.isInteger(id) || id < 0) return;\n      if (selected) selectedSet.add(id);\n      if (seen.has(id)) return;\n      seen.add(id);\n      ids.push(id);\n    };\n    for (const id of selectedNodes) add(id, true);\n    for (const id of pinnedNodes) add(id, false);\n    return {\n      ids: this._filterSparseNodeIdsForRenderNetwork(network, ids),\n      selectedSet,\n    };\n  }\n\n  _usesHoveredNodeOverlay() {\n    return this._config.hoveredNodeEnabled === true;\n  }\n\n  _resolveLabelSourceVersion() {\n    const network = this._getRenderNetwork();\n    if (!network) return 0;\n    let sum = this._sumLabelSourceVersion(network, this._config.source);\n    if (this._usesHoveredNodeOverlay()) {\n      sum += this._sumLabelSourceVersion(network, this._config.hoveredNodeSource);\n    }\n    return sum;\n  }\n\n  _sumLabelSourceVersion(network, configuredSource) {\n    const resolved = this._resolveCandidateSourceNames(network, configuredSource);\n    let sum = 0;\n    for (let i = 0; i < resolved.length; i += 1) {\n      const name = resolved[i];\n      if (!name || name === '$id') continue;\n      sum += toFinite(this._safe(() => network.getNodeAttributeVersion?.(name), 0), 0);\n    }\n    return sum;\n  }\n\n  _runFullUpdate(uniforms, now) {\n    const network = this._getRenderNetwork();\n    const viewport = uniforms?.viewport ?? null;\n    if (!network || !viewport) {\n      this._hideAll();\n      return false;\n    }\n    const run = () => this._runFullUpdateUnsafe(uniforms, now);\n    if (typeof network.withBufferAccess === 'function') {\n      try {\n        return Boolean(network.withBufferAccess(run, { nodeIndices: this._needsNodeIndicesForFullUpdate() }));\n      } catch (error) {\n        warnOnce(\n          this,\n          'full-update-buffer-access',\n          'SvgLabelController: full label update failed inside buffer access; hiding labels until the next valid update.',\n          { error },\n        );\n        this._hideAll();\n        return false;\n      }\n    }\n    return Boolean(run());\n  }\n\n  _needsNodeIndicesForFullUpdate() {\n    if (!this._usesBaseLabels() || this._usesHoveredNodeSelectionMode()) return false;\n    return !(this._usesSelectedOnlySelectionMode() && this._hasSparseSelectedNodeSource());\n  }\n\n  _runHoveredNodeUpdate(uniforms, now, options = {}) {\n    const network = this._getRenderNetwork();\n    const viewport = uniforms?.viewport ?? null;\n    if (!network || !viewport) {\n      this._hideAll();\n      return false;\n    }\n    const run = () => this._runHoveredNodeUpdateUnsafe(uniforms, now, options);\n    if (typeof network.withBufferAccess === 'function') {\n      try {\n        return Boolean(network.withBufferAccess(run));\n      } catch (error) {\n        warnOnce(\n          this,\n          'hovered-update-buffer-access',\n          'SvgLabelController: hovered-label update failed inside buffer access.',\n          { error },\n        );\n        return false;\n      }\n    }\n    return Boolean(run());\n  }\n\n  _runHoveredNodeUpdateUnsafe(uniforms, now, options = {}) {\n    const network = this._getRenderNetwork();\n    if (!network) return false;\n    const entries = this._collectHoveredNodeEntriesUnsafe(network, uniforms, now);\n    if (!entries.length) {\n      this._hideAll();\n      return false;\n    }\n    this._visibleEntries = entries;\n    this._lastVisibleSet = new Set(entries.map((entry) => entry.id));\n    if (options.render !== false) this._renderVisible();\n    return true;\n  }\n\n  _collectHoveredNodeEntriesUnsafe(network, uniforms, now, options = {}) {\n    const entry = this._resolveHoveredNodeEntry(network, uniforms, now, options);\n    return entry ? [entry] : [];\n  }\n\n  _resolveHoveredNodeEntry(network, uniforms, now, options = {}) {\n    const hoveredNode = this._hoveredNode;\n    if (!Number.isInteger(hoveredNode) || hoveredNode < 0) return null;\n\n    const context = this.helios?._buildPositionDelegateContext?.() ?? {};\n    const positions = this._resolvePositionAccessor(context, now, [hoveredNode], { allowFullSnapshot: false });\n    const scratchPoint = [0, 0, 0];\n    const point = readPositionInto(positions, hoveredNode, scratchPoint);\n    if (!point) return null;\n    const x = point[0];\n    const y = point[1];\n    const z = point[2];\n    if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) return null;\n\n    const viewProjection = uniforms.viewProjection;\n    const width = Math.max(1, Math.floor(uniforms.viewport?.width ?? this.helios?.size?.width ?? 1));\n    const height = Math.max(1, Math.floor(uniforms.viewport?.height ?? this.helios?.size?.height ?? 1));\n    const projectionType = uniforms.projectionType ?? 'perspective';\n    const right = uniforms.right ?? [1, 0, 0];\n    const cameraMode = uniforms.mode ?? '2d';\n    const zoom = toFinite(this.helios?.renderer?.camera?.zoom, 1);\n    const semanticZoomExponent = toFinite(this.helios?.semanticZoomExponent?.(), 0);\n    const semanticScale = (cameraMode === '2d' && semanticZoomExponent > 0)\n      ? (1 / Math.pow(Math.max(zoom, 1e-3), semanticZoomExponent))\n      : 1;\n\n    const center = projectPointInto({}, viewProjection, width, height, x, y, z);\n    if (!center) return null;\n    if (projectionType !== 'orthographic' && center.w <= 1e-6) return null;\n    if (center.ndcZ < -1.05 || center.ndcZ > 1.05) return null;\n    if (center.ndcX < -1.2 || center.ndcX > 1.2 || center.ndcY < -1.2 || center.ndcY > 1.2) return null;\n\n    const nodeSizes = this._safe(() => network.getNodeAttributeBuffer(NODE_SIZE_ATTRIBUTE)?.view, null);\n    const nodeOutlines = this._safe(() => network.getNodeAttributeBuffer(NODE_OUTLINE_WIDTH_ATTRIBUTE)?.view, null);\n    const nodeSizeBase = toFinite(this.helios?.nodeSizeBase?.(), 0);\n    const nodeSizeScale = toFinite(this.helios?.nodeSizeScale?.(), 1);\n    const nodeOutlineBase = toFinite(this.helios?.nodeOutlineWidthBase?.(), 0);\n    const nodeOutlineScale = toFinite(this.helios?.nodeOutlineWidthScale?.(), 0);\n    const rawSize = toFinite(nodeSizes?.[hoveredNode], DEFAULT_NODE_SIZE);\n    const rawOutline = toFinite(nodeOutlines?.[hoveredNode], DEFAULT_NODE_OUTLINE_WIDTH);\n    const outlineWidth = Math.max(0, nodeOutlineBase + nodeOutlineScale * rawOutline);\n    const fullSize = Math.max(0, (nodeSizeBase + nodeSizeScale * rawSize) + outlineWidth) * semanticScale;\n    const worldRadius = Math.max(0, fullSize * 0.5);\n\n    const edgePoint = projectPointInto(\n      {},\n      viewProjection,\n      width,\n      height,\n      x + right[0] * worldRadius,\n      y + right[1] * worldRadius,\n      z + right[2] * worldRadius,\n    );\n    if (!edgePoint) return null;\n    const radiusPx = Math.max(0, Math.hypot(edgePoint.screenX - center.screenX, edgePoint.screenY - center.screenY));\n    const minRadiusPx = Math.max(0, this._config.minScreenRadiusPx);\n    if (radiusPx < minRadiusPx) return null;\n\n    const sourceAccessors = this._buildLabelSourceAccessors(network, options.source ?? this._config.source);\n    const text = this._resolveLabelText(sourceAccessors, hoveredNode);\n    if (!text) return null;\n    const fontSizePx = 12 * this._config.fontSizeScale;\n    const formatted = this._formatLabelText(text, fontSizePx);\n    if (!formatted) return null;\n\n    const labelX = center.screenX;\n    const labelY = this._computeLabelScreenY(center.screenY, radiusPx);\n    if (\n      labelX + formatted.widthPx * 0.5 < 0\n      || labelX - formatted.widthPx * 0.5 > width\n      || labelY + formatted.heightPx * 0.5 < 0\n      || labelY - formatted.heightPx * 0.5 > height\n    ) {\n      return null;\n    }\n\n    return {\n      id: hoveredNode,\n      text: formatted.text,\n      lines: formatted.lines,\n      x: labelX,\n      y: labelY,\n      worldRadius,\n      score: radiusPx * radiusPx,\n    };\n  }\n\n  _runFullUpdateUnsafe(uniforms, now, options = {}) {\n    const network = this._getRenderNetwork();\n    if (!network) return false;\n    let nextVisible = [];\n    if (this._usesBaseLabels()) {\n      if (this._usesHoveredNodeSelectionMode()) {\n        nextVisible = this._collectHoveredNodeEntriesUnsafe(network, uniforms, now, {\n          source: this._config.source,\n        });\n      } else {\n        const nodeIndices = this._needsNodeIndicesForFullUpdate()\n          ? this._safe(() => network.nodeIndices, null)\n          : null;\n        if (nodeIndices?.length || (this._usesSelectedOnlySelectionMode() && this._hasSparseSelectedNodeSource())) {\n          if (options.progressive !== false && this._maybeStartProgressiveRankJob(network, uniforms, now, nodeIndices)) {\n            return false;\n          }\n          nextVisible = this._collectRankedEntriesUnsafe(network, uniforms, now, nodeIndices);\n        }\n      }\n    }\n    if (this._usesHoveredNodeOverlay()) {\n      nextVisible = this._mergeVisibleEntries(\n        nextVisible,\n        this._collectHoveredNodeEntriesUnsafe(network, uniforms, now, {\n          source: this._config.hoveredNodeSource,\n        }),\n      );\n    }\n    if (!nextVisible.length) {\n      if (this._visibleEntries.length && this._hasPendingPositionReadback()) {\n        if (options.render !== false) this._renderVisible();\n        return false;\n      }\n      this._hideAll();\n      return false;\n    }\n    this._visibleEntries = nextVisible;\n    this._lastVisibleSet = new Set(nextVisible.map((entry) => entry.id));\n    if (options.render !== false) this._renderVisible();\n    return true;\n  }\n\n  _hasPendingPositionReadback() {\n    return this._delegateSnapshotPending === true || this._sparsePositionPending === true;\n  }\n\n  _maybeStartProgressiveRankJob(network, uniforms, now, nodeIndices) {\n    if (!this._shouldUseProgressiveRankJob(network, nodeIndices)) return false;\n    const count = Number(nodeIndices?.length ?? 0);\n    const viewProjection = uniforms?.viewProjection ?? null;\n    if (!viewProjection || count <= 0) return false;\n\n    this._cancelProgressiveRankJob();\n    const width = Math.max(1, Math.floor(uniforms.viewport?.width ?? this.helios?.size?.width ?? 1));\n    const height = Math.max(1, Math.floor(uniforms.viewport?.height ?? this.helios?.size?.height ?? 1));\n    const cameraMode = uniforms.mode ?? '2d';\n    const zoom = toFinite(this.helios?.renderer?.camera?.zoom, 1);\n    const semanticZoomExponent = toFinite(this.helios?.semanticZoomExponent?.(), 0);\n    const serial = this._progressiveRankSerial + 1;\n    this._progressiveRankSerial = serial;\n    this._lastRankedCandidateCount = count;\n    this._progressiveRankJob = {\n      serial,\n      cancelled: false,\n      cursor: 0,\n      count,\n      viewSignature: composeViewSignature(uniforms),\n      dataSignature: this._composeDataSignature(),\n      viewProjection: Float32Array.from(viewProjection),\n      width,\n      height,\n      cameraMode,\n      projectionType: uniforms.projectionType ?? 'perspective',\n      right: Array.from(uniforms.right ?? [1, 0, 0]),\n      semanticScale: (cameraMode === '2d' && semanticZoomExponent > 0)\n        ? (1 / Math.pow(Math.max(zoom, 1e-3), semanticZoomExponent))\n        : 1,\n      nodeSizeBase: toFinite(this.helios?.nodeSizeBase?.(), 0),\n      nodeSizeScale: toFinite(this.helios?.nodeSizeScale?.(), 1),\n      nodeOutlineBase: toFinite(this.helios?.nodeOutlineWidthBase?.(), 0),\n      nodeOutlineScale: toFinite(this.helios?.nodeOutlineWidthScale?.(), 0),\n      selectedMask: toFinite(this.helios?.constructor?.STATES?.SELECTED, 1 << 1) >>> 0,\n      hoveredNode: this._hoveredNode,\n      pinnedNodes: new Set(this._config.pinnedNodes),\n      prevVisible: new Set(this._lastVisibleSet),\n      selectedBoost: this._config.selectedBoost,\n      hoveredBoost: this._config.hoveredBoost,\n      keepBoost: this._config.keepBoost,\n      minRadiusPx: Math.max(0, this._config.minScreenRadiusPx),\n      maxVisible: this._config.maxVisible,\n      heapCap: Math.max(this._config.maxVisible * 6, this._config.maxVisible + 24),\n      heap: [],\n      mustInclude: [],\n      source: this._config.source,\n      fontSizePx: 12 * this._config.fontSizeScale,\n      collisionCellPx: Math.max(4, this._config.collisionCellPx),\n      startedAt: now,\n    };\n    this._scheduleProgressiveRankStep(this._progressiveRankJob);\n    return true;\n  }\n\n  _shouldUseProgressiveRankJob(network, nodeIndices) {\n    if (!network || !nodeIndices?.length) return false;\n    if (!this._usesBaseLabels() || this._usesHoveredNodeSelectionMode()) return false;\n    if (this._usesSelectedOnlySelectionMode()) return false;\n    const source = this.helios?.positions?.() ?? { source: 'network', delegate: null };\n    if (source.source === 'delegate') return false;\n    return nodeIndices.length >= LARGE_GRAPH_LABEL_RANK_NODE_THRESHOLD;\n  }\n\n  _scheduleProgressiveRankStep(job) {\n    if (!job || job.cancelled || this._progressiveRankJob !== job) return;\n    this._progressiveRankTimer = setTimeout(() => {\n      this._progressiveRankTimer = null;\n      this._runProgressiveRankStep(job);\n    }, 0);\n    this._progressiveRankTimer?.unref?.();\n  }\n\n  _runProgressiveRankStep(job) {\n    if (!this._isProgressiveRankJobCurrent(job)) return;\n    const network = this._getRenderNetwork();\n    if (!network) {\n      this._cancelProgressiveRankJob();\n      return;\n    }\n    const currentDataSignature = this._composeDataSignature();\n    const currentUniforms = this.helios?.renderer?.camera?.getUniforms?.() ?? null;\n    const currentViewSignature = currentUniforms ? composeViewSignature(currentUniforms) : job.viewSignature;\n    if (currentDataSignature !== job.dataSignature || currentViewSignature !== job.viewSignature) {\n      this._cancelProgressiveRankJob();\n      this.requestFullReselect('progressive-rank-stale');\n      this.helios?.scheduler?.requestRender?.();\n      return;\n    }\n\n    const run = () => {\n      const nodeIndices = this._safe(() => network.nodeIndices, null);\n      if (!nodeIndices?.length || nodeIndices.length !== job.count) {\n        job.cancelled = true;\n        return;\n      }\n      const context = this.helios?._buildPositionDelegateContext?.() ?? {};\n      const positions = this._resolvePositionAccessor(context, performance.now(), null, { allowFullSnapshot: true });\n      if (!positions) {\n        job.cancelled = true;\n        return;\n      }\n      const nodeSizes = this._safe(() => network.getNodeAttributeBuffer(NODE_SIZE_ATTRIBUTE)?.view, null);\n      const nodeOutlines = this._safe(() => network.getNodeAttributeBuffer(NODE_OUTLINE_WIDTH_ATTRIBUTE)?.view, null);\n      const nodeStates = this._safe(() => network.getNodeAttributeBuffer(NODE_STATE_ATTRIBUTE)?.view, null);\n      const start = job.cursor;\n      const end = Math.min(job.count, start + LARGE_GRAPH_LABEL_PROGRESSIVE_CHUNK_SIZE);\n      this._processProgressiveRankRange(job, nodeIndices, positions, nodeSizes, nodeOutlines, nodeStates, start, end);\n      job.cursor = end;\n    };\n\n    if (typeof network.withBufferAccess === 'function') {\n      try {\n        network.withBufferAccess(run, { nodeIndices: true });\n      } catch (error) {\n        warnOnce(\n          this,\n          'progressive-rank-buffer-access',\n          'SvgLabelController: progressive label ranking failed inside buffer access; canceling the current rank job.',\n          { error },\n        );\n        job.cancelled = true;\n      }\n    } else {\n      run();\n    }\n\n    if (this._progressiveRankJob !== job || job.serial !== this._progressiveRankSerial) return;\n    if (job.cancelled) {\n      this._cancelProgressiveRankJob();\n      this.requestFullReselect('progressive-rank-cancelled');\n      this.helios?.scheduler?.requestRender?.();\n      return;\n    }\n    if (job.cursor < job.count) {\n      this._scheduleProgressiveRankStep(job);\n      return;\n    }\n    this._finishProgressiveRankJob(job);\n  }\n\n  _isProgressiveRankJobCurrent(job) {\n    return !!job && !job.cancelled && this._progressiveRankJob === job && job.serial === this._progressiveRankSerial;\n  }\n\n  _processProgressiveRankRange(job, nodeIndices, positions, nodeSizes, nodeOutlines, nodeStates, start, end) {\n    const scratchPoint = [0, 0, 0];\n    const scratchCenter = {};\n    const scratchOffset = {};\n    const right = job.right;\n    for (let i = start; i < end; i += 1) {\n      const id = Number(nodeIndices[i]);\n      if (!Number.isInteger(id) || id < 0) continue;\n\n      const selected = maskHasSelected(nodeStates, id, job.selectedMask);\n      const pinned = job.pinnedNodes.has(id);\n      const point = readPositionInto(positions, id, scratchPoint);\n      if (!point) continue;\n      const x = point[0];\n      const y = point[1];\n      const z = point[2];\n      if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) continue;\n\n      const center = projectPointInto(scratchCenter, job.viewProjection, job.width, job.height, x, y, z);\n      if (!center) continue;\n      if (job.projectionType !== 'orthographic' && center.w <= 1e-6) continue;\n      if (center.ndcZ < -1.05 || center.ndcZ > 1.05) continue;\n      if (center.ndcX < -1.2 || center.ndcX > 1.2 || center.ndcY < -1.2 || center.ndcY > 1.2) continue;\n\n      const rawSize = toFinite(nodeSizes?.[id], DEFAULT_NODE_SIZE);\n      const rawOutline = toFinite(nodeOutlines?.[id], DEFAULT_NODE_OUTLINE_WIDTH);\n      const outlineWidth = Math.max(0, job.nodeOutlineBase + job.nodeOutlineScale * rawOutline);\n      const fullSize = Math.max(0, (job.nodeSizeBase + job.nodeSizeScale * rawSize) + outlineWidth) * job.semanticScale;\n      const worldRadius = Math.max(0, fullSize * 0.5);\n      const offset = projectPointInto(\n        scratchOffset,\n        job.viewProjection,\n        job.width,\n        job.height,\n        x + right[0] * worldRadius,\n        y + right[1] * worldRadius,\n        z + right[2] * worldRadius,\n      );\n      if (!offset) continue;\n      const radiusPx = Math.max(0, Math.hypot(offset.screenX - center.screenX, offset.screenY - center.screenY));\n      const hovered = job.hoveredNode === id;\n      if (!selected && !pinned && !hovered && radiusPx < job.minRadiusPx) continue;\n\n      let score = radiusPx * radiusPx;\n      if (selected) score *= job.selectedBoost;\n      if (hovered) score *= job.hoveredBoost;\n      if (job.prevVisible.has(id)) score *= job.keepBoost;\n      score = Math.round(score * 1000) / 1000;\n\n      const entry = {\n        id,\n        score,\n        x: center.screenX,\n        y: center.screenY,\n        radiusPx,\n        worldRadius,\n        text: null,\n        selected,\n        hovered,\n      };\n      if (selected || pinned || hovered) {\n        job.mustInclude.push(entry);\n        continue;\n      }\n      if (job.heap.length < job.heapCap) {\n        pushMinHeap(job.heap, entry);\n      } else if (\n        score > job.heap[0].score\n        || (score === job.heap[0].score && id < job.heap[0].id)\n      ) {\n        replaceHeapRoot(job.heap, entry);\n      }\n    }\n  }\n\n  _finishProgressiveRankJob(job) {\n    if (!this._isProgressiveRankJobCurrent(job)) return;\n    const network = this._getRenderNetwork();\n    if (!network) {\n      this._cancelProgressiveRankJob();\n      return;\n    }\n    const currentUniforms = this.helios?.renderer?.camera?.getUniforms?.() ?? null;\n    const currentViewSignature = currentUniforms ? composeViewSignature(currentUniforms) : job.viewSignature;\n    if (this._composeDataSignature() !== job.dataSignature || currentViewSignature !== job.viewSignature) {\n      this._cancelProgressiveRankJob();\n      this.requestFullReselect('progressive-rank-stale');\n      this.helios?.scheduler?.requestRender?.();\n      return;\n    }\n\n    job.mustInclude.sort((a, b) => (b.score - a.score) || (a.id - b.id));\n    job.heap.sort((a, b) => (b.score - a.score) || (a.id - b.id));\n    const ordered = job.mustInclude.concat(job.heap);\n    const sourceAccessors = this._buildLabelSourceAccessors(network, job.source);\n    const nextVisible = [];\n    const occupied = this._scratchCollision;\n    occupied.clear();\n\n    for (let i = 0; i < ordered.length && nextVisible.length < job.maxVisible; i += 1) {\n      const entry = ordered[i];\n      const text = this._resolveLabelText(sourceAccessors, entry.id);\n      if (!text) continue;\n      const formatted = this._formatLabelText(text, job.fontSizePx);\n      if (!formatted) continue;\n      const x = entry.x;\n      const y = this._computeLabelScreenY(entry.y, entry.radiusPx);\n      const labelW = formatted.widthPx;\n      const labelH = formatted.heightPx;\n      if (x + labelW * 0.5 < 0 || x - labelW * 0.5 > job.width || y + labelH * 0.5 < 0 || y - labelH * 0.5 > job.height) {\n        continue;\n      }\n      if (!entry.selected && !job.pinnedNodes.has(entry.id) && !entry.hovered) {\n        if (this._collides(occupied, x, y, labelW, labelH, job.collisionCellPx)) continue;\n      }\n      this._occupy(occupied, x, y, labelW, labelH, job.collisionCellPx);\n      nextVisible.push({\n        id: entry.id,\n        text: formatted.text,\n        lines: formatted.lines,\n        x,\n        y,\n        worldRadius: entry.worldRadius,\n        score: entry.score,\n      });\n    }\n\n    this._progressiveRankJob = null;\n    this._visibleEntries = nextVisible;\n    this._lastVisibleSet = new Set(nextVisible.map((entry) => entry.id));\n    this._lastFullUpdateAt = performance.now();\n    this._needsFullReselect = false;\n    if (nextVisible.length) {\n      this._renderVisible();\n    } else {\n      this._hideAll();\n    }\n  }\n\n  _collectRankedEntriesUnsafe(network, uniforms, now, nodeIndices) {\n    const context = this.helios?._buildPositionDelegateContext?.() ?? {};\n    const viewProjection = uniforms.viewProjection;\n    const width = Math.max(1, Math.floor(uniforms.viewport?.width ?? this.helios?.size?.width ?? 1));\n    const height = Math.max(1, Math.floor(uniforms.viewport?.height ?? this.helios?.size?.height ?? 1));\n    const cameraMode = uniforms.mode ?? '2d';\n    const projectionType = uniforms.projectionType ?? 'perspective';\n    const right = uniforms.right ?? [1, 0, 0];\n    const zoom = toFinite(this.helios?.renderer?.camera?.zoom, 1);\n    const semanticZoomExponent = toFinite(this.helios?.semanticZoomExponent?.(), 0);\n    const semanticScale = (cameraMode === '2d' && semanticZoomExponent > 0)\n      ? (1 / Math.pow(Math.max(zoom, 1e-3), semanticZoomExponent))\n      : 1;\n\n    const nodeSizeBase = toFinite(this.helios?.nodeSizeBase?.(), 0);\n    const nodeSizeScale = toFinite(this.helios?.nodeSizeScale?.(), 1);\n    const nodeOutlineBase = toFinite(this.helios?.nodeOutlineWidthBase?.(), 0);\n    const nodeOutlineScale = toFinite(this.helios?.nodeOutlineWidthScale?.(), 0);\n    const selectedMask = toFinite(this.helios?.constructor?.STATES?.SELECTED, 1 << 1) >>> 0;\n    const hoveredNode = this._hoveredNode;\n    const pinnedNodes = new Set(this._config.pinnedNodes);\n    const prevVisible = this._lastVisibleSet;\n    const selectedOnly = this._usesSelectedOnlySelectionMode();\n    const selectedOnlySpaceAware = selectedOnly && this._config.selectedOnlySpaceAware === true;\n    const sparseSelectedOnly = selectedOnly && this._hasSparseSelectedNodeSource();\n\n    const nodeSizes = this._safe(() => network.getNodeAttributeBuffer(NODE_SIZE_ATTRIBUTE)?.view, null);\n    const nodeOutlines = this._safe(() => network.getNodeAttributeBuffer(NODE_OUTLINE_WIDTH_ATTRIBUTE)?.view, null);\n    const nodeStates = sparseSelectedOnly ? null : this._safe(() => network.getNodeAttributeBuffer(NODE_STATE_ATTRIBUTE)?.view, null);\n    let iterationNodeIndices = nodeIndices;\n    let positions = null;\n    let sparseSelectedSet = null;\n    if (selectedOnly) {\n      const sparseSelected = this._collectSparseSelectedNodeIds(network, pinnedNodes);\n      const selectedIds = [];\n      if (sparseSelected) {\n        selectedIds.push(...sparseSelected.ids);\n        sparseSelectedSet = sparseSelected.selectedSet;\n      } else {\n        if (!nodeIndices?.length) return [];\n        for (let i = 0; i < nodeIndices.length; i += 1) {\n          const id = Number(nodeIndices[i]);\n          if (!Number.isInteger(id) || id < 0) continue;\n          if (maskHasSelected(nodeStates, id, selectedMask) || pinnedNodes.has(id)) selectedIds.push(id);\n        }\n      }\n      if (!selectedIds.length) return [];\n      iterationNodeIndices = selectedIds;\n      positions = this._resolvePositionAccessor(context, now, selectedIds, { allowFullSnapshot: false });\n    } else {\n      positions = this._resolvePositionAccessor(context, now, null, { allowFullSnapshot: true });\n    }\n    this._lastRankedCandidateCount = Number(iterationNodeIndices?.length ?? 0);\n    if (!positions) return [];\n\n    const fontSizePx = 12 * this._config.fontSizeScale;\n    const maxVisible = this._config.maxVisible;\n    const heapCap = Math.max(maxVisible * 6, maxVisible + 24);\n    const heap = [];\n    const mustInclude = [];\n    const sourceAccessors = this._buildLabelSourceAccessors(network, this._config.source);\n    const collisionCellPx = Math.max(4, this._config.collisionCellPx);\n    const minRadiusPx = Math.max(0, this._config.minScreenRadiusPx);\n    const scratchPoint = [0, 0, 0];\n    const scratchCenter = {};\n    const scratchOffset = {};\n\n    for (let i = 0; i < iterationNodeIndices.length; i += 1) {\n      const id = Number(iterationNodeIndices[i]);\n      if (!Number.isInteger(id) || id < 0) continue;\n\n      const selected = sparseSelectedSet ? sparseSelectedSet.has(id) : maskHasSelected(nodeStates, id, selectedMask);\n      const pinned = pinnedNodes.has(id);\n      if (selectedOnly && !selected && !pinned) continue;\n\n      const point = readPositionInto(positions, id, scratchPoint);\n      if (!point) continue;\n      const x = point[0];\n      const y = point[1];\n      const z = point[2];\n      if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) continue;\n\n      const center = projectPointInto(scratchCenter, viewProjection, width, height, x, y, z);\n      if (!center) continue;\n      if (projectionType !== 'orthographic' && center.w <= 1e-6) continue;\n      if (center.ndcZ < -1.05 || center.ndcZ > 1.05) continue;\n      if (center.ndcX < -1.2 || center.ndcX > 1.2 || center.ndcY < -1.2 || center.ndcY > 1.2) continue;\n\n      const rawSize = toFinite(nodeSizes?.[id], DEFAULT_NODE_SIZE);\n      const rawOutline = toFinite(nodeOutlines?.[id], DEFAULT_NODE_OUTLINE_WIDTH);\n      const outlineWidth = Math.max(0, nodeOutlineBase + nodeOutlineScale * rawOutline);\n      const fullSize = Math.max(0, (nodeSizeBase + nodeSizeScale * rawSize) + outlineWidth) * semanticScale;\n      const worldRadius = Math.max(0, fullSize * 0.5);\n\n      const offset = projectPointInto(\n        scratchOffset,\n        viewProjection,\n        width,\n        height,\n        x + right[0] * worldRadius,\n        y + right[1] * worldRadius,\n        z + right[2] * worldRadius,\n      );\n      if (!offset) continue;\n      const radiusPx = Math.max(0, Math.hypot(offset.screenX - center.screenX, offset.screenY - center.screenY));\n\n      const hovered = hoveredNode === id;\n      if (selectedOnlySpaceAware) {\n        if (radiusPx < minRadiusPx) continue;\n      } else if (!selected && !pinned && !hovered && radiusPx < minRadiusPx) {\n        continue;\n      }\n\n      let score = radiusPx * radiusPx;\n      if (selected) score *= this._config.selectedBoost;\n      if (hovered) score *= this._config.hoveredBoost;\n      if (prevVisible.has(id)) score *= this._config.keepBoost;\n      score = Math.round(score * 1000) / 1000;\n\n      const entry = {\n        id,\n        score,\n        x: center.screenX,\n        y: center.screenY,\n        radiusPx,\n        worldRadius,\n        text: null,\n        selected,\n        hovered,\n      };\n      if (((selected || pinned) && !selectedOnlySpaceAware) || (!selectedOnly && hovered)) {\n        mustInclude.push(entry);\n        continue;\n      }\n      if (heap.length < heapCap) {\n        pushMinHeap(heap, entry);\n      } else if (\n        score > heap[0].score\n        || (score === heap[0].score && id < heap[0].id)\n      ) {\n        replaceHeapRoot(heap, entry);\n      }\n    }\n\n    mustInclude.sort((a, b) => (b.score - a.score) || (a.id - b.id));\n    heap.sort((a, b) => (b.score - a.score) || (a.id - b.id));\n    const ordered = mustInclude.concat(heap);\n\n    const nextVisible = [];\n    const occupied = this._scratchCollision;\n    occupied.clear();\n    for (let i = 0; i < ordered.length && nextVisible.length < maxVisible; i += 1) {\n      const entry = ordered[i];\n      const text = this._resolveLabelText(sourceAccessors, entry.id);\n      if (!text) continue;\n      const formatted = this._formatLabelText(text, fontSizePx);\n      if (!formatted) continue;\n      const x = entry.x;\n      const y = this._computeLabelScreenY(entry.y, entry.radiusPx);\n      const labelW = formatted.widthPx;\n      const labelH = formatted.heightPx;\n      if (x + labelW * 0.5 < 0 || x - labelW * 0.5 > width || y + labelH * 0.5 < 0 || y - labelH * 0.5 > height) {\n        continue;\n      }\n      if (((entry.selected || pinnedNodes.has(entry.id)) && !selectedOnlySpaceAware) || entry.hovered) {\n        // Keep explicit selected or hovered labels unoccluded unless selected-only is using the regular space-aware strategy.\n      } else {\n        if (this._collides(occupied, x, y, labelW, labelH, collisionCellPx)) continue;\n      }\n      this._occupy(occupied, x, y, labelW, labelH, collisionCellPx);\n      nextVisible.push({\n        id: entry.id,\n        text: formatted.text,\n        lines: formatted.lines,\n        x,\n        y,\n        worldRadius: entry.worldRadius,\n        score: entry.score,\n      });\n    }\n    return nextVisible;\n  }\n\n  _mergeVisibleEntries(baseEntries, overlayEntries) {\n    if (!overlayEntries?.length) return baseEntries ?? [];\n    if (!baseEntries?.length) return [...overlayEntries];\n    const merged = [...baseEntries];\n    const indices = new Map();\n    for (let i = 0; i < merged.length; i += 1) {\n      indices.set(merged[i].id, i);\n    }\n    for (let i = 0; i < overlayEntries.length; i += 1) {\n      const entry = overlayEntries[i];\n      const existingIndex = indices.get(entry.id);\n      if (existingIndex == null) {\n        indices.set(entry.id, merged.length);\n        merged.push(entry);\n      } else {\n        merged[existingIndex] = entry;\n      }\n    }\n    return merged;\n  }\n\n  _reprojectVisible(uniforms, now) {\n    if (!this._visibleEntries.length) return false;\n    const network = this._getRenderNetwork();\n    if (!network) return false;\n    const run = () => this._reprojectVisibleUnsafe(uniforms, now);\n    if (typeof network.withBufferAccess === 'function') {\n      try {\n        return Boolean(network.withBufferAccess(run));\n      } catch (error) {\n        warnOnce(\n          this,\n          'reproject-buffer-access',\n          'SvgLabelController: label reprojection failed inside buffer access.',\n          { error },\n        );\n        return false;\n      }\n    }\n    return Boolean(run());\n  }\n\n  _reprojectVisibleUnsafe(uniforms, now) {\n    const context = this.helios?._buildPositionDelegateContext?.() ?? {};\n    const visibleIds = this._visibleEntries.map((entry) => entry.id);\n    const positions = this._resolvePositionAccessor(context, now, visibleIds, { allowFullSnapshot: false });\n    if (!positions) {\n      return false;\n    }\n    const width = Math.max(1, Math.floor(uniforms.viewport?.width ?? this.helios?.size?.width ?? 1));\n    const height = Math.max(1, Math.floor(uniforms.viewport?.height ?? this.helios?.size?.height ?? 1));\n    const viewProjection = uniforms.viewProjection;\n    const right = uniforms.right ?? [1, 0, 0];\n    const projectionType = uniforms.projectionType ?? 'perspective';\n\n    const next = [];\n    const scratchPoint = [0, 0, 0];\n    const scratchCenter = {};\n    const scratchOffset = {};\n    for (let i = 0; i < this._visibleEntries.length; i += 1) {\n      const entry = this._visibleEntries[i];\n      const id = entry.id;\n      const point = readPositionInto(positions, id, scratchPoint);\n      if (!point) continue;\n      const x = point[0];\n      const y = point[1];\n      const z = point[2];\n      if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) continue;\n      const center = projectPointInto(scratchCenter, viewProjection, width, height, x, y, z);\n      if (!center) continue;\n      if (projectionType !== 'orthographic' && center.w <= 1e-6) continue;\n      if (center.ndcZ < -1.05 || center.ndcZ > 1.05) continue;\n      const offset = projectPointInto(\n        scratchOffset,\n        viewProjection,\n        width,\n        height,\n        x + right[0] * entry.worldRadius,\n        y + right[1] * entry.worldRadius,\n        z + right[2] * entry.worldRadius,\n      );\n      if (!offset) continue;\n      const radiusPx = Math.max(0, Math.hypot(offset.screenX - center.screenX, offset.screenY - center.screenY));\n      next.push({\n        ...entry,\n        x: center.screenX,\n        y: this._computeLabelScreenY(center.screenY, radiusPx),\n      });\n    }\n    this._visibleEntries = next;\n    this._lastVisibleSet = new Set(next.map((entry) => entry.id));\n    this._renderVisible();\n    return true;\n  }\n\n  _resolvePositionView(context, now) {\n    const source = this.helios?.positions?.() ?? { source: 'network', delegate: null };\n    const network = this._getRenderNetwork();\n    if (source.source !== 'delegate') {\n      const view = this._safe(() => network?.getNodeAttributeBuffer?.(NODE_POSITION_ATTRIBUTE)?.view, null);\n      return { source: 'network', view };\n    }\n    const delegate = source.delegate ?? null;\n    if (!delegate) return { source: 'delegate', view: null };\n    let view = null;\n    if (typeof delegate.getNodePositionView === 'function') {\n      view = this._safe(() => delegate.getNodePositionView(context), null);\n    } else if (typeof delegate.getPositionView === 'function') {\n      view = this._safe(() => delegate.getPositionView(context), null);\n    }\n    if (view && Number.isFinite(view.length) && view.length > 0) {\n      return { source: 'delegate-view', view };\n    }\n    this._scheduleDelegateSnapshot(delegate, now);\n    if (this._delegateSnapshot && Number.isFinite(this._delegateSnapshot.length) && this._delegateSnapshot.length > 0) {\n      return { source: 'delegate-snapshot', view: this._delegateSnapshot };\n    }\n    return { source: 'delegate', view: null };\n  }\n\n  _positionIdSignature(nodeIds) {\n    if (!nodeIds?.length) return '';\n    return Array.from(nodeIds, (id) => Math.max(0, Math.floor(Number(id) || 0))).join(',');\n  }\n\n  _resolvePositionAccessor(context, now, nodeIds = null, options = {}) {\n    const source = this.helios?.positions?.() ?? { source: 'network', delegate: null };\n    const network = this._getRenderNetwork();\n    if (source.source !== 'delegate') {\n      const view = this._safe(() => network?.getNodeAttributeBuffer?.(NODE_POSITION_ATTRIBUTE)?.view, null);\n      if (!view) return null;\n      return {\n        source: 'network',\n        getInto: (id, out) => {\n          const offset = id * 3;\n          if (offset + 2 >= view.length) return null;\n          out[0] = view[offset];\n          out[1] = view[offset + 1];\n          out[2] = view[offset + 2];\n          return out;\n        },\n        get(id) {\n          return this.getInto(id, [0, 0, 0]);\n        },\n      };\n    }\n\n    const delegate = source.delegate ?? null;\n    if (!delegate) return null;\n    let view = null;\n    if (typeof delegate.getNodePositionView === 'function') {\n      view = this._safe(() => delegate.getNodePositionView(context), null);\n    } else if (typeof delegate.getPositionView === 'function') {\n      view = this._safe(() => delegate.getPositionView(context), null);\n    }\n    if (view && Number.isFinite(view.length) && view.length > 0) {\n      return {\n        source: 'delegate-view',\n        getInto: (id, out) => {\n          const offset = id * 3;\n          if (offset + 2 >= view.length) return null;\n          out[0] = view[offset];\n          out[1] = view[offset + 1];\n          out[2] = view[offset + 2];\n          return out;\n        },\n        get(id) {\n          return this.getInto(id, [0, 0, 0]);\n        },\n      };\n    }\n\n    if (nodeIds?.length) {\n      const signature = this._positionIdSignature(nodeIds);\n      this._scheduleSparsePositionSnapshot(delegate, nodeIds, signature, now);\n      const snapshot = this._sparsePositionSnapshots?.get?.(signature) ?? (\n        this._sparsePositionSignature === signature ? this._sparsePositionSnapshot : null\n      );\n      if (snapshot?.positions instanceof Float32Array) {\n        const positions = snapshot.positions;\n        const offsets = snapshot.offsets;\n        return {\n          source: 'delegate-sparse',\n          getInto: (id, out) => {\n            const packedIndex = offsets.get(id);\n            if (packedIndex == null) return null;\n            const offset = packedIndex * 3;\n            if (offset + 2 >= positions.length) return null;\n            out[0] = positions[offset];\n            out[1] = positions[offset + 1];\n            out[2] = positions[offset + 2];\n            return out;\n          },\n          get(id) {\n            return this.getInto(id, [0, 0, 0]);\n          },\n        };\n      }\n      return null;\n    }\n\n    if (options.allowFullSnapshot !== false) {\n      const resolved = this._resolvePositionView(context, now);\n      const fullView = resolved?.view ?? null;\n      if (!fullView) return null;\n      return {\n        source: resolved.source,\n        getInto: (id, out) => {\n          const offset = id * 3;\n          if (offset + 2 >= fullView.length) return null;\n          out[0] = fullView[offset];\n          out[1] = fullView[offset + 1];\n          out[2] = fullView[offset + 2];\n          return out;\n        },\n        get(id) {\n          return this.getInto(id, [0, 0, 0]);\n        },\n      };\n    }\n    return null;\n  }\n\n  _scheduleSparsePositionSnapshot(delegate, nodeIds, signature, now) {\n    if (!delegate || !nodeIds?.length || !signature) return;\n    if (this._sparsePositionPendingSignatures?.has?.(signature)) return;\n    const maxFps = Math.max(1, this._config.delegateSnapshotMaxFps);\n    const minIntervalMs = 1000 / Math.max(maxFps, 12);\n    const cached = this._sparsePositionSnapshots?.get?.(signature) ?? (\n      this._sparsePositionSignature === signature ? this._sparsePositionSnapshot : null\n    );\n    if (cached && now - (cached.at ?? this._sparsePositionAt) < minIntervalMs) return;\n    if (!this.helios || typeof this.helios.snapshotNodePositions !== 'function') return;\n    const ids = Array.from(nodeIds);\n    this._sparsePositionPending = true;\n    this._sparsePositionSignature = signature;\n    this._sparsePositionPendingSignatures.add(signature);\n    Promise.resolve()\n      .then(() => this.helios.snapshotNodePositions(ids, {\n        delegate,\n        preferCached: true,\n        allowStaleVersion: true,\n        deferReadback: this.helios?._shouldDeferDelegateReadbacks?.() === true,\n      }))\n      .then((result) => {\n        const positions = result?.positions ?? null;\n        if (!(positions instanceof Float32Array)) return;\n        const offsets = new Map();\n        for (let i = 0; i < ids.length; i += 1) {\n          if (!offsets.has(ids[i])) offsets.set(ids[i], i);\n        }\n        const at = performance.now();\n        const snapshot = { positions, offsets, at };\n        this._sparsePositionSnapshot = snapshot;\n        this._sparsePositionSnapshots.set(signature, snapshot);\n        this._pruneSparsePositionSnapshots();\n        this._sparsePositionAt = performance.now();\n        this.requestFullReselect('delegate-sparse-position');\n        this.helios?.scheduler?.requestRender?.();\n      })\n      .catch((error) => {\n        warnOnce(\n          this,\n          `delegate-sparse-position:${signature}`,\n          'SvgLabelController: failed to resolve sparse delegate label positions.',\n          { error },\n        );\n      })\n      .finally(() => {\n        this._sparsePositionPendingSignatures.delete(signature);\n        this._sparsePositionPending = this._sparsePositionPendingSignatures.size > 0;\n      });\n  }\n\n  _pruneSparsePositionSnapshots() {\n    const snapshots = this._sparsePositionSnapshots;\n    if (!snapshots || snapshots.size <= 8) return;\n    const entries = Array.from(snapshots.entries())\n      .sort((a, b) => (b[1]?.at ?? 0) - (a[1]?.at ?? 0));\n    snapshots.clear();\n    for (let i = 0; i < Math.min(8, entries.length); i += 1) {\n      snapshots.set(entries[i][0], entries[i][1]);\n    }\n  }\n\n  _scheduleDelegateSnapshot(delegate, now) {\n    if (this._delegateSnapshotPending) return;\n    const maxFps = Math.max(1, this._config.delegateSnapshotMaxFps);\n    const minIntervalMs = 1000 / maxFps;\n    if (now - this._delegateSnapshotAt < minIntervalMs) return;\n    if (!this.helios || typeof this.helios.snapshotDelegatePositions !== 'function') return;\n    this._delegateSnapshotPending = true;\n    Promise.resolve()\n      .then(() => this.helios.snapshotDelegatePositions({ delegate }))\n      .then((snapshot) => {\n        if (snapshot && Number.isFinite(snapshot.length) && snapshot.length > 0) {\n          this._delegateSnapshot = snapshot;\n          this._delegateSnapshotAt = performance.now();\n          this.requestFullReselect('delegate-snapshot');\n          this.helios?.scheduler?.requestRender?.();\n        }\n      })\n      .catch((error) => {\n        warnOnce(\n          this,\n          'delegate-position-snapshot',\n          'SvgLabelController: failed to snapshot delegate label positions.',\n          { error },\n        );\n      })\n      .finally(() => {\n        this._delegateSnapshotPending = false;\n      });\n  }\n\n  _resolveCandidateSourceNames(network, configuredSource = this._config.source) {\n    const configured = typeof configuredSource === 'string' ? configuredSource.trim() : configuredSource;\n    if (typeof configured === 'string' && configured && configured.toLowerCase() !== 'auto') {\n      return [configured, '$id'];\n    }\n    const topology = this._safe(() => network.getTopologyVersions?.(), null) ?? {};\n    const key = `${toFinite(topology.node, 0)}|${toFinite(topology.edge, 0)}`;\n    if (this._fallbackNameCache.key === key) {\n      return this._fallbackNameCache.values;\n    }\n    const names = this._safe(() => network.getNodeAttributeNames?.(), []) ?? [];\n    const available = new Set(Array.isArray(names) ? names : []);\n    const lowered = new Map();\n    for (const name of available) {\n      lowered.set(String(name).toLowerCase(), name);\n    }\n    const resolved = [];\n    const fallback = this._config.fallbackSources?.length ? this._config.fallbackSources : DEFAULT_CONFIG.fallbackSources;\n    for (let i = 0; i < fallback.length; i += 1) {\n      const entry = fallback[i];\n      if (entry === '$id') {\n        resolved.push('$id');\n        continue;\n      }\n      if (available.has(entry)) {\n        resolved.push(entry);\n        continue;\n      }\n      const lower = lowered.get(String(entry).toLowerCase());\n      if (lower) resolved.push(lower);\n    }\n    if (!resolved.includes('$id')) resolved.push('$id');\n    this._fallbackNameCache = { key, values: resolved };\n    return resolved;\n  }\n\n  _buildLabelSourceAccessors(network, configured = this._config.source) {\n    if (typeof configured === 'function') {\n      return [{ key: '$fn', type: 'function', get: configured }];\n    }\n    const names = this._resolveCandidateSourceNames(network, configured);\n    const accessors = [];\n    for (let i = 0; i < names.length; i += 1) {\n      const name = names[i];\n      if (name === '$id') {\n        accessors.push({ key: '$id', type: 'id', get: (id) => String(id) });\n        continue;\n      }\n      const info = this._safe(() => network.getNodeAttributeInfo?.(name), null);\n      if (!info) continue;\n      if (info.type === AttributeType.String) {\n        accessors.push({\n          key: name,\n          type: 'string',\n          get: (id) => {\n            const value = this._safe(() => network.getNodeStringAttribute?.(name, id), null);\n            return value == null || value === '' ? null : String(value);\n          },\n        });\n        continue;\n      }\n      if (!INTEGER_LIKE_TYPES.has(info.type)) continue;\n      const buffer = this._safe(() => network.getNodeAttributeBuffer?.(name), null);\n      const view = buffer?.view ?? null;\n      if (!view) continue;\n      let categoryMap = null;\n      if (info.type === AttributeType.Category) {\n        const dict = this._safe(() => network.getNodeAttributeCategoryDictionary?.(name), null);\n        if (dict?.entries?.length) {\n          categoryMap = new Map(dict.entries.map((entry) => [Number(entry.id), String(entry.label)]));\n        }\n      }\n      accessors.push({\n        key: name,\n        type: 'integer',\n        get: (id) => {\n          const raw = view[id];\n          if (raw == null) return null;\n          if (typeof raw === 'bigint') {\n            if (raw === 0n) return null;\n            return String(raw);\n          }\n          if (!Number.isFinite(raw)) return null;\n          if (categoryMap) {\n            const mapped = categoryMap.get(Number(raw));\n            if (mapped != null) return mapped;\n          }\n          return String(Math.trunc(raw));\n        },\n      });\n    }\n    if (!accessors.length) {\n      accessors.push({ key: '$id', type: 'id', get: (id) => String(id) });\n    }\n    return accessors;\n  }\n\n  _resolveLabelText(accessors, id) {\n    const network = this._getRenderNetwork();\n    for (let i = 0; i < accessors.length; i += 1) {\n      const accessor = accessors[i];\n      let value = null;\n      try {\n        value = accessor.get(id, network);\n      } catch {\n        value = null;\n      }\n      if (value == null) continue;\n      const text = String(value).trim();\n      if (!text) continue;\n      return text;\n    }\n    return null;\n  }\n\n  _computeLabelScreenY(centerY, radiusPx) {\n    const center = Number(centerY);\n    const radius = Number(radiusPx);\n    const factor = Number(this._config.offsetRadiusFactor);\n    const offsetPx = Number(this._config.offsetPx);\n    const safeCenter = Number.isFinite(center) ? center : 0;\n    const safeRadius = Number.isFinite(radius) ? radius : 0;\n    const safeFactor = Number.isFinite(factor) ? factor : 1;\n    const safeOffsetPx = Number.isFinite(offsetPx) ? offsetPx : 0;\n    // +factor moves label above node, -factor moves below, 0 stays centered.\n    return safeCenter - (safeRadius * safeFactor) - safeOffsetPx;\n  }\n\n  _formatLabelText(value, fontSizePx) {\n    const text = String(value ?? '').trim();\n    if (!text) return null;\n    const maxChars = clampInt(this._config.maxChars, 0, 512);\n    const maxRows = clampInt(this._config.maxRows, 1, 8);\n    const lines = this._wrapLabelLines(text, { maxChars, maxRows });\n    if (!lines.length) return null;\n    const maxLineChars = lines.reduce((acc, line) => Math.max(acc, String(line ?? '').length), 0);\n    const lineHeightPx = Math.max(8, Number(fontSizePx) * 1.25);\n    return {\n      text: lines.join('\\n'),\n      lines,\n      widthPx: estimateTextWidthPx('W'.repeat(maxLineChars || 1), Number(fontSizePx)),\n      heightPx: Math.max(8, lineHeightPx * lines.length),\n    };\n  }\n\n  _wrapLabelLines(text, options = {}) {\n    const raw = String(text ?? '').trim();\n    if (!raw) return [];\n    const maxChars = clampInt(options.maxChars, 0, 512);\n    const maxRows = clampInt(options.maxRows, 1, 8);\n    if (maxRows <= 1) {\n      return [this._truncateLabelLine(raw, maxChars)];\n    }\n    if (maxChars <= 0) {\n      return [raw];\n    }\n\n    const tokens = raw.split(/\\s+/).filter(Boolean);\n    if (!tokens.length) return [];\n\n    const lines = [];\n    let index = 0;\n    let current = '';\n    let overflowed = false;\n\n    const pushCurrent = () => {\n      if (!current) return;\n      lines.push(current);\n      current = '';\n    };\n\n    while (index < tokens.length && lines.length < maxRows) {\n      let token = tokens[index];\n      if (!token) {\n        index += 1;\n        continue;\n      }\n\n      if (!current) {\n        if (token.length <= maxChars) {\n          current = token;\n          index += 1;\n          continue;\n        }\n        if (lines.length >= maxRows - 1) {\n          lines.push(this._appendEllipsis(token.slice(0, maxChars), maxChars));\n          overflowed = true;\n          current = '';\n          index = tokens.length;\n          break;\n        }\n        lines.push(token.slice(0, maxChars));\n        token = token.slice(maxChars);\n        tokens[index] = token;\n        continue;\n      }\n\n      const next = `${current} ${token}`;\n      if (next.length <= maxChars) {\n        current = next;\n        index += 1;\n      } else {\n        pushCurrent();\n      }\n    }\n\n    if (current && lines.length < maxRows) {\n      pushCurrent();\n    }\n\n    if (index < tokens.length) {\n      overflowed = true;\n    }\n\n    if (overflowed && lines.length) {\n      lines[lines.length - 1] = this._appendEllipsis(lines[lines.length - 1], maxChars);\n    }\n    return lines.slice(0, maxRows);\n  }\n\n  _truncateLabelLine(text, maxChars) {\n    const raw = String(text ?? '');\n    if (maxChars <= 0 || raw.length <= maxChars) return raw;\n    return this._appendEllipsis(raw.slice(0, maxChars), maxChars);\n  }\n\n  _appendEllipsis(text, maxChars) {\n    const raw = String(text ?? '');\n    if (!raw) return '...';\n    if (!Number.isFinite(maxChars) || maxChars <= 0) return `${raw}...`;\n    if (maxChars <= 3) return '.'.repeat(maxChars);\n    if (raw.length >= maxChars) return `${raw.slice(0, maxChars - 3)}...`;\n    return `${raw}...`;\n  }\n\n  _collides(occupied, x, y, width, height, cellSize) {\n    const pad = this._config.collisionPaddingPx;\n    const minX = Math.floor((x - width * 0.5 - pad) / cellSize);\n    const maxX = Math.floor((x + width * 0.5 + pad) / cellSize);\n    const minY = Math.floor((y - height * 0.5 - pad) / cellSize);\n    const maxY = Math.floor((y + height * 0.5 + pad) / cellSize);\n    for (let cy = minY; cy <= maxY; cy += 1) {\n      for (let cx = minX; cx <= maxX; cx += 1) {\n        if (occupied.has(`${cx},${cy}`)) return true;\n      }\n    }\n    return false;\n  }\n\n  _occupy(occupied, x, y, width, height, cellSize) {\n    const pad = this._config.collisionPaddingPx;\n    const minX = Math.floor((x - width * 0.5 - pad) / cellSize);\n    const maxX = Math.floor((x + width * 0.5 + pad) / cellSize);\n    const minY = Math.floor((y - height * 0.5 - pad) / cellSize);\n    const maxY = Math.floor((y + height * 0.5 + pad) / cellSize);\n    for (let cy = minY; cy <= maxY; cy += 1) {\n      for (let cx = minX; cx <= maxX; cx += 1) {\n        occupied.add(`${cx},${cy}`);\n      }\n    }\n  }\n\n  _renderVisible() {\n    if (!this.group) return;\n    this._applyGroupStyles(this.group);\n    const entries = this._visibleEntries;\n    while (this._pool.length < entries.length) {\n      const text = document.createElementNS(SVG_NS, 'text');\n      text.setAttribute('class', 'helios-label');\n      text.setAttribute('text-anchor', 'middle');\n      text.setAttribute('dominant-baseline', 'middle');\n      this.group.appendChild(text);\n      this._pool.push(text);\n    }\n    for (let i = 0; i < entries.length; i += 1) {\n      const entry = entries[i];\n      const node = this._pool[i];\n      node.style.display = '';\n      node.dataset.nodeId = String(entry.id);\n      node.setAttribute('x', `${entry.x}`);\n      node.setAttribute('y', `${entry.y}`);\n      this._syncTextContent(node, entry);\n    }\n    for (let i = entries.length; i < this._pool.length; i += 1) {\n      this._pool[i].style.display = 'none';\n      this._pool[i].dataset.nodeId = '';\n    }\n  }\n\n  _buildSnapshotGroup(entries) {\n    const group = document.createElementNS(SVG_NS, 'g');\n    group.setAttribute('class', 'helios-label-layer');\n    group.setAttribute('pointer-events', 'none');\n    if (this._config.illustratorCompatible === true) {\n      const outlineLayer = document.createElementNS(SVG_NS, 'g');\n      const fillLayer = document.createElementNS(SVG_NS, 'g');\n      outlineLayer.setAttribute('class', 'helios-label-layer__outline');\n      fillLayer.setAttribute('class', 'helios-label-layer__fill');\n      const fillPaint = colorStringToSvgPaint(this._config.fill, '#ffffff');\n      const outlinePaint = colorStringToSvgPaint(this._config.outlineColor, '#000000');\n      outlineLayer.setAttribute('font-family', this._config.fontFamily);\n      outlineLayer.setAttribute('font-size', `${12 * this._config.fontSizeScale}`);\n      outlineLayer.setAttribute('fill', outlinePaint.color);\n      outlineLayer.setAttribute('stroke', outlinePaint.color);\n      outlineLayer.setAttribute('stroke-width', `${this._config.outlineWidth}`);\n      outlineLayer.setAttribute('stroke-linejoin', 'round');\n      outlineLayer.setAttribute('stroke-linecap', 'round');\n      if (outlinePaint.opacity != null) {\n        outlineLayer.setAttribute('fill-opacity', `${outlinePaint.opacity}`);\n        outlineLayer.setAttribute('stroke-opacity', `${outlinePaint.opacity}`);\n      }\n      fillLayer.setAttribute('font-family', this._config.fontFamily);\n      fillLayer.setAttribute('font-size', `${12 * this._config.fontSizeScale}`);\n      fillLayer.setAttribute('fill', fillPaint.color);\n      fillLayer.setAttribute('stroke', 'none');\n      if (fillPaint.opacity != null) fillLayer.setAttribute('fill-opacity', `${fillPaint.opacity}`);\n      group.appendChild(outlineLayer);\n      group.appendChild(fillLayer);\n      for (const entry of entries) {\n        const outlineNode = document.createElementNS(SVG_NS, 'text');\n        outlineNode.setAttribute('class', 'helios-label helios-label--outline');\n        outlineNode.setAttribute('text-anchor', 'middle');\n        outlineNode.setAttribute('dominant-baseline', 'middle');\n        outlineNode.dataset.nodeId = String(entry.id);\n        outlineNode.setAttribute('x', `${entry.x}`);\n        outlineNode.setAttribute('y', `${entry.y}`);\n        this._syncTextContent(outlineNode, entry);\n        outlineLayer.appendChild(outlineNode);\n\n        const fillNode = document.createElementNS(SVG_NS, 'text');\n        fillNode.setAttribute('class', 'helios-label helios-label--fill');\n        fillNode.setAttribute('text-anchor', 'middle');\n        fillNode.setAttribute('dominant-baseline', 'middle');\n        fillNode.dataset.nodeId = String(entry.id);\n        fillNode.setAttribute('x', `${entry.x}`);\n        fillNode.setAttribute('y', `${entry.y}`);\n        this._syncTextContent(fillNode, entry);\n        fillLayer.appendChild(fillNode);\n      }\n      return group;\n    }\n    this._applyGroupStyles(group);\n    for (const entry of entries) {\n      const node = document.createElementNS(SVG_NS, 'text');\n      node.setAttribute('class', 'helios-label');\n      node.setAttribute('text-anchor', 'middle');\n      node.setAttribute('dominant-baseline', 'middle');\n      node.dataset.nodeId = String(entry.id);\n      node.setAttribute('x', `${entry.x}`);\n      node.setAttribute('y', `${entry.y}`);\n      this._syncTextContent(node, entry);\n      group.appendChild(node);\n    }\n    return group;\n  }\n\n  _hideAll() {\n    this._visibleEntries.length = 0;\n    this._lastVisibleSet.clear();\n    for (let i = 0; i < this._pool.length; i += 1) {\n      this._pool[i].style.display = 'none';\n      this._pool[i].dataset.nodeId = '';\n    }\n  }\n\n  _syncTextContent(node, entry) {\n    const lines = Array.isArray(entry?.lines) && entry.lines.length\n      ? entry.lines.map((line) => String(line ?? ''))\n      : [String(entry?.text ?? '')];\n    if (lines.length <= 1) {\n      if (node.childElementCount > 0) node.replaceChildren();\n      const nextText = lines[0] ?? '';\n      if (node.textContent !== nextText) node.textContent = nextText;\n      node.dataset.multiline = '0';\n      node.dataset.multilineSig = '';\n      return;\n    }\n\n    const signature = lines.join('\\n');\n    const x = node.getAttribute('x') ?? '0';\n    const lineHeightEm = 1.2;\n    const firstDy = -((lines.length - 1) * lineHeightEm) / 2;\n    if (\n      node.dataset.multiline === '1'\n      && node.dataset.multilineSig === signature\n      && node.childElementCount === lines.length\n    ) {\n      let idx = 0;\n      for (const child of node.children) {\n        child.setAttribute('x', x);\n        child.setAttribute('dy', `${idx === 0 ? firstDy : lineHeightEm}em`);\n        idx += 1;\n      }\n      return;\n    }\n\n    node.textContent = '';\n    for (let i = 0; i < lines.length; i += 1) {\n      const tspan = document.createElementNS(SVG_NS, 'tspan');\n      tspan.setAttribute('x', x);\n      tspan.setAttribute('dy', `${i === 0 ? firstDy : lineHeightEm}em`);\n      tspan.textContent = lines[i];\n      node.appendChild(tspan);\n    }\n    node.dataset.multiline = '1';\n    node.dataset.multilineSig = signature;\n  }\n\n  _applyGroupStyles(group = this.group) {\n    if (!group) return;\n    const fillPaint = colorStringToSvgPaint(this._config.fill, '#ffffff');\n    const outlinePaint = colorStringToSvgPaint(this._config.outlineColor, '#000000');\n    group.setAttribute('font-family', this._config.fontFamily);\n    group.setAttribute('font-size', `${12 * this._config.fontSizeScale}`);\n    group.setAttribute('fill', fillPaint.color);\n    group.setAttribute('stroke', outlinePaint.color);\n    group.setAttribute('stroke-width', `${this._config.outlineWidth}`);\n    group.setAttribute('stroke-linejoin', 'round');\n    group.setAttribute('stroke-linecap', 'round');\n    if (fillPaint.opacity != null) group.setAttribute('fill-opacity', `${fillPaint.opacity}`);\n    else group.removeAttribute('fill-opacity');\n    if (outlinePaint.opacity != null) group.setAttribute('stroke-opacity', `${outlinePaint.opacity}`);\n    else group.removeAttribute('stroke-opacity');\n    if (this._config.illustratorCompatible === true) group.removeAttribute('paint-order');\n    else group.setAttribute('paint-order', this._config.outlineWidth > 0 ? 'stroke fill' : 'fill');\n  }\n\n  _safe(fn, fallback = null) {\n    try {\n      const value = fn();\n      return value == null ? fallback : value;\n    } catch {\n      return fallback;\n    }\n  }\n}\n\nexport default SvgLabelController;\n","import { createColormapScale } from '../colors/colormaps.js';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst DEFAULT_FONT_FAMILY = 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif';\nconst ILLUSTRATOR_FONT_FAMILY = '\"Helvetica Neue\", Helvetica, Arial, sans-serif';\nconst DEFAULT_CATEGORICAL_OTHERS_LABEL = 'Other';\nconst DEFAULT_CONFIG = Object.freeze({\n  enabled: true,\n  respectDockInsets: true,\n  margin: 12,\n  gap: 12,\n  maxChars: 24,\n  maxRows: 2,\n  fontFamily: DEFAULT_FONT_FAMILY,\n  fontSize: 12,\n  scale: 1,\n  scalePreviewLegends: false,\n  illustratorCompatible: false,\n  continuousHeight: 132,\n  zoomAwareSizeIn2D: false,\n  showPanel: false,\n  panelOpacity: 0.14,\n  textOutline: true,\n  textOutlineWidth: 1.35,\n  showNodeColor: true,\n  showDensity: true,\n  showEdgeColor: true,\n  showNodeSize: false,\n  showEdgeWidth: false,\n  interactiveCategorical: true,\n  legendHoverHighlight: true,\n  legendClickSelect: true,\n  legendClickAction: 'highlight',\n  titles: Object.freeze({}),\n  placements: Object.freeze({\n    nodeColor: 'auto',\n    density: 'auto',\n    edgeColor: 'auto',\n    nodeSize: 'auto',\n    edgeWidth: 'auto',\n  }),\n});\n\nconst LEGEND_ORDER = ['nodeColor', 'edgeColor', 'nodeSize', 'edgeWidth', 'density'];\nconst LEGEND_SLOT_DEFAULTS = Object.freeze({\n  nodeColor: 'top-left',\n  edgeColor: 'top-right',\n  nodeSize: 'bottom-left',\n  edgeWidth: 'bottom-left',\n  density: 'bottom-right',\n});\nconst GUIDE_VALUES = new Set([\n  'top-left',\n  'top-right',\n  'middle-left',\n  'middle-right',\n  'bottom-left',\n  'bottom-right',\n]);\nconst NUMBER_FORMATTERS = new Map();\n\nfunction clamp(value, min, max) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return min;\n  return Math.max(min, Math.min(max, numeric));\n}\n\nfunction clampInt(value, min, max) {\n  return Math.round(clamp(value, min, max));\n}\n\nfunction toFinite(value, fallback = 0) {\n  const numeric = Number(value);\n  return Number.isFinite(numeric) ? numeric : fallback;\n}\n\nfunction normalizeInsets(insets) {\n  if (!insets || typeof insets !== 'object') {\n    return { top: 0, right: 0, bottom: 0, left: 0 };\n  }\n  return {\n    top: Math.max(0, toFinite(insets.top, 0)),\n    right: Math.max(0, toFinite(insets.right, 0)),\n    bottom: Math.max(0, toFinite(insets.bottom, 0)),\n    left: Math.max(0, toFinite(insets.left, 0)),\n  };\n}\n\nfunction normalizeLegendClickAction(value, fallback = DEFAULT_CONFIG.legendClickAction) {\n  const action = String(value ?? '').trim().toLowerCase();\n  return action === 'highlight' || action === 'select' ? action : fallback;\n}\n\nfunction rgbaArrayToCss(color, fallback = 'rgba(120, 120, 120, 1)') {\n  if (typeof color === 'string' && color.trim()) return color.trim();\n  if (!(Array.isArray(color) || ArrayBuffer.isView(color))) return fallback;\n  const r = Math.round(clamp((color[0] ?? 0) * 255, 0, 255));\n  const g = Math.round(clamp((color[1] ?? 0) * 255, 0, 255));\n  const b = Math.round(clamp((color[2] ?? 0) * 255, 0, 255));\n  const a = clamp(color[3] ?? 1, 0, 1);\n  return `rgba(${r}, ${g}, ${b}, ${a})`;\n}\n\nfunction colorStringToSvgPaint(value, fallback = '#000000') {\n  const raw = String(value ?? '').trim();\n  if (!raw) return { color: fallback, opacity: null };\n  if (raw.startsWith('#')) {\n    const hex = raw.slice(1);\n    if (hex.length === 8) {\n      return {\n        color: `#${hex.slice(0, 6)}`,\n        opacity: Number.parseInt(hex.slice(6, 8), 16) / 255,\n      };\n    }\n    if (hex.length === 4) {\n      return {\n        color: `#${hex.slice(0, 3)}`,\n        opacity: Number.parseInt(`${hex[3]}${hex[3]}`, 16) / 255,\n      };\n    }\n    return { color: raw, opacity: null };\n  }\n  const rgba = /^rgba?\\(([^)]+)\\)$/iu.exec(raw);\n  if (rgba) {\n    const parts = rgba[1].split(',').map((part) => part.trim());\n    if (parts.length >= 3) {\n      const r = clampInt(parts[0], 0, 255);\n      const g = clampInt(parts[1], 0, 255);\n      const b = clampInt(parts[2], 0, 255);\n      const a = parts.length >= 4 ? clamp(parts[3], 0, 1) : 1;\n      return {\n        color: `rgb(${r}, ${g}, ${b})`,\n        opacity: a < 1 ? a : null,\n      };\n    }\n  }\n  return { color: raw, opacity: null };\n}\n\nfunction estimateTextWidthPx(text, fontSize) {\n  return Math.max(8, String(text ?? '').length * Number(fontSize) * 0.6);\n}\n\nfunction truncateLine(text, maxChars) {\n  const raw = String(text ?? '');\n  if (maxChars <= 0 || raw.length <= maxChars) return raw;\n  if (maxChars <= 3) return '.'.repeat(maxChars);\n  return `${raw.slice(0, maxChars - 3)}...`;\n}\n\nfunction trimTrailingZeros(text) {\n  const raw = String(text ?? '');\n  if (!raw.includes('.')) return raw;\n  return raw.replace(/(\\.\\d*?[1-9])0+$/u, '$1').replace(/\\.0+$/u, '');\n}\n\nfunction sanitizeExponential(text) {\n  return String(text ?? '')\n    .replace(/(\\.\\d*?[1-9])0+e/u, '$1e')\n    .replace(/\\.0+e/u, 'e')\n    .replace(/e\\+/u, 'e');\n}\n\nfunction isNearlyInteger(value, epsilon = 1e-9) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return false;\n  return approximatelyEqual(numeric, Math.round(numeric), epsilon);\n}\n\nfunction wrapTextLines(text, maxChars = 24, maxRows = 2) {\n  const raw = String(text ?? '').trim();\n  if (!raw) return [];\n  const safeMaxChars = clampInt(maxChars, 0, 512);\n  const safeMaxRows = clampInt(maxRows, 1, 8);\n  if (safeMaxRows <= 1) return [truncateLine(raw, safeMaxChars)];\n  if (safeMaxChars <= 0) return [raw];\n\n  const tokens = raw.split(/\\s+/).filter(Boolean);\n  if (!tokens.length) return [];\n  const lines = [];\n  let current = '';\n  let index = 0;\n  let overflowed = false;\n\n  while (index < tokens.length && lines.length < safeMaxRows) {\n    const token = tokens[index];\n    if (!current) {\n      if (token.length <= safeMaxChars) {\n        current = token;\n        index += 1;\n        continue;\n      }\n      if (lines.length >= safeMaxRows - 1) {\n        lines.push(truncateLine(token, safeMaxChars));\n        overflowed = true;\n        index = tokens.length;\n        break;\n      }\n      lines.push(token.slice(0, safeMaxChars));\n      tokens[index] = token.slice(safeMaxChars);\n      continue;\n    }\n    const next = `${current} ${token}`;\n    if (next.length <= safeMaxChars) {\n      current = next;\n      index += 1;\n      continue;\n    }\n    lines.push(current);\n    current = '';\n  }\n\n  if (current && lines.length < safeMaxRows) lines.push(current);\n  if (index < tokens.length) overflowed = true;\n  if (overflowed && lines.length) {\n    lines[lines.length - 1] = truncateLine(lines[lines.length - 1], safeMaxChars);\n  }\n  return lines.slice(0, safeMaxRows);\n}\n\nfunction formatNumber(value, stepHint = null) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return '—';\n  if (Math.abs(numeric) < 1e-12) return '0';\n  const abs = Math.abs(numeric);\n  const step = Math.abs(Number(stepHint));\n  const safeStep = Number.isFinite(step) && step > 0 ? step : abs;\n  if (abs >= 1e6 || (abs > 0 && abs < 1e-4) || (safeStep > 0 && safeStep < 1e-4)) {\n    const precision = clampInt(4 - Math.floor(Math.log10(Math.max(safeStep, Number.EPSILON))), 1, 4);\n    return sanitizeExponential(numeric.toExponential(precision));\n  }\n  const decimals = safeStep >= 1\n    ? 0\n    : clampInt(Math.ceil(-Math.log10(Math.max(safeStep, Number.EPSILON))) + (safeStep < 0.1 ? 1 : 0), 0, 6);\n  const maximumFractionDigits = isNearlyInteger(safeStep) && isNearlyInteger(numeric) ? 0 : decimals;\n  let formatter = NUMBER_FORMATTERS.get(maximumFractionDigits);\n  if (!formatter) {\n    formatter = new Intl.NumberFormat('en-US', {\n      minimumFractionDigits: 0,\n      maximumFractionDigits,\n    });\n    NUMBER_FORMATTERS.set(maximumFractionDigits, formatter);\n  }\n  return formatter.format(numeric);\n}\n\nfunction stableLegendJson(value) {\n  if (value == null) return null;\n  if (Array.isArray(value)) return value.map((entry) => stableLegendJson(entry));\n  if (ArrayBuffer.isView(value)) return Array.from(value);\n  if (typeof value !== 'object') return value;\n  const output = {};\n  for (const key of Object.keys(value).sort()) {\n    const entry = value[key];\n    if (typeof entry === 'function') continue;\n    output[key] = stableLegendJson(entry);\n  }\n  return output;\n}\n\nfunction approximatelyEqual(a, b, epsilon = 1e-9) {\n  const scale = Math.max(1, Math.abs(a), Math.abs(b));\n  return Math.abs(a - b) <= (epsilon * scale);\n}\n\nfunction dedupeTicks(values) {\n  const ticks = [];\n  for (const value of values) {\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) continue;\n    if (ticks.some((entry) => approximatelyEqual(entry, numeric))) continue;\n    ticks.push(numeric);\n  }\n  return ticks.sort((a, b) => a - b);\n}\n\nfunction scheduleAfterPaint(callback) {\n  let cancelled = false;\n  let frameId = null;\n  let timerId = null;\n  const run = () => {\n    if (!cancelled) callback();\n  };\n  const scheduleTimer = () => {\n    if (cancelled) return;\n    timerId = setTimeout(run, 0);\n  };\n  if (typeof requestAnimationFrame === 'function') {\n    frameId = requestAnimationFrame(scheduleTimer);\n  } else {\n    scheduleTimer();\n  }\n  return {\n    cancel() {\n      cancelled = true;\n      if (frameId != null && typeof cancelAnimationFrame === 'function') cancelAnimationFrame(frameId);\n      if (timerId != null) clearTimeout(timerId);\n    },\n  };\n}\n\nfunction niceStep(span, count) {\n  const safeSpan = Math.abs(Number(span));\n  if (!Number.isFinite(safeSpan) || safeSpan <= 0) return 1;\n  const raw = safeSpan / Math.max(1, count);\n  const power = 10 ** Math.floor(Math.log10(raw));\n  const error = raw / power;\n  let factor = 1;\n  if (error >= 7.5) factor = 10;\n  else if (error >= 3.5) factor = 5;\n  else if (error >= 1.5) factor = 2;\n  return factor * power;\n}\n\nfunction generateNiceTicks(lo, hi, desiredCount = 4) {\n  if (!Number.isFinite(lo) || !Number.isFinite(hi)) return [0, 1];\n  if (approximatelyEqual(lo, hi)) return [lo];\n  const min = Math.min(lo, hi);\n  const max = Math.max(lo, hi);\n  const step = niceStep(max - min, desiredCount);\n  const start = Math.ceil(min / step) * step;\n  const ticks = [];\n  for (let value = start; value <= max + (step * 1e-6); value += step) {\n    const normalized = Math.abs(value) < (step * 1e-6) ? 0 : value;\n    ticks.push(Number(normalized.toPrecision(12)));\n  }\n  return ticks.length >= 2 ? dedupeTicks(ticks) : [min, max];\n}\n\nfunction continuousTickValues(domain, { divergent = false } = {}) {\n  const lo = Number(domain?.[0] ?? 0);\n  const hi = Number(domain?.[1] ?? 1);\n  if (!Number.isFinite(lo) || !Number.isFinite(hi)) return [0, 1];\n  if (approximatelyEqual(lo, hi)) return [lo];\n  if (divergent && lo < 0 && hi > 0) return dedupeTicks([lo, 0, hi]);\n  return generateNiceTicks(lo, hi, 4);\n}\n\nfunction continuousTickLabels(ticks) {\n  const safeTicks = Array.isArray(ticks) ? ticks : [];\n  if (safeTicks.length <= 1) return safeTicks.map((tick) => formatNumber(tick));\n  return safeTicks.map((tick, index) => {\n    const prev = safeTicks[index - 1];\n    const next = safeTicks[index + 1];\n    const stepHint = prev == null\n      ? Math.abs((next ?? tick) - tick)\n      : (next == null ? Math.abs(tick - prev) : Math.min(Math.abs(tick - prev), Math.abs(next - tick)));\n    return formatNumber(tick, stepHint);\n  });\n}\n\nfunction computeNodeSizeLegendPreview(range, runtime) {\n  if (!runtime || runtime.enabled !== true) return null;\n  if (runtime.mode !== '2d' || runtime.projection !== 'orthographic') return null;\n  const viewportHeight = Math.max(1, Number(runtime.viewportHeight ?? 0));\n  const zoom = Math.max(1e-6, Number(runtime.zoom ?? 1));\n  const distance = Math.max(1e-6, Number(runtime.distance ?? 1));\n  const semanticZoomExponent = Math.max(0, Number(runtime.semanticZoomExponent ?? 0));\n  const semanticScale = semanticZoomExponent > 0\n    ? (1 / Math.pow(zoom, semanticZoomExponent))\n    : 1;\n  const pixelFactor = (viewportHeight * zoom * semanticScale) / (2 * distance);\n  const base = Math.max(0, Number(runtime.nodeSizeBase ?? 0)) * pixelFactor;\n  const scale = Math.max(0, Number(runtime.nodeSizeScale ?? 1)) * pixelFactor;\n  const safeRange = Array.isArray(range) ? range : [0, 1];\n  return {\n    base,\n    scale,\n    apparentRange: safeRange.map((value) => Math.max(1, base + scale * Math.max(0, Number(value) || 0))),\n  };\n}\n\nexport function scalarSampleValues(domain, count, { omitZeroMin = false, readableMinRatio = 0 } = {}) {\n  const domainMin = Number(domain?.[0] ?? 0);\n  const domainMax = Number(domain?.[1] ?? 1);\n  if (!Number.isFinite(domainMin) || !Number.isFinite(domainMax)) return [0, 1];\n  if (approximatelyEqual(domainMin, domainMax)) return [domainMax];\n  const safeCount = clampInt(count, 1, 3);\n  let samples = safeCount >= 3\n    ? [domainMin, (domainMin + domainMax) * 0.5, domainMax]\n    : [domainMin, domainMax];\n  if (omitZeroMin && approximatelyEqual(domainMin, 0)) {\n    samples = safeCount >= 3\n      ? [(domainMin + domainMax) * 0.5, domainMax]\n      : [domainMax * 0.5, domainMax];\n  }\n  if (readableMinRatio > 0 && samples.length >= 2) {\n    const low = Number(samples[0]);\n    const high = Number(samples[samples.length - 1]);\n    if (low > 0 && high > 0 && (low / high) < readableMinRatio) {\n      samples[0] = high * 0.5;\n    }\n  }\n  return dedupeTicks(samples);\n}\n\nfunction inferLabelFromAttributes(attributes, fallback) {\n  const list = Array.isArray(attributes) ? attributes : (attributes != null ? [attributes] : []);\n  if (!list.length) return fallback;\n  const first = list.find((entry) => typeof entry === 'string' && entry.trim());\n  if (!first) return fallback;\n  return first\n    .replace(/^[@$]/, '')\n    .replace(/^nodes?\\./, '')\n    .replace(/_/g, ' ');\n}\n\nfunction hasOwn(object, key) {\n  return Object.prototype.hasOwnProperty.call(object ?? {}, key);\n}\n\nfunction normalizeLegendTitles(titles, current = {}) {\n  const next = { ...(current ?? {}) };\n  if (!titles || typeof titles !== 'object') return next;\n  for (const kind of LEGEND_ORDER) {\n    if (!hasOwn(titles, kind)) continue;\n    const raw = titles[kind];\n    if (raw === false || raw === null) {\n      next[kind] = null;\n      continue;\n    }\n    next[kind] = String(raw ?? '').trim();\n  }\n  return next;\n}\n\nfunction resolveLegendTitle(config, kind, fallbackTitle) {\n  if (!hasOwn(config?.titles, kind)) return fallbackTitle;\n  const override = config?.titles?.[kind];\n  if (override === null) return '';\n  return String(override ?? '').trim();\n}\n\nfunction primaryAttributeName(attributes) {\n  const list = Array.isArray(attributes) ? attributes : (attributes != null ? [attributes] : []);\n  const first = list.find((entry) => typeof entry === 'string' && entry.trim());\n  if (!first) return '';\n  return String(first)\n    .trim()\n    .replace(/^[@$]/, '')\n    .replace(/^node\\./, '')\n    .replace(/^edge\\./, '')\n    .replace(/^network\\./, '');\n}\n\nfunction categoricalLegendEntries(channel, network, scope) {\n  const domain = Array.isArray(channel?.domain) ? channel.domain : [];\n  const range = Array.isArray(channel?.range) ? channel.range : [];\n  if (!domain.length || !range.length) return [];\n  const attributeName = primaryAttributeName(channel?.attributes ?? channel?.from);\n  const getter = scope === 'edge'\n    ? network?.getEdgeAttributeCategoryDictionary\n    : network?.getNodeAttributeCategoryDictionary;\n  let labelsById = null;\n  let hasOthers = false;\n  if (attributeName && typeof getter === 'function') {\n    try {\n      const dictionary = getter.call(network, attributeName, { sortById: false }) ?? {};\n      const entries = Array.isArray(dictionary.entries) ? dictionary.entries : [];\n      labelsById = new Map(entries.map((entry) => [Number(entry?.id), String(entry?.label ?? '')]));\n      const visible = new Set(domain.map((value) => Number(value)));\n      hasOthers = entries.some((entry) => !visible.has(Number(entry?.id)));\n    } catch {\n      labelsById = null;\n      hasOthers = false;\n    }\n  }\n  const entries = domain.map((value, index) => {\n    const numericValue = Number(value);\n    const label = labelsById?.get(numericValue) || String(value);\n    return {\n      scope,\n      attribute: attributeName,\n      categoryValue: Number.isFinite(numericValue) ? numericValue : value,\n      label,\n      color: rgbaArrayToCss(range[index % range.length]),\n    };\n  });\n  if (channel?.defaultValue != null && hasOthers) {\n    entries.push({\n      scope,\n      attribute: attributeName,\n      categoryValue: null,\n      label: String(channel?.meta?.legendOthersLabel ?? DEFAULT_CATEGORICAL_OTHERS_LABEL),\n      color: rgbaArrayToCss(channel.defaultValue),\n    });\n  }\n  return entries;\n}\n\nfunction combineMapperChannels(collection) {\n  const out = new Map();\n  if (!collection?.mappers?.values) return out;\n  for (const mapper of collection.mappers.values()) {\n    if (!mapper?.channels?.entries) continue;\n    for (const [name, config] of mapper.channels.entries()) {\n      out.set(name, { ...config, attributes: config.attributes ?? config.from });\n    }\n  }\n  return out;\n}\n\nfunction normalizePlacementValue(value) {\n  if (value && typeof value === 'object') {\n    const x = Number(value.x);\n    const y = Number(value.y);\n    if (Number.isFinite(x) && Number.isFinite(y)) return { x, y };\n  }\n  const stringValue = typeof value === 'string' ? value.trim().toLowerCase() : '';\n  if (!stringValue || stringValue === 'auto') return 'auto';\n  if (GUIDE_VALUES.has(stringValue)) return stringValue;\n  return 'auto';\n}\n\nfunction normalizePlacements(placements) {\n  const next = {};\n  for (const kind of LEGEND_ORDER) {\n    next[kind] = normalizePlacementValue(placements?.[kind] ?? DEFAULT_CONFIG.placements[kind]);\n  }\n  return next;\n}\n\nfunction withAlpha(color, alpha) {\n  if (typeof color !== 'string') return color;\n  const rgba = /rgba?\\(([^)]+)\\)/u.exec(color);\n  if (!rgba) return color;\n  const parts = rgba[1].split(',').map((part) => part.trim());\n  if (parts.length < 3) return color;\n  return `rgba(${parts[0]}, ${parts[1]}, ${parts[2]}, ${clamp(alpha, 0, 1)})`;\n}\n\nfunction legendMetrics(config, options = {}) {\n  const maxScale = Math.max(0.6, toFinite(config?.maxScale, 3));\n  const baseScale = clamp(toFinite(config?.scale, DEFAULT_CONFIG.scale), 0.6, maxScale);\n  const scale = options.ignoreScale === true ? 1 : baseScale;\n  const fontSize = Math.max(10, toFinite(config?.fontSize, DEFAULT_CONFIG.fontSize) * scale);\n  const lineHeight = fontSize * 1.18;\n  const continuousHeight = Math.max(24, toFinite(config?.continuousHeight, DEFAULT_CONFIG.continuousHeight)) * scale;\n  return {\n    baseScale,\n    scale,\n    fontSize,\n    lineHeight,\n    paddingX: 6 * scale,\n    paddingY: 4 * scale,\n    titleGap: 5 * scale,\n    entryGap: 4 * scale,\n    swatchSize: Math.max(12, Math.round(fontSize * 0.95)),\n    swatchGap: 8 * scale,\n    barWidth: 10 * scale,\n    barHeight: continuousHeight,\n    tickLength: 10 * scale,\n    tickGap: 3 * scale,\n    labelGap: 4 * scale,\n    continuousTitleGap: 8 * scale,\n    continuousRightClearance: 36 * scale,\n    scalarWidth: 84 * scale,\n    scalarGap: 8 * scale,\n    scalarBaselineOffset: 8 * scale,\n  };\n}\n\nfunction resolveLegendStrokeScale(config, metrics = null) {\n  if (metrics?.scale != null) return Math.max(0.25, toFinite(metrics.scale, 1));\n  return Math.max(0.25, clamp(toFinite(config?.scale, DEFAULT_CONFIG.scale), 0.6, Math.max(0.6, toFinite(config?.maxScale, 3))));\n}\n\nfunction resolveTextOutlineStrokeWidth(config, fontSize) {\n  const baseFontSize = Math.max(1, toFinite(config?.fontSize, DEFAULT_CONFIG.fontSize));\n  const scale = Math.max(0.25, toFinite(fontSize, baseFontSize) / baseFontSize);\n  return Math.max(0, toFinite(config?.textOutlineWidth, DEFAULT_CONFIG.textOutlineWidth)) * 2 * scale;\n}\n\nfunction createContinuousLegendRampHref(item, n = 256) {\n  if (typeof document === 'undefined') return '';\n  const samples = Math.max(2, clampInt(n, 2, 2048));\n  const canvas = document.createElement('canvas');\n  canvas.width = 1;\n  canvas.height = samples;\n  const context = canvas.getContext('2d');\n  if (!context) return '';\n  const scale = createColormapScale(item.colormap, { domain: item.domain, clamp: true });\n  for (let i = 0; i < samples; i += 1) {\n    const t = i / Math.max(1, samples - 1);\n    const value = (item.domain?.[0] ?? 0) + (((item.domain?.[1] ?? 1) - (item.domain?.[0] ?? 0)) * t);\n    context.fillStyle = rgbaArrayToCss(scale(value));\n    context.fillRect(0, samples - 1 - i, 1, 1);\n  }\n  return canvas.toDataURL('image/png');\n}\n\nfunction setSvgPaintAttributes(element, attrName, value, fallback) {\n  const paint = colorStringToSvgPaint(value, fallback);\n  element.setAttribute(attrName, paint.color);\n  const opacityAttr = attrName === 'stroke' ? 'stroke-opacity' : 'fill-opacity';\n  if (paint.opacity != null && paint.opacity < 1) element.setAttribute(opacityAttr, `${paint.opacity}`);\n  else element.removeAttribute(opacityAttr);\n}\n\nfunction safeRectFromSize(size, insets, config) {\n  const width = Math.max(1, Math.floor(size?.width ?? 1));\n  const height = Math.max(1, Math.floor(size?.height ?? 1));\n  const useInsets = config?.respectDockInsets !== false;\n  const appliedInsets = useInsets ? normalizeInsets(insets) : { top: 0, right: 0, bottom: 0, left: 0 };\n  return {\n    x: appliedInsets.left,\n    y: appliedInsets.top,\n    width: Math.max(1, width - appliedInsets.left - appliedInsets.right),\n    height: Math.max(1, height - appliedInsets.top - appliedInsets.bottom),\n  };\n}\n\nfunction layoutAnchoredLegends(items, safeRect, config) {\n  const margin = Math.max(0, toFinite(config?.margin, DEFAULT_CONFIG.margin));\n  const gap = Math.max(0, toFinite(config?.gap, DEFAULT_CONFIG.gap));\n  const placements = normalizePlacements(config?.placements);\n  const groups = new Map();\n  const positioned = [];\n\n  for (const item of items) {\n    const placement = placements[item.kind] ?? 'auto';\n    if (placement && typeof placement === 'object') {\n      positioned.push({\n        ...item,\n        x: clamp(safeRect.x + placement.x, safeRect.x, safeRect.x + safeRect.width - item.box.width),\n        y: clamp(safeRect.y + placement.y, safeRect.y, safeRect.y + safeRect.height - item.box.height),\n      });\n      continue;\n    }\n    const slot = placement === 'auto' ? LEGEND_SLOT_DEFAULTS[item.kind] : placement;\n    if (!groups.has(slot)) groups.set(slot, []);\n    groups.get(slot).push(item);\n  }\n\n  for (const [slot, slotItems] of groups.entries()) {\n    const totalHeight = slotItems.reduce((sum, item) => sum + item.box.height, 0) + ((slotItems.length - 1) * gap);\n    let cursorY = safeRect.y + margin;\n    if (slot.startsWith('bottom')) {\n      cursorY = safeRect.y + safeRect.height - margin - totalHeight;\n    } else if (slot.startsWith('middle')) {\n      cursorY = safeRect.y + ((safeRect.height - totalHeight) * 0.5);\n    }\n    for (const item of slotItems) {\n      const itemX = slot.endsWith('right')\n        ? safeRect.x + safeRect.width - margin - item.box.width\n        : safeRect.x + margin;\n      positioned.push({\n        ...item,\n        x: clamp(itemX, safeRect.x, safeRect.x + safeRect.width - item.box.width),\n        y: clamp(cursorY, safeRect.y, safeRect.y + safeRect.height - item.box.height),\n      });\n      cursorY += item.box.height + gap;\n    }\n  }\n\n  return positioned.sort((a, b) => LEGEND_ORDER.indexOf(a.kind) - LEGEND_ORDER.indexOf(b.kind));\n}\n\nexport function deriveLegendItems({ nodeChannels, edgeChannels, densityConfig, densityRuntime, visualConfig, config, legendRuntime = null, network = null }) {\n  const items = [];\n  const edgeColorSource = visualConfig?.edge?.color?.source ?? 'edge';\n\n  const pushColorLegend = (kind, channel, fallbackTitle) => {\n    if (!channel || channel.type === 'constant' || typeof channel.scale === 'function') return;\n    if (channel.type === 'categorical') {\n      const scope = kind.startsWith('edge') ? 'edge' : 'node';\n      const entries = categoricalLegendEntries(channel, network, scope);\n      if (!entries.length) return;\n      items.push({\n        kind,\n        legendType: 'categorical',\n        title: resolveLegendTitle(config, kind, inferLabelFromAttributes(channel.attributes, fallbackTitle)),\n        entries,\n      });\n      return;\n    }\n    if (channel.type === 'colormap' || channel.colormap) {\n      const domain = Array.isArray(channel.domain) ? channel.domain : [0, 1];\n      const ticks = continuousTickValues(domain, { divergent: channel.divergent === true });\n      items.push({\n        kind,\n        legendType: 'continuous',\n        title: resolveLegendTitle(config, kind, inferLabelFromAttributes(channel.attributes, fallbackTitle)),\n        colormap: channel.colormap ?? channel.scale ?? channel.range,\n        domain,\n        divergent: channel.divergent === true,\n        ticks,\n        tickLabels: continuousTickLabels(ticks),\n      });\n    }\n  };\n\n  const pushScalarLegend = (kind, channel, fallbackTitle, shape) => {\n    if (!channel || channel.type !== 'linear' || !Array.isArray(channel.domain) || !Array.isArray(channel.range)) return;\n    const domain = [channel.domain[0] ?? 0, channel.domain[1] ?? 1];\n    const range = [channel.range[0] ?? 0, channel.range[1] ?? 1];\n    items.push({\n      kind,\n      legendType: 'scalar',\n      shape,\n      title: resolveLegendTitle(config, kind, inferLabelFromAttributes(channel.attributes, fallbackTitle)),\n      domain,\n      range,\n      preview: kind === 'nodeSize' && shape === 'circle' && config?.zoomAwareSizeIn2D === true\n        ? computeNodeSizeLegendPreview(range, legendRuntime)\n        : null,\n    });\n  };\n\n  if (config?.showNodeColor !== false) pushColorLegend('nodeColor', nodeChannels.get('color'), 'Node Color');\n  if (config?.showEdgeColor !== false && edgeColorSource !== 'node') pushColorLegend('edgeColor', edgeChannels.get('color'), 'Edge Color');\n  if (config?.showNodeSize === true) pushScalarLegend('nodeSize', nodeChannels.get('size'), 'Node Size', 'circle');\n  if (config?.showEdgeWidth === true) pushScalarLegend('edgeWidth', edgeChannels.get('width'), 'Edge Width', 'line');\n\n  if (config?.showDensity !== false && densityConfig?.enabled === true) {\n    const logRatioMode = densityConfig?.comparisonMode === 'logRatio';\n    const logRatioZScore = logRatioMode && densityConfig?.logRatioZScore === true;\n    const diverging = densityRuntime?.diverging === true || logRatioMode;\n    const baselineLabel = densityConfig.compareProperty && densityConfig.compareProperty !== 'None'\n      ? String(densityConfig.compareProperty)\n      : 'Uniform';\n    const lowLabel = diverging ? baselineLabel : '0';\n    const highLabel = diverging ? String(densityConfig.property ?? '+') : '+';\n    const densityDomain = logRatioMode\n      ? (\n        Array.isArray(densityRuntime?.valueDomain) && densityRuntime.valueDomain.length >= 2\n          ? [Number(densityRuntime.valueDomain[0]), Number(densityRuntime.valueDomain[1])]\n          : [-Math.abs(Number(densityConfig.logRatioRange ?? 3)), Math.abs(Number(densityConfig.logRatioRange ?? 3))]\n      )\n      : (diverging ? [-1, 1] : [0, 1]);\n    const ticks = logRatioMode\n      ? continuousTickValues(densityDomain, { divergent: true })\n      : (diverging ? [-1, 0, 1] : [0, 1]);\n    const tickLabels = logRatioMode\n      ? continuousTickLabels(ticks)\n      : (diverging ? [lowLabel, '0', highLabel] : ['0', highLabel]);\n    items.push({\n      kind: 'density',\n      legendType: 'continuous',\n      title: resolveLegendTitle(\n        config,\n        'density',\n        logRatioMode\n          ? (\n            logRatioZScore\n              ? `${densityConfig.property ?? 'Density'} approx z score vs ${baselineLabel}`.trim()\n              : `${densityConfig.property ?? 'Density'} log ratio vs ${baselineLabel}`.trim()\n          )\n          : diverging\n            ? `${densityConfig.property ?? 'Density'} vs ${densityConfig.compareProperty ?? ''}`.trim()\n          : String(densityConfig.property ?? 'Density'),\n      ),\n      colormap: logRatioMode\n        ? (densityConfig.logRatioColormap ?? densityConfig.divergingColormap ?? densityConfig.colormap)\n        : (diverging ? (densityConfig.divergingColormap ?? densityConfig.colormap) : densityConfig.colormap),\n      domain: densityDomain,\n      divergent: diverging,\n      ticks,\n      tickLabels,\n    });\n  }\n\n  return items;\n}\n\nexport function layoutLegendItems(items, safeRect, config) {\n  const placements = normalizePlacements(config?.placements);\n  const measured = items.map((item) => {\n    const metrics = legendMetrics(config, {\n      ignoreScale: item.legendType === 'scalar' && Boolean(item.preview) && config?.scalePreviewLegends !== true,\n    });\n    const { fontSize, lineHeight } = metrics;\n    if (item.legendType === 'categorical') {\n      const titleLines = wrapTextLines(item.title, config?.maxChars, config?.maxRows);\n      const titleWidth = Math.max(0, ...titleLines.map((line) => estimateTextWidthPx(line, fontSize)));\n      let maxLabelWidth = 0;\n      let totalEntryHeight = 0;\n      const entries = item.entries.map((entry) => {\n        const lines = wrapTextLines(entry.label, config?.maxChars, config?.maxRows);\n        const labelWidth = Math.max(0, ...lines.map((line) => estimateTextWidthPx(line, fontSize)));\n        maxLabelWidth = Math.max(maxLabelWidth, labelWidth);\n        totalEntryHeight += Math.max(metrics.swatchSize, lines.length * lineHeight);\n        return { ...entry, lines, labelWidth };\n      });\n      const width = Math.ceil(metrics.paddingX * 2 + metrics.swatchSize + metrics.swatchGap + Math.max(titleWidth, maxLabelWidth));\n      const titleHeight = titleLines.length * lineHeight;\n      const height = Math.ceil(\n        (metrics.paddingY * 2)\n        + titleHeight\n        + (entries.length && titleLines.length ? metrics.titleGap : 0)\n        + totalEntryHeight\n        + Math.max(0, entries.length - 1) * metrics.entryGap,\n      );\n      return {\n        ...item,\n        titleLines,\n        entries,\n        box: {\n          width: Math.max(84, width),\n          height: Math.max(28, height),\n        },\n      };\n    }\n    if (item.legendType === 'scalar') {\n      const titleLines = wrapTextLines(item.title, config?.maxChars, config?.maxRows);\n      const titleWidth = Math.max(0, ...titleLines.map((line) => estimateTextWidthPx(line, fontSize)));\n      const scalarSampleCount = item.shape === 'circle' ? 3 : (metrics.scalarWidth >= 116 ? 3 : 2);\n      const sampleLabels = scalarSampleValues(item.domain, scalarSampleCount, {\n        omitZeroMin: item.shape === 'line',\n        readableMinRatio: item.shape === 'line' ? 0.2 : 0,\n      }).map((sample) => formatNumber(sample));\n      const labelWidth = Math.max(\n        0,\n        ...sampleLabels.map((label) => estimateTextWidthPx(label, fontSize - 1)),\n      );\n      const visualWidth = item.shape === 'line'\n        ? Math.max(metrics.scalarWidth, labelWidth + 28)\n        : Math.max(metrics.scalarWidth + 28, labelWidth + 92);\n      const height = item.shape === 'line'\n        ? Math.ceil((metrics.paddingY * 2) + 26 + sampleLabels.length * ((fontSize - 1) + 14) + metrics.fontSize)\n        : Math.ceil((metrics.paddingY * 2) + 78 + (fontSize - 1) * 2.2);\n      return {\n        ...item,\n        titleLines,\n        box: {\n          width: Math.ceil(Math.max((metrics.paddingX * 2) + titleWidth, (metrics.paddingX * 2) + visualWidth)),\n          height: Math.max(72, height),\n        },\n      };\n    }\n    const titleLines = wrapTextLines(item.title, config?.maxChars, config?.maxRows);\n    const titleText = titleLines.join(' ').trim();\n    const titleSpan = estimateTextWidthPx(titleText, fontSize);\n    const tickLabels = Array.isArray(item.tickLabels) ? item.tickLabels : [];\n    const tickWidth = Math.max(0, ...tickLabels.map((line) => estimateTextWidthPx(line, fontSize - 1)));\n    const titleColumn = titleLines.length ? fontSize + metrics.continuousTitleGap : 0;\n    const placement = placements[item.kind] ?? 'auto';\n    const slot = placement === 'auto' ? LEGEND_SLOT_DEFAULTS[item.kind] : placement;\n    const rightClearance = typeof slot === 'string' && slot.endsWith('right')\n      ? metrics.continuousRightClearance\n      : 0;\n    const strokeOverflow = Math.ceil(Math.max(2 * metrics.scale, resolveTextOutlineStrokeWidth(config, fontSize - 1) * 0.5));\n    const width = Math.ceil(\n      metrics.paddingX * 2\n      + titleColumn\n      + strokeOverflow\n      + metrics.barWidth\n      + metrics.tickGap\n      + metrics.tickLength\n      + metrics.labelGap\n      + tickWidth\n      + strokeOverflow\n      + rightClearance,\n    );\n    const height = Math.ceil((metrics.paddingY * 2) + Math.max(metrics.barHeight, titleSpan));\n    return {\n      ...item,\n      titleLines,\n      box: {\n        width: Math.max(88, width),\n        height: Math.max(108, height),\n      },\n    };\n  });\n  return layoutAnchoredLegends(measured, safeRect, config);\n}\n\nexport class SvgLegendController {\n  constructor(helios, options = {}) {\n    this.helios = helios ?? null;\n    this._config = {\n      ...DEFAULT_CONFIG,\n      placements: normalizePlacements(DEFAULT_CONFIG.placements),\n    };\n    this._lastSignature = '';\n    this._lastUpdateInputSignature = '';\n    this._activeLegendHover = null;\n    this._pendingLegendHover = null;\n    this._pendingLegendHoverClear = null;\n    this._legendClickHighlightEntries = new Map();\n\n    const svg = this.helios?.layers?.svg ?? null;\n    if (!svg || typeof document === 'undefined') {\n      this.svg = null;\n      this.group = null;\n      this.defs = null;\n      return;\n    }\n    this.svg = svg;\n    this.group = document.createElementNS(SVG_NS, 'g');\n    this.group.setAttribute('class', 'helios-legends-layer');\n    this.group.setAttribute('pointer-events', 'none');\n    this.defs = document.createElementNS(SVG_NS, 'defs');\n    this.group.appendChild(this.defs);\n    this.svg.appendChild(this.group);\n    this.setConfig(options);\n  }\n\n  destroy() {\n    this._cancelPendingLegendHover();\n    this._cancelPendingLegendHoverClear();\n    this._clearLegendClickHighlights();\n    this.group?.remove?.();\n    this.group = null;\n    this.defs = null;\n    this.svg = null;\n  }\n\n  getConfig() {\n    return {\n      ...this._config,\n      titles: { ...(this._config.titles ?? {}) },\n      placements: { ...this._config.placements },\n    };\n  }\n\n  setConfig(options = {}) {\n    const previousClickAction = this._config.legendClickAction;\n    const next = {\n      ...this._config,\n      titles: { ...(this._config.titles ?? {}) },\n      placements: { ...this._config.placements },\n    };\n    if (Object.prototype.hasOwnProperty.call(options, 'enabled')) next.enabled = options.enabled === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'respectDockInsets')) next.respectDockInsets = options.respectDockInsets !== false;\n    if (Object.prototype.hasOwnProperty.call(options, 'margin')) next.margin = clamp(options.margin, 0, 128);\n    if (Object.prototype.hasOwnProperty.call(options, 'gap')) next.gap = clamp(options.gap, 0, 64);\n    if (Object.prototype.hasOwnProperty.call(options, 'maxChars')) next.maxChars = clampInt(options.maxChars, 0, 512);\n    if (Object.prototype.hasOwnProperty.call(options, 'maxRows')) next.maxRows = clampInt(options.maxRows, 1, 8);\n    if (Object.prototype.hasOwnProperty.call(options, 'fontFamily')) {\n      const family = String(options.fontFamily ?? '').trim();\n      next.fontFamily = family || DEFAULT_FONT_FAMILY;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'fontSize')) next.fontSize = clamp(options.fontSize, 10, 32);\n    if (Object.prototype.hasOwnProperty.call(options, 'scale')) next.scale = clamp(options.scale, 0.6, 3);\n    if (Object.prototype.hasOwnProperty.call(options, 'illustratorCompatible')) next.illustratorCompatible = options.illustratorCompatible === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'continuousHeight')) next.continuousHeight = clamp(options.continuousHeight, 72, 320);\n    if (Object.prototype.hasOwnProperty.call(options, 'zoomAwareSizeIn2D')) next.zoomAwareSizeIn2D = options.zoomAwareSizeIn2D === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'showPanel')) next.showPanel = options.showPanel === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'panelOpacity')) next.panelOpacity = clamp(options.panelOpacity, 0, 1);\n    if (Object.prototype.hasOwnProperty.call(options, 'textOutline')) next.textOutline = options.textOutline !== false;\n    if (Object.prototype.hasOwnProperty.call(options, 'textOutlineWidth')) next.textOutlineWidth = clamp(options.textOutlineWidth, 0, 4);\n    if (Object.prototype.hasOwnProperty.call(options, 'showNodeColor')) next.showNodeColor = options.showNodeColor !== false;\n    if (Object.prototype.hasOwnProperty.call(options, 'showDensity')) next.showDensity = options.showDensity !== false;\n    if (Object.prototype.hasOwnProperty.call(options, 'showEdgeColor')) next.showEdgeColor = options.showEdgeColor !== false;\n    if (Object.prototype.hasOwnProperty.call(options, 'showNodeSize')) next.showNodeSize = options.showNodeSize === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'showEdgeWidth')) next.showEdgeWidth = options.showEdgeWidth === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'interactiveCategorical')) next.interactiveCategorical = options.interactiveCategorical !== false;\n    if (Object.prototype.hasOwnProperty.call(options, 'legendHoverHighlight')) next.legendHoverHighlight = options.legendHoverHighlight !== false;\n    if (Object.prototype.hasOwnProperty.call(options, 'legendClickSelect')) next.legendClickSelect = options.legendClickSelect !== false;\n    if (Object.prototype.hasOwnProperty.call(options, 'legendClickAction')) {\n      next.legendClickAction = normalizeLegendClickAction(options.legendClickAction, next.legendClickAction);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'titles')) {\n      next.titles = normalizeLegendTitles(options.titles, next.titles);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'placements')) {\n      next.placements = normalizePlacements({ ...next.placements, ...options.placements });\n    }\n    this._config = next;\n    this._lastUpdateInputSignature = '';\n    if (\n      previousClickAction === 'highlight'\n      && (next.legendClickAction !== 'highlight' || next.legendClickSelect === false || next.interactiveCategorical === false)\n    ) {\n      this._clearLegendClickHighlights();\n    }\n  }\n\n  _resolveConfig(options = {}) {\n    return {\n      ...this._config,\n      ...(options.config ?? {}),\n      placements: normalizePlacements({\n        ...this._config.placements,\n        ...(options.config?.placements ?? {}),\n      }),\n      titles: {\n        ...(this._config.titles ?? {}),\n        ...(options.config?.titles ?? {}),\n      },\n    };\n  }\n\n  _networkSignature(network) {\n    if (!network) return null;\n    return {\n      nodeCount: Number(network.nodeCount ?? network.nodesCount ?? network.numNodes ?? 0),\n      edgeCount: Number(network.edgeCount ?? network.edgesCount ?? network.numEdges ?? 0),\n      visualConfig: stableLegendJson(network.__heliosVisualConfig ?? null),\n    };\n  }\n\n  _densitySignature() {\n    const helios = this.helios ?? null;\n    return {\n      config: stableLegendJson(helios?._densityConfig ?? null),\n      runtime: stableLegendJson(helios?._densityRuntime ?? null),\n    };\n  }\n\n  _updateInputSignature(config, size, safeRect, options = {}) {\n    const helios = this.helios ?? null;\n    const includeRuntimeCamera = config?.zoomAwareSizeIn2D === true;\n    return JSON.stringify({\n      size: {\n        width: Number(size?.width ?? 1),\n        height: Number(size?.height ?? 1),\n      },\n      safeRect,\n      background: helios?.background?.() ?? null,\n      config: stableLegendJson(config),\n      mapperVersion: helios?._legendContentVersion ?? 0,\n      density: this._densitySignature(),\n      network: this._networkSignature(helios?.network),\n      runtime: includeRuntimeCamera ? this._createLegendRuntime(config, { ...options, size }) : null,\n      interaction: {\n        hover: this._activeLegendHover\n          ? this._categoryEntryKey(this._activeLegendHover.item, this._activeLegendHover.entry)\n          : '',\n        highlights: Array.from(this._legendClickHighlightEntries?.keys?.() ?? []).sort(),\n      },\n    });\n  }\n\n  _createLegendRuntime(config, options = {}) {\n    const size = options.size ?? this.helios?.size ?? this.helios?.layers?.size ?? { width: 1, height: 1 };\n    return {\n      enabled: config.zoomAwareSizeIn2D === true,\n      mode: typeof this.helios?.mode === 'function' ? this.helios.mode() : this.helios?.options?.mode,\n      projection: options.projection ?? this.helios?.renderer?.camera?.projection ?? null,\n      zoom: options.zoom ?? this.helios?.renderer?.camera?.zoom ?? 1,\n      distance: options.distance ?? this.helios?.renderer?.camera?.distance ?? 1,\n      viewportHeight: options.viewportHeight ?? size?.height ?? 1,\n      nodeSizeBase: typeof this.helios?.nodeSizeBase === 'function' ? this.helios.nodeSizeBase() : 0,\n      nodeSizeScale: typeof this.helios?.nodeSizeScale === 'function' ? this.helios.nodeSizeScale() : 1,\n      semanticZoomExponent: typeof this.helios?.semanticZoomExponent === 'function' ? this.helios.semanticZoomExponent() : 0,\n    };\n  }\n\n  deriveItems(options = {}) {\n    if (!this.helios) return [];\n    const config = this._resolveConfig(options);\n    return deriveLegendItems({\n      nodeChannels: combineMapperChannels(this.helios.nodeMapper),\n      edgeChannels: combineMapperChannels(this.helios.edgeMapper),\n      densityConfig: typeof this.helios.density === 'function' ? this.helios.density() : null,\n      densityRuntime: this.helios._densityRuntime ?? null,\n      visualConfig: this.helios.network?.__heliosVisualConfig ?? null,\n      network: this.helios.network ?? null,\n      config,\n      legendRuntime: this._createLegendRuntime(config, options),\n    });\n  }\n\n  update() {\n    if (!this.group || !this.helios) return false;\n    if (this._config.enabled !== true) {\n      this._lastUpdateInputSignature = '';\n      this._clear();\n      return false;\n    }\n    const size = this.helios.size ?? this.helios.layers?.size ?? { width: 1, height: 1 };\n    const safeRect = safeRectFromSize(\n      size,\n      typeof this.helios.overlayInsets === 'function' ? this.helios.overlayInsets() : null,\n      this._config,\n    );\n    const updateInputSignature = this._updateInputSignature(this._config, size, safeRect);\n    if (updateInputSignature === this._lastUpdateInputSignature && this._lastSignature) {\n      return false;\n    }\n    const items = this.deriveItems({ size });\n    this._lastUpdateInputSignature = updateInputSignature;\n    if (!items.length) {\n      this._clearLegendClickHighlights();\n      this._clear();\n      return false;\n    }\n    this._syncLegendClickHighlights(items);\n    const positioned = layoutLegendItems(items, safeRect, this._config);\n    const signature = JSON.stringify({\n      positioned,\n      safeRect,\n      insets: typeof this.helios.overlayInsets === 'function' ? this.helios.overlayInsets() : null,\n      background: this.helios.background?.() ?? null,\n      config: this._config,\n      interaction: this._legendInteractionSignature(items),\n    });\n    if (signature === this._lastSignature) return false;\n    this._lastSignature = signature;\n    this._render(positioned);\n    return true;\n  }\n\n  createSnapshot(options = {}) {\n    if (!this.helios || typeof document === 'undefined') return null;\n    const config = this._resolveConfig(options);\n    const size = options.size ?? this.helios.size ?? this.helios.layers?.size ?? { width: 1, height: 1 };\n    const safeRect = safeRectFromSize(\n      size,\n      options.insets ?? null,\n      config,\n    );\n    const items = this.deriveItems({ ...options, config, size });\n    if (!items.length) return null;\n    const positioned = layoutLegendItems(items, safeRect, config);\n    return this._buildSnapshotGroup(positioned, config, options.background ?? this.helios.background?.());\n  }\n\n  _clear() {\n    this._cancelPendingLegendHover();\n    this._cancelPendingLegendHoverClear();\n    this._lastSignature = '';\n    this._removeLegendChildren();\n  }\n\n  _removeLegendChildren() {\n    if (!this.group) return;\n    for (const child of Array.from(this.group.children)) {\n      if (child !== this.defs) child.remove();\n    }\n    this.defs?.replaceChildren?.();\n  }\n\n  _theme() {\n    return this._resolveTheme(this.helios?.background?.(), this._config);\n  }\n\n  _resolveTheme(background = null, config = this._config) {\n    const color = Array.isArray(background) || ArrayBuffer.isView(background) ? background : [0, 0, 0, 1];\n    const luminance = (0.2126 * toFinite(color[0], 0)) + (0.7152 * toFinite(color[1], 0)) + (0.0722 * toFinite(color[2], 0));\n    if (config?.illustratorCompatible === true) {\n      if (luminance > 0.55) {\n        return {\n          panelFill: '#fcfdff',\n          panelStroke: '#141820',\n          text: '#10141c',\n          textOutline: '#ffffff',\n          barOuterStroke: '#ffffff',\n          barOuterWidth: 2.6,\n          barInnerStroke: '#10141c',\n          barInnerWidth: 1.25,\n          tickOutline: '#ffffff',\n          accentOuter: '#ffffff',\n          accentInner: '#10141c',\n          muted: '#10141c',\n          guide: '#10141c',\n        };\n      }\n      return {\n        panelFill: '#0e1218',\n        panelStroke: '#ffffff',\n        text: '#f6f8fc',\n        textOutline: '#05080c',\n        barOuterStroke: '#05080c',\n        barOuterWidth: 2.6,\n        barInnerStroke: '#ffffff',\n        barInnerWidth: 1.25,\n        tickOutline: '#05080c',\n        accentOuter: '#ffffff',\n        accentInner: '#05080c',\n        muted: '#f6f8fc',\n        guide: '#ffffff',\n      };\n    }\n    if (luminance > 0.55) {\n      return {\n        panelFill: withAlpha('rgba(252, 253, 255, 1)', config.panelOpacity),\n        panelStroke: withAlpha('rgba(20, 24, 32, 1)', Math.min(0.26, config.panelOpacity + 0.08)),\n        text: 'rgba(16, 20, 28, 0.96)',\n        textOutline: 'rgba(255, 255, 255, 0.96)',\n        barOuterStroke: 'rgba(255, 255, 255, 0.98)',\n        barOuterWidth: 2.6,\n        barInnerStroke: 'rgba(16, 20, 28, 0.96)',\n        barInnerWidth: 1.25,\n        tickOutline: 'rgba(255, 255, 255, 0.96)',\n        accentOuter: 'rgba(255, 255, 255, 0.98)',\n        accentInner: 'rgba(16, 20, 28, 0.96)',\n        muted: 'rgba(16, 20, 28, 0.74)',\n        guide: 'rgba(16, 20, 28, 0.6)',\n      };\n    }\n    return {\n      panelFill: withAlpha('rgba(14, 18, 24, 1)', config.panelOpacity),\n      panelStroke: withAlpha('rgba(255, 255, 255, 1)', Math.min(0.22, config.panelOpacity + 0.08)),\n      text: 'rgba(246, 248, 252, 0.96)',\n      textOutline: 'rgba(5, 8, 12, 0.96)',\n      barOuterStroke: 'rgba(5, 8, 12, 0.96)',\n      barOuterWidth: 2.6,\n      barInnerStroke: 'rgba(255, 255, 255, 0.98)',\n      barInnerWidth: 1.25,\n      tickOutline: 'rgba(5, 8, 12, 0.96)',\n      accentOuter: 'rgba(255, 255, 255, 0.98)',\n      accentInner: 'rgba(5, 8, 12, 0.96)',\n      muted: 'rgba(246, 248, 252, 0.8)',\n      guide: 'rgba(255, 255, 255, 0.74)',\n    };\n  }\n\n  _createTextElement({\n    x,\n    y,\n    lines,\n    fill,\n    config = this._config,\n    fontWeight = '400',\n    fontSize = config.fontSize,\n    anchor = 'start',\n    baseline = 'hanging',\n    rotation = null,\n    fontStyle = 'normal',\n  }) {\n    const text = document.createElementNS(SVG_NS, 'text');\n    text.setAttribute('x', `${x}`);\n    text.setAttribute('y', `${y}`);\n    setSvgPaintAttributes(text, 'fill', fill, '#000000');\n    text.setAttribute('font-family', config.fontFamily);\n    text.setAttribute('font-size', `${fontSize}`);\n    text.setAttribute('font-weight', fontWeight);\n    text.setAttribute('font-style', fontStyle);\n    text.setAttribute('text-anchor', anchor);\n    text.setAttribute('dominant-baseline', baseline);\n    if (rotation != null) text.setAttribute('transform', `rotate(${rotation}, ${x}, ${y})`);\n    const safeLines = Array.isArray(lines) ? lines : [String(lines ?? '')];\n    safeLines.forEach((line, index) => {\n      const tspan = document.createElementNS(SVG_NS, 'tspan');\n      tspan.setAttribute('x', `${x}`);\n      tspan.setAttribute('dy', `${index === 0 ? 0 : fontSize * 1.2}`);\n      tspan.textContent = String(line ?? '');\n      text.appendChild(tspan);\n    });\n    return text;\n  }\n\n  _appendText(group, {\n    x,\n    y,\n    lines,\n    fill,\n    outline = null,\n    config = this._config,\n    fontWeight = '400',\n    fontSize = config.fontSize,\n    anchor = 'start',\n    baseline = 'hanging',\n    rotation = null,\n    fontStyle = 'normal',\n  }) {\n    const appended = [];\n    if (config.textOutline !== false && outline) {\n      const outlineWidth = resolveTextOutlineStrokeWidth(config, fontSize);\n      const outlineText = this._createTextElement({\n        x, y, lines, fill: outline, config, fontWeight, fontSize, anchor, baseline, rotation, fontStyle,\n      });\n      setSvgPaintAttributes(outlineText, 'stroke', outline, '#000000');\n      outlineText.setAttribute('stroke-width', `${outlineWidth}`);\n      outlineText.setAttribute('stroke-linejoin', 'round');\n      if (config.illustratorCompatible !== true) outlineText.setAttribute('paint-order', 'stroke');\n      group.appendChild(outlineText);\n      appended.push(outlineText);\n    }\n    const text = this._createTextElement({\n      x, y, lines, fill, config, fontWeight, fontSize, anchor, baseline, rotation, fontStyle,\n    });\n    group.appendChild(text);\n    appended.push(text);\n    return appended;\n  }\n\n  _render(positioned) {\n    this._removeLegendChildren();\n    if (!this.group) return;\n    this._renderInto(this.group, this.defs, positioned, this._config, this._theme());\n  }\n\n  _buildSnapshotGroup(positioned, config, background) {\n    const defs = document.createElementNS(SVG_NS, 'defs');\n    const group = document.createElementNS(SVG_NS, 'g');\n    group.setAttribute('class', 'helios-legends-layer');\n    group.setAttribute('pointer-events', 'none');\n    group.appendChild(defs);\n    this._renderInto(group, defs, positioned, config, this._resolveTheme(background, config));\n    return group;\n  }\n\n  _renderInto(rootGroup, defs, positioned, config, theme) {\n    for (const item of positioned) {\n      const legendGroup = document.createElementNS(SVG_NS, 'g');\n      legendGroup.setAttribute('class', 'helios-legend');\n      legendGroup.dataset.legendKind = item.kind;\n      legendGroup.setAttribute('transform', `translate(${item.x}, ${item.y})`);\n\n      if (config.showPanel === true) {\n        const panel = document.createElementNS(SVG_NS, 'rect');\n        panel.dataset.legendFrame = 'true';\n        panel.setAttribute('width', `${item.box.width}`);\n        panel.setAttribute('height', `${item.box.height}`);\n        panel.setAttribute('rx', '6');\n        panel.setAttribute('ry', '6');\n        setSvgPaintAttributes(panel, 'fill', theme.panelFill, '#ffffff');\n        setSvgPaintAttributes(panel, 'stroke', theme.panelStroke, '#000000');\n        legendGroup.appendChild(panel);\n      }\n\n      if (item.legendType === 'categorical') this._renderCategoricalLegend(legendGroup, item, theme, config);\n      else if (item.legendType === 'scalar') this._renderScalarLegend(legendGroup, item, theme, config);\n      else this._renderContinuousLegend(legendGroup, item, theme, config, defs);\n\n      rootGroup.appendChild(legendGroup);\n    }\n  }\n\n  _renderCategoricalLegend(group, item, theme, config = this._config) {\n    const metrics = legendMetrics(config);\n    if (item.titleLines.length) {\n      this._appendText(group, {\n        x: metrics.paddingX,\n        y: metrics.paddingY,\n        lines: item.titleLines,\n        config,\n        fill: theme.text,\n        outline: theme.textOutline,\n        fontWeight: '600',\n        fontSize: metrics.fontSize,\n      });\n    }\n    let y = metrics.paddingY + (item.titleLines.length * metrics.lineHeight) + (item.entries.length ? metrics.titleGap : 0);\n    for (const entry of item.entries) {\n      const row = document.createElementNS(SVG_NS, 'g');\n      row.setAttribute('class', 'helios-legend-row');\n      const interactive = this._isInteractiveCategory(item, entry, config);\n      if (interactive) {\n        let suppressClick = false;\n        row.setAttribute('pointer-events', 'all');\n        row.setAttribute('cursor', 'pointer');\n        row.dataset.scope = entry.scope;\n        row.dataset.attribute = entry.attribute;\n        row.dataset.categoryValue = String(entry.categoryValue);\n        if (row.style) {\n          row.style.touchAction = 'manipulation';\n          row.style.webkitTapHighlightColor = 'transparent';\n        }\n        const handleEnter = () => {\n          this._setCategoryRowVisual(row, { selected: this._isCategoryRowSelected(row), hovered: true, theme });\n          this._handleCategoryEnter(item, entry);\n        };\n        const handleLeave = () => {\n          this._setCategoryRowVisual(row, { selected: this._isCategoryRowSelected(row), hovered: false, theme });\n          this._handleCategoryLeave(item, entry);\n        };\n        row.addEventListener('pointerenter', handleEnter);\n        row.addEventListener('pointerleave', handleLeave);\n        row.addEventListener('pointerover', (event) => {\n          if (event?.relatedTarget && row.contains?.(event.relatedTarget)) return;\n          handleEnter();\n        });\n        row.addEventListener('pointerout', (event) => {\n          if (event?.relatedTarget && row.contains?.(event.relatedTarget)) return;\n          handleLeave();\n        });\n        row.addEventListener('pointerup', (event) => {\n          if (event.button != null && event.button !== 0) return;\n          suppressClick = true;\n          this._handleCategoryClick(event, item, entry);\n        });\n        row.addEventListener('click', (event) => {\n          if (suppressClick) {\n            suppressClick = false;\n            event?.preventDefault?.();\n            event?.stopPropagation?.();\n            return;\n          }\n          this._handleCategoryClick(event, item, entry);\n        });\n      }\n      const rowHeight = Math.max(metrics.swatchSize, entry.lines.length * metrics.lineHeight);\n      if (interactive) {\n        const hit = document.createElementNS(SVG_NS, 'rect');\n        const rowWidth = metrics.swatchSize + metrics.swatchGap + Math.max(0, entry.labelWidth ?? 0);\n        hit.setAttribute('x', `${metrics.paddingX - 3}`);\n        hit.setAttribute('y', `${y - 2}`);\n        hit.setAttribute('width', `${Math.max(metrics.swatchSize + 6, rowWidth + 6)}`);\n        hit.setAttribute('height', `${rowHeight + 4}`);\n        hit.setAttribute('rx', '4');\n        hit.setAttribute('ry', '4');\n        hit.setAttribute('fill', 'transparent');\n        hit.setAttribute('stroke-width', '1.5');\n        hit.setAttribute('stroke', 'transparent');\n        hit.setAttribute('stroke-opacity', '0');\n        hit.setAttribute('vector-effect', 'non-scaling-stroke');\n        row.__heliosLegendRowOutline = hit;\n        row.appendChild(hit);\n      }\n      const singleLine = entry.lines.length === 1;\n      const firstLineCenterY = y + (metrics.fontSize * 0.68);\n      const rowCenterY = y + (rowHeight * 0.5);\n      const swatchY = singleLine\n        ? rowCenterY - (metrics.swatchSize * 0.5)\n        : firstLineCenterY - (metrics.swatchSize * 0.5);\n      const swatch = document.createElementNS(SVG_NS, 'rect');\n      swatch.setAttribute('x', `${metrics.paddingX}`);\n      swatch.setAttribute('y', `${swatchY}`);\n      swatch.setAttribute('width', `${metrics.swatchSize}`);\n      swatch.setAttribute('height', `${metrics.swatchSize}`);\n      swatch.setAttribute('rx', '3');\n      swatch.setAttribute('ry', '3');\n      setSvgPaintAttributes(swatch, 'fill', entry.color, '#808080');\n      setSvgPaintAttributes(swatch, 'stroke', withAlpha(theme.textOutline, 0.35), '#000000');\n      row.appendChild(swatch);\n      this._appendText(group, {\n        x: metrics.paddingX + metrics.swatchSize + metrics.swatchGap,\n        y: (singleLine ? rowCenterY : firstLineCenterY) + (metrics.fontSize * 0.34),\n        lines: entry.lines,\n        config,\n        fill: theme.text,\n        outline: theme.textOutline,\n        fontSize: metrics.fontSize,\n        baseline: 'alphabetic',\n      }).forEach((node) => {\n        node.remove();\n        row.appendChild(node);\n        if (interactive) {\n          const nodes = row.__heliosLegendRowTextNodes ?? [];\n          nodes.push(node);\n          row.__heliosLegendRowTextNodes = nodes;\n        }\n      });\n      if (interactive) {\n        this._setCategoryRowVisual(row, {\n          selected: this._isCategoryActive(item, entry),\n          hovered: this._isActiveLegendHoverEntry(item, entry),\n          theme,\n        });\n      }\n      group.appendChild(row);\n      y += rowHeight + metrics.entryGap;\n    }\n  }\n\n  _legendInteractionSignature(items) {\n    const signatures = [];\n    for (const item of items ?? []) {\n      if (item?.legendType !== 'categorical') continue;\n      for (const entry of item.entries ?? []) {\n        if (!this._isInteractiveCategory(item, entry)) continue;\n        signatures.push([\n          item.kind,\n          entry.attribute,\n          String(entry.categoryValue),\n          this._isCategoryActive(item, entry),\n        ]);\n      }\n    }\n    return signatures;\n  }\n\n  _selectionBehavior() {\n    return this.helios?.getBehavior?.('selection') ?? this.helios?.behavior?.selection ?? null;\n  }\n\n  _isCategorySelected(entry) {\n    const selected = this._selectionBehavior()?.state?.selectedNodes ?? null;\n    if (!selected?.size) return false;\n    const nodes = this._collectCategoryNodes(entry);\n    return nodes.length > 0 && nodes.every((id) => selected.has(id));\n  }\n\n  _isCategoryHighlighted(item, entry) {\n    const key = this._categoryEntryKey(item, entry);\n    return Boolean(key && this._legendClickHighlightEntries?.has?.(key));\n  }\n\n  _isCategoryActive(item, entry) {\n    return this._config.legendClickAction === 'select'\n      ? this._isCategorySelected(entry)\n      : this._isCategoryHighlighted(item, entry);\n  }\n\n  _isCategoryRowSelected(row) {\n    return row?.dataset?.selected === 'true';\n  }\n\n  _categoryEntryKey(item, entry) {\n    if (!item || !entry) return '';\n    return [\n      item.kind ?? '',\n      entry.scope ?? '',\n      entry.attribute ?? '',\n      String(entry.categoryValue ?? ''),\n    ].join('\\u0000');\n  }\n\n  _isActiveLegendHoverEntry(item, entry) {\n    const active = this._activeLegendHover;\n    if (!active?.item || !active?.entry) return false;\n    return this._categoryEntryKey(active.item, active.entry) === this._categoryEntryKey(item, entry);\n  }\n\n  _setCategoryRowVisual(row, { selected = false, hovered = false, theme = this._theme() } = {}) {\n    if (!row) return;\n    row.dataset.selected = selected ? 'true' : 'false';\n    row.dataset.hovered = hovered ? 'true' : 'false';\n    const outline = row.__heliosLegendRowOutline ?? null;\n    if (outline) {\n      const stroke = selected\n        ? withAlpha(theme.text, 0.72)\n        : hovered\n          ? withAlpha(theme.text, 0.38)\n          : 'transparent';\n      setSvgPaintAttributes(outline, 'stroke', stroke, '#808080');\n      if (!selected && !hovered) outline.setAttribute('stroke-opacity', '0');\n    }\n  }\n\n  _isInteractiveCategory(item, entry, config = this._config) {\n    return config.interactiveCategorical !== false\n      && item?.kind === 'nodeColor'\n      && entry?.scope === 'node'\n      && typeof entry.attribute === 'string'\n      && entry.attribute\n      && entry.categoryValue != null;\n  }\n\n  _collectCategoryNodes(entry) {\n    const network = this.helios?.network ?? null;\n    if (!network || !entry?.attribute) return [];\n    return network.withBufferAccess?.(() => {\n      const ids = network.nodeIndices ?? [];\n      const view = network.getNodeAttributeBuffer?.(entry.attribute)?.view ?? null;\n      if (!view) return [];\n      const matches = [];\n      for (const idRaw of ids) {\n        const id = Number(idRaw);\n        if (Number(view[id]) === Number(entry.categoryValue)) matches.push(id);\n      }\n      return matches;\n    }) ?? [];\n  }\n\n  _collectConnectedEdges(nodeIds) {\n    const network = this.helios?.network ?? null;\n    const nodes = new Set(nodeIds ?? []);\n    if (!network || !nodes.size) return [];\n    return network.withBufferAccess?.(() => {\n      const ids = network.edgeIndices ?? [];\n      const edges = network.edgesView ?? null;\n      if (!edges) return [];\n      const matches = [];\n      for (const edgeRaw of ids) {\n        const edge = Number(edgeRaw);\n        const source = Number(edges[edge * 2]);\n        const target = Number(edges[edge * 2 + 1]);\n        if (nodes.has(source) || nodes.has(target)) matches.push(edge);\n      }\n      return matches;\n    }) ?? [];\n  }\n\n  _cancelPendingLegendHover() {\n    const pending = this._pendingLegendHover;\n    this._pendingLegendHover = null;\n    try {\n      pending?.cancel?.();\n    } catch (error) {\n      console.warn('SvgLegendController: failed to cancel pending legend hover.', error);\n    }\n  }\n\n  _cancelPendingLegendHoverClear() {\n    const pending = this._pendingLegendHoverClear;\n    this._pendingLegendHoverClear = null;\n    if (pending != null) clearTimeout(pending);\n  }\n\n  _handleCategoryEnter(item, entry) {\n    if (this._config.legendHoverHighlight === false || !this._isInteractiveCategory(item, entry)) return;\n    this._cancelPendingLegendHover();\n    this._cancelPendingLegendHoverClear();\n    this._activeLegendHover = { item, entry };\n    this._pendingLegendHover = scheduleAfterPaint(() => {\n      this._pendingLegendHover = null;\n      if (this._activeLegendHover?.entry !== entry) return;\n      const nodes = this._collectCategoryNodes(entry);\n      this.helios?._setHighlightSource?.('legend:hover', { nodes });\n    });\n  }\n\n  _handleCategoryLeave(item, entry) {\n    this._cancelPendingLegendHover();\n    if (!this._activeLegendHover) return;\n    this._cancelPendingLegendHoverClear();\n    this._pendingLegendHoverClear = setTimeout(() => {\n      this._pendingLegendHoverClear = null;\n      this._activeLegendHover = null;\n      this.helios?._clearHighlightSource?.('legend:hover');\n      this.helios?.updateDensityMap?.();\n    }, 40);\n  }\n\n  _handleCategoryClick(event, item, entry) {\n    if (this._config.legendClickSelect === false || !this._isInteractiveCategory(item, entry)) return;\n    event?.preventDefault?.();\n    event?.stopPropagation?.();\n    this._cancelPendingLegendHover();\n    this._cancelPendingLegendHoverClear();\n    if (this._config.legendClickAction !== 'select') {\n      this._handleCategoryHighlightClick(event, item, entry);\n      return;\n    }\n    this._handleCategorySelectClick(event, entry);\n  }\n\n  _handleCategoryHighlightClick(event, item, entry) {\n    const key = this._categoryEntryKey(item, entry);\n    if (!key) return;\n    if (!this._legendClickHighlightEntries) this._legendClickHighlightEntries = new Map();\n    if (this._legendClickHighlightEntries.has(key)) {\n      this._legendClickHighlightEntries.delete(key);\n    } else {\n      if (event?.shiftKey !== true) this._legendClickHighlightEntries.clear();\n      this._legendClickHighlightEntries.set(key, { item, entry });\n    }\n    this._applyLegendClickHighlights();\n    const row = event?.currentTarget ?? event?.target ?? null;\n    if (row) {\n      this._setCategoryRowVisual(row, {\n        selected: this._isCategoryHighlighted(item, entry),\n        hovered: true,\n        theme: this._theme(),\n      });\n    }\n    this.helios?.updateDensityMap?.();\n  }\n\n  _handleCategorySelectClick(event, entry) {\n    const nodes = this._collectCategoryNodes(entry);\n    const selection = this.helios?.getBehavior?.('selection') ?? this.helios?.behavior?.selection ?? null;\n    if (!selection?.selectNodes) return;\n    const selected = selection.state?.selectedNodes ?? new Set();\n    const fullySelected = nodes.length > 0 && nodes.every((id) => selected.has(id));\n    if (fullySelected) {\n      selection.selectNodes(nodes, { mode: 'remove' });\n    } else if (event?.shiftKey === true) {\n      selection.selectNodes(nodes, { mode: 'add' });\n    } else {\n      selection.clearSelection?.();\n      selection.selectNodes(nodes, { mode: 'replace' });\n    }\n    const row = event?.currentTarget ?? event?.target ?? null;\n    if (row) {\n      this._setCategoryRowVisual(row, {\n        selected: this._isCategorySelected(entry),\n        hovered: true,\n        theme: this._theme(),\n      });\n    }\n    this.helios?.updateDensityMap?.();\n  }\n\n  _applyLegendClickHighlights() {\n    const nodes = new Set();\n    for (const { entry } of this._legendClickHighlightEntries?.values?.() ?? []) {\n      for (const node of this._collectCategoryNodes(entry)) nodes.add(node);\n    }\n    if (nodes.size) {\n      this.helios?._setHighlightSource?.('legend:click', { nodes: Array.from(nodes) });\n    } else {\n      this.helios?._clearHighlightSource?.('legend:click');\n    }\n  }\n\n  _clearLegendClickHighlights() {\n    this._legendClickHighlightEntries?.clear?.();\n    this.helios?._clearHighlightSource?.('legend:click');\n  }\n\n  _syncLegendClickHighlights(items) {\n    if (!this._legendClickHighlightEntries?.size) return;\n    const valid = new Set();\n    for (const item of items ?? []) {\n      if (item?.legendType !== 'categorical') continue;\n      for (const entry of item.entries ?? []) {\n        if (!this._isInteractiveCategory(item, entry)) continue;\n        valid.add(this._categoryEntryKey(item, entry));\n      }\n    }\n    let changed = false;\n    for (const key of Array.from(this._legendClickHighlightEntries.keys())) {\n      if (valid.has(key)) continue;\n      this._legendClickHighlightEntries.delete(key);\n      changed = true;\n    }\n    if (changed) this._applyLegendClickHighlights();\n  }\n\n  _renderContinuousLegend(group, item, theme, config = this._config, defs = this.defs) {\n    const metrics = legendMetrics(config);\n    const strokeScale = resolveLegendStrokeScale(config, metrics);\n    const titleText = item.titleLines.join(' ').trim();\n    const hasTitle = item.titleLines.length > 0;\n    const barX = metrics.paddingX + (hasTitle ? metrics.fontSize + metrics.continuousTitleGap : 0);\n    const barY = metrics.paddingY + Math.max(0, (item.box.height - (metrics.paddingY * 2) - metrics.barHeight) * 0.5);\n    const barHeight = metrics.barHeight;\n    if (hasTitle) {\n      this._appendText(group, {\n        x: metrics.paddingX + (metrics.fontSize * 0.5),\n        y: barY + barHeight,\n        lines: [titleText],\n        config,\n        fill: theme.text,\n        outline: theme.textOutline,\n        fontWeight: '600',\n        fontSize: metrics.fontSize,\n        anchor: 'start',\n        baseline: 'middle',\n        rotation: -90,\n      });\n    }\n    if (config.illustratorCompatible === true) {\n      const href = createContinuousLegendRampHref(item, Math.max(32, Math.round(barHeight)));\n      const image = document.createElementNS(SVG_NS, 'image');\n      image.setAttribute('x', `${barX}`);\n      image.setAttribute('y', `${barY}`);\n      image.setAttribute('width', `${metrics.barWidth}`);\n      image.setAttribute('height', `${barHeight}`);\n      image.setAttribute('preserveAspectRatio', 'none');\n      image.setAttribute('href', href);\n      image.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', href);\n      group.appendChild(image);\n    } else {\n      const gradientId = `helios-legend-gradient-${item.kind}-${Math.random().toString(36).slice(2, 8)}`;\n      const gradient = document.createElementNS(SVG_NS, 'linearGradient');\n      gradient.setAttribute('id', gradientId);\n      gradient.setAttribute('x1', '0%');\n      gradient.setAttribute('y1', '100%');\n      gradient.setAttribute('x2', '0%');\n      gradient.setAttribute('y2', '0%');\n      const scale = createColormapScale(item.colormap, { domain: item.domain, clamp: true });\n      const steps = item.divergent ? [0, 0.5, 1] : [0, 0.2, 0.4, 0.6, 0.8, 1];\n      steps.forEach((step) => {\n        const stop = document.createElementNS(SVG_NS, 'stop');\n        const value = (item.domain[0] ?? 0) + ((item.domain[1] ?? 1) - (item.domain[0] ?? 0)) * step;\n        stop.setAttribute('offset', `${step * 100}%`);\n        stop.setAttribute('stop-color', rgbaArrayToCss(scale(value)));\n        gradient.appendChild(stop);\n      });\n      defs?.appendChild?.(gradient);\n\n      const bar = document.createElementNS(SVG_NS, 'rect');\n      bar.setAttribute('x', `${barX}`);\n      bar.setAttribute('y', `${barY}`);\n      bar.setAttribute('width', `${metrics.barWidth}`);\n      bar.setAttribute('height', `${barHeight}`);\n      bar.setAttribute('rx', '2');\n      bar.setAttribute('ry', '2');\n      bar.setAttribute('fill', `url(#${gradientId})`);\n      group.appendChild(bar);\n    }\n\n    const barOuter = document.createElementNS(SVG_NS, 'rect');\n    barOuter.setAttribute('x', `${barX}`);\n    barOuter.setAttribute('y', `${barY}`);\n    barOuter.setAttribute('width', `${metrics.barWidth}`);\n    barOuter.setAttribute('height', `${barHeight}`);\n    barOuter.setAttribute('rx', '2');\n    barOuter.setAttribute('ry', '2');\n    barOuter.setAttribute('fill', 'none');\n    setSvgPaintAttributes(barOuter, 'stroke', theme.barOuterStroke, '#000000');\n    barOuter.setAttribute('stroke-width', `${(theme.barOuterWidth ?? 2.25) * strokeScale}`);\n    group.appendChild(barOuter);\n\n    const barInner = document.createElementNS(SVG_NS, 'rect');\n    barInner.setAttribute('x', `${barX}`);\n    barInner.setAttribute('y', `${barY}`);\n    barInner.setAttribute('width', `${metrics.barWidth}`);\n    barInner.setAttribute('height', `${barHeight}`);\n    barInner.setAttribute('rx', '2');\n    barInner.setAttribute('ry', '2');\n    barInner.setAttribute('fill', 'none');\n    setSvgPaintAttributes(barInner, 'stroke', theme.barInnerStroke, '#000000');\n    barInner.setAttribute('stroke-width', `${(theme.barInnerWidth ?? 1.5) * strokeScale}`);\n    group.appendChild(barInner);\n\n    const lo = Number(item.domain?.[0] ?? 0);\n    const hi = Number(item.domain?.[1] ?? 1);\n    const span = hi - lo || 1;\n    (item.ticks ?? []).forEach((tick, index) => {\n      const normalized = clamp((Number(tick) - lo) / span, 0, 1);\n      const y = barY + barHeight - (normalized * barHeight);\n      const tickStart = barX - 1;\n      const tickEnd = barX + metrics.barWidth + metrics.tickGap + metrics.tickLength;\n      const tickOutline = document.createElementNS(SVG_NS, 'line');\n      tickOutline.setAttribute('x1', `${tickStart}`);\n      tickOutline.setAttribute('x2', `${tickEnd}`);\n      tickOutline.setAttribute('y1', `${y}`);\n      tickOutline.setAttribute('y2', `${y}`);\n      setSvgPaintAttributes(tickOutline, 'stroke', theme.tickOutline, '#000000');\n      tickOutline.setAttribute('stroke-width', `${3 * strokeScale}`);\n      tickOutline.setAttribute('stroke-linecap', 'round');\n      group.appendChild(tickOutline);\n      const tickLine = document.createElementNS(SVG_NS, 'line');\n      tickLine.setAttribute('x1', `${tickStart}`);\n      tickLine.setAttribute('x2', `${tickEnd}`);\n      tickLine.setAttribute('y1', `${y}`);\n      tickLine.setAttribute('y2', `${y}`);\n      setSvgPaintAttributes(tickLine, 'stroke', theme.text, '#000000');\n      tickLine.setAttribute('stroke-width', `${1.5 * strokeScale}`);\n      tickLine.setAttribute('stroke-linecap', 'round');\n      group.appendChild(tickLine);\n      this._appendText(group, {\n        x: tickEnd + metrics.labelGap,\n        y,\n        lines: [item.tickLabels?.[index] ?? formatNumber(tick)],\n        config,\n        fill: theme.text,\n        fontSize: Math.max(10, metrics.fontSize - 1),\n        outline: theme.textOutline,\n        baseline: 'middle',\n      });\n    });\n  }\n\n  _renderScalarLegend(group, item, theme, config = this._config) {\n    const metrics = legendMetrics(config, {\n      ignoreScale: Boolean(item.preview) && config?.scalePreviewLegends !== true,\n    });\n    const strokeScale = resolveLegendStrokeScale(config, metrics);\n    const labelFontSize = Math.max(10, metrics.fontSize - 1);\n    const titleText = item.titleLines.join(' ').trim();\n    const minRange = Math.min(Number(item.range?.[0] ?? 0), Number(item.range?.[1] ?? 1));\n    const maxRange = Math.max(Number(item.range?.[0] ?? 0), Number(item.range?.[1] ?? 1));\n    const previewBase = Number(item.preview?.base ?? 0);\n    const previewScale = Number(item.preview?.scale ?? 1);\n    const domainMin = Number(item.domain?.[0] ?? 0);\n    const domainMax = Number(item.domain?.[1] ?? 1);\n    const sampleCount = item.shape === 'circle' ? 3 : (item.box.width >= 116 ? 3 : 2);\n    const samples = scalarSampleValues(item.domain, sampleCount, {\n      omitZeroMin: item.shape === 'line',\n      readableMinRatio: item.shape === 'line' ? 0.2 : 0,\n    });\n    const rangeSpan = Math.max(1e-9, maxRange - minRange);\n    const maxRadius = Math.min(26, (item.box.width - (metrics.paddingX * 2)) * 0.48);\n    const minRadius = Math.max(6, maxRadius * 0.28);\n    const sizeSources = samples.map((sample) => {\n      const t = (sample - domainMin) / Math.max(1e-9, domainMax - domainMin || 1);\n      const source = minRange + (rangeSpan * t);\n      return item.preview\n        ? Math.max(1, previewBase + previewScale * Math.max(0, source))\n        : source;\n    });\n    const sourceMin = Math.min(...sizeSources);\n    const sourceMax = Math.max(...sizeSources);\n    const sourceSpan = Math.max(1e-9, sourceMax - sourceMin);\n    const radii = sizeSources.map((source) => {\n      if (samples.length === 1) return maxRadius;\n      return clamp(minRadius + ((source - sourceMin) / sourceSpan) * (maxRadius - minRadius), minRadius, maxRadius);\n    });\n    if (item.shape === 'circle') {\n      const maxCircleRadius = Math.max(...radii);\n      const availableWidth = Math.max(1, item.box.width - metrics.paddingX * 2);\n      const labelWidth = Math.max(\n        28,\n        ...samples.map((sample) => estimateTextWidthPx(formatNumber(sample), labelFontSize)),\n      );\n      const radiusLimitByWidth = Math.max(8, (availableWidth - labelWidth - 18) * 0.5);\n      const radiusLimitByHeight = Math.max(8, (item.box.height - (metrics.paddingY * 2) - metrics.fontSize - 22) * 0.5);\n      const radiusScale = Math.min(1, radiusLimitByWidth / maxCircleRadius, radiusLimitByHeight / maxCircleRadius);\n      const scaledRadii = radii.map((radius) => Math.max(5, radius * radiusScale));\n      const scaledMaxRadius = Math.max(...scaledRadii);\n      const visualTop = metrics.paddingY + 3;\n      const baselineY = visualTop + (scaledMaxRadius * 2);\n      const circleCx = metrics.paddingX + scaledMaxRadius + 2;\n      const labelX = circleCx + scaledMaxRadius + 14;\n      const entries = samples.map((sample, index) => ({\n        sample,\n        radius: scaledRadii[index],\n        cy: baselineY - scaledRadii[index],\n      }));\n      const drawEntries = [...entries].sort((a, b) => b.radius - a.radius);\n      const labelEntries = [...entries].sort((a, b) => b.radius - a.radius);\n      const labelSlots = entries.length <= 1\n        ? [baselineY - scaledMaxRadius]\n        : entries.map((_, index) => visualTop + labelFontSize * 0.5 + (index * ((scaledMaxRadius * 2 - labelFontSize) / Math.max(1, entries.length - 1))));\n\n      drawEntries.forEach(({ radius, cy }) => {\n        const circle = document.createElementNS(SVG_NS, 'circle');\n        circle.setAttribute('cx', `${circleCx}`);\n        circle.setAttribute('cy', `${cy}`);\n        circle.setAttribute('r', `${radius}`);\n        setSvgPaintAttributes(circle, 'fill', 'rgba(24, 28, 36, 0.26)', '#181c24');\n        setSvgPaintAttributes(circle, 'stroke', withAlpha(theme.accentOuter, 0.85), '#ffffff');\n        circle.setAttribute('stroke-width', `${2 * strokeScale}`);\n        group.appendChild(circle);\n      });\n\n      labelEntries.forEach(({ sample, radius, cy }, index) => {\n        const labelY = labelSlots[index] ?? cy;\n        const connector = document.createElementNS(SVG_NS, 'line');\n        connector.setAttribute('x1', `${circleCx + radius + 3}`);\n        connector.setAttribute('x2', `${labelX - 4}`);\n        connector.setAttribute('y1', `${cy}`);\n        connector.setAttribute('y2', `${labelY}`);\n        setSvgPaintAttributes(connector, 'stroke', withAlpha(theme.text, 0.58), '#ffffff');\n        connector.setAttribute('stroke-width', `${1 * strokeScale}`);\n        connector.setAttribute('stroke-linecap', 'round');\n        group.appendChild(connector);\n\n        this._appendText(group, {\n          x: labelX,\n          y: labelY,\n          lines: [formatNumber(sample)],\n          config,\n          fill: theme.text,\n          outline: theme.textOutline,\n          fontSize: labelFontSize,\n          anchor: 'start',\n          baseline: 'middle',\n        });\n      });\n\n      if (titleText) {\n        this._appendText(group, {\n          x: item.box.width * 0.5,\n          y: baselineY + 17,\n          lines: [titleText],\n          config,\n          fill: theme.text,\n          outline: theme.textOutline,\n          fontWeight: '600',\n          fontSize: metrics.fontSize,\n          anchor: 'middle',\n          baseline: 'middle',\n        });\n      }\n      return;\n    }\n    const cx = item.box.width * 0.5;\n\n    const lineLength = Math.max(32, Math.min(item.box.width - (metrics.paddingX * 2), metrics.scalarWidth * 0.56));\n    const topY = metrics.paddingY + labelFontSize;\n    const entries = samples\n      .map((sample) => {\n        const t = (sample - domainMin) / Math.max(1e-9, domainMax - domainMin || 1);\n        const source = minRange + (rangeSpan * t);\n        return {\n          sample,\n          strokeWidth: clamp(source, 1.5, 12) * strokeScale,\n        };\n      })\n      .sort((a, b) => b.sample - a.sample);\n\n    let cursorY = topY;\n    entries.forEach((entry, index) => {\n      const labelY = cursorY;\n      const lineY = labelY + Math.max(8, labelFontSize * 0.82);\n      this._appendText(group, {\n        x: cx,\n        y: labelY,\n        lines: [formatNumber(entry.sample)],\n        config,\n        fill: theme.text,\n        outline: theme.textOutline,\n        fontSize: labelFontSize,\n        anchor: 'middle',\n        baseline: 'middle',\n      });\n      const line = document.createElementNS(SVG_NS, 'line');\n      line.setAttribute('x1', `${cx - lineLength * 0.5}`);\n      line.setAttribute('x2', `${cx + lineLength * 0.5}`);\n      line.setAttribute('y1', `${lineY}`);\n      line.setAttribute('y2', `${lineY}`);\n      setSvgPaintAttributes(line, 'stroke', theme.text, '#000000');\n      line.setAttribute('stroke-width', `${entry.strokeWidth}`);\n      line.setAttribute('stroke-linecap', 'square');\n      group.appendChild(line);\n\n      const nextStrokeWidth = entries[index + 1]?.strokeWidth ?? 0;\n      cursorY = lineY + (entry.strokeWidth * 0.5) + (nextStrokeWidth * 0.5) + labelFontSize + 4;\n    });\n\n    const titleY = cursorY - 2;\n    if (titleText) {\n      this._appendText(group, {\n        x: cx,\n        y: titleY,\n        lines: [titleText],\n        config,\n        fill: theme.text,\n        outline: theme.textOutline,\n        fontWeight: '600',\n        fontSize: metrics.fontSize,\n        anchor: 'middle',\n        baseline: 'middle',\n      });\n    }\n  }\n}\n\nexport default SvgLegendController;\n","const FILTER_SCOPE_NODE = 'node';\nconst FILTER_SCOPE_EDGE = 'edge';\nconst GRAPH_FILTER_SCOPE_RENDER = 'render';\nconst GRAPH_FILTER_SCOPE_RENDER_LAYOUT = 'render+layout';\n\nconst FILTER_TYPE_NUMERIC = 'numeric';\nconst FILTER_TYPE_STRING = 'string';\nconst FILTER_TYPE_CATEGORICAL = 'categorical';\nconst FILTER_TYPE_QUERY = 'query';\n\nconst STRING_OPERATORS = new Set(['contains', 'starts_with', 'ends_with', 'regex']);\nconst FILTER_TYPES = new Set([\n  FILTER_TYPE_NUMERIC,\n  FILTER_TYPE_STRING,\n  FILTER_TYPE_CATEGORICAL,\n  FILTER_TYPE_QUERY,\n]);\n\nlet filterRuleIdCounter = 1;\n\nfunction isFilterScope(value) {\n  return value === FILTER_SCOPE_NODE || value === FILTER_SCOPE_EDGE;\n}\n\nfunction normalizeFilterScope(value, fallback = FILTER_SCOPE_NODE) {\n  const raw = String(value ?? fallback).trim().toLowerCase();\n  return raw === FILTER_SCOPE_EDGE ? FILTER_SCOPE_EDGE : FILTER_SCOPE_NODE;\n}\n\nfunction normalizeGraphFilterScope(value, fallback = GRAPH_FILTER_SCOPE_RENDER) {\n  const raw = String(value ?? fallback).trim().toLowerCase();\n  if (raw === GRAPH_FILTER_SCOPE_RENDER_LAYOUT || raw === 'layout' || raw === 'render_layout') {\n    return GRAPH_FILTER_SCOPE_RENDER_LAYOUT;\n  }\n  return GRAPH_FILTER_SCOPE_RENDER;\n}\n\nfunction normalizeStringOperator(value, fallback = 'contains') {\n  const raw = String(value ?? fallback).trim().toLowerCase();\n  if (raw === 'startswith') return 'starts_with';\n  if (raw === 'endswith') return 'ends_with';\n  if (!STRING_OPERATORS.has(raw)) return fallback;\n  return raw;\n}\n\nfunction toQueryNumber(value) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return null;\n  if (numeric === 0) return '0';\n  return String(Number(numeric.toPrecision(12)));\n}\n\nfunction quoteQueryString(value) {\n  return `\"${String(value ?? '')\n    .replace(/\\\\/g, '\\\\\\\\')\n    .replace(/\"/g, '\\\\\"')\n    .replace(/\\n/g, '\\\\n')\n    .replace(/\\r/g, '\\\\r')\n    .replace(/\\t/g, '\\\\t')}\"`;\n}\n\nfunction escapeRegex(value) {\n  return String(value ?? '').replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction compileNumericRule(rule) {\n  const attribute = typeof rule.attribute === 'string' ? rule.attribute.trim() : '';\n  if (!attribute) return null;\n  let min = Number(rule.min);\n  let max = Number(rule.max);\n  if (!Number.isFinite(min) || !Number.isFinite(max)) return null;\n  if (min > max) {\n    const swap = min;\n    min = max;\n    max = swap;\n  }\n  const extentMin = Number(rule.extentMin);\n  const extentMax = Number(rule.extentMax);\n  if (Number.isFinite(extentMin) && Number.isFinite(extentMax)) {\n    const epsilon = 1e-9;\n    const coversExtent = Math.abs(min - extentMin) <= epsilon && Math.abs(max - extentMax) <= epsilon;\n    if (coversExtent) return null;\n  }\n  const lo = toQueryNumber(min);\n  const hi = toQueryNumber(max);\n  if (lo == null || hi == null) return null;\n  return `${attribute} >= ${lo} AND ${attribute} <= ${hi}`;\n}\n\nfunction compileStringRule(rule) {\n  const attribute = typeof rule.attribute === 'string' ? rule.attribute.trim() : '';\n  if (!attribute) return null;\n  const value = String(rule.value ?? '');\n  if (!value.trim().length) return null;\n  const operator = normalizeStringOperator(rule.operator, 'contains');\n  let pattern = value;\n  if (operator === 'contains') {\n    pattern = `.*${escapeRegex(value)}.*`;\n  } else if (operator === 'starts_with') {\n    pattern = `^${escapeRegex(value)}.*`;\n  } else if (operator === 'ends_with') {\n    pattern = `.*${escapeRegex(value)}$`;\n  }\n  return `${attribute} =~ ${quoteQueryString(pattern)}`;\n}\n\nfunction compileCategoricalRule(rule) {\n  const attribute = typeof rule.attribute === 'string' ? rule.attribute.trim() : '';\n  if (!attribute) return null;\n  const inputValues = Array.isArray(rule.values) ? rule.values : [];\n  const values = [];\n  const seen = new Set();\n  for (const raw of inputValues) {\n    const next = String(raw ?? '').trim();\n    if (!next || seen.has(next)) continue;\n    seen.add(next);\n    values.push(next);\n  }\n  if (!values.length) return null;\n  if (values.length === 1) {\n    return `${attribute} == ${quoteQueryString(values[0])}`;\n  }\n  return `${attribute} IN (${values.map((value) => quoteQueryString(value)).join(', ')})`;\n}\n\nfunction compileRawQueryRule(rule) {\n  const text = String(rule.query ?? '').trim();\n  return text ? text : null;\n}\n\nfunction compileRuleToQuery(rule) {\n  if (!rule || rule.enabled === false) return null;\n  if (rule.type === FILTER_TYPE_NUMERIC) return compileNumericRule(rule);\n  if (rule.type === FILTER_TYPE_STRING) return compileStringRule(rule);\n  if (rule.type === FILTER_TYPE_CATEGORICAL) return compileCategoricalRule(rule);\n  if (rule.type === FILTER_TYPE_QUERY) return compileRawQueryRule(rule);\n  return null;\n}\n\nfunction normalizeRule(nextRule = {}) {\n  if (!nextRule || typeof nextRule !== 'object') {\n    throw new TypeError('HeliosFilter rule must be an object');\n  }\n  const type = String(nextRule.type ?? '').trim().toLowerCase();\n  if (!FILTER_TYPES.has(type)) {\n    throw new Error(`Unsupported HeliosFilter rule type \"${type}\"`);\n  }\n  const scope = normalizeFilterScope(nextRule.scope, FILTER_SCOPE_NODE);\n  const id = typeof nextRule.id === 'string' && nextRule.id.trim()\n    ? nextRule.id.trim()\n    : `helios-filter-rule-${filterRuleIdCounter++}`;\n  const enabled = nextRule.enabled !== false;\n  if (type === FILTER_TYPE_QUERY) {\n    return {\n      id,\n      scope,\n      type,\n      enabled,\n      query: String(nextRule.query ?? ''),\n      label: typeof nextRule.label === 'string' ? nextRule.label : '',\n    };\n  }\n  const attribute = typeof nextRule.attribute === 'string' ? nextRule.attribute.trim() : '';\n  if (!attribute) {\n    throw new Error(`HeliosFilter ${type} rule requires a non-empty attribute`);\n  }\n  if (type === FILTER_TYPE_NUMERIC) {\n    return {\n      id,\n      scope,\n      type,\n      enabled,\n      attribute,\n      min: Number(nextRule.min),\n      max: Number(nextRule.max),\n      extentMin: Number(nextRule.extentMin),\n      extentMax: Number(nextRule.extentMax),\n      label: typeof nextRule.label === 'string' ? nextRule.label : '',\n    };\n  }\n  if (type === FILTER_TYPE_STRING) {\n    return {\n      id,\n      scope,\n      type,\n      enabled,\n      attribute,\n      operator: normalizeStringOperator(nextRule.operator, 'contains'),\n      value: String(nextRule.value ?? ''),\n      label: typeof nextRule.label === 'string' ? nextRule.label : '',\n    };\n  }\n  return {\n    id,\n    scope,\n    type,\n    enabled,\n    attribute,\n    values: Array.isArray(nextRule.values)\n      ? nextRule.values.map((entry) => String(entry ?? ''))\n      : [],\n    label: typeof nextRule.label === 'string' ? nextRule.label : '',\n  };\n}\n\nfunction cloneRule(rule) {\n  if (!rule || typeof rule !== 'object') return null;\n  const out = { ...rule };\n  if (Array.isArray(rule.values)) out.values = [...rule.values];\n  return out;\n}\n\n/**\n * Builder for reusable graph filter rule sets.\n *\n * @public\n * @param {object} [options] - Filter id, display name, graph scope, and initial\n * rules.\n * @returns {HeliosFilter} Filter model that can be activated through\n * `helios.activateHeliosFilter(...)` or `FilterBehavior`.\n * @remarks Rules compile to Helios Network query expressions. Supported rule\n * types are `numeric`, `categorical`, `string`, and raw `query`.\n * @example\n * const filter = new HeliosFilter({ scope: 'render' })\n *   .addRule({ type: 'numeric', scope: 'node', attribute: 'score', min: 0.5, max: 1 });\n */\nexport class HeliosFilter {\n  /**\n   * Create a filter model from an id, graph scope, and initial rules.\n   *\n   * @param {object} [options] - Filter options.\n   * @param {string} [options.id] - Stable filter id.\n   * @param {string} [options.name] - Human-readable filter name.\n   * @param {'render'|'render+layout'} [options.scope='render'] - Whether the filter affects rendering only or rendering plus layout.\n   * @param {Array<object>} [options.rules] - Initial rule descriptors.\n   */\n  constructor(options = {}) {\n    this.id = typeof options.id === 'string' && options.id.trim()\n      ? options.id.trim()\n      : `helios-filter-${filterRuleIdCounter++}`;\n    this.name = typeof options.name === 'string' ? options.name : '';\n    this.scope = normalizeGraphFilterScope(options.scope, GRAPH_FILTER_SCOPE_RENDER);\n    this.rules = [];\n    const initialRules = Array.isArray(options.rules) ? options.rules : [];\n    for (const rule of initialRules) {\n      this.addRule(rule);\n    }\n  }\n\n  /**\n   * Return a deep copy of this filter model.\n   *\n   * @returns {HeliosFilter} Independent filter with copied rule descriptors.\n   */\n  clone() {\n    return new HeliosFilter({\n      id: this.id,\n      name: this.name,\n      scope: this.scope,\n      rules: this.rules.map((rule) => cloneRule(rule)),\n    });\n  }\n\n  /**\n   * Set the graph filter scope.\n   *\n   * @param {'render'|'render+layout'} scope - Graph filter scope.\n   * @returns {HeliosFilter} This filter.\n   */\n  setScope(scope) {\n    this.scope = normalizeGraphFilterScope(scope, this.scope);\n    return this;\n  }\n\n  /**\n   * Return the graph filter scope.\n   *\n   * @returns {'render'|'render+layout'} Current graph filter scope.\n   */\n  getScope() {\n    return this.scope;\n  }\n\n  /**\n   * Return copied rules, optionally limited to node or edge rules.\n   *\n   * @param {'node'|'edge'} [scope] - Optional rule scope.\n   * @returns {Array<object>} Copied rule descriptors.\n   */\n  getRules(scope = null) {\n    if (scope == null) {\n      return this.rules.map((rule) => cloneRule(rule));\n    }\n    if (!isFilterScope(scope)) {\n      throw new Error(`Unknown HeliosFilter scope \"${scope}\"`);\n    }\n    return this.rules.filter((rule) => rule.scope === scope).map((rule) => cloneRule(rule));\n  }\n\n  _assertUniqueRule(nextRule, existingRuleId = null) {\n    if (!nextRule) return;\n    for (const candidate of this.rules) {\n      if (!candidate || candidate.id === existingRuleId) continue;\n      if (candidate.scope !== nextRule.scope) continue;\n      if (nextRule.type === FILTER_TYPE_QUERY && candidate.type === FILTER_TYPE_QUERY) {\n        throw new Error(`Only one query filter is allowed for ${nextRule.scope}`);\n      }\n      if (nextRule.attribute && candidate.attribute && candidate.attribute === nextRule.attribute) {\n        throw new Error(`Only one filter is allowed per attribute (\"${nextRule.attribute}\") on ${nextRule.scope}`);\n      }\n    }\n  }\n\n  /**\n   * Add a filter rule.\n   *\n   * @param {object} rule - Rule descriptor.\n   * @returns {object} Normalized copied rule descriptor.\n   */\n  addRule(rule) {\n    const normalized = normalizeRule(rule);\n    this._assertUniqueRule(normalized, null);\n    this.rules.push(normalized);\n    return cloneRule(normalized);\n  }\n\n  /**\n   * Update an existing rule by id.\n   *\n   * @param {string} ruleId - Rule id to update.\n   * @param {object} [patch] - Rule fields to replace.\n   * @returns {object} Normalized copied rule descriptor.\n   */\n  updateRule(ruleId, patch = {}) {\n    const index = this.rules.findIndex((rule) => rule.id === ruleId);\n    if (index < 0) {\n      throw new Error(`Unknown HeliosFilter rule \"${ruleId}\"`);\n    }\n    const merged = { ...this.rules[index], ...patch, id: this.rules[index].id };\n    const normalized = normalizeRule(merged);\n    this._assertUniqueRule(normalized, ruleId);\n    this.rules[index] = normalized;\n    return cloneRule(normalized);\n  }\n\n  /**\n   * Update a rule by id when it exists, otherwise add it.\n   *\n   * @param {object} rule - Rule descriptor.\n   * @returns {object} Normalized copied rule descriptor.\n   */\n  upsertRule(rule) {\n    const id = typeof rule?.id === 'string' ? rule.id : null;\n    if (id && this.rules.some((entry) => entry.id === id)) {\n      return this.updateRule(id, rule);\n    }\n    return this.addRule(rule);\n  }\n\n  /**\n   * Remove a rule by id.\n   *\n   * @param {string} ruleId - Rule id to remove.\n   * @returns {boolean} True when a rule was removed.\n   */\n  removeRule(ruleId) {\n    const index = this.rules.findIndex((rule) => rule.id === ruleId);\n    if (index < 0) return false;\n    this.rules.splice(index, 1);\n    return true;\n  }\n\n  /**\n   * Remove all rules, or all rules for one node/edge scope.\n   *\n   * @param {'node'|'edge'} [scope] - Optional rule scope to clear.\n   * @returns {HeliosFilter} This filter.\n   */\n  clear(scope = null) {\n    if (scope == null) {\n      this.rules.length = 0;\n      return this;\n    }\n    if (!isFilterScope(scope)) {\n      throw new Error(`Unknown HeliosFilter scope \"${scope}\"`);\n    }\n    this.rules = this.rules.filter((rule) => rule.scope !== scope);\n    return this;\n  }\n\n  /**\n   * Compile active rules for one node/edge scope into a query string.\n   *\n   * @param {'node'|'edge'} scope - Rule scope to compile.\n   * @returns {string|null} Query expression, or `null` when no active criteria apply.\n   */\n  compileScopeQuery(scope) {\n    if (!isFilterScope(scope)) {\n      throw new Error(`Unknown HeliosFilter scope \"${scope}\"`);\n    }\n    const queries = [];\n    for (const rule of this.rules) {\n      if (!rule || rule.scope !== scope) continue;\n      const query = compileRuleToQuery(rule);\n      if (!query) continue;\n      queries.push(query);\n    }\n    if (!queries.length) return null;\n    if (queries.length === 1) return queries[0];\n    return queries.map((query) => `(${query})`).join(' AND ');\n  }\n\n  /**\n   * Test whether this filter has any active criteria.\n   *\n   * @returns {boolean} True when at least one rule compiles to a query.\n   */\n  hasCriteria() {\n    return Boolean(this.compileScopeQuery(FILTER_SCOPE_NODE) || this.compileScopeQuery(FILTER_SCOPE_EDGE));\n  }\n\n  /**\n   * Convert this model to the graph-filter options consumed by `Helios`.\n   *\n   * @returns {object} Graph-filter options with node and edge query strings.\n   */\n  toGraphFilterOptions() {\n    const out = {\n      scope: this.scope,\n    };\n    const nodeQuery = this.compileScopeQuery(FILTER_SCOPE_NODE);\n    const edgeQuery = this.compileScopeQuery(FILTER_SCOPE_EDGE);\n    if (nodeQuery) out.nodeQuery = nodeQuery;\n    if (edgeQuery) out.edgeQuery = edgeQuery;\n    return out;\n  }\n}\n\nexport const HELIOS_FILTER_SCOPE_NODE = FILTER_SCOPE_NODE;\nexport const HELIOS_FILTER_SCOPE_EDGE = FILTER_SCOPE_EDGE;\nexport const HELIOS_FILTER_TYPE_NUMERIC = FILTER_TYPE_NUMERIC;\nexport const HELIOS_FILTER_TYPE_STRING = FILTER_TYPE_STRING;\nexport const HELIOS_FILTER_TYPE_CATEGORICAL = FILTER_TYPE_CATEGORICAL;\nexport const HELIOS_FILTER_TYPE_QUERY = FILTER_TYPE_QUERY;\n","import { Layer } from './Layer.js';\nimport { resolveColormap } from '../../colors/colormaps.js';\nimport { NODE_STATE_ATTRIBUTE } from '../../pipeline/constants.js';\n\nfunction clamp(value, min, max) {\n  return Math.max(min, Math.min(max, value));\n}\n\nfunction toFiniteNumber(value, fallback = 0) {\n  const numeric = Number(value);\n  return Number.isFinite(numeric) ? numeric : fallback;\n}\n\nfunction resolvePackedVec3Count(entry, fallback = 0) {\n  const explicit = Math.max(0, Math.floor(Number(entry?.count ?? 0)));\n  const byteLength = Math.max(\n    0,\n    Math.floor(Number(entry?.byteLength ?? entry?.buffer?.size ?? 0)),\n  );\n  const inferred = byteLength > 0\n    ? Math.floor(byteLength / (Float32Array.BYTES_PER_ELEMENT * 3))\n    : 0;\n  return Math.max(explicit, inferred, Math.max(0, Math.floor(Number(fallback) || 0)));\n}\n\nfunction compileShader(gl, type, source) {\n  const shader = gl.createShader(type);\n  gl.shaderSource(shader, source);\n  gl.compileShader(shader);\n  if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n    const log = gl.getShaderInfoLog(shader);\n    gl.deleteShader(shader);\n    throw new Error(log || 'Density shader compilation error');\n  }\n  return shader;\n}\n\nfunction createProgram(gl, vertexSource, fragmentSource) {\n  const vert = compileShader(gl, gl.VERTEX_SHADER, vertexSource);\n  const frag = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);\n  const program = gl.createProgram();\n  gl.attachShader(program, vert);\n  gl.attachShader(program, frag);\n  gl.linkProgram(program);\n  if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n    const log = gl.getProgramInfoLog(program);\n    gl.deleteProgram(program);\n    throw new Error(log || 'Density program link error');\n  }\n  gl.deleteShader(vert);\n  gl.deleteShader(frag);\n  return program;\n}\n\nfunction getTextureLayout(maxTextureSize, texelCount) {\n  const safeCount = Math.max(1, Math.floor(Number(texelCount) || 1));\n  const safeMax = Math.max(1, Math.floor(Number(maxTextureSize) || 16384));\n  const width = Math.min(safeMax, safeCount);\n  const height = Math.ceil(safeCount / width);\n  return { width, height, count: safeCount };\n}\n\nfunction matrixHasFiniteValues(matrix) {\n  if (!matrix || typeof matrix.length !== 'number') return false;\n  for (let i = 0; i < matrix.length; i += 1) {\n    if (!Number.isFinite(matrix[i])) return false;\n  }\n  return true;\n}\n\nconst LOG_RATIO_AUTO_SUPPORT_FLOOR_MULTIPLIER = 128;\nconst LOG_RATIO_AUTO_SUPPORT_CEIL_MULTIPLIER = 512;\n\nexport function resolveLogRatioSupportWindow(epsilon, maskThreshold = 0, enabled = true) {\n  if (enabled !== true) {\n    return { floor: 0, ceil: 0 };\n  }\n  const safeEpsilon = Math.max(toFiniteNumber(epsilon, 1e-6), 1e-12);\n  const explicitFloor = Math.max(toFiniteNumber(maskThreshold, 0), 0);\n  const autoFloor = safeEpsilon * LOG_RATIO_AUTO_SUPPORT_FLOOR_MULTIPLIER;\n  const floor = Math.max(explicitFloor, autoFloor);\n  const ceil = Math.max(\n    floor * 2,\n    safeEpsilon * LOG_RATIO_AUTO_SUPPORT_CEIL_MULTIPLIER,\n  );\n  return { floor, ceil };\n}\n\nexport function resolveDensityBandwidthViewport(context, cameraUniforms, fallbackWidth = 1, fallbackHeight = 1) {\n  const cameraViewport = cameraUniforms?.viewport ?? null;\n  const exportViewport = context?.target?.exportFigureLogicalViewport ?? null;\n  const width = Math.max(\n    1,\n    toFiniteNumber(\n      exportViewport?.width ?? cameraViewport?.width,\n      fallbackWidth,\n    ),\n  );\n  const height = Math.max(\n    1,\n    toFiniteNumber(\n      exportViewport?.height ?? cameraViewport?.height,\n      fallbackHeight,\n    ),\n  );\n  return { width, height };\n}\n\nconst SPLAT_VERT_WEBGL = `#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp usampler2D;\n\nlayout(location = 0) in vec2 a_corner;\n\nuniform mat4 u_viewProjection;\nuniform usampler2D u_nodeIndices;\nuniform sampler2D u_nodeWeights;\nuniform sampler2D u_nodePositions;\nuniform vec2 u_viewport;\nuniform vec2 u_densitySize;\nuniform float u_bandwidthPx;\nuniform int u_nodeCount;\nuniform int u_indexTexWidth;\nuniform int u_weightTexWidth;\nuniform int u_positionTexWidth;\nuniform int u_positionCount;\n\nout vec2 v_local;\nout float v_weight;\n\nivec2 indexToCoord(int index, int width) {\n  int safeWidth = max(width, 1);\n  int y = index / safeWidth;\n  int x = index - y * safeWidth;\n  return ivec2(x, y);\n}\n\nbool isFiniteVec4(vec4 value) {\n  bvec4 finiteMagnitude = lessThan(abs(value), vec4(1e19));\n  bvec4 notNaN = equal(value, value);\n  return all(finiteMagnitude) && all(notNaN);\n}\n\nvoid main() {\n  int instance = gl_InstanceID;\n  if (instance >= u_nodeCount) {\n    gl_Position = vec4(2.0, 2.0, 0.0, 1.0);\n    v_local = vec2(0.0);\n    v_weight = 0.0;\n    return;\n  }\n\n  uint nodeId = texelFetch(u_nodeIndices, indexToCoord(instance, u_indexTexWidth), 0).r;\n  if (int(nodeId) < 0 || int(nodeId) >= u_positionCount) {\n    gl_Position = vec4(2.0, 2.0, 0.0, 1.0);\n    v_local = vec2(0.0);\n    v_weight = 0.0;\n    return;\n  }\n\n  vec3 position = texelFetch(u_nodePositions, indexToCoord(int(nodeId), u_positionTexWidth), 0).xyz;\n  float weight = texelFetch(u_nodeWeights, indexToCoord(instance, u_weightTexWidth), 0).r;\n\n  vec4 clip = u_viewProjection * vec4(position, 1.0);\n  bool outsideClipDepth = clip.z < -clip.w || clip.z > clip.w;\n  if (!isFiniteVec4(clip) || abs(clip.w) < 1e-6 || clip.w <= 0.0 || outsideClipDepth) {\n    gl_Position = vec4(2.0, 2.0, 0.0, 1.0);\n    v_local = vec2(0.0);\n    v_weight = 0.0;\n    return;\n  }\n\n  vec2 ndc = clip.xy / clip.w;\n  vec2 center = vec2(\n    (ndc.x * 0.5 + 0.5) * u_densitySize.x,\n    (1.0 - (ndc.y * 0.5 + 0.5)) * u_densitySize.y\n  );\n\n  float bandwidthScale = u_densitySize.x / max(u_viewport.x, 1.0);\n  float sigma = max(0.6, u_bandwidthPx * bandwidthScale);\n  vec2 offset = a_corner * (sigma * 3.0);\n  vec2 px = center + offset;\n\n  vec2 outNdc = vec2(\n    (px.x / max(u_densitySize.x, 1.0)) * 2.0 - 1.0,\n    1.0 - (px.y / max(u_densitySize.y, 1.0)) * 2.0\n  );\n\n  gl_Position = vec4(outNdc, 0.0, 1.0);\n  v_local = offset / max(sigma, 1e-4);\n  v_weight = weight;\n}\n`;\n\nconst SPLAT_FRAG_WEBGL = `#version 300 es\nprecision highp float;\n\nin vec2 v_local;\nin float v_weight;\nout vec4 fragColor;\n\nvoid main() {\n  float r2 = dot(v_local, v_local);\n  if (r2 > 9.0) discard;\n  float g = exp(-0.5 * r2);\n  fragColor = vec4(v_weight * g, 0.0, 0.0, 1.0);\n}\n`;\n\nconst FULLSCREEN_VERT_WEBGL = `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 a_position;\nlayout(location = 1) in vec2 a_uv;\nout vec2 v_uv;\nvoid main() {\n  gl_Position = vec4(a_position, 0.0, 1.0);\n  v_uv = a_uv;\n}\n`;\n\nconst COMPOSITE_FRAG_WEBGL = `#version 300 es\nprecision highp float;\nin vec2 v_uv;\nuniform sampler2D u_densityTex;\nuniform sampler2D u_colormapTex;\nuniform float u_weightScale;\nuniform int u_diverging;\nuniform int u_topographic;\nuniform float u_contourLevels;\nuniform float u_contourWidth;\nout vec4 fragColor;\n\nvoid main() {\n  float raw = texture(u_densityTex, v_uv).r * u_weightScale;\n  float s = 0.0;\n  float t = 0.0;\n  float alpha = 0.0;\n\n  if (u_diverging == 1) {\n    s = clamp(raw, -1.0, 1.0);\n    t = s * 0.5 + 0.5;\n    alpha = abs(s);\n  } else {\n    s = clamp(raw, 0.0, 1.0);\n    t = s;\n    alpha = s;\n  }\n\n  vec4 color = texture(u_colormapTex, vec2(t, 0.5));\n\n  if (u_topographic == 1) {\n    float base = abs(s);\n    float phase = fract(base * max(u_contourLevels, 1.0));\n    float contour = abs(phase - 0.5) * 2.0;\n    float width = max(u_contourWidth, 1e-4);\n    float line = clamp((width - contour) / width, 0.0, 1.0);\n    color.rgb = mix(color.rgb, vec3(0.0), line * 0.35);\n    alpha = clamp(alpha + line * 0.2, 0.0, 1.0);\n  }\n\n  fragColor = vec4(color.rgb, alpha * color.a);\n}\n`;\n\nconst COMPOSITE_LOG_RATIO_FRAG_WEBGL = `#version 300 es\nprecision highp float;\nin vec2 v_uv;\nuniform sampler2D u_numeratorTex;\nuniform sampler2D u_denominatorTex;\nuniform sampler2D u_colormapTex;\nuniform float u_epsilon;\nuniform float u_domainMax;\nuniform float u_supportFloor;\nuniform float u_supportCeil;\nuniform float u_numeratorTotal;\nuniform float u_denominatorTotal;\nuniform int u_supportCorrection;\nuniform int u_zScore;\nuniform int u_topographic;\nuniform float u_contourLevels;\nuniform float u_contourWidth;\nout vec4 fragColor;\n\nvoid main() {\n  float numerator = texture(u_numeratorTex, v_uv).r;\n  float denominator = texture(u_denominatorTex, v_uv).r;\n  float support = numerator + denominator;\n  float safeDomain = max(u_domainMax, 1e-6);\n  float safeSupportFloor = max(u_supportFloor, 0.0);\n  float safeSupportCeil = max(u_supportCeil, safeSupportFloor + 1e-9);\n  float raw = log((numerator + u_epsilon) / (denominator + u_epsilon));\n  float scalar = raw;\n  if (u_zScore == 1) {\n    float totalScale = max(max(u_numeratorTotal, u_denominatorTotal), 1.0);\n    float localEpsilon = max(u_epsilon * totalScale, 1e-12);\n    float numeratorCount = max(numerator * max(u_numeratorTotal, 0.0), 0.0);\n    float denominatorCount = max(denominator * max(u_denominatorTotal, 0.0), 0.0);\n    float variance = (1.0 / max(numeratorCount + localEpsilon, 1e-12))\n      + (1.0 / max(denominatorCount + localEpsilon, 1e-12));\n    scalar = raw / sqrt(max(variance, 1e-12));\n  }\n  float supportWeight = u_supportCorrection == 1\n    ? smoothstep(safeSupportFloor, safeSupportCeil, support)\n    : 1.0;\n  float s = clamp(scalar / safeDomain, -1.0, 1.0) * supportWeight;\n  float t = s * 0.5 + 0.5;\n  float alpha = abs(s);\n\n  vec4 color = texture(u_colormapTex, vec2(t, 0.5));\n\n  if (u_topographic == 1) {\n    float base = abs(s);\n    float phase = fract(base * max(u_contourLevels, 1.0));\n    float contour = abs(phase - 0.5) * 2.0;\n    float width = max(u_contourWidth, 1e-4);\n    float line = clamp((width - contour) / width, 0.0, 1.0);\n    color.rgb = mix(color.rgb, vec3(0.0), line * 0.35);\n    alpha = clamp(alpha + line * 0.2, 0.0, 1.0);\n  }\n\n  fragColor = vec4(color.rgb, alpha * color.a);\n}\n`;\n\nconst SPLAT_WGSL = /* wgsl */ `\nstruct DensityCamera {\n  viewProjection : mat4x4<f32>,\n  viewportDensity : vec4<f32>, // xy viewport, zw density\n  params : vec4<f32>, // x bandwidthPx, y nodeCount, z positionCount\n};\n\nstruct U32Data {\n  data : array<u32>,\n};\n\nstruct F32Data {\n  data : array<f32>,\n};\n\n@group(0) @binding(0) var<uniform> camera : DensityCamera;\n@group(0) @binding(1) var<storage, read> nodeIndices : U32Data;\n@group(0) @binding(2) var<storage, read> nodePositions : F32Data;\n@group(0) @binding(3) var<storage, read> nodeWeights : F32Data;\n\nstruct VSIn {\n  @location(0) corner : vec2<f32>,\n  @builtin(instance_index) instance : u32,\n};\n\nstruct VSOut {\n  @builtin(position) position : vec4<f32>,\n  @location(0) local : vec2<f32>,\n  @location(1) weight : f32,\n};\n\nfn isFiniteVec4(value : vec4<f32>) -> bool {\n  let finiteMagnitude = abs(value) < vec4<f32>(1e19);\n  let notNaN = value == value;\n  return all(finiteMagnitude) && all(notNaN);\n}\n\n@vertex\nfn vsMain(input : VSIn) -> VSOut {\n  var out : VSOut;\n\n  let nodeCount = u32(camera.params.y + 0.5);\n  if (input.instance >= nodeCount) {\n    out.position = vec4<f32>(2.0, 2.0, 0.0, 1.0);\n    out.local = vec2<f32>(0.0, 0.0);\n    out.weight = 0.0;\n    return out;\n  }\n\n  let nodeId = nodeIndices.data[input.instance];\n  let positionCount = u32(camera.params.z + 0.5);\n  if (nodeId >= positionCount) {\n    out.position = vec4<f32>(2.0, 2.0, 0.0, 1.0);\n    out.local = vec2<f32>(0.0, 0.0);\n    out.weight = 0.0;\n    return out;\n  }\n\n  let base = nodeId * 3u;\n  let position = vec3<f32>(\n    nodePositions.data[base + 0u],\n    nodePositions.data[base + 1u],\n    nodePositions.data[base + 2u],\n  );\n  let weight = nodeWeights.data[input.instance];\n\n  let clip = camera.viewProjection * vec4<f32>(position, 1.0);\n  let outsideClipDepth = clip.z < -clip.w || clip.z > clip.w;\n  if (!isFiniteVec4(clip) || abs(clip.w) < 1e-6 || clip.w <= 0.0 || outsideClipDepth) {\n    out.position = vec4<f32>(2.0, 2.0, 0.0, 1.0);\n    out.local = vec2<f32>(0.0, 0.0);\n    out.weight = 0.0;\n    return out;\n  }\n\n  let ndc = clip.xy / clip.w;\n  let densitySize = max(camera.viewportDensity.zw, vec2<f32>(1.0, 1.0));\n  let center = vec2<f32>(\n    (ndc.x * 0.5 + 0.5) * densitySize.x,\n    (1.0 - (ndc.y * 0.5 + 0.5)) * densitySize.y,\n  );\n\n  let viewportSize = max(camera.viewportDensity.xy, vec2<f32>(1.0, 1.0));\n  let sigma = max(0.6, camera.params.x * (densitySize.x / viewportSize.x));\n  let offset = input.corner * (sigma * 3.0);\n  let px = center + offset;\n\n  let outNdc = vec2<f32>(\n    (px.x / densitySize.x) * 2.0 - 1.0,\n    1.0 - (px.y / densitySize.y) * 2.0,\n  );\n\n  out.position = vec4<f32>(outNdc, 0.0, 1.0);\n  out.local = offset / max(sigma, 1e-4);\n  out.weight = weight;\n  return out;\n}\n\n@fragment\nfn fsMain(input : VSOut) -> @location(0) vec4<f32> {\n  let r2 = dot(input.local, input.local);\n  if (r2 > 9.0) {\n    discard;\n  }\n  let g = exp(-0.5 * r2);\n  return vec4<f32>(input.weight * g, 0.0, 0.0, 1.0);\n}\n`;\n\nconst COMPOSITE_WGSL = /* wgsl */ `\nstruct CompositeParams {\n  values : vec4<f32>, // x weightScale, y divergingFlag, z topographicFlag, w contourLevels\n  values2 : vec4<f32>, // x contourWidth\n};\n\nstruct VSOut {\n  @builtin(position) position : vec4<f32>,\n  @location(0) uv : vec2<f32>,\n};\n\n@vertex\nfn vsMain(@location(0) position : vec2<f32>, @location(1) uv : vec2<f32>) -> VSOut {\n  var out : VSOut;\n  out.position = vec4<f32>(position, 0.0, 1.0);\n  out.uv = uv;\n  return out;\n}\n\n@group(0) @binding(0) var densitySampler : sampler;\n@group(0) @binding(1) var densityTexture : texture_2d<f32>;\n@group(0) @binding(2) var colormapTexture : texture_2d<f32>;\n@group(0) @binding(3) var<uniform> params : CompositeParams;\n\n@fragment\nfn fsMain(input : VSOut) -> @location(0) vec4<f32> {\n  // WebGPU render targets use a top-left origin; flip Y when resolving from an offscreen texture.\n  let uvFlipped = vec2<f32>(input.uv.x, 1.0 - input.uv.y);\n  let raw = textureSample(densityTexture, densitySampler, uvFlipped).r * params.values.x;\n  let diverging = params.values.y > 0.5;\n  let topographic = params.values.z > 0.5;\n\n  var s = 0.0;\n  var t = 0.0;\n  var alpha = 0.0;\n\n  if (diverging) {\n    s = clamp(raw, -1.0, 1.0);\n    t = s * 0.5 + 0.5;\n    alpha = abs(s);\n  } else {\n    s = clamp(raw, 0.0, 1.0);\n    t = s;\n    alpha = s;\n  }\n\n  var color = textureSample(colormapTexture, densitySampler, vec2<f32>(t, 0.5));\n\n  if (topographic) {\n    let contourLevels = max(params.values.w, 1.0);\n    let contourWidth = max(params.values2.x, 1e-4);\n    let base = abs(s);\n    let phase = fract(base * contourLevels);\n    let contour = abs(phase - 0.5) * 2.0;\n    let line = clamp((contourWidth - contour) / contourWidth, 0.0, 1.0);\n    color = vec4<f32>(mix(color.rgb, vec3<f32>(0.0), line * 0.35), color.a);\n    alpha = clamp(alpha + line * 0.2, 0.0, 1.0);\n  }\n\n  return vec4<f32>(color.rgb, alpha * color.a);\n}\n`;\n\nconst COMPOSITE_LOG_RATIO_WGSL = /* wgsl */ `\nstruct LogRatioCompositeParams {\n  values : vec4<f32>, // x epsilon, y domainMax, z supportFloor, w topographicFlag\n  values2 : vec4<f32>, // x contourLevels, y contourWidth, z supportCeil, w supportCorrectionFlag\n  values3 : vec4<f32>, // x numeratorTotal, y denominatorTotal, z zScoreFlag\n};\n\nstruct VSOut {\n  @builtin(position) position : vec4<f32>,\n  @location(0) uv : vec2<f32>,\n};\n\n@vertex\nfn vsMain(@location(0) position : vec2<f32>, @location(1) uv : vec2<f32>) -> VSOut {\n  var out : VSOut;\n  out.position = vec4<f32>(position, 0.0, 1.0);\n  out.uv = uv;\n  return out;\n}\n\n@group(0) @binding(0) var densitySampler : sampler;\n@group(0) @binding(1) var numeratorTexture : texture_2d<f32>;\n@group(0) @binding(2) var denominatorTexture : texture_2d<f32>;\n@group(0) @binding(3) var colormapTexture : texture_2d<f32>;\n@group(0) @binding(4) var<uniform> params : LogRatioCompositeParams;\n\n@fragment\nfn fsMain(input : VSOut) -> @location(0) vec4<f32> {\n  let uvFlipped = vec2<f32>(input.uv.x, 1.0 - input.uv.y);\n  let numerator = textureSampleLevel(numeratorTexture, densitySampler, uvFlipped, 0.0).r;\n  let denominator = textureSampleLevel(denominatorTexture, densitySampler, uvFlipped, 0.0).r;\n  let support = numerator + denominator;\n  let epsilon = max(params.values.x, 1e-12);\n  let domainMax = max(params.values.y, 1e-6);\n  let supportFloor = max(params.values.z, 0.0);\n  let supportCeil = max(params.values2.z, supportFloor + 1e-9);\n  let supportCorrection = params.values2.w > 0.5;\n  let numeratorTotal = max(params.values3.x, 0.0);\n  let denominatorTotal = max(params.values3.y, 0.0);\n  let zScoreEnabled = params.values3.z > 0.5;\n  let topographic = params.values.w > 0.5;\n\n  let raw = log((numerator + epsilon) / (denominator + epsilon));\n  var scalar = raw;\n  if (zScoreEnabled) {\n    let totalScale = max(max(numeratorTotal, denominatorTotal), 1.0);\n    let localEpsilon = max(epsilon * totalScale, 1e-12);\n    let numeratorCount = max(numerator * numeratorTotal, 0.0);\n    let denominatorCount = max(denominator * denominatorTotal, 0.0);\n    let variance = (1.0 / max(numeratorCount + localEpsilon, 1e-12))\n      + (1.0 / max(denominatorCount + localEpsilon, 1e-12));\n    scalar = raw / sqrt(max(variance, 1e-12));\n  }\n  let supportWeight = select(1.0, smoothstep(supportFloor, supportCeil, support), supportCorrection);\n  let s = clamp(scalar / domainMax, -1.0, 1.0) * supportWeight;\n  let t = s * 0.5 + 0.5;\n  var alpha = abs(s);\n\n  var color = textureSampleLevel(colormapTexture, densitySampler, vec2<f32>(t, 0.5), 0.0);\n\n  if (topographic) {\n    let contourLevels = max(params.values2.x, 1.0);\n    let contourWidth = max(params.values2.y, 1e-4);\n    let base = abs(s);\n    let phase = fract(base * contourLevels);\n    let contour = abs(phase - 0.5) * 2.0;\n    let line = clamp((contourWidth - contour) / contourWidth, 0.0, 1.0);\n    color = vec4<f32>(mix(color.rgb, vec3<f32>(0.0), line * 0.35), color.a);\n    alpha = clamp(alpha + line * 0.2, 0.0, 1.0);\n  }\n\n  return vec4<f32>(color.rgb, alpha * color.a);\n}\n`;\n\nfunction normalizeComparisonMode(value, fallback = 'difference') {\n  if (value === 'logRatio') return 'logRatio';\n  if (value === 'difference') return 'difference';\n  return fallback;\n}\n\nfunction hasComparisonTarget(compareProperty) {\n  return typeof compareProperty === 'string'\n    && compareProperty.trim().length > 0\n    && compareProperty.trim() !== 'None';\n}\n\nfunction resolveCompareProperty(property, compareProperty) {\n  const propertyKey = typeof property === 'string' ? property.trim() : '';\n  const compareKey = typeof compareProperty === 'string' ? compareProperty.trim() : '';\n  if (!compareKey || compareKey === 'None') return 'None';\n  if (propertyKey && compareKey === propertyKey) return 'None';\n  return compareKey;\n}\n\nfunction resolveComparisonMode(compareProperty, requestedMode, fallback = 'difference') {\n  return hasComparisonTarget(compareProperty) && requestedMode === 'logRatio'\n    ? 'logRatio'\n    : fallback;\n}\n\nfunction defaultDensityConfig() {\n  return {\n    enabled: false,\n    qualityScale: 0.1,\n    topographic: false,\n    scaleWithZoom: false,\n    bandwidth: 28.1,\n    weightScale: 398.1071705534973,\n    property: 'Uniform',\n    compareProperty: 'None',\n    comparisonMode: 'difference',\n    normalizeVs: false,\n    epsilon: 1e-6,\n    logRatioRange: 3,\n    maskThreshold: 0,\n    logRatioZScore: false,\n    logRatioSupportCorrection: true,\n    colormap: 'interpolateOrRd',\n    logRatioColormap: 'cmasher:prinsenvlag',\n    divergingColormap: 'cmasher:prinsenvlag',\n    interactionFilter: 'auto',\n  };\n}\n\nfunction normalizeInteractionFilter(value, fallback = 'auto') {\n  const raw = String(value ?? '').trim();\n  return ['auto', 'off', 'selected', 'highlighted', 'selected-or-highlighted'].includes(raw)\n    ? raw\n    : fallback;\n}\n\nexport class DensityLayer extends Layer {\n  constructor(options = {}) {\n    super('density-layer');\n    this.getGraphLayer = options.getGraphLayer ?? (() => null);\n    this.withBufferAccess = options.withBufferAccess ?? ((fn) => fn());\n    this.getNodePositionView = options.getNodePositionView ?? (() => null);\n    this.getNodePositionInfo = options.getNodePositionInfo ?? null;\n    this.onRuntimeState = options.onRuntimeState ?? (() => {});\n\n    this.config = { ...defaultDensityConfig(), ...(options.initialConfig ?? {}) };\n    this.runtime = { diverging: false, valueDomain: null };\n    this.version = 0;\n\n    this._weightArray = null;\n    this._lastWeightCount = 0;\n    this._logRatioWeights = {\n      count: 0,\n      numerator: null,\n      denominator: null,\n    };\n    this._activeNodeIndicesArray = null;\n    this._activeEdgeIndicesArray = null;\n    this._activeIndexScratch = {\n      node: null,\n      edge: null,\n    };\n\n    this._degreeCache = {\n      network: null,\n      edgeVersion: -1,\n      usesOverride: false,\n      values: null,\n    };\n    this._zoomScaleDistanceRef3D = null;\n\n    this.webgl = {\n      ready: false,\n      extColorFloat: false,\n      programSplat: null,\n      programComposite: null,\n      programCompositeLogRatio: null,\n      vaoSplat: null,\n      vaoQuad: null,\n      cornerBuffer: null,\n      quadBuffer: null,\n      densityFbo: null,\n      densityTex: null,\n      densityWidth: 0,\n      densityHeight: 0,\n      numeratorFbo: null,\n      numeratorTex: null,\n      numeratorWidth: 0,\n      numeratorHeight: 0,\n      denominatorFbo: null,\n      denominatorTex: null,\n      denominatorWidth: 0,\n      denominatorHeight: 0,\n      nodeIndicesTex: null,\n      nodeIndicesLayout: null,\n      nodeIndicesMeta: null,\n      nodeWeightsTex: null,\n      nodeWeightsLayout: null,\n      nodeWeightsMeta: null,\n      numeratorWeightsTex: null,\n      numeratorWeightsLayout: null,\n      numeratorWeightsMeta: null,\n      denominatorWeightsTex: null,\n      denominatorWeightsLayout: null,\n      denominatorWeightsMeta: null,\n      fallbackPositionsTex: null,\n      fallbackPositionsLayout: null,\n      fallbackPositionsMeta: null,\n      colormapTex: null,\n      colormapKey: null,\n      colormapDiverging: null,\n      uniforms: {\n        splat: {},\n        composite: {},\n        compositeLogRatio: {},\n      },\n      fallbackPositionCount: 0,\n    };\n\n    this.webgpu = {\n      ready: false,\n      pipelineSplat: null,\n      pipelineComposite: null,\n      pipelineCompositeLogRatio: null,\n      bindGroupSplat: null,\n      bindGroupComposite: null,\n      bindGroupCompositeLogRatio: null,\n      cameraBuffer: null,\n      compositeParamsBuffer: null,\n      compositeLogRatioParamsBuffer: null,\n      cornersBuffer: null,\n      sampler: null,\n      densityTexture: null,\n      densitySize: { width: 0, height: 0 },\n      numeratorTexture: null,\n      denominatorTexture: null,\n      logRatioSize: { width: 0, height: 0 },\n      colormapTexture: null,\n      colormapKey: null,\n      colormapDiverging: null,\n      fallbackNodeIndicesVersion: null,\n      fallbackNodePositionVersion: null,\n      weightUploadVersion: 0,\n    };\n  }\n\n  getConfig() {\n    return {\n      ...this.config,\n      diverging: this.runtime.diverging,\n      valueDomain: Array.isArray(this.runtime.valueDomain) ? [...this.runtime.valueDomain] : null,\n    };\n  }\n\n  setConfig(next = {}) {\n    if (!next || typeof next !== 'object') return this;\n    const wasZoomScaled = this.config.scaleWithZoom === true;\n    const merged = { ...this.config, ...next };\n    merged.enabled = merged.enabled === true;\n    merged.topographic = merged.topographic === true;\n    merged.normalizeVs = merged.normalizeVs === true;\n    merged.logRatioZScore = merged.logRatioZScore === true;\n    merged.logRatioSupportCorrection = merged.logRatioSupportCorrection !== false;\n    merged.interactionFilter = normalizeInteractionFilter(\n      merged.interactionFilter ?? merged.densityInteractionFilter,\n      this.config.interactionFilter,\n    );\n    merged.scaleWithZoom = merged.scaleWithZoom === true;\n    merged.comparisonMode = normalizeComparisonMode(merged.comparisonMode, this.config.comparisonMode);\n    merged.qualityScale = clamp(toFiniteNumber(merged.qualityScale, this.config.qualityScale), 0.03, 1.0);\n    merged.bandwidth = clamp(toFiniteNumber(merged.bandwidth, this.config.bandwidth), 0.05, 1000);\n    merged.weightScale = clamp(toFiniteNumber(merged.weightScale, this.config.weightScale), 0, 1e8);\n    merged.epsilon = clamp(toFiniteNumber(merged.epsilon, this.config.epsilon), 1e-12, 1);\n    merged.logRatioRange = clamp(toFiniteNumber(merged.logRatioRange, this.config.logRatioRange), 1e-3, 1e3);\n    merged.maskThreshold = clamp(toFiniteNumber(merged.maskThreshold, this.config.maskThreshold), 0, 1);\n    merged.property = typeof merged.property === 'string' && merged.property.trim()\n      ? merged.property.trim()\n      : 'Uniform';\n    merged.compareProperty = typeof merged.compareProperty === 'string' && merged.compareProperty.trim()\n      ? merged.compareProperty.trim()\n      : 'None';\n    merged.compareProperty = resolveCompareProperty(merged.property, merged.compareProperty);\n    merged.comparisonMode = resolveComparisonMode(merged.compareProperty, merged.comparisonMode);\n    merged.colormap = typeof merged.colormap === 'string' && merged.colormap.trim()\n      ? merged.colormap.trim()\n      : this.config.colormap;\n    merged.logRatioColormap = typeof merged.logRatioColormap === 'string' && merged.logRatioColormap.trim()\n      ? merged.logRatioColormap.trim()\n      : this.config.logRatioColormap;\n    merged.divergingColormap = typeof merged.divergingColormap === 'string' && merged.divergingColormap.trim()\n      ? merged.divergingColormap.trim()\n      : this.config.divergingColormap;\n\n    this.config = merged;\n    if (merged.comparisonMode !== 'logRatio') {\n      this.runtime.diverging = false;\n      this.runtime.valueDomain = null;\n    }\n    if (!merged.scaleWithZoom || !wasZoomScaled) {\n      this._zoomScaleDistanceRef3D = null;\n    }\n    this.version += 1;\n    return this;\n  }\n\n  resolveSplatBandwidthPx(camera, cameraUniforms) {\n    const base = clamp(toFiniteNumber(this.config.bandwidth, 28.1), 0.05, 1000);\n    if (this.config.scaleWithZoom !== true) return base;\n\n    const mode = cameraUniforms?.mode ?? camera?.mode ?? null;\n    if (mode === '2d') {\n      this._zoomScaleDistanceRef3D = null;\n      const zoomRaw = camera?.zoom ?? cameraUniforms?.view?.[0];\n      const zoom = clamp(Math.abs(toFiniteNumber(zoomRaw, 1)), 1e-3, 10);\n      return base * zoom;\n    }\n    if (mode === '3d') {\n      const distance = Math.abs(toFiniteNumber(camera?.distance, NaN));\n      if (!Number.isFinite(distance) || distance <= 1e-6) return base;\n      if (!Number.isFinite(this._zoomScaleDistanceRef3D) || this._zoomScaleDistanceRef3D <= 1e-6) {\n        this._zoomScaleDistanceRef3D = distance;\n      }\n      const factor = clamp(this._zoomScaleDistanceRef3D / distance, 0.1, 20);\n      return base * factor;\n    }\n    return base;\n  }\n\n  initialize(device, size) {\n    super.initialize(device, size);\n    if (device?.type === 'webgl2') {\n      this.initializeWebGL(device, size);\n    } else if (device?.type === 'webgpu') {\n      this.initializeWebGPU(device, size);\n    }\n  }\n\n  resize(size) {\n    super.resize(size);\n    this.webgl.densityWidth = 0;\n    this.webgl.densityHeight = 0;\n    this.webgpu.densitySize = { width: 0, height: 0 };\n  }\n\n  destroy() {\n    this.destroyWebGL();\n    this.destroyWebGPU();\n    this.releaseAllActiveIndexScratch();\n  }\n\n  render(context, frame) {\n    const cfg = this.config;\n    if (!cfg.enabled) return;\n    const network = frame?.network ?? null;\n    const camera = frame?.camera ?? null;\n    if (!network || !camera) return;\n\n    const uniforms = camera?.getUniforms?.();\n    if (!uniforms || !matrixHasFiniteValues(uniforms.viewProjection)) return;\n    this.withBufferAccess(() => {\n      const computed = this.computeWeightsUnsafe(network, cfg);\n      if (!computed || computed.count <= 0) return;\n\n      this.runtime.diverging = computed.diverging;\n      this.runtime.valueDomain = Array.isArray(computed.valueDomain) ? [...computed.valueDomain] : null;\n      this.onRuntimeState?.({\n        diverging: computed.diverging,\n        valueDomain: this.runtime.valueDomain,\n      });\n\n      if (context.type === 'webgl2') {\n        this.renderWebGL(context, frame, uniforms, computed);\n        return;\n      }\n      if (context.type === 'webgpu') {\n        this.renderWebGPU(context, frame, uniforms, computed);\n      }\n    });\n  }\n\n  canUseWasmNodeIndexWriter(network) {\n    if (!network) return false;\n    const module = network.module ?? null;\n    return Boolean(\n      module\n      && typeof module._malloc === 'function'\n      && typeof module._free === 'function'\n      && module.HEAPU32\n      && typeof network.writeActiveNodes === 'function',\n    );\n  }\n\n  canUseWasmEdgeIndexWriter(network) {\n    if (!network) return false;\n    return typeof network.writeActiveEdges === 'function' && this.canUseWasmNodeIndexWriter(network);\n  }\n\n  releaseActiveIndexScratch(scope) {\n    const current = this._activeIndexScratch?.[scope] ?? null;\n    if (!current) return;\n    try {\n      if (current.ptr && typeof current.module?._free === 'function') {\n        current.module._free(current.ptr);\n      }\n    } catch (error) {\n      console.warn(`DensityLayer: failed to release ${scope} active-index scratch buffer.`, error);\n    }\n    this._activeIndexScratch[scope] = null;\n  }\n\n  releaseAllActiveIndexScratch() {\n    this.releaseActiveIndexScratch('node');\n    this.releaseActiveIndexScratch('edge');\n  }\n\n  ensureActiveIndexScratch(network, scope, requiredCount) {\n    const module = network?.module ?? null;\n    if (!module) return null;\n    const nextRequired = Math.max(1, Math.floor(Number(requiredCount) || 0));\n    const existing = this._activeIndexScratch?.[scope] ?? null;\n    if (existing && existing.module !== module) {\n      this.releaseActiveIndexScratch(scope);\n    }\n\n    const current = this._activeIndexScratch?.[scope] ?? null;\n    if (current?.ptr && current.capacity >= nextRequired) {\n      return current;\n    }\n\n    const bytes = nextRequired * Uint32Array.BYTES_PER_ELEMENT;\n    const ptr = module._malloc(bytes);\n    if (!ptr) {\n      throw new Error(`Failed to allocate WASM scratch buffer for active ${scope} indices`);\n    }\n    if (current?.ptr) {\n      try {\n        current.module?._free?.(current.ptr);\n      } catch (error) {\n        console.warn(`DensityLayer: failed to release old ${scope} active-index scratch buffer.`, error);\n      }\n    }\n    const next = {\n      module,\n      ptr,\n      capacity: nextRequired,\n    };\n    this._activeIndexScratch[scope] = next;\n    return next;\n  }\n\n  computeWeights(network, config) {\n    return this.withBufferAccess(() => this.computeWeightsUnsafe(network, config));\n  }\n\n  computeNodeIndexVersion(nodeIndices, count = nodeIndices?.length ?? 0) {\n    if (!nodeIndices || count <= 0) return 'empty';\n    let hash = 2166136261 >>> 0;\n    for (let i = 0; i < count; i += 1) {\n      hash ^= (Number(nodeIndices[i] ?? 0) >>> 0);\n      hash = Math.imul(hash, 16777619) >>> 0;\n    }\n    return `${count}:${hash.toString(16)}`;\n  }\n\n  computeWeightsUnsafe(network, config) {\n    const compareEnabled = config.compareProperty && config.compareProperty !== 'None';\n    const needsEdgeIndices = config.property === 'Degree' || (compareEnabled && config.compareProperty === 'Degree');\n    const useWasmNodeWriter = this.canUseWasmNodeIndexWriter(network);\n    const useWasmEdgeWriter = needsEdgeIndices && this.canUseWasmEdgeIndexWriter(network);\n\n    let fallbackNodeIndices = null;\n    let fallbackEdgeIndices = null;\n    if (!useWasmNodeWriter) {\n      fallbackNodeIndices = network?.nodeIndices ?? null;\n    }\n    if (needsEdgeIndices && !useWasmEdgeWriter) {\n      fallbackEdgeIndices = network?.edgeIndices ?? null;\n    }\n\n    if (useWasmNodeWriter) {\n      this.ensureActiveIndexScratch(network, 'node', network?.nodeCount ?? 0);\n    }\n    if (needsEdgeIndices && useWasmEdgeWriter) {\n      this.ensureActiveIndexScratch(network, 'edge', network?.edgeCount ?? 0);\n    }\n\n    let result = null;\n    let overflowRequest = null;\n    for (let attempt = 0; attempt < 3; attempt += 1) {\n      overflowRequest = null;\n      let nodeIndices = fallbackNodeIndices;\n      let edgeIndices = fallbackEdgeIndices;\n\n      if (useWasmNodeWriter) {\n        const module = network?.module ?? null;\n        const nodeScratch = this._activeIndexScratch?.node ?? null;\n        if (!module || !nodeScratch?.ptr || nodeScratch.module !== module) {\n          nodeIndices = null;\n        } else {\n          const target = new Uint32Array(module.HEAPU32.buffer, nodeScratch.ptr, nodeScratch.capacity);\n          const required = Math.max(0, Math.floor(Number(network.writeActiveNodes(target) || 0)));\n          if (required > nodeScratch.capacity) {\n            overflowRequest = { scope: 'node', count: required };\n          } else {\n            nodeIndices = target.subarray(0, required);\n          }\n        }\n      }\n\n      if (!overflowRequest && needsEdgeIndices && useWasmEdgeWriter) {\n        const module = network?.module ?? null;\n        const edgeScratch = this._activeIndexScratch?.edge ?? null;\n        if (!module || !edgeScratch?.ptr || edgeScratch.module !== module) {\n          edgeIndices = null;\n        } else {\n          const target = new Uint32Array(module.HEAPU32.buffer, edgeScratch.ptr, edgeScratch.capacity);\n          const required = Math.max(0, Math.floor(Number(network.writeActiveEdges(target) || 0)));\n          if (required > edgeScratch.capacity) {\n            overflowRequest = { scope: 'edge', count: required };\n          } else {\n            edgeIndices = target.subarray(0, required);\n          }\n        }\n      }\n\n      if (overflowRequest) {\n        // retry after growing scratch storage\n      } else {\n        const count = nodeIndices?.length ?? 0;\n        if (!count) {\n          result = {\n            mode: 'difference',\n            nodeIndices: null,\n            count: 0,\n            weights: null,\n            diverging: false,\n            positionCount: Math.max(0, Math.floor(Number(network?.nodeCount ?? 0))),\n            colormapKey: config.colormap,\n            valueDomain: null,\n          };\n        } else {\n          const focusedNodeIndices = this.applyInteractionFilter(network, config, nodeIndices);\n          const focusedCount = focusedNodeIndices?.length ?? 0;\n          result = config.comparisonMode === 'logRatio'\n            ? this.buildLogRatioComputed(network, config, focusedNodeIndices, edgeIndices, focusedCount)\n            : this.buildDifferenceComputed(network, config, focusedNodeIndices, edgeIndices, focusedCount);\n          if (result) {\n            result.nodeIndexVersion = this.computeNodeIndexVersion(result.nodeIndices, result.count);\n            result.usesActiveNodeIndexBuffer = result.nodeIndices === nodeIndices;\n          }\n        }\n      }\n\n      if (!overflowRequest) {\n        return result ?? {\n          mode: 'difference',\n          nodeIndices: null,\n          count: 0,\n          weights: null,\n          diverging: false,\n          positionCount: Math.max(0, Math.floor(Number(network?.nodeCount ?? 0))),\n          colormapKey: config.colormap,\n          valueDomain: null,\n        };\n      }\n      this.ensureActiveIndexScratch(network, overflowRequest.scope, overflowRequest.count);\n    }\n\n    return result ?? {\n      mode: 'difference',\n      nodeIndices: null,\n      count: 0,\n      weights: null,\n      diverging: false,\n      positionCount: Math.max(0, Math.floor(Number(network?.nodeCount ?? 0))),\n      colormapKey: config.colormap,\n      valueDomain: null,\n    };\n  }\n\n  applyInteractionFilter(network, config, nodeIndices) {\n    const mode = normalizeInteractionFilter(config?.interactionFilter, 'auto');\n    if (mode === 'off' || !nodeIndices?.length) return nodeIndices;\n    let stateView = null;\n    try {\n      stateView = network?.getNodeAttributeBuffer?.(NODE_STATE_ATTRIBUTE)?.view ?? null;\n    } catch (_) {\n      stateView = null;\n    }\n    if (!stateView) return nodeIndices;\n    const selected = [];\n    const highlighted = [];\n    for (let i = 0; i < nodeIndices.length; i += 1) {\n      const id = nodeIndices[i] >>> 0;\n      const state = Number(stateView[id] ?? 0) >>> 0;\n      if ((state & 2) !== 0) selected.push(id);\n      if ((state & 4) !== 0) highlighted.push(id);\n    }\n    let focus = null;\n    if (mode === 'selected') focus = selected.length ? selected : null;\n    else if (mode === 'highlighted') focus = highlighted.length ? highlighted : null;\n    else if (mode === 'selected-or-highlighted' || mode === 'auto') {\n      focus = selected.length ? selected : (highlighted.length ? highlighted : null);\n    }\n    return focus ? Uint32Array.from(focus) : nodeIndices;\n  }\n\n  buildDifferenceComputed(network, config, nodeIndices, edgeIndices, count) {\n    if (!this._weightArray || this._lastWeightCount !== count) {\n      this._weightArray = new Float32Array(count);\n      this._lastWeightCount = count;\n    }\n    const weights = this._weightArray;\n\n    const primaryReader = this.makePropertyReader(network, config.property, edgeIndices);\n    const compareReader = config.compareProperty && config.compareProperty !== 'None'\n      ? this.makePropertyReader(network, config.compareProperty, edgeIndices)\n      : null;\n\n    let totalWeight = 0;\n    let totalNegative = 0;\n    let totalPositive = 0;\n\n    for (let i = 0; i < count; i += 1) {\n      const nodeId = nodeIndices[i] >>> 0;\n      const primary = primaryReader(nodeId);\n      const compare = compareReader ? compareReader(nodeId) : 0;\n      let value = compareReader ? (compare - primary) : primary;\n      if (!Number.isFinite(value)) value = 0;\n      weights[i] = value;\n      const abs = Math.abs(value);\n      totalWeight += abs;\n      if (value < 0) totalNegative += value;\n      else totalPositive += value;\n    }\n\n    let diverging = false;\n    if (totalWeight > 0 && totalNegative === 0) {\n      for (let i = 0; i < count; i += 1) {\n        weights[i] /= totalWeight;\n      }\n      diverging = false;\n    } else {\n      diverging = totalWeight > 0;\n      let totalPositiveMax = Math.max(Math.abs(totalNegative), Math.abs(totalPositive));\n      let totalNegativeMax = Math.max(Math.abs(totalNegative), Math.abs(totalPositive));\n      if (config.normalizeVs) {\n        totalPositiveMax = Math.max(Math.abs(totalPositive), 1e-9);\n        totalNegativeMax = Math.max(Math.abs(totalNegative), 1e-9);\n      }\n\n      for (let i = 0; i < count; i += 1) {\n        const value = weights[i];\n        if (value < 0 && totalNegative < 0) {\n          weights[i] = value / Math.max(totalNegativeMax, 1e-9);\n        } else if (value > 0 && totalPositive > 0) {\n          weights[i] = value / Math.max(totalPositiveMax, 1e-9);\n        } else if (totalWeight > 0) {\n          weights[i] = value / totalWeight;\n        } else {\n          weights[i] = 0;\n        }\n      }\n    }\n\n    const colormapKey = diverging ? config.divergingColormap : config.colormap;\n    return {\n      mode: 'difference',\n      nodeIndices,\n      count,\n      weights,\n      diverging,\n      positionCount: Math.max(0, Math.floor(Number(network?.nodeCount ?? 0))),\n      colormapKey,\n      valueDomain: null,\n    };\n  }\n\n  buildLogRatioComputed(network, config, nodeIndices, edgeIndices, count) {\n    if (!this._logRatioWeights.numerator || !this._logRatioWeights.denominator || this._logRatioWeights.count !== count) {\n      this._logRatioWeights = {\n        count,\n        numerator: new Float32Array(count),\n        denominator: new Float32Array(count),\n      };\n    }\n\n    const numeratorWeights = this._logRatioWeights.numerator;\n    const denominatorWeights = this._logRatioWeights.denominator;\n    const numeratorReader = this.makePropertyReader(network, config.property, edgeIndices);\n    const baselineKey = config.compareProperty;\n    const denominatorReader = this.makePropertyReader(network, baselineKey, edgeIndices);\n\n    let numeratorTotal = 0;\n    let denominatorTotal = 0;\n\n    for (let i = 0; i < count; i += 1) {\n      const nodeId = nodeIndices[i] >>> 0;\n      const numerator = Math.max(0, toFiniteNumber(numeratorReader(nodeId), 0));\n      const denominator = Math.max(0, toFiniteNumber(denominatorReader(nodeId), 0));\n      numeratorWeights[i] = numerator;\n      denominatorWeights[i] = denominator;\n      numeratorTotal += numerator;\n      denominatorTotal += denominator;\n    }\n\n    if (denominatorTotal <= 0) {\n      return {\n        mode: 'logRatio',\n        nodeIndices: null,\n        count: 0,\n        numeratorWeights: null,\n        denominatorWeights: null,\n        diverging: true,\n        positionCount: Math.max(0, Math.floor(Number(network?.nodeCount ?? 0))),\n        colormapKey: config.logRatioColormap ?? config.divergingColormap,\n        valueDomain: [-config.logRatioRange, config.logRatioRange],\n        baselineLabel: baselineKey,\n        numeratorTotal: 0,\n        denominatorTotal,\n      };\n    }\n\n    for (let i = 0; i < count; i += 1) {\n      numeratorWeights[i] = numeratorTotal > 0 ? (numeratorWeights[i] / numeratorTotal) : 0;\n      denominatorWeights[i] = denominatorWeights[i] / denominatorTotal;\n    }\n\n    return {\n      mode: 'logRatio',\n      nodeIndices,\n      count,\n      numeratorWeights,\n      denominatorWeights,\n      diverging: true,\n      positionCount: Math.max(0, Math.floor(Number(network?.nodeCount ?? 0))),\n      colormapKey: config.logRatioColormap ?? config.divergingColormap,\n      valueDomain: [-config.logRatioRange, config.logRatioRange],\n      baselineLabel: baselineKey,\n      numeratorTotal,\n      denominatorTotal,\n    };\n  }\n\n  makePropertyReader(network, propertyName, edgeIndices = null) {\n    const key = typeof propertyName === 'string' ? propertyName.trim() : '';\n    if (!key || key === 'Uniform') {\n      return () => 1;\n    }\n    if (key === 'Degree') {\n      const degree = this.getDegreeValues(network, edgeIndices);\n      return (nodeId) => degree?.[nodeId] ?? 0;\n    }\n\n    let buffer = null;\n    let dimension = 1;\n    try {\n      const attrBuffer = network.getNodeAttributeBuffer?.(key) ?? null;\n      if (!attrBuffer?.view) {\n        return () => 0;\n      }\n      buffer = attrBuffer.view;\n      dimension = Math.max(1, Math.floor(attrBuffer.dimension ?? 1));\n    } catch (_) {\n      return () => 0;\n    }\n\n    return (nodeId) => {\n      const offset = nodeId * dimension;\n      if (offset < 0 || offset >= buffer.length) return 0;\n      const value = buffer[offset];\n      return Number.isFinite(value) ? value : 0;\n    };\n  }\n\n  getDegreeValues(network, edgeIndicesOverride = null) {\n    let edgeVersion = 0;\n    const usesOverride = edgeIndicesOverride instanceof Uint32Array;\n    try {\n      edgeVersion = toFiniteNumber(network?.getTopologyVersions?.()?.edge, 0);\n    } catch (error) {\n      console.warn('DensityLayer: failed to read edge topology version; using conservative degree-cache fallback.', error);\n      edgeVersion = toFiniteNumber(edgeIndicesOverride?.length ?? network?.edgeCount, 0);\n    }\n\n    const sameCache = (\n      this._degreeCache.network === network\n      && this._degreeCache.edgeVersion === edgeVersion\n      && this._degreeCache.usesOverride === usesOverride\n      && this._degreeCache.values\n    );\n    if (sameCache) {\n      return this._degreeCache.values;\n    }\n\n    const nodeCount = Math.max(0, Math.floor(Number(network?.nodeCount ?? 0)));\n    const degrees = new Float32Array(nodeCount);\n    this.withBufferAccess(() => {\n      const edgeIndices = edgeIndicesOverride ?? network?.edgeIndices ?? null;\n      const edgesView = network?.edgesView ?? null;\n      if (!edgesView || !edgeIndices || !edgeIndices.length) return;\n      for (let i = 0; i < edgeIndices.length; i += 1) {\n        const edgeId = edgeIndices[i] >>> 0;\n        const base = edgeId * 2;\n        const source = edgesView[base] >>> 0;\n        const target = edgesView[base + 1] >>> 0;\n        if (source < degrees.length) degrees[source] += 1;\n        if (target < degrees.length) degrees[target] += 1;\n      }\n    });\n\n    this._degreeCache = {\n      network,\n      edgeVersion,\n      usesOverride,\n      values: degrees,\n    };\n    return degrees;\n  }\n\n  readNodePositionInfo(network) {\n    let info = null;\n    this.withBufferAccess(() => {\n      const supplied = this.getNodePositionInfo?.(network) ?? null;\n      if (supplied && typeof supplied === 'object') {\n        const view = supplied.view ?? null;\n        const fallbackCount = view && Number.isFinite(view.length) ? Math.floor(view.length / 3) : 0;\n        const count = Number.isFinite(supplied.count)\n          ? Math.max(0, Math.floor(Number(supplied.count)))\n          : fallbackCount;\n        const version = Number.isFinite(supplied.version) ? Number(supplied.version) : null;\n        info = { view, count, version };\n        return;\n      }\n\n      const view = this.getNodePositionView?.(network) ?? null;\n      const count = view && Number.isFinite(view.length) ? Math.floor(view.length / 3) : 0;\n      info = { view, count, version: null };\n    });\n    return info ?? { view: null, count: 0, version: null };\n  }\n\n  isDelegatePositionSourceActive(graphLayer) {\n    return Boolean(graphLayer?.positionDelegate);\n  }\n\n  initializeWebGL(device) {\n    const gl = device?.gl;\n    if (!gl) return;\n    this.webgl.extColorFloat = Boolean(gl.getExtension('EXT_color_buffer_float'));\n\n    this.webgl.programSplat = createProgram(gl, SPLAT_VERT_WEBGL, SPLAT_FRAG_WEBGL);\n    this.webgl.programComposite = createProgram(gl, FULLSCREEN_VERT_WEBGL, COMPOSITE_FRAG_WEBGL);\n    this.webgl.programCompositeLogRatio = createProgram(gl, FULLSCREEN_VERT_WEBGL, COMPOSITE_LOG_RATIO_FRAG_WEBGL);\n\n    this.webgl.uniforms.splat = {\n      u_viewProjection: gl.getUniformLocation(this.webgl.programSplat, 'u_viewProjection'),\n      u_nodeIndices: gl.getUniformLocation(this.webgl.programSplat, 'u_nodeIndices'),\n      u_nodeWeights: gl.getUniformLocation(this.webgl.programSplat, 'u_nodeWeights'),\n      u_nodePositions: gl.getUniformLocation(this.webgl.programSplat, 'u_nodePositions'),\n      u_viewport: gl.getUniformLocation(this.webgl.programSplat, 'u_viewport'),\n      u_densitySize: gl.getUniformLocation(this.webgl.programSplat, 'u_densitySize'),\n      u_bandwidthPx: gl.getUniformLocation(this.webgl.programSplat, 'u_bandwidthPx'),\n      u_nodeCount: gl.getUniformLocation(this.webgl.programSplat, 'u_nodeCount'),\n      u_indexTexWidth: gl.getUniformLocation(this.webgl.programSplat, 'u_indexTexWidth'),\n      u_weightTexWidth: gl.getUniformLocation(this.webgl.programSplat, 'u_weightTexWidth'),\n      u_positionTexWidth: gl.getUniformLocation(this.webgl.programSplat, 'u_positionTexWidth'),\n      u_positionCount: gl.getUniformLocation(this.webgl.programSplat, 'u_positionCount'),\n    };\n\n    this.webgl.uniforms.composite = {\n      u_densityTex: gl.getUniformLocation(this.webgl.programComposite, 'u_densityTex'),\n      u_colormapTex: gl.getUniformLocation(this.webgl.programComposite, 'u_colormapTex'),\n      u_weightScale: gl.getUniformLocation(this.webgl.programComposite, 'u_weightScale'),\n      u_diverging: gl.getUniformLocation(this.webgl.programComposite, 'u_diverging'),\n      u_topographic: gl.getUniformLocation(this.webgl.programComposite, 'u_topographic'),\n      u_contourLevels: gl.getUniformLocation(this.webgl.programComposite, 'u_contourLevels'),\n      u_contourWidth: gl.getUniformLocation(this.webgl.programComposite, 'u_contourWidth'),\n    };\n    this.webgl.uniforms.compositeLogRatio = {\n      u_numeratorTex: gl.getUniformLocation(this.webgl.programCompositeLogRatio, 'u_numeratorTex'),\n      u_denominatorTex: gl.getUniformLocation(this.webgl.programCompositeLogRatio, 'u_denominatorTex'),\n      u_colormapTex: gl.getUniformLocation(this.webgl.programCompositeLogRatio, 'u_colormapTex'),\n      u_epsilon: gl.getUniformLocation(this.webgl.programCompositeLogRatio, 'u_epsilon'),\n      u_domainMax: gl.getUniformLocation(this.webgl.programCompositeLogRatio, 'u_domainMax'),\n      u_supportFloor: gl.getUniformLocation(this.webgl.programCompositeLogRatio, 'u_supportFloor'),\n      u_supportCeil: gl.getUniformLocation(this.webgl.programCompositeLogRatio, 'u_supportCeil'),\n      u_numeratorTotal: gl.getUniformLocation(this.webgl.programCompositeLogRatio, 'u_numeratorTotal'),\n      u_denominatorTotal: gl.getUniformLocation(this.webgl.programCompositeLogRatio, 'u_denominatorTotal'),\n      u_supportCorrection: gl.getUniformLocation(this.webgl.programCompositeLogRatio, 'u_supportCorrection'),\n      u_zScore: gl.getUniformLocation(this.webgl.programCompositeLogRatio, 'u_zScore'),\n      u_topographic: gl.getUniformLocation(this.webgl.programCompositeLogRatio, 'u_topographic'),\n      u_contourLevels: gl.getUniformLocation(this.webgl.programCompositeLogRatio, 'u_contourLevels'),\n      u_contourWidth: gl.getUniformLocation(this.webgl.programCompositeLogRatio, 'u_contourWidth'),\n    };\n\n    const corners = new Float32Array([\n      -1, -1,\n      1, -1,\n      -1, 1,\n      1, 1,\n    ]);\n    const quad = new Float32Array([\n      -1, -1, 0, 0,\n      1, -1, 1, 0,\n      -1, 1, 0, 1,\n      -1, 1, 0, 1,\n      1, -1, 1, 0,\n      1, 1, 1, 1,\n    ]);\n\n    this.webgl.cornerBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.webgl.cornerBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, corners, gl.STATIC_DRAW);\n\n    this.webgl.quadBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.webgl.quadBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, quad, gl.STATIC_DRAW);\n\n    this.webgl.vaoSplat = gl.createVertexArray();\n    gl.bindVertexArray(this.webgl.vaoSplat);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.webgl.cornerBuffer);\n    gl.enableVertexAttribArray(0);\n    gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 8, 0);\n    gl.bindVertexArray(null);\n\n    this.webgl.vaoQuad = gl.createVertexArray();\n    gl.bindVertexArray(this.webgl.vaoQuad);\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.webgl.quadBuffer);\n    gl.enableVertexAttribArray(0);\n    gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 16, 0);\n    gl.enableVertexAttribArray(1);\n    gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 16, 8);\n    gl.bindVertexArray(null);\n\n    this.webgl.nodeIndicesTex = this.createWebGLDataTexture(gl, true);\n    this.webgl.nodeWeightsTex = this.createWebGLDataTexture(gl, false);\n    this.webgl.numeratorWeightsTex = this.createWebGLDataTexture(gl, false);\n    this.webgl.denominatorWeightsTex = this.createWebGLDataTexture(gl, false);\n    this.webgl.fallbackPositionsTex = this.createWebGLDataTexture(gl, false);\n    this.webgl.colormapTex = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, this.webgl.colormapTex);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.bindTexture(gl.TEXTURE_2D, null);\n\n    this.webgl.densityFbo = gl.createFramebuffer();\n    this.webgl.numeratorFbo = gl.createFramebuffer();\n    this.webgl.denominatorFbo = gl.createFramebuffer();\n\n    this.webgl.ready = true;\n  }\n\n  createWebGLDataTexture(gl, integer = false) {\n    const tex = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, tex);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    if (integer) {\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32UI, 1, 1, 0, gl.RED_INTEGER, gl.UNSIGNED_INT, new Uint32Array([0]));\n    } else {\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32F, 1, 1, 0, gl.RED, gl.FLOAT, new Float32Array([0]));\n    }\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    return tex;\n  }\n\n  destroyWebGL() {\n    const gl = this.device?.gl;\n    if (!gl) return;\n\n    const w = this.webgl;\n    if (w.programSplat) gl.deleteProgram(w.programSplat);\n    if (w.programComposite) gl.deleteProgram(w.programComposite);\n    if (w.programCompositeLogRatio) gl.deleteProgram(w.programCompositeLogRatio);\n    if (w.vaoSplat) gl.deleteVertexArray(w.vaoSplat);\n    if (w.vaoQuad) gl.deleteVertexArray(w.vaoQuad);\n    if (w.cornerBuffer) gl.deleteBuffer(w.cornerBuffer);\n    if (w.quadBuffer) gl.deleteBuffer(w.quadBuffer);\n    if (w.densityFbo) gl.deleteFramebuffer(w.densityFbo);\n    if (w.numeratorFbo) gl.deleteFramebuffer(w.numeratorFbo);\n    if (w.denominatorFbo) gl.deleteFramebuffer(w.denominatorFbo);\n    if (w.densityTex) gl.deleteTexture(w.densityTex);\n    if (w.numeratorTex) gl.deleteTexture(w.numeratorTex);\n    if (w.denominatorTex) gl.deleteTexture(w.denominatorTex);\n    if (w.nodeIndicesTex) gl.deleteTexture(w.nodeIndicesTex);\n    if (w.nodeWeightsTex) gl.deleteTexture(w.nodeWeightsTex);\n    if (w.numeratorWeightsTex) gl.deleteTexture(w.numeratorWeightsTex);\n    if (w.denominatorWeightsTex) gl.deleteTexture(w.denominatorWeightsTex);\n    if (w.fallbackPositionsTex) gl.deleteTexture(w.fallbackPositionsTex);\n    if (w.colormapTex) gl.deleteTexture(w.colormapTex);\n\n    w.ready = false;\n  }\n\n  ensureWebGLRenderTarget(gl, {\n    textureKey,\n    fboKey,\n    widthKey,\n    heightKey,\n    width,\n    height,\n  }) {\n    if (\n      this.webgl[textureKey]\n      && this.webgl[widthKey] === width\n      && this.webgl[heightKey] === height\n    ) {\n      return true;\n    }\n\n    if (this.webgl[textureKey]) {\n      gl.deleteTexture(this.webgl[textureKey]);\n      this.webgl[textureKey] = null;\n    }\n\n    const tex = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, tex);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n    if (this.webgl.extColorFloat) {\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA16F, width, height, 0, gl.RGBA, gl.HALF_FLOAT, null);\n    } else {\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n    }\n\n    gl.bindFramebuffer(gl.FRAMEBUFFER, this.webgl[fboKey]);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);\n    const ok = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    if (!ok) {\n      gl.deleteTexture(tex);\n      return false;\n    }\n\n    this.webgl[textureKey] = tex;\n    this.webgl[widthKey] = width;\n    this.webgl[heightKey] = height;\n    return true;\n  }\n\n  ensureWebGLDensityTarget(gl, width, height) {\n    return this.ensureWebGLRenderTarget(gl, {\n      textureKey: 'densityTex',\n      fboKey: 'densityFbo',\n      widthKey: 'densityWidth',\n      heightKey: 'densityHeight',\n      width,\n      height,\n    });\n  }\n\n  ensureWebGLLogRatioTargets(gl, width, height) {\n    const numeratorOk = this.ensureWebGLRenderTarget(gl, {\n      textureKey: 'numeratorTex',\n      fboKey: 'numeratorFbo',\n      widthKey: 'numeratorWidth',\n      heightKey: 'numeratorHeight',\n      width,\n      height,\n    });\n    if (!numeratorOk) return false;\n    return this.ensureWebGLRenderTarget(gl, {\n      textureKey: 'denominatorTex',\n      fboKey: 'denominatorFbo',\n      widthKey: 'denominatorWidth',\n      heightKey: 'denominatorHeight',\n      width,\n      height,\n    });\n  }\n\n  ensureWebGLColormapTexture(gl, colormapName, diverging) {\n    if (\n      this.webgl.colormapTex\n      && this.webgl.colormapKey === colormapName\n      && this.webgl.colormapDiverging === diverging\n    ) {\n      return;\n    }\n\n    const resolved = resolveColormap(colormapName) || resolveColormap('interpolateOrRd');\n    const count = 256;\n    const data = new Uint8Array(count * 4);\n    for (let i = 0; i < count; i += 1) {\n      const t = i / (count - 1);\n      const color = resolved?.interpolate?.(t) ?? [0, 0, 0, 1];\n      const offset = i * 4;\n      data[offset + 0] = clamp(Math.round((color[0] ?? 0) * 255), 0, 255);\n      data[offset + 1] = clamp(Math.round((color[1] ?? 0) * 255), 0, 255);\n      data[offset + 2] = clamp(Math.round((color[2] ?? 0) * 255), 0, 255);\n      data[offset + 3] = clamp(Math.round((color[3] ?? 1) * 255), 0, 255);\n    }\n\n    gl.bindTexture(gl.TEXTURE_2D, this.webgl.colormapTex);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, count, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);\n    gl.bindTexture(gl.TEXTURE_2D, null);\n\n    this.webgl.colormapKey = colormapName;\n    this.webgl.colormapDiverging = diverging;\n  }\n\n  uploadWebGLUintTexture(gl, texture, typedArray, layout, versionTag) {\n    const max = gl.getParameter(gl.MAX_TEXTURE_SIZE) ?? 16384;\n    const nextLayout = getTextureLayout(max, layout?.count ?? typedArray.length);\n    const sameLayout = layout && layout.width === nextLayout.width && layout.height === nextLayout.height;\n\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n\n    if (!sameLayout) {\n      gl.texImage2D(\n        gl.TEXTURE_2D,\n        0,\n        gl.R32UI,\n        nextLayout.width,\n        nextLayout.height,\n        0,\n        gl.RED_INTEGER,\n        gl.UNSIGNED_INT,\n        null,\n      );\n    }\n\n    if (nextLayout.height === 1) {\n      gl.texSubImage2D(\n        gl.TEXTURE_2D,\n        0,\n        0,\n        0,\n        nextLayout.width,\n        1,\n        gl.RED_INTEGER,\n        gl.UNSIGNED_INT,\n        typedArray.subarray(0, nextLayout.width),\n      );\n    } else {\n      let offset = 0;\n      for (let y = 0; y < nextLayout.height; y += 1) {\n        const row = Math.min(nextLayout.width, nextLayout.count - offset);\n        if (row <= 0) break;\n        gl.texSubImage2D(\n          gl.TEXTURE_2D,\n          0,\n          0,\n          y,\n          row,\n          1,\n          gl.RED_INTEGER,\n          gl.UNSIGNED_INT,\n          typedArray.subarray(offset, offset + row),\n        );\n        offset += row;\n      }\n    }\n\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    return {\n      width: nextLayout.width,\n      height: nextLayout.height,\n      count: nextLayout.count,\n      version: versionTag,\n    };\n  }\n\n  uploadWebGLFloatTexture(gl, texture, typedArray, layout, versionTag) {\n    const max = gl.getParameter(gl.MAX_TEXTURE_SIZE) ?? 16384;\n    const components = Math.max(1, Math.min(4, Math.floor(Number(layout?.components ?? 1))));\n    const texelCount = Math.max(1, Math.floor(Number(layout?.count ?? typedArray.length)));\n    const nextLayout = getTextureLayout(max, texelCount);\n    const sameLayout = layout && layout.width === nextLayout.width && layout.height === nextLayout.height;\n    const formatInfo = components === 1\n      ? { internalFormat: gl.R32F, format: gl.RED }\n      : (components === 2\n        ? { internalFormat: gl.RG32F, format: gl.RG }\n        : (components === 3\n          ? { internalFormat: gl.RGB32F, format: gl.RGB }\n          : { internalFormat: gl.RGBA32F, format: gl.RGBA }));\n\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n\n    if (!sameLayout) {\n      gl.texImage2D(\n        gl.TEXTURE_2D,\n        0,\n        formatInfo.internalFormat,\n        nextLayout.width,\n        nextLayout.height,\n        0,\n        formatInfo.format,\n        gl.FLOAT,\n        null,\n      );\n    }\n\n    if (nextLayout.height === 1) {\n      const valueCount = nextLayout.width * components;\n      gl.texSubImage2D(\n        gl.TEXTURE_2D,\n        0,\n        0,\n        0,\n        nextLayout.width,\n        1,\n        formatInfo.format,\n        gl.FLOAT,\n        typedArray.subarray(0, valueCount),\n      );\n    } else {\n      let offset = 0;\n      for (let y = 0; y < nextLayout.height; y += 1) {\n        const usedTexels = Math.floor(offset / components);\n        const row = Math.min(nextLayout.width, nextLayout.count - usedTexels);\n        if (row <= 0) break;\n        const rowValueCount = row * components;\n        gl.texSubImage2D(\n          gl.TEXTURE_2D,\n          0,\n          0,\n          y,\n          row,\n          1,\n          formatInfo.format,\n          gl.FLOAT,\n          typedArray.subarray(offset, offset + rowValueCount),\n        );\n        offset += rowValueCount;\n      }\n    }\n\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    return {\n      width: nextLayout.width,\n      height: nextLayout.height,\n      count: nextLayout.count,\n      version: versionTag,\n    };\n  }\n\n  resolveWebGLPositionTexture(frame, computed) {\n    const graphLayer = this.getGraphLayer?.();\n    const shared = graphLayer?.getSharedSparseResources?.() ?? null;\n    const delegatePositionSource = this.isDelegatePositionSourceActive(graphLayer);\n    const positionInfo = this.readNodePositionInfo(frame?.network);\n    const currentPositionVersion = Number.isFinite(positionInfo?.version) ? Number(positionInfo.version) : null;\n    const requiredPositionCount = Math.max(\n      0,\n      Math.floor(Number(positionInfo?.count ?? computed.positionCount ?? 0)),\n    );\n\n    const sharedTex = shared?.textures?.nodePositions ?? null;\n    const sharedMeta = shared?.textureMeta?.nodePositions ?? null;\n    const sharedPositionCount = Math.max(\n      0,\n      Math.floor(Number(sharedMeta?.count ?? requiredPositionCount ?? computed.positionCount ?? 0)),\n    );\n    const sharedVersion = Number.isFinite(sharedMeta?.version) ? Number(sharedMeta.version) : null;\n    const hasCurrentVersion = Number.isFinite(currentPositionVersion);\n    const versionMatches = delegatePositionSource\n      || !hasCurrentVersion\n      || (Number.isFinite(sharedVersion) && sharedVersion === currentPositionVersion);\n    const countMatches = requiredPositionCount <= 0 || sharedPositionCount >= requiredPositionCount;\n    if (sharedTex && sharedPositionCount > 0 && versionMatches && countMatches) {\n      return {\n        texture: sharedTex,\n        texWidth: getTextureLayout(this.device.gl.getParameter(this.device.gl.MAX_TEXTURE_SIZE), sharedPositionCount).width,\n        positionCount: sharedPositionCount,\n      };\n    }\n\n    const view = positionInfo?.view ?? null;\n    if (!view || view.length < 3) return null;\n\n    const count = Math.max(1, Math.floor(Number(positionInfo?.count ?? Math.floor(view.length / 3))));\n    const key = `${view.buffer}|${view.byteOffset}|${view.byteLength}|${count}|${String(currentPositionVersion ?? 'na')}`;\n    if (this.webgl.fallbackPositionsMeta?.key !== key || this.webgl.fallbackPositionsMeta?.count !== count) {\n      const layout = this.uploadWebGLFloatTexture(\n        this.device.gl,\n        this.webgl.fallbackPositionsTex,\n        view,\n        { count, components: 3 },\n        key,\n      );\n      this.webgl.fallbackPositionsLayout = layout;\n      this.webgl.fallbackPositionsMeta = { key, count };\n    }\n    return {\n      texture: this.webgl.fallbackPositionsTex,\n      texWidth: getTextureLayout(this.device.gl.getParameter(this.device.gl.MAX_TEXTURE_SIZE), count).width,\n      positionCount: count,\n    };\n  }\n\n  uploadWebGLWeightTexture(gl, textureKey, layoutKey, metaKey, weights, count) {\n    const weightKey = `${this.version}|${textureKey}|${count}|${this.webgl[metaKey]?.tick ?? 0}`;\n    this.webgl[layoutKey] = this.uploadWebGLFloatTexture(\n      gl,\n      this.webgl[textureKey],\n      weights,\n      { count },\n      weightKey,\n    );\n    this.webgl[metaKey] = { version: weightKey, tick: (this.webgl[metaKey]?.tick ?? 0) + 1 };\n  }\n\n  renderWebGLSplatPass(gl, framebuffer, weightTexture, weightLayout, frame, cameraUniforms, computed, densityWidth, densityHeight, bandwidthViewport, positionBinding) {\n    gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n    gl.viewport(0, 0, densityWidth, densityHeight);\n    gl.clearColor(0, 0, 0, 0);\n    gl.clear(gl.COLOR_BUFFER_BIT);\n\n    gl.useProgram(this.webgl.programSplat);\n    gl.bindVertexArray(this.webgl.vaoSplat);\n\n    gl.uniformMatrix4fv(this.webgl.uniforms.splat.u_viewProjection, false, cameraUniforms.viewProjection);\n    gl.uniform2f(this.webgl.uniforms.splat.u_viewport, bandwidthViewport.width, bandwidthViewport.height);\n    gl.uniform2f(this.webgl.uniforms.splat.u_densitySize, densityWidth, densityHeight);\n    const splatBandwidth = this.resolveSplatBandwidthPx(frame?.camera, cameraUniforms);\n    gl.uniform1f(this.webgl.uniforms.splat.u_bandwidthPx, splatBandwidth);\n    gl.uniform1i(this.webgl.uniforms.splat.u_nodeCount, computed.count);\n    gl.uniform1i(this.webgl.uniforms.splat.u_indexTexWidth, this.webgl.nodeIndicesLayout?.width ?? computed.count);\n    gl.uniform1i(this.webgl.uniforms.splat.u_weightTexWidth, weightLayout?.width ?? computed.count);\n    gl.uniform1i(this.webgl.uniforms.splat.u_positionTexWidth, positionBinding.texWidth);\n    gl.uniform1i(this.webgl.uniforms.splat.u_positionCount, positionBinding.positionCount);\n\n    gl.activeTexture(gl.TEXTURE0);\n    gl.bindTexture(gl.TEXTURE_2D, this.webgl.nodeIndicesTex);\n    gl.uniform1i(this.webgl.uniforms.splat.u_nodeIndices, 0);\n\n    gl.activeTexture(gl.TEXTURE1);\n    gl.bindTexture(gl.TEXTURE_2D, weightTexture);\n    gl.uniform1i(this.webgl.uniforms.splat.u_nodeWeights, 1);\n\n    gl.activeTexture(gl.TEXTURE2);\n    gl.bindTexture(gl.TEXTURE_2D, positionBinding.texture);\n    gl.uniform1i(this.webgl.uniforms.splat.u_nodePositions, 2);\n\n    gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, computed.count);\n  }\n\n  renderWebGL(context, frame, cameraUniforms, computed) {\n    const gl = context.gl;\n    if (!this.webgl.ready || !gl) return;\n\n    const viewport = context.viewport ?? [0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight];\n    const viewportWidth = Math.max(1, viewport[2]);\n    const viewportHeight = Math.max(1, viewport[3]);\n    const bandwidthViewport = resolveDensityBandwidthViewport(context, cameraUniforms, viewportWidth, viewportHeight);\n    const densityResolutionViewport = context?.target?.exportFigureLogicalViewport\n      ? bandwidthViewport\n      : { width: viewportWidth, height: viewportHeight };\n    const densityWidth = Math.max(1, Math.floor(densityResolutionViewport.width * this.config.qualityScale));\n    const densityHeight = Math.max(1, Math.floor(densityResolutionViewport.height * this.config.qualityScale));\n\n    const positionBinding = this.resolveWebGLPositionTexture(frame, computed);\n    if (!positionBinding?.texture || !positionBinding?.positionCount) {\n      return;\n    }\n\n    const nodeIndices = computed.nodeIndices;\n    const indexKey = computed.nodeIndexVersion ?? this.computeNodeIndexVersion(nodeIndices, computed.count);\n    if (this.webgl.nodeIndicesMeta?.version !== indexKey) {\n      this.webgl.nodeIndicesLayout = this.uploadWebGLUintTexture(\n        gl,\n        this.webgl.nodeIndicesTex,\n        nodeIndices,\n        { count: computed.count },\n        indexKey,\n      );\n      this.webgl.nodeIndicesMeta = { version: indexKey };\n    }\n\n    this.ensureWebGLColormapTexture(gl, computed.colormapKey, computed.diverging);\n\n    const prevBlendEnabled = gl.isEnabled(gl.BLEND);\n    const prevDepthEnabled = gl.isEnabled(gl.DEPTH_TEST);\n    gl.disable(gl.DEPTH_TEST);\n    gl.enable(gl.BLEND);\n    gl.blendEquation(gl.FUNC_ADD);\n    gl.blendFunc(gl.ONE, gl.ONE);\n\n    if (computed.mode === 'logRatio') {\n      this.renderWebGLLogRatio(context, frame, cameraUniforms, computed, {\n        viewport,\n        viewportWidth,\n        viewportHeight,\n        densityWidth,\n        densityHeight,\n        bandwidthViewport,\n        positionBinding,\n      });\n    } else {\n      this.renderWebGLDifference(context, frame, cameraUniforms, computed, {\n        viewport,\n        viewportWidth,\n        viewportHeight,\n        densityWidth,\n        densityHeight,\n        bandwidthViewport,\n        positionBinding,\n      });\n    }\n\n    gl.bindVertexArray(null);\n    if (prevDepthEnabled) gl.enable(gl.DEPTH_TEST);\n    else gl.disable(gl.DEPTH_TEST);\n    if (!prevBlendEnabled) gl.disable(gl.BLEND);\n    else gl.enable(gl.BLEND);\n    gl.blendEquation(gl.FUNC_ADD);\n    gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n  }\n\n  renderWebGLDifference(context, frame, cameraUniforms, computed, renderState) {\n    const gl = context.gl;\n    if (!this.ensureWebGLDensityTarget(gl, renderState.densityWidth, renderState.densityHeight)) {\n      return;\n    }\n\n    this.uploadWebGLWeightTexture(gl, 'nodeWeightsTex', 'nodeWeightsLayout', 'nodeWeightsMeta', computed.weights, computed.count);\n    this.renderWebGLSplatPass(\n      gl,\n      this.webgl.densityFbo,\n      this.webgl.nodeWeightsTex,\n      this.webgl.nodeWeightsLayout,\n      frame,\n      cameraUniforms,\n      computed,\n      renderState.densityWidth,\n      renderState.densityHeight,\n      renderState.bandwidthViewport,\n      renderState.positionBinding,\n    );\n\n    gl.bindFramebuffer(gl.FRAMEBUFFER, context.target?.handle ?? null);\n    gl.viewport(renderState.viewport[0], renderState.viewport[1], renderState.viewportWidth, renderState.viewportHeight);\n    gl.useProgram(this.webgl.programComposite);\n    gl.bindVertexArray(this.webgl.vaoQuad);\n    gl.enable(gl.BLEND);\n    gl.blendEquation(gl.FUNC_ADD);\n    gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n    gl.activeTexture(gl.TEXTURE0);\n    gl.bindTexture(gl.TEXTURE_2D, this.webgl.densityTex);\n    gl.uniform1i(this.webgl.uniforms.composite.u_densityTex, 0);\n\n    gl.activeTexture(gl.TEXTURE1);\n    gl.bindTexture(gl.TEXTURE_2D, this.webgl.colormapTex);\n    gl.uniform1i(this.webgl.uniforms.composite.u_colormapTex, 1);\n\n    gl.uniform1f(this.webgl.uniforms.composite.u_weightScale, this.config.weightScale);\n    gl.uniform1i(this.webgl.uniforms.composite.u_diverging, computed.diverging ? 1 : 0);\n    gl.uniform1i(this.webgl.uniforms.composite.u_topographic, this.config.topographic ? 1 : 0);\n    gl.uniform1f(this.webgl.uniforms.composite.u_contourLevels, 14.0);\n    gl.uniform1f(this.webgl.uniforms.composite.u_contourWidth, 0.18);\n    gl.drawArrays(gl.TRIANGLES, 0, 6);\n  }\n\n  renderWebGLLogRatio(context, frame, cameraUniforms, computed, renderState) {\n    const gl = context.gl;\n    if (!this.ensureWebGLLogRatioTargets(gl, renderState.densityWidth, renderState.densityHeight)) {\n      return;\n    }\n\n    this.uploadWebGLWeightTexture(\n      gl,\n      'numeratorWeightsTex',\n      'numeratorWeightsLayout',\n      'numeratorWeightsMeta',\n      computed.numeratorWeights,\n      computed.count,\n    );\n    this.uploadWebGLWeightTexture(\n      gl,\n      'denominatorWeightsTex',\n      'denominatorWeightsLayout',\n      'denominatorWeightsMeta',\n      computed.denominatorWeights,\n      computed.count,\n    );\n\n    this.renderWebGLSplatPass(\n      gl,\n      this.webgl.numeratorFbo,\n      this.webgl.numeratorWeightsTex,\n      this.webgl.numeratorWeightsLayout,\n      frame,\n      cameraUniforms,\n      computed,\n      renderState.densityWidth,\n      renderState.densityHeight,\n      renderState.bandwidthViewport,\n      renderState.positionBinding,\n    );\n    this.renderWebGLSplatPass(\n      gl,\n      this.webgl.denominatorFbo,\n      this.webgl.denominatorWeightsTex,\n      this.webgl.denominatorWeightsLayout,\n      frame,\n      cameraUniforms,\n      computed,\n      renderState.densityWidth,\n      renderState.densityHeight,\n      renderState.bandwidthViewport,\n      renderState.positionBinding,\n    );\n\n    gl.bindFramebuffer(gl.FRAMEBUFFER, context.target?.handle ?? null);\n    gl.viewport(renderState.viewport[0], renderState.viewport[1], renderState.viewportWidth, renderState.viewportHeight);\n    gl.useProgram(this.webgl.programCompositeLogRatio);\n    gl.bindVertexArray(this.webgl.vaoQuad);\n    gl.enable(gl.BLEND);\n    gl.blendEquation(gl.FUNC_ADD);\n    gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n    gl.activeTexture(gl.TEXTURE0);\n    gl.bindTexture(gl.TEXTURE_2D, this.webgl.numeratorTex);\n    gl.uniform1i(this.webgl.uniforms.compositeLogRatio.u_numeratorTex, 0);\n\n    gl.activeTexture(gl.TEXTURE1);\n    gl.bindTexture(gl.TEXTURE_2D, this.webgl.denominatorTex);\n    gl.uniform1i(this.webgl.uniforms.compositeLogRatio.u_denominatorTex, 1);\n\n    gl.activeTexture(gl.TEXTURE2);\n    gl.bindTexture(gl.TEXTURE_2D, this.webgl.colormapTex);\n    gl.uniform1i(this.webgl.uniforms.compositeLogRatio.u_colormapTex, 2);\n\n    const supportWindow = resolveLogRatioSupportWindow(\n      this.config.epsilon,\n      this.config.maskThreshold,\n      this.config.logRatioSupportCorrection,\n    );\n    gl.uniform1f(this.webgl.uniforms.compositeLogRatio.u_epsilon, this.config.epsilon);\n    gl.uniform1f(this.webgl.uniforms.compositeLogRatio.u_domainMax, Math.max(Math.abs(computed.valueDomain?.[1] ?? this.config.logRatioRange), 1e-6));\n    gl.uniform1f(this.webgl.uniforms.compositeLogRatio.u_supportFloor, supportWindow.floor);\n    gl.uniform1f(this.webgl.uniforms.compositeLogRatio.u_supportCeil, supportWindow.ceil);\n    gl.uniform1f(this.webgl.uniforms.compositeLogRatio.u_numeratorTotal, Math.max(Number(computed.numeratorTotal ?? 0), 0));\n    gl.uniform1f(this.webgl.uniforms.compositeLogRatio.u_denominatorTotal, Math.max(Number(computed.denominatorTotal ?? 0), 0));\n    gl.uniform1i(this.webgl.uniforms.compositeLogRatio.u_supportCorrection, this.config.logRatioSupportCorrection ? 1 : 0);\n    gl.uniform1i(this.webgl.uniforms.compositeLogRatio.u_zScore, this.config.logRatioZScore ? 1 : 0);\n    gl.uniform1i(this.webgl.uniforms.compositeLogRatio.u_topographic, this.config.topographic ? 1 : 0);\n    gl.uniform1f(this.webgl.uniforms.compositeLogRatio.u_contourLevels, 14.0);\n    gl.uniform1f(this.webgl.uniforms.compositeLogRatio.u_contourWidth, 0.18);\n    gl.drawArrays(gl.TRIANGLES, 0, 6);\n  }\n\n  initializeWebGPU(device) {\n    const gpu = device?.device;\n    if (!gpu) return;\n\n    this.webgpu.cameraBuffer = gpu.createBuffer({\n      size: 96,\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n    });\n\n    this.webgpu.compositeParamsBuffer = gpu.createBuffer({\n      size: 32,\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n    });\n    this.webgpu.compositeLogRatioParamsBuffer = gpu.createBuffer({\n      size: 48,\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n    });\n\n    const corners = new Float32Array([\n      -1, -1,\n      1, -1,\n      -1, 1,\n      1, 1,\n    ]);\n    this.webgpu.cornersBuffer = gpu.createBuffer({\n      size: corners.byteLength,\n      usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n      mappedAtCreation: true,\n    });\n    new Float32Array(this.webgpu.cornersBuffer.getMappedRange()).set(corners);\n    this.webgpu.cornersBuffer.unmap();\n\n    this.webgpu.sampler = gpu.createSampler({ magFilter: 'linear', minFilter: 'linear' });\n\n    const splatModule = gpu.createShaderModule({ code: SPLAT_WGSL });\n    const compositeModule = gpu.createShaderModule({ code: COMPOSITE_WGSL });\n    const compositeLogRatioModule = gpu.createShaderModule({ code: COMPOSITE_LOG_RATIO_WGSL });\n\n    const splatLayout = gpu.createBindGroupLayout({\n      entries: [\n        { binding: 0, visibility: GPUShaderStage.VERTEX, buffer: { type: 'uniform' } },\n        { binding: 1, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n        { binding: 2, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n        { binding: 3, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n      ],\n    });\n\n    const compositeLayout = gpu.createBindGroupLayout({\n      entries: [\n        { binding: 0, visibility: GPUShaderStage.FRAGMENT, sampler: {} },\n        { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'float' } },\n        { binding: 2, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'float' } },\n        { binding: 3, visibility: GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n      ],\n    });\n    const compositeLogRatioLayout = gpu.createBindGroupLayout({\n      entries: [\n        { binding: 0, visibility: GPUShaderStage.FRAGMENT, sampler: {} },\n        { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'float' } },\n        { binding: 2, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'float' } },\n        { binding: 3, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'float' } },\n        { binding: 4, visibility: GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n      ],\n    });\n\n    this.webgpu.pipelineSplat = gpu.createRenderPipeline({\n      layout: gpu.createPipelineLayout({ bindGroupLayouts: [splatLayout] }),\n      vertex: {\n        module: splatModule,\n        entryPoint: 'vsMain',\n        buffers: [{\n          arrayStride: 8,\n          attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x2' }],\n        }],\n      },\n      fragment: {\n        module: splatModule,\n        entryPoint: 'fsMain',\n        targets: [{\n          format: 'rgba16float',\n          blend: {\n            color: { srcFactor: 'one', dstFactor: 'one', operation: 'add' },\n            alpha: { srcFactor: 'one', dstFactor: 'one', operation: 'add' },\n          },\n        }],\n      },\n      primitive: { topology: 'triangle-strip' },\n    });\n\n    this.webgpu.pipelineComposite = gpu.createRenderPipeline({\n      layout: gpu.createPipelineLayout({ bindGroupLayouts: [compositeLayout] }),\n      vertex: {\n        module: compositeModule,\n        entryPoint: 'vsMain',\n        buffers: [{\n          arrayStride: 16,\n          attributes: [\n            { shaderLocation: 0, offset: 0, format: 'float32x2' },\n            { shaderLocation: 1, offset: 8, format: 'float32x2' },\n          ],\n        }],\n      },\n      fragment: {\n        module: compositeModule,\n        entryPoint: 'fsMain',\n        targets: [{\n          format: device.format,\n          blend: {\n            color: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n            alpha: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n          },\n        }],\n      },\n      primitive: { topology: 'triangle-strip' },\n      depthStencil: {\n        format: device.depthFormat ?? 'depth24plus',\n        depthWriteEnabled: false,\n        depthCompare: 'always',\n      },\n    });\n    this.webgpu.pipelineCompositeLogRatio = gpu.createRenderPipeline({\n      layout: gpu.createPipelineLayout({ bindGroupLayouts: [compositeLogRatioLayout] }),\n      vertex: {\n        module: compositeLogRatioModule,\n        entryPoint: 'vsMain',\n        buffers: [{\n          arrayStride: 16,\n          attributes: [\n            { shaderLocation: 0, offset: 0, format: 'float32x2' },\n            { shaderLocation: 1, offset: 8, format: 'float32x2' },\n          ],\n        }],\n      },\n      fragment: {\n        module: compositeLogRatioModule,\n        entryPoint: 'fsMain',\n        targets: [{\n          format: device.format,\n          blend: {\n            color: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n            alpha: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n          },\n        }],\n      },\n      primitive: { topology: 'triangle-strip' },\n      depthStencil: {\n        format: device.depthFormat ?? 'depth24plus',\n        depthWriteEnabled: false,\n        depthCompare: 'always',\n      },\n    });\n\n    this.webgpu.splatLayout = splatLayout;\n    this.webgpu.compositeLayout = compositeLayout;\n    this.webgpu.compositeLogRatioLayout = compositeLogRatioLayout;\n    this.webgpu.ready = true;\n  }\n\n  destroyWebGPU() {\n    this.webgpu.cameraBuffer?.destroy?.();\n    this.webgpu.compositeParamsBuffer?.destroy?.();\n    this.webgpu.compositeLogRatioParamsBuffer?.destroy?.();\n    this.webgpu.cornersBuffer?.destroy?.();\n    this.webgpu.densityTexture?.destroy?.();\n    this.webgpu.numeratorTexture?.destroy?.();\n    this.webgpu.denominatorTexture?.destroy?.();\n    this.webgpu.colormapTexture?.destroy?.();\n    this.webgpu.ready = false;\n  }\n\n  ensureWebGPUDensityTexture(width, height) {\n    const gpu = this.device?.device;\n    if (!gpu) return false;\n    if (\n      this.webgpu.densityTexture\n      && this.webgpu.densitySize.width === width\n      && this.webgpu.densitySize.height === height\n    ) {\n      return true;\n    }\n\n    this.webgpu.densityTexture?.destroy?.();\n    this.webgpu.densityTexture = gpu.createTexture({\n      size: { width, height, depthOrArrayLayers: 1 },\n      format: 'rgba16float',\n      usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,\n    });\n    this.webgpu.densitySize = { width, height };\n    return true;\n  }\n\n  ensureWebGPULogRatioTextures(width, height) {\n    const gpu = this.device?.device;\n    if (!gpu) return false;\n    if (\n      this.webgpu.numeratorTexture\n      && this.webgpu.denominatorTexture\n      && this.webgpu.logRatioSize.width === width\n      && this.webgpu.logRatioSize.height === height\n    ) {\n      return true;\n    }\n\n    this.webgpu.numeratorTexture?.destroy?.();\n    this.webgpu.denominatorTexture?.destroy?.();\n    this.webgpu.numeratorTexture = gpu.createTexture({\n      size: { width, height, depthOrArrayLayers: 1 },\n      format: 'rgba16float',\n      usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,\n    });\n    this.webgpu.denominatorTexture = gpu.createTexture({\n      size: { width, height, depthOrArrayLayers: 1 },\n      format: 'rgba16float',\n      usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,\n    });\n    this.webgpu.logRatioSize = { width, height };\n    return true;\n  }\n\n  ensureWebGPUColormapTexture(colormapName, diverging) {\n    const gpu = this.device?.device;\n    if (!gpu) return false;\n    if (\n      this.webgpu.colormapTexture\n      && this.webgpu.colormapKey === colormapName\n      && this.webgpu.colormapDiverging === diverging\n    ) {\n      return true;\n    }\n\n    const resolved = resolveColormap(colormapName) || resolveColormap('interpolateOrRd');\n    const count = 256;\n    const data = new Uint8Array(count * 4);\n    for (let i = 0; i < count; i += 1) {\n      const t = i / (count - 1);\n      const color = resolved?.interpolate?.(t) ?? [0, 0, 0, 1];\n      const offset = i * 4;\n      data[offset + 0] = clamp(Math.round((color[0] ?? 0) * 255), 0, 255);\n      data[offset + 1] = clamp(Math.round((color[1] ?? 0) * 255), 0, 255);\n      data[offset + 2] = clamp(Math.round((color[2] ?? 0) * 255), 0, 255);\n      data[offset + 3] = clamp(Math.round((color[3] ?? 1) * 255), 0, 255);\n    }\n\n    this.webgpu.colormapTexture?.destroy?.();\n    this.webgpu.colormapTexture = gpu.createTexture({\n      size: { width: count, height: 1, depthOrArrayLayers: 1 },\n      format: 'rgba8unorm',\n      usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n    });\n\n    gpu.queue.writeTexture(\n      { texture: this.webgpu.colormapTexture },\n      data,\n      { bytesPerRow: count * 4 },\n      { width: count, height: 1, depthOrArrayLayers: 1 },\n    );\n\n    this.webgpu.colormapKey = colormapName;\n    this.webgpu.colormapDiverging = diverging;\n    return true;\n  }\n\n  resolveWebGPUPositionAndIndexBuffers(frame, computed) {\n    const graphLayer = this.getGraphLayer?.();\n    const shared = graphLayer?.getSharedSparseResources?.() ?? null;\n    const delegatePositionSource = this.isDelegatePositionSourceActive(graphLayer);\n    const sharedBuffers = shared?.buffers ?? null;\n    const positionInfo = this.readNodePositionInfo(frame?.network);\n    const currentPositionVersion = Number.isFinite(positionInfo?.version) ? Number(positionInfo.version) : null;\n    const requiredPositionCount = Math.max(\n      0,\n      Math.floor(Number(positionInfo?.count ?? computed.positionCount ?? 0)),\n    );\n\n    const sharedIndices = sharedBuffers?.['indirect:node:indices'] ?? null;\n    const sharedPositions = sharedBuffers?.['indirect:node:positions'] ?? null;\n    const sharedPositionCount = resolvePackedVec3Count(\n      sharedPositions,\n      requiredPositionCount || computed.positionCount || 0,\n    );\n    const sharedPositionVersion = Number.isFinite(sharedPositions?.version) ? Number(sharedPositions.version) : null;\n    const hasCurrentVersion = Number.isFinite(currentPositionVersion);\n    const positionVersionMatches = delegatePositionSource\n      || !hasCurrentVersion\n      || (Number.isFinite(sharedPositionVersion) && sharedPositionVersion === currentPositionVersion);\n\n    const useSharedIndices = computed.usesActiveNodeIndexBuffer === true\n      && sharedIndices?.buffer\n      && Number(sharedIndices?.count) === computed.count;\n    const useSharedPositions = sharedPositions?.buffer\n      && sharedPositionCount >= requiredPositionCount\n      && positionVersionMatches;\n\n    const gpu = this.device?.device;\n    const queue = gpu?.queue;\n    const resourceCache = this.device?.resourceCache?.webgpu;\n\n    const storageUsage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX;\n\n    let indexBuffer = useSharedIndices ? sharedIndices.buffer : null;\n    let positionBuffer = useSharedPositions ? sharedPositions.buffer : null;\n\n    if (!indexBuffer && gpu && queue && resourceCache) {\n      indexBuffer = resourceCache.uploadBuffer(\n        gpu,\n        queue,\n        'density:node:indices',\n        computed.nodeIndices,\n        {\n          label: 'Density node indices',\n          version: computed.nodeIndexVersion ?? this.computeNodeIndexVersion(computed.nodeIndices, computed.count),\n          count: computed.count,\n          trackViewIdentity: true,\n        },\n        storageUsage,\n      );\n    }\n\n    if (!positionBuffer && gpu && queue && resourceCache) {\n      const positionView = positionInfo?.view ?? null;\n      if (!positionView || positionView.length < 3) {\n        return null;\n      }\n      const positionCount = Math.max(1, Math.floor(Number(positionInfo?.count ?? Math.floor(positionView.length / 3))));\n      positionBuffer = resourceCache.uploadBuffer(\n        gpu,\n        queue,\n        'density:node:positions',\n        positionView,\n        {\n          label: 'Density node positions',\n          version: `${positionView.buffer}|${positionView.byteOffset}|${positionView.byteLength}|${String(currentPositionVersion ?? 'na')}`,\n          count: positionCount,\n          trackViewIdentity: true,\n        },\n        storageUsage,\n      );\n      computed.positionCount = positionCount;\n    } else if (useSharedPositions) {\n      computed.positionCount = sharedPositionCount || computed.positionCount;\n    }\n\n    if (!indexBuffer || !positionBuffer) return null;\n    return { indexBuffer, positionBuffer };\n  }\n\n  renderWebGPUSplatPass(context, bindGroup, targetTexture, computed) {\n    const accumulatePass = context.commandEncoder.beginRenderPass({\n      colorAttachments: [{\n        view: targetTexture.createView(),\n        clearValue: { r: 0, g: 0, b: 0, a: 0 },\n        loadOp: 'clear',\n        storeOp: 'store',\n      }],\n    });\n    accumulatePass.setPipeline(this.webgpu.pipelineSplat);\n    accumulatePass.setBindGroup(0, bindGroup);\n    accumulatePass.setVertexBuffer(0, this.webgpu.cornersBuffer);\n    accumulatePass.draw(4, computed.count, 0, 0);\n    accumulatePass.end();\n  }\n\n  renderWebGPU(context, frame, cameraUniforms, computed) {\n    if (!this.webgpu.ready) return;\n    const gpu = context.device;\n    if (!gpu) return;\n\n    const viewport = context.viewport ?? null;\n    const width = viewport ? Math.max(1, Math.floor(viewport.width)) : Math.max(1, Math.floor(context.width));\n    const height = viewport ? Math.max(1, Math.floor(viewport.height)) : Math.max(1, Math.floor(context.height));\n    const bandwidthViewport = resolveDensityBandwidthViewport(context, cameraUniforms, width, height);\n    const densityResolutionViewport = context?.target?.exportFigureLogicalViewport\n      ? bandwidthViewport\n      : { width, height };\n    const densityWidth = Math.max(1, Math.floor(densityResolutionViewport.width * this.config.qualityScale));\n    const densityHeight = Math.max(1, Math.floor(densityResolutionViewport.height * this.config.qualityScale));\n\n    if (!this.ensureWebGPUColormapTexture(computed.colormapKey, computed.diverging)) return;\n\n    const shared = this.resolveWebGPUPositionAndIndexBuffers(frame, computed);\n    if (!shared) return;\n\n    const resourceCache = this.device?.resourceCache?.webgpu;\n    if (!resourceCache) return;\n    const storageUsage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX;\n\n    const cameraData = new Float32Array(24);\n    cameraData.set(cameraUniforms.viewProjection, 0);\n    cameraData[16] = bandwidthViewport.width;\n    cameraData[17] = bandwidthViewport.height;\n    cameraData[18] = densityWidth;\n    cameraData[19] = densityHeight;\n    cameraData[20] = this.resolveSplatBandwidthPx(frame?.camera, cameraUniforms);\n    cameraData[21] = computed.count;\n    cameraData[22] = computed.positionCount;\n    cameraData[23] = 0;\n    gpu.queue.writeBuffer(this.webgpu.cameraBuffer, 0, cameraData);\n\n    if (context.passEncoder) {\n      context.passEncoder.end();\n      context.passEncoder = null;\n    }\n    let compositePipeline = null;\n    let compositeBindGroup = null;\n\n    if (computed.mode === 'logRatio') {\n      if (!this.ensureWebGPULogRatioTextures(densityWidth, densityHeight)) {\n        return;\n      }\n\n      const numeratorBuffer = resourceCache.uploadBuffer(\n        gpu,\n        gpu.queue,\n        'density:logratio:numerator',\n        computed.numeratorWeights,\n        {\n          label: 'Density log-ratio numerator weights',\n          version: `${this.version}:logratio:numerator:${this.webgpu.weightUploadVersion}`,\n          count: computed.count,\n        },\n        storageUsage,\n      );\n      this.webgpu.weightUploadVersion += 1;\n\n      const denominatorBuffer = resourceCache.uploadBuffer(\n        gpu,\n        gpu.queue,\n        'density:logratio:denominator',\n        computed.denominatorWeights,\n        {\n          label: 'Density log-ratio denominator weights',\n          version: `${this.version}:logratio:denominator:${this.webgpu.weightUploadVersion}`,\n          count: computed.count,\n        },\n        storageUsage,\n      );\n      this.webgpu.weightUploadVersion += 1;\n\n      const numeratorBindGroup = gpu.createBindGroup({\n        layout: this.webgpu.splatLayout,\n        entries: [\n          { binding: 0, resource: { buffer: this.webgpu.cameraBuffer } },\n          { binding: 1, resource: { buffer: shared.indexBuffer } },\n          { binding: 2, resource: { buffer: shared.positionBuffer } },\n          { binding: 3, resource: { buffer: numeratorBuffer } },\n        ],\n      });\n      const denominatorBindGroup = gpu.createBindGroup({\n        layout: this.webgpu.splatLayout,\n        entries: [\n          { binding: 0, resource: { buffer: this.webgpu.cameraBuffer } },\n          { binding: 1, resource: { buffer: shared.indexBuffer } },\n          { binding: 2, resource: { buffer: shared.positionBuffer } },\n          { binding: 3, resource: { buffer: denominatorBuffer } },\n        ],\n      });\n\n      this.renderWebGPUSplatPass(context, numeratorBindGroup, this.webgpu.numeratorTexture, computed);\n      this.renderWebGPUSplatPass(context, denominatorBindGroup, this.webgpu.denominatorTexture, computed);\n\n      const supportWindow = resolveLogRatioSupportWindow(\n        this.config.epsilon,\n        this.config.maskThreshold,\n        this.config.logRatioSupportCorrection,\n      );\n      const compositeData = new Float32Array(12);\n      compositeData[0] = this.config.epsilon;\n      compositeData[1] = Math.max(Math.abs(computed.valueDomain?.[1] ?? this.config.logRatioRange), 1e-6);\n      compositeData[2] = supportWindow.floor;\n      compositeData[3] = this.config.topographic ? 1 : 0;\n      compositeData[4] = 14.0;\n      compositeData[5] = 0.18;\n      compositeData[6] = supportWindow.ceil;\n      compositeData[7] = this.config.logRatioSupportCorrection ? 1 : 0;\n      compositeData[8] = Math.max(Number(computed.numeratorTotal ?? 0), 0);\n      compositeData[9] = Math.max(Number(computed.denominatorTotal ?? 0), 0);\n      compositeData[10] = this.config.logRatioZScore ? 1 : 0;\n      gpu.queue.writeBuffer(this.webgpu.compositeLogRatioParamsBuffer, 0, compositeData);\n\n      this.webgpu.bindGroupCompositeLogRatio = gpu.createBindGroup({\n        layout: this.webgpu.compositeLogRatioLayout,\n        entries: [\n          { binding: 0, resource: this.webgpu.sampler },\n          { binding: 1, resource: this.webgpu.numeratorTexture.createView() },\n          { binding: 2, resource: this.webgpu.denominatorTexture.createView() },\n          { binding: 3, resource: this.webgpu.colormapTexture.createView() },\n          { binding: 4, resource: { buffer: this.webgpu.compositeLogRatioParamsBuffer } },\n        ],\n      });\n\n      compositePipeline = this.webgpu.pipelineCompositeLogRatio;\n      compositeBindGroup = this.webgpu.bindGroupCompositeLogRatio;\n    } else {\n      if (!this.ensureWebGPUDensityTexture(densityWidth, densityHeight)) {\n        return;\n      }\n\n      const weightsBuffer = resourceCache.uploadBuffer(\n        gpu,\n        gpu.queue,\n        'density:node:weights',\n        computed.weights,\n        {\n          label: 'Density node weights',\n          version: `${this.version}:${this.webgpu.weightUploadVersion}`,\n          count: computed.count,\n        },\n        storageUsage,\n      );\n      this.webgpu.weightUploadVersion += 1;\n\n      this.webgpu.bindGroupSplat = gpu.createBindGroup({\n        layout: this.webgpu.splatLayout,\n        entries: [\n          { binding: 0, resource: { buffer: this.webgpu.cameraBuffer } },\n          { binding: 1, resource: { buffer: shared.indexBuffer } },\n          { binding: 2, resource: { buffer: shared.positionBuffer } },\n          { binding: 3, resource: { buffer: weightsBuffer } },\n        ],\n      });\n      this.renderWebGPUSplatPass(context, this.webgpu.bindGroupSplat, this.webgpu.densityTexture, computed);\n\n      const compositeData = new Float32Array(8);\n      compositeData[0] = this.config.weightScale;\n      compositeData[1] = computed.diverging ? 1 : 0;\n      compositeData[2] = this.config.topographic ? 1 : 0;\n      compositeData[3] = 14.0;\n      compositeData[4] = 0.18;\n      gpu.queue.writeBuffer(this.webgpu.compositeParamsBuffer, 0, compositeData);\n\n      this.webgpu.bindGroupComposite = gpu.createBindGroup({\n        layout: this.webgpu.compositeLayout,\n        entries: [\n          { binding: 0, resource: this.webgpu.sampler },\n          { binding: 1, resource: this.webgpu.densityTexture.createView() },\n          { binding: 2, resource: this.webgpu.colormapTexture.createView() },\n          { binding: 3, resource: { buffer: this.webgpu.compositeParamsBuffer } },\n        ],\n      });\n\n      compositePipeline = this.webgpu.pipelineComposite;\n      compositeBindGroup = this.webgpu.bindGroupComposite;\n    }\n\n    const compositePass = context.commandEncoder.beginRenderPass({\n      colorAttachments: [{\n        view: context.colorView,\n        loadOp: 'load',\n        storeOp: 'store',\n      }],\n      ...(context.depthView\n        ? {\n            depthStencilAttachment: {\n              view: context.depthView,\n              depthLoadOp: 'load',\n              depthStoreOp: 'store',\n            },\n          }\n        : {}),\n    });\n\n    if (viewport && compositePass.setViewport) {\n      compositePass.setViewport(viewport.x, viewport.y, viewport.width, viewport.height, 0, 1);\n    }\n\n    compositePass.setPipeline(compositePipeline);\n    compositePass.setBindGroup(0, compositeBindGroup);\n\n    compositePass.setVertexBuffer(0, context.quad);\n    compositePass.draw(4, 1, 0, 0);\n\n    context.passEncoder = compositePass;\n  }\n}\n\nexport default DensityLayer;\n","export const DOCK_MODES = Object.freeze([\n  'free',\n  'left',\n  'right',\n  'top',\n  'bottom',\n  'top-left',\n  'top-right',\n  'bottom-left',\n  'bottom-right',\n]);\n\nexport function resolveDockTarget(dock) {\n  if (!dock || dock === 'free') return 'free';\n  if (dock === 'top' || dock === 'bottom') return dock;\n  if (dock.includes('left')) return 'left';\n  if (dock.includes('right')) return 'right';\n  return 'free';\n}\n\nexport function isSideDockMode(dock) {\n  const target = resolveDockTarget(dock);\n  return target === 'left' || target === 'right';\n}\n\nexport function computeDockMode({\n  x,\n  y,\n  width,\n  height,\n  containerWidth,\n  containerHeight,\n  threshold = 18,\n}) {\n  const left = x <= threshold;\n  const top = y <= threshold;\n  const right = (x + width) >= (containerWidth - threshold);\n  const bottom = (y + height) >= (containerHeight - threshold);\n\n  if (left && top) return 'top-left';\n  if (right && top) return 'top-right';\n  if (left && bottom) return 'bottom-left';\n  if (right && bottom) return 'bottom-right';\n  if (left) return 'left';\n  if (right) return 'right';\n  // Top/bottom edge docking is intentionally disabled. Panels only snap to side docks.\n  return 'free';\n}\n","export function computeResizedWidth({\n  startWidth,\n  startClientX,\n  clientX,\n  edge = 'right',\n  minWidth = 240,\n  maxWidth = Infinity,\n}) {\n  const baseWidth = Number(startWidth);\n  if (!Number.isFinite(baseWidth)) return null;\n  const dx = Number(clientX) - Number(startClientX);\n  if (!Number.isFinite(dx)) return null;\n  const delta = edge === 'left' ? -dx : dx;\n  const next = baseWidth + delta;\n  const clamped = Math.max(minWidth, Math.min(maxWidth, next));\n  return clamped;\n}\n\n","function normalizePanelToken(value) {\n  return String(value ?? '')\n    .trim()\n    .toLowerCase()\n    .replace(/^helios-ui-/, '')\n    .replace(/[^a-z0-9]+/g, '-')\n    .replace(/^-+|-+$/g, '');\n}\n\nexport function resolvePanelIconKind(source = {}) {\n  const id = normalizePanelToken(source?.id ?? source?.panelId);\n  const title = normalizePanelToken(source?.title ?? source?.heading);\n  const token = id || title;\n\n  if (token.includes('data')) return 'data';\n  if (token.includes('debug')) return 'debug';\n  if (token.includes('scene') || token.includes('demo')) return 'scene';\n  if (token.includes('metrics')) return 'metrics';\n  if (token.includes('mapper')) return 'mappers';\n  if (token.includes('layout')) return 'layout';\n  if (token.includes('legend')) return 'legends';\n  if (token.includes('filter')) return 'filter';\n  if (token.includes('camera')) return 'camera';\n  if (token.includes('selection')) return 'selection';\n  return 'panel';\n}\n\nexport function createPanelIcon(doc, source = {}, options = {}) {\n  const iconKind = typeof source === 'string' ? source : resolvePanelIconKind(source);\n  const svg = doc.createElementNS('http://www.w3.org/2000/svg', 'svg');\n  svg.setAttribute('viewBox', '0 0 24 24');\n  svg.setAttribute('aria-hidden', 'true');\n  svg.classList.add(options.className ?? 'helios-ui-panel-icon');\n\n  const addPath = (d, extra = {}) => {\n    const path = doc.createElementNS('http://www.w3.org/2000/svg', 'path');\n    path.setAttribute('d', d);\n    path.setAttribute('fill', extra.fill ?? 'none');\n    path.setAttribute('stroke', extra.stroke ?? 'currentColor');\n    path.setAttribute('stroke-width', extra.strokeWidth ?? '1.8');\n    path.setAttribute('stroke-linecap', extra.strokeLinecap ?? 'round');\n    path.setAttribute('stroke-linejoin', extra.strokeLinejoin ?? 'round');\n    svg.appendChild(path);\n  };\n\n  if (iconKind === 'data') {\n    addPath('M5 7.5C5 6.12 8.13 5 12 5s7 1.12 7 2.5S15.87 10 12 10 5 8.88 5 7.5Z');\n    addPath('M5 7.5v4C5 12.88 8.13 14 12 14s7-1.12 7-2.5v-4');\n    addPath('M5 11.5v5C5 17.88 8.13 19 12 19s7-1.12 7-2.5v-5');\n  } else if (iconKind === 'debug') {\n    addPath('M5 6.5h14');\n    addPath('M5 12h14');\n    addPath('M5 17.5h14');\n    addPath('M8 4.5v4');\n    addPath('M16 10v4');\n    addPath('M11 15.5v4');\n  } else if (iconKind === 'scene') {\n    addPath('M12 4v4');\n    addPath('M12 16v4');\n    addPath('M4 12h4');\n    addPath('M16 12h4');\n    addPath('M6.7 6.7l2.8 2.8');\n    addPath('M14.5 14.5l2.8 2.8');\n    addPath('M17.3 6.7l-2.8 2.8');\n    addPath('M9.5 14.5l-2.8 2.8');\n    addPath('M12 9.2a2.8 2.8 0 1 1 0 5.6a2.8 2.8 0 0 1 0-5.6');\n  } else if (iconKind === 'metrics') {\n    addPath('M5 19V9');\n    addPath('M12 19V5');\n    addPath('M19 19v-7');\n    addPath('M4 19h16');\n  } else if (iconKind === 'mappers') {\n    addPath('M6 7.5a1.5 1.5 0 1 1 0 3a1.5 1.5 0 0 1 0-3');\n    addPath('M18 5a1.5 1.5 0 1 1 0 3a1.5 1.5 0 0 1 0-3');\n    addPath('M18 16a1.5 1.5 0 1 1 0 3a1.5 1.5 0 0 1 0-3');\n    addPath('M7.4 8.7 16.6 6.8');\n    addPath('M7.4 9.9 16.6 17.1');\n  } else if (iconKind === 'layout') {\n    addPath('M7 7a2 2 0 1 1 0 .01');\n    addPath('M17 7a2 2 0 1 1 0 .01');\n    addPath('M12 17a2 2 0 1 1 0 .01');\n    addPath('M8.6 8.1 10.9 15');\n    addPath('M15.4 8.1 13.1 15');\n    addPath('M9 7h6');\n  } else if (iconKind === 'legends') {\n    addPath('M6 6.5h3');\n    addPath('M6 12h3');\n    addPath('M6 17.5h3');\n    addPath('M11.5 6.5H18');\n    addPath('M11.5 12H18');\n    addPath('M11.5 17.5H18');\n  } else if (iconKind === 'filter') {\n    addPath('M4.5 6h15l-6 7v4.5l-3 1.5V13L4.5 6Z');\n  } else if (iconKind === 'camera') {\n    addPath('M5 8.5h3l1.4-2h5.2l1.4 2H19a1.5 1.5 0 0 1 1.5 1.5v7A1.5 1.5 0 0 1 19 18.5H5A1.5 1.5 0 0 1 3.5 17v-7A1.5 1.5 0 0 1 5 8.5Z');\n    addPath('M12 10a3.25 3.25 0 1 1 0 6.5a3.25 3.25 0 0 1 0-6.5');\n  } else if (iconKind === 'selection') {\n    addPath('M12 5v3');\n    addPath('M12 16v3');\n    addPath('M5 12h3');\n    addPath('M16 12h3');\n    addPath('M8.5 8.5l1.8 1.8');\n    addPath('M13.7 13.7l1.8 1.8');\n    addPath('M15.5 8.5l-1.8 1.8');\n    addPath('M10.3 13.7l-1.8 1.8');\n    addPath('M12 9.75a2.25 2.25 0 1 1 0 4.5a2.25 2.25 0 0 1 0-4.5');\n  } else {\n    addPath('M6 6h12v12H6Z');\n    addPath('M9 10h6');\n    addPath('M9 14h4');\n  }\n\n  return svg;\n}\n","import { createPanelIcon, resolvePanelIconKind } from '../panelIcons.js';\n\nconst BaseHTMLElement = globalThis.HTMLElement ?? class {};\n\nexport class HeliosPanelElement extends BaseHTMLElement {\n  static get observedAttributes() {\n    return ['heading', 'collapsed', 'dock', 'panel-id', 'panel-icon'];\n  }\n\n  constructor() {\n    super();\n    this._built = false;\n    this._onCollapseClick = null;\n  }\n\n  ensureBuilt() {\n    this._build();\n    this._syncFromAttributes();\n  }\n\n  _build() {\n    if (this._built) return;\n    this._built = true;\n\n    const doc = this.ownerDocument ?? document;\n\n    this.classList.add('helios-ui-panel');\n\n    this.resizeHandleEl = doc.createElement('div');\n    this.resizeHandleEl.className = 'helios-ui-resize-handle';\n\n    this.headerEl = doc.createElement('div');\n    this.headerEl.className = 'helios-ui-panel__header';\n\n    this.titleWrapEl = doc.createElement('div');\n    this.titleWrapEl.className = 'helios-ui-panel__title-wrap';\n\n    this.titleIconEl = doc.createElement('div');\n    this.titleIconEl.className = 'helios-ui-panel__title-icon';\n\n    this.titleEl = doc.createElement('div');\n    this.titleEl.className = 'helios-ui-panel__title';\n\n    this.actionsEl = doc.createElement('div');\n    this.actionsEl.className = 'helios-ui-panel__actions';\n\n    this.collapseButtonEl = doc.createElement('button');\n    this.collapseButtonEl.className = 'helios-ui-button';\n    this.collapseButtonEl.type = 'button';\n\n    this.actionsEl.appendChild(this.collapseButtonEl);\n    this.titleWrapEl.appendChild(this.titleIconEl);\n    this.titleWrapEl.appendChild(this.titleEl);\n    this.headerEl.appendChild(this.titleWrapEl);\n    this.headerEl.appendChild(this.actionsEl);\n\n    this.bodyEl = doc.createElement('div');\n    this.bodyEl.className = 'helios-ui-panel__body';\n\n    this.appendChild(this.resizeHandleEl);\n    this.appendChild(this.headerEl);\n    this.appendChild(this.bodyEl);\n\n    this._ensureCollapseBinding();\n  }\n\n  _ensureCollapseBinding() {\n    if (!this.collapseButtonEl) return;\n    if (!this._onCollapseClick) {\n      this._onCollapseClick = () => this.toggleCollapsed();\n    }\n    this.collapseButtonEl.removeEventListener('click', this._onCollapseClick);\n    this.collapseButtonEl.addEventListener('click', this._onCollapseClick);\n  }\n\n  connectedCallback() {\n    this.ensureBuilt();\n    this._ensureCollapseBinding();\n    this._upgradeProperty('heading');\n    this._upgradeProperty('collapsed');\n    this._upgradeProperty('dock');\n    this._upgradeProperty('panelId');\n    this._syncFromAttributes();\n  }\n\n  disconnectedCallback() {}\n\n  _upgradeProperty(prop) {\n    if (Object.prototype.hasOwnProperty.call(this, prop)) {\n      const value = this[prop];\n      delete this[prop];\n      this[prop] = value;\n    }\n  }\n\n  attributeChangedCallback() {\n    if (!this._built) return;\n    this._syncFromAttributes();\n  }\n\n  _syncFromAttributes() {\n    const heading = this.getAttribute('heading') ?? '';\n    if (this.titleEl) this.titleEl.textContent = heading;\n    const panelId = this.getAttribute('panel-id') ?? this.dataset.panelId ?? null;\n    const explicitIcon = this.getAttribute('panel-icon') ?? null;\n    const iconKind = explicitIcon || resolvePanelIconKind({ id: panelId, heading });\n    if (this.titleIconEl) {\n      this.titleIconEl.replaceChildren(createPanelIcon(this.ownerDocument ?? document, iconKind));\n      this.titleIconEl.hidden = !iconKind;\n    }\n\n    const dock = this.getAttribute('dock') ?? this.dataset.dock ?? 'free';\n    this.dataset.dock = dock;\n\n    const collapsed = this.hasAttribute('collapsed');\n    this.dataset.collapsed = collapsed ? 'true' : 'false';\n\n    if (this.collapseButtonEl) {\n      this.collapseButtonEl.textContent = collapsed ? '+' : '—';\n      this.collapseButtonEl.title = collapsed ? 'Expand' : 'Collapse';\n    }\n    if (panelId != null) {\n      this.dataset.panelId = String(panelId);\n    }\n  }\n\n  get heading() {\n    return this.getAttribute('heading') ?? '';\n  }\n\n  set heading(value) {\n    if (value == null) this.removeAttribute('heading');\n    else this.setAttribute('heading', String(value));\n  }\n\n  get dock() {\n    return this.getAttribute('dock') ?? 'free';\n  }\n\n  set dock(value) {\n    if (value == null) this.removeAttribute('dock');\n    else this.setAttribute('dock', String(value));\n  }\n\n  get panelId() {\n    return this.getAttribute('panel-id') ?? null;\n  }\n\n  set panelId(value) {\n    if (value == null) this.removeAttribute('panel-id');\n    else this.setAttribute('panel-id', String(value));\n  }\n\n  get panelIcon() {\n    return this.getAttribute('panel-icon') ?? null;\n  }\n\n  set panelIcon(value) {\n    if (value == null || value === '') this.removeAttribute('panel-icon');\n    else this.setAttribute('panel-icon', String(value));\n  }\n\n  get collapsed() {\n    return this.hasAttribute('collapsed') || this.dataset.collapsed === 'true';\n  }\n\n  set collapsed(value) {\n    if (value) this.setAttribute('collapsed', '');\n    else this.removeAttribute('collapsed');\n  }\n\n  setContent(content) {\n    if (!this.bodyEl) return;\n    this.bodyEl.textContent = '';\n    if (content) this.bodyEl.appendChild(content);\n  }\n\n  setCollapsed(collapsed) {\n    this.collapsed = Boolean(collapsed);\n    this._syncFromAttributes();\n  }\n\n  toggleCollapsed() {\n    this.setCollapsed(!this.collapsed);\n  }\n}\n","import { HeliosPanelElement } from './HeliosPanelElement.js';\n\n/**\n * Register Helios Web custom elements in a document or window.\n *\n * @public\n * @apiSection User Interface\n * @param {Document|Window} [docOrWin=document] - Registration target.\n * @returns {{defined:Array<string>,supported:boolean}} Registration result.\n */\nexport function defineHeliosWebComponents(docOrWin = document) {\n  const doc = docOrWin?.nodeType === 9\n    ? docOrWin\n    : (docOrWin?.document ?? document);\n\n  const win = doc?.defaultView ?? (typeof window !== 'undefined' ? window : null);\n  const registry = win?.customElements ?? null;\n\n  if (!registry) {\n    return { defined: [], supported: false };\n  }\n\n  const defined = [];\n\n  if (!registry.get('helios-panel')) {\n    registry.define('helios-panel', HeliosPanelElement);\n    defined.push('helios-panel');\n  }\n\n  return { defined, supported: true };\n}\n","import { computeDockMode } from './docking.js';\nimport { computeResizedWidth } from './resize.js';\nimport { defineHeliosWebComponents } from '../web-components/defineHeliosWebComponents.js';\n\nconst DEFAULT_POSITION = Object.freeze({ x: 12, y: 12 });\nconst DEFAULT_DOCK_THRESHOLD = 18;\nconst DEFAULT_MIN_WIDTH = 240;\n\nexport class Panel {\n  constructor(options) {\n    if (!options?.id) throw new Error('Panel requires an id');\n    this.id = options.id;\n    this.title = options.title ?? options.id;\n    this._baseDraggable = Boolean(options.draggable ?? true);\n    this.draggable = this._baseDraggable;\n    this.onDockChange = typeof options.onDockChange === 'function' ? options.onDockChange : null;\n    this.onHeaderPointerDown = typeof options.onHeaderPointerDown === 'function' ? options.onHeaderPointerDown : null;\n    this.position = { ...(options.position ?? DEFAULT_POSITION) };\n    this.lastFreePosition = { ...this.position };\n    this.dock = options.dock ?? 'free';\n    this._dockEdgeOverride = null;\n    this._responsiveMode = 'desktop';\n    this.dockThreshold = options.dockThreshold ?? DEFAULT_DOCK_THRESHOLD;\n    this.minWidth = options.minWidth ?? DEFAULT_MIN_WIDTH;\n    this.width = options.width ?? null;\n    this.getContainerRect = typeof options.getContainerRect === 'function'\n      ? options.getContainerRect\n      : () => this.element?.parentElement?.getBoundingClientRect?.();\n\n    const doc = options?.content?.ownerDocument ?? document;\n    defineHeliosWebComponents(doc);\n\n    this.element = doc.createElement('helios-panel');\n    this.element.dataset.panelId = this.id;\n    this.element.setAttribute('panel-id', this.id);\n    if (options.icon) this.element.setAttribute('panel-icon', options.icon);\n    if (options.collapsed === true) {\n      this.element.setAttribute('collapsed', '');\n    }\n    this.element.dataset.collapsed = options.collapsed === true ? 'true' : 'false';\n    this.element.setAttribute('heading', this.title);\n    this.element.setAttribute('dock', this.dock);\n    this.element.ensureBuilt?.();\n    if (this.width != null) this.element.style.width = `${Number(this.width)}px`;\n    this.element.style.minWidth = `${Number(this.minWidth)}px`;\n\n    this.resizeHandle = this.element.querySelector('.helios-ui-resize-handle');\n    this._syncResizeHandleEdge();\n    this._applyDock();\n\n    this.header = this.element.querySelector('.helios-ui-panel__header');\n    this.titleEl = this.element.querySelector('.helios-ui-panel__title');\n    this.actionsEl = this.element.querySelector('.helios-ui-panel__actions');\n    this.collapseButton = this.element.querySelector('.helios-ui-panel__actions .helios-ui-button');\n    this.body = this.element.querySelector('.helios-ui-panel__body');\n    if (this.body && options.content) this.body.appendChild(options.content);\n\n    this._drag = null;\n    this._resize = null;\n    this._onPointerDown = (e) => this._handlePointerDown(e);\n    this.header?.addEventListener('pointerdown', this._onPointerDown);\n\n    this._onResizePointerDown = (e) => this._handleResizePointerDown(e);\n    this.resizeHandle?.addEventListener('pointerdown', this._onResizePointerDown);\n  }\n\n  setZIndex(zIndex) {\n    this.element.style.zIndex = String(zIndex);\n  }\n\n  setPosition(x, y) {\n    this.position = { x, y };\n    if (this.dock !== 'free') return;\n    this.element.style.left = `${x}px`;\n    this.element.style.top = `${y}px`;\n  }\n\n  setDock(mode) {\n    if (!mode) mode = 'free';\n    if (mode === this.dock) return;\n    if (this.dock === 'free') {\n      this.lastFreePosition = { ...this.position };\n    }\n    this.dock = mode;\n    this.element.dataset.dock = mode;\n    this.element.setAttribute('dock', mode);\n    this._syncResizeHandleEdge();\n    this._applyDock();\n    this.onDockChange?.(this, mode);\n  }\n\n  _syncResizeHandleEdge() {\n    const dock = this._dockEdgeOverride ?? this.dock ?? 'free';\n    const edge = dock.includes('right') ? 'left' : 'right';\n    if (this.resizeHandle) this.resizeHandle.dataset.edge = edge;\n  }\n\n  setDockEdgeOverride(side = null) {\n    this._dockEdgeOverride = side === 'left' || side === 'right' ? side : null;\n    this._syncResizeHandleEdge();\n    return this;\n  }\n\n  setResponsiveMode(mode = 'desktop') {\n    const next = typeof mode === 'string' ? mode : 'desktop';\n    this._responsiveMode = next;\n    this.draggable = next === 'fullscreen' ? false : this._baseDraggable;\n    this.element.dataset.responsiveMode = next;\n    this._applyDock();\n    return this;\n  }\n\n  _applyDock() {\n    if (this._responsiveMode === 'fullscreen') {\n      this.element.style.position = 'relative';\n      this.element.style.left = '';\n      this.element.style.top = '';\n      this.element.style.right = '';\n      this.element.style.bottom = '';\n      this.element.style.width = '100%';\n      this.element.style.maxWidth = 'none';\n      this.element.style.minWidth = '0';\n      this.element.style.height = '';\n      this._syncResizeHandleEdge();\n      return;\n    }\n\n    if (this._responsiveMode === 'compact') {\n      const rect = this.element.getBoundingClientRect();\n      const width = this.width ?? (rect.width || 320);\n      this.element.style.position = 'relative';\n      this.element.style.left = '';\n      this.element.style.top = '';\n      this.element.style.right = '';\n      this.element.style.bottom = '';\n      this.element.style.width = `${width}px`;\n      this.element.style.maxWidth = 'none';\n      this.element.style.minWidth = `${Number(this.minWidth)}px`;\n      this.element.style.height = '';\n      this._syncResizeHandleEdge();\n      return;\n    }\n\n    const mode = this.dock ?? 'free';\n    if (mode === 'free') {\n      this.element.style.position = 'absolute';\n      this.element.style.right = '';\n      this.element.style.bottom = '';\n      if (this.width == null) this.element.style.width = '';\n      this.element.style.height = '';\n      this.element.style.maxWidth = '';\n      this.element.style.minWidth = '';\n      this.element.style.left = `${this.position.x}px`;\n      this.element.style.top = `${this.position.y}px`;\n      this._syncResizeHandleEdge();\n      return;\n    }\n\n    const rect = this.element.getBoundingClientRect();\n    const width = this.width ?? (rect.width || 320);\n    const height = rect.height || 240;\n\n    const clear = () => {\n      this.element.style.left = '';\n      this.element.style.top = '';\n      this.element.style.right = '';\n      this.element.style.bottom = '';\n      this.element.style.width = '';\n      this.element.style.height = '';\n    };\n\n    clear();\n\n    if (mode === 'left' || mode === 'right' || mode.endsWith('-left') || mode.endsWith('-right')) {\n      this.element.style.position = 'relative';\n      this.element.style.width = `${width}px`;\n      return;\n    }\n    if (mode === 'top') {\n      this.element.style.position = 'absolute';\n      this.element.style.left = '0px';\n      this.element.style.top = '0px';\n      this.element.style.right = '0px';\n      this.element.style.width = 'auto';\n      this.element.style.maxWidth = 'none';\n      this.element.style.minWidth = '0';\n      this.element.style.height = `${height}px`;\n      this._syncResizeHandleEdge();\n      return;\n    }\n    if (mode === 'bottom') {\n      this.element.style.position = 'absolute';\n      this.element.style.left = '0px';\n      this.element.style.right = '0px';\n      this.element.style.bottom = '0px';\n      this.element.style.width = 'auto';\n      this.element.style.maxWidth = 'none';\n      this.element.style.minWidth = '0';\n      this.element.style.height = `${height}px`;\n      this._syncResizeHandleEdge();\n      return;\n    }\n  }\n\n  collapsed() {\n    return this.element.dataset.collapsed === 'true';\n  }\n\n  setCollapsed(collapsed) {\n    if (typeof this.element.setCollapsed === 'function') {\n      this.element.setCollapsed(collapsed);\n      return;\n    }\n    this.element.dataset.collapsed = collapsed ? 'true' : 'false';\n    if (this.collapseButton) {\n      this.collapseButton.textContent = collapsed ? '+' : '—';\n      this.collapseButton.title = collapsed ? 'Expand' : 'Collapse';\n    }\n  }\n\n  toggleCollapsed() {\n    if (typeof this.element.toggleCollapsed === 'function') {\n      this.element.toggleCollapsed();\n      return;\n    }\n    this.setCollapsed(!this.collapsed());\n  }\n\n  serializeState() {\n    return {\n      id: this.id,\n      dock: this.dock,\n      position: { ...this.position },\n      lastFreePosition: { ...this.lastFreePosition },\n      width: Number.isFinite(this.width) ? this.width : null,\n      collapsed: this.collapsed(),\n    };\n  }\n\n  restoreState(state = {}) {\n    if (!state || typeof state !== 'object') return this;\n    if (state.lastFreePosition && typeof state.lastFreePosition === 'object') {\n      this.lastFreePosition = {\n        x: Number.isFinite(state.lastFreePosition.x) ? Number(state.lastFreePosition.x) : this.lastFreePosition.x,\n        y: Number.isFinite(state.lastFreePosition.y) ? Number(state.lastFreePosition.y) : this.lastFreePosition.y,\n      };\n    }\n    if (Number.isFinite(state.width)) {\n      this.width = Number(state.width);\n      this.element.style.width = `${this.width}px`;\n    }\n    if (typeof state.dock === 'string' && state.dock.trim()) {\n      this.setDock(state.dock);\n    }\n    if (state.position && typeof state.position === 'object') {\n      this.setPosition(\n        Number.isFinite(state.position.x) ? Number(state.position.x) : this.position.x,\n        Number.isFinite(state.position.y) ? Number(state.position.y) : this.position.y,\n      );\n    }\n    if (Object.prototype.hasOwnProperty.call(state, 'collapsed')) {\n      this.setCollapsed(state.collapsed === true);\n    }\n    return this;\n  }\n\n  _handlePointerDown(event) {\n    if (!this.draggable) return;\n    if (event.button !== 0) return;\n    const target = event.target;\n    if (target instanceof HTMLElement && target.closest('button, input, select, textarea, .helios-ui-resize-handle')) return;\n    if (this.onHeaderPointerDown?.(event, this) === true) {\n      event.preventDefault();\n      return;\n    }\n\n    this.beginDragFromHeaderPointer(event, {\n      containerRect: this.getContainerRect?.(),\n    });\n    event.preventDefault();\n  }\n\n  beginDragFromHeaderPointer(event, options = {}) {\n    if (!event) return;\n    const containerRect = options.containerRect ?? this.getContainerRect?.();\n    const panelRect = this.element.getBoundingClientRect();\n    const rawOffsetX = Number.isFinite(options.offsetX) ? options.offsetX : (event.clientX - panelRect.left);\n    const rawOffsetY = Number.isFinite(options.offsetY) ? options.offsetY : (event.clientY - panelRect.top);\n    const offsetX = this._clampDragOffset(rawOffsetX, panelRect.width);\n    const offsetY = this._clampDragOffset(rawOffsetY, panelRect.height);\n\n    if (this.dock !== 'free') {\n      const left = containerRect?.left ?? 0;\n      const top = containerRect?.top ?? 0;\n      const nextX = event.clientX - left - offsetX;\n      const nextY = event.clientY - top - offsetY;\n      this.setDock('free');\n      this.setPosition(nextX, nextY);\n    }\n\n    this._drag = {\n      pointerId: event.pointerId,\n      startX: event.clientX,\n      startY: event.clientY,\n      originX: this.position.x,\n      originY: this.position.y,\n      offsetX,\n      offsetY,\n    };\n    this.header?.setPointerCapture?.(event.pointerId);\n  }\n\n  _clampDragOffset(value, size) {\n    const numericValue = Number(value);\n    const numericSize = Number(size);\n    if (!Number.isFinite(numericValue)) return 0;\n    if (!Number.isFinite(numericSize) || numericSize <= 0) return numericValue;\n    const margin = Math.min(12, Math.max(0, numericSize / 2));\n    return Math.max(margin, Math.min(numericSize - margin, numericValue));\n  }\n\n  _clampFreePosition(x, y, containerRect) {\n    const width = Number(this.element?.offsetWidth || this.element?.getBoundingClientRect?.().width || 0);\n    const headerRect = this.header?.getBoundingClientRect?.();\n    const headerHeight = Number(headerRect?.height || 30);\n    const containerWidth = Number(containerRect?.width || 0);\n    const containerHeight = Number(containerRect?.height || 0);\n    const minHeaderVisibleWidth = Math.max(72, Math.min(width || 72, 180));\n    const minX = minHeaderVisibleWidth - (width || minHeaderVisibleWidth);\n    const maxX = containerWidth - minHeaderVisibleWidth;\n    const maxY = containerHeight - headerHeight;\n    const numericX = Number(x);\n    const numericY = Number(y);\n    const clampedX = Math.max(minX, Math.min(maxX, numericX));\n    const clampedY = Math.max(0, Math.min(maxY, numericY));\n    return {\n      x: Number.isFinite(clampedX) ? clampedX : 0,\n      y: Number.isFinite(clampedY) ? clampedY : 0,\n    };\n  }\n\n  handlePointerMove(event, options = {}) {\n    if (!this._drag || event.pointerId !== this._drag.pointerId) return;\n    const containerRect = options.containerRect ?? this.getContainerRect?.();\n    const allowDock = Boolean(options.allowDock ?? true);\n    const threshold = options.threshold ?? this.dockThreshold;\n    const keepFree = Boolean(event.shiftKey) || Boolean(options.forceFree ?? false);\n\n    if (!containerRect) {\n      const dx = event.clientX - this._drag.startX;\n      const dy = event.clientY - this._drag.startY;\n      this.setPosition(this._drag.originX + dx, this._drag.originY + dy);\n      return;\n    }\n\n    const left = containerRect.left;\n    const top = containerRect.top;\n\n    const nextX = event.clientX - left - this._drag.offsetX;\n    const nextY = event.clientY - top - this._drag.offsetY;\n    const clamped = this._clampFreePosition(nextX, nextY, containerRect);\n\n    this.setDock('free');\n    this.setPosition(clamped.x, clamped.y);\n\n    if (keepFree || !allowDock) return;\n\n    const rect = this.element.getBoundingClientRect();\n    const dock = computeDockMode({\n      x: rect.left - left,\n      y: rect.top - top,\n      width: rect.width,\n      height: rect.height,\n      containerWidth: containerRect.width,\n      containerHeight: containerRect.height,\n      threshold,\n    });\n    if (dock !== 'free') {\n      this.setDock(dock);\n    }\n  }\n\n  _handleResizePointerDown(event) {\n    if (event.button !== 0) return;\n    const dock = this.dock ?? 'free';\n    if (dock === 'top' || dock === 'bottom') return;\n\n    const rect = this.element.getBoundingClientRect();\n    const edge = this.resizeHandle.dataset.edge === 'left' ? 'left' : 'right';\n    this._resize = {\n      pointerId: event.pointerId,\n      startClientX: event.clientX,\n      startWidth: rect.width,\n      edge,\n    };\n    this.resizeHandle?.setPointerCapture(event.pointerId);\n    event.preventDefault();\n    event.stopPropagation();\n  }\n\n  handleResizeMove(event, options = {}) {\n    if (!this._resize || event.pointerId !== this._resize.pointerId) return null;\n    const containerRect = options.containerRect ?? this.getContainerRect?.();\n    const maxWidth = containerRect ? Math.max(this.minWidth, containerRect.width) : Infinity;\n    const next = computeResizedWidth({\n      startWidth: this._resize.startWidth,\n      startClientX: this._resize.startClientX,\n      clientX: event.clientX,\n      edge: this._resize.edge,\n      minWidth: this.minWidth,\n      maxWidth,\n    });\n    if (next == null) return null;\n    this.width = next;\n    this.element.style.width = `${next}px`;\n    return next;\n  }\n\n  handleResizeUp(event) {\n    if (!this._resize || event.pointerId !== this._resize.pointerId) return;\n    this._resize = null;\n  }\n\n  handlePointerUp(event) {\n    if (!this._drag || event.pointerId !== this._drag.pointerId) return;\n    this._drag = null;\n  }\n\n  syncDockStyles() {\n    this._syncResizeHandleEdge();\n    this._applyDock();\n  }\n\n  destroy() {\n    this.header?.removeEventListener('pointerdown', this._onPointerDown);\n    this.resizeHandle?.removeEventListener('pointerdown', this._onResizePointerDown);\n    this.element.remove();\n  }\n}\n","import { Panel } from './Panel.js';\nimport { resolveDockTarget } from './docking.js';\n\nconst STACK_DRAG_EDGE_SCROLL_PX = 36;\nconst STACK_DRAG_SCROLL_STEP_PX = 20;\nconst COMPACT_MIN_GRAPH_VIEWPORT_PX = 180;\n\nexport class PanelManager {\n  constructor(options) {\n    if (!options?.container) throw new Error('PanelManager requires a container');\n    this.container = options.container;\n    this.allowDrag = Boolean(options.allowDrag ?? true);\n    this.allowDock = Boolean(options.allowDock ?? true);\n    this.dockThreshold = options.dockThreshold ?? 18;\n    this.labelColumn = options.labelColumn ?? { mode: 'auto', minPx: 120, maxPx: 220 };\n    this.panels = new Map();\n    this._zCounter = 1;\n    this._measureCanvas = null;\n    this._dockReorder = null;\n    this._freeDragDockGuards = new Map();\n    this._dockMetricsListeners = new Set();\n    this._eventTarget = this.container?.ownerDocument?.defaultView ?? globalThis.window ?? this.container;\n    this._responsivePresentation = {\n      mode: 'desktop',\n      dockSide: 'left',\n      controlsOpen: false,\n      activePanelId: null,\n      focused: false,\n    };\n\n    this.dockLeft = document.createElement('div');\n    this.dockLeft.className = 'helios-ui-dock helios-ui-dock--side helios-ui-dock--left';\n    this.dockRight = document.createElement('div');\n    this.dockRight.className = 'helios-ui-dock helios-ui-dock--side helios-ui-dock--right';\n    this.fullscreenFlow = document.createElement('div');\n    this.fullscreenFlow.className = 'helios-ui-fullscreen-flow';\n    this.fullscreenFlow.hidden = true;\n    this.container.appendChild(this.dockLeft);\n    this.container.appendChild(this.dockRight);\n    this.container.appendChild(this.fullscreenFlow);\n\n    this._boundDockMetricsResize = () => this._emitDockMetricsChange();\n    if (typeof ResizeObserver === 'function') {\n      this._dockResizeObserver = new ResizeObserver(this._boundDockMetricsResize);\n      this._dockResizeObserver.observe(this.container);\n      this._dockResizeObserver.observe(this.dockLeft);\n      this._dockResizeObserver.observe(this.dockRight);\n    } else {\n      this._dockResizeObserver = null;\n    }\n\n    this._boundMove = (e) => this._handlePointerMove(e);\n    this._boundUp = (e) => this._handlePointerUp(e);\n    this._eventTarget.addEventListener('pointermove', this._boundMove);\n    this._eventTarget.addEventListener('pointerup', this._boundUp);\n    this._eventTarget.addEventListener('pointercancel', this._boundUp);\n    this._emitDockMetricsChange();\n  }\n\n  createPanel(options) {\n    if (!options?.id) throw new Error('createPanel requires id');\n    if (this.panels.has(options.id)) throw new Error(`Panel \"${options.id}\" already exists`);\n    const panel = new Panel({\n      ...options,\n      draggable: this.allowDrag && (options.draggable ?? true),\n      dockThreshold: options.dockThreshold ?? this.dockThreshold,\n      getContainerRect: () => this.container.getBoundingClientRect(),\n      onDockChange: () => this._placePanel(panel),\n      onHeaderPointerDown: (event, panelRef) => this._startSideDockReorder(panelRef, event),\n    });\n    panel.setZIndex(this._nextZ());\n    panel.element.addEventListener('pointerdown', () => panel.setZIndex(this._nextZ()), { capture: true });\n    this.panels.set(panel.id, panel);\n    this._placePanel(panel);\n    this._scheduleAutoFitLabelColumn(panel);\n    this._emitDockMetricsChange();\n    return panel;\n  }\n\n  getPanel(id) {\n    return this.panels.get(id) ?? null;\n  }\n\n  getPanels() {\n    return Array.from(this.panels.values());\n  }\n\n  serializeState() {\n    const panels = {};\n    for (const [id, panel] of this.panels.entries()) {\n      panels[id] = panel.serializeState?.() ?? null;\n    }\n    return {\n      panels,\n      dockOrder: {\n        left: Array.from(this.dockLeft?.children ?? []).map((element) => element.dataset.panelId).filter(Boolean),\n        right: Array.from(this.dockRight?.children ?? []).map((element) => element.dataset.panelId).filter(Boolean),\n      },\n    };\n  }\n\n  restoreState(state = {}) {\n    if (!state || typeof state !== 'object') return this;\n    const panels = state.panels && typeof state.panels === 'object' ? state.panels : {};\n    for (const [id, panelState] of Object.entries(panels)) {\n      this.panels.get(id)?.restoreState?.(panelState);\n    }\n    const leftOrder = Array.isArray(state.dockOrder?.left) ? state.dockOrder.left : [];\n    const rightOrder = Array.isArray(state.dockOrder?.right) ? state.dockOrder.right : [];\n    for (const id of leftOrder) {\n      const panel = this.panels.get(id);\n      if (panel?.element && panel.dock !== 'free') this.dockLeft.appendChild(panel.element);\n    }\n    for (const id of rightOrder) {\n      const panel = this.panels.get(id);\n      if (panel?.element && panel.dock !== 'free') this.dockRight.appendChild(panel.element);\n    }\n    this._emitDockMetricsChange();\n    return this;\n  }\n\n  removePanel(id) {\n    const panel = this.panels.get(id);\n    if (!panel) return;\n    this._freeDragDockGuards.delete(id);\n    if (this._dockReorder?.panel === panel) {\n      this._endSideDockReorder({ pointerId: this._dockReorder.pointerId }, { force: true });\n    }\n    panel.destroy();\n    this.panels.delete(id);\n    this._emitDockMetricsChange();\n  }\n\n  _nextZ() {\n    this._zCounter += 1;\n    return this._zCounter;\n  }\n\n  _handlePointerMove(event) {\n    if (this._dockReorder && event.pointerId === this._dockReorder.pointerId) {\n      if (this._moveSideDockReorder(event)) return;\n    }\n\n    const rect = this.container.getBoundingClientRect();\n    for (const panel of this.panels.values()) {\n      const resizedWidth = panel.handleResizeMove(event, {\n        containerRect: rect,\n        maxWidth: this._getPanelResizeMaxWidth(panel, rect),\n      });\n      if (resizedWidth != null) {\n        this._syncDockedWidths(panel, resizedWidth);\n      }\n      const forceFree = this._shouldForceFreeWhileDragging(panel, event);\n      panel.handlePointerMove(event, {\n        containerRect: rect,\n        allowDock: this.allowDock,\n        threshold: this.dockThreshold,\n        forceFree,\n      });\n      if (this._trySwitchFreeDragToDockReorder(panel, event)) return;\n    }\n  }\n\n  _handlePointerUp(event) {\n    if (this._dockReorder && event.pointerId === this._dockReorder.pointerId) {\n      this._endSideDockReorder(event);\n      return;\n    }\n    for (const panel of this.panels.values()) {\n      panel.handleResizeUp(event);\n      panel.handlePointerUp(event);\n      this._clearFreeDragDockGuard(panel, event);\n    }\n  }\n\n  _placePanel(panel) {\n    if (!panel?.element) return;\n\n    if (this._dockReorder?.panel === panel) {\n      return;\n    }\n\n    const target = this._resolveEffectiveSideDockTarget(panel);\n    if (target === 'left') {\n      this._matchSideDockWidth(panel, 'left');\n      panel.element.dataset.sideDocked = 'true';\n      if (panel.element.parentElement !== this.dockLeft) this.dockLeft.appendChild(panel.element);\n      panel.syncDockStyles();\n      this._emitDockMetricsChange();\n      return;\n    }\n    if (target === 'right') {\n      this._matchSideDockWidth(panel, 'right');\n      panel.element.dataset.sideDocked = 'true';\n      if (panel.element.parentElement !== this.dockRight) this.dockRight.appendChild(panel.element);\n      panel.syncDockStyles();\n      this._emitDockMetricsChange();\n      return;\n    }\n\n    delete panel.element.dataset.sideDocked;\n    if (panel.element.parentElement !== this.container) this.container.appendChild(panel.element);\n    panel.syncDockStyles();\n    this._emitDockMetricsChange();\n  }\n\n  _syncDockedWidths(sourcePanel, width) {\n    const target = this._resolveEffectiveSideDockTarget(sourcePanel);\n    let side = null;\n    if (target === 'left') side = 'left';\n    else if (target === 'right') side = 'right';\n    if (!side) return;\n\n    const numeric = Number(width);\n    if (!Number.isFinite(numeric)) return;\n    const maxWidth = this._getPanelResizeMaxWidth(sourcePanel, this.container.getBoundingClientRect());\n    const minWidth = this._getSideDockMinWidth(side, sourcePanel?.minWidth ?? 240);\n    const nextWidth = Math.max(minWidth, Math.min(maxWidth, numeric));\n    for (const panel of this.panels.values()) {\n      const panelTarget = this._resolveEffectiveSideDockTarget(panel);\n      if (panelTarget !== side) continue;\n      panel.width = nextWidth;\n      panel.element.style.width = `${nextWidth}px`;\n    }\n    this._emitDockMetricsChange();\n  }\n\n  _matchSideDockWidth(panel, side) {\n    if (!panel || (side !== 'left' && side !== 'right')) return;\n    let width = null;\n    for (const candidate of this.panels.values()) {\n      if (!candidate || candidate === panel) continue;\n      if (this._resolveEffectiveSideDockTarget(candidate) !== side) continue;\n      const candidateWidth = Number(candidate.width ?? candidate.element?.getBoundingClientRect?.().width);\n      if (!Number.isFinite(candidateWidth) || candidateWidth <= 0) continue;\n      const maxWidth = this._getPanelResizeMaxWidth(panel, this.container.getBoundingClientRect());\n      const minWidth = this._getSideDockMinWidth(side, candidate.minWidth ?? panel.minWidth ?? 240);\n      width = Math.max(minWidth, Math.min(maxWidth, candidateWidth));\n      break;\n    }\n    if (!Number.isFinite(width) || width <= 0) {\n      width = Number(panel.width ?? panel.element?.getBoundingClientRect?.().width);\n    }\n    if (!Number.isFinite(width) || width <= 0) return;\n    const maxWidth = this._getPanelResizeMaxWidth(panel, this.container.getBoundingClientRect());\n    const minWidth = this._getSideDockMinWidth(side, panel.minWidth ?? 240);\n    width = Math.max(minWidth, Math.min(maxWidth, width));\n    panel.width = width;\n    panel.element.style.width = `${width}px`;\n  }\n\n  _getSideDockMinWidth(side, fallback = 240) {\n    let minWidth = Number(fallback);\n    if (!Number.isFinite(minWidth) || minWidth <= 0) minWidth = 240;\n    for (const panel of this.panels.values()) {\n      if (this._resolveEffectiveSideDockTarget(panel) !== side) continue;\n      const panelMinWidth = Number(panel?.minWidth);\n      if (Number.isFinite(panelMinWidth) && panelMinWidth > minWidth) {\n        minWidth = panelMinWidth;\n      }\n    }\n    return minWidth;\n  }\n\n  _getPanelResizeMaxWidth(panel, containerRect = null) {\n    const minWidth = panel?.minWidth ?? 240;\n    const containerWidth = Number(containerRect?.width ?? this.container?.getBoundingClientRect?.().width);\n    if (!Number.isFinite(containerWidth) || containerWidth <= 0) return Infinity;\n    if (\n      this._responsivePresentation?.mode === 'compact'\n      && (this._resolveEffectiveSideDockTarget(panel) === 'left'\n        || this._resolveEffectiveSideDockTarget(panel) === 'right')\n    ) {\n      return Math.max(minWidth, containerWidth - COMPACT_MIN_GRAPH_VIEWPORT_PX);\n    }\n    return Math.max(minWidth, containerWidth);\n  }\n\n  _resolveEffectiveSideDockTarget(panel) {\n    const target = resolveDockTarget(panel?.dock);\n    if (\n      this._responsivePresentation?.mode === 'compact'\n      && (target === 'left' || target === 'right')\n    ) {\n      return this._responsivePresentation?.dockSide === 'right' ? 'right' : 'left';\n    }\n    return target;\n  }\n\n  getDockInsets() {\n    if (this._responsivePresentation?.mode === 'fullscreen') {\n      return {\n        top: 0,\n        right: 0,\n        bottom: 0,\n        left: 0,\n      };\n    }\n    const leftWidth = this.dockLeft?.childElementCount\n      ? Math.max(0, Math.round(this.dockLeft.getBoundingClientRect().width))\n      : 0;\n    const rightWidth = this.dockRight?.childElementCount\n      ? Math.max(0, Math.round(this.dockRight.getBoundingClientRect().width))\n      : 0;\n    return {\n      top: 0,\n      right: rightWidth,\n      bottom: 0,\n      left: leftWidth,\n    };\n  }\n\n  onDockMetricsChange(callback) {\n    if (typeof callback !== 'function') return () => {};\n    this._dockMetricsListeners.add(callback);\n    callback(this.getDockInsets());\n    return () => this._dockMetricsListeners.delete(callback);\n  }\n\n  setResponsivePresentation(presentation = {}) {\n    const next = {\n      ...this._responsivePresentation,\n      ...(presentation && typeof presentation === 'object' ? presentation : {}),\n    };\n    next.mode = typeof next.mode === 'string' ? next.mode : 'desktop';\n    next.dockSide = next.dockSide === 'right' ? 'right' : 'left';\n    next.controlsOpen = next.controlsOpen === true;\n    next.activePanelId = typeof next.activePanelId === 'string' ? next.activePanelId : null;\n    next.focused = next.focused === true;\n    this._responsivePresentation = next;\n\n    this.container.dataset.responsiveMode = next.mode;\n    this.container.dataset.compactDockSide = next.dockSide;\n    this.container.dataset.controlsOpen = next.controlsOpen ? 'true' : 'false';\n    this.container.dataset.focusedControl = next.focused ? 'true' : 'false';\n    if (next.activePanelId) this.container.dataset.activePanelId = next.activePanelId;\n    else delete this.container.dataset.activePanelId;\n\n    this.fullscreenFlow.hidden = !(next.mode === 'fullscreen' && next.controlsOpen);\n    this.fullscreenFlow.dataset.focused = next.focused ? 'true' : 'false';\n\n    if (next.mode === 'compact') {\n      const compactPanels = Array.from(this.panels.values())\n        .filter((panel) => {\n          const panelTarget = resolveDockTarget(panel?.dock);\n          return panelTarget === 'left' || panelTarget === 'right';\n        })\n        .sort((a, b) => {\n          const targetA = resolveDockTarget(a?.dock);\n          const targetB = resolveDockTarget(b?.dock);\n          if (targetA !== targetB) return targetA === 'left' ? -1 : 1;\n          return 0;\n        });\n      const dock = next.dockSide === 'right' ? this.dockRight : this.dockLeft;\n      for (const panel of compactPanels) {\n        panel.setResponsiveMode?.('desktop');\n        dock.appendChild(panel.element);\n        panel.setDockEdgeOverride(next.dockSide);\n        panel.element.dataset.sideDocked = 'true';\n        this._matchSideDockWidth(panel, next.dockSide);\n      }\n    }\n\n    for (const panel of this.panels.values()) {\n      const panelTarget = resolveDockTarget(panel?.dock);\n      if (next.mode === 'fullscreen') {\n        panel.setResponsiveMode?.('fullscreen');\n        if (panel.element.parentElement !== this.fullscreenFlow) this.fullscreenFlow.appendChild(panel.element);\n        panel.setDockEdgeOverride(null);\n        delete panel.element.dataset.sideDocked;\n      } else if (next.mode === 'compact') {\n        if (panelTarget === 'left' || panelTarget === 'right') {\n          panel.setResponsiveMode?.('desktop');\n          panel.setDockEdgeOverride(next.dockSide);\n          panel.element.dataset.sideDocked = 'true';\n        } else {\n          panel.setResponsiveMode?.('desktop');\n          panel.setDockEdgeOverride(null);\n          delete panel.element.dataset.sideDocked;\n          this._placePanel(panel);\n        }\n      } else {\n        panel.setResponsiveMode?.('desktop');\n        panel.setDockEdgeOverride(null);\n        delete panel.element.dataset.sideDocked;\n        this._placePanel(panel);\n      }\n\n      let visible = true;\n      let visibilityState = 'visible';\n      if (next.mode === 'fullscreen') {\n        visible = next.controlsOpen === true;\n        if (!visible) visibilityState = 'hidden';\n        else if (next.focused === true && next.activePanelId) {\n          visibilityState = next.activePanelId === panel.id ? 'active' : 'background';\n        }\n      }\n      panel.element.dataset.interfaceVisible = visible ? 'true' : 'false';\n      panel.element.dataset.interfaceActive = next.activePanelId === panel.id ? 'true' : 'false';\n      panel.element.dataset.interfaceState = visibilityState;\n    }\n\n    this._emitDockMetricsChange();\n    return this;\n  }\n\n  _emitDockMetricsChange() {\n    const insets = this.getDockInsets();\n    for (const listener of this._dockMetricsListeners) {\n      try {\n        listener({ ...insets });\n      } catch (error) {\n        console.warn('[HeliosUI][PanelManager] Dock metrics listener failed.', error);\n      }\n    }\n  }\n\n  _startSideDockReorder(panel, event) {\n    if (this._responsivePresentation?.mode === 'fullscreen') return false;\n    if (!this.allowDrag) return false;\n    if (!panel) return false;\n    const primaryPressed = (Number(event?.buttons ?? 0) & 1) === 1 || event?.button === 0;\n    if (!primaryPressed) return false;\n    if (event.shiftKey) return false;\n\n    const target = this._resolveEffectiveSideDockTarget(panel);\n    if (target !== 'left' && target !== 'right') return false;\n\n    const dockEl = target === 'left' ? this.dockLeft : this.dockRight;\n    if (panel.element.parentElement !== dockEl) return false;\n\n    const panelRect = panel.element.getBoundingClientRect();\n    const dockRect = dockEl.getBoundingClientRect();\n    if (!panelRect.height || !dockRect.height) return false;\n\n    const dropLine = document.createElement('div');\n    dropLine.className = 'helios-ui-dock-drop-line';\n    dockEl.insertBefore(dropLine, panel.element.nextSibling);\n    const preview = this._createDockDragPreview(panel, panelRect, dockRect);\n    this.container.appendChild(preview);\n    const previewRect = preview.getBoundingClientRect();\n    const pointerOffsetX = this._clampOffset(event.clientX - panelRect.left, panelRect.width);\n    const pointerOffsetY = this._clampOffset(event.clientY - panelRect.top, panelRect.height);\n    const previewOffsetX = this._scaleOffset(pointerOffsetX, panelRect.width, previewRect.width);\n    const previewOffsetY = this._scaleOffset(pointerOffsetY, panelRect.height, previewRect.height);\n    const dragAnchorRatioX = panelRect.width > 0 ? (pointerOffsetX / panelRect.width) : 0.5;\n    const dragAnchorRatioY = panelRect.height > 0 ? (pointerOffsetY / panelRect.height) : 0.5;\n    this._placeSourcePanelAtDrop(dockEl, dropLine, panel.element);\n    this._freeDragDockGuards.delete(panel.id);\n\n    panel.element.classList.add('helios-ui-panel--dock-source');\n    this.container.classList.add('helios-ui--dock-reordering');\n    panel.setZIndex(this._nextZ());\n\n    this._dockReorder = {\n      pointerId: event.pointerId,\n      panel,\n      dockEl,\n      side: target,\n      dropLine,\n      preview,\n      previewOffsetX,\n      previewOffsetY,\n      dragAnchorRatioX,\n      dragAnchorRatioY,\n      header: panel.header,\n    };\n    this._updateDockDragPreview(event, this._dockReorder);\n    this._setPointerCapture(panel.header, event.pointerId);\n    event.preventDefault();\n    return true;\n  }\n\n  _moveSideDockReorder(event) {\n    const state = this._dockReorder;\n    if (!state) return false;\n    const { panel, dockEl, dropLine, preview } = state;\n    this._updateDockDragPreview(event, state);\n\n    const dockRect = dockEl.getBoundingClientRect();\n    if (event.shiftKey || this._isOutsideSideDock(event, dockRect, state.side)) {\n      this._startFreeDragFromSideDock(event, state);\n      return true;\n    }\n\n    const pointerY = event.clientY - dockRect.top + dockEl.scrollTop;\n\n    if (event.clientY <= dockRect.top + STACK_DRAG_EDGE_SCROLL_PX) {\n      dockEl.scrollTop = Math.max(0, dockEl.scrollTop - STACK_DRAG_SCROLL_STEP_PX);\n    } else if (event.clientY >= dockRect.bottom - STACK_DRAG_EDGE_SCROLL_PX) {\n      dockEl.scrollTop += STACK_DRAG_SCROLL_STEP_PX;\n    }\n\n    const children = Array.from(dockEl.children).filter((child) => child !== panel.element && child !== dropLine);\n    let insertBefore = null;\n    for (const child of children) {\n      const midpoint = child.offsetTop + (child.offsetHeight / 2);\n      if (pointerY < midpoint) {\n        insertBefore = child;\n        break;\n      }\n    }\n\n    if (insertBefore) {\n      dockEl.insertBefore(dropLine, insertBefore);\n    } else {\n      dockEl.appendChild(dropLine);\n    }\n    this._placeSourcePanelAtDrop(dockEl, dropLine, panel.element);\n    return true;\n  }\n\n  _endSideDockReorder(event, options = {}) {\n    const state = this._dockReorder;\n    if (!state) return;\n    if (!options.force && event.pointerId !== state.pointerId) return;\n\n    const { panel, dockEl, dropLine, preview, header } = state;\n    this._dockReorder = null;\n\n    this._releasePointerCapture(header, state.pointerId);\n    this.container.classList.remove('helios-ui--dock-reordering');\n    preview?.remove();\n    dropLine?.remove();\n\n    panel.element.classList.remove('helios-ui-panel--dock-source');\n    panel.syncDockStyles();\n  }\n\n  _isOutsideSideDock(event, dockRect, side) {\n    if (!dockRect) return false;\n    const x = event.clientX;\n    if (side === 'left' || side === 'right') {\n      return x < dockRect.left || x > dockRect.right;\n    }\n    return false;\n  }\n\n  _startFreeDragFromSideDock(event, state) {\n    const { panel, side, dropLine, preview, header, dragAnchorRatioX, dragAnchorRatioY } = state;\n    this._dockReorder = null;\n    dropLine?.remove();\n    preview?.remove();\n    this._releasePointerCapture(header, state.pointerId);\n    this.container.classList.remove('helios-ui--dock-reordering');\n    panel.element.classList.remove('helios-ui-panel--dock-source');\n    this._freeDragDockGuards.set(panel.id, side);\n\n    const containerRect = this.container.getBoundingClientRect();\n    const panelRect = panel.element.getBoundingClientRect();\n    const offsetX = this._offsetFromAnchorRatio(dragAnchorRatioX, panelRect.width);\n    const offsetY = this._offsetFromAnchorRatio(dragAnchorRatioY, panelRect.height);\n    panel.beginDragFromHeaderPointer(event, {\n      containerRect,\n      offsetX,\n      offsetY,\n    });\n    panel.handlePointerMove(event, {\n      containerRect,\n      allowDock: this.allowDock,\n      threshold: this.dockThreshold,\n      forceFree: true,\n    });\n  }\n\n  _trySwitchFreeDragToDockReorder(panel, event) {\n    if (this._dockReorder) return false;\n    if (!panel?._drag || panel._drag.pointerId !== event.pointerId) return false;\n    if (this._hasActiveFreeDragDockGuard(panel, event)) return false;\n    const target = this._resolveEffectiveSideDockTarget(panel);\n    if (target !== 'left' && target !== 'right') return false;\n    const dockEl = target === 'left' ? this.dockLeft : this.dockRight;\n    const dockRect = dockEl?.getBoundingClientRect?.();\n    if (!this._isPointerInsideRect(event, dockRect)) return false;\n    const started = this._startSideDockReorder(panel, event);\n    if (!started) return false;\n    panel.handlePointerUp(event);\n    return true;\n  }\n\n  _createDockDragPreview(panel, panelRect, dockRect) {\n    const doc = this.container?.ownerDocument ?? document;\n    const preview = doc.createElement('div');\n    preview.className = 'helios-ui-dock-drag-preview';\n    const dockWidth = Math.max(0, Math.round(Number(dockRect?.width) || 0));\n    const maxFromDock = dockWidth > 0 ? Math.max(160, dockWidth - 16) : Infinity;\n    const compactWidth = Math.round((Number(panelRect?.width) || 220) * 0.92);\n    const width = Math.max(160, Math.min(320, compactWidth, maxFromDock));\n    preview.style.width = `${width}px`;\n\n    const header = doc.createElement('div');\n    header.className = 'helios-ui-dock-drag-preview__header';\n\n    const title = doc.createElement('div');\n    title.className = 'helios-ui-dock-drag-preview__title';\n    title.textContent = (panel?.titleEl?.textContent ?? panel?.title ?? panel?.id ?? 'Panel').trim();\n\n    header.appendChild(title);\n    preview.appendChild(header);\n    return preview;\n  }\n\n  _updateDockDragPreview(event, state) {\n    const preview = state?.preview;\n    if (!preview) return;\n    const containerRect = this.container.getBoundingClientRect();\n    const left = event.clientX - containerRect.left - (state?.previewOffsetX ?? 0);\n    const top = event.clientY - containerRect.top - (state?.previewOffsetY ?? 0);\n    preview.style.left = `${Math.round(left)}px`;\n    preview.style.top = `${Math.round(top)}px`;\n  }\n\n  _placeSourcePanelAtDrop(dockEl, dropLine, panelElement) {\n    if (!dockEl || !dropLine || !panelElement) return;\n    const before = dropLine.nextSibling;\n    if (before === panelElement) return;\n    dockEl.insertBefore(panelElement, before ?? null);\n  }\n\n  _shouldForceFreeWhileDragging(panel, event) {\n    if (!panel?._drag || panel._drag.pointerId !== event?.pointerId) return false;\n    if (this._hasActiveFreeDragDockGuard(panel, event)) return true;\n    const target = this._resolveEffectiveSideDockTarget(panel);\n    if (target !== 'left' && target !== 'right') return false;\n    const dockEl = target === 'left' ? this.dockLeft : this.dockRight;\n    const dockRect = dockEl?.getBoundingClientRect?.();\n    return !this._isPointerInsideRect(event, dockRect);\n  }\n\n  _hasActiveFreeDragDockGuard(panel, event) {\n    const side = this._freeDragDockGuards.get(panel?.id);\n    if (!side) return false;\n    const leftRect = this.dockLeft?.getBoundingClientRect?.();\n    const rightRect = this.dockRight?.getBoundingClientRect?.();\n    const insideAnySideDock = this._isPointerInsideRect(event, leftRect) || this._isPointerInsideRect(event, rightRect);\n    if (insideAnySideDock) {\n      this._freeDragDockGuards.delete(panel.id);\n      return false;\n    }\n    return true;\n  }\n\n  _clearFreeDragDockGuard(panel, event) {\n    if (!panel?.id) return;\n    if (event?.pointerId != null && panel?._drag && panel._drag.pointerId !== event.pointerId) return;\n    this._freeDragDockGuards.delete(panel.id);\n  }\n\n  _setPointerCapture(element, pointerId) {\n    if (pointerId == null) return;\n    try {\n      element?.setPointerCapture?.(pointerId);\n    } catch (error) {\n      console.warn('[HeliosUI][PanelManager] Failed to capture pointer for panel drag.', error);\n    }\n  }\n\n  _releasePointerCapture(element, pointerId) {\n    if (pointerId == null) return;\n    try {\n      if (element?.hasPointerCapture?.(pointerId)) {\n        element.releasePointerCapture(pointerId);\n      }\n    } catch (error) {\n      console.warn('[HeliosUI][PanelManager] Failed to release pointer capture for panel drag.', error);\n    }\n  }\n\n  _isPointerInsideRect(event, rect) {\n    if (!rect || !event) return false;\n    const x = Number(event.clientX);\n    const y = Number(event.clientY);\n    if (!Number.isFinite(x) || !Number.isFinite(y)) return false;\n    return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\n  }\n\n  _scaleOffset(offsetPx, fromSizePx, toSizePx) {\n    const offset = Number(offsetPx);\n    const from = Number(fromSizePx);\n    const to = Number(toSizePx);\n    if (!Number.isFinite(offset) || !Number.isFinite(from) || !Number.isFinite(to) || from <= 0 || to <= 0) {\n      return 0;\n    }\n    const ratio = offset / from;\n    const scaled = ratio * to;\n    return this._clampOffset(scaled, to);\n  }\n\n  _clampOffset(offsetPx, sizePx) {\n    const offset = Number(offsetPx);\n    const size = Number(sizePx);\n    if (!Number.isFinite(offset)) return 0;\n    if (!Number.isFinite(size) || size <= 0) return offset;\n    const margin = Math.min(12, Math.max(0, size / 2));\n    return Math.max(margin, Math.min(size - margin, offset));\n  }\n\n  _offsetFromAnchorRatio(ratioValue, sizePx) {\n    const ratio = Number(ratioValue);\n    const size = Number(sizePx);\n    if (!Number.isFinite(size) || size <= 0) return 0;\n    const normalized = Number.isFinite(ratio) ? ratio : 0.5;\n    return this._clampOffset(normalized * size, size);\n  }\n\n  _scheduleAutoFitLabelColumn(panel) {\n    const config = this.labelColumn;\n    if (!config || config.mode !== 'auto') return;\n    const doc = panel?.element?.ownerDocument ?? document;\n    const win = doc.defaultView ?? window;\n    const raf = win?.requestAnimationFrame ?? ((cb) => setTimeout(cb, 0));\n    raf(() => {\n      if (!panel?.element?.isConnected) return;\n      this._autoFitLabelColumn(panel.element, config);\n    });\n  }\n\n  _autoFitLabelColumn(panelElement, config) {\n    const titles = Array.from(panelElement.querySelectorAll('.helios-ui-row--aligned .helios-ui-label__title'));\n    if (!titles.length) return;\n    const minPx = Number(config?.minPx ?? 120);\n    const maxPx = Number(config?.maxPx ?? 220);\n    const paddingPx = Number(config?.paddingPx ?? 10);\n\n    let maxWidth = 0;\n    for (const titleEl of titles) {\n      const text = (titleEl.textContent ?? '').trim();\n      if (!text) continue;\n      const width = this._measureTextWidth(titleEl, text);\n      if (Number.isFinite(width)) maxWidth = Math.max(maxWidth, width);\n    }\n    if (!Number.isFinite(maxWidth) || maxWidth <= 0) return;\n\n    const computed = Math.max(minPx, Math.min(maxPx, Math.ceil(maxWidth + paddingPx)));\n    panelElement.style.setProperty('--helios-ui-label-col', `${computed}px`);\n  }\n\n  _measureTextWidth(referenceElement, text) {\n    const doc = referenceElement?.ownerDocument ?? document;\n    if (!this._measureCanvas) this._measureCanvas = doc.createElement('canvas');\n    const ctx = this._measureCanvas.getContext('2d');\n    if (!ctx) return null;\n    const style = (doc.defaultView ?? window).getComputedStyle(referenceElement);\n    ctx.font = style.font || `${style.fontWeight} ${style.fontSize} ${style.fontFamily}`;\n    const metrics = ctx.measureText(text);\n    return metrics?.width ?? null;\n  }\n\n  destroy() {\n    for (const id of Array.from(this.panels.keys())) {\n      this.removePanel(id);\n    }\n    this._eventTarget?.removeEventListener('pointermove', this._boundMove);\n    this._eventTarget?.removeEventListener('pointerup', this._boundUp);\n    this._eventTarget?.removeEventListener('pointercancel', this._boundUp);\n    this._dockResizeObserver?.disconnect?.();\n    this._dockMetricsListeners.clear();\n    this.dockLeft.remove();\n    this.dockRight.remove();\n  }\n}\n","function normalizeRange(range) {\n  if (!range) return null;\n  if (Array.isArray(range) && range.length >= 2) {\n    const min = Number(range[0]);\n    const max = Number(range[1]);\n    if (Number.isFinite(min) && Number.isFinite(max)) return { min, max };\n  }\n  if (typeof range === 'object') {\n    const min = Number(range.min);\n    const max = Number(range.max);\n    if (Number.isFinite(min) && Number.isFinite(max)) return { min, max };\n  }\n  return null;\n}\n\n/**\n * Observable UI attribute descriptor used to bind controls to Helios state.\n *\n * @public\n * @apiSection User Interface\n * @param {object} options - Attribute descriptor.\n * @param {string} options.id - Stable attribute id.\n * @param {Function} options.get - Read callback.\n * @param {Function} [options.set] - Write callback.\n */\nexport class UIAttribute {\n  constructor(options) {\n    if (!options?.id) throw new Error('UIAttribute requires an id');\n    if (typeof options.get !== 'function') throw new Error('UIAttribute requires a get() function');\n    const readOnly = Boolean(options.readOnly ?? (typeof options.set !== 'function'));\n    this.id = options.id;\n    this.label = options.label ?? options.id;\n    this.type = options.type ?? 'unknown';\n    this.readOnly = readOnly;\n    this.updateMode = options.updateMode ?? 'onChange';\n    this.get = options.get;\n    this.set = readOnly ? null : options.set;\n    this.min = options.min ?? null;\n    this.max = options.max ?? null;\n    this.step = options.step ?? null;\n    this.domain = normalizeRange(options.domain);\n    this.recommendedRange = normalizeRange(options.recommendedRange);\n    this.meta = options.meta ?? {};\n    this._listeners = new Set();\n    this._lastValue = undefined;\n    this._hasLast = false;\n  }\n\n  value() {\n    return this.get();\n  }\n\n  write(value, context) {\n    if (this.readOnly || !this.set) return;\n    this.set(value, context);\n    this.notify();\n  }\n\n  notify() {\n    const next = this.get();\n    if (this._hasLast && Object.is(next, this._lastValue)) return;\n    this._lastValue = next;\n    this._hasLast = true;\n    for (const listener of this._listeners) {\n      listener(next);\n    }\n  }\n\n  subscribe(listener, options = {}) {\n    this._listeners.add(listener);\n    if (options.immediate ?? true) {\n      listener(this.get());\n    }\n    return () => this._listeners.delete(listener);\n  }\n\n  static number(options) {\n    return new UIAttribute({ ...options, type: 'number' });\n  }\n\n  static string(options) {\n    return new UIAttribute({ ...options, type: 'string' });\n  }\n\n  static boolean(options) {\n    return new UIAttribute({ ...options, type: 'boolean' });\n  }\n}\n","/**\n * DOM id used for the injected default Helios UI stylesheet.\n *\n * @public\n * @apiSection User Interface\n */\nexport const DEFAULT_STYLE_ELEMENT_ID = 'helios-ui-default-styles';\n\n/**\n * Default CSS text for the optional Helios UI controls.\n *\n * @public\n * @apiSection User Interface\n */\nexport const defaultStylesText = `\n.helios-ui {\n  --helios-ui-font: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n  --helios-ui-font-size: 12px;\n  --helios-ui-radius: 12px;\n  --helios-ui-gap: 8px;\n  --helios-ui-border: color-mix(in srgb, var(--helios-ui-fg) 12%, transparent);\n  --helios-ui-shadow: 0 12px 30px rgba(0, 0, 0, 0.25);\n  --helios-ui-blur: 14px;\n  --helios-ui-z: 50;\n  --helios-ui-label-col: 140px;\n  --helios-ui-rule-keyword-width: 56px;\n  --helios-ui-danger: #ef4444;\n  --helios-ui-status-success: #22c55e;\n  --helios-ui-status-running: #f59e0b;\n  --helios-ui-status-error: #ef4444;\n  --helios-ui-status-info: #06b6d4;\n  --helios-ui-accent-hover: color-mix(in srgb, var(--helios-ui-accent) 88%, black 12%);\n  --helios-ui-accent-active: color-mix(in srgb, var(--helios-ui-accent) 78%, black 22%);\n  --helios-ui-focus-ring: color-mix(in srgb, var(--helios-ui-accent) 22%, transparent);\n  --helios-ui-control-bg: color-mix(in srgb, var(--helios-ui-bg-solid) 88%, transparent);\n  --helios-ui-control-bg-hover: color-mix(in srgb, var(--helios-ui-accent) 12%, var(--helios-ui-bg-solid));\n  --helios-ui-control-border: color-mix(in srgb, var(--helios-ui-accent) 28%, var(--helios-ui-border));\n\n  position: absolute;\n  inset: 0;\n  z-index: var(--helios-ui-z);\n  font: 400 var(--helios-ui-font-size)/1.35 var(--helios-ui-font);\n  color: var(--helios-ui-fg);\n  pointer-events: none;\n}\n\n.helios-ui-ellipsis {\n  min-width: 0;\n  max-width: 100%;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.helios-ui[data-theme=\"dark\"] {\n  --helios-ui-bg: rgba(12, 14, 18, 0.72);\n  --helios-ui-bg-solid: rgba(12, 14, 18, 0.94);\n  --helios-ui-dock-fill: color-mix(in srgb, var(--helios-ui-bg-solid) 88%, white 12%);\n  --helios-ui-fg: rgba(244, 246, 250, 0.92);\n  --helios-ui-muted: rgba(244, 246, 250, 0.62);\n  --helios-ui-accent: #38bdf8;\n  --helios-ui-accent-contrast: #ffffff;\n  --helios-ui-text-outline: rgba(5, 7, 10, 0.8);\n}\n\n.helios-ui[data-theme=\"light\"] {\n  --helios-ui-bg: rgba(247, 247, 249, 0.94);\n  --helios-ui-bg-solid: #f7f7f9;\n  --helios-ui-dock-fill: #f7f7f9;\n  --helios-ui-border: #e6e6ea;\n  --helios-ui-fg: #1f2328;\n  --helios-ui-muted: #6b7280;\n  --helios-ui-accent: #5e7cb9;\n  --helios-ui-accent-hover: #4c6aa8;\n  --helios-ui-accent-active: #3c5a93;\n  --helios-ui-accent-contrast: #ffffff;\n  --helios-ui-focus-ring: #c7d4e8;\n  --helios-ui-control-bg: #ffffff;\n  --helios-ui-control-bg-hover: #f1f3f6;\n  --helios-ui-control-border: #d8dce3;\n  --helios-ui-shadow: 0 12px 30px rgba(31, 35, 40, 0.12);\n  --helios-ui-text-outline: rgba(255, 255, 255, 0.88);\n}\n\n.helios-ui * { box-sizing: border-box; }\n\n.helios-ui-interface-surface {\n  position: absolute;\n  inset: 0;\n  pointer-events: none;\n}\n\n.helios-ui-interface-dock-toggle,\n.helios-ui-interface-fullscreen-bar,\n.helios-ui-resume-prompt {\n  pointer-events: auto;\n}\n\n.helios-ui-interface-dock-toggle[hidden],\n.helios-ui-interface-fullscreen-bar[hidden],\n.helios-ui-resume-prompt[hidden] {\n  display: none !important;\n}\n\n.helios-ui-interface-dock-toggle {\n  position: absolute;\n  top: 0;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: 26px;\n  height: 36px;\n  min-height: 36px;\n  padding: 0;\n  border-radius: 0;\n  z-index: 999;\n  border: 1px solid var(--helios-ui-border);\n  border-top: 0;\n  background: color-mix(in srgb, var(--helios-ui-bg) 88%, var(--helios-ui-bg-solid));\n  color: color-mix(in srgb, var(--helios-ui-fg) 88%, transparent);\n  box-shadow: none;\n  -webkit-backdrop-filter: blur(calc(var(--helios-ui-blur) * 0.7));\n  backdrop-filter: blur(calc(var(--helios-ui-blur) * 0.7));\n  cursor: pointer;\n}\n\n.helios-ui-interface-dock-toggle:hover {\n  border-color: color-mix(in srgb, var(--helios-ui-fg) 18%, transparent);\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 96%, transparent);\n}\n\n.helios-ui-interface-fullscreen-bar {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  display: inline-flex;\n  flex-direction: column;\n  align-items: stretch;\n  gap: 0;\n  width: 40px;\n  pointer-events: auto;\n  background: transparent;\n  -webkit-backdrop-filter: none;\n  backdrop-filter: none;\n}\n\n.helios-ui[data-interface-mode=\"fullscreen\"][data-controls-open=\"true\"] .helios-ui-interface-fullscreen-bar {\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 82%, transparent);\n  -webkit-backdrop-filter: blur(calc(var(--helios-ui-blur) * 0.8));\n  backdrop-filter: blur(calc(var(--helios-ui-blur) * 0.8));\n}\n\n.helios-ui-interface-bar__button--icon {\n  width: 28px !important;\n  height: 28px !important;\n  min-width: 28px !important;\n  min-height: 28px !important;\n  margin: 4px auto 0 !important;\n  padding: 0 !important;\n  border-radius: 8px !important;\n  border: 1px solid var(--helios-ui-border) !important;\n  background: var(--helios-ui-bg) !important;\n  box-shadow: none !important;\n  -webkit-backdrop-filter: blur(calc(var(--helios-ui-blur) * 0.7));\n  backdrop-filter: blur(calc(var(--helios-ui-blur) * 0.7));\n}\n\n.helios-ui-interface-bar__button--icon:hover {\n  border-color: color-mix(in srgb, var(--helios-ui-fg) 12%, var(--helios-ui-border)) !important;\n  background: var(--helios-ui-bg) !important;\n}\n\n.helios-ui-interface-icon {\n  width: 20px;\n  height: 20px;\n  opacity: 0.96;\n}\n\n.helios-ui-fullscreen-panel-nav {\n  display: inline-flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: flex-start;\n  gap: 0;\n  flex: 1 1 auto;\n  width: 100%;\n  padding: 0;\n  border-radius: 0;\n  border: 0;\n  background: transparent;\n  box-shadow: none;\n  -webkit-backdrop-filter: none;\n  backdrop-filter: none;\n}\n\n.helios-ui-fullscreen-panel-nav[hidden] {\n  display: none !important;\n}\n\n.helios-ui-fullscreen-panel-nav__button {\n  width: 100%;\n  height: 34px;\n  min-width: 0;\n  min-height: 34px;\n  margin: 0;\n  padding: 0 !important;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  border: 0 !important;\n  border-radius: 0 !important;\n  background: transparent !important;\n  color: color-mix(in srgb, var(--helios-ui-fg) 94%, transparent);\n  box-shadow: none !important;\n  outline: none !important;\n  appearance: none;\n}\n\n.helios-ui-fullscreen-panel-nav__button:hover {\n  background: transparent !important;\n}\n\n.helios-ui-fullscreen-panel-nav__button[data-active=\"true\"] {\n  background: linear-gradient(90deg, color-mix(in srgb, var(--helios-ui-accent) 88%, transparent) 0 2px, transparent 2px);\n}\n\n.helios-ui-fullscreen-panel-nav__icon {\n  width: 22px;\n  height: 22px;\n}\n\n.helios-ui[data-compact-dock-side=\"right\"] .helios-ui-interface-dock-toggle {\n  right: var(--helios-ui-right-dock-width, 0px);\n  transform: translateX(1px);\n  border-left: 0;\n  border-top-left-radius: 10px;\n  border-bottom-left-radius: 10px;\n}\n\n.helios-ui:not([data-compact-dock-side=\"right\"]) .helios-ui-interface-dock-toggle {\n  left: var(--helios-ui-left-dock-width, 0px);\n  transform: translateX(-1px);\n  border-right: 0;\n  border-top-right-radius: 10px;\n  border-bottom-right-radius: 10px;\n}\n\n.helios-ui-resume-prompt {\n  position: absolute;\n  left: calc(\n    var(--helios-ui-left-dock-width, 0px)\n    + ((100% - var(--helios-ui-left-dock-width, 0px) - var(--helios-ui-right-dock-width, 0px)) / 2)\n  );\n  bottom: 16px;\n  transform: translateX(-50%);\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  gap: 10px;\n  width: min(\n    560px,\n    calc(100% - var(--helios-ui-left-dock-width, 0px) - var(--helios-ui-right-dock-width, 0px) - 32px)\n  );\n  max-width: calc(100% - 32px);\n  min-width: 0;\n  box-sizing: border-box;\n  padding: 10px 12px;\n  border-radius: 14px;\n  border: 1px solid var(--helios-ui-border);\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 92%, transparent);\n  box-shadow: var(--helios-ui-shadow);\n}\n\n.helios-network-drop-overlay {\n  backdrop-filter: blur(2px);\n}\n\n.helios-network-drop-overlay__title {\n  font-size: 20px;\n  line-height: 1.2;\n}\n\n.helios-network-drop-overlay__subtitle {\n  font-size: 12px;\n  font-weight: 500;\n  opacity: 0.84;\n}\n\n.helios-ui-resume-prompt[hidden] {\n  display: none;\n}\n\n.helios-ui-resume-prompt__text {\n  flex: 1 1 auto;\n  min-width: min(100%, 220px);\n  line-height: 1.25;\n  overflow-wrap: anywhere;\n}\n\n.helios-ui-resume-prompt__actions {\n  display: inline-flex;\n  align-items: center;\n  justify-content: flex-end;\n  gap: 8px;\n  flex: 0 0 auto;\n  min-width: 0;\n}\n\n.helios-ui-resume-prompt__actions .helios-ui-button {\n  white-space: nowrap;\n}\n\n.helios-ui-resume-prompt__menu {\n  position: absolute;\n  right: 12px;\n  bottom: calc(100% + 6px);\n  display: grid;\n  gap: 4px;\n  width: min(280px, calc(100% - 24px));\n  max-height: 220px;\n  overflow: auto;\n  padding: 6px;\n  border: 1px solid var(--helios-ui-border);\n  border-radius: 10px;\n  background: var(--helios-ui-bg-solid);\n  box-shadow: var(--helios-ui-shadow);\n}\n\n.helios-ui-resume-prompt__menu[hidden] {\n  display: none;\n}\n\n.helios-ui-resume-prompt__menu-item {\n  width: 100%;\n  min-width: 0;\n  border: 0;\n  border-radius: 7px;\n  padding: 7px 8px;\n  background: transparent;\n  color: var(--helios-ui-text);\n  font: 600 12px/1.25 var(--helios-ui-font);\n  text-align: left;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  cursor: pointer;\n}\n\n.helios-ui-resume-prompt__menu-item:hover,\n.helios-ui-resume-prompt__menu-item:focus-visible {\n  background: color-mix(in srgb, var(--helios-ui-accent) 16%, transparent);\n  outline: none;\n}\n\n@media (max-width: 720px) {\n  .helios-ui-resume-prompt {\n    align-items: stretch;\n    gap: 8px;\n  }\n\n  .helios-ui-resume-prompt__actions {\n    width: 100%;\n  }\n}\n\n@media (max-width: 460px) {\n  .helios-ui-resume-prompt {\n    left: 16px;\n    right: 16px;\n    width: auto;\n    transform: none;\n  }\n\n  .helios-ui-resume-prompt__actions {\n    display: grid;\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n\n  .helios-ui-resume-prompt__menu {\n    left: 12px;\n    right: 12px;\n    width: auto;\n  }\n}\n\n.helios-ui[data-interface-mode=\"fullscreen\"] .helios-ui-dock {\n  display: none;\n}\n\n.helios-ui-fullscreen-flow {\n  position: absolute;\n  inset: 0;\n  display: flex;\n  flex-direction: column;\n  gap: 0;\n  overflow-x: hidden;\n  overflow-y: auto;\n  padding: 0 0 max(16px, env(safe-area-inset-bottom, 0px)) 0;\n  min-height: 0;\n  pointer-events: auto;\n  overscroll-behavior: contain;\n  -webkit-overflow-scrolling: touch;\n}\n\n.helios-ui[data-interface-mode=\"fullscreen\"][data-controls-open=\"true\"] .helios-ui-fullscreen-flow {\n  padding-left: 40px;\n}\n\n.helios-ui-fullscreen-flow[hidden] {\n  display: none;\n}\n\n.helios-ui[data-interface-mode=\"fullscreen\"][data-controls-open=\"true\"] .helios-ui-fullscreen-flow {\n  background:\n    linear-gradient(180deg, color-mix(in srgb, var(--helios-ui-bg-solid) 18%, transparent), color-mix(in srgb, var(--helios-ui-bg-solid) 8%, transparent) 22%, transparent 56%);\n}\n\n.helios-ui[data-interface-mode=\"fullscreen\"] .helios-ui-panel {\n  transition:\n    opacity 140ms ease,\n    transform 140ms ease,\n    background-color 140ms ease,\n    border-color 140ms ease,\n    backdrop-filter 140ms ease;\n}\n\n.helios-ui[data-interface-mode=\"fullscreen\"] .helios-ui-panel[data-interface-visible=\"false\"] {\n  opacity: 0;\n  pointer-events: none;\n  visibility: hidden;\n}\n\n.helios-ui[data-interface-mode=\"fullscreen\"] .helios-ui-fullscreen-flow > .helios-ui-panel[data-interface-visible=\"true\"] {\n  position: relative !important;\n  inset: auto !important;\n  left: auto !important;\n  top: auto !important;\n  right: auto !important;\n  bottom: auto !important;\n  width: 100% !important;\n  max-width: none !important;\n  max-height: none !important;\n  min-width: 0 !important;\n  flex: 0 0 auto !important;\n  z-index: auto !important;\n  border-radius: 0 !important;\n  border-left-width: 0 !important;\n  border-right-width: 0 !important;\n  border-top-width: 0 !important;\n  box-shadow: none !important;\n}\n\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-fullscreen-flow > .helios-ui-panel[data-interface-visible=\"true\"] {\n  background: transparent !important;\n  border-color: transparent !important;\n  -webkit-backdrop-filter: none !important;\n  backdrop-filter: none !important;\n  box-shadow: none !important;\n}\n\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-fullscreen-flow > .helios-ui-panel[data-interface-visible=\"true\"]:not(:has([data-control-focus-active=\"true\"])) {\n  opacity: 0.02 !important;\n}\n\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-fullscreen-flow > .helios-ui-panel[data-interface-visible=\"true\"]:has([data-control-focus-active=\"true\"]) {\n  opacity: 1 !important;\n}\n\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-interface-fullscreen-bar {\n  opacity: 0;\n  pointer-events: none;\n}\n\n.helios-ui-panel {\n  position: absolute;\n  width: 320px;\n  max-width: min(92vw, 480px);\n  min-width: 240px;\n  max-height: calc(100% - 16px);\n  pointer-events: auto;\n  border-radius: var(--helios-ui-radius);\n  border: 1px solid var(--helios-ui-border);\n  background: var(--helios-ui-bg);\n  -webkit-backdrop-filter: blur(var(--helios-ui-blur));\n  backdrop-filter: blur(var(--helios-ui-blur));\n  box-shadow: var(--helios-ui-shadow);\n  overflow: hidden;\n  display: flex;\n  flex-direction: column;\n  container-type: inline-size;\n}\n\n.helios-ui-panel:not([data-dock=\"free\"]) {\n  border-radius: 0;\n}\n\n.helios-ui-resize-handle {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  width: 10px;\n  pointer-events: auto;\n  touch-action: none;\n}\n\n.helios-ui-resize-handle[data-edge=\"right\"] { right: 0; cursor: ew-resize; }\n.helios-ui-resize-handle[data-edge=\"left\"] { left: 0; cursor: ew-resize; }\n\n.helios-ui-panel[data-dock=\"top\"] .helios-ui-resize-handle,\n.helios-ui-panel[data-dock=\"bottom\"] .helios-ui-resize-handle {\n  display: none;\n}\n\n.helios-ui-panel[data-collapsed=\"true\"] .helios-ui-panel__body { display: none; }\n\n.helios-ui-panel__header {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  padding: 7px 7px 5px;\n  user-select: none;\n  cursor: default;\n  position: relative;\n  overflow: hidden;\n}\n\n.helios-ui-panel__header::after {\n  content: '';\n  position: absolute;\n  inset: 0;\n  pointer-events: none;\n  opacity: 0;\n}\n\n.helios-ui-panel__header[data-nav-shine=\"true\"]::after {\n  opacity: 1;\n  background: linear-gradient(\n    102deg,\n    transparent 0%,\n    transparent 24%,\n    color-mix(in srgb, var(--helios-ui-accent) 18%, transparent) 38%,\n    color-mix(in srgb, var(--helios-ui-accent) 56%, white 12%) 50%,\n    color-mix(in srgb, var(--helios-ui-accent) 22%, transparent) 62%,\n    transparent 78%,\n    transparent 100%\n  );\n  transform: translateX(-130%);\n  animation: helios-ui-panel-nav-shine 1280ms cubic-bezier(0.2, 0.76, 0.18, 1) forwards;\n}\n\n.helios-ui-panel__header[data-nav-shine=\"true\"] {\n  box-shadow:\n    inset 0 0 0 1px color-mix(in srgb, var(--helios-ui-accent) 34%, transparent),\n    inset 0 0 24px color-mix(in srgb, var(--helios-ui-accent) 10%, transparent);\n}\n\n.helios-ui-panel__title-wrap {\n  display: inline-flex;\n  align-items: center;\n  gap: 7px;\n  flex: 1;\n  min-width: 0;\n}\n\n.helios-ui-panel__title-icon {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: 17px;\n  height: 17px;\n  flex: none;\n  color: color-mix(in srgb, var(--helios-ui-accent) 72%, var(--helios-ui-fg));\n}\n\n.helios-ui-panel__title-icon[hidden] {\n  display: none !important;\n}\n\n.helios-ui-panel__title-icon svg {\n  width: 15px;\n  height: 15px;\n}\n\n.helios-ui-panel__title {\n  flex: 0 1 auto;\n  min-width: 0;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  font-weight: 600;\n  letter-spacing: 0.2px;\n  font-size: 12.5px;\n}\n\n.helios-ui-panel__actions {\n  display: inline-flex;\n  align-items: center;\n  gap: 5px;\n}\n\n.helios-ui-button {\n  appearance: none;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  flex: none;\n  white-space: nowrap;\n  border: 1px solid var(--helios-ui-control-border);\n  border-radius: 10px;\n  padding: 4px 6px;\n  background: var(--helios-ui-control-bg);\n  color: inherit;\n  font: inherit;\n  font-weight: 600;\n  line-height: 1;\n}\n\n.helios-ui-button--danger {\n  border-color: color-mix(in srgb, var(--helios-ui-danger) 56%, var(--helios-ui-border));\n  background: color-mix(in srgb, var(--helios-ui-danger) 18%, var(--helios-ui-bg-solid));\n}\n\n.helios-ui-button--link {\n  padding: 0;\n  min-height: 0;\n  border: 0;\n  border-radius: 0;\n  background: transparent;\n  color: color-mix(in srgb, var(--helios-ui-accent) 78%, var(--helios-ui-fg));\n  font-size: 11px;\n  line-height: 1.2;\n  box-shadow: none;\n}\n\n.helios-ui-button--spinning {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n}\n\n.helios-ui-button--spinning::before {\n  content: '';\n  width: 12px;\n  height: 12px;\n  border-radius: 999px;\n  border: 1.5px solid transparent;\n  border-top-color: currentColor;\n  border-right-color: currentColor;\n  opacity: 0.9;\n  animation: helios-ui-spin 0.8s linear infinite;\n}\n\n.helios-ui-button--icon {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  padding: 4px 10px;\n}\n\n.helios-ui-button__icon {\n  width: 14px;\n  height: 14px;\n  flex: none;\n  opacity: 0.9;\n}\n\n.helios-ui-button__icon--spinning {\n  animation: helios-ui-spin 0.8s linear infinite;\n}\n\n.helios-ui-button:disabled {\n  border-color: color-mix(in srgb, var(--helios-ui-border) 72%, transparent);\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 82%, transparent);\n  color: color-mix(in srgb, var(--helios-ui-muted) 78%, var(--helios-ui-bg-solid));\n  opacity: 0.72;\n  cursor: not-allowed;\n  box-shadow: none;\n}\n\n@keyframes helios-ui-spin {\n  to { transform: rotate(360deg); }\n}\n\n@keyframes helios-ui-panel-nav-shine {\n  0% {\n    opacity: 0;\n    transform: translateX(-130%);\n  }\n\n  22% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    transform: translateX(135%);\n  }\n}\n\n.helios-ui-select {\n  appearance: none;\n  border: 1px solid var(--helios-ui-border);\n  border-radius: 10px;\n  padding: 4px 26px 4px 10px;\n  background:\n    linear-gradient(45deg, transparent 50%, color-mix(in srgb, var(--helios-ui-muted) 90%, transparent) 50%) right 12px center/6px 6px no-repeat,\n    linear-gradient(135deg, color-mix(in srgb, var(--helios-ui-muted) 90%, transparent) 50%, transparent 50%) right 8px center/6px 6px no-repeat,\n    var(--helios-ui-control-bg);\n  color: inherit;\n  font: inherit;\n  line-height: 1;\n  max-width: 220px;\n  width: 100%;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.helios-ui-select--compact {\n  width: auto;\n  max-width: 140px;\n}\n\n.helios-ui-layout__actions {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  flex-wrap: wrap;\n}\n\n.helios-ui-layout__status-shell {\n  width: 100%;\n  min-height: 34px;\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) 38px;\n  align-items: stretch;\n  border: 1px solid var(--helios-ui-border);\n  border-radius: 14px;\n  overflow: hidden;\n  background: var(--helios-ui-control-bg);\n  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--helios-ui-fg) 2%, transparent);\n}\n\n.helios-ui-layout__status-visual {\n  position: relative;\n  min-width: 0;\n  min-height: 34px;\n  padding: 3px 7px 4px;\n  background:\n    linear-gradient(to top, color-mix(in srgb, var(--helios-ui-fg) 2%, transparent), transparent 55%),\n    var(--helios-ui-control-bg);\n}\n\n.helios-ui-layout__status-visual[data-state=\"running\"] {\n  background:\n    linear-gradient(to top, color-mix(in srgb, var(--helios-ui-status-success) 4%, transparent), transparent 55%),\n    var(--helios-ui-control-bg);\n}\n\n.helios-ui-layout__status-visual[data-state=\"stopped\"] {\n  background:\n    linear-gradient(to top, color-mix(in srgb, var(--helios-ui-status-running) 4%, transparent), transparent 55%),\n    var(--helios-ui-control-bg);\n}\n\n.helios-ui-layout__status-visual[data-state=\"idle\"] {\n  background:\n    linear-gradient(to top, color-mix(in srgb, var(--helios-ui-status-running) 10%, transparent), transparent 55%),\n    var(--helios-ui-control-bg);\n}\n\n.helios-ui-layout__status-badge {\n  position: absolute;\n  top: 4px;\n  right: 8px;\n  display: inline-flex;\n  align-items: center;\n  gap: 4px;\n  min-width: 0;\n  z-index: 1;\n  color: color-mix(in srgb, var(--helios-ui-fg) 90%, #f3e8ff 10%);\n}\n\n.helios-ui-layout__status-temp {\n  position: absolute;\n  left: 9px;\n  bottom: 5px;\n  z-index: 1;\n  font-size: 11px;\n  font-weight: 500;\n  line-height: 1;\n  letter-spacing: 0.01em;\n  color: color-mix(in srgb, var(--helios-ui-accent) 72%, white 24%);\n  text-shadow:\n    0 1px 0 var(--helios-ui-text-outline),\n    0 -1px 0 var(--helios-ui-text-outline),\n    1px 0 0 var(--helios-ui-text-outline),\n    -1px 0 0 var(--helios-ui-text-outline),\n    0 0 3px color-mix(in srgb, var(--helios-ui-text-outline) 70%, transparent);\n  pointer-events: none;\n}\n\n.helios-ui-layout__status-button {\n  appearance: none;\n  display: grid;\n  place-items: center;\n  width: 100%;\n  min-width: 0;\n  min-height: 34px;\n  padding: 0;\n  border: 0;\n  border-left: 1px solid var(--helios-ui-border);\n  background: var(--helios-ui-control-bg);\n  color: color-mix(in srgb, var(--helios-ui-fg) 90%, white 10%);\n  cursor: pointer;\n  touch-action: manipulation;\n  -webkit-tap-highlight-color: transparent;\n}\n\n.helios-ui-layout__status-button[data-state=\"running\"] {\n  background: color-mix(in srgb, var(--helios-ui-danger) 24%, var(--helios-ui-bg-solid));\n}\n\n.helios-ui-layout__status-button[data-state=\"stopped\"] {\n  background: color-mix(in srgb, var(--helios-ui-status-running) 22%, var(--helios-ui-bg-solid));\n}\n\n.helios-ui-layout__status-button[data-state=\"idle\"] {\n  background: color-mix(in srgb, var(--helios-ui-danger) 24%, var(--helios-ui-bg-solid));\n}\n\n.helios-ui-layout__status-button:hover {\n  filter: brightness(1.04);\n}\n\n.helios-ui-layout__status-button:active {\n  filter: brightness(0.98);\n}\n\n.helios-ui-layout__status-button:focus-visible {\n  outline: none;\n  box-shadow: inset 0 0 0 2px var(--helios-ui-focus-ring);\n}\n\n.helios-ui-layout__status-button-icon {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  transform: translateX(-1px);\n}\n\n.helios-ui-layout__status-button .helios-ui-button__icon {\n  width: 24px;\n  height: 24px;\n  opacity: 0.92;\n}\n\n.helios-ui-layout__status-spinner {\n  width: 10px;\n  height: 10px;\n  flex: none;\n  opacity: 0.88;\n  animation: helios-ui-spin 0.8s linear infinite;\n}\n\n.helios-ui-layout__display {\n  min-height: 28px;\n  display: inline-flex;\n  align-items: center;\n  padding: 0 10px;\n  border-radius: 10px;\n  border: 1px solid var(--helios-ui-border);\n  background: var(--helios-ui-control-bg);\n  color: inherit;\n}\n\n.helios-ui-layout__display-stack {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  width: min(220px, 100%);\n}\n\n.helios-ui-layout__status-text {\n  color: var(--helios-ui-fg);\n  text-align: right;\n  white-space: nowrap;\n  font-size: 10px;\n  font-weight: 500;\n  letter-spacing: 0.01em;\n  text-shadow:\n    0 1px 0 var(--helios-ui-text-outline),\n    0 -1px 0 var(--helios-ui-text-outline),\n    1px 0 0 var(--helios-ui-text-outline),\n    -1px 0 0 var(--helios-ui-text-outline),\n    0 0 3px color-mix(in srgb, var(--helios-ui-text-outline) 70%, transparent);\n}\n\n.helios-ui-layout__status-text[data-state=\"running\"] {\n  color: color-mix(in srgb, var(--helios-ui-fg) 88%, var(--helios-ui-status-success) 12%);\n}\n\n.helios-ui-layout__status-text[data-state=\"stopped\"] {\n  color: color-mix(in srgb, var(--helios-ui-fg) 82%, #f2b7bf 18%);\n}\n\n.helios-ui-layout__status-text[data-state=\"idle\"] {\n  color: color-mix(in srgb, var(--helios-ui-fg) 84%, var(--helios-ui-status-running) 16%);\n}\n\n.helios-ui-layout__status[data-state=\"running\"] {\n  border-color: color-mix(in srgb, var(--helios-ui-status-running) 56%, var(--helios-ui-border));\n  background: color-mix(in srgb, var(--helios-ui-status-running) 18%, var(--helios-ui-bg-solid));\n}\n\n.helios-ui-layout__status[data-state=\"error\"] {\n  border-color: color-mix(in srgb, var(--helios-ui-status-error) 56%, var(--helios-ui-border));\n  background: color-mix(in srgb, var(--helios-ui-status-error) 18%, var(--helios-ui-bg-solid));\n}\n\n.helios-ui-layout__status[data-state=\"idle\"] {\n  border-color: color-mix(in srgb, var(--helios-ui-status-running) 44%, var(--helios-ui-border));\n  background: color-mix(in srgb, var(--helios-ui-status-running) 12%, var(--helios-ui-bg-solid));\n}\n\n.helios-ui-layout__bindings {\n  display: flex;\n  flex-direction: column;\n  gap: 0;\n}\n\n.helios-ui-layout__sparkline {\n  display: block;\n  width: 100%;\n  height: 28px;\n  border-radius: 8px;\n  border: 1px solid var(--helios-ui-border);\n  background:\n    linear-gradient(to top, color-mix(in srgb, var(--helios-ui-fg) 4%, transparent), color-mix(in srgb, var(--helios-ui-fg) 1%, transparent)),\n    color-mix(in srgb, var(--helios-ui-bg-solid) 72%, transparent);\n  overflow: hidden;\n}\n\n.helios-ui-layout__sparkline path {\n  stroke: color-mix(in srgb, var(--helios-ui-accent) 88%, white 8%);\n  stroke-width: 1.75;\n  stroke-linecap: round;\n  stroke-linejoin: round;\n}\n\n.helios-ui-layout__sparkline--status {\n  position: absolute;\n  inset: 0;\n  height: 100%;\n  border: 0;\n  border-radius: 0;\n  background: transparent;\n}\n\n.helios-ui-layout__sparkline--status path {\n  stroke-width: 1.8;\n}\n\n.helios-ui-layout__empty {\n  color: var(--helios-ui-muted);\n  font-size: 12px;\n}\n\n.helios-ui-network {\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n}\n\n.helios-ui-network__actions {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  min-width: 0;\n}\n\n.helios-ui-network__actions > .helios-ui-select {\n  flex: 0 0 auto;\n}\n\n.helios-ui-network__name {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  min-width: 0;\n}\n\n.helios-ui-network__name > .helios-ui-text {\n  flex: 1 1 auto;\n}\n\n.helios-ui-network__ext {\n  flex: none;\n  font: 600 11px/1 var(--helios-ui-font);\n  color: var(--helios-ui-muted);\n  padding: 0 2px;\n  user-select: none;\n}\n\n.helios-ui-network__format-warning {\n  color: var(--helios-ui-muted);\n  width: 18px;\n  height: 18px;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.helios-ui-network__format-warning[hidden] {\n  display: none !important;\n}\n\n.helios-ui-network__format-warning-icon {\n  width: 15px;\n  height: 15px;\n  display: block;\n}\n\n.helios-ui-network__sync-row {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 8px;\n  margin-top: 4px;\n  min-width: 0;\n}\n\n.helios-ui-network-persistence {\n  display: inline-flex;\n  align-items: center;\n  gap: 8px;\n  justify-content: flex-start;\n  min-width: 0;\n  flex: 1 1 auto;\n}\n\n.helios-ui-network-persistence__controls {\n  display: inline-flex;\n  align-items: center;\n  gap: 8px;\n  flex: 0 0 auto;\n}\n\n.helios-ui-network-persistence__status {\n  color: var(--helios-ui-muted);\n  font-size: 11px;\n  line-height: 1.25;\n  max-width: 118px;\n  text-align: left;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.helios-ui-network-autosync {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  flex: 0 0 auto;\n  min-width: 0;\n}\n\n.helios-ui-network-autosync__label {\n  color: var(--helios-ui-muted);\n  font-size: 11px;\n  line-height: 1.25;\n  white-space: nowrap;\n}\n\n.helios-ui-network-autosync[data-state=\"disabled\"] .helios-ui-toggle {\n  pointer-events: none;\n}\n\n.helios-ui-toggle--compact {\n  min-height: 24px;\n  padding: 2px 7px 2px 5px;\n  gap: 5px;\n  font-size: 10px;\n}\n\n.helios-ui-toggle--compact .helios-ui-toggle__thumb {\n  width: 18px;\n  height: 12px;\n}\n\n.helios-ui-toggle--compact .helios-ui-toggle__thumb::after {\n  width: 8px;\n  height: 8px;\n}\n\n.helios-ui-toggle--compact[aria-checked=\"true\"] .helios-ui-toggle__thumb::after {\n  transform: translateX(6px);\n}\n\n.helios-ui-network-persistence__sync[data-state=\"syncing\"] .helios-ui-button__icon {\n  animation: helios-ui-spin 0.8s linear infinite;\n}\n\n@keyframes helios-ui-spin {\n  to { transform: rotate(360deg); }\n}\n\n.helios-ui-session-tab {\n  display: grid;\n  gap: 10px;\n}\n\n.helios-ui-session-tab__header {\n  display: grid;\n  align-items: start;\n  gap: 8px;\n  min-width: 0;\n}\n\n.helios-ui-session-tab__current {\n  display: grid;\n  gap: 2px;\n  min-width: 0;\n}\n\n.helios-ui-session-tab__current-label {\n  color: var(--helios-ui-text);\n  font-size: 12px;\n  font-weight: 700;\n  line-height: 1.3;\n}\n\n.helios-ui-session-tab__current-id {\n  color: var(--helios-ui-muted);\n  font-size: 10px;\n  line-height: 1.25;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.helios-ui-session-tab__actions {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  justify-content: flex-start;\n  flex: 0 0 auto;\n}\n\n.helios-ui-session-tab__list {\n  display: grid;\n  gap: 6px;\n  max-height: min(260px, 42vh);\n  overflow: auto;\n  padding-right: 2px;\n}\n\n.helios-ui-session-tab__row {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  align-items: stretch;\n  gap: 7px;\n  min-width: 0;\n  border: 1px solid var(--helios-ui-border);\n  border-radius: 8px;\n  padding: 9px;\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 84%, transparent);\n}\n\n.helios-ui-session-tab__row--with-thumbnail {\n  grid-template-columns: minmax(0, 1fr);\n}\n\n.helios-ui-session-tab__row[data-current=\"true\"] {\n  border-color: color-mix(in srgb, var(--helios-ui-accent) 46%, var(--helios-ui-border));\n}\n\n.helios-ui-session-tab__body {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) auto;\n  align-items: center;\n  gap: 8px;\n  min-width: 0;\n}\n\n.helios-ui-session-tab__row--with-thumbnail .helios-ui-session-tab__body {\n  grid-template-columns: 44px minmax(0, 1fr) auto;\n}\n\n.helios-ui-session-tab__thumbnail {\n  display: block;\n  width: 44px;\n  height: 32px;\n  object-fit: cover;\n  border: 1px solid var(--helios-ui-border);\n  border-radius: 6px;\n  background: #000;\n}\n\n.helios-ui-session-tab__details {\n  display: grid;\n  gap: 2px;\n  min-width: 0;\n}\n\n.helios-ui-session-tab__title {\n  color: var(--helios-ui-text);\n  font-size: 13px;\n  font-weight: 700;\n  line-height: 1.25;\n  min-width: 0;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.helios-ui-session-tab__meta {\n  color: var(--helios-ui-muted);\n  font-size: 10px;\n  line-height: 1.25;\n  overflow-wrap: anywhere;\n}\n\n.helios-ui-session-tab__meta-line {\n  min-width: 0;\n  overflow-wrap: anywhere;\n}\n\n.helios-ui-session-tab__meta-line--id {\n  color: color-mix(in srgb, var(--helios-ui-fg) 72%, var(--helios-ui-muted));\n}\n\n.helios-ui-session-tab__row-actions {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  min-width: 0;\n}\n\n.helios-ui-session-tab__delete {\n  color: var(--helios-ui-muted);\n}\n\n.helios-ui-attributes-table-wrap {\n  border: 1px solid var(--helios-ui-border);\n  border-radius: 10px;\n  overflow: auto;\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 82%, transparent);\n}\n\n.helios-ui-attributes-table {\n  width: 100%;\n  border-collapse: collapse;\n  font: inherit;\n}\n\n.helios-ui-attributes-table th,\n.helios-ui-attributes-table td {\n  padding: 6px 8px;\n  text-align: left;\n  white-space: nowrap;\n  border-bottom: 1px solid color-mix(in srgb, var(--helios-ui-border) 76%, transparent);\n}\n\n.helios-ui-attributes-table th {\n  position: sticky;\n  top: 0;\n  z-index: 1;\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 94%, transparent);\n  font-weight: 700;\n}\n\n.helios-ui-attributes-table tbody tr:last-child td {\n  border-bottom: 0;\n}\n\n.helios-ui-dialog {\n  width: min(320px, calc(100vw - 32px));\n  margin: auto;\n  padding: 12px;\n  border: 1px solid var(--helios-ui-border);\n  border-radius: 14px;\n  background: var(--helios-ui-bg-solid);\n  color: inherit;\n  box-shadow: var(--helios-ui-shadow);\n  pointer-events: auto;\n}\n\n.helios-ui-dialog::backdrop {\n  background: rgba(0, 0, 0, 0.28);\n}\n\n.helios-ui-dialog__title {\n  margin: 0 0 8px;\n  font-size: 13px;\n  font-weight: 700;\n}\n\n.helios-ui-dialog__body {\n  font-size: 12px;\n  line-height: 1.35;\n  color: var(--helios-ui-fg);\n}\n\n.helios-ui-dialog__meta {\n  margin-top: 8px;\n  font-size: 11px;\n  line-height: 1.35;\n  color: var(--helios-ui-muted);\n}\n\n.helios-ui-dialog__actions {\n  display: flex;\n  justify-content: flex-end;\n  gap: 8px;\n  margin-top: 10px;\n}\n\n.helios-ui-select:hover {\n  border-color: var(--helios-ui-control-border);\n  background:\n    linear-gradient(45deg, transparent 50%, color-mix(in srgb, var(--helios-ui-muted) 90%, transparent) 50%) right 12px center/6px 6px no-repeat,\n    linear-gradient(135deg, color-mix(in srgb, var(--helios-ui-muted) 90%, transparent) 50%, transparent 50%) right 8px center/6px 6px no-repeat,\n    var(--helios-ui-control-bg-hover);\n}\n\n.helios-ui-select:disabled {\n  cursor: not-allowed;\n  color: color-mix(in srgb, var(--helios-ui-muted) 78%, var(--helios-ui-bg-solid));\n  border-color: color-mix(in srgb, var(--helios-ui-border) 72%, transparent);\n  background:\n    linear-gradient(45deg, transparent 50%, color-mix(in srgb, var(--helios-ui-muted) 25%, transparent) 50%) right 12px center/6px 6px no-repeat,\n    linear-gradient(135deg, color-mix(in srgb, var(--helios-ui-muted) 25%, transparent) 50%, transparent 50%) right 8px center/6px 6px no-repeat,\n    color-mix(in srgb, var(--helios-ui-bg-solid) 82%, transparent);\n  box-shadow: none;\n  opacity: 0.72;\n}\n\n.helios-ui-select:disabled:hover {\n  border-color: color-mix(in srgb, var(--helios-ui-border) 72%, transparent);\n}\n\n.helios-ui-button:hover:not(:disabled) {\n  border-color: color-mix(in srgb, var(--helios-ui-accent-hover) 40%, var(--helios-ui-control-border));\n  background: var(--helios-ui-control-bg-hover);\n}\n\n.helios-ui-button--link:hover:not(:disabled) {\n  border-color: transparent;\n  background: transparent;\n  color: color-mix(in srgb, var(--helios-ui-accent) 92%, var(--helios-ui-fg));\n  text-decoration: underline;\n}\n\n.helios-ui-button:active:not(:disabled) {\n  transform: translateY(0.5px);\n}\n\n.helios-ui-button:focus-visible,\n.helios-ui-select:focus-visible {\n  outline: none;\n  box-shadow: 0 0 0 4px var(--helios-ui-focus-ring);\n}\n\n.helios-ui-panel__body {\n  padding: 6px;\n  border-top: 1px solid color-mix(in srgb, var(--helios-ui-border) 75%, transparent);\n  overflow: auto;\n}\n\n.helios-ui-row {\n  display: grid;\n  grid-template-columns: 1fr auto;\n  gap: 7px;\n  align-items: center;\n  padding: 5px 0;\n}\n\n.helios-ui-row > * { min-width: 0; }\n\n.helios-ui-row--aligned {\n  grid-template-columns: var(--helios-ui-label-col) minmax(0, 1fr);\n}\n\n.helios-ui-row--slider {\n  padding: 2px 0;\n}\n\n.helios-ui-label {\n  display: grid;\n  gap: 2px;\n  min-width: 0;\n  justify-items: end;\n  text-align: right;\n}\n\n.helios-ui-label__title-row {\n  display: flex;\n  justify-content: flex-end;\n  align-items: center;\n  gap: 3px;\n  min-height: 18px;\n}\n\n.helios-ui-label__title {\n  font-weight: 500;\n  min-width: 0;\n  overflow-wrap: anywhere;\n  word-break: break-word;\n  white-space: normal;\n}\n.helios-ui-label__hint { color: var(--helios-ui-muted); font-size: 11px; }\n\n.helios-ui-dirty-indicator {\n  appearance: none;\n  display: inline-grid;\n  place-items: center;\n  width: 7px;\n  height: 7px;\n  min-width: 7px;\n  padding: 0;\n  border-radius: 999px;\n  border: 1px solid color-mix(in srgb, var(--helios-ui-muted) 55%, transparent);\n  background: transparent;\n  cursor: pointer;\n}\n\n.helios-ui-dirty-indicator[data-state=\"default\"] {\n  visibility: hidden;\n  pointer-events: none;\n}\n\n.helios-ui--storage-disabled .helios-ui-dirty-indicator {\n  display: none;\n}\n\n.helios-ui-dirty-indicator--static,\n.helios-ui-dirty-indicator:disabled {\n  cursor: default;\n  pointer-events: none;\n}\n\n.helios-ui-dirty-indicator[data-state=\"changed\"] {\n  visibility: visible;\n  pointer-events: auto;\n  border-color: color-mix(in srgb, var(--helios-ui-fg) 72%, var(--helios-ui-border));\n  background: color-mix(in srgb, var(--helios-ui-fg) 82%, transparent);\n}\n\n.helios-ui-dirty-indicator[data-state=\"partial\"] {\n  visibility: visible;\n  pointer-events: auto;\n  border-color: color-mix(in srgb, var(--helios-ui-fg) 72%, var(--helios-ui-border));\n  background:\n    linear-gradient(90deg, color-mix(in srgb, var(--helios-ui-fg) 82%, transparent) 50%, transparent 50%);\n}\n\n.helios-ui-dirty-indicator:hover {\n  border-color: color-mix(in srgb, var(--helios-ui-accent) 65%, var(--helios-ui-border));\n}\n\n.helios-ui-panel__persistence-indicator {\n  margin-right: 2px;\n}\n\n.helios-ui-dirty-menu {\n  z-index: 2147483100;\n  min-width: 180px;\n  max-width: 260px;\n  padding: 6px;\n  border: 1px solid var(--helios-ui-border);\n  border-radius: 8px;\n  background: var(--helios-ui-bg-solid);\n  color: var(--helios-ui-fg);\n  box-shadow: var(--helios-ui-shadow);\n  pointer-events: auto;\n}\n\n.helios-ui-dirty-menu__item {\n  appearance: none;\n  display: block;\n  width: 100%;\n  padding: 6px 8px;\n  border: 0;\n  border-radius: 6px;\n  background: transparent;\n  color: inherit;\n  font: 500 12px/1.2 var(--helios-ui-font);\n  text-align: left;\n  cursor: pointer;\n}\n\n.helios-ui-dirty-menu__item:hover:not(:disabled) {\n  background: color-mix(in srgb, var(--helios-ui-accent) 18%, transparent);\n}\n\n.helios-ui-dirty-menu__item:disabled,\n.helios-ui-dirty-menu__item--muted {\n  color: var(--helios-ui-muted);\n  cursor: default;\n}\n\n.helios-ui-dirty-menu__title {\n  padding: 7px 8px 3px;\n  color: var(--helios-ui-muted);\n  font: 600 10px/1 var(--helios-ui-font);\n  text-transform: uppercase;\n}\n\n.helios-ui-dirty-menu__change {\n  padding: 3px 8px;\n  color: var(--helios-ui-muted);\n  font-size: 11px;\n  overflow-wrap: anywhere;\n}\n\n.helios-ui-help {\n  appearance: none;\n  border: 1px solid var(--helios-ui-border);\n  border-radius: 999px;\n  width: 12px;\n  height: 12px;\n  padding: 0;\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 80%, transparent);\n  color: var(--helios-ui-muted);\n  font: 700 9px/1 var(--helios-ui-font);\n  display: grid;\n  place-items: center;\n  cursor: help;\n  transform: translateY(-3px);\n}\n\n.helios-ui-help:hover {\n  color: color-mix(in srgb, var(--helios-ui-accent) 85%, var(--helios-ui-fg));\n  border-color: color-mix(in srgb, var(--helios-ui-accent) 45%, var(--helios-ui-border));\n}\n\n.helios-ui-help:focus-visible {\n  outline: none;\n  box-shadow: 0 0 0 4px color-mix(in srgb, var(--helios-ui-accent) 22%, transparent);\n}\n\n.helios-ui-tooltip {\n  position: fixed;\n  z-index: 9999;\n  max-width: min(280px, calc(100vw - 24px));\n  padding: 6px 8px;\n  border-radius: 9px;\n  border: 1px solid color-mix(in srgb, var(--helios-ui-fg) 14%, transparent);\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 92%, transparent);\n  color: inherit;\n  box-shadow: 0 18px 40px rgba(0, 0, 0, 0.28);\n  pointer-events: none;\n  line-height: 1.3;\n  font: 400 11px/1.25 var(--helios-ui-font);\n}\n\n.helios-ui-tooltip[data-open=\"false\"] { opacity: 0; }\n.helios-ui-tooltip[data-open=\"true\"] { opacity: 1; }\n\n.helios-ui-value {\n  font-variant-numeric: tabular-nums;\n  color: var(--helios-ui-muted);\n  min-width: 3.5em;\n  text-align: right;\n}\n\n.helios-ui-stats {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 6px;\n  justify-content: flex-start;\n}\n\n.helios-ui-stats--end { justify-content: flex-end; }\n\n.helios-ui-stat {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  padding: 2px 8px;\n  border-radius: 999px;\n  border: 1px solid var(--helios-ui-border);\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 85%, transparent);\n  font: 400 11px/1.1 var(--helios-ui-font);\n  max-width: 100%;\n}\n\n.helios-ui-stat__label {\n  color: var(--helios-ui-muted);\n  white-space: nowrap;\n}\n\n.helios-ui-stat__value {\n  font-variant-numeric: tabular-nums;\n  color: inherit;\n  white-space: nowrap;\n}\n\n.helios-ui-rule-keyword {\n  width: var(--helios-ui-rule-keyword-width);\n  flex: 0 0 var(--helios-ui-rule-keyword-width);\n  font-size: 12px;\n  color: var(--helios-ui-muted);\n  text-align: right;\n  white-space: nowrap;\n}\n\n.helios-ui-number {\n  width: 66px;\n  flex: 0 1 66px;\n  min-width: 52px;\n  max-width: 100%;\n  padding: 4px 6px;\n  border-radius: 10px;\n  border: 1px solid var(--helios-ui-border);\n  background: var(--helios-ui-control-bg);\n  color: inherit;\n  font: inherit;\n  font-variant-numeric: tabular-nums;\n  text-align: right;\n  -moz-appearance: textfield;\n}\n\n.helios-ui-toggle {\n  appearance: none;\n  border: 1px solid var(--helios-ui-control-border);\n  border-radius: 999px;\n  padding: 3px 10px 3px 6px;\n  background: var(--helios-ui-control-bg);\n  color: inherit;\n  font: inherit;\n  font-weight: 600;\n  display: inline-flex;\n  align-items: center;\n  gap: 8px;\n  line-height: 1;\n  touch-action: manipulation;\n  -webkit-tap-highlight-color: transparent;\n}\n\n.helios-ui-toggle__thumb {\n  width: 22px;\n  height: 14px;\n  border-radius: 999px;\n  background: color-mix(in srgb, var(--helios-ui-fg) 12%, transparent);\n  border: 1px solid var(--helios-ui-border);\n  position: relative;\n  flex: none;\n}\n\n.helios-ui-toggle__thumb::after {\n  content: \"\";\n  position: absolute;\n  top: 1px;\n  left: 1px;\n  width: 10px;\n  height: 10px;\n  border-radius: 999px;\n  background: color-mix(in srgb, var(--helios-ui-fg) 70%, transparent);\n  transition: transform 120ms ease;\n}\n\n.helios-ui-toggle[aria-checked=\"true\"] {\n  background: color-mix(in srgb, var(--helios-ui-accent) 18%, var(--helios-ui-bg-solid));\n}\n\n.helios-ui-toggle[aria-checked=\"true\"] .helios-ui-toggle__thumb {\n  background: color-mix(in srgb, var(--helios-ui-accent) 38%, transparent);\n  border-color: color-mix(in srgb, var(--helios-ui-accent) 55%, var(--helios-ui-border));\n}\n\n.helios-ui-toggle[aria-checked=\"true\"] .helios-ui-toggle__thumb::after {\n  background: var(--helios-ui-accent);\n  transform: translateX(8px);\n}\n\n.helios-ui-toggle:disabled {\n  border-color: color-mix(in srgb, var(--helios-ui-border) 72%, transparent);\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 82%, transparent);\n  color: color-mix(in srgb, var(--helios-ui-muted) 78%, var(--helios-ui-bg-solid));\n  opacity: 0.72;\n  cursor: not-allowed;\n  box-shadow: none;\n}\n\n.helios-ui-toggle:disabled .helios-ui-toggle__thumb {\n  background: color-mix(in srgb, var(--helios-ui-muted) 8%, transparent);\n  border-color: color-mix(in srgb, var(--helios-ui-border) 72%, transparent);\n}\n\n.helios-ui-toggle:disabled .helios-ui-toggle__thumb::after {\n  background: color-mix(in srgb, var(--helios-ui-muted) 42%, transparent);\n}\n\n.helios-ui-toggle:focus-visible {\n  outline: none;\n  box-shadow: 0 0 0 4px var(--helios-ui-focus-ring);\n}\n\n.helios-ui-segmented-toggle {\n  display: inline-grid;\n  grid-auto-flow: column;\n  grid-auto-columns: minmax(0, 1fr);\n  align-items: stretch;\n  gap: 1px;\n  padding: 2px;\n  border-radius: 999px;\n  border: 1px solid var(--helios-ui-border);\n  background: color-mix(in srgb, var(--helios-ui-control-bg) 84%, transparent);\n  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--helios-ui-fg) 3%, transparent);\n  touch-action: manipulation;\n  -webkit-tap-highlight-color: transparent;\n}\n\n.helios-ui-segmented-toggle[aria-disabled=\"true\"] {\n  opacity: 0.56;\n}\n\n.helios-ui-segmented-toggle__option {\n  min-width: 0;\n  min-height: 28px;\n  padding: 5px 10px;\n  border: 0;\n  border-radius: 999px;\n  background: transparent;\n  color: var(--helios-ui-muted);\n  font: inherit;\n  font-weight: 600;\n  letter-spacing: 0.01em;\n  line-height: 1;\n  white-space: nowrap;\n  cursor: pointer;\n  touch-action: manipulation;\n  -webkit-tap-highlight-color: transparent;\n  transition: background-color 140ms ease, color 140ms ease, box-shadow 140ms ease;\n}\n\n.helios-ui-segmented-toggle__option:hover {\n  color: var(--helios-ui-fg);\n}\n\n.helios-ui-segmented-toggle__option[data-selected=\"true\"] {\n  background: color-mix(in srgb, var(--helios-ui-accent) 18%, var(--helios-ui-bg-solid));\n  color: var(--helios-ui-fg);\n  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--helios-ui-accent) 28%, transparent);\n}\n\n.helios-ui-segmented-toggle__option:focus-visible {\n  outline: none;\n  box-shadow:\n    inset 0 0 0 1px color-mix(in srgb, var(--helios-ui-accent) 28%, transparent),\n    0 0 0 2px var(--helios-ui-focus-ring);\n}\n\n.helios-ui-number::-webkit-outer-spin-button,\n.helios-ui-number::-webkit-inner-spin-button {\n  -webkit-appearance: none;\n  margin: 0;\n}\n\n.helios-ui-row--slider .helios-ui-number {\n  width: 72px;\n  flex-basis: 72px;\n  min-width: 58px;\n  padding: 3px 6px;\n  border-radius: 9px;\n  max-width: 100%;\n}\n\n.helios-ui-number:focus {\n  outline: none;\n  border-color: color-mix(in srgb, var(--helios-ui-accent) 45%, var(--helios-ui-border));\n  box-shadow: 0 0 0 3px var(--helios-ui-focus-ring);\n}\n\n.helios-ui-number:disabled {\n  opacity: 0.55;\n}\n\n.helios-ui-text {\n  width: 100%;\n  min-width: 0;\n  padding: 4px 8px;\n  border-radius: 10px;\n  border: 1px solid var(--helios-ui-border);\n  background: var(--helios-ui-control-bg);\n  color: inherit;\n  font: inherit;\n}\n\n.helios-ui-text:focus {\n  outline: none;\n  border-color: color-mix(in srgb, var(--helios-ui-accent) 45%, var(--helios-ui-border));\n  box-shadow: 0 0 0 3px var(--helios-ui-focus-ring);\n}\n\n.helios-ui-text:disabled {\n  opacity: 0.55;\n}\n\n.helios-ui-categorical-select-bridge {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  min-width: 1px;\n  max-width: 1px;\n  opacity: 0;\n  pointer-events: none;\n}\n\n.helios-ui-categorical-checklist__header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 8px;\n  min-width: 0;\n}\n\n.helios-ui-categorical-checklist__summary {\n  min-width: 0;\n  color: var(--helios-ui-muted);\n  font-size: 11px;\n  line-height: 1.2;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.helios-ui-categorical-checklist__actions {\n  display: inline-flex;\n  align-items: center;\n  gap: 8px;\n  flex: none;\n}\n\n.helios-ui-categorical-checklist {\n  display: grid;\n  gap: 4px;\n  max-height: 156px;\n  overflow: auto;\n  padding: 4px;\n  border-radius: 8px;\n  border: 1px solid var(--helios-ui-border);\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 72%, transparent);\n}\n\n.helios-ui-categorical-checklist__item {\n  display: grid;\n  grid-template-columns: auto minmax(0, 1fr) auto;\n  align-items: center;\n  gap: 7px;\n  min-width: 0;\n  padding: 4px 6px;\n  border-radius: 7px;\n  border: 1px solid transparent;\n  color: color-mix(in srgb, var(--helios-ui-fg) 86%, transparent);\n  cursor: pointer;\n}\n\n.helios-ui-categorical-checklist__item[data-checked=\"true\"] {\n  border-color: color-mix(in srgb, var(--helios-ui-accent) 44%, var(--helios-ui-border));\n  background: color-mix(in srgb, var(--helios-ui-accent) 14%, var(--helios-ui-bg-solid));\n  color: var(--helios-ui-fg);\n}\n\n.helios-ui-categorical-checklist__item input {\n  margin: 0;\n}\n\n.helios-ui-categorical-checklist__label {\n  min-width: 0;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.helios-ui-categorical-checklist__count {\n  color: var(--helios-ui-muted);\n  font-size: 11px;\n  font-variant-numeric: tabular-nums;\n}\n\n.helios-ui-colormap-picker {\n  display: grid;\n  gap: 6px;\n  width: 100%;\n  min-width: 0;\n}\n\n.helios-ui-colormap-thumb {\n  width: 100%;\n  height: 14px;\n  border-radius: 999px;\n  border: 1px solid var(--helios-ui-border);\n  overflow: hidden;\n  background-repeat: no-repeat;\n  background-position: 0 0;\n  background-size: 100% 100%;\n  background-clip: padding-box;\n  background-color: transparent;\n  background-image: linear-gradient(90deg, rgba(120, 120, 120, 1), rgba(40, 40, 40, 1));\n}\n\n.helios-ui-colormap-thumb--small {\n  height: 10px;\n  border-radius: 999px;\n}\n\n.helios-ui-colormap-picker__preview {\n  opacity: 0.95;\n}\n\n.helios-ui-colormap-picker__display {\n  max-width: none;\n  cursor: default;\n  user-select: none;\n}\n\n.helios-ui-colormap-picker {\n  position: relative;\n}\n\n.helios-ui-colormap-picker__preview {\n  cursor: pointer;\n  user-select: none;\n}\n\n.helios-ui-colormap-popover {\n  position: fixed;\n  left: 0;\n  top: 0;\n  z-index: 2147483000;\n  pointer-events: auto;\n}\n\n.helios-ui-colormap-popover__panel {\n  border: 1px solid var(--helios-ui-border);\n  border-radius: 10px;\n  padding: 0;\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 92%, transparent);\n  overflow: hidden;\n  box-shadow: var(--helios-ui-shadow);\n  display: flex;\n  flex-direction: column;\n}\n\n.helios-ui-colormap-popover__header {\n  position: sticky;\n  top: 0;\n  z-index: 2;\n  padding: 8px;\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 96%, transparent);\n  border-bottom: 1px solid color-mix(in srgb, var(--helios-ui-border) 70%, transparent);\n}\n\n.helios-ui-colormap-popover__search {\n  width: 100%;\n}\n\n.helios-ui-colormap-popover__filters {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 6px;\n  margin-top: 7px;\n}\n\n.helios-ui-colormap-popover__filter {\n  appearance: none;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  min-height: 22px;\n  padding: 2px 8px;\n  border-radius: 8px;\n  border: 1px solid var(--helios-ui-border);\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 84%, transparent);\n  color: inherit;\n  font: 600 11px/1.2 var(--helios-ui-font);\n  cursor: pointer;\n  user-select: none;\n}\n\n.helios-ui-colormap-popover__filter[data-active=\"true\"] {\n  border-color: color-mix(in srgb, var(--helios-ui-accent) 58%, var(--helios-ui-border));\n  background: color-mix(in srgb, var(--helios-ui-accent) 18%, var(--helios-ui-bg-solid));\n  color: color-mix(in srgb, var(--helios-ui-accent) 82%, var(--helios-ui-fg));\n}\n\n.helios-ui-colormap-popover__list {\n  padding: 0;\n  overflow: auto;\n  flex: 1 1 auto;\n  min-height: 0;\n}\n\n.helios-ui-colormap-picker__item {\n  appearance: none;\n  width: 100%;\n  display: grid;\n  gap: 5px;\n  padding: 7px 8px;\n  border-radius: 9px;\n  border: 1px solid transparent;\n  background: transparent;\n  color: inherit;\n  font: inherit;\n  cursor: pointer;\n  text-align: left;\n  user-select: none;\n}\n\n.helios-ui-colormap-picker__item:hover {\n  background: color-mix(in srgb, var(--helios-ui-fg) 8%, transparent);\n  border-color: color-mix(in srgb, var(--helios-ui-fg) 14%, transparent);\n}\n\n.helios-ui-colormap-picker__item[data-selected=\"true\"] {\n  background: color-mix(in srgb, var(--helios-ui-accent) 16%, transparent);\n  border-color: color-mix(in srgb, var(--helios-ui-accent) 42%, var(--helios-ui-border));\n}\n\n.helios-ui-colormap-picker__item:focus-visible {\n  outline: none;\n  box-shadow: 0 0 0 4px color-mix(in srgb, var(--helios-ui-accent) 22%, transparent);\n}\n\n.helios-ui-colormap-picker__item-title {\n  font-weight: 600;\n}\n\n.helios-ui-colormap-section {\n  display: grid;\n  gap: 6px;\n  padding: 0 0 6px;\n}\n\n.helios-ui-colormap-section + .helios-ui-colormap-section {\n  border-top: 1px solid color-mix(in srgb, var(--helios-ui-border) 70%, transparent);\n}\n\n.helios-ui-colormap-section__title {\n  position: sticky;\n  top: 0;\n  z-index: 1;\n  padding: 4px 8px 4px;\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 96%, transparent);\n  font: 700 10.5px/1.2 var(--helios-ui-font);\n  color: var(--helios-ui-muted);\n  text-transform: uppercase;\n  letter-spacing: 0.5px;\n  user-select: none;\n}\n\n.helios-ui-colormap-section__body {\n  display: grid;\n  gap: 2px;\n  padding: 0 4px;\n}\n\n.helios-ui-colormap-picker__note {\n  padding: 6px 6px 4px;\n  color: var(--helios-ui-muted);\n  font-size: 11px;\n}\n\n.helios-ui-progress {\n  width: 100%;\n  height: 10px;\n  border-radius: 999px;\n  overflow: hidden;\n  background: color-mix(in srgb, var(--helios-ui-fg) 10%, transparent);\n  border: 1px solid var(--helios-ui-border);\n}\n\n.helios-ui-progress::-webkit-progress-bar {\n  background: color-mix(in srgb, var(--helios-ui-fg) 10%, transparent);\n}\n\n.helios-ui-progress::-webkit-progress-value {\n  background: color-mix(in srgb, var(--helios-ui-accent) 92%, transparent);\n}\n\n.helios-ui-progress::-moz-progress-bar {\n  background: color-mix(in srgb, var(--helios-ui-accent) 92%, transparent);\n}\n\n.helios-ui-slider-controls {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) auto;\n  gap: 8px;\n  align-items: center;\n  width: 100%;\n  min-width: 0;\n}\n\n.helios-ui-slider {\n  width: 100%;\n  --pct: 0;\n  --helios-ui-slider-track: color-mix(in srgb, var(--helios-ui-fg) 12%, transparent);\n  --helios-ui-slider-fill: color-mix(in srgb, var(--helios-ui-accent) 92%, transparent);\n  --helios-ui-slider-track-h: 6px;\n  --helios-ui-slider-thumb: 16px;\n\n  appearance: none;\n  -webkit-appearance: none;\n  background: transparent;\n  height: 18px;\n  cursor: pointer;\n  min-width: 0;\n}\n\n.helios-ui-row__controls {\n  display: flex;\n  justify-content: flex-end;\n  min-width: 0;\n  width: 100%;\n}\n\n.helios-ui-slider::-webkit-slider-runnable-track {\n  height: var(--helios-ui-slider-track-h);\n  border-radius: 999px;\n  border: 0;\n  box-shadow: inset 0 0 0 1px var(--helios-ui-border);\n  background-color: var(--helios-ui-slider-track);\n  background-image: linear-gradient(90deg, var(--helios-ui-slider-fill), var(--helios-ui-slider-fill));\n  background-size: calc(var(--pct) * 1%) 100%;\n  background-repeat: no-repeat;\n  background-clip: padding-box;\n}\n\n.helios-ui-slider::-webkit-slider-thumb {\n  -webkit-appearance: none;\n  appearance: none;\n  width: var(--helios-ui-slider-thumb);\n  height: var(--helios-ui-slider-thumb);\n  margin-top: calc((var(--helios-ui-slider-thumb) - var(--helios-ui-slider-track-h)) / -2);\n  border-radius: 999px;\n  border: 1px solid color-mix(in srgb, var(--helios-ui-accent) 55%, var(--helios-ui-border));\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 86%, var(--helios-ui-accent) 14%);\n  box-shadow:\n    0 1px 0 rgba(0, 0, 0, 0.18),\n    0 8px 20px rgba(0, 0, 0, 0.18);\n}\n\n.helios-ui-slider:active::-webkit-slider-thumb {\n  transform: scale(1.05);\n}\n\n.helios-ui-slider::-moz-range-track {\n  height: var(--helios-ui-slider-track-h);\n  border-radius: 999px;\n  border: 0;\n  box-shadow: inset 0 0 0 1px var(--helios-ui-border);\n  background: var(--helios-ui-slider-track);\n}\n\n.helios-ui-slider::-moz-range-progress {\n  height: var(--helios-ui-slider-track-h);\n  border-radius: 999px;\n  background: var(--helios-ui-slider-fill);\n}\n\n.helios-ui-slider::-moz-range-thumb {\n  width: var(--helios-ui-slider-thumb);\n  height: var(--helios-ui-slider-thumb);\n  border-radius: 999px;\n  border: 1px solid color-mix(in srgb, var(--helios-ui-accent) 55%, var(--helios-ui-border));\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 86%, var(--helios-ui-accent) 14%);\n  box-shadow:\n    0 1px 0 rgba(0, 0, 0, 0.18),\n    0 8px 20px rgba(0, 0, 0, 0.18);\n}\n\n.helios-ui-slider:focus-visible {\n  outline: none;\n}\n\n.helios-ui-slider:focus-visible::-webkit-slider-thumb {\n  box-shadow:\n    0 0 0 4px color-mix(in srgb, var(--helios-ui-accent) 22%, transparent),\n    0 1px 0 rgba(0, 0, 0, 0.18),\n    0 8px 20px rgba(0, 0, 0, 0.18);\n}\n\n.helios-ui-slider:focus-visible::-moz-range-thumb {\n  box-shadow:\n    0 0 0 4px color-mix(in srgb, var(--helios-ui-accent) 22%, transparent),\n    0 1px 0 rgba(0, 0, 0, 0.18),\n    0 8px 20px rgba(0, 0, 0, 0.18);\n}\n\n.helios-ui-slider:disabled {\n  opacity: 0.55;\n  cursor: default;\n}\n\n.helios-ui-light-direction {\n  display: grid;\n  grid-template-columns: 76px minmax(0, 1fr);\n  gap: 8px;\n  align-items: center;\n  width: min(164px, 100%);\n  min-width: 0;\n}\n\n.helios-ui-light-direction__pad {\n  appearance: none;\n  width: 76px;\n  height: 76px;\n  padding: 0;\n  border: 1px solid var(--helios-ui-border);\n  border-radius: 8px;\n  background:\n    radial-gradient(circle at 34% 28%, color-mix(in srgb, var(--helios-ui-fg) 18%, transparent), transparent 26%),\n    radial-gradient(circle at 50% 50%, color-mix(in srgb, var(--helios-ui-accent) 18%, var(--helios-ui-bg-solid)) 0, color-mix(in srgb, var(--helios-ui-bg-solid) 86%, transparent) 62%, color-mix(in srgb, var(--helios-ui-fg) 8%, transparent) 100%);\n  color: inherit;\n  cursor: crosshair;\n  touch-action: none;\n}\n\n.helios-ui-light-direction__pad:disabled {\n  opacity: 0.55;\n  cursor: default;\n}\n\n.helios-ui-light-direction__pad:focus-visible {\n  outline: none;\n  box-shadow: 0 0 0 4px color-mix(in srgb, var(--helios-ui-accent) 22%, transparent);\n}\n\n.helios-ui-light-direction__sphere {\n  display: block;\n  width: 100%;\n  height: 100%;\n  overflow: visible;\n}\n\n.helios-ui-light-direction__outline,\n.helios-ui-light-direction__latitude {\n  fill: none;\n  stroke: color-mix(in srgb, var(--helios-ui-fg) 28%, transparent);\n  stroke-width: 1.2;\n}\n\n.helios-ui-light-direction__latitude {\n  stroke: color-mix(in srgb, var(--helios-ui-fg) 16%, transparent);\n}\n\n.helios-ui-light-direction__ray {\n  stroke: color-mix(in srgb, var(--helios-ui-accent) 86%, var(--helios-ui-fg));\n  stroke-width: 2;\n  stroke-linecap: round;\n  stroke-dasharray: 4 4;\n}\n\n.helios-ui-light-direction--axis .helios-ui-light-direction__ray {\n  stroke-dasharray: none;\n}\n\n.helios-ui-light-direction__center {\n  fill: color-mix(in srgb, var(--helios-ui-fg) 78%, transparent);\n}\n\n.helios-ui-light-direction--axis .helios-ui-light-direction__center {\n  fill: color-mix(in srgb, var(--helios-ui-accent) 70%, var(--helios-ui-fg));\n}\n\n.helios-ui-light-direction__handle {\n  fill: color-mix(in srgb, var(--helios-ui-accent) 92%, var(--helios-ui-bg-solid));\n  stroke: color-mix(in srgb, var(--helios-ui-accent) 40%, var(--helios-ui-fg));\n  stroke-width: 1.5;\n}\n\n.helios-ui-light-direction__axis-arrow {\n  display: none;\n  fill: color-mix(in srgb, var(--helios-ui-accent) 92%, var(--helios-ui-bg-solid));\n  stroke: color-mix(in srgb, var(--helios-ui-accent) 40%, var(--helios-ui-fg));\n  stroke-width: 1.2;\n  stroke-linejoin: round;\n}\n\n.helios-ui-light-direction--axis .helios-ui-light-direction__axis-arrow {\n  display: block;\n}\n\n.helios-ui-light-direction__handle-group--back {\n  display: none;\n}\n\n.helios-ui-light-direction--axis .helios-ui-light-direction__handle-group--back {\n  display: block;\n}\n\n.helios-ui-light-direction__handle-group[data-back=\"true\"] .helios-ui-light-direction__handle,\n.helios-ui-light-direction__pad[data-back=\"true\"] .helios-ui-light-direction__ray {\n  opacity: 0.62;\n}\n\n.helios-ui-light-direction--axis .helios-ui-light-direction__pad[data-back=\"true\"] .helios-ui-light-direction__ray {\n  opacity: 1;\n}\n\n.helios-ui-light-direction__fields {\n  display: grid;\n  gap: 3px;\n  min-width: 0;\n}\n\n.helios-ui-light-direction__fields .helios-ui-number {\n  width: 68px;\n  min-width: 0;\n  padding: 2px 4px;\n  border-radius: 8px;\n  font-size: 11px;\n}\n\n.helios-ui-color-swatch {\n  position: relative;\n  display: inline-block;\n  width: 34px;\n  height: 22px;\n  border-radius: 8px;\n  border: 1px solid var(--helios-ui-border);\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 85%, transparent);\n  padding: 0;\n  cursor: pointer;\n}\n\n.helios-ui-color-swatch:focus-within {\n  outline: none;\n  box-shadow: 0 0 0 4px color-mix(in srgb, var(--helios-ui-accent) 22%, transparent);\n}\n\n.helios-ui-color-swatch__swatch {\n  position: absolute;\n  inset: 0;\n  border-radius: inherit;\n  background: var(--helios-ui-muted);\n}\n\n.helios-ui-color-swatch__input {\n  position: absolute;\n  inset: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  margin: 0;\n  padding: 0;\n  border: 0;\n  cursor: pointer;\n}\n\n.helios-ui-range2 {\n  width: 100%;\n  display: grid;\n  gap: 2px;\n  min-width: 0;\n}\n\n.helios-ui-range2__track {\n  position: relative;\n  width: 100%;\n  height: 18px;\n  display: flex;\n  align-items: center;\n  --min-pct: 0;\n  --max-pct: 100;\n  --helios-ui-slider-track-h: 6px;\n}\n\n.helios-ui-range2__bar {\n  position: absolute;\n  left: 0;\n  right: 0;\n  height: var(--helios-ui-slider-track-h);\n  border-radius: 999px;\n  box-shadow: inset 0 0 0 1px var(--helios-ui-border);\n  background: color-mix(in srgb, var(--helios-ui-fg) 12%, transparent);\n}\n\n.helios-ui-range2__range {\n  position: absolute;\n  height: var(--helios-ui-slider-track-h);\n  border-radius: 999px;\n  left: calc(var(--min-pct) * 1%);\n  right: calc(100% - (var(--max-pct) * 1%));\n  background: color-mix(in srgb, var(--helios-ui-accent) 92%, transparent);\n  cursor: grab;\n  touch-action: none;\n}\n\n.helios-ui-range2__range:active {\n  cursor: grabbing;\n}\n\n.helios-ui-range2__input {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  margin: 0;\n  /* Two overlaid range inputs: allow interaction only via the thumbs. */\n  pointer-events: none;\n}\n\n.helios-ui-range2__input::-webkit-slider-thumb {\n  pointer-events: all;\n}\n\n.helios-ui-range2__input::-moz-range-thumb {\n  pointer-events: all;\n}\n\n.helios-ui-range2__input::-webkit-slider-runnable-track {\n  background: transparent;\n  box-shadow: none;\n}\n\n.helios-ui-range2__input::-moz-range-track {\n  background: transparent;\n  box-shadow: none;\n}\n\n.helios-ui-range2__input::-moz-range-progress {\n  background: transparent;\n}\n\n.helios-ui-range2__values {\n  display: flex;\n  justify-content: space-between;\n  gap: 16px;\n  align-items: center;\n  width: 100%;\n}\n\n.helios-ui-range2__values .helios-ui-number {\n  flex: 0 1 min(132px, calc(50% - 8px));\n  width: min(132px, calc(50% - 8px));\n  max-width: 132px;\n}\n\n.helios-ui-range2__values .helios-ui-number:last-child {\n  text-align: right;\n}\n\n@container (max-width: 280px) {\n  .helios-ui-row--aligned {\n    grid-template-columns: minmax(0, 1fr);\n  }\n\n  .helios-ui-label {\n    justify-items: start;\n    text-align: left;\n  }\n\n  .helios-ui-label__title-row {\n    justify-content: flex-start;\n  }\n\n  .helios-ui-row__controls {\n    justify-content: stretch;\n  }\n}\n\n.helios-ui-range2__histogram {\n  position: relative;\n  width: 100%;\n  height: 26px;\n  display: grid;\n  grid-auto-flow: column;\n  grid-auto-columns: 1fr;\n  gap: 2px;\n  align-items: end;\n  box-sizing: border-box;\n  overflow: visible;\n  --helios-ui-range2-thumb: var(--helios-ui-slider-thumb, 12px);\n  --helios-ui-range2-marker-w: 2px;\n  padding: 2px calc(var(--helios-ui-range2-thumb) / 2);\n  border-radius: 6px;\n  background: color-mix(in srgb, var(--helios-ui-fg) 6%, transparent);\n}\n\n.helios-ui-range2__histogram-bin {\n  width: 100%;\n  border-radius: 4px 4px 2px 2px;\n  background: color-mix(in srgb, var(--helios-ui-fg) 32%, transparent);\n  opacity: 0.9;\n}\n\n.helios-ui-range2__histogram-marker {\n  position: absolute;\n  top: 2px;\n  bottom: 2px;\n  width: var(--helios-ui-range2-marker-w);\n  border-radius: 999px;\n  background: color-mix(in srgb, var(--helios-ui-accent) 92%, transparent);\n  box-shadow: 0 0 0 1px color-mix(in srgb, var(--helios-ui-border) 60%, transparent);\n  pointer-events: none;\n  transform: translateX(calc(var(--helios-ui-range2-marker-w) / -2));\n}\n\n.helios-ui-dock {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  display: flex;\n  flex-direction: column;\n  gap: 0;\n  padding: 0;\n  overflow: hidden;\n  max-height: 100%;\n}\n\n.helios-ui-dock--side {\n  overflow-y: auto;\n  overflow-x: hidden;\n  min-height: 0;\n  pointer-events: auto;\n  overscroll-behavior: contain;\n  -webkit-overflow-scrolling: touch;\n  touch-action: pan-y;\n}\n\n.helios-ui[data-interface-mode=\"compact\"] .helios-ui-dock--side {\n  width: auto;\n  max-width: none;\n  padding-top: 0;\n  background: var(--helios-ui-dock-fill);\n  scrollbar-gutter: stable;\n}\n\n.helios-ui-dock--left { left: 0; padding-left: 0; }\n.helios-ui-dock--right { right: 0; align-items: flex-end; padding-right: 0; }\n\n.helios-ui-dock .helios-ui-panel {\n  position: relative;\n  max-height: none;\n  flex: 0 0 auto;\n}\n\n.helios-ui-panel[data-responsive-mode=\"compact\"],\n.helios-ui-panel[data-responsive-mode=\"fullscreen\"] {\n  min-width: 0 !important;\n  max-width: none !important;\n}\n\n.helios-ui-panel[data-responsive-mode=\"fullscreen\"] {\n  width: 100% !important;\n  min-height: fit-content;\n}\n\n.helios-ui-panel[data-responsive-mode=\"compact\"] .helios-ui-panel__header,\n.helios-ui-panel[data-responsive-mode=\"fullscreen\"] .helios-ui-panel__header {\n  cursor: default;\n}\n\n.helios-ui-panel[data-responsive-mode=\"fullscreen\"] .helios-ui-resize-handle {\n  display: none;\n}\n\n.helios-ui-panel[data-responsive-mode=\"fullscreen\"] .helios-ui-panel__body {\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n.helios-ui-panel[data-responsive-mode=\"compact\"] .helios-ui-panel__body,\n.helios-ui-panel[data-responsive-mode=\"compact\"] .helios-ui-panel__header,\n.helios-ui-panel[data-responsive-mode=\"fullscreen\"] .helios-ui-panel__header,\n.helios-ui-panel[data-responsive-mode=\"fullscreen\"] .helios-ui-panel__body,\n.helios-ui-panel[data-responsive-mode=\"fullscreen\"] .helios-ui-row,\n.helios-ui-panel[data-responsive-mode=\"fullscreen\"] .helios-ui-layout__actions,\n.helios-ui-panel[data-responsive-mode=\"fullscreen\"] .helios-ui-network__actions,\n.helios-ui-panel[data-responsive-mode=\"fullscreen\"] .helios-ui-subpanel,\n.helios-ui-panel[data-responsive-mode=\"fullscreen\"] .helios-ui-subpanel__header,\n.helios-ui-panel[data-responsive-mode=\"fullscreen\"] .helios-ui-subpanel__body,\n.helios-ui-panel[data-responsive-mode=\"fullscreen\"] .helios-ui-tabs__bar,\n.helios-ui-panel[data-responsive-mode=\"fullscreen\"] .helios-ui-tabs__content,\n.helios-ui-panel[data-responsive-mode=\"fullscreen\"] .helios-ui-tabpanel,\n.helios-ui-panel[data-responsive-mode=\"fullscreen\"] .helios-ui-stack {\n  transition:\n    opacity 180ms ease,\n    background-color 180ms ease,\n    border-color 180ms ease,\n    box-shadow 180ms ease,\n    backdrop-filter 180ms ease;\n}\n\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-panel__header,\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-panel__body,\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-subpanel,\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-subpanel__body,\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-tabs__bar,\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-tabs__content,\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-tabpanel,\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-stack {\n  background: transparent !important;\n  -webkit-backdrop-filter: none !important;\n  backdrop-filter: none !important;\n  box-shadow: none !important;\n}\n\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-panel:has([data-control-focus-active=\"true\"]) .helios-ui-panel__header,\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-panel:has([data-control-focus-active=\"true\"]) .helios-ui-panel__body,\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-panel:has([data-control-focus-active=\"true\"]) .helios-ui-subpanel,\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-panel:has([data-control-focus-active=\"true\"]) .helios-ui-subpanel__body,\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-panel:has([data-control-focus-active=\"true\"]) .helios-ui-tabs__bar,\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-panel:has([data-control-focus-active=\"true\"]) .helios-ui-tabs__content,\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-panel:has([data-control-focus-active=\"true\"]) .helios-ui-tabpanel,\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-panel:has([data-control-focus-active=\"true\"]) .helios-ui-stack {\n  border-color: transparent !important;\n  box-shadow: none !important;\n  background: transparent !important;\n}\n\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] .helios-ui-fullscreen-flow > .helios-ui-panel[data-interface-visible=\"true\"]:has([data-control-focus-active=\"true\"]) *:not(\n  :has([data-control-focus-active=\"true\"]),\n  [data-control-focus-active=\"true\"],\n  [data-control-focus-active=\"true\"] *\n) {\n  opacity: 0.02 !important;\n  border-color: transparent !important;\n  box-shadow: none !important;\n  background: transparent !important;\n}\n\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] [data-control-focus-active=\"true\"] {\n  opacity: 1 !important;\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 58%, transparent) !important;\n  border-radius: 10px;\n  -webkit-backdrop-filter: blur(10px) saturate(1.05);\n  backdrop-filter: blur(10px) saturate(1.05);\n  box-shadow:\n    inset 0 0 0 1px color-mix(in srgb, var(--helios-ui-accent) 20%, transparent),\n    0 8px 24px color-mix(in srgb, black 18%, transparent);\n}\n\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] [data-control-focus-active=\"true\"],\n.helios-ui[data-interface-mode=\"fullscreen\"][data-focused-control=\"true\"][data-focused-control-scope=\"row\"] [data-control-focus-active=\"true\"] * {\n  opacity: 1 !important;\n}\n\n.helios-ui-panel[data-side-docked=\"true\"] .helios-ui-panel__body {\n  overflow: visible;\n}\n\n.helios-ui-panel[data-side-docked=\"true\"] .helios-ui-panel__header {\n  cursor: grab;\n}\n\n.helios-ui--dock-reordering,\n.helios-ui--dock-reordering * {\n  cursor: grabbing !important;\n}\n\n.helios-ui-panel--dock-source {\n  opacity: 0.46;\n}\n\n.helios-ui-dock-drop-line {\n  position: relative;\n  z-index: 4;\n  align-self: stretch;\n  height: 6px;\n  margin: 6px 8px;\n  border-radius: 999px;\n  border: 1px solid rgba(32, 32, 32, 0.38);\n  background: rgba(176, 176, 176, 0.96);\n  box-shadow:\n    0 0 0 1px rgba(255, 255, 255, 0.26),\n    0 0 12px rgba(0, 0, 0, 0.32);\n  flex: 0 0 auto;\n  pointer-events: none;\n}\n\n.helios-ui-dock-drag-preview {\n  position: absolute;\n  left: 0;\n  top: 0;\n  pointer-events: none;\n  z-index: calc(var(--helios-ui-z) + 250);\n  border-radius: 10px;\n  border: 1px solid color-mix(in srgb, var(--helios-ui-fg) 20%, transparent);\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 92%, transparent);\n  box-shadow:\n    0 9px 24px rgba(0, 0, 0, 0.28),\n    0 0 0 1px color-mix(in srgb, var(--helios-ui-accent) 28%, transparent);\n  overflow: hidden;\n}\n\n.helios-ui-dock-drag-preview__header {\n  display: flex;\n  align-items: center;\n  min-height: 28px;\n  padding: 6px 10px;\n  border-bottom: 1px solid color-mix(in srgb, var(--helios-ui-border) 75%, transparent);\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 95%, transparent);\n}\n\n.helios-ui-dock-drag-preview__title {\n  font-weight: 600;\n  font-size: 12px;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.helios-ui-tabs {\n  display: grid;\n  gap: 8px;\n}\n\n.helios-ui-tabs__bar {\n  display: flex;\n  gap: 6px;\n  justify-content: space-between;\n  align-items: center;\n  min-width: 0;\n}\n\n.helios-ui-tabs__bar-left {\n  display: flex;\n  gap: 6px;\n  flex-wrap: wrap;\n  align-items: center;\n  min-width: 0;\n}\n\n.helios-ui-tabs__bar-right {\n  display: flex;\n  gap: 6px;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: flex-end;\n}\n\n.helios-ui-tab {\n  appearance: none;\n  border: 1px solid var(--helios-ui-border);\n  border-radius: 10px;\n  padding: 5px 8px;\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 85%, transparent);\n  color: inherit;\n  font: inherit;\n  line-height: 1;\n}\n\n.helios-ui-tab[data-active=\"true\"] {\n  border-color: color-mix(in srgb, var(--helios-ui-accent) 55%, var(--helios-ui-border));\n}\n\n.helios-ui-panel__body > .helios-ui-tabs--panel {\n  margin: -6px;\n}\n\n.helios-ui-tabs--panel {\n  display: flex;\n  flex-direction: column;\n  gap: 0;\n}\n\n.helios-ui-tabs--panel .helios-ui-tabs__bar {\n  padding: 0 6px;\n  gap: 10px;\n  border-bottom: 1px solid color-mix(in srgb, var(--helios-ui-border) 75%, transparent);\n}\n\n.helios-ui-tabs--panel .helios-ui-tabs__bar-left {\n  gap: 0;\n}\n\n.helios-ui-tabs--panel .helios-ui-tab {\n  border: 0;\n  border-radius: 0;\n  padding: 9px 10px 7px;\n  background: transparent;\n  color: var(--helios-ui-muted);\n  border-bottom: 2px solid transparent;\n}\n\n.helios-ui-tabs--panel .helios-ui-tab:hover {\n  color: inherit;\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 82%, transparent);\n}\n\n.helios-ui-tabs--panel .helios-ui-tab[data-active=\"true\"] {\n  border-bottom-color: color-mix(in srgb, var(--helios-ui-accent) 72%, var(--helios-ui-border));\n  color: inherit;\n}\n\n.helios-ui-tabs--panel .helios-ui-tabs__content {\n  padding: 6px;\n}\n\n.helios-ui-tabpanel { display: none; }\n.helios-ui-tabpanel[data-active=\"true\"] { display: block; }\n\n.helios-ui-stack {\n  display: grid;\n  gap: 6px;\n}\n\n.helios-ui-subpanel {\n  border: 1px solid color-mix(in srgb, var(--helios-ui-border) 85%, transparent);\n  border-radius: 10px;\n  overflow: hidden;\n  background: color-mix(in srgb, var(--helios-ui-bg-solid) 60%, transparent);\n}\n\n.helios-ui-subpanel__header-row {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n}\n\n.helios-ui-subpanel__header {\n  width: auto;\n  flex: 1 1 auto;\n  min-width: 0;\n  text-align: left;\n  appearance: none;\n  border: 0;\n  background: transparent;\n  color: inherit;\n  font: inherit;\n  font-weight: 600;\n  padding: 8px 8px 6px;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  gap: 6px;\n}\n\n.helios-ui-subpanel__header-controls {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  padding-right: 8px;\n}\n\n.helios-ui-subpanel__header-controls .helios-ui-button {\n  padding: 3px 6px;\n}\n\n.helios-ui-subpanel__toggle {\n  width: 1.1em;\n  color: var(--helios-ui-muted);\n  font-weight: 700;\n  display: inline-block;\n}\n\n.helios-ui-subpanel__status {\n  width: 8px;\n  height: 8px;\n  border-radius: 999px;\n  display: inline-block;\n  box-shadow: 0 0 0 1px color-mix(in srgb, var(--helios-ui-fg) 14%, transparent);\n}\n\n.helios-ui-subpanel__status[hidden] {\n  display: none !important;\n}\n\n.helios-ui-subpanel__status[data-state=\"idle\"] {\n  background: transparent;\n  box-shadow: 0 0 0 1px color-mix(in srgb, var(--helios-ui-muted) 58%, transparent);\n}\n\n.helios-ui-subpanel__status[data-state=\"running\"] {\n  background: var(--helios-ui-status-running);\n}\n\n.helios-ui-subpanel__status[data-state=\"success\"] {\n  background: var(--helios-ui-status-success);\n}\n\n.helios-ui-subpanel__status[data-state=\"error\"] {\n  background: var(--helios-ui-status-error);\n}\n\n.helios-ui-subpanel__body {\n  padding: 6px;\n  border-top: 1px solid color-mix(in srgb, var(--helios-ui-border) 65%, transparent);\n}\n\n.helios-ui-figure-preview {\n  display: grid;\n  gap: 8px;\n}\n\n.helios-ui-figure-preview__viewport {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  min-height: 132px;\n  border: 1px solid color-mix(in srgb, var(--helios-ui-border) 85%, transparent);\n  border-radius: 10px;\n  overflow: hidden;\n  background:\n    linear-gradient(45deg, color-mix(in srgb, var(--helios-ui-fg) 5%, transparent) 25%, transparent 25%, transparent 75%, color-mix(in srgb, var(--helios-ui-fg) 5%, transparent) 75%),\n    linear-gradient(45deg, color-mix(in srgb, var(--helios-ui-fg) 5%, transparent) 25%, transparent 25%, transparent 75%, color-mix(in srgb, var(--helios-ui-fg) 5%, transparent) 75%),\n    color-mix(in srgb, var(--helios-ui-bg-solid) 84%, transparent);\n  background-position: 0 0, 10px 10px, 0 0;\n  background-size: 20px 20px, 20px 20px, auto;\n}\n\n.helios-ui-figure-preview__image {\n  display: block;\n  max-width: 100%;\n  width: 100%;\n  height: auto;\n  object-fit: contain;\n}\n\n.helios-ui-figure-preview__status {\n  color: var(--helios-ui-muted);\n  font-size: 11.5px;\n  line-height: 1.45;\n  text-align: right;\n}\n\n.helios-ui-debug-panel {\n  display: grid;\n  gap: 8px;\n  padding: 2px 0;\n}\n\n.helios-ui-debug-panel__row {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) auto;\n  align-items: baseline;\n  gap: 12px;\n  min-height: 24px;\n  font-size: 12px;\n}\n\n.helios-ui-debug-panel__label {\n  min-width: 0;\n  color: var(--helios-ui-muted);\n}\n\n.helios-ui-debug-panel__value {\n  font-variant-numeric: tabular-nums;\n  color: var(--helios-ui-fg);\n}\n\n.helios-ui-debug-panel__meta {\n  padding-top: 4px;\n  border-top: 1px solid color-mix(in srgb, var(--helios-ui-border) 65%, transparent);\n  color: var(--helios-ui-muted);\n  font-size: 11px;\n  line-height: 1.4;\n}\n\n.helios-ui-subpanel[data-collapsed=\"true\"] .helios-ui-subpanel__body { display: none; }\n`;\n\n/**\n * Ensure the default Helios UI stylesheet is present in a document.\n *\n * @public\n * @apiSection User Interface\n * @param {Document} [doc=document] - Target document.\n * @returns {HTMLStyleElement|null} Existing or inserted stylesheet element.\n */\nexport function ensureDefaultStyles(doc = document) {\n  if (!doc || doc.getElementById(DEFAULT_STYLE_ELEMENT_ID)) return;\n  const style = doc.createElement('style');\n  style.id = DEFAULT_STYLE_ELEMENT_ID;\n  style.textContent = defaultStylesText;\n  doc.head.appendChild(style);\n}\n","export const DEFAULT_UI_SLIDER_FPS = 30;\n\nfunction nowMs() {\n  if (typeof performance !== 'undefined' && typeof performance.now === 'function') return performance.now();\n  return Date.now();\n}\n\nexport function createFpsThrottle(callback, fps = DEFAULT_UI_SLIDER_FPS) {\n  const safeCallback = typeof callback === 'function' ? callback : () => {};\n  const intervalMs = Number.isFinite(fps) && fps > 0 ? 1000 / fps : 0;\n\n  let timeoutId = null;\n  let lastInvokeTime = -Infinity;\n  let pendingArgs = null;\n  let pendingThis = null;\n\n  const clearScheduled = () => {\n    if (timeoutId == null) return;\n    globalThis.clearTimeout(timeoutId);\n    timeoutId = null;\n  };\n\n  const invokePending = () => {\n    if (!pendingArgs) return;\n    const args = pendingArgs;\n    const context = pendingThis;\n    pendingArgs = null;\n    pendingThis = null;\n    lastInvokeTime = nowMs();\n    safeCallback.apply(context, args);\n  };\n\n  const schedulePending = () => {\n    if (timeoutId != null || !pendingArgs || intervalMs <= 0) return;\n    const remainingMs = Math.max(0, intervalMs - (nowMs() - lastInvokeTime));\n    timeoutId = globalThis.setTimeout(() => {\n      timeoutId = null;\n      invokePending();\n      if (pendingArgs) schedulePending();\n    }, remainingMs);\n  };\n\n  function throttled(...args) {\n    pendingArgs = args;\n    pendingThis = this;\n\n    if (intervalMs <= 0) {\n      clearScheduled();\n      invokePending();\n      return;\n    }\n\n    if (timeoutId == null && (nowMs() - lastInvokeTime) >= intervalMs) {\n      invokePending();\n      return;\n    }\n\n    schedulePending();\n  }\n\n  throttled.flush = () => {\n    clearScheduled();\n    invokePending();\n  };\n\n  throttled.cancel = () => {\n    clearScheduled();\n    pendingArgs = null;\n    pendingThis = null;\n  };\n\n  return throttled;\n}\n\nexport default createFpsThrottle;\n","import { createFpsThrottle } from './createFpsThrottle.js';\n\nfunction createDefaultPersistenceIndicator() {\n  const indicator = document.createElement('span');\n  indicator.className = 'helios-ui-dirty-indicator helios-ui-dirty-indicator--static';\n  indicator.dataset.state = 'default';\n  indicator.setAttribute('aria-hidden', 'true');\n  indicator.destroy = () => {};\n  return indicator;\n}\n\nfunction formatNumber(value, precision = 3) {\n  const v = Number(value);\n  if (!Number.isFinite(v)) return String(value);\n  const abs = Math.abs(v);\n  if (abs >= 1000) return v.toFixed(0);\n  if (abs >= 100) return v.toFixed(1);\n  if (abs >= 10) return v.toFixed(2);\n  return v.toFixed(precision);\n}\n\nfunction clampToRange(value, range) {\n  let v = Number(value);\n  if (!Number.isFinite(v)) return null;\n  if (!range) return v;\n  const min = range.min;\n  const max = range.max;\n  if (min != null) {\n    const minNumber = Number(min);\n    if (Number.isFinite(minNumber)) v = Math.max(minNumber, v);\n  }\n  if (max != null) {\n    const maxNumber = Number(max);\n    if (Number.isFinite(maxNumber)) v = Math.min(maxNumber, v);\n  }\n  return v;\n}\n\nexport function createSliderRow(attribute, options = {}) {\n  const title = options.title ?? attribute.label ?? attribute.id;\n  const hint = options.hint ?? null;\n  const fallbackRange = {\n    min: attribute.min ?? 0,\n    max: attribute.max ?? 1,\n  };\n  const sliderRange = attribute.recommendedRange ?? attribute.domain ?? fallbackRange;\n  const inputMin = Object.prototype.hasOwnProperty.call(attribute.meta ?? {}, 'inputMin')\n    ? Number(attribute.meta?.inputMin)\n    : (attribute.domain?.min ?? sliderRange.min);\n  const inputMaxOverride = Object.prototype.hasOwnProperty.call(attribute.meta ?? {}, 'inputMax')\n    ? attribute.meta?.inputMax\n    : null;\n  const inputMax = inputMaxOverride === null\n    ? null\n    : (inputMaxOverride != null ? Number(inputMaxOverride) : (attribute.domain?.max ?? sliderRange.max));\n  const inputRange =\n    (Number.isFinite(inputMin) || Number.isFinite(inputMax))\n      ? { min: inputMin, max: inputMax }\n      : null;\n  const step = options.step ?? attribute.step ?? 0.01;\n\n  const row = document.createElement('div');\n  row.className = 'helios-ui-row helios-ui-row--aligned helios-ui-row--slider';\n\n  const label = document.createElement('div');\n  label.className = 'helios-ui-label';\n  const labelTitle = document.createElement('div');\n  labelTitle.className = 'helios-ui-label__title-row';\n  const labelTitleText = document.createElement('div');\n  labelTitleText.className = 'helios-ui-label__title';\n  labelTitleText.textContent = title;\n  labelTitle.appendChild(labelTitleText);\n  const dirtyIndicator = options.dirtyIndicator === undefined\n    ? createDefaultPersistenceIndicator()\n    : options.dirtyIndicator;\n  if (dirtyIndicator) labelTitle.appendChild(dirtyIndicator);\n\n  let tooltip = null;\n  let tooltipRoot = null;\n  let hideTooltipTimer = null;\n  let removeTooltipListeners = null;\n\n  const setTooltipHidden = (hidden) => {\n    if (!tooltip) return;\n    tooltip.dataset.open = hidden ? 'false' : 'true';\n    tooltip.hidden = hidden;\n  };\n\n  const resolveTooltipRoot = () => row.closest?.('.helios-ui') ?? row.ownerDocument?.body ?? document.body;\n\n  const placeTooltip = () => {\n    if (!tooltip) return;\n    const anchor = tooltip.dataset.anchorId ? row.ownerDocument?.getElementById?.(tooltip.dataset.anchorId) : null;\n    const el = anchor ?? null;\n    if (!el) return;\n\n    const margin = 8;\n    const rect = el.getBoundingClientRect();\n    const { innerWidth: vw, innerHeight: vh } = window;\n\n    tooltip.style.left = '0px';\n    tooltip.style.top = '0px';\n    tooltip.style.transform = 'translate(-9999px, -9999px)';\n    const tipRect = tooltip.getBoundingClientRect();\n\n    const preferredLeft = rect.left + rect.width / 2 - tipRect.width / 2;\n    const left = Math.max(margin, Math.min(vw - margin - tipRect.width, preferredLeft));\n\n    const preferredTop = rect.top - 8 - tipRect.height;\n    const fallbackTop = rect.bottom + 8;\n    const top = preferredTop >= margin ? preferredTop : Math.min(vh - margin - tipRect.height, fallbackTop);\n\n    tooltip.style.left = `${left}px`;\n    tooltip.style.top = `${top}px`;\n    tooltip.style.transform = 'translate(0, 0)';\n  };\n\n  const scheduleHideTooltip = () => {\n    if (hideTooltipTimer != null) window.clearTimeout(hideTooltipTimer);\n    hideTooltipTimer = window.setTimeout(() => setTooltipHidden(true), 120);\n  };\n\n  const showTooltip = () => {\n    if (!tooltip) return;\n    if (hideTooltipTimer != null) window.clearTimeout(hideTooltipTimer);\n    if (!tooltipRoot) {\n      tooltipRoot = resolveTooltipRoot();\n      tooltipRoot.appendChild(tooltip);\n    }\n    setTooltipHidden(false);\n    placeTooltip();\n  };\n\n  if (hint) {\n    tooltip = document.createElement('div');\n    tooltip.className = 'helios-ui-tooltip';\n    tooltip.hidden = true;\n    tooltip.dataset.open = 'false';\n    tooltip.textContent = hint;\n    tooltip.setAttribute('role', 'tooltip');\n    const tooltipId = `helios-ui-tooltip-${Math.random().toString(16).slice(2)}`;\n    tooltip.dataset.anchorId = tooltipId;\n    labelTitleText.id = tooltipId;\n    labelTitleText.tabIndex = 0;\n\n    const onPointerEnter = () => showTooltip();\n    const onPointerLeave = () => scheduleHideTooltip();\n    const onFocus = () => showTooltip();\n    const onBlur = () => setTooltipHidden(true);\n    const onKeyDown = (e) => {\n      if (e.key === 'Escape') {\n        setTooltipHidden(true);\n        labelTitleText.blur();\n      }\n    };\n    const onScrollOrResize = () => {\n      if (!tooltip || tooltip.hidden) return;\n      placeTooltip();\n    };\n\n    labelTitleText.addEventListener('pointerenter', onPointerEnter);\n    labelTitleText.addEventListener('pointerleave', onPointerLeave);\n    labelTitleText.addEventListener('focus', onFocus);\n    labelTitleText.addEventListener('blur', onBlur);\n    labelTitleText.addEventListener('keydown', onKeyDown);\n    window.addEventListener('scroll', onScrollOrResize, { capture: true });\n    window.addEventListener('resize', onScrollOrResize);\n\n    removeTooltipListeners = () => {\n      labelTitleText.removeEventListener('pointerenter', onPointerEnter);\n      labelTitleText.removeEventListener('pointerleave', onPointerLeave);\n      labelTitleText.removeEventListener('focus', onFocus);\n      labelTitleText.removeEventListener('blur', onBlur);\n      labelTitleText.removeEventListener('keydown', onKeyDown);\n      window.removeEventListener('scroll', onScrollOrResize, { capture: true });\n      window.removeEventListener('resize', onScrollOrResize);\n    };\n  }\n\n  label.appendChild(labelTitle);\n\n  const controls = document.createElement('div');\n  controls.className = 'helios-ui-slider-controls';\n\n  const valueInput = document.createElement('input');\n  valueInput.className = 'helios-ui-number';\n  valueInput.type = 'number';\n  valueInput.inputMode = 'decimal';\n  valueInput.step = String(step);\n  valueInput.disabled = attribute.readOnly;\n  if (inputRange) {\n    if (Number.isFinite(inputRange.min)) valueInput.min = String(inputRange.min);\n    if (Number.isFinite(inputRange.max)) valueInput.max = String(inputRange.max);\n  }\n\n  const slider = document.createElement('input');\n  slider.className = 'helios-ui-slider';\n  slider.type = 'range';\n  slider.min = String(sliderRange.min);\n  slider.max = String(sliderRange.max);\n  slider.step = String(step);\n  slider.disabled = attribute.readOnly;\n\n  const updateSliderVisual = () => {\n    const min = Number(slider.min);\n    const max = Number(slider.max);\n    const value = Number(slider.value);\n    if (!Number.isFinite(min) || !Number.isFinite(max) || !Number.isFinite(value) || min === max) return;\n    const pct = ((value - min) / (max - min)) * 100;\n    slider.style.setProperty('--pct', String(Math.max(0, Math.min(100, pct))));\n  };\n\n  const updateFromAttribute = (value) => {\n    const v = Number(value);\n    if (Number.isFinite(v)) slider.value = String(clampToRange(v, sliderRange));\n    valueInput.value = formatNumber(value, options.precision ?? 3);\n    updateSliderVisual();\n  };\n\n  const unsub = attribute.subscribe(updateFromAttribute);\n  const writeSliderValue = createFpsThrottle((nextValue) => {\n    const v = Number(nextValue);\n    if (!Number.isFinite(v)) return;\n    attribute.write(v, { source: 'ui', event: 'input' });\n  });\n\n  slider.addEventListener('input', () => {\n    const v = Number(slider.value);\n    if (!Number.isFinite(v)) return;\n    updateSliderVisual();\n    writeSliderValue(v);\n  });\n  slider.addEventListener('change', () => {\n    const v = Number(slider.value);\n    if (!Number.isFinite(v)) return;\n    updateSliderVisual();\n    writeSliderValue(v);\n  });\n\n  const commitTypedValue = (eventName) => {\n    const v = clampToRange(valueInput.value, inputRange ?? null);\n    if (v == null) return;\n    attribute.write(v, { source: 'ui', event: eventName });\n  };\n\n  valueInput.addEventListener('change', () => commitTypedValue('change'));\n  valueInput.addEventListener('keydown', (e) => {\n    if (e.key === 'Enter') {\n      commitTypedValue('enter');\n      valueInput.blur();\n    }\n  });\n\n  row.appendChild(label);\n  controls.appendChild(slider);\n  controls.appendChild(valueInput);\n  row.appendChild(controls);\n\n  return {\n    element: row,\n    destroy: () => {\n      unsub();\n      writeSliderValue.cancel();\n      if (hideTooltipTimer != null) window.clearTimeout(hideTooltipTimer);\n      removeTooltipListeners?.();\n      tooltip?.remove?.();\n      tooltip = null;\n      tooltipRoot = null;\n    },\n  };\n}\n","function createDefaultPersistenceIndicator() {\n  const indicator = document.createElement('span');\n  indicator.className = 'helios-ui-dirty-indicator helios-ui-dirty-indicator--static';\n  indicator.dataset.state = 'default';\n  indicator.setAttribute('aria-hidden', 'true');\n  indicator.destroy = () => {};\n  return indicator;\n}\n\nexport function createAlignedRowEl({\n  title,\n  hint,\n  controls,\n  dirtyIndicator,\n  attachTooltip,\n  rowClass = null,\n}) {\n  const row = document.createElement('div');\n  row.className = 'helios-ui-row helios-ui-row--aligned';\n  if (rowClass) {\n    for (const className of String(rowClass).split(/\\s+/).filter(Boolean)) {\n      row.classList.add(className);\n    }\n  }\n  const label = document.createElement('div');\n  label.className = 'helios-ui-label';\n\n  const titleRowEl = document.createElement('div');\n  titleRowEl.className = 'helios-ui-label__title-row';\n  const titleEl = document.createElement('div');\n  titleEl.className = 'helios-ui-label__title';\n  titleEl.textContent = title ?? '';\n  titleRowEl.appendChild(titleEl);\n  const indicator = dirtyIndicator === undefined ? createDefaultPersistenceIndicator() : dirtyIndicator;\n  if (indicator) titleRowEl.appendChild(indicator);\n  label.appendChild(titleRowEl);\n  if (hint) attachTooltip?.(titleEl, hint);\n\n  row.appendChild(label);\n  const controlWrap = document.createElement('div');\n  controlWrap.className = 'helios-ui-row__controls';\n  if (controls) controlWrap.appendChild(controls);\n  const hasSliderControls =\n    Boolean(controls?.classList?.contains('helios-ui-slider-controls'))\n    || Boolean(controls?.querySelector?.('.helios-ui-slider-controls'));\n  if (hasSliderControls) row.classList.add('helios-ui-row--slider');\n  row.appendChild(controlWrap);\n  return { row, titleEl, controlWrap };\n}\n","import { createFpsThrottle } from './createFpsThrottle.js';\n\nfunction updateSliderVisual(slider) {\n  if (!slider) return;\n  const min = Number(slider.min);\n  const max = Number(slider.max);\n  const value = Number(slider.value);\n  if (!Number.isFinite(min) || !Number.isFinite(max) || !Number.isFinite(value) || min === max) return;\n  const pct = ((value - min) / (max - min)) * 100;\n  slider.style.setProperty('--pct', String(Math.max(0, Math.min(100, pct))));\n}\n\nexport class SuggestedSliderControls {\n  constructor({\n    value,\n    suggested,\n    step,\n    inputMin = null,\n    inputMax = null,\n    onCommit = null,\n  }) {\n    this.element = document.createElement('div');\n    this.element.className = 'helios-ui-slider-controls';\n\n    this.slider = document.createElement('input');\n    this.slider.type = 'range';\n    this.slider.className = 'helios-ui-slider';\n    this.slider.min = String(suggested[0]);\n    this.slider.max = String(suggested[1]);\n    this.slider.step = String(step);\n\n    this.input = document.createElement('input');\n    this.input.type = 'number';\n    this.input.className = 'helios-ui-number';\n    this.input.step = String(step);\n    if (inputMin != null) this.input.min = String(inputMin);\n    else this.input.removeAttribute('min');\n    if (inputMax != null) this.input.max = String(inputMax);\n    else this.input.removeAttribute('max');\n\n    const set = (next) => {\n      const n = Number(next);\n      if (!Number.isFinite(n)) return;\n      const min = Number(this.slider.min);\n      const max = Number(this.slider.max);\n      const clamped = Math.max(min, Math.min(max, n));\n      this.slider.value = String(clamped);\n      this.input.value = String(n);\n      updateSliderVisual(this.slider);\n    };\n    this.set = set;\n\n    set(value);\n    const commitSliderValue = createFpsThrottle((nextValue) => {\n      onCommit?.(nextValue);\n    });\n\n    const onSliderInput = () => {\n      this.input.value = String(this.slider.value);\n      updateSliderVisual(this.slider);\n      commitSliderValue(this.slider.value);\n    };\n    const onSliderChange = () => {\n      this.input.value = String(this.slider.value);\n      updateSliderVisual(this.slider);\n      commitSliderValue(this.slider.value);\n      commitSliderValue.flush();\n    };\n    const onInputChange = () => {\n      set(this.input.value);\n      onCommit?.(this.input.value);\n    };\n    const onInputKeyDown = (event) => {\n      if (event.key === 'Enter') {\n        set(this.input.value);\n        onCommit?.(this.input.value);\n        this.input.blur();\n      }\n    };\n\n    this.slider.addEventListener('input', onSliderInput);\n    this.slider.addEventListener('change', onSliderChange);\n    this.input.addEventListener('change', onInputChange);\n    this.input.addEventListener('keydown', onInputKeyDown);\n\n    this._destroy = () => {\n      commitSliderValue.cancel();\n      this.slider.removeEventListener('input', onSliderInput);\n      this.slider.removeEventListener('change', onSliderChange);\n      this.input.removeEventListener('change', onInputChange);\n      this.input.removeEventListener('keydown', onInputKeyDown);\n      this.element.remove();\n    };\n\n    this.element.appendChild(this.slider);\n    this.element.appendChild(this.input);\n  }\n\n  destroy() {\n    this._destroy?.();\n    this._destroy = null;\n  }\n}\n","function normalizePath(path) {\n  return String(path ?? '').trim();\n}\n\nfunction stateForPath(dirtyState, path, scope = path, mode = 'control') {\n  const target = normalizePath(path);\n  const resetScope = normalizePath(scope || path);\n  if (target && dirtyState?.controls?.[target]) return 'changed';\n  if (mode === 'scope') {\n    if (resetScope && dirtyState?.sections?.[resetScope]) return dirtyState.sections[resetScope];\n    if (target && dirtyState?.panels?.[target]) return dirtyState.panels[target];\n  }\n  return 'default';\n}\n\nfunction resolvePersistenceState(helios, path, scope, mode) {\n  const stateManager = helios?.states ?? null;\n  if (typeof stateManager?.status === 'function') {\n    return stateManager.status(mode === 'scope' ? (scope || path) : path, { scope, mode })?.state ?? 'default';\n  }\n  const dirtyState = stateManager?.getDirtyState?.() ?? { controls: {}, sections: {}, panels: {} };\n  return stateForPath(dirtyState, path, scope, mode);\n}\n\nfunction closeOpenMenus(root = document) {\n  for (const menu of root.querySelectorAll?.('.helios-ui-dirty-menu') ?? []) {\n    menu.remove();\n  }\n}\n\nfunction resolveMenuRoot(indicator) {\n  return indicator.closest?.('.helios-ui') ?? indicator.ownerDocument?.body ?? document.body;\n}\n\nexport function createDirtyIndicator({\n  helios,\n  path,\n  scope = path,\n  mode = 'control',\n  attachTooltip = null,\n} = {}) {\n  const indicator = document.createElement('span');\n  indicator.className = 'helios-ui-dirty-indicator';\n  indicator.dataset.state = 'default';\n  indicator.setAttribute('aria-label', 'Persistence status');\n  const hasPath = Boolean(normalizePath(path));\n  if (hasPath) {\n    indicator.dataset.path = normalizePath(path);\n    indicator.dataset.scope = normalizePath(scope || path);\n    indicator.dataset.mode = mode === 'scope' ? 'scope' : 'control';\n  }\n  if (hasPath) {\n    indicator.setAttribute('role', 'button');\n    indicator.setAttribute('tabindex', '0');\n    indicator.setAttribute('aria-haspopup', 'menu');\n  }\n  if (!hasPath) {\n    indicator.classList.add('helios-ui-dirty-indicator--static');\n    indicator.setAttribute('aria-hidden', 'true');\n  }\n\n  const update = () => {\n    const nextState = resolvePersistenceState(helios, path, scope, mode);\n    if (indicator.dataset.state !== nextState) indicator.dataset.state = nextState;\n  };\n\n  const buildMenu = () => {\n    closeOpenMenus(indicator.ownerDocument);\n    const menu = document.createElement('div');\n    menu.className = 'helios-ui-dirty-menu';\n    menu.setAttribute('role', 'menu');\n\n    const addItem = (label, onClick, options = {}) => {\n      const item = document.createElement('button');\n      item.type = 'button';\n      item.className = options.muted ? 'helios-ui-dirty-menu__item helios-ui-dirty-menu__item--muted' : 'helios-ui-dirty-menu__item';\n      item.textContent = label;\n      item.disabled = options.disabled === true;\n      item.addEventListener('click', async (event) => {\n        event.stopPropagation();\n        await onClick?.();\n        menu.remove();\n        update();\n      });\n      menu.appendChild(item);\n      return item;\n    };\n\n    const resetTarget = normalizePath(mode === 'scope' ? (scope || path) : path);\n    addItem('Reset to default', () => (\n      helios?.states?.reset?.(resetTarget)\n    ), {\n      disabled: !resetTarget || indicator.dataset.state === 'default',\n    });\n\n    const rect = typeof indicator.getBoundingClientRect === 'function'\n      ? indicator.getBoundingClientRect()\n      : { bottom: 0, left: 0 };\n    Object.assign(menu.style, {\n      position: 'fixed',\n      top: `${Math.round(rect.bottom + 6)}px`,\n      left: `${Math.round(rect.left)}px`,\n      zIndex: '2147483100',\n    });\n    resolveMenuRoot(indicator).appendChild(menu);\n    setTimeout(() => {\n      const close = (event) => {\n        if (!menu.contains(event.target) && event.target !== indicator) {\n          menu.remove();\n          indicator.ownerDocument.removeEventListener('pointerdown', close, true);\n        }\n      };\n      indicator.ownerDocument.addEventListener('pointerdown', close, true);\n    }, 0);\n  };\n\n  indicator.addEventListener('click', (event) => {\n    event.stopPropagation();\n    if (!hasPath) return;\n    buildMenu();\n  });\n  indicator.addEventListener('keydown', (event) => {\n    if (!hasPath || (event.key !== 'Enter' && event.key !== ' ')) return;\n    event.preventDefault?.();\n    event.stopPropagation?.();\n    buildMenu();\n  });\n\n  const stateManager = helios?.states ?? null;\n  const onChange = () => update();\n  const stateTarget = normalizePath(mode === 'scope' ? (scope || path) : path);\n  const unsubscribeState = hasPath && typeof stateManager?.subscribe === 'function'\n    ? stateManager.subscribe(stateTarget, onChange, { immediate: false })\n    : null;\n  if (!unsubscribeState) stateManager?.addEventListener?.('change', onChange);\n  stateManager?.addEventListener?.('config', onChange);\n  indicator.destroy = () => {\n    unsubscribeState?.();\n    if (!unsubscribeState) stateManager?.removeEventListener?.('change', onChange);\n    stateManager?.removeEventListener?.('config', onChange);\n    closeOpenMenus(indicator.ownerDocument);\n  };\n  if (hasPath) attachTooltip?.(indicator, 'Shows whether this setting is tracked as a session override.');\n  update();\n  return indicator;\n}\n\nexport default createDirtyIndicator;\n","export function createTooltipManager() {\n  const cleanups = new Set();\n\n  const attachTooltip = (anchorEl, hint) => {\n    if (!anchorEl || !hint) return () => {};\n\n    let tooltip = null;\n    let tooltipRoot = null;\n    let hideTooltipTimer = null;\n\n    const resolveTooltipRoot = () => anchorEl.closest?.('.helios-ui') ?? anchorEl.ownerDocument?.body ?? document.body;\n\n    const setTooltipHidden = (hidden) => {\n      if (!tooltip) return;\n      tooltip.dataset.open = hidden ? 'false' : 'true';\n      tooltip.hidden = hidden;\n    };\n\n    const placeTooltip = () => {\n      if (!tooltip) return;\n      const anchor = tooltip.dataset.anchorId ? anchorEl.ownerDocument?.getElementById?.(tooltip.dataset.anchorId) : null;\n      const el = anchor ?? null;\n      if (!el) return;\n\n      const margin = 8;\n      const rect = el.getBoundingClientRect();\n      const { innerWidth: vw, innerHeight: vh } = window;\n\n      tooltip.style.left = '0px';\n      tooltip.style.top = '0px';\n      tooltip.style.transform = 'translate(-9999px, -9999px)';\n      const tipRect = tooltip.getBoundingClientRect();\n\n      const preferredLeft = rect.left + rect.width / 2 - tipRect.width / 2;\n      const left = Math.max(margin, Math.min(vw - margin - tipRect.width, preferredLeft));\n\n      const preferredTop = rect.top - 8 - tipRect.height;\n      const fallbackTop = rect.bottom + 8;\n      const top = preferredTop >= margin ? preferredTop : Math.min(vh - margin - tipRect.height, fallbackTop);\n\n      tooltip.style.left = `${left}px`;\n      tooltip.style.top = `${top}px`;\n      tooltip.style.transform = 'translate(0, 0)';\n    };\n\n    const scheduleHideTooltip = () => {\n      if (hideTooltipTimer != null) window.clearTimeout(hideTooltipTimer);\n      hideTooltipTimer = window.setTimeout(() => setTooltipHidden(true), 120);\n    };\n\n    const showTooltip = () => {\n      if (!tooltip) return;\n      if (hideTooltipTimer != null) window.clearTimeout(hideTooltipTimer);\n      if (!tooltipRoot) {\n        tooltipRoot = resolveTooltipRoot();\n        tooltipRoot.appendChild(tooltip);\n      }\n      setTooltipHidden(false);\n      placeTooltip();\n    };\n\n    tooltip = document.createElement('div');\n    tooltip.className = 'helios-ui-tooltip';\n    tooltip.hidden = true;\n    tooltip.dataset.open = 'false';\n    tooltip.textContent = hint;\n    tooltip.setAttribute('role', 'tooltip');\n\n    const tooltipId = `helios-ui-tooltip-${Math.random().toString(16).slice(2)}`;\n    tooltip.dataset.anchorId = tooltipId;\n    anchorEl.id = tooltipId;\n    anchorEl.tabIndex = 0;\n\n    const onPointerEnter = () => showTooltip();\n    const onPointerLeave = () => scheduleHideTooltip();\n    const onFocus = () => showTooltip();\n    const onBlur = () => setTooltipHidden(true);\n    const onKeyDown = (e) => {\n      if (e.key === 'Escape') {\n        setTooltipHidden(true);\n        anchorEl.blur();\n      }\n    };\n    const onScrollOrResize = () => {\n      if (!tooltip || tooltip.hidden) return;\n      placeTooltip();\n    };\n\n    anchorEl.addEventListener('pointerenter', onPointerEnter);\n    anchorEl.addEventListener('pointerleave', onPointerLeave);\n    anchorEl.addEventListener('focus', onFocus);\n    anchorEl.addEventListener('blur', onBlur);\n    anchorEl.addEventListener('keydown', onKeyDown);\n    window.addEventListener('scroll', onScrollOrResize, { capture: true });\n    window.addEventListener('resize', onScrollOrResize);\n\n    const cleanup = () => {\n      if (hideTooltipTimer != null) window.clearTimeout(hideTooltipTimer);\n      anchorEl.removeEventListener('pointerenter', onPointerEnter);\n      anchorEl.removeEventListener('pointerleave', onPointerLeave);\n      anchorEl.removeEventListener('focus', onFocus);\n      anchorEl.removeEventListener('blur', onBlur);\n      anchorEl.removeEventListener('keydown', onKeyDown);\n      window.removeEventListener('scroll', onScrollOrResize, { capture: true });\n      window.removeEventListener('resize', onScrollOrResize);\n      tooltip?.remove?.();\n      tooltip = null;\n      tooltipRoot = null;\n    };\n\n    cleanups.add(cleanup);\n    return cleanup;\n  };\n\n  return {\n    attachTooltip,\n    destroy() {\n      for (const cleanup of cleanups) cleanup();\n      cleanups.clear();\n    },\n  };\n}\n\n","export function createToggleControl({\n  checked = false,\n  disabled = false,\n  onLabel = 'On',\n  offLabel = 'Off',\n  ariaLabel = null,\n  className = 'helios-ui-toggle',\n} = {}) {\n  const button = document.createElement('button');\n  button.type = 'button';\n  button.className = className;\n  button.setAttribute('role', 'switch');\n  if (ariaLabel) button.setAttribute('aria-label', String(ariaLabel));\n\n  const thumb = document.createElement('span');\n  thumb.className = 'helios-ui-toggle__thumb';\n  thumb.setAttribute('aria-hidden', 'true');\n\n  const text = document.createElement('span');\n  text.className = 'helios-ui-toggle__text';\n\n  button.appendChild(thumb);\n  button.appendChild(text);\n\n  const labels = {\n    on: String(onLabel ?? 'On'),\n    off: String(offLabel ?? 'Off'),\n  };\n\n  let currentChecked = Boolean(checked);\n  let suppressClick = false;\n\n  const sync = () => {\n    const nextAriaChecked = currentChecked ? 'true' : 'false';\n    if (button.getAttribute('aria-checked') !== nextAriaChecked) {\n      button.setAttribute('aria-checked', nextAriaChecked);\n    }\n    const nextText = currentChecked ? labels.on : labels.off;\n    if (text.textContent !== nextText) {\n      text.textContent = nextText;\n    }\n  };\n\n  const commitToggle = () => {\n    if (button.disabled) return;\n    button.checked = !button.checked;\n    button.dispatchEvent(new Event('change', { bubbles: true }));\n  };\n\n  Object.defineProperty(button, 'checked', {\n    configurable: true,\n    enumerable: true,\n    get() {\n      return currentChecked;\n    },\n    set(value) {\n      const nextChecked = Boolean(value);\n      if (nextChecked === currentChecked) return;\n      currentChecked = nextChecked;\n      sync();\n    },\n  });\n\n  button.setLabels = ({ on, off } = {}) => {\n    const previousText = currentChecked ? labels.on : labels.off;\n    if (on != null) labels.on = String(on);\n    if (off != null) labels.off = String(off);\n    if ((currentChecked ? labels.on : labels.off) !== previousText) sync();\n  };\n\n  button.addEventListener('pointerup', (event) => {\n    if (button.disabled) return;\n    if (event.button != null && event.button !== 0) return;\n    suppressClick = true;\n    commitToggle();\n  });\n\n  button.addEventListener('click', () => {\n    if (suppressClick) {\n      suppressClick = false;\n      return;\n    }\n    commitToggle();\n  });\n\n  button.disabled = Boolean(disabled);\n  sync();\n  return button;\n}\n\nexport default createToggleControl;\n","export function createSegmentedToggleControl({\n  checked = false,\n  disabled = false,\n  onLabel = 'On',\n  offLabel = 'Off',\n  ariaLabel = null,\n  className = 'helios-ui-segmented-toggle',\n} = {}) {\n  const root = document.createElement('div');\n  root.className = className;\n  root.setAttribute('role', 'radiogroup');\n  if (ariaLabel) root.setAttribute('aria-label', String(ariaLabel));\n\n  const labels = {\n    on: String(onLabel ?? 'On'),\n    off: String(offLabel ?? 'Off'),\n  };\n\n  const offButton = document.createElement('button');\n  offButton.type = 'button';\n  offButton.className = 'helios-ui-segmented-toggle__option';\n  offButton.dataset.segment = 'off';\n  offButton.dataset.value = 'false';\n  offButton.setAttribute('role', 'radio');\n\n  const onButton = document.createElement('button');\n  onButton.type = 'button';\n  onButton.className = 'helios-ui-segmented-toggle__option';\n  onButton.dataset.segment = 'on';\n  onButton.dataset.value = 'true';\n  onButton.setAttribute('role', 'radio');\n\n  root.appendChild(offButton);\n  root.appendChild(onButton);\n\n  let currentChecked = Boolean(checked);\n  let currentDisabled = Boolean(disabled);\n\n  const sync = () => {\n    offButton.textContent = labels.off;\n    onButton.textContent = labels.on;\n    offButton.setAttribute('aria-checked', currentChecked ? 'false' : 'true');\n    onButton.setAttribute('aria-checked', currentChecked ? 'true' : 'false');\n    offButton.dataset.selected = currentChecked ? 'false' : 'true';\n    onButton.dataset.selected = currentChecked ? 'true' : 'false';\n    offButton.tabIndex = currentChecked ? -1 : 0;\n    onButton.tabIndex = currentChecked ? 0 : -1;\n    offButton.disabled = currentDisabled;\n    onButton.disabled = currentDisabled;\n    root.setAttribute('aria-disabled', currentDisabled ? 'true' : 'false');\n    root.dataset.checked = currentChecked ? 'true' : 'false';\n  };\n\n  const setChecked = (value) => {\n    const next = Boolean(value);\n    if (next === currentChecked) return;\n    currentChecked = next;\n    sync();\n    root.dispatchEvent(new Event('change', { bubbles: true }));\n  };\n\n  const activateOption = (nextChecked) => {\n    if (currentDisabled) return;\n    setChecked(nextChecked);\n  };\n\n  const handleKeydown = (event) => {\n    if (currentDisabled) return;\n    if (event.key === 'ArrowLeft' || event.key === 'ArrowDown') {\n      event.preventDefault();\n      setChecked(false);\n      offButton.focus?.();\n      return;\n    }\n    if (event.key === 'ArrowRight' || event.key === 'ArrowUp') {\n      event.preventDefault();\n      setChecked(true);\n      onButton.focus?.();\n      return;\n    }\n    if (event.key === ' ' || event.key === 'Enter') {\n      event.preventDefault();\n      setChecked(event.currentTarget === onButton);\n    }\n  };\n\n  const handleOptionPointerUp = (nextChecked) => (event) => {\n    if (currentDisabled) return;\n    if (event.button != null && event.button !== 0) return;\n    activateOption(nextChecked);\n  };\n\n  offButton.addEventListener('pointerup', handleOptionPointerUp(false));\n  onButton.addEventListener('pointerup', handleOptionPointerUp(true));\n  offButton.addEventListener('click', () => activateOption(false));\n  onButton.addEventListener('click', () => activateOption(true));\n  offButton.addEventListener('keydown', handleKeydown);\n  onButton.addEventListener('keydown', handleKeydown);\n\n  Object.defineProperty(root, 'checked', {\n    configurable: true,\n    enumerable: true,\n    get() {\n      return currentChecked;\n    },\n    set(value) {\n      currentChecked = Boolean(value);\n      sync();\n    },\n  });\n\n  Object.defineProperty(root, 'disabled', {\n    configurable: true,\n    enumerable: true,\n    get() {\n      return currentDisabled;\n    },\n    set(value) {\n      currentDisabled = Boolean(value);\n      sync();\n    },\n  });\n\n  root.setLabels = ({ on, off } = {}) => {\n    if (on != null) labels.on = String(on);\n    if (off != null) labels.off = String(off);\n    sync();\n  };\n\n  sync();\n  return root;\n}\n\nexport default createSegmentedToggleControl;\n","export function createSelectControl({\n  options = [],\n  value = null,\n  className = 'helios-ui-select',\n  ariaLabel = '',\n  compact = false,\n  onChange = null,\n} = {}) {\n  const select = document.createElement('select');\n  select.className = compact ? `${className} helios-ui-select--compact` : className;\n  if (ariaLabel) select.setAttribute('aria-label', ariaLabel);\n\n  const setOptions = (nextOptions = [], nextValue = value) => {\n    select.replaceChildren();\n    for (const entry of nextOptions) {\n      const option = document.createElement('option');\n      option.value = String(entry?.value ?? '');\n      option.textContent = entry?.label ?? String(entry?.value ?? '');\n      if (entry?.disabled === true) option.disabled = true;\n      select.appendChild(option);\n    }\n    if (nextValue != null) select.value = String(nextValue);\n  };\n\n  setOptions(options, value);\n  if (onChange) {\n    select.addEventListener('change', () => onChange(select.value));\n  }\n  select.setOptions = setOptions;\n  return select;\n}\n\nexport default createSelectControl;\n","import { createFpsThrottle } from './createFpsThrottle.js';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst FALLBACK_DIRECTION = Object.freeze([0.577350269, 0.577350269, 0.577350269]);\nconst EPSILON = 1e-6;\n\nfunction normalizeDirection(value, fallback = FALLBACK_DIRECTION) {\n  const source = Array.isArray(value) || ArrayBuffer.isView(value) ? value : fallback;\n  const x = Number(source?.[0]);\n  const y = Number(source?.[1]);\n  const z = Number(source?.[2]);\n  const length = Math.hypot(x, y, z);\n  if (!Number.isFinite(length) || length <= EPSILON) return Array.from(fallback);\n  return [x / length, y / length, z / length];\n}\n\nfunction clampUnitDisk(x, y) {\n  const length = Math.hypot(x, y);\n  if (!Number.isFinite(length) || length <= 1) return [x, y];\n  return [x / length, y / length];\n}\n\nfunction formatComponent(value) {\n  const number = Number(value);\n  if (!Number.isFinite(number)) return '0';\n  return number.toFixed(3).replace(/\\.?0+$/, '');\n}\n\nfunction createSvgElement(doc, name, attributes = {}) {\n  const element = doc.createElementNS(SVG_NS, name);\n  for (const [key, value] of Object.entries(attributes)) {\n    element.setAttribute(key, String(value));\n  }\n  return element;\n}\n\nexport function createLightDirectionControl(attribute, options = {}) {\n  const doc = options.document ?? document;\n  const mode = options.mode === 'axis' ? 'axis' : 'light';\n  const root = doc.createElement('div');\n  root.className = 'helios-ui-light-direction';\n  root.classList.add(`helios-ui-light-direction--${mode}`);\n\n  const pad = doc.createElement('button');\n  pad.type = 'button';\n  pad.className = 'helios-ui-light-direction__pad';\n  pad.dataset.testid = options.testId ?? 'controls-shaded-light-direction';\n  pad.setAttribute('aria-label', options.ariaLabel ?? 'Shaded light direction');\n\n  const svg = createSvgElement(doc, 'svg', {\n    class: 'helios-ui-light-direction__sphere',\n    viewBox: '0 0 100 100',\n    'aria-hidden': 'true',\n    focusable: 'false',\n  });\n  const outline = createSvgElement(doc, 'circle', {\n    class: 'helios-ui-light-direction__outline',\n    cx: 50,\n    cy: 50,\n    r: 42,\n  });\n  const equator = createSvgElement(doc, 'ellipse', {\n    class: 'helios-ui-light-direction__latitude',\n    cx: 50,\n    cy: 54,\n    rx: 39,\n    ry: 12,\n  });\n  const meridian = createSvgElement(doc, 'ellipse', {\n    class: 'helios-ui-light-direction__latitude',\n    cx: 50,\n    cy: 50,\n    rx: 14,\n    ry: 40,\n  });\n  const line = createSvgElement(doc, 'line', {\n    class: 'helios-ui-light-direction__ray',\n    x1: 50,\n    y1: 50,\n    x2: 50,\n    y2: 50,\n  });\n  const center = createSvgElement(doc, 'circle', {\n    class: 'helios-ui-light-direction__center',\n    cx: 50,\n    cy: 50,\n    r: 2.7,\n  });\n  const handleGroup = createSvgElement(doc, 'g', {\n    class: 'helios-ui-light-direction__handle-group',\n  });\n  const handle = createSvgElement(doc, 'ellipse', {\n    class: 'helios-ui-light-direction__handle',\n    cx: 0,\n    cy: 0,\n    rx: 5,\n    ry: 8,\n  });\n  const axisArrow = createSvgElement(doc, 'path', {\n    class: 'helios-ui-light-direction__axis-arrow',\n    d: 'M 10 0 L 1 -5 L 3 0 L 1 5 Z',\n  });\n  handleGroup.append(handle, axisArrow);\n  const backHandleGroup = createSvgElement(doc, 'g', {\n    class: 'helios-ui-light-direction__handle-group helios-ui-light-direction__handle-group--back',\n  });\n  const backHandle = createSvgElement(doc, 'ellipse', {\n    class: 'helios-ui-light-direction__handle helios-ui-light-direction__handle--back',\n    cx: 0,\n    cy: 0,\n    rx: 4,\n    ry: 7,\n  });\n  backHandleGroup.appendChild(backHandle);\n  svg.append(outline, equator, meridian, line, center, backHandleGroup, handleGroup);\n  pad.appendChild(svg);\n\n  const fields = doc.createElement('div');\n  fields.className = 'helios-ui-light-direction__fields';\n  const inputs = [];\n  for (const axis of ['x', 'y', 'z']) {\n    const input = doc.createElement('input');\n    input.type = 'number';\n    input.className = 'helios-ui-number';\n    input.min = '-1';\n    input.max = '1';\n    input.step = '0.01';\n    input.inputMode = 'decimal';\n    input.dataset.axis = axis;\n    input.dataset.testid = `${options.fieldTestIdPrefix ?? 'controls-shaded-light-direction'}-${axis}`;\n    input.setAttribute('aria-label', `Light ${axis.toUpperCase()}`);\n    fields.appendChild(input);\n    inputs.push(input);\n  }\n\n  root.append(pad, fields);\n\n  const readDirection = () => normalizeDirection(attribute?.value?.());\n  const writeDirection = (direction, event = 'change') => {\n    if (attribute?.readOnly) return;\n    attribute?.write?.(normalizeDirection(direction, readDirection()), { source: 'ui', event });\n  };\n\n  let currentDirection = readDirection();\n  let activeAxisSign = 1;\n  const sync = (value = readDirection()) => {\n    currentDirection = normalizeDirection(value, currentDirection);\n    const [x, y, z] = currentDirection;\n    const px = 50 + x * 38;\n    const py = 50 - y * 38;\n    const nx = 50 - x * 38;\n    const ny = 50 + y * 38;\n    const screenAngle = Math.atan2(py - 50, px - 50) * 180 / Math.PI;\n    const backScreenAngle = Math.atan2(ny - 50, nx - 50) * 180 / Math.PI;\n    const flatten = 3.5 + Math.max(0, Math.min(1, Math.abs(z))) * 2.5;\n    line.setAttribute('x1', formatComponent(mode === 'axis' ? nx : 50));\n    line.setAttribute('y1', formatComponent(mode === 'axis' ? ny : 50));\n    line.setAttribute('x2', formatComponent(px));\n    line.setAttribute('y2', formatComponent(py));\n    handle.setAttribute('rx', formatComponent(flatten));\n    backHandle.setAttribute('rx', formatComponent(flatten));\n    handleGroup.setAttribute('transform', `translate(${formatComponent(px)} ${formatComponent(py)}) rotate(${formatComponent(screenAngle)})`);\n    backHandleGroup.setAttribute('transform', `translate(${formatComponent(nx)} ${formatComponent(ny)}) rotate(${formatComponent(backScreenAngle)})`);\n    handleGroup.dataset.back = z < 0 ? 'true' : 'false';\n    backHandleGroup.dataset.back = z >= 0 ? 'true' : 'false';\n    pad.dataset.back = z < 0 ? 'true' : 'false';\n    pad.setAttribute('aria-valuetext', `X ${formatComponent(x)}, Y ${formatComponent(y)}, Z ${formatComponent(z)}`);\n    for (let i = 0; i < inputs.length; i += 1) {\n      inputs[i].value = formatComponent(currentDirection[i]);\n      inputs[i].disabled = Boolean(attribute?.readOnly);\n    }\n    pad.disabled = Boolean(attribute?.readOnly);\n  };\n\n  const pointerToUnitDisk = (event) => {\n    const rect = pad.getBoundingClientRect();\n    const size = Math.max(1, Math.min(rect.width, rect.height));\n    const left = rect.left + (rect.width - size) / 2;\n    const top = rect.top + (rect.height - size) / 2;\n    let x = ((event.clientX - left) / size - 0.5) * 2;\n    let y = -(((event.clientY - top) / size - 0.5) * 2);\n    [x, y] = clampUnitDisk(x, y);\n    return [x, y];\n  };\n\n  const resolveAxisSign = (x, y) => {\n    if (mode !== 'axis') return 1;\n    const frontDistance = Math.hypot(x - currentDirection[0], y - currentDirection[1]);\n    const backDistance = Math.hypot(x + currentDirection[0], y + currentDirection[1]);\n    return backDistance < frontDistance ? -1 : 1;\n  };\n\n  const directionFromPointer = (event, axisSign = activeAxisSign) => {\n    const [x, y] = pointerToUnitDisk(event);\n    const z = Math.sqrt(Math.max(0, 1 - x * x - y * y));\n    if (mode === 'axis' && axisSign < 0) return [-x, -y, -z];\n    return [x, y, z];\n  };\n\n  const writePointerDirection = createFpsThrottle((direction) => {\n    writeDirection(direction, 'input');\n  });\n\n  let draggingPointerId = null;\n  const onPointerDown = (event) => {\n    if (attribute?.readOnly) return;\n    event.preventDefault();\n    draggingPointerId = event.pointerId;\n    pad.setPointerCapture?.(event.pointerId);\n    const [x, y] = pointerToUnitDisk(event);\n    activeAxisSign = resolveAxisSign(x, y);\n    const next = directionFromPointer(event, activeAxisSign);\n    sync(next);\n    writePointerDirection(next);\n  };\n  const onPointerMove = (event) => {\n    if (draggingPointerId !== event.pointerId) return;\n    event.preventDefault();\n    const next = directionFromPointer(event, activeAxisSign);\n    sync(next);\n    writePointerDirection(next);\n  };\n  const onPointerUp = (event) => {\n    if (draggingPointerId !== event.pointerId) return;\n    event.preventDefault();\n    const next = directionFromPointer(event, activeAxisSign);\n    sync(next);\n    writePointerDirection(next);\n    writePointerDirection.flush();\n    draggingPointerId = null;\n    pad.releasePointerCapture?.(event.pointerId);\n  };\n  const onPointerCancel = (event) => {\n    if (draggingPointerId !== event.pointerId) return;\n    writePointerDirection.cancel();\n    draggingPointerId = null;\n    pad.releasePointerCapture?.(event.pointerId);\n    sync();\n  };\n\n  const commitInputs = () => {\n    const next = currentDirection.slice();\n    for (let i = 0; i < inputs.length; i += 1) {\n      const value = Number(inputs[i].value);\n      if (Number.isFinite(value)) next[i] = value;\n    }\n    writeDirection(next, 'change');\n    sync(readDirection());\n  };\n\n  const onInputKeyDown = (event) => {\n    if (event.key !== 'Enter') return;\n    commitInputs();\n    event.currentTarget.blur();\n  };\n\n  const onKeyDown = (event) => {\n    if (attribute?.readOnly) return;\n    const step = event.shiftKey ? 0.01 : 0.05;\n    const next = currentDirection.slice();\n    if (event.key === 'ArrowLeft') next[0] -= step;\n    else if (event.key === 'ArrowRight') next[0] += step;\n    else if (event.key === 'ArrowUp') next[1] += step;\n    else if (event.key === 'ArrowDown') next[1] -= step;\n    else if (event.key === 'PageUp') next[2] += step;\n    else if (event.key === 'PageDown') next[2] -= step;\n    else if (event.key === 'Home') next.splice(0, 3, ...FALLBACK_DIRECTION);\n    else return;\n    event.preventDefault();\n    writeDirection(next, 'change');\n    sync(readDirection());\n  };\n\n  pad.addEventListener('pointerdown', onPointerDown);\n  pad.addEventListener('pointermove', onPointerMove);\n  pad.addEventListener('pointerup', onPointerUp);\n  pad.addEventListener('pointercancel', onPointerCancel);\n  pad.addEventListener('keydown', onKeyDown);\n  for (const input of inputs) {\n    input.addEventListener('change', commitInputs);\n    input.addEventListener('keydown', onInputKeyDown);\n  }\n  const unsubscribe = attribute?.subscribe?.(sync) ?? null;\n  sync();\n\n  return {\n    element: root,\n    set: sync,\n    destroy() {\n      unsubscribe?.();\n      writePointerDirection.cancel();\n      pad.removeEventListener('pointerdown', onPointerDown);\n      pad.removeEventListener('pointermove', onPointerMove);\n      pad.removeEventListener('pointerup', onPointerUp);\n      pad.removeEventListener('pointercancel', onPointerCancel);\n      pad.removeEventListener('keydown', onKeyDown);\n      for (const input of inputs) {\n        input.removeEventListener('change', commitInputs);\n        input.removeEventListener('keydown', onInputKeyDown);\n      }\n      root.remove();\n    },\n  };\n}\n","function resolveContainer(element) {\n  if (element instanceof HTMLElement) return element;\n  const div = document.createElement('div');\n  if (element != null) div.textContent = String(element);\n  return div;\n}\n\nfunction appendResolved(target, value) {\n  if (value == null) return;\n  if (Array.isArray(value)) {\n    for (const entry of value) appendResolved(target, entry);\n    return;\n  }\n  if (value instanceof Node) {\n    target.appendChild(value);\n    return;\n  }\n  target.appendChild(resolveContainer(value));\n}\n\n/**\n * Collapsible stack of UI subpanels used by the optional Helios UI.\n *\n * @public\n * @apiSection User Interface\n * @param {object} [options] - Stack options.\n * @param {Array<object>} [options.items] - Initial panel items.\n */\nexport class PanelStack {\n  constructor(options = {}) {\n    this.element = document.createElement('div');\n    this.element.className = 'helios-ui-stack';\n    this._items = new Map();\n    const items = options.items ?? [];\n    for (const item of items) this.add(item);\n  }\n\n  add(options) {\n    if (!options?.id) throw new Error('PanelStack.add requires id');\n    if (this._items.has(options.id)) throw new Error(`Stack item \"${options.id}\" already exists`);\n\n    const item = document.createElement('div');\n    item.className = 'helios-ui-subpanel';\n    item.dataset.collapsed = options.collapsed ? 'true' : 'false';\n\n    const header = document.createElement('button');\n    header.type = 'button';\n    header.className = 'helios-ui-subpanel__header';\n    const headerRow = document.createElement('div');\n    headerRow.className = 'helios-ui-subpanel__header-row';\n\n    const toggle = document.createElement('span');\n    toggle.className = 'helios-ui-subpanel__toggle';\n    toggle.setAttribute('aria-hidden', 'true');\n\n    const label = document.createElement('span');\n    label.className = 'helios-ui-subpanel__label';\n    label.textContent = options.title ?? options.id;\n\n    let status = null;\n    if (options.statusDot !== false) {\n      status = document.createElement('span');\n      status.className = 'helios-ui-subpanel__status';\n      status.dataset.state = 'idle';\n      status.hidden = true;\n      status.setAttribute('aria-hidden', 'true');\n    }\n\n    const sync = () => {\n      const collapsed = item.dataset.collapsed === 'true';\n      header.setAttribute('aria-expanded', collapsed ? 'false' : 'true');\n      toggle.textContent = collapsed ? '+' : '−';\n    };\n\n    header.appendChild(toggle);\n    if (status) header.appendChild(status);\n    header.appendChild(label);\n    headerRow.appendChild(header);\n    let headerControls = null;\n    if (options.headerControls != null) {\n      headerControls = document.createElement('div');\n      headerControls.className = 'helios-ui-subpanel__header-controls';\n      appendResolved(headerControls, options.headerControls);\n      if (headerControls.childNodes.length > 0) {\n        headerRow.appendChild(headerControls);\n      } else {\n        headerControls = null;\n      }\n    }\n    sync();\n\n    const body = document.createElement('div');\n    body.className = 'helios-ui-subpanel__body';\n    body.appendChild(resolveContainer(options.content));\n\n    header.addEventListener('click', () => {\n      item.dataset.collapsed = item.dataset.collapsed === 'true' ? 'false' : 'true';\n      sync();\n    });\n\n    item.appendChild(headerRow);\n    item.appendChild(body);\n    this.element.appendChild(item);\n    this._items.set(options.id, { item, header, headerRow, headerControls, body, status });\n    return options.id;\n  }\n\n  setStatus(id, status) {\n    const entry = this._items.get(id);\n    if (!entry?.status) return;\n    const normalized = typeof status === 'string' ? status : 'idle';\n    entry.status.dataset.state = normalized;\n    entry.status.hidden = normalized === 'none';\n  }\n\n  destroy() {\n    this.element.remove();\n    this._items.clear();\n  }\n}\n","function resolveContainer(element) {\n  if (element instanceof HTMLElement) return element;\n  const div = document.createElement('div');\n  if (element != null) div.textContent = String(element);\n  return div;\n}\n\nfunction resolveVariantClassName(variant) {\n  if (typeof variant !== 'string') return '';\n  const cleaned = variant.trim().toLowerCase().replace(/[^a-z0-9-]+/g, '');\n  if (!cleaned) return '';\n  return ` helios-ui-tabs--${cleaned}`;\n}\n\n/**\n * Small tabbed panel primitive used by the optional Helios UI.\n *\n * @public\n * @apiSection User Interface\n * @param {object} [options] - Tab panel options.\n * @param {Array<object>} [options.tabs] - Initial tabs.\n * @param {string} [options.activeId] - Initially active tab id.\n */\nexport class TabbedPanel {\n  constructor(options = {}) {\n    this.element = document.createElement('div');\n    this.element.className = `helios-ui-tabs${resolveVariantClassName(options.variant)}`;\n\n    this.bar = document.createElement('div');\n    this.bar.className = 'helios-ui-tabs__bar';\n    this.barLeft = document.createElement('div');\n    this.barLeft.className = 'helios-ui-tabs__bar-left';\n    this.barRight = document.createElement('div');\n    this.barRight.className = 'helios-ui-tabs__bar-right';\n    this.content = document.createElement('div');\n    this.content.className = 'helios-ui-tabs__content';\n\n    this.bar.appendChild(this.barLeft);\n    this.bar.appendChild(this.barRight);\n    this.element.appendChild(this.bar);\n    this.element.appendChild(this.content);\n\n    this._tabs = new Map();\n    this._activeId = null;\n    this._onActiveChanged = typeof options.onActiveChanged === 'function' ? options.onActiveChanged : null;\n\n    if (options.barRight) {\n      this.barRight.appendChild(resolveContainer(options.barRight));\n    }\n\n    const tabs = options.tabs ?? [];\n    for (const tab of tabs) this.addTab(tab);\n    if (options.activeId) this.setActive(options.activeId);\n    if (!this._activeId && tabs.length) this.setActive(tabs[0].id);\n  }\n\n  addTab(tab) {\n    if (!tab?.id) throw new Error('TabbedPanel.addTab requires tab.id');\n    if (this._tabs.has(tab.id)) throw new Error(`Tab \"${tab.id}\" already exists`);\n    const button = document.createElement('button');\n    button.type = 'button';\n    button.className = 'helios-ui-tab';\n    button.textContent = tab.title ?? tab.id;\n    button.addEventListener('click', () => this.setActive(tab.id));\n\n    const panel = document.createElement('div');\n    panel.className = 'helios-ui-tabpanel';\n    panel.dataset.tabId = tab.id;\n    panel.appendChild(resolveContainer(tab.content));\n\n    this.barLeft.appendChild(button);\n    this.content.appendChild(panel);\n    this._tabs.set(tab.id, { id: tab.id, button, panel });\n\n    if (!this._activeId) this.setActive(tab.id);\n    return tab.id;\n  }\n\n  setActive(id) {\n    if (!this._tabs.has(id)) return;\n    this._activeId = id;\n    for (const [tabId, tab] of this._tabs.entries()) {\n      const active = tabId === id;\n      tab.button.dataset.active = active ? 'true' : 'false';\n      tab.panel.dataset.active = active ? 'true' : 'false';\n    }\n    if (this._onActiveChanged) {\n      try {\n        this._onActiveChanged(id);\n      } catch (error) {\n        console.warn('[HeliosUI][TabbedPanel] Active tab callback failed.', error);\n      }\n    }\n  }\n\n  activeId() {\n    return this._activeId;\n  }\n\n  destroy() {\n    this.element.remove();\n    this._tabs.clear();\n    this._activeId = null;\n  }\n}\n","function normalizeKey(key) {\n  return String(key ?? '').trim();\n}\n\nfunction normalizeLabel(label) {\n  const value = String(label ?? '').trim();\n  return value || null;\n}\n\nconst LABEL_ACRONYMS = Object.freeze({\n  ao: 'AO',\n  api: 'API',\n  gpu: 'GPU',\n  id: 'ID',\n  ms: 'ms',\n  rgb: 'RGB',\n  rgba: 'RGBA',\n  ssao: 'SSAO',\n  ui: 'UI',\n  umap: 'UMAP',\n  url: 'URL',\n  wasm: 'WASM',\n  webgl: 'WebGL',\n  webgpu: 'WebGPU',\n});\n\n/**\n * Convert a state key or control identifier into a display label.\n *\n * @public\n * @param {string} value - State key, control id, or raw label value.\n * @returns {string} Human-readable control label.\n */\nexport function humanizeControlLabel(value) {\n  const raw = String(value ?? '').trim();\n  if (!raw) return '';\n  const leaf = raw\n    .split('.')\n    .map((part) => part.trim())\n    .filter((part) => part && !/^\\d+$/u.test(part))\n    .pop() ?? raw;\n  const spaced = leaf\n    .replace(/[_-]+/gu, ' ')\n    .replace(/([a-z0-9])([A-Z])/gu, '$1 $2')\n    .replace(/([A-Z]+)([A-Z][a-z])/gu, '$1 $2')\n    .replace(/\\s+/gu, ' ')\n    .trim();\n  return spaced\n    .split(' ')\n    .filter(Boolean)\n    .map((part) => {\n      const lower = part.toLowerCase();\n      if (LABEL_ACRONYMS[lower]) return LABEL_ACRONYMS[lower];\n      return `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`;\n    })\n    .join(' ');\n}\n\nfunction itemKey(item) {\n  if (typeof item === 'string') {\n    const key = normalizeKey(item);\n    return key || null;\n  }\n  if (!item || typeof item !== 'object') return null;\n  if (typeof item.key === 'string') {\n    const key = normalizeKey(item.key);\n    return key || null;\n  }\n  if (typeof item.keyPrefix === 'string') {\n    const key = normalizeKey(item.keyPrefix);\n    return key || null;\n  }\n  return null;\n}\n\nfunction collectItemKeys(item, keys = []) {\n  const key = itemKey(item);\n  if (key) keys.push(key);\n  if (!item || typeof item !== 'object') return keys;\n  for (const child of item.items ?? []) collectItemKeys(child, keys);\n  return keys;\n}\n\n/**\n * Resolve the display label for a panel schema item.\n *\n * @public\n * @param {string|object} item - Panel schema item descriptor.\n * @param {HeliosStateManager|null} [stateManager] - Optional state manager for state entry labels.\n * @returns {string} Display label for the item.\n */\nexport function resolvePanelItemLabel(item, stateManager = null) {\n  const itemLabel = normalizeLabel(typeof item === 'object' && item ? item.label : null);\n  if (itemLabel) return itemLabel;\n  const key = itemKey(item);\n  if (key && typeof stateManager?.entry === 'function') {\n    const entryLabel = normalizeLabel(stateManager.entry(key)?.ui?.label);\n    if (entryLabel) return entryLabel;\n  }\n  const fallback = key\n    ?? (typeof item === 'object' && item ? (item.id ?? item.type) : item);\n  return humanizeControlLabel(fallback);\n}\n\n/**\n * Normalize a panel schema into the canonical shape used by Helios UI panels.\n *\n * @public\n * @param {object} [schema] - Partial panel schema.\n * @returns {object} Normalized panel schema.\n */\nexport function normalizePanelSchema(schema = {}) {\n  const sections = Array.isArray(schema.sections) ? schema.sections : [];\n  return {\n    id: normalizeKey(schema.id),\n    title: typeof schema.title === 'string' ? schema.title : normalizeKey(schema.id),\n    dock: schema.dock ?? null,\n    sections: sections.map((section) => ({\n      id: normalizeKey(section?.id),\n      title: typeof section?.title === 'string' ? section.title : normalizeKey(section?.id),\n      items: Array.isArray(section?.items) ? section.items.slice() : [],\n    })),\n  };\n}\n\n/**\n * Return all state keys referenced by a panel schema.\n *\n * @public\n * @param {object} [schema] - Panel schema to inspect.\n * @returns {string[]} Unique state keys referenced by the schema.\n */\nexport function panelSchemaKeys(schema = {}) {\n  const normalized = normalizePanelSchema(schema);\n  const keys = [];\n  for (const section of normalized.sections) {\n    for (const item of section.items) collectItemKeys(item, keys);\n  }\n  return Array.from(new Set(keys));\n}\n\n/**\n * Compute the dirty status for a full panel schema.\n *\n * @public\n * @param {object} [schema] - Panel schema to inspect.\n * @param {HeliosStateManager|null} [stateManager] - State manager that tracks override status.\n * @returns {object} Panel-level and section-level status values.\n */\nexport function panelSchemaStatus(schema = {}, stateManager = null) {\n  const normalized = normalizePanelSchema(schema);\n  const sectionStatuses = {};\n  let changedSections = 0;\n  let partialSections = 0;\n  let populatedSections = 0;\n  for (const section of normalized.sections) {\n    const keys = [];\n    for (const item of section.items) collectItemKeys(item, keys);\n    if (!keys.length) {\n      sectionStatuses[section.id] = 'default';\n      continue;\n    }\n    populatedSections += 1;\n    const changed = keys.filter((key) => (stateManager?.status?.(key)?.state ?? 'default') !== 'default').length;\n    const state = changed <= 0 ? 'default' : (changed === keys.length ? 'changed' : 'partial');\n    sectionStatuses[section.id] = state;\n    if (state !== 'default') changedSections += 1;\n    if (state === 'partial') partialSections += 1;\n  }\n  const panelState = changedSections <= 0\n    ? 'default'\n    : (partialSections <= 0 && changedSections === populatedSections ? 'changed' : 'partial');\n  return {\n    panel: panelState,\n    sections: sectionStatuses,\n  };\n}\n\n/**\n * Return all state keys referenced by one panel schema section.\n *\n * @public\n * @param {object} [schema] - Panel schema to inspect.\n * @param {string} [sectionId] - Section id to inspect.\n * @returns {string[]} Unique state keys referenced by the section.\n */\nexport function panelSchemaSectionKeys(schema = {}, sectionId = '') {\n  const normalized = normalizePanelSchema(schema);\n  const id = normalizeKey(sectionId);\n  const section = normalized.sections.find((entry) => entry.id === id);\n  if (!section) return [];\n  const keys = [];\n  for (const item of section.items) collectItemKeys(item, keys);\n  return Array.from(new Set(keys));\n}\n\n/**\n * Compute the dirty status for one panel schema section.\n *\n * @public\n * @param {object} [schema] - Panel schema to inspect.\n * @param {string} [sectionId] - Section id to inspect.\n * @param {HeliosStateManager|null} [stateManager] - State manager that tracks override status.\n * @returns {string} Section status: `default`, `partial`, or `changed`.\n */\nexport function panelSchemaSectionStatus(schema = {}, sectionId = '', stateManager = null) {\n  const statuses = panelSchemaStatus(schema, stateManager);\n  const id = normalizeKey(sectionId);\n  return statuses.sections[id] ?? 'default';\n}\n\n/**\n * Create a DOM indicator that reflects dirty status for a panel schema.\n *\n * @public\n * @param {object} [options] - Indicator options.\n * @param {Helios} [options.helios] - Helios instance whose state manager is observed.\n * @param {object} [options.schema] - Panel schema to observe.\n * @param {string|null} [options.sectionId] - Optional section id to observe.\n * @param {Function|null} [options.attachTooltip] - Optional tooltip hook.\n * @returns {HTMLElement} Indicator element with a `destroy()` cleanup method.\n */\nexport function createPanelSchemaIndicator({\n  helios,\n  schema,\n  sectionId = null,\n  attachTooltip = null,\n} = {}) {\n  const indicator = document.createElement('span');\n  indicator.className = 'helios-ui-dirty-indicator helios-ui-dirty-indicator--schema';\n  indicator.dataset.state = 'default';\n  indicator.dataset.schema = normalizePanelSchema(schema).id;\n  indicator.setAttribute('aria-label', 'Persistence status');\n  indicator.setAttribute('aria-hidden', 'true');\n  if (sectionId != null) indicator.dataset.section = normalizeKey(sectionId);\n\n  const update = () => {\n    const stateManager = helios?.states ?? null;\n    let nextState = 'default';\n    if (sectionId != null) {\n      nextState = panelSchemaSectionStatus(schema, sectionId, stateManager);\n    } else {\n      nextState = panelSchemaStatus(schema, stateManager).panel;\n    }\n    if (indicator.dataset.state !== nextState) indicator.dataset.state = nextState;\n  };\n  const onChange = () => update();\n  const stateManager = helios?.states ?? null;\n  const schemaKeys = sectionId != null\n    ? panelSchemaSectionKeys(schema, sectionId)\n    : panelSchemaKeys(schema);\n  const stateUnsubscribers = typeof stateManager?.subscribe === 'function'\n    ? schemaKeys.map((key) => stateManager.subscribe(key, onChange, { immediate: false }))\n    : [];\n  if (!stateUnsubscribers.length) stateManager?.addEventListener?.('change', onChange);\n  stateManager?.addEventListener?.('config', onChange);\n  indicator.destroy = () => {\n    for (const unsubscribe of stateUnsubscribers) unsubscribe?.();\n    if (!stateUnsubscribers.length) stateManager?.removeEventListener?.('change', onChange);\n    stateManager?.removeEventListener?.('config', onChange);\n  };\n  attachTooltip?.(indicator, 'Shows whether this panel has session overrides.');\n  update();\n  return indicator;\n}\n\n/**\n * Built-in state schema for the Scene panel.\n *\n * @public\n */\nexport const SCENE_PANEL_SCHEMA = Object.freeze({\n  id: 'scene',\n  title: 'Scene',\n  dock: 'left',\n  sections: [\n    {\n      id: 'appearance',\n      title: 'Appearance',\n      items: [\n        'ui.theme',\n        'scene.dimension',\n        'appearance.background',\n        'appearance.edgeTransparencyMode',\n        'appearance.nodeStyle.sizeScale',\n        'appearance.nodeStyle.opacityScale',\n        'appearance.nodeStyle.outlineWidthScale',\n        'appearance.edgeStyle.widthScale',\n        'appearance.edgeStyle.opacityScale',\n        'appearance.edgeStyle.fastRendering',\n        { key: 'appearance.edgeStyle.adaptiveQuality.enabled', label: 'Adaptive Edges' },\n        { key: 'appearance.edgeStyle.adaptiveQuality.slowFrameThresholdMs', label: 'Slow Frame Threshold' },\n        { key: 'appearance.edgeStyle.adaptiveQuality.slowFrameConsecutiveFrames', label: 'Averaging Frames' },\n        { key: 'appearance.edgeStyle.adaptiveQuality.probeIntervalMs', label: 'Probe Interval' },\n        { key: 'appearance.edgeStyle.adaptiveQuality.interactionHoldMs', label: 'Interaction Hold' },\n        { key: 'appearance.edgeStyle.adaptiveQuality.fastDuringCamera', label: 'Fast During Camera' },\n        { key: 'appearance.edgeStyle.adaptiveQuality.fastDuringLayout', label: 'Fast During Layout' },\n        { type: 'custom', id: 'node-mappers', keyPrefix: 'mappers.node' },\n        { type: 'custom', id: 'edge-mappers', keyPrefix: 'mappers.edge' },\n        'appearance.shaded.enabled',\n        'appearance.shaded.nodes',\n        'appearance.shaded.edges',\n        'appearance.shaded.lightDirection',\n        'appearance.shaded.lightColor',\n        'appearance.shaded.ambientTopColor',\n        'appearance.shaded.ambientBottomColor',\n        'appearance.shaded.diffuseStrength',\n        'appearance.shaded.ambientStrength',\n        'appearance.shaded.specularColor',\n        'appearance.shaded.specularStrength',\n        'appearance.shaded.shininess',\n        'appearance.ambientOcclusion.enabled',\n        'appearance.ambientOcclusion.nodes',\n        'appearance.ambientOcclusion.edges',\n        'appearance.ambientOcclusion.strength',\n        'appearance.ambientOcclusion.radius',\n        'appearance.ambientOcclusion.bias',\n        'appearance.ambientOcclusion.mode',\n        'appearance.ambientOcclusion.intensityScale',\n        'appearance.ambientOcclusion.intensityShift',\n        'appearance.ambientOcclusion.quality',\n      ],\n    },\n    {\n      id: 'labels',\n      title: 'Labels',\n      items: [\n        'labels.mode',\n        'labels.enabled',\n        'labels.selectedOnlySpaceAware',\n        'labels.source',\n        'labels.maxVisible',\n        'labels.fontSizeScale',\n        'labels.minScreenRadius',\n        'labels.outlineWidth',\n        'labels.offsetRadiusFactor',\n        'labels.offsetPx',\n        'labels.maxChars',\n        'labels.maxRows',\n        'labels.fill',\n        'labels.outlineColor',\n        'labels.fontFamily',\n      ],\n    },\n    {\n      id: 'advanced',\n      title: 'Advanced',\n      items: [\n        'appearance.nodeStyle.sizeBase',\n        'appearance.nodeStyle.semanticZoomExponent',\n        'appearance.nodeStyle.opacityBase',\n        'appearance.nodeStyle.outlineWidthBase',\n        'appearance.edgeStyle.widthBase',\n        'appearance.edgeStyle.opacityBase',\n        'appearance.edgeStyle.endpointTrim',\n        'appearance.supersampling',\n        'appearance.nodeStyle.blendWithEdges',\n        'appearance.edgeStyle.depthWrite',\n        'appearance.edgeStyle.clampToNodeDiameter',\n      ],\n    },\n  ],\n});\n\n/**\n * Built-in state schema for the Labels panel.\n *\n * @public\n */\nexport const LABELS_PANEL_SCHEMA = Object.freeze({\n  id: 'labels',\n  title: 'Labels',\n  dock: 'right',\n  sections: [\n    {\n      id: 'visibility',\n      title: 'Visibility',\n      items: [\n        'labels.mode',\n        'labels.enabled',\n        'labels.selectedOnlySpaceAware',\n        'labels.source',\n      ],\n    },\n    {\n      id: 'limits',\n      title: 'Limits',\n      items: [\n        'labels.maxVisible',\n        'labels.minScreenRadius',\n        'labels.maxChars',\n        'labels.maxRows',\n      ],\n    },\n    {\n      id: 'style',\n      title: 'Style',\n      items: [\n        'labels.fontSizeScale',\n        'labels.outlineWidth',\n        'labels.offsetRadiusFactor',\n        'labels.offsetPx',\n        'labels.fill',\n        'labels.outlineColor',\n        'labels.fontFamily',\n      ],\n    },\n  ],\n});\n\n/**\n * Built-in state schema for the Legends panel.\n *\n * @public\n */\nexport const LEGENDS_PANEL_SCHEMA = Object.freeze({\n  id: 'legends',\n  title: 'Legends',\n  dock: 'right',\n  sections: [\n    {\n      id: 'visibility',\n      title: 'Visibility',\n      items: [\n        'legends.enabled',\n        'legends.respectDockInsets',\n        'legends.showNodeColor',\n        'legends.showDensity',\n        'legends.showEdgeColor',\n        'legends.showNodeSize',\n        'legends.showEdgeWidth',\n      ],\n    },\n    {\n      id: 'layout',\n      title: 'Layout',\n      items: [\n        { key: 'legends.maxChars', inputMax: 512, suggested: [0, 64] },\n        { key: 'legends.maxRows', inputMax: 8, suggested: [1, 8] },\n        { key: 'legends.scale', inputMax: 3, suggested: [0.6, 3] },\n        { key: 'legends.continuousHeight', inputMax: 320, suggested: [72, 320], step: 4 },\n      ],\n    },\n    {\n      id: 'custom',\n      title: 'Custom',\n      items: [\n        { type: 'custom', id: 'legend-titles', keyPrefix: 'legends.titles' },\n        { type: 'custom', id: 'legend-placements', keyPrefix: 'legends.placements' },\n      ],\n    },\n  ],\n});\n\n/**\n * Built-in state schema for the Mappers panel.\n *\n * @public\n */\nexport const MAPPERS_PANEL_SCHEMA = Object.freeze({\n  id: 'mappers',\n  title: 'Mappers',\n  dock: 'right',\n  sections: [\n    {\n      id: 'nodes',\n      title: 'Nodes',\n      items: [\n        { type: 'custom', id: 'node-mapper-editor', keyPrefix: 'mappers.node' },\n        { key: 'mappers.node.color', label: 'Node Color' },\n        { key: 'mappers.node.size', label: 'Node Size' },\n        { key: 'mappers.node.opacity', label: 'Node Opacity' },\n        { key: 'mappers.node.outline', label: 'Node Outline' },\n        { key: 'mappers.node.outlineColor', label: 'Node Outline Color' },\n        { key: 'mappers.node.position', label: 'Node Position' },\n      ],\n    },\n    {\n      id: 'edges',\n      title: 'Edges',\n      items: [\n        { type: 'custom', id: 'edge-mapper-editor', keyPrefix: 'mappers.edge' },\n        { key: 'mappers.edge.color', label: 'Edge Color' },\n        { key: 'mappers.edge.width', label: 'Edge Width' },\n        { key: 'mappers.edge.opacity', label: 'Edge Opacity' },\n      ],\n    },\n  ],\n});\n\n/**\n * Built-in state schema for the Filters panel.\n *\n * @public\n */\nexport const FILTERS_PANEL_SCHEMA = Object.freeze({\n  id: 'filters',\n  title: 'Filters',\n  dock: 'right',\n  sections: [\n    {\n      id: 'nodes',\n      title: 'Nodes',\n      items: [\n        { type: 'custom', id: 'node-filter-editor', keyPrefix: 'filters.rules' },\n      ],\n    },\n    {\n      id: 'edges',\n      title: 'Edges',\n      items: [\n        { type: 'custom', id: 'edge-filter-editor', keyPrefix: 'filters.rules' },\n      ],\n    },\n    {\n      id: 'runtime',\n      title: 'Runtime',\n      items: [\n        'filters.enabled',\n        'filters.scope',\n        'filters.rules',\n        'filters.minComponentSize',\n      ],\n    },\n  ],\n});\n\n/**\n * Built-in state schema for the Layout panel.\n *\n * @public\n */\nexport const LAYOUT_PANEL_SCHEMA = Object.freeze({\n  id: 'layout',\n  title: 'Layout',\n  dock: 'right',\n  sections: [\n    {\n      id: 'runtime',\n      title: 'Runtime',\n      items: [\n        'layout.layoutType',\n        'layout.running',\n        'layout.pauseOnInteraction',\n      ],\n    },\n    {\n      id: 'parameters',\n      title: 'Parameters',\n      items: [\n        { type: 'custom', id: 'layout-parameters', keyPrefix: 'layout.parameters' },\n      ],\n    },\n  ],\n});\n\n/**\n * Built-in state schema for the Selection panel.\n *\n * @public\n */\nexport const SELECTION_PANEL_SCHEMA = Object.freeze({\n  id: 'selection',\n  title: 'Selection',\n  dock: 'right',\n  sections: [\n    {\n      id: 'current',\n      title: 'Current',\n      items: [\n        'selection.selectedNodes',\n        'selection.selectedEdges',\n        'selection.savedSelectionAttribute',\n      ],\n    },\n    {\n      id: 'selectors',\n      title: 'Selectors',\n      items: [\n        { type: 'custom', id: 'node-selector-editor', keyPrefix: 'selection.selectors' },\n        'selection.selectors.node.rules',\n      ],\n    },\n    {\n      id: 'interaction',\n      title: 'Interaction',\n      items: [\n        'selection.nodeClick',\n        'selection.edgeClick',\n        'selection.selectedConnectedEdges',\n      ],\n    },\n    {\n      id: 'style',\n      title: 'Style',\n      items: [\n        'selection.otherSelectedNodeStyle',\n        'selection.otherSelectedEdgeStyle',\n        'selection.otherSelectedNodeTone',\n        'selection.otherSelectedEdgeTone',\n      ],\n    },\n  ],\n});\n","import { createFpsThrottle } from './createFpsThrottle.js';\n\nexport class TwoHandleRange {\n  constructor({ min, max, value, step, onChange, onCommit, allowRangeDrag = true }) {\n    this.element = document.createElement('div');\n    this.element.className = 'helios-ui-range2';\n\n    const track = document.createElement('div');\n    track.className = 'helios-ui-range2__track';\n    const bar = document.createElement('div');\n    bar.className = 'helios-ui-range2__bar';\n    const rangeEl = document.createElement('div');\n    rangeEl.className = 'helios-ui-range2__range';\n    track.appendChild(bar);\n    track.appendChild(rangeEl);\n\n    const aInput = document.createElement('input');\n    aInput.type = 'range';\n    aInput.className = 'helios-ui-slider helios-ui-range2__input';\n    const bInput = document.createElement('input');\n    bInput.type = 'range';\n    bInput.className = 'helios-ui-slider helios-ui-range2__input';\n\n    const syncRanges = () => {\n      aInput.min = String(min);\n      aInput.max = String(max);\n      aInput.step = String(step);\n      bInput.min = String(min);\n      bInput.max = String(max);\n      bInput.step = String(step);\n    };\n    syncRanges();\n\n    const clampTo = (v) => {\n      const n = Number(v);\n      if (!Number.isFinite(n)) return null;\n      const snappedMin = Math.abs(n - min) <= step / 2 ? min : n;\n      const snappedMax = Math.abs(snappedMin - max) <= step / 2 ? max : snappedMin;\n      return Math.max(min, Math.min(max, snappedMax));\n    };\n\n    const setVisual = (lo, hi) => {\n      const span = max - min;\n      const loPct = span === 0 ? 0 : ((lo - min) / span) * 100;\n      const hiPct = span === 0 ? 100 : ((hi - min) / span) * 100;\n      track.style.setProperty('--min-pct', String(Math.max(0, Math.min(100, loPct))));\n      track.style.setProperty('--max-pct', String(Math.max(0, Math.min(100, hiPct))));\n    };\n    this.setVisual = setVisual;\n\n    const seedLo = clampTo(value?.[0] ?? min) ?? min;\n    const seedHi = clampTo(value?.[1] ?? max) ?? max;\n    const lo0 = Math.min(seedLo, seedHi);\n    const hi0 = Math.max(seedLo, seedHi);\n    aInput.value = String(lo0);\n    bInput.value = String(hi0);\n    setVisual(lo0, hi0);\n    const emitChange = createFpsThrottle((lo, hi) => {\n      onChange?.([lo, hi]);\n    });\n    const emitCommit = (lo, hi) => {\n      onCommit?.([lo, hi]);\n    };\n\n    const commit = (source) => {\n      const a = clampTo(aInput.value);\n      const b = clampTo(bInput.value);\n      if (a == null || b == null) return;\n      const lo = Math.min(a, b);\n      const hi = Math.max(a, b);\n      if (source === 'a' && a > hi) aInput.value = String(hi);\n      if (source === 'b' && b < lo) bInput.value = String(lo);\n      setVisual(lo, hi);\n      emitChange(lo, hi);\n      return [lo, hi];\n    };\n\n    const flushCommit = (source) => {\n      const committed = commit(source);\n      emitChange.flush();\n      if (committed) emitCommit(...committed);\n    };\n\n    // Dragging the highlighted range pans both thumbs together.\n    const onRangePointerDown = (event) => {\n      if (event.button != null && event.button !== 0) return;\n      event.preventDefault();\n\n      const rect = track.getBoundingClientRect();\n      const widthPx = Math.max(1, rect.width);\n      const domainSpan = max - min;\n      if (!Number.isFinite(domainSpan) || Math.abs(domainSpan) < 1e-9) return;\n\n      const startX = event.clientX;\n      const startA = clampTo(aInput.value) ?? min;\n      const startB = clampTo(bInput.value) ?? max;\n      const startLo = Math.min(startA, startB);\n      const startHi = Math.max(startA, startB);\n      const rangeSpan = startHi - startLo;\n\n      const clampRangeToBounds = (lo, hi) => {\n        let nextLo = lo;\n        let nextHi = hi;\n        if (nextLo < min) {\n          const shift = min - nextLo;\n          nextLo = min;\n          nextHi += shift;\n        }\n        if (nextHi > max) {\n          const shift = nextHi - max;\n          nextHi = max;\n          nextLo -= shift;\n        }\n        if (nextLo < min) nextLo = min;\n        if (nextHi > max) nextHi = max;\n        if (Number.isFinite(rangeSpan) && rangeSpan >= 0) {\n          const currentSpan = nextHi - nextLo;\n          if (currentSpan !== rangeSpan) {\n            nextHi = nextLo + rangeSpan;\n            if (nextHi > max) {\n              nextHi = max;\n              nextLo = Math.max(min, max - rangeSpan);\n            }\n          }\n        }\n        return [nextLo, nextHi];\n      };\n\n      const onMove = (moveEvent) => {\n        const dxPx = moveEvent.clientX - startX;\n        const delta = (dxPx / widthPx) * domainSpan;\n        const [nextLo, nextHi] = clampRangeToBounds(startLo + delta, startHi + delta);\n        aInput.value = String(nextLo);\n        bInput.value = String(nextHi);\n        setVisual(nextLo, nextHi);\n        emitChange(nextLo, nextHi);\n      };\n\n      const onUp = () => {\n        window.removeEventListener('pointermove', onMove);\n        window.removeEventListener('pointerup', onUp);\n        window.removeEventListener('pointercancel', onUp);\n        emitChange.flush();\n        const a = clampTo(aInput.value);\n        const b = clampTo(bInput.value);\n        if (a == null || b == null) return;\n        emitCommit(Math.min(a, b), Math.max(a, b));\n      };\n\n      window.addEventListener('pointermove', onMove);\n      window.addEventListener('pointerup', onUp);\n      window.addEventListener('pointercancel', onUp);\n    };\n\n    const onAInput = () => commit('a');\n    const onBInput = () => commit('b');\n    const onAChange = () => flushCommit('a');\n    const onBChange = () => flushCommit('b');\n    if (allowRangeDrag) {\n      rangeEl.addEventListener('pointerdown', onRangePointerDown);\n    }\n    aInput.addEventListener('input', onAInput);\n    bInput.addEventListener('input', onBInput);\n    aInput.addEventListener('change', onAChange);\n    bInput.addEventListener('change', onBChange);\n\n    this._destroy = () => {\n      emitChange.cancel();\n      if (allowRangeDrag) {\n        rangeEl.removeEventListener('pointerdown', onRangePointerDown);\n      }\n      aInput.removeEventListener('input', onAInput);\n      bInput.removeEventListener('input', onBInput);\n      aInput.removeEventListener('change', onAChange);\n      bInput.removeEventListener('change', onBChange);\n      this.element.remove();\n    };\n\n    this.aInput = aInput;\n    this.bInput = bInput;\n\n    track.appendChild(aInput);\n    track.appendChild(bInput);\n    this.element.appendChild(track);\n  }\n\n  destroy() {\n    this._destroy?.();\n    this._destroy = null;\n  }\n}\n","import { createFpsThrottle } from './createFpsThrottle.js';\n\nfunction clamp(value, min, max) {\n  return Math.max(min, Math.min(max, value));\n}\n\nfunction updateSliderVisual(slider) {\n  if (!slider) return;\n  const min = Number(slider.min);\n  const max = Number(slider.max);\n  const value = Number(slider.value);\n  if (!Number.isFinite(min) || !Number.isFinite(max) || !Number.isFinite(value) || min === max) return;\n  const pct = ((value - min) / (max - min)) * 100;\n  slider.style.setProperty('--pct', String(clamp(pct, 0, 100)));\n}\n\nfunction defaultFormat(value, digits = 2) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return '';\n  const abs = Math.abs(numeric);\n  if ((abs > 0 && abs < 0.01) || abs >= 10000) {\n    return numeric.toExponential(Math.max(1, digits - 1));\n  }\n  return numeric.toFixed(digits);\n}\n\nfunction clampFinite(value, min, max, fallback) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return fallback;\n  return clamp(numeric, min, max);\n}\n\nexport class LogSliderControls {\n  constructor({\n    value,\n    minExp,\n    maxExp,\n    stepExp = 0.05,\n    minValue = null,\n    maxValue = null,\n    inputMin = null,\n    inputMax = null,\n    digits = 2,\n    format = null,\n    onCommit = null,\n  }) {\n    this.minExp = Number(minExp);\n    this.maxExp = Number(maxExp);\n    this.minValue = Number.isFinite(minValue) ? Number(minValue) : Math.pow(10, this.minExp);\n    this.maxValue = Number.isFinite(maxValue) ? Number(maxValue) : Math.pow(10, this.maxExp);\n    this.inputMin = Number.isFinite(inputMin) ? Number(inputMin) : this.minValue;\n    this.inputMax = Number.isFinite(inputMax) ? Number(inputMax) : this.maxValue;\n    this.format = typeof format === 'function' ? format : (next) => defaultFormat(next, digits);\n    this.onCommit = onCommit;\n\n    this.element = document.createElement('div');\n    this.element.className = 'helios-ui-slider-controls';\n\n    this.slider = document.createElement('input');\n    this.slider.type = 'range';\n    this.slider.className = 'helios-ui-slider';\n    this.slider.min = String(this.minExp);\n    this.slider.max = String(this.maxExp);\n    this.slider.step = String(stepExp);\n\n    this.input = document.createElement('input');\n    this.input.type = 'number';\n    this.input.className = 'helios-ui-number';\n    this.input.step = 'any';\n    this.input.min = String(this.inputMin);\n    this.input.max = String(this.inputMax);\n\n    this.element.appendChild(this.slider);\n    this.element.appendChild(this.input);\n\n    this.setValue(value ?? this.minValue);\n    this._commitSliderValue = createFpsThrottle((nextValue) => {\n      this.onCommit?.(nextValue);\n    });\n\n    this._syncInputFromSlider = () => {\n      const numeric = this.valueFromExp(this.slider.value);\n      this.input.value = this.format(numeric);\n      updateSliderVisual(this.slider);\n      return numeric;\n    };\n\n    this._onSliderInput = () => {\n      const numeric = this._syncInputFromSlider();\n      this._commitSliderValue(numeric);\n    };\n    this._onSliderChange = () => {\n      const numeric = this._syncInputFromSlider();\n      this._commitSliderValue(numeric);\n      this._commitSliderValue.flush();\n    };\n    this._onInputCommit = () => {\n      const numeric = Number(this.input.value);\n      if (!Number.isFinite(numeric)) return;\n      const clamped = clamp(numeric, this.inputMin, this.inputMax);\n      this.setValue(clamped);\n      this.onCommit?.(clamped);\n    };\n    this._onInputKeyDown = (event) => {\n      if (event.key !== 'Enter') return;\n      this._onInputCommit();\n      this.input.blur();\n    };\n\n    this.slider.addEventListener('input', this._onSliderInput);\n    this.slider.addEventListener('change', this._onSliderChange);\n    this.input.addEventListener('change', this._onInputCommit);\n    this.input.addEventListener('keydown', this._onInputKeyDown);\n  }\n\n  clampExp(exp) {\n    return clamp(Number(exp), this.minExp, this.maxExp);\n  }\n\n  expFromValue(value) {\n    const numeric = Number(value);\n    const safe = Number.isFinite(numeric) ? clamp(numeric, this.minValue, this.maxValue) : this.minValue;\n    return this.clampExp(Math.log10(Math.max(this.minValue, safe)));\n  }\n\n  valueFromExp(exp) {\n    return clamp(Math.pow(10, this.clampExp(exp)), this.minValue, this.maxValue);\n  }\n\n  setValue(nextValue) {\n    const typed = clampFinite(nextValue, this.inputMin, this.inputMax, this.minValue);\n    const sliderSource = typed > 0 ? typed : this.minValue;\n    const exp = this.expFromValue(sliderSource);\n    const actual = this.valueFromExp(exp);\n    this.slider.value = String(exp);\n    this.input.value = this.format(Number.isFinite(Number(nextValue)) ? typed : actual);\n    updateSliderVisual(this.slider);\n  }\n\n  destroy() {\n    this._commitSliderValue?.cancel?.();\n    this.slider.removeEventListener('input', this._onSliderInput);\n    this.slider.removeEventListener('change', this._onSliderChange);\n    this.input.removeEventListener('change', this._onInputCommit);\n    this.input.removeEventListener('keydown', this._onInputKeyDown);\n    this.element.remove();\n  }\n}\n\nexport default LogSliderControls;\n","import { resolveColormap } from '../../colors/colormaps.js';\n\nfunction clamp01(value) {\n  if (!Number.isFinite(value)) return 0;\n  if (value < 0) return 0;\n  if (value > 1) return 1;\n  return value;\n}\n\nfunction rgbaToCss(rgba, alphaOverride) {\n  const r = Math.round(255 * clamp01(rgba?.[0] ?? 0));\n  const g = Math.round(255 * clamp01(rgba?.[1] ?? 0));\n  const b = Math.round(255 * clamp01(rgba?.[2] ?? 0));\n  const a = alphaOverride ?? clamp01(rgba?.[3] ?? 1);\n  return `rgba(${r}, ${g}, ${b}, ${a})`;\n}\n\nconst gradientCache = new Map();\n\nexport function colormapToCssGradient(nameOrDescriptor, options = {}) {\n  const resolved = resolveColormap(nameOrDescriptor);\n  if (!resolved?.interpolate) return null;\n\n  const samples = Math.max(2, Math.floor(options.samples ?? 24));\n  const alpha = options.alpha;\n  const direction = options.direction ?? '90deg';\n  const cacheKey = `${resolved.name}|${alpha ?? 'auto'}|${samples}|${direction}`;\n  const cached = gradientCache.get(cacheKey);\n  if (cached) return cached;\n\n  const stops = [];\n  const denom = samples - 1;\n  for (let i = 0; i < samples; i += 1) {\n    const t = denom === 0 ? 0 : i / denom;\n    const rgba = resolved.interpolate(t);\n    const css = rgbaToCss(rgba, alpha);\n    stops.push(`${css} ${(t * 100).toFixed(2)}%`);\n  }\n\n  const gradient = `linear-gradient(${direction}, ${stops.join(', ')})`;\n  gradientCache.set(cacheKey, gradient);\n  return gradient;\n}\n\nexport function getColormapSource(nameOrDescriptor) {\n  const resolved = resolveColormap(nameOrDescriptor);\n  return resolved?.source ?? null;\n}\n\n","import { colormapToCssGradient } from '../utils/colormapPreview.js';\n\nconst DEFAULT_GROUP_ORDER = ['d3', 'cmasher', 'CET', 'helios', 'other'];\n\nfunction fallbackGradient() {\n  return 'linear-gradient(90deg, rgba(120,120,120,1), rgba(40,40,40,1))';\n}\n\nfunction thumbPlaceholderGradient() {\n  return 'linear-gradient(90deg, rgba(60,60,60,1), rgba(30,30,30,1))';\n}\n\nexport class ColormapPickerControl {\n  constructor({\n    catalog,\n    portalRoot = null,\n    value = null,\n    fallbackValue = 'interpolateInferno',\n    searchPlaceholder = 'Search colormaps…',\n    groupOrder = DEFAULT_GROUP_ORDER,\n    formatDisplay = null,\n    filters = [],\n    onChange = null,\n  } = {}) {\n    this.catalog = catalog ?? { entries: [], byKey: new Map() };\n    this.portalRoot = portalRoot;\n    this.fallbackValue = String(fallbackValue ?? 'interpolateInferno');\n    this.groupOrder = Array.isArray(groupOrder) && groupOrder.length ? [...groupOrder] : [...DEFAULT_GROUP_ORDER];\n    this.formatDisplay = typeof formatDisplay === 'function'\n      ? formatDisplay\n      : ((entry, key) => (entry ? `${entry.group}: ${entry.label}` : key));\n    this.onChange = typeof onChange === 'function' ? onChange : null;\n    this.filterStates = new Map();\n    this.filters = Array.isArray(filters)\n      ? filters\n          .filter((filter) => filter && typeof filter.id === 'string' && typeof filter.predicate === 'function')\n          .map((filter) => {\n            const id = filter.id;\n            this.filterStates.set(id, filter.active === true);\n            return {\n              id,\n              label: String(filter.label ?? id),\n              title: filter.title != null ? String(filter.title) : '',\n              predicate: filter.predicate,\n            };\n          })\n      : [];\n    this.value = null;\n    this.lastQuery = '';\n\n    this.element = document.createElement('div');\n    this.element.className = 'helios-ui-colormap-picker';\n\n    this.display = document.createElement('button');\n    this.display.type = 'button';\n    this.display.className = 'helios-ui-select helios-ui-colormap-picker__display';\n    this.display.dataset.interfaceFocusControl = 'true';\n\n    this.displayLabel = document.createElement('span');\n    this.displayLabel.className = 'helios-ui-ellipsis';\n    this.display.appendChild(this.displayLabel);\n\n    this.preview = document.createElement('div');\n    this.preview.className = 'helios-ui-colormap-picker__preview helios-ui-colormap-thumb';\n    this.preview.dataset.interfaceFocusControl = 'true';\n\n    this.popover = document.createElement('div');\n    this.popover.className = 'helios-ui-colormap-popover';\n    this.popover.hidden = true;\n\n    this.popoverPanel = document.createElement('div');\n    this.popoverPanel.className = 'helios-ui-colormap-popover__panel';\n    this.popover.appendChild(this.popoverPanel);\n\n    this.popoverHeader = document.createElement('div');\n    this.popoverHeader.className = 'helios-ui-colormap-popover__header';\n\n    this.searchInput = document.createElement('input');\n    this.searchInput.type = 'text';\n    this.searchInput.className = 'helios-ui-text helios-ui-colormap-popover__search';\n    this.searchInput.placeholder = String(searchPlaceholder ?? 'Search colormaps…');\n    this.popoverHeader.appendChild(this.searchInput);\n\n    this.filterBar = document.createElement('div');\n    this.filterBar.className = 'helios-ui-colormap-popover__filters';\n    this.filterButtons = new Map();\n    for (const filter of this.filters) {\n      const button = document.createElement('button');\n      button.type = 'button';\n      button.className = 'helios-ui-colormap-popover__filter';\n      button.dataset.interfaceFocusControl = 'true';\n      button.textContent = filter.label;\n      button.title = filter.title;\n      button.dataset.filterId = filter.id;\n      button.dataset.active = this.filterStates.get(filter.id) === true ? 'true' : 'false';\n      button.setAttribute('aria-pressed', this.filterStates.get(filter.id) === true ? 'true' : 'false');\n      button.addEventListener('click', () => {\n        this.setFilterActive(filter.id, this.filterStates.get(filter.id) !== true);\n      });\n      this.filterBar.appendChild(button);\n      this.filterButtons.set(filter.id, button);\n    }\n    this.filterBar.hidden = this.filters.length === 0;\n    this.popoverHeader.appendChild(this.filterBar);\n    this.popoverPanel.appendChild(this.popoverHeader);\n\n    this.popoverList = document.createElement('div');\n    this.popoverList.className = 'helios-ui-colormap-popover__list';\n    this.popoverPanel.appendChild(this.popoverList);\n\n    this.element.appendChild(this.display);\n    this.element.appendChild(this.preview);\n    this._ensurePortalRoot();\n\n    this.cleanups = [];\n    this.thumbObserver = null;\n\n    this.addCleanup(() => this.popover.remove());\n\n    const onDocPointerDown = (event) => {\n      const target = event.target;\n      if (this.popover.hidden) return;\n      if (target && (this.popover.contains(target) || this.element.contains(target))) return;\n      this.closePopover();\n    };\n\n    let pendingPosition = false;\n    const schedulePosition = () => {\n      if (pendingPosition) return;\n      pendingPosition = true;\n      requestAnimationFrame(() => {\n        pendingPosition = false;\n        this.positionPopover();\n      });\n    };\n\n    const onDocScroll = (event) => {\n      if (this.popover.hidden) return;\n      const target = event?.target;\n      if (target && this.popoverPanel.contains(target)) return;\n      schedulePosition();\n    };\n\n    const onDisplayClick = () => this.openPopover();\n    const onDisplayKeyDown = (event) => {\n      if (event.key === 'Enter' || event.key === ' ') {\n        event.preventDefault();\n        this.openPopover();\n        return;\n      }\n      if (event.key && event.key.length === 1 && !event.metaKey && !event.ctrlKey && !event.altKey) {\n        event.preventDefault();\n        this.openPopover({ seedQuery: event.key });\n      }\n    };\n\n    const onSearchInput = () => {\n      this.lastQuery = String(this.searchInput.value ?? '');\n      this.renderPopover(this.searchInput.value);\n      this.positionPopover();\n    };\n\n    const onSearchKeyDown = (event) => {\n      if (event.key === 'Escape') {\n        this.closePopover();\n        this.display.focus();\n        return;\n      }\n      if (event.key === 'Enter' && (this.searchInput.value ?? '').trim()) {\n        this.closePopover();\n        const typed = String(this.searchInput.value ?? '').trim();\n        if (this.catalog.byKey.has(typed)) this.selectValue(typed, { emit: true });\n      }\n    };\n\n    const onElementFocusOut = () => {\n      queueMicrotask(() => {\n        if (!this.element.contains(document.activeElement) && !this.popover.contains(document.activeElement)) {\n          this.closePopover();\n        }\n      });\n    };\n\n    document.addEventListener('pointerdown', onDocPointerDown, true);\n    document.addEventListener('scroll', onDocScroll, true);\n    window.addEventListener('resize', schedulePosition);\n    this.display.addEventListener('click', onDisplayClick);\n    this.display.addEventListener('keydown', onDisplayKeyDown);\n    this.preview.addEventListener('click', onDisplayClick);\n    this.searchInput.addEventListener('input', onSearchInput);\n    this.searchInput.addEventListener('keydown', onSearchKeyDown);\n    this.element.addEventListener('focusout', onElementFocusOut);\n\n    this.addCleanup(() => document.removeEventListener('pointerdown', onDocPointerDown, true));\n    this.addCleanup(() => document.removeEventListener('scroll', onDocScroll, true));\n    this.addCleanup(() => window.removeEventListener('resize', schedulePosition));\n    this.addCleanup(() => this.display.removeEventListener('click', onDisplayClick));\n    this.addCleanup(() => this.display.removeEventListener('keydown', onDisplayKeyDown));\n    this.addCleanup(() => this.preview.removeEventListener('click', onDisplayClick));\n    this.addCleanup(() => this.searchInput.removeEventListener('input', onSearchInput));\n    this.addCleanup(() => this.searchInput.removeEventListener('keydown', onSearchKeyDown));\n    this.addCleanup(() => this.element.removeEventListener('focusout', onElementFocusOut));\n    this.addCleanup(() => {\n      this.thumbObserver?.disconnect?.();\n      this.thumbObserver = null;\n    });\n\n    this.selectValue(value ?? this.fallbackValue, { emit: false });\n  }\n\n  addCleanup(fn) {\n    if (typeof fn === 'function') this.cleanups.push(fn);\n  }\n\n  _ensurePortalRoot() {\n    const nextRoot = this.portalRoot ?? this.element.closest?.('.helios-ui') ?? document.body;\n    if (!nextRoot) return;\n    if (this.popover.parentElement !== nextRoot) nextRoot.appendChild(this.popover);\n  }\n\n  _syncFocusMetadata() {\n    const scope = this.element.closest?.('.helios-ui-row') ?? null;\n    if (scope) {\n      if (!scope.dataset.interfaceFocusScopeId) {\n        scope.dataset.interfaceFocusScopeId = `helios-ui-scope-${Math.random().toString(16).slice(2)}`;\n      }\n      this.popover.dataset.interfaceFocusScopeId = scope.dataset.interfaceFocusScopeId;\n    } else {\n      delete this.popover.dataset.interfaceFocusScopeId;\n    }\n    const panelId = this.element.closest?.('.helios-ui-panel')?.dataset?.panelId ?? '';\n    if (panelId) this.popover.dataset.interfacePanelId = panelId;\n    else delete this.popover.dataset.interfacePanelId;\n  }\n\n  resolveEntry(keyRaw) {\n    const key = String(keyRaw ?? '').trim();\n    if (!key) return null;\n    return this.catalog.byKey.get(key) ?? null;\n  }\n\n  applySelectionToUi(keyRaw) {\n    const key = String(keyRaw ?? '').trim() || this.fallbackValue;\n    this.value = key;\n    const entry = this.resolveEntry(key);\n    const text = this.formatDisplay(entry, key);\n    this.displayLabel.textContent = text;\n    this.display.title = text;\n    this.display.dataset.colormapKey = key;\n    const gradient = colormapToCssGradient(key, { samples: 32, alpha: 1 });\n    this.preview.style.backgroundImage = gradient ?? fallbackGradient();\n  }\n\n  selectValue(keyRaw, { emit = false } = {}) {\n    const key = String(keyRaw ?? '').trim() || this.fallbackValue;\n    this.applySelectionToUi(key);\n    if (emit) this.onChange?.(key);\n  }\n\n  setValue(keyRaw) {\n    this.selectValue(keyRaw, { emit: false });\n  }\n\n  setFilterActive(id, active, { render = true } = {}) {\n    if (!this.filterStates.has(id)) return;\n    const next = active === true;\n    this.filterStates.set(id, next);\n    const button = this.filterButtons.get(id);\n    if (button) {\n      button.dataset.active = next ? 'true' : 'false';\n      button.setAttribute('aria-pressed', next ? 'true' : 'false');\n    }\n    if (render && !this.popover.hidden) {\n      this.renderPopover(this.searchInput.value);\n      this.positionPopover();\n      this.scrollSelectedItemIntoView();\n    }\n  }\n\n  applyEntryFilters(entries) {\n    let filtered = entries;\n    for (const filter of this.filters) {\n      if (this.filterStates.get(filter.id) !== true) continue;\n      filtered = filtered.filter((entry) => {\n        try {\n          return filter.predicate(entry) === true;\n        } catch (_) {\n          return false;\n        }\n      });\n    }\n    return filtered;\n  }\n\n  ensureThumbObserver() {\n    if (this.thumbObserver) return this.thumbObserver;\n    if (typeof IntersectionObserver !== 'function') return null;\n\n    this.thumbObserver = new IntersectionObserver((entries) => {\n      for (const entry of entries) {\n        if (!entry.isIntersecting) continue;\n        const element = entry.target;\n        const key = element?.dataset?.colormapKey;\n        if (!key) continue;\n        if (element.dataset.colormapReady === '1') continue;\n        element.dataset.colormapReady = '1';\n        const gradient = colormapToCssGradient(key, { samples: 28, alpha: 1 });\n        element.style.backgroundImage = gradient ?? fallbackGradient();\n        this.thumbObserver.unobserve(element);\n      }\n    }, { root: this.popoverPanel, rootMargin: '64px' });\n\n    return this.thumbObserver;\n  }\n\n  renderPopover(queryRaw) {\n    this.popoverList.replaceChildren();\n\n    const query = String(queryRaw ?? '').trim().toLowerCase();\n    const tokens = query.split(/\\s+/).filter(Boolean);\n\n    const textMatches = tokens.length\n      ? this.catalog.entries.filter((entry) => tokens.every((token) => entry.search.includes(token)))\n      : this.catalog.entries;\n    const matches = this.applyEntryFilters(textMatches);\n\n    if (!matches.length) {\n      const note = document.createElement('div');\n      note.className = 'helios-ui-colormap-picker__note';\n      note.textContent = 'No matches.';\n      this.popoverList.appendChild(note);\n      return;\n    }\n\n    const matchesByGroup = new Map();\n    for (const entry of matches) {\n      const list = matchesByGroup.get(entry.group) ?? [];\n      list.push(entry);\n      matchesByGroup.set(entry.group, list);\n    }\n    for (const list of matchesByGroup.values()) {\n      list.sort((a, b) => a.label.localeCompare(b.label));\n    }\n\n    const capPerGroup = tokens.length ? 60 : 5000;\n    const capTotal = tokens.length ? 220 : 5000;\n    let total = 0;\n    const observer = this.ensureThumbObserver();\n\n    for (const group of this.groupOrder) {\n      const list = matchesByGroup.get(group);\n      if (!list?.length) continue;\n\n      const section = document.createElement('div');\n      section.className = 'helios-ui-colormap-section';\n\n      const title = document.createElement('div');\n      title.className = 'helios-ui-colormap-section__title';\n      title.textContent = group;\n      section.appendChild(title);\n\n      const body = document.createElement('div');\n      body.className = 'helios-ui-colormap-section__body';\n\n      const visible = list.slice(0, capPerGroup);\n      for (const entry of visible) {\n        if (total >= capTotal) break;\n        total += 1;\n\n        const item = document.createElement('button');\n        item.type = 'button';\n        item.className = 'helios-ui-colormap-picker__item';\n        item.dataset.interfaceFocusControl = 'true';\n        item.dataset.key = entry.key;\n        item.dataset.colormapSource = entry.source ?? entry.group ?? '';\n        item.dataset.colormapKind = entry.kind ?? (entry.isScheme === true ? 'scheme' : 'ramp');\n        item.dataset.colormapScheme = entry.isScheme === true ? 'true' : 'false';\n        const selected = entry.key === this.value;\n        item.dataset.selected = selected ? 'true' : 'false';\n        item.setAttribute('aria-selected', selected ? 'true' : 'false');\n\n        const itemTitle = document.createElement('div');\n        itemTitle.className = 'helios-ui-colormap-picker__item-title helios-ui-ellipsis';\n        itemTitle.textContent = entry.label;\n        itemTitle.title = entry.key;\n\n        const itemThumb = document.createElement('div');\n        itemThumb.className = 'helios-ui-colormap-thumb helios-ui-colormap-thumb--small';\n        itemThumb.dataset.colormapKey = entry.key;\n        itemThumb.dataset.colormapReady = '0';\n        itemThumb.style.backgroundImage = thumbPlaceholderGradient();\n        observer?.observe?.(itemThumb);\n\n        item.appendChild(itemTitle);\n        item.appendChild(itemThumb);\n        item.addEventListener('pointerdown', (event) => {\n          event.preventDefault();\n          this.selectValue(entry.key, { emit: true });\n          this.closePopover();\n        });\n\n        body.appendChild(item);\n      }\n\n      if (list.length > capPerGroup) {\n        const note = document.createElement('div');\n        note.className = 'helios-ui-colormap-picker__note';\n        note.textContent = `Showing ${capPerGroup} of ${list.length} in ${group}.`;\n        body.appendChild(note);\n      }\n\n      section.appendChild(body);\n      this.popoverList.appendChild(section);\n      if (total >= capTotal) break;\n    }\n\n    if (matches.length > capTotal) {\n      const note = document.createElement('div');\n      note.className = 'helios-ui-colormap-picker__note';\n      note.textContent = `Showing ${capTotal} of ${matches.length}. Refine your search.`;\n      this.popoverList.appendChild(note);\n    }\n  }\n\n  positionPopover() {\n    if (this.popover.hidden) return;\n\n    const OFFSET = 6;\n    const MARGIN = 10;\n    const MIN_HEIGHT = 180;\n    const MIN_WIDTH = 240;\n    const MAX_WIDTH = 420;\n    const MAX_HEIGHT = 420;\n\n    const anchor = this.display.getBoundingClientRect();\n    const vw = window.innerWidth;\n    const vh = window.innerHeight;\n\n    const spaceBelow = vh - anchor.bottom - MARGIN;\n    const spaceAbove = anchor.top - MARGIN;\n    const spaceRight = vw - anchor.right - MARGIN;\n    const spaceLeft = anchor.left - MARGIN;\n\n    const targetW = Math.max(MIN_WIDTH, Math.min(MAX_WIDTH, anchor.width));\n    this.popover.style.width = `${targetW}px`;\n    this.popover.style.left = '0px';\n    this.popover.style.top = '0px';\n    this.popover.hidden = false;\n    this.popoverPanel.style.height = '';\n    this.popoverPanel.style.maxHeight = '';\n\n    const measured = this.popoverPanel.getBoundingClientRect();\n    const desiredW = measured.width || Math.max(MIN_WIDTH, Math.min(MAX_WIDTH, anchor.width));\n    const desiredH = this.popoverPanel.scrollHeight || measured.height || MIN_HEIGHT;\n\n    const canVertical = Math.max(spaceBelow, spaceAbove) >= MIN_HEIGHT;\n    const preferBelow = spaceBelow >= spaceAbove;\n    const canHorizontal = Math.max(spaceRight, spaceLeft) >= MIN_WIDTH;\n    const preferRight = spaceRight >= spaceLeft;\n\n    let placement = 'bottom';\n    if (canVertical) {\n      placement = preferBelow ? 'bottom' : 'top';\n    } else if (canHorizontal) {\n      placement = preferRight ? 'right' : 'left';\n    } else {\n      const best = [\n        { side: 'bottom', size: spaceBelow },\n        { side: 'top', size: spaceAbove },\n        { side: 'right', size: spaceRight },\n        { side: 'left', size: spaceLeft },\n      ].sort((a, b) => b.size - a.size)[0];\n      placement = best?.side ?? 'bottom';\n    }\n\n    let left = anchor.left;\n    let top = anchor.bottom + OFFSET;\n\n    if (placement === 'top') {\n      top = Math.max(MARGIN, anchor.top - OFFSET - Math.min(desiredH, Math.max(80, spaceAbove)));\n    } else if (placement === 'right') {\n      left = anchor.right + OFFSET;\n      top = anchor.top;\n    } else if (placement === 'left') {\n      left = Math.max(MARGIN, anchor.left - OFFSET - desiredW);\n      top = anchor.top;\n    }\n\n    left = Math.max(MARGIN, Math.min(vw - MARGIN - desiredW, left));\n    top = Math.max(MARGIN, Math.min(vh - MARGIN - 80, top));\n\n    this.popover.style.width = `${Math.min(desiredW, vw - 2 * MARGIN)}px`;\n    this.popover.style.left = `${left}px`;\n    this.popover.style.top = `${top}px`;\n\n    const bottomLimit = placement === 'top' ? Math.max(MARGIN, anchor.top - OFFSET) : vh - MARGIN;\n    const availableH = Math.max(120, bottomLimit - top);\n    const stableH = Math.min(MAX_HEIGHT, availableH);\n    this.popoverPanel.style.height = `${stableH}px`;\n    this.popoverPanel.style.maxHeight = `${stableH}px`;\n    this.popoverList.style.maxHeight = '';\n  }\n\n  openPopover({ seedQuery } = {}) {\n    this._ensurePortalRoot();\n    this._syncFocusMetadata();\n    this.popover.hidden = false;\n    this.searchInput.value = seedQuery != null ? String(seedQuery) : this.lastQuery;\n    this.lastQuery = this.searchInput.value;\n    this.renderPopover(this.searchInput.value);\n    this.positionPopover();\n    this.scrollSelectedItemIntoView();\n    queueMicrotask(() => this.searchInput.focus());\n  }\n\n  closePopover() {\n    this.popover.hidden = true;\n    this.lastQuery = String(this.searchInput.value ?? '');\n  }\n\n  scrollSelectedItemIntoView() {\n    const selected = this.popoverList.querySelector('.helios-ui-colormap-picker__item[data-selected=\"true\"]');\n    if (!selected) return;\n    requestAnimationFrame(() => {\n      selected.scrollIntoView({ block: 'nearest' });\n    });\n  }\n\n  destroy() {\n    for (const cleanup of this.cleanups.splice(0)) {\n      try {\n        cleanup();\n      } catch (error) {\n        console.warn('[HeliosUI][ColormapPicker] Cleanup failed.', error);\n      }\n    }\n    this.element.remove();\n  }\n}\n\nexport default ColormapPickerControl;\n","export function clampNumber(value, { min = null, max = null } = {}) {\n  if (value == null) return null;\n  const n = Number(value);\n  if (!Number.isFinite(n)) return null;\n  const clampedMin = min == null ? n : Math.max(Number(min), n);\n  const clampedMax = max == null ? clampedMin : Math.min(Number(max), clampedMin);\n  if (!Number.isFinite(clampedMax)) return null;\n  return clampedMax;\n}\n\n","function hexToRgb01(value) {\n  if (typeof value !== 'string') return null;\n  const raw = value.trim().replace(/^#/, '');\n  if (!/^[0-9a-f]{3,8}$/i.test(raw)) return null;\n  const expand = (c) => `${c}${c}`;\n  let r; let g; let b;\n  if (raw.length === 3) {\n    r = parseInt(expand(raw[0]), 16);\n    g = parseInt(expand(raw[1]), 16);\n    b = parseInt(expand(raw[2]), 16);\n  } else if (raw.length >= 6) {\n    r = parseInt(raw.slice(0, 2), 16);\n    g = parseInt(raw.slice(2, 4), 16);\n    b = parseInt(raw.slice(4, 6), 16);\n  } else {\n    return null;\n  }\n  if (![r, g, b].every(Number.isFinite)) return null;\n  return [r / 255, g / 255, b / 255];\n}\n\nexport function toHex8(hex6, alpha01 = 1) {\n  const rgb = hexToRgb01(hex6);\n  if (!rgb) return '#000000ff';\n  const a = Math.round(Math.max(0, Math.min(1, Number(alpha01))) * 255);\n  const aa = a.toString(16).padStart(2, '0');\n  const raw = String(hex6).trim();\n  const base = raw.startsWith('#') ? raw.slice(1) : raw;\n  const normalized = base.length === 3\n    ? base.split('').map((c) => `${c}${c}`).join('')\n    : base.slice(0, 6).padEnd(6, '0');\n  return `#${normalized}${aa}`;\n}\n\n","export function isPublicAttributeName(name) {\n  if (typeof name !== 'string') return false;\n  if (name.startsWith('_')) return false;\n  return true;\n}\n\n","export function shallowCloneChannelConfig(config) {\n  if (!config) return null;\n  return {\n    ...config,\n    meta: config.meta && typeof config.meta === 'object' ? { ...config.meta } : config.meta,\n    attributes: config.attributes ?? config.from,\n    clamp: config.clamp && typeof config.clamp === 'object' ? { ...config.clamp } : config.clamp,\n    domain: Array.isArray(config.domain) ? [...config.domain] : config.domain,\n    range: Array.isArray(config.range) ? [...config.range] : config.range,\n    rules: Array.isArray(config.rules) ? config.rules.map((r) => ({ ...r })) : [],\n  };\n}\n","import { AttributeType } from 'helios-network';\nimport { PanelStack } from './PanelStack.js';\nimport { createAlignedRowEl } from '../controls/createAlignedRowEl.js';\nimport { createTooltipManager } from '../controls/createTooltipManager.js';\nimport { createToggleControl } from '../controls/createToggleControl.js';\nimport { createSegmentedToggleControl } from '../controls/createSegmentedToggleControl.js';\nimport { SuggestedSliderControls } from '../controls/SuggestedSliderControls.js';\nimport { TwoHandleRange } from '../controls/TwoHandleRange.js';\nimport { LogSliderControls } from '../controls/LogSliderControls.js';\nimport { ColormapPickerControl } from '../controls/ColormapPickerControl.js';\nimport { colormaps, resolveColormap, colormapToScheme } from '../../colors/colormaps.js';\nimport { VISUAL_ATTRIBUTE_MAP } from '../../pipeline/constants.js';\nimport { clampNumber } from '../utils/numbers.js';\nimport { toHex8 } from '../utils/colors.js';\nimport { isPublicAttributeName } from '../utils/attributes.js';\nimport { shallowCloneChannelConfig } from '../utils/channelConfig.js';\nimport { MAPPERS_PANEL_SCHEMA } from './panelSchema.js';\n\nconst DIVERGING_D3_COLORMAPS = new Set([\n  'interpolateBrBG',\n  'interpolatePRGn',\n  'interpolatePiYG',\n  'interpolatePuOr',\n  'interpolateRdBu',\n  'interpolateRdGy',\n  'interpolateRdYlBu',\n  'interpolateRdYlGn',\n  'interpolateSpectral',\n]);\n\nconst DIVERGING_CMASHER_COLORMAPS = new Set([\n  'cmasher_copper',\n  'cmasher_emergency',\n  'cmasher_fusion',\n  'cmasher_guppy',\n  'cmasher_holly',\n  'cmasher_iceburn',\n  'cmasher_infinity',\n  'cmasher_neutral',\n  'cmasher_pride',\n  'cmasher_prinsenvlag',\n  'cmasher_redshift',\n  'cmasher_seasons',\n  'cmasher_viola',\n  'cmasher_voltage',\n  'cmasher_waterlily',\n  'cmasher_watermelon',\n]);\n\nfunction isDivergingColormapKey(key) {\n  const raw = String(key ?? '').trim();\n  if (!raw) return false;\n  const canonical = raw.startsWith('cmasher:')\n    ? `cmasher_${raw.slice('cmasher:'.length)}`\n    : raw;\n  if (DIVERGING_D3_COLORMAPS.has(canonical)) return true;\n  if (DIVERGING_CMASHER_COLORMAPS.has(canonical)) return true;\n  if (/^CET_D\\d/i.test(canonical)) return true;\n  return /(^|[-_:])Diverg/i.test(canonical);\n}\n\nfunction buildColormapCatalog() {\n  const entries = [];\n\n  const pushEntry = ({ key, label, group, searchExtras = [] }) => {\n    if (!key) return;\n    const safeLabel = String(label ?? key);\n    const diverging = isDivergingColormapKey(key);\n    const terms = new Set([\n      String(key),\n      safeLabel,\n      String(group ?? ''),\n      String(group ?? '').toLowerCase(),\n      diverging ? 'diverging' : '',\n      ...searchExtras.map((v) => String(v)),\n      ...searchExtras.map((v) => String(v).toLowerCase()),\n    ].filter(Boolean));\n    entries.push({\n      key: String(key),\n      label: safeLabel,\n      group: String(group ?? 'other'),\n      diverging,\n      search: Array.from(terms).join(' ').toLowerCase(),\n    });\n  };\n\n  for (const [key, desc] of Object.entries(colormaps?.d3 ?? {})) {\n    if (desc?.isScheme) continue;\n    if (key.startsWith('scheme')) continue;\n    const label = key.startsWith('interpolate') ? key.slice('interpolate'.length) : key;\n    pushEntry({ key, label, group: 'd3', searchExtras: ['d3:', 'interpolate', 'scheme'] });\n  }\n\n  for (const [key, desc] of Object.entries(colormaps?.cmasher ?? {})) {\n    if (desc?.isScheme) continue;\n    const label = key.startsWith('cmasher_') ? key.slice('cmasher_'.length) : key;\n    const alias = key.startsWith('cmasher_') ? `cmasher:${label}` : key;\n    pushEntry({ key: alias, label, group: 'cmasher', searchExtras: [key, 'cmasher:', 'cmasher_'] });\n  }\n\n  for (const [key, desc] of Object.entries(colormaps?.CET ?? {})) {\n    if (desc?.isScheme) continue;\n    const label = key.startsWith('CET_') ? key.slice('CET_'.length) : key;\n    pushEntry({ key, label, group: 'CET', searchExtras: ['CET:'] });\n  }\n\n  for (const [key, desc] of Object.entries(colormaps?.helios ?? {})) {\n    if (desc?.isScheme) continue;\n    pushEntry({ key, label: key, group: 'helios', searchExtras: ['helios:'] });\n  }\n\n  const byGroup = new Map();\n  const byKey = new Map();\n  for (const entry of entries) {\n    let list = byGroup.get(entry.group);\n    if (!list) {\n      list = [];\n      byGroup.set(entry.group, list);\n    }\n    list.push(entry);\n    byKey.set(entry.key, entry);\n  }\n\n  for (const list of byGroup.values()) {\n    list.sort((a, b) => a.label.localeCompare(b.label));\n  }\n\n  return { entries, byGroup, byKey };\n}\n\nexport function resolveCategoricalPaletteCatalogGroup(source) {\n  const normalized = String(source ?? '').trim();\n  return normalized || 'other';\n}\n\nexport function shouldShowCategoricalPaletteEntry(entry, preferScheme) {\n  return !preferScheme || entry?.isScheme === true;\n}\n\nexport function resolveCategoricalDefaultPalette(entries = []) {\n  return entries.find((entry) => entry?.key === 'category18')?.key\n    || entries.find((entry) => entry?.isScheme)?.key\n    || 'category18';\n}\n\nfunction buildCategoricalPaletteCatalog() {\n  const entries = [];\n  const pushEntry = ({ key, label, source, isScheme }) => {\n    if (!key) return;\n    const scheme = Boolean(isScheme);\n    const group = resolveCategoricalPaletteCatalogGroup(source);\n    entries.push({\n      key,\n      label: String(label ?? key),\n      group,\n      source: group,\n      isScheme: scheme,\n      kind: scheme ? 'scheme' : 'ramp',\n    });\n  };\n\n  for (const [key, desc] of Object.entries(colormaps?.d3 ?? {})) {\n    const isScheme = Boolean(desc?.isScheme);\n    const label = key.startsWith('scheme') ? key.slice('scheme'.length) : key;\n    pushEntry({ key, label, source: 'd3', isScheme });\n  }\n\n  for (const [key, desc] of Object.entries(colormaps?.cmasher ?? {})) {\n    const isScheme = Boolean(desc?.isScheme);\n    const label = key.startsWith('cmasher_') ? key.slice('cmasher_'.length) : key;\n    const alias = key.startsWith('cmasher_') ? `cmasher:${label}` : key;\n    pushEntry({ key: alias, label, source: 'cmasher', isScheme });\n  }\n\n  for (const [key, desc] of Object.entries(colormaps?.CET ?? {})) {\n    const isScheme = Boolean(desc?.isScheme);\n    const label = key.startsWith('CET_') ? key.slice('CET_'.length) : key;\n    pushEntry({ key, label, source: 'CET', isScheme });\n  }\n\n  for (const [key, desc] of Object.entries(colormaps?.helios ?? {})) {\n    const isScheme = Boolean(desc?.isScheme);\n    pushEntry({\n      key,\n      label: key,\n      source: 'helios',\n      isScheme,\n    });\n  }\n\n  entries.sort((a, b) => a.label.localeCompare(b.label));\n  return entries;\n}\n\nfunction isHexColorString(value) {\n  if (typeof value !== 'string') return false;\n  const hex = value.trim();\n  return /^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(hex);\n}\n\nfunction rgbaToHex8(rgba) {\n  if (!Array.isArray(rgba) && !ArrayBuffer.isView(rgba)) return '#000000ff';\n  const r = Math.round(Math.max(0, Math.min(1, Number(rgba[0] ?? 0))) * 255);\n  const g = Math.round(Math.max(0, Math.min(1, Number(rgba[1] ?? 0))) * 255);\n  const b = Math.round(Math.max(0, Math.min(1, Number(rgba[2] ?? 0))) * 255);\n  const a = Math.round(Math.max(0, Math.min(1, Number(rgba[3] ?? 1))) * 255);\n  return `#${[r, g, b, a].map((v) => v.toString(16).padStart(2, '0')).join('')}`;\n}\n\nfunction colorFromIndex(index = 0) {\n  const hue = (index * 137.508) % 360;\n  const s = 0.6;\n  const l = 0.55;\n  const a = s * Math.min(l, 1 - l);\n  const f = (n) => {\n    const k = (n + hue / 30) % 12;\n    const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n    return Math.round(255 * color);\n  };\n  return `#${[f(0), f(8), f(4), 255].map((v) => v.toString(16).padStart(2, '0')).join('')}`;\n}\n\nfunction naturalCompare(a, b) {\n  const left = String(a ?? '');\n  const right = String(b ?? '');\n  const re = /\\d+|\\D+/g;\n  const aParts = left.match(re) ?? [];\n  const bParts = right.match(re) ?? [];\n  const len = Math.max(aParts.length, bParts.length);\n  for (let i = 0; i < len; i += 1) {\n    const av = aParts[i] ?? '';\n    const bv = bParts[i] ?? '';\n    const aNum = Number(av);\n    const bNum = Number(bv);\n    const aIsNum = av && Number.isFinite(aNum);\n    const bIsNum = bv && Number.isFinite(bNum);\n    if (aIsNum && bIsNum && aNum !== bNum) return aNum - bNum;\n    if (aIsNum !== bIsNum) return aIsNum ? -1 : 1;\n    if (av !== bv) return av.localeCompare(bv);\n  }\n  return left.localeCompare(right);\n}\n\nexport function isSpecialNoneCategoryLabel(value) {\n  if (value == null) return true;\n  const normalized = String(value).trim().toLowerCase();\n  return normalized === 'none' || normalized === 'null';\n}\n\nfunction isSpecialNoneCategoryEntry(entry) {\n  if (!entry || typeof entry !== 'object') return false;\n  if (entry.specialNone === true) return true;\n  if (Object.prototype.hasOwnProperty.call(entry, 'rawLabel')) {\n    return isSpecialNoneCategoryLabel(entry.rawLabel);\n  }\n  return isSpecialNoneCategoryLabel(entry.label);\n}\n\nexport function orderCategoricalEntries(entries, {\n  sortOrder = 'frequency',\n  manualOrder = [],\n  maxCategories = null,\n} = {}) {\n  const list = Array.isArray(entries) ? entries.slice() : [];\n  if (!list.length) return [];\n\n  if (sortOrder === 'alphabetical') {\n    list.sort((a, b) => String(a?.label ?? '').localeCompare(String(b?.label ?? '')));\n  } else if (sortOrder === 'natural') {\n    list.sort((a, b) => naturalCompare(a?.label, b?.label));\n  } else if (sortOrder === 'manual') {\n    const byId = new Map(list.map((entry) => [entry.id, entry]));\n    const ordered = manualOrder.map((id) => byId.get(id)).filter(Boolean);\n    const seen = new Set(ordered.map((entry) => entry.id));\n    for (const entry of list) {\n      if (!seen.has(entry.id)) ordered.push(entry);\n    }\n    list.splice(0, list.length, ...ordered);\n  } else {\n    list.sort((a, b) => (Number(b?.count ?? 0) - Number(a?.count ?? 0)) || String(a?.label ?? '').localeCompare(String(b?.label ?? '')));\n  }\n\n  const capped = maxCategories != null && Number.isFinite(Number(maxCategories))\n    ? Math.max(1, Math.min(list.length, Math.floor(Number(maxCategories))))\n    : list.length;\n  const regular = list.filter((entry) => !isSpecialNoneCategoryEntry(entry));\n  const specialNone = list.filter((entry) => isSpecialNoneCategoryEntry(entry));\n  let visible = list.slice(0, capped);\n\n  // Keep special None/null categories inside Others whenever overflow already exists,\n  // unless doing so would collapse the entire visible list.\n  if (capped < list.length && regular.length > 0 && specialNone.length > 0) {\n    visible = regular.slice(0, capped);\n  }\n\n  const visibleRegular = [];\n  const visibleSpecialNone = [];\n  for (const entry of visible) {\n    if (isSpecialNoneCategoryEntry(entry)) visibleSpecialNone.push(entry);\n    else visibleRegular.push(entry);\n  }\n  return visibleRegular.concat(visibleSpecialNone);\n}\n\nfunction warnMappersUiDerivationFailure(message, detail) {\n  if (!import.meta.env?.DEV) return;\n  console.warn(`[HeliosUI][MappersPanel] ${message}`, detail);\n}\n\nconst isNumericAttributeType = (type) =>\n  type === AttributeType.Boolean ||\n  type === AttributeType.Float ||\n  type === AttributeType.Integer ||\n  type === AttributeType.UnsignedInteger ||\n  type === AttributeType.Double ||\n  type === AttributeType.BigInteger ||\n  type === AttributeType.UnsignedBigInteger;\nconst isIntegerAttributeType = (type) =>\n  type === AttributeType.Integer ||\n  type === AttributeType.UnsignedInteger ||\n  type === AttributeType.BigInteger ||\n  type === AttributeType.UnsignedBigInteger;\nconst isCategoricalAttributeType = (type) => type === AttributeType.Category;\nconst isStringAttributeType = (type) => type === AttributeType.String;\n\nexport class MappersPanel {\n  constructor(ui, options = {}) {\n    this.ui = ui;\n    this.helios = ui?.helios ?? null;\n    this.options = options;\n  }\n\n  create() {\n    const ui = this.ui;\n    const helios = this.helios;\n    const mappersBehavior = helios?.behavior?.mappers ?? helios?.useBehavior?.('mappers');\n    const net = () => helios?.network ?? null;\n    const options = this.options ?? {};\n    const showDistributions = options.showDistributions !== false;\n\n    const tooltips = createTooltipManager();\n    ui._controlCleanups.add(() => tooltips.destroy());\n\n    const createAlignedRow = ({ title, hint, controls }) => createAlignedRowEl({\n      title,\n      hint,\n      controls,\n      attachTooltip: tooltips.attachTooltip,\n    });\n\n      const createAlignedActionRow = ({ title, hint, controls, action }) => {\n      const row = document.createElement('div');\n      row.className = 'helios-ui-row helios-ui-row--aligned';\n      const label = document.createElement('div');\n      label.className = 'helios-ui-label';\n      const titleRowEl = document.createElement('div');\n      titleRowEl.className = 'helios-ui-label__title-row';\n      const titleEl = document.createElement('div');\n      titleEl.className = 'helios-ui-label__title';\n      titleEl.textContent = title ?? '';\n      titleRowEl.appendChild(titleEl);\n      if (action) titleRowEl.appendChild(action);\n      label.appendChild(titleRowEl);\n      if (hint) tooltips.attachTooltip?.(titleEl, hint);\n\n      row.appendChild(label);\n      const controlWrap = document.createElement('div');\n      controlWrap.className = 'helios-ui-row__controls';\n      if (controls) controlWrap.appendChild(controls);\n      row.appendChild(controlWrap);\n      return { row, titleEl, controlWrap };\n    };\n\n    const CHANNEL_LABELS = {\n      color: 'Color',\n      size: 'Size',\n      outline: 'Outline Width',\n      outlineColor: 'Outline Color',\n      position: 'Position',\n      width: 'Width',\n      opacity: 'Opacity',\n      endpointSize: 'Endpoint Size',\n    };\n\n    const MAPPER_TYPE_LABELS = {\n      layout: 'Layout',\n      constant: 'Constant',\n      passthrough: 'Passthrough',\n      nodeAttribute: 'Node Passthrough',\n      nodeToEdge: 'Node Passthrough',\n      linear: 'Scale',\n      colormap: 'Colormap',\n      categorical: 'Categorical',\n    };\n\n    const nodeChannels = ['color', 'size', 'outline', 'outlineColor', 'position'];\n    // Edge endpoint channels are node-derived and intentionally not exposed in the UI.\n    const edgeChannels = ['color', 'width', 'opacity'];\n\n    const colormapCatalog = buildColormapCatalog();\n    const categoricalPaletteCatalog = buildCategoricalPaletteCatalog();\n    const defaultCategoricalPalette = resolveCategoricalDefaultPalette(categoricalPaletteCatalog);\n\n    let customPresetCounter = 1;\n    const customPresetsByMode = {\n      node: new Map(),\n      edge: new Map(),\n    };\n\n    const getCustomPresetMap = (mode, channel) => {\n      const modeMap = customPresetsByMode[mode];\n      if (!modeMap) return new Map();\n      let byChannel = modeMap.get(channel);\n      if (!byChannel) {\n        byChannel = new Map();\n        modeMap.set(channel, byChannel);\n      }\n      return byChannel;\n    };\n\n\t    const isEditorTransferableConfig = (config) => {\n\t      if (!config) return false;\n\t      const type = config.type ?? config.mode ?? null;\n\t      if (type === 'layout') return true;\n\t      if (type === 'nodeToEdge') return true;\n\n\t      const rules = Array.isArray(config.rules) ? config.rules : [];\n\t      const supportedRules =\n\t        rules.length === 0 ||\n\t        rules.every((rule) => {\n\t          const ui = rule?.__ui && typeof rule.__ui === 'object' ? rule.__ui : null;\n\t          if (!ui) return false;\n\t          if (typeof rule.when !== 'function') return false;\n\t          // MVP: constant output rules only.\n\t          return rule.value !== undefined;\n\t        });\n\t      if (!supportedRules) return false;\n\n      // Any custom function makes the config non-roundtrippable for now.\n      if (typeof config.transform === 'function' && !config.transformType) return false;\n      if (typeof config.scale === 'function') return false;\n\n      // Cache/internal fields like __colormapScale are ignored.\n      if (type === 'constant') return true;\n      if (type === 'passthrough') return true;\n      if (type === 'linear') return true;\n      if (type === 'nodeAttribute') return true;\n      if (type === 'categorical') return true;\n\n      if (type === 'colormap' || config.colormap) {\n        // Only support selecting named colormaps in the editor for now.\n        return typeof (config.colormap ?? config.scale ?? config.range) === 'string';\n      }\n\n      return false;\n    };\n\n    const isEphemeralCustomPreset = (config) => {\n      if (!config) return false;\n      if (isEditorTransferableConfig(config)) return false;\n      const meta = config.meta && typeof config.meta === 'object' ? config.meta : null;\n      if (!meta) return true;\n      const keys = Object.keys(meta);\n      if (!keys.length) return true;\n      const hasLabel =\n        (typeof meta.name === 'string' && meta.name.trim()) ||\n        (typeof meta.source === 'string' && meta.source.trim()) ||\n        (typeof meta.description === 'string' && meta.description.trim());\n      return !hasLabel;\n    };\n\n    const registerCustomPreset = (mode, channel, config) => {\n      if (!config) return null;\n      const meta = config.meta && typeof config.meta === 'object' ? config.meta : {};\n      const preferredName = typeof meta.name === 'string' ? meta.name.trim() : '';\n      const baseId = preferredName || `custom-${customPresetCounter++}`;\n      const ephemeral = isEphemeralCustomPreset(config);\n\n      const byId = getCustomPresetMap(mode, channel);\n      let id = baseId;\n      if (byId.has(id)) {\n        const existing = byId.get(id);\n        if (existing?.config === config) return id;\n        let n = 2;\n        while (byId.has(`${baseId} (${n})`)) n += 1;\n        id = `${baseId} (${n})`;\n      }\n\n      byId.set(id, {\n        id,\n        label: preferredName || 'custom',\n        ephemeral,\n        config: shallowCloneChannelConfig(config) ?? config,\n      });\n      return id;\n    };\n\n    const pruneEphemeralCustomPresets = (mode, channel) => {\n      const byId = getCustomPresetMap(mode, channel);\n      for (const [id, preset] of byId.entries()) {\n        if (preset?.ephemeral) byId.delete(id);\n      }\n    };\n\n    const resolveVisualAlias = (name) => {\n      if (typeof name !== 'string') return name;\n      return VISUAL_ATTRIBUTE_MAP[name] ?? name;\n    };\n\n    const getAttributeInfo = (scope, rawName) => {\n      const network = net();\n      if (!network) return null;\n      if (rawName === '$index') return { dimension: 1, type: null };\n      if (typeof rawName !== 'string' || !rawName.length) return null;\n\n      if (scope === 'edge' && rawName.startsWith('@node.')) {\n        const key = rawName.slice('@node.'.length);\n        const resolved = resolveVisualAlias(key);\n        try {\n          return network.getNodeAttributeInfo?.(resolved) ?? null;\n        } catch (_) {\n          return null;\n        }\n      }\n\n      const resolved = resolveVisualAlias(rawName);\n      try {\n        return scope === 'edge'\n          ? (network.getEdgeAttributeInfo?.(resolved) ?? null)\n          : (network.getNodeAttributeInfo?.(resolved) ?? null);\n      } catch (_) {\n        return null;\n      }\n    };\n\n    const isCompatibleAttribute = (scope, channel, mapperType, name, { targetMode } = {}) => {\n      const info = getAttributeInfo(scope, name);\n      if (!info) return false;\n      const dim = info.dimension ?? 1;\n      if (mapperType === 'categorical') {\n        if (scope === 'edge' && typeof name === 'string' && /^@nodes?\\./.test(name)) return false;\n        if (dim !== 1) return false;\n        return isCategoricalAttributeType(info.type) || isStringAttributeType(info.type);\n      }\n\n      if (info.type != null && !isNumericAttributeType(info.type)) return false;\n      const isEdge = scope === 'edge';\n      const edgeContext = isEdge || targetMode === 'edge';\n      const isColorChannel = channel === 'color' || channel === 'outlineColor';\n      const isPositionChannel = scope === 'node' && channel === 'position';\n      const isScalarChannel =\n        channel === 'size' ||\n        channel === 'outline' ||\n        channel === 'width' ||\n        channel === 'opacity' ||\n        channel === 'endpointSize';\n\n      if (mapperType === 'colormap') {\n        return dim === 1;\n      }\n\n      if (mapperType === 'linear') {\n        return dim === 1;\n      }\n\n      if (mapperType === 'nodeAttribute') {\n        if (isColorChannel) {\n          if (edgeContext) return dim === 4;\n          return dim === 3 || dim === 4;\n        }\n        if (isScalarChannel) return dim === 1;\n        return false;\n      }\n\n      if (mapperType === 'passthrough') {\n        if (isPositionChannel) {\n          return dim === 3;\n        }\n        if (isColorChannel) {\n          if (isEdge && typeof name === 'string' && /^@nodes?\\./.test(name)) return false;\n          if (isEdge) return dim === 4 || dim === 8;\n          return dim === 3 || dim === 4;\n        }\n        if (isScalarChannel) {\n          if (isEdge) return dim === 1 || dim === 2;\n          return dim === 1;\n        }\n        return false;\n      }\n\n      return true;\n    };\n\n    const listAttributeNames = (scope, { channel, mapperType, targetMode } = {}) => {\n      const network = net();\n      if (!network) return [];\n      const getNames = scope === 'edge' ? network.getEdgeAttributeNames : network.getNodeAttributeNames;\n      if (typeof getNames !== 'function') return [];\n      let raw = [];\n      try {\n        raw = getNames.call(network) ?? [];\n      } catch (_) {\n        return [];\n      }\n      const out = [];\n\n      out.push('$index');\n      if (scope === 'node') {\n        out.push('color', 'size', 'outline', 'outlineColor', 'position');\n      }\n\n      for (const name of raw) {\n        if (typeof name !== 'string') continue;\n        if (!isPublicAttributeName(name)) continue;\n        out.push(name);\n      }\n\n      const wantsNodeProxy = scope === 'edge' && mapperType !== 'passthrough';\n      if (wantsNodeProxy && typeof network.getNodeAttributeNames === 'function') {\n        let nodeRaw = [];\n        try {\n          nodeRaw = network.getNodeAttributeNames() ?? [];\n        } catch (_) {\n          nodeRaw = [];\n        }\n        for (const name of nodeRaw) {\n          if (typeof name !== 'string') continue;\n          if (!isPublicAttributeName(name)) continue;\n          out.push(`@node.${name}`);\n        }\n      }\n\n      const unique = Array.from(new Set(out));\n      unique.sort((a, b) => {\n        if (a === '$index') return -1;\n        if (b === '$index') return 1;\n        return a.localeCompare(b);\n      });\n\n      if (channel && mapperType) {\n        return unique.filter((name) => isCompatibleAttribute(scope, channel, mapperType, name, { targetMode }));\n      }\n      return unique;\n    };\n\n    const CONSTANT_SOURCE = '$constant';\n    const LAYOUT_SOURCE = '$layout';\n\n    const resolveSourceLabel = (name) => {\n      if (name === CONSTANT_SOURCE) return 'Fixed value';\n      if (name === LAYOUT_SOURCE) return 'Layout positions';\n      if (name === '$index') return 'Index';\n      if (typeof name === 'string' && name.startsWith('@node.')) return `Node: ${name.slice('@node.'.length)}`;\n      return name;\n    };\n\n    const resolveSourceGroupLabel = (name) => {\n      if (name === CONSTANT_SOURCE || name === LAYOUT_SOURCE || name === '$index') return 'Special sources';\n      if (typeof name === 'string' && name.startsWith('@node.')) return 'Node attributes';\n      return 'Attributes';\n    };\n\n    const appendGroupedSourceOptions = (select, sources) => {\n      const groups = new Map([\n        ['Special sources', []],\n        ['Attributes', []],\n        ['Node attributes', []],\n      ]);\n      for (const source of sources) {\n        const group = resolveSourceGroupLabel(source);\n        const list = groups.get(group) ?? [];\n        list.push(source);\n        groups.set(group, list);\n      }\n\n      for (const [label, values] of groups.entries()) {\n        if (!values.length) continue;\n        const optgroup = document.createElement('optgroup');\n        optgroup.label = label;\n        for (const source of values) {\n          const opt = document.createElement('option');\n          opt.value = source;\n          opt.textContent = resolveSourceLabel(source);\n          optgroup.appendChild(opt);\n        }\n        select.appendChild(optgroup);\n      }\n    };\n\n    const listMapperSources = (mode, channel) => {\n      const network = net();\n      const out = [CONSTANT_SOURCE];\n      if (mode === 'node' && channel === 'position') out.push(LAYOUT_SOURCE);\n\n      out.push(...listAttributeNames(mode, { channel }));\n\n      if (mode === 'edge' && typeof network?.getNodeAttributeNames === 'function') {\n        out.push('@node.color', '@node.size', '@node.outline', '@node.outlineColor', '@node.position');\n        let nodeRaw = [];\n        try {\n          nodeRaw = network.getNodeAttributeNames() ?? [];\n        } catch (_) {\n          nodeRaw = [];\n        }\n        for (const name of nodeRaw) {\n          if (typeof name !== 'string') continue;\n          if (!isPublicAttributeName(name)) continue;\n          out.push(`@node.${name}`);\n        }\n      }\n\n      const unique = Array.from(new Set(out));\n      unique.sort((a, b) => {\n        if (a === CONSTANT_SOURCE) return -1;\n        if (b === CONSTANT_SOURCE) return 1;\n        if (a === LAYOUT_SOURCE) return -1;\n        if (b === LAYOUT_SOURCE) return 1;\n        if (a === '$index') return -1;\n        if (b === '$index') return 1;\n        return a.localeCompare(b);\n      });\n      return unique;\n    };\n\n    const inferSourceFromConfig = (config) => {\n      if (!config) return null;\n      const type = config.type ?? config.mode ?? null;\n      if (type === 'constant') return CONSTANT_SOURCE;\n      if (type === 'layout') return LAYOUT_SOURCE;\n      if ((type === 'nodeAttribute' || type === 'nodeToEdge') && typeof config.nodeAttribute === 'string' && config.nodeAttribute.length) {\n        return `@node.${config.nodeAttribute}`;\n      }\n      const attrs = config.attributes ?? config.from;\n      if (typeof attrs === 'string' && attrs.length) return attrs;\n      if (Array.isArray(attrs)) {\n        const nodeAttr = attrs.find((value) => typeof value === 'string' && /^@nodes?\\./.test(value));\n        if (nodeAttr) return nodeAttr.replace(/^@nodes?\\./, '@node.');\n        const first = attrs.find((value) => typeof value === 'string' && value.length);\n        if (first) return first;\n      }\n      return null;\n    };\n\n    const normalizeNodeSourceName = (source) => {\n      if (typeof source !== 'string') return '';\n      if (source.startsWith('@node.')) return source.slice('@node.'.length);\n      if (source.startsWith('@nodes.')) return source.slice('@nodes.'.length);\n      return source;\n    };\n\n    const resolveAllowedTypesForSource = (mode, channel, source, channelTypes = []) => {\n      if (source === CONSTANT_SOURCE) return channelTypes.includes('constant') ? ['constant'] : [];\n      if (source === LAYOUT_SOURCE) return channelTypes.includes('layout') ? ['layout'] : [];\n      if (typeof source !== 'string' || !source.length) return [];\n\n      return channelTypes.filter((type) => {\n        if (type === 'constant' || type === 'layout') return false;\n        if (type === 'nodeAttribute') {\n          if (!source.startsWith('@node.')) return false;\n          return isCompatibleAttribute('node', channel, 'nodeAttribute', normalizeNodeSourceName(source), { targetMode: mode });\n        }\n        return isCompatibleAttribute(mode, channel, type, source);\n      });\n    };\n\n    const resolveBestTypeForSource = (mode, channel, source, allowedTypes = []) => {\n      if (!allowedTypes.length) return null;\n      if (source === CONSTANT_SOURCE) return allowedTypes[0];\n      if (source === LAYOUT_SOURCE) return allowedTypes[0];\n      if (source?.startsWith?.('@node.') && allowedTypes.includes('nodeAttribute')) return 'nodeAttribute';\n\n      const info = getAttributeInfo(mode, source);\n      const isColor = channel === 'color' || channel === 'outlineColor';\n      const isScalar =\n        channel === 'size' ||\n        channel === 'outline' ||\n        channel === 'width' ||\n        channel === 'opacity';\n\n      if (info && (isCategoricalAttributeType(info.type) || isStringAttributeType(info.type)) && allowedTypes.includes('categorical')) {\n        return 'categorical';\n      }\n      if (isColor && allowedTypes.includes('colormap')) return 'colormap';\n      if (isScalar && allowedTypes.includes('linear')) return 'linear';\n      if (allowedTypes.includes('passthrough')) return 'passthrough';\n      return allowedTypes[0];\n    };\n\n    const resolveCollection = (mode) => {\n      if (!helios) return null;\n      return mode === 'edge' ? helios.edgeMapper : helios.nodeMapper;\n    };\n\n    const computeScalarExtent = (scope, rawName) => {\n      const network = net();\n      if (!network) return null;\n      if (typeof rawName !== 'string' || !rawName) return null;\n\n      if (rawName === '$index') {\n        const count = scope === 'edge'\n          ? (network.edgeCount ?? network.edgesCount ?? null)\n          : (network.nodeCount ?? network.nodesCount ?? null);\n        if (Number.isFinite(count) && count > 0) return { min: 0, max: Math.max(0, count - 1), isInteger: true };\n        return null;\n      }\n\n      const resolveName = (n) => resolveVisualAlias(n);\n      const isNodeProxy = scope === 'edge' && rawName.startsWith('@node.');\n      const name = isNodeProxy ? rawName.slice('@node.'.length) : rawName;\n      const resolved = resolveName(name);\n      const info = getAttributeInfo(scope, rawName);\n      const integerType = info?.type != null && isIntegerAttributeType(info.type);\n\n      const compute = () => {\n        try {\n          const indices = scope === 'network'\n            ? [0]\n            : (isNodeProxy || scope === 'node')\n              ? network.nodeIndices\n              : network.edgeIndices;\n          if (!indices || typeof indices.length !== 'number' || indices.length === 0) return null;\n          const buffer = isNodeProxy\n            ? network.getNodeAttributeBuffer?.(resolved)\n            : (scope === 'edge' ? network.getEdgeAttributeBuffer?.(resolved) : network.getNodeAttributeBuffer?.(resolved));\n\n          const view = buffer?.view ?? null;\n          if (!view || typeof view.length !== 'number' || view.length <= 0) return null;\n\n          let min = Infinity;\n          let max = -Infinity;\n          for (let i = 0; i < indices.length; i += 1) {\n            const idx = indices[i];\n            const v = Number(view[idx]);\n            if (!Number.isFinite(v)) continue;\n            if (v < min) min = v;\n            if (v > max) max = v;\n          }\n          if (!Number.isFinite(min) || !Number.isFinite(max)) return null;\n          if (integerType) {\n            const minInt = Math.floor(min);\n            const maxInt = Math.ceil(max);\n            if (minInt === maxInt) return { min: minInt, max: minInt + 1, isInteger: true };\n            return { min: minInt, max: maxInt, isInteger: true };\n          }\n          if (min === max) return { min, max: min + 1 };\n          return { min, max };\n        } catch (error) {\n          warnMappersUiDerivationFailure('Scalar extent computation failed', {\n            scope,\n            rawName,\n            error,\n          });\n          return null;\n        }\n      };\n\n      if (typeof network.withBufferAccess === 'function') {\n        return network.withBufferAccess(compute);\n      }\n      return compute();\n    };\n\n    const suggestDomainForAttribute = (scope, rawName) => {\n      const extent = computeScalarExtent(scope, rawName);\n      if (extent && Number.isFinite(extent.min) && Number.isFinite(extent.max)) return [extent.min, extent.max];\n      return [0, 1];\n    };\n\n    const CATEGORY_STRING_LIMITS = {\n      maxLength: 128,\n      maxUnique: 256,\n      maxScan: 4000,\n    };\n\n    const scanStringCategorization = (scope, rawName) => {\n      const network = net();\n      if (!network) return { ok: false, reason: 'Network unavailable.' };\n      const name = resolveVisualAlias(rawName);\n      const read = scope === 'edge'\n        ? network.getEdgeStringAttribute?.bind(network)\n        : network.getNodeStringAttribute?.bind(network);\n      if (typeof read !== 'function') return { ok: false, reason: 'String attribute access is unavailable.' };\n      const compute = () => {\n        const indices = scope === 'edge' ? network.edgeIndices : network.nodeIndices;\n        const limit = Math.min(indices?.length ?? 0, CATEGORY_STRING_LIMITS.maxScan);\n        const uniques = new Set();\n        let maxLength = 0;\n        for (let i = 0; i < limit; i += 1) {\n          const idx = indices[i];\n          const value = read(name, idx);\n          if (typeof value !== 'string') continue;\n          const len = value.length;\n          if (len > maxLength) maxLength = len;\n          if (len > CATEGORY_STRING_LIMITS.maxLength) {\n            return { ok: false, reason: `String values exceed ${CATEGORY_STRING_LIMITS.maxLength} characters.` };\n          }\n          if (value && value !== '__NA__') {\n            uniques.add(value);\n            if (uniques.size > CATEGORY_STRING_LIMITS.maxUnique) {\n              return { ok: false, reason: `More than ${CATEGORY_STRING_LIMITS.maxUnique} unique values detected.` };\n            }\n          }\n        }\n        return { ok: true, uniqueCount: uniques.size, maxLength };\n      };\n      return typeof network.withBufferAccess === 'function' ? network.withBufferAccess(compute) : compute();\n    };\n\n    const resolveCategoryDictionary = (scope, rawName) => {\n      const network = net();\n      if (!network) return [];\n      if (typeof rawName !== 'string' || !rawName) return [];\n      const name = resolveVisualAlias(rawName);\n      try {\n        const getter = scope === 'edge'\n          ? network.getEdgeAttributeCategoryDictionary\n          : network.getNodeAttributeCategoryDictionary;\n        if (typeof getter !== 'function') return [];\n        const dict = getter.call(network, name);\n        return Array.isArray(dict?.entries) ? dict.entries : [];\n      } catch (_) {\n        return [];\n      }\n    };\n\n    const computeCategoryCounts = (scope, rawName) => {\n      const network = net();\n      if (!network) return { counts: new Map(), unknownCount: 0 };\n      const isNodeProxy = scope === 'edge' && rawName?.startsWith('@node.');\n      const compute = () => {\n        const indices = scope === 'network'\n          ? [0]\n          : (isNodeProxy || scope === 'node')\n            ? network.nodeIndices\n            : network.edgeIndices;\n        if (!indices || typeof indices.length !== 'number') return { counts: new Map(), unknownCount: 0 };\n        const name = isNodeProxy ? rawName.slice('@node.'.length) : rawName;\n        let view = null;\n        try {\n          const buffer = isNodeProxy\n            ? network.getNodeAttributeBuffer?.(name)\n            : (scope === 'edge' ? network.getEdgeAttributeBuffer?.(name) : network.getNodeAttributeBuffer?.(name));\n          view = buffer?.view ?? null;\n        } catch (error) {\n          warnMappersUiDerivationFailure('Range histogram buffer lookup failed', {\n            scope,\n            rawName,\n            error,\n          });\n          view = null;\n        }\n        if (!view || typeof view.length !== 'number') return { counts: new Map(), unknownCount: 0 };\n        const counts = new Map();\n        let unknownCount = 0;\n        for (let i = 0; i < indices.length; i += 1) {\n          const idx = indices[i];\n          const id = Number(view[idx]);\n          if (!Number.isFinite(id)) {\n            unknownCount += 1;\n            continue;\n          }\n          counts.set(id, (counts.get(id) ?? 0) + 1);\n        }\n        return { counts, unknownCount };\n      };\n      if (typeof network.withBufferAccess === 'function') {\n        return network.withBufferAccess(compute);\n      }\n      return compute();\n    };\n\n    const resolveCategoryEntries = (scope, rawName) => {\n      const dictEntries = resolveCategoryDictionary(scope, rawName);\n      const { counts, unknownCount } = computeCategoryCounts(scope, rawName);\n      const entries = [];\n      const seen = new Set();\n      for (const entry of dictEntries) {\n        if (!entry) continue;\n        const id = Number(entry.id);\n        if (!Number.isFinite(id)) continue;\n        const rawLabel = typeof entry.label === 'string' ? entry.label : null;\n        const fallbackLabel = entry.label != null ? String(entry.label) : '';\n        const specialNone = isSpecialNoneCategoryLabel(rawLabel);\n        const label = rawLabel && rawLabel.trim()\n          ? rawLabel\n          : (specialNone ? 'None' : (fallbackLabel && fallbackLabel.trim() ? fallbackLabel : `#${id}`));\n        entries.push({ id, label, count: counts.get(id) ?? 0, rawLabel, specialNone });\n        seen.add(id);\n      }\n      for (const [id, count] of counts.entries()) {\n        if (seen.has(id)) continue;\n        entries.push({ id, label: `#${id}`, count });\n      }\n      entries.unknownCount = unknownCount;\n      return entries;\n    };\n\n    const resolveCategoricalPalette = ({ paletteName, count, preferScheme }) => {\n      const resolved = resolveColormap(paletteName) ?? resolveColormap('schemeTableau10');\n      if (!resolved) {\n        return Array.from({ length: count }, (_, i) => colorFromIndex(i));\n      }\n      const useScheme = preferScheme && resolved.isScheme && typeof resolved.scheme === 'function';\n      const colors = useScheme\n        ? resolved.scheme(count)\n        : colormapToScheme(resolved, count);\n      return colors.map((color, i) => rgbaToHex8(color) ?? colorFromIndex(i));\n    };\n\n    const suggestHistogramBins = (count) => {\n      if (!Number.isFinite(count) || count <= 1) return 1;\n      const bins = Math.round(Math.sqrt(count));\n      return Math.max(8, Math.min(40, bins));\n    };\n\n    const buildHistogram = (view, min, max, indices) => {\n      if (!view || typeof view.length !== 'number' || view.length <= 0) return null;\n      if (!Number.isFinite(min) || !Number.isFinite(max) || max <= min) return null;\n      if (!indices || typeof indices.length !== 'number' || indices.length <= 0) return null;\n      const bins = suggestHistogramBins(indices.length);\n      const counts = new Array(bins).fill(0);\n      const span = max - min;\n      let maxCount = 0;\n      let seen = 0;\n      for (let i = 0; i < indices.length; i += 1) {\n        const idxValue = indices[i];\n        const v = Number(view[idxValue]);\n        if (!Number.isFinite(v)) continue;\n        let idx = Math.floor(((v - min) / span) * bins);\n        if (idx < 0) idx = 0;\n        if (idx >= bins) idx = bins - 1;\n        const next = counts[idx] + 1;\n        counts[idx] = next;\n        if (next > maxCount) maxCount = next;\n        seen += 1;\n      }\n      if (!seen || maxCount <= 0) return null;\n      return { counts, maxCount };\n    };\n\n\t    const createRangeHistogram = ({ min, max, range, scope, rawName }) => {\n\t      const network = net();\n\t      if (!network) return null;\n\t      const isNodeProxy = scope === 'edge' && rawName?.startsWith('@node.');\n\t      const isIndex = rawName === '$index' || rawName === '@node.$index';\n\t      const compute = () => {\n\t        const indices = scope === 'network'\n\t          ? [0]\n\t          : (isNodeProxy || scope === 'node')\n\t            ? network.nodeIndices\n\t            : network.edgeIndices;\n\t        if (!indices || typeof indices.length !== 'number' || indices.length === 0) return null;\n\t        if (isIndex) {\n\t          return buildHistogram(indices, min, max, indices);\n\t        }\n\t        const name = isNodeProxy ? rawName.slice('@node.'.length) : rawName;\n\t        const hasAttribute = isNodeProxy\n\t          ? (network._nodeAttributes?.has?.(name) ?? Boolean(network.getNodeAttributeInfo?.(name)))\n\t          : (scope === 'edge'\n\t            ? (network._edgeAttributes?.has?.(name) ?? Boolean(network.getEdgeAttributeInfo?.(name)))\n\t            : (network._nodeAttributes?.has?.(name) ?? Boolean(network.getNodeAttributeInfo?.(name))));\n\t        if (!hasAttribute) return null;\n\t        const buffer = isNodeProxy\n\t          ? network.getNodeAttributeBuffer?.(name)\n\t          : (scope === 'edge' ? network.getEdgeAttributeBuffer?.(name) : network.getNodeAttributeBuffer?.(name));\n\t        const view = buffer?.view ?? null;\n\t        if (!view || typeof view.length !== 'number' || view.length === 0) return null;\n\t        return buildHistogram(view, min, max, indices);\n\t      };\n      const data = typeof network.withBufferAccess === 'function'\n        ? network.withBufferAccess(compute)\n        : compute();\n      if (!data) return null;\n      const histogram = document.createElement('div');\n      histogram.className = 'helios-ui-range2__histogram';\n\n      for (const count of data.counts) {\n        const bar = document.createElement('div');\n        bar.className = 'helios-ui-range2__histogram-bin';\n        bar.style.height = `${Math.max(1, Math.round((count / data.maxCount) * 100))}%`;\n        histogram.appendChild(bar);\n      }\n\n      const minMarker = document.createElement('div');\n      minMarker.className = 'helios-ui-range2__histogram-marker';\n      const maxMarker = document.createElement('div');\n      maxMarker.className = 'helios-ui-range2__histogram-marker';\n      histogram.appendChild(minMarker);\n      histogram.appendChild(maxMarker);\n\n      const setMarkers = (lo, hi) => {\n        const span = max - min;\n        const toPct = (value) => {\n          if (span === 0) return 0;\n          const raw = (value - min) / span;\n          return Math.max(0, Math.min(1, raw));\n        };\n        const toLeft = (pct) =>\n          `calc(${pct} * (100% - var(--helios-ui-range2-thumb)) + (var(--helios-ui-range2-thumb) / 2))`;\n\n        const loPct = toPct(lo);\n        const hiPct = toPct(hi);\n        minMarker.style.left = toLeft(loPct);\n        maxMarker.style.left = toLeft(hiPct);\n      };\n      setMarkers(Number(range?.[0] ?? min), Number(range?.[1] ?? max));\n\n      return { element: histogram, setMarkers };\n    };\n\n    const ensureUiMeta = (pending) => {\n      if (!pending || typeof pending !== 'object') return null;\n      const existing = pending.__ui && typeof pending.__ui === 'object' ? pending.__ui : null;\n      if (existing) return existing;\n      pending.__ui = {};\n      return pending.__ui;\n    };\n\n    const markDomainAuto = (pending, enabled) => {\n      const uiMeta = ensureUiMeta(pending);\n      if (!uiMeta) return;\n      uiMeta.domainAuto = Boolean(enabled);\n    };\n\n    const suggestRangeForChannel = (mode, channel) => {\n      if (mode === 'node') {\n        if (channel === 'size') return [1, 20];\n        if (channel === 'outline') return [0, 10];\n      }\n      if (mode === 'edge') {\n        if (channel === 'width') return [0.5, 6];\n        if (channel === 'opacity') return [0, 1];\n      }\n      return [0, 1];\n    };\n\n    const isFiniteNumberPair = (value) =>\n      Array.isArray(value) &&\n      value.length === 2 &&\n      value.every((entry) => Number.isFinite(Number(entry)));\n\n    const suggestStepForRange = (min, max, isInteger = false) => {\n      if (isInteger) return 1;\n      const span = Math.abs(Number(max) - Number(min));\n      if (!Number.isFinite(span) || span <= 0) return 0.01;\n      const magnitude = Math.floor(Math.log10(span));\n      const step = Math.pow(10, magnitude - 3);\n      return Math.max(step, 1e-6);\n    };\n\n    const isPercentileTransform = (transformType) => transformType === 'percentile' || transformType === 'quantile';\n\n    const formatTransformLabel = (value) => {\n      if (value === 'log1p') return 'Log1p';\n      if (value === 'percentile' || value === 'quantile') return 'Percentile';\n      return `${value.slice(0, 1).toUpperCase()}${value.slice(1)}`;\n    };\n\n    const normalizeClampSetting = (clamp) => {\n      if (clamp && typeof clamp === 'object') {\n        return { min: clamp.min !== false, max: clamp.max !== false };\n      }\n      if (clamp === false) return { min: false, max: false };\n      return { min: true, max: true };\n    };\n\n    const resolveDivergentDomain = (domain, extent) => {\n      if (!Array.isArray(domain) || domain.length !== 2) {\n        const min = extent?.min ?? -1;\n        const max = extent?.max ?? 1;\n        const maxAbs = Math.max(Math.abs(min), Math.abs(max), 1);\n        return [-maxAbs, maxAbs];\n      }\n      const maxAbs = Math.max(Math.abs(domain[0]), Math.abs(domain[1]));\n      if (!Number.isFinite(maxAbs) || maxAbs === 0) return [-1, 1];\n      return [-maxAbs, maxAbs];\n    };\n\n    const resolveDivergentDomainFromSlider = (next, prev) => {\n      const prevAbs = Math.abs(prev?.[1] ?? prev?.[0] ?? 0);\n      const loAbs = Math.abs(next?.[0] ?? 0);\n      const hiAbs = Math.abs(next?.[1] ?? 0);\n      const loChanged = Math.abs(loAbs - prevAbs) > 1e-6;\n      const hiChanged = Math.abs(hiAbs - prevAbs) > 1e-6;\n      const maxAbs = loChanged && !hiChanged\n        ? loAbs\n        : (hiChanged && !loChanged ? hiAbs : Math.max(loAbs, hiAbs));\n      if (!Number.isFinite(maxAbs) || maxAbs === 0) return [-1, 1];\n      return [-maxAbs, maxAbs];\n    };\n\n    const resolveLiveConfig = (mode, channel) => {\n      if (mappersBehavior?.getChannelConfig) {\n        return mappersBehavior.getChannelConfig(mode, channel);\n      }\n      const collection = resolveCollection(mode);\n      const mapper = collection?.defaultMapper ?? null;\n      if (!mapper || typeof mapper.getChannel !== 'function') return null;\n      return shallowCloneChannelConfig(mapper.getChannel(channel));\n    };\n\n    const applyConfig = (mode, channel, config) => {\n      if (mappersBehavior?.setChannelConfig) {\n        return mappersBehavior.setChannelConfig(mode, channel, config);\n      }\n      const collection = resolveCollection(mode);\n      const mapper = collection?.defaultMapper ?? null;\n      if (!collection || !mapper || typeof mapper.setChannel !== 'function') return false;\n      mapper.setChannel(channel, config);\n      collection.touch?.();\n      return true;\n    };\n\n    const createModeTab = (mode) => {\n      const root = document.createElement('div');\n\n      const state = {\n        channel: (mode === 'edge' ? (options.defaultEdgeChannel ?? 'color') : (options.defaultNodeChannel ?? 'color')),\n        pending: null,\n        dirty: false,\n      };\n\n    const createSubsectionHeader = ({ title, action, tooltip }) => {\n      const wrap = document.createElement('div');\n      wrap.style.display = 'grid';\n      wrap.style.gap = '8px';\n      wrap.style.width = '100%';\n\n      const divider = document.createElement('div');\n      divider.style.height = '0';\n      divider.style.borderTop = '1px solid color-mix(in srgb, var(--helios-ui-border) 70%, transparent)';\n      divider.style.margin = '6px 0 2px';\n      wrap.appendChild(divider);\n\n      const header = document.createElement('div');\n      header.style.display = 'flex';\n      header.style.alignItems = 'center';\n      header.style.justifyContent = 'space-between';\n      header.style.gap = '8px';\n      header.style.flexWrap = 'wrap';\n\n      const titleEl = document.createElement('div');\n      titleEl.textContent = title ?? '';\n      titleEl.style.fontWeight = '700';\n      titleEl.style.fontSize = '12px';\n      titleEl.style.color = 'var(--helios-ui-muted)';\n      titleEl.style.letterSpacing = '0.4px';\n      titleEl.style.textTransform = 'uppercase';\n      if (tooltip) tooltips.attachTooltip?.(titleEl, tooltip);\n      header.appendChild(titleEl);\n      if (action) {\n        action.style.marginLeft = 'auto';\n        header.appendChild(action);\n      }\n      wrap.appendChild(header);\n      return { wrap, header, titleEl };\n    };\n\n      const channels = mode === 'edge' ? edgeChannels : nodeChannels;\n      if (!channels.includes(state.channel)) state.channel = channels[0];\n\n      const editorBody = document.createElement('div');\n      root.appendChild(editorBody);\n\n      const applyRow = document.createElement('div');\n      applyRow.style.display = 'flex';\n      applyRow.style.justifyContent = 'flex-end';\n      applyRow.style.gap = '8px';\n      applyRow.style.marginTop = '10px';\n\n      const revertButton = document.createElement('button');\n      revertButton.type = 'button';\n      revertButton.className = 'helios-ui-button';\n      revertButton.textContent = 'Revert';\n\n      const applyButton = document.createElement('button');\n      applyButton.type = 'button';\n      applyButton.className = 'helios-ui-button';\n      applyButton.textContent = 'Apply';\n\n      applyRow.appendChild(revertButton);\n      applyRow.appendChild(applyButton);\n      root.appendChild(applyRow);\n\n      const canApplyPending = () => {\n        if (!state.pending) return false;\n        const collection = resolveCollection(mode);\n        const mapper = collection?.defaultMapper ?? null;\n        if (!collection || !mapper || typeof mapper.setChannel !== 'function') return false;\n\n        const rawType = state.pending.type ?? state.pending.mode ?? null;\n        const type = isEditorTransferableConfig(state.pending) ? (rawType ?? 'passthrough') : 'custom';\n\n        if (mode === 'node' && state.channel === 'position' && type === 'layout') {\n          const scheduler = helios?.scheduler ?? null;\n          if (!scheduler || typeof scheduler.setLayoutEnabled !== 'function') return false;\n          return Boolean(scheduler.layout);\n        }\n\n        if (type === 'passthrough') {\n          return typeof state.pending.attributes === 'string' && state.pending.attributes.length > 0;\n        }\n\n        if (type === 'nodeAttribute') {\n          return typeof state.pending.nodeAttribute === 'string' && state.pending.nodeAttribute.length > 0;\n        }\n\n        if (type === 'constant') {\n          const v = state.pending.value;\n          const isArrayLike = Array.isArray(v) || ArrayBuffer.isView(v);\n          if (mode === 'node' && state.channel === 'position') {\n            return isArrayLike && v.length === 3 && Array.from(v).every((x) => Number.isFinite(x));\n          }\n          if (isArrayLike) return v.length === 3 || v.length === 4;\n          if (v && typeof v === 'object') {\n            if (mode === 'edge') {\n              if (state.channel === 'color') {\n                const src = v.source ?? v.start ?? null;\n                const dst = v.target ?? v.end ?? null;\n                if (src != null && !isHexColorString(String(src))) return false;\n                if (dst != null && !isHexColorString(String(dst))) return false;\n                return src != null || dst != null;\n              }\n              if (state.channel === 'width' || state.channel === 'opacity') {\n                const src = Number(v.source ?? v.start);\n                const dst = Number(v.target ?? v.end);\n                const srcOk = Number.isFinite(src);\n                const dstOk = Number.isFinite(dst);\n                return srcOk || dstOk;\n              }\n            }\n            return false;\n          }\n          if (typeof v === 'number') return Number.isFinite(v);\n          if (typeof v === 'string') return isHexColorString(v);\n          return false;\n        }\n\n        if (type === 'linear') {\n          if (!(typeof state.pending.attributes === 'string' && state.pending.attributes.length > 0)) return false;\n          const domain = state.pending.domain;\n          const range = state.pending.range;\n          const domainOk = Array.isArray(domain) && domain.length === 2 && domain.every((x) => Number.isFinite(x));\n          const rangeOk = Array.isArray(range) && range.length === 2 && range.every((x) => Number.isFinite(x));\n          return domainOk && rangeOk;\n        }\n\n        if (type === 'colormap') {\n          if (!(typeof state.pending.attributes === 'string' && state.pending.attributes.length > 0)) return false;\n          if (!(typeof state.pending.colormap === 'string' && state.pending.colormap.length > 0)) return false;\n          return true;\n        }\n\n        if (type === 'categorical') {\n          if (!(typeof state.pending.attributes === 'string' && state.pending.attributes.length > 0)) return false;\n          const info = getAttributeInfo(mode, state.pending.attributes);\n          if (info && isStringAttributeType(info.type)) return false;\n          const domain = state.pending.domain;\n          const range = state.pending.range;\n          if (!Array.isArray(domain) || !Array.isArray(range)) return false;\n          if (domain.length === 0 || domain.length !== range.length) return false;\n          const isColorChannel = state.channel === 'color' || state.channel === 'outlineColor';\n          return isColorChannel\n            ? range.every((value) => typeof value === 'string' && isHexColorString(value))\n            : range.every((value) => Number.isFinite(Number(value)));\n        }\n\n        if (type === 'custom') {\n          return true;\n        }\n\n        return true;\n      };\n\n      const syncApplyEnabled = () => {\n        applyButton.disabled = !canApplyPending();\n      };\n\n      const setDirty = (dirty) => {\n        state.dirty = Boolean(dirty);\n        syncApplyEnabled();\n      };\n\n      const resolveAllowedTypes = (channel) => {\n        if (mode === 'node' && channel === 'position') return ['layout', 'constant', 'passthrough'];\n        const isColor = channel === 'color' || channel === 'outlineColor';\n        const isScalar =\n          channel === 'size' ||\n          channel === 'outline' ||\n          channel === 'width' ||\n          channel === 'opacity';\n        if (mode === 'edge' && isColor) return ['constant', 'passthrough', 'nodeAttribute', 'categorical', 'colormap'];\n        if (mode === 'edge' && isScalar) return ['constant', 'passthrough', 'nodeAttribute', 'categorical', 'linear'];\n        if (isColor) return ['constant', 'passthrough', 'categorical', 'colormap'];\n        if (isScalar) return ['constant', 'passthrough', 'categorical', 'linear'];\n        return ['passthrough'];\n      };\n\n      const localControls = new Set();\n      const registerControl = (control) => {\n        if (!control) return;\n        localControls.add(control);\n      };\n\t      const destroyControls = () => {\n\t        for (const control of localControls) {\n\t          try {\n\t            control.destroy?.();\n\t          } catch (error) {\n\t            console.warn('[HeliosUI][MappersPanel] Control cleanup failed.', error);\n\t          }\n\t        }\n\t        localControls.clear();\n\t      };\n\n\t      const extractScalarForRule = (inputs) => {\n\t        if (inputs == null) return inputs;\n\t        if (typeof inputs === 'number') return inputs;\n\t        if (Array.isArray(inputs) || ArrayBuffer.isView(inputs)) return inputs[0];\n\t        if (typeof inputs === 'object') {\n\t          const keys = Object.keys(inputs);\n\t          if (keys.length) return inputs[keys[0]];\n\t        }\n\t        return inputs;\n\t      };\n\n\t      const buildRulePredicate = (spec) => {\n\t        const op = spec?.op ?? 'eq';\n\t        const rhsRaw = spec?.rhs;\n\t        const rhs = rhsRaw != null ? Number(rhsRaw) : undefined;\n\t        return (inputs) => {\n\t          const vRaw = extractScalarForRule(inputs);\n\t          if (op === 'nullish') return vRaw == null;\n\t          if (op === 'nan') return vRaw != null && Number.isNaN(Number(vRaw));\n\t          const v = Number(vRaw);\n\t          if (!Number.isFinite(v)) return false;\n\t          if (op === 'eq') return rhs != null && v === rhs;\n\t          if (op === 'lt') return rhs != null && v < rhs;\n\t          if (op === 'lte') return rhs != null && v <= rhs;\n\t          if (op === 'gt') return rhs != null && v > rhs;\n\t          if (op === 'gte') return rhs != null && v >= rhs;\n\t          return false;\n\t        };\n\t      };\n\n\t      const normalizeRuleList = (pending) => {\n\t        if (!pending) return { rules: [] };\n\t        if (!Array.isArray(pending.rules)) {\n\t          return { ...pending, rules: [] };\n\t        }\n\t        return pending;\n\t      };\n\n\t      const createRuleKeyword = (text) => {\n\t        const el = document.createElement('div');\n\t        el.className = 'helios-ui-rule-keyword';\n\t        el.textContent = text;\n\t        return el;\n\t      };\n\n        const createHex8ColorEditor = ({ label, value, onChange, showAlphaLabel = false, compact = true }) => {\n\t        const row = document.createElement('div');\n\t        row.style.display = 'flex';\n          row.style.gap = '4px';\n\t        row.style.alignItems = 'center';\n\t        row.style.width = '100%';\n\n\t        if (label) {\n\t          const labelEl = document.createElement('div');\n\t          labelEl.textContent = label;\n\t          labelEl.style.fontSize = '12px';\n\t          labelEl.style.color = 'var(--helios-ui-muted)';\n\t          labelEl.style.minWidth = '76px';\n\t          row.appendChild(labelEl);\n\t        }\n\n\t        const swatchWrap = document.createElement('div');\n\t        swatchWrap.className = 'helios-ui-color-swatch';\n\n\t        const swatch = document.createElement('div');\n\t        swatch.className = 'helios-ui-color-swatch__swatch';\n\n\t        const colorInput = document.createElement('input');\n\t        colorInput.type = 'color';\n\t        colorInput.className = 'helios-ui-color-swatch__input';\n\t        colorInput.setAttribute('aria-label', label ? `${label} color` : 'Color');\n\n\t        const alphaInput = document.createElement('input');\n\t        alphaInput.type = 'number';\n\t        alphaInput.className = 'helios-ui-number';\n\t        alphaInput.min = '0';\n\t        alphaInput.max = '1';\n\t        alphaInput.step = '0.01';\n          alphaInput.style.maxWidth = compact ? '36px' : '52px';\n\t        alphaInput.title = 'Alpha';\n\n\t        const alphaLabel = document.createElement('span');\n\t        alphaLabel.textContent = 'Alpha';\n\t        alphaLabel.style.color = 'var(--helios-ui-muted)';\n\t        alphaLabel.style.display = showAlphaLabel ? '' : 'none';\n\n\t        const rawValue = typeof value === 'string' ? value : '#ffffff';\n\t        const raw = rawValue.startsWith('#') ? rawValue.slice(1) : rawValue;\n\t        const baseHex = raw.length >= 6 ? `#${raw.slice(0, 6)}` : '#ffffff';\n\t        const alphaHex = raw.length === 8 ? raw.slice(6, 8) : 'ff';\n\t        const alpha = Math.round(parseInt(alphaHex, 16) / 255 * 100) / 100;\n\n\t        colorInput.value = baseHex;\n\t        alphaInput.value = String(Number.isFinite(alpha) ? alpha : 1);\n\t        swatch.style.background = colorInput.value;\n\n\t        const commit = () => {\n\t          const a = clampNumber(alphaInput.value, { min: 0, max: 1 });\n\t          if (a == null) return;\n\t          onChange(toHex8(colorInput.value, a));\n\t          setDirty(true);\n\t          swatch.style.background = colorInput.value;\n\t        };\n\t        colorInput.addEventListener('input', commit);\n\t        alphaInput.addEventListener('change', commit);\n\n\t        swatchWrap.appendChild(swatch);\n\t        swatchWrap.appendChild(colorInput);\n\t        row.appendChild(swatchWrap);\n\t        if (showAlphaLabel) row.appendChild(alphaLabel);\n\t        row.appendChild(alphaInput);\n\t        return row;\n\t      };\n\n\t      const renderEditor = () => {\n\t        destroyControls();\n\t        editorBody.textContent = '';\n        const live = resolveLiveConfig(mode, state.channel);\n\n        if (!state.pending) {\n          if (mode === 'node' && state.channel === 'position') {\n            const scheduler = helios?.scheduler ?? null;\n            const hasLayout = Boolean(scheduler?.layout);\n            const layoutState = typeof scheduler?.getLayoutState === 'function'\n              ? scheduler.getLayoutState()\n              : (scheduler?.layoutEnabled !== false ? 'running' : 'stopped');\n            const layoutEnabled = hasLayout && layoutState !== 'stopped';\n            state.pending = layoutEnabled ? { name: state.channel, type: 'layout' } : (shallowCloneChannelConfig(live) ?? { name: state.channel });\n          } else {\n            state.pending = shallowCloneChannelConfig(live) ?? { name: state.channel };\n          }\n        }\n\n        const channelAllowedTypes = resolveAllowedTypes(state.channel);\n        const sources = listMapperSources(mode, state.channel)\n          .filter((source) => resolveAllowedTypesForSource(mode, state.channel, source, channelAllowedTypes).length > 0);\n        const currentSourceCandidate = inferSourceFromConfig(state.pending) ?? inferSourceFromConfig(live);\n        let selectedSource = sources.includes(currentSourceCandidate)\n          ? currentSourceCandidate\n          : (currentSourceCandidate ?? CONSTANT_SOURCE);\n        if (!sources.includes(selectedSource)) sources.push(selectedSource);\n\n        const sourceSelect = document.createElement('select');\n        sourceSelect.className = 'helios-ui-select';\n        appendGroupedSourceOptions(sourceSelect, sources);\n        sourceSelect.value = selectedSource;\n\n        let allowedTypes = resolveAllowedTypesForSource(mode, state.channel, selectedSource, channelAllowedTypes);\n        const customPresets = getCustomPresetMap(mode, state.channel);\n\n        const resolveCurrentTypeKey = () => {\n          const pendingType = state.pending?.type ?? state.pending?.mode ?? null;\n\n          if (pendingType === 'layout' && allowedTypes.includes('layout')) return 'layout';\n\n          if (pendingType === 'nodeToEdge' && allowedTypes.includes('nodeAttribute')) return 'nodeAttribute';\n\n          if (state.pending && isEditorTransferableConfig(state.pending) && allowedTypes.includes(pendingType)) {\n            return pendingType;\n          }\n\n          const candidate = state.pending ?? live;\n          if (candidate && !isEditorTransferableConfig(candidate)) {\n            const id = registerCustomPreset(mode, state.channel, candidate);\n            if (id) return `custom:${id}`;\n          }\n\n          if (live && !isEditorTransferableConfig(live)) {\n            const id = registerCustomPreset(mode, state.channel, live);\n            if (id) return `custom:${id}`;\n          }\n\n          return resolveBestTypeForSource(mode, state.channel, selectedSource, allowedTypes) ?? allowedTypes[0];\n        };\n\n        const currentKey = resolveCurrentTypeKey();\n\n        const typeSelect = document.createElement('select');\n        typeSelect.className = 'helios-ui-select';\n\n        if (!allowedTypes.length && !customPresets.size) {\n          const opt = document.createElement('option');\n          opt.value = '';\n          opt.textContent = 'No compatible mapper';\n          typeSelect.appendChild(opt);\n          typeSelect.disabled = true;\n        }\n\n        for (const t of allowedTypes) {\n          const opt = document.createElement('option');\n          opt.value = t;\n          opt.textContent = MAPPER_TYPE_LABELS[t] ?? t;\n          typeSelect.appendChild(opt);\n        }\n\n        for (const preset of customPresets.values()) {\n          const opt = document.createElement('option');\n          opt.value = `custom:${preset.id}`;\n          const label = typeof preset.label === 'string' ? preset.label.trim() : '';\n          opt.textContent = label && label.toLowerCase() !== 'custom' ? `Custom: ${label}` : 'Custom';\n          typeSelect.appendChild(opt);\n        }\n\n        const availableKeys = [\n          ...allowedTypes,\n          ...Array.from(customPresets.keys()).map((id) => `custom:${id}`),\n        ];\n        typeSelect.value = availableKeys.includes(currentKey) ? currentKey : (availableKeys[0] ?? '');\n\n        const buildPendingForType = (nextType, source = selectedSource) => {\n          const prev = state.pending ?? {};\n          const prevSource = inferSourceFromConfig(prev);\n          const sourceChanged = Boolean(source && prevSource && source !== prevSource);\n          const base = nextType === 'layout'\n            ? { name: state.channel, type: nextType }\n            : {\n              name: state.channel,\n              type: nextType,\n              defaultValue: prev.defaultValue ?? live?.defaultValue,\n            };\n          if (source && source !== CONSTANT_SOURCE && source !== LAYOUT_SOURCE) {\n            base.attributes = source;\n          } else {\n            base.attributes = prev.attributes ?? live?.attributes ?? live?.from;\n          }\n          if (nextType === 'constant') {\n            base.value = prev.value ?? live?.value;\n            if (base.value == null && (state.channel === 'opacity' || state.channel === 'width')) {\n              base.value = 1;\n            }\n            delete base.attributes;\n          }\n          if (nextType === 'nodeAttribute') {\n            const sourceNodeAttribute = normalizeNodeSourceName(source);\n            base.nodeAttribute = sourceNodeAttribute || prev.nodeAttribute || live?.nodeAttribute || '';\n            base.endpoints = prev.endpoints ?? live?.endpoints ?? 'both';\n            if (!base.nodeAttribute) {\n              const isColorChannel = state.channel === 'color' || state.channel === 'outlineColor';\n              base.nodeAttribute = isColorChannel ? 'color' : 'size';\n            }\n            base.attributes = [`@node.${base.nodeAttribute}`];\n          }\n          if (nextType === 'linear') {\n            const attr = typeof base.attributes === 'string' ? base.attributes : null;\n            const prevDomain = !sourceChanged && isFiniteNumberPair(prev.domain) ? prev.domain : null;\n            const liveDomain = !sourceChanged && isFiniteNumberPair(live?.domain) ? live.domain : null;\n            const prevRange = !sourceChanged && isFiniteNumberPair(prev.range) ? prev.range : null;\n            const liveRange = !sourceChanged && isFiniteNumberPair(live?.range) ? live.range : null;\n            base.transformType = prev.transformType ?? live?.transformType ?? 'linear';\n            base.transformPower = prev.transformPower ?? live?.transformPower ?? 1;\n            const hasDomain = Boolean(prevDomain || liveDomain);\n            base.domain = prevDomain ?? liveDomain ?? suggestDomainForAttribute(mode, attr);\n            const suggested = suggestRangeForChannel(mode, state.channel);\n            base.range = prevRange ?? liveRange ?? suggested;\n            markDomainAuto(base, !hasDomain);\n          }\n          if (nextType === 'colormap') {\n            base.colormap = prev.colormap ?? live?.colormap ?? 'interpolateInferno';\n            const attr = typeof base.attributes === 'string' ? base.attributes : null;\n            const prevDomain = !sourceChanged && isFiniteNumberPair(prev.domain) ? prev.domain : null;\n            const liveDomain = !sourceChanged && isFiniteNumberPair(live?.domain) ? live.domain : null;\n            base.transformType = prev.transformType ?? live?.transformType ?? 'linear';\n            base.transformPower = prev.transformPower ?? live?.transformPower ?? 1;\n            const hasDomain = Boolean(prevDomain || liveDomain);\n            base.domain = prevDomain ?? liveDomain ?? suggestDomainForAttribute(mode, attr);\n            base.alpha = prev.alpha ?? live?.alpha ?? 1;\n            base.clamp = prev.clamp ?? live?.clamp ?? true;\n            markDomainAuto(base, !hasDomain);\n          }\n          if (nextType === 'categorical') {\n            base.attributes = typeof base.attributes === 'string'\n              ? base.attributes\n              : (typeof prev.attributes === 'string' ? prev.attributes : (typeof live?.attributes === 'string' ? live.attributes : ''));\n            base.domain = !sourceChanged && Array.isArray(prev.domain)\n              ? prev.domain\n              : (!sourceChanged && Array.isArray(live?.domain) ? live.domain : []);\n            base.range = !sourceChanged && Array.isArray(prev.range)\n              ? prev.range\n              : (!sourceChanged && Array.isArray(live?.range) ? live.range : []);\n            base.defaultValue = prev.defaultValue ?? live?.defaultValue ?? '#888888ff';\n            const meta = { ...(prev.meta && typeof prev.meta === 'object' ? prev.meta : null), ...(live?.meta && typeof live.meta === 'object' ? live.meta : null) };\n            const nextMeta = meta && typeof meta === 'object' ? { ...meta } : {};\n            const categorical = nextMeta.categorical && typeof nextMeta.categorical === 'object'\n              ? { ...nextMeta.categorical }\n              : {};\n            if (!categorical.sortOrder) categorical.sortOrder = 'frequency';\n            if (categorical.maxCategories == null) categorical.maxCategories = null;\n            if (!categorical.palette) categorical.palette = defaultCategoricalPalette;\n            if (categorical.preferScheme == null) categorical.preferScheme = true;\n            nextMeta.categorical = categorical;\n            base.meta = nextMeta;\n          }\n          return base;\n        };\n\n        const setPendingType = (nextType, source = selectedSource) => {\n          state.pending = buildPendingForType(nextType, source);\n          setDirty(true);\n          renderEditor();\n        };\n\n        sourceSelect.addEventListener('change', () => {\n          selectedSource = sourceSelect.value;\n          pruneEphemeralCustomPresets(mode, state.channel);\n          const nextAllowed = resolveAllowedTypesForSource(mode, state.channel, selectedSource, channelAllowedTypes);\n          const nextType = resolveBestTypeForSource(mode, state.channel, selectedSource, nextAllowed);\n          if (nextType) {\n            setPendingType(nextType, selectedSource);\n          } else {\n            state.pending = {\n              name: state.channel,\n              attributes: selectedSource,\n            };\n            setDirty(true);\n            renderEditor();\n          }\n        });\n\n        typeSelect.addEventListener('change', () => {\n          const next = typeSelect.value;\n          if (next.startsWith('custom:')) {\n            const id = next.slice('custom:'.length);\n            const preset = customPresets.get(id) ?? null;\n            if (preset?.config) {\n              state.pending = shallowCloneChannelConfig(preset.config) ?? preset.config;\n              setDirty(true);\n              renderEditor();\n            }\n            return;\n          }\n          pruneEphemeralCustomPresets(mode, state.channel);\n          setPendingType(next, selectedSource);\n        });\n\n        editorBody.appendChild(createAlignedRow({\n          title: 'Attribute',\n          hint: 'Pick the attribute/source first; mapper type options are filtered to compatible choices.',\n          controls: sourceSelect,\n        }).row);\n\n        editorBody.appendChild(createAlignedRow({\n          title: 'Type',\n          hint: 'Select the compatible mapper type for the chosen source.',\n          controls: typeSelect,\n        }).row);\n\n        const pendingTypeKey = typeSelect.value;\n        const pendingType = pendingTypeKey.startsWith('custom:') ? 'custom' : pendingTypeKey;\n        if (!pendingType) {\n          const note = document.createElement('div');\n          note.style.color = 'var(--helios-ui-muted)';\n          note.textContent = 'No compatible mapper is available for this attribute and channel.';\n          editorBody.appendChild(note);\n          syncApplyEnabled();\n          return;\n        }\n        if (pendingType !== 'custom') {\n          const rawType = state.pending?.type ?? state.pending?.mode ?? null;\n          if (!rawType) {\n            state.pending = buildPendingForType(pendingType, selectedSource);\n          }\n        }\n        const isColor = state.channel === 'color' || state.channel === 'outlineColor';\n        const isScalar =\n          state.channel === 'size' ||\n          state.channel === 'outline' ||\n          state.channel === 'width' ||\n          state.channel === 'opacity';\n        const isPosition = mode === 'node' && state.channel === 'position';\n\n        if (pendingType === 'layout') {\n          const note = document.createElement('div');\n          note.style.color = 'var(--helios-ui-muted)';\n          note.textContent = 'Uses the active layout (no position mapper applied).';\n          editorBody.appendChild(note);\n        }\n\n        if (pendingType === 'custom') {\n          const meta = state.pending?.meta && typeof state.pending.meta === 'object' ? state.pending.meta : {};\n          const description = typeof meta.description === 'string' ? meta.description : '';\n          const source = typeof meta.source === 'string' ? meta.source : '';\n\n          const descEl = document.createElement('div');\n          descEl.style.whiteSpace = 'pre-wrap';\n          descEl.style.color = 'var(--helios-ui-muted)';\n          descEl.textContent = description || '—';\n          editorBody.appendChild(createAlignedRow({\n            title: 'Description',\n            hint: 'Optional: describes what this preset does.',\n            controls: descEl,\n          }).row);\n\n          const srcEl = document.createElement('div');\n          srcEl.style.whiteSpace = 'pre-wrap';\n          srcEl.style.color = 'var(--helios-ui-muted)';\n          srcEl.textContent = source || '—';\n          editorBody.appendChild(createAlignedRow({\n            title: 'Source',\n            hint: 'Optional: where this preset came from (for your own reference).',\n            controls: srcEl,\n          }).row);\n        }\n\n          if (pendingType === 'nodeAttribute') {\n            const fromAttributes = () => {\n            const attrs = state.pending?.attributes ?? live?.attributes ?? live?.from ?? null;\n            if (typeof attrs === 'string' && attrs.startsWith('@node.')) return attrs.slice('@node.'.length);\n            if (typeof attrs === 'string' && attrs.startsWith('@nodes.')) return attrs.slice('@nodes.'.length);\n            if (Array.isArray(attrs)) {\n              for (const v of attrs) {\n                if (typeof v === 'string' && v.startsWith('@node.')) return v.slice('@node.'.length);\n                if (typeof v === 'string' && v.startsWith('@nodes.')) return v.slice('@nodes.'.length);\n              }\n            }\n            return '';\n          };\n          const current = typeof state.pending.nodeAttribute === 'string'\n            ? state.pending.nodeAttribute\n            : (typeof live?.nodeAttribute === 'string' ? live.nodeAttribute : (normalizeNodeSourceName(selectedSource) || fromAttributes()));\n          if (current && state.pending.nodeAttribute !== current) {\n            state.pending = {\n              ...state.pending,\n              type: 'nodeAttribute',\n              nodeAttribute: current,\n              endpoints: state.pending.endpoints ?? 'both',\n              attributes: [`@node.${current}`],\n            };\n          }\n            state._nodePassthroughUi = { attrSelect: null, endpointsSelect: state._nodePassthroughUi?.endpointsSelect ?? null };\n\n            if (mode === 'edge') {\n              const endpointsSelect = document.createElement('select');\n              endpointsSelect.className = 'helios-ui-select helios-ui-select--compact';\n            const options = [\n              { value: 'both', label: 'Both' },\n              { value: 'source', label: 'Source' },\n              { value: 'destination', label: 'Target' },\n            ];\n            for (const optInfo of options) {\n              const opt = document.createElement('option');\n              opt.value = optInfo.value;\n              opt.textContent = optInfo.label;\n              endpointsSelect.appendChild(opt);\n            }\n            endpointsSelect.value = String(state.pending.endpoints ?? 'both');\n            endpointsSelect.addEventListener('change', () => {\n              const bare =\n                typeof state.pending.nodeAttribute === 'string' && state.pending.nodeAttribute.length\n                  ? state.pending.nodeAttribute\n                  : (current || undefined);\n              state.pending = {\n                ...state.pending,\n                type: 'nodeAttribute',\n                nodeAttribute: bare,\n                endpoints: endpointsSelect.value,\n                attributes: bare ? [`@node.${bare}`] : undefined,\n              };\n              try {\n                if (window.__HELIOS_DEBUG_MAPPERS_PANEL__) {\n                  console.log('[HeliosUI][MappersPanel] endpoints change', {\n                    mode,\n                    channel: state.channel,\n                    nodeAttribute: bare,\n                    endpoints: endpointsSelect.value,\n                  });\n                }\n              } catch (error) {\n                console.warn('[HeliosUI][MappersPanel] Debug logging failed.', error);\n              }\n              setDirty(true);\n            });\n              state._nodePassthroughUi = { attrSelect: null, endpointsSelect };\n              registerControl({\n                destroy() {\n                  if (state._nodePassthroughUi?.endpointsSelect === endpointsSelect) {\n                    state._nodePassthroughUi = null;\n                  }\n                },\n              });\n              editorBody.appendChild(createAlignedRow({\n                title: 'Endpoints',\n                hint: 'Whether the passthrough uses both endpoints or duplicates source/target.',\n                controls: endpointsSelect,\n              }).row);\n            }\n          }\n\n        if (pendingType === 'constant' && isScalar) {\n          const wrap = document.createElement('div');\n          wrap.style.display = 'grid';\n          wrap.style.gap = '6px';\n          wrap.style.width = '100%';\n\n          const minAllowed = state.channel === 'opacity' ? 0 : 0;\n          const maxAllowed = state.channel === 'opacity' ? 1 : null;\n\n          const [suggestMin, suggestMax] = suggestRangeForChannel(mode, state.channel);\n          const step = suggestStepForRange(suggestMin, suggestMax);\n\n          const isEdgeSplitCapable = mode === 'edge' && (state.channel === 'width' || state.channel === 'opacity');\n          const pendingValue = state.pending.value ?? live?.value;\n          const isSplit =\n            isEdgeSplitCapable &&\n            pendingValue &&\n            typeof pendingValue === 'object' &&\n            ('source' in pendingValue || 'target' in pendingValue);\n\n          if (isEdgeSplitCapable) {\n            const toggle = createSegmentedToggleControl({\n              checked: Boolean(isSplit),\n              onLabel: 'Source/Target',\n              offLabel: 'Single',\n            });\n            wrap.appendChild(toggle);\n\n            toggle.addEventListener('change', () => {\n              const raw = state.pending.value ?? live?.value;\n              const seed = Number.isFinite(Number(raw)) ? Number(raw) : 1;\n              if (toggle.checked) {\n                state.pending = { ...state.pending, type: 'constant', value: { source: seed, target: seed } };\n              } else {\n                const src = raw && typeof raw === 'object' ? Number(raw.source ?? raw.start) : seed;\n                const next = Number.isFinite(src) ? src : seed;\n                state.pending = { ...state.pending, type: 'constant', value: next };\n              }\n              setDirty(true);\n              renderEditor();\n            });\n          }\n\n          const commit = (value, endpoint) => {\n            const n = clampNumber(value, { min: minAllowed, max: maxAllowed });\n            if (n == null) return;\n\n            if (isSplit) {\n              const current = state.pending.value && typeof state.pending.value === 'object' ? state.pending.value : {};\n              const next = endpoint === 'target'\n                ? { ...current, target: n }\n                : { ...current, source: n };\n              state.pending = { ...state.pending, type: 'constant', value: next };\n            } else {\n              state.pending = { ...state.pending, type: 'constant', value: n };\n            }\n            setDirty(true);\n          };\n\n          const labelStyle = (el) => {\n            el.style.fontSize = '12px';\n            el.style.color = 'var(--helios-ui-muted)';\n          };\n\n          if (isSplit) {\n            const srcSeed = Number(pendingValue?.source ?? pendingValue?.start ?? 1);\n            const srcValue = Number.isFinite(srcSeed) ? srcSeed : 1;\n            const sourceLabel = document.createElement('div');\n            sourceLabel.textContent = 'Source';\n            labelStyle(sourceLabel);\n            wrap.appendChild(sourceLabel);\n            const srcControls = new SuggestedSliderControls({\n              value: srcValue,\n              suggested: [suggestMin, suggestMax],\n              step,\n              inputMin: minAllowed,\n              inputMax: maxAllowed,\n              onCommit: (v) => commit(v, 'source'),\n            });\n            registerControl(srcControls);\n            wrap.appendChild(srcControls.element);\n\n            const dstSeed = Number(pendingValue?.target ?? pendingValue?.end ?? srcValue);\n            const dstValue = Number.isFinite(dstSeed) ? dstSeed : srcValue;\n            const targetLabel = document.createElement('div');\n            targetLabel.textContent = 'Target';\n            labelStyle(targetLabel);\n            wrap.appendChild(targetLabel);\n            const dstControls = new SuggestedSliderControls({\n              value: dstValue,\n              suggested: [suggestMin, suggestMax],\n              step,\n              inputMin: minAllowed,\n              inputMax: maxAllowed,\n              onCommit: (v) => commit(v, 'target'),\n            });\n            registerControl(dstControls);\n            wrap.appendChild(dstControls.element);\n          } else {\n            const fallbackValue = Number.isFinite(Number(live?.value)) ? Number(live.value) : 1;\n            const seeded = Number.isFinite(Number(state.pending.value)) ? Number(state.pending.value) : fallbackValue;\n            if (!Number.isFinite(Number(state.pending.value))) {\n              state.pending = { ...state.pending, type: 'constant', value: seeded };\n            }\n            const controls = new SuggestedSliderControls({\n              value: seeded,\n              suggested: [suggestMin, suggestMax],\n              step,\n              inputMin: minAllowed,\n              inputMax: maxAllowed,\n              onCommit: (v) => commit(v),\n            });\n            registerControl(controls);\n            wrap.appendChild(controls.element);\n          }\n\n          editorBody.appendChild(createAlignedRow({\n            title: 'Value',\n            hint: 'Use a fixed value for every item (node/edge).',\n            controls: wrap,\n          }).row);\n        }\n\n        if (pendingType === 'constant' && isPosition) {\n          const wrap = document.createElement('div');\n          wrap.style.display = 'flex';\n          wrap.style.gap = '8px';\n\n          const makeNum = () => {\n            const input = document.createElement('input');\n            input.type = 'number';\n            input.className = 'helios-ui-number';\n            return input;\n          };\n\n          const xInput = makeNum();\n          const yInput = makeNum();\n          const zInput = makeNum();\n\n          const seeded = (() => {\n            const v = state.pending.value ?? live?.value;\n            const isArrayLike = Array.isArray(v) || ArrayBuffer.isView(v);\n            if (isArrayLike && v.length >= 3) {\n              const x = Number(v[0]);\n              const y = Number(v[1]);\n              const z = Number(v[2]);\n              if (Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z)) return [x, y, z];\n            }\n            return [0, 0, 0];\n          })();\n\n          if (!Array.isArray(state.pending.value) && !ArrayBuffer.isView(state.pending.value)) {\n            state.pending = { ...state.pending, type: 'constant', value: seeded };\n          }\n\n          xInput.value = String(seeded[0]);\n          yInput.value = String(seeded[1]);\n          zInput.value = String(seeded[2]);\n\n          const commit = () => {\n            const x = clampNumber(xInput.value);\n            const y = clampNumber(yInput.value);\n            const z = clampNumber(zInput.value);\n            if (x == null || y == null || z == null) return;\n            state.pending = { ...state.pending, type: 'constant', value: [x, y, z] };\n            setDirty(true);\n          };\n          xInput.addEventListener('change', commit);\n          yInput.addEventListener('change', commit);\n          zInput.addEventListener('change', commit);\n\n          wrap.appendChild(xInput);\n          wrap.appendChild(yInput);\n          wrap.appendChild(zInput);\n          editorBody.appendChild(createAlignedRow({\n            title: 'Value',\n            hint: 'Use a fixed value for every item (node/edge).',\n            controls: wrap,\n          }).row);\n        }\n\n        if (pendingType === 'constant' && isColor) {\n          const wrap = document.createElement('div');\n          wrap.style.display = 'grid';\n          wrap.style.gap = '6px';\n          wrap.style.width = '100%';\n\n          const isEdgeSplitCapable = mode === 'edge' && state.channel === 'color';\n          const pendingValue = state.pending.value ?? live?.value;\n          const isSplit =\n            isEdgeSplitCapable &&\n            pendingValue &&\n            typeof pendingValue === 'object' &&\n            ('source' in pendingValue || 'target' in pendingValue);\n\n          const seedSingle = () => {\n            const seed = typeof pendingValue === 'string'\n              ? pendingValue\n              : (typeof live?.value === 'string' ? live.value : '#ffffff');\n            return typeof seed === 'string' && seed.length ? seed : '#ffffff';\n          };\n\n          if (isEdgeSplitCapable) {\n            const toggle = createSegmentedToggleControl({\n              checked: Boolean(isSplit),\n              onLabel: 'Source/Target',\n              offLabel: 'Single',\n            });\n            wrap.appendChild(toggle);\n\n            toggle.addEventListener('change', () => {\n              const seed = seedSingle();\n              if (toggle.checked) {\n                state.pending = { ...state.pending, type: 'constant', value: { source: seed, target: seed } };\n              } else {\n                const raw = state.pending.value ?? live?.value;\n                const next = raw && typeof raw === 'object' ? String(raw.source ?? raw.start ?? seed) : seed;\n                state.pending = { ...state.pending, type: 'constant', value: next };\n              }\n              setDirty(true);\n              renderEditor();\n            });\n          }\n\n          const makeColorControls = ({ label, getValue, setValue }) => {\n            const row = document.createElement('div');\n            row.style.display = 'flex';\n            row.style.gap = '8px';\n            row.style.alignItems = 'center';\n            row.style.width = '100%';\n\n            if (label) {\n              const labelEl = document.createElement('div');\n              labelEl.textContent = label;\n              labelEl.style.fontSize = '12px';\n              labelEl.style.color = 'var(--helios-ui-muted)';\n              labelEl.style.minWidth = '52px';\n              row.appendChild(labelEl);\n            }\n\n            const swatchWrap = document.createElement('div');\n            swatchWrap.className = 'helios-ui-color-swatch';\n\n            const swatch = document.createElement('div');\n            swatch.className = 'helios-ui-color-swatch__swatch';\n\n            const colorInput = document.createElement('input');\n            colorInput.type = 'color';\n            colorInput.className = 'helios-ui-color-swatch__input';\n            colorInput.setAttribute('aria-label', label ? `${label} color` : 'Color');\n\n            const alphaInput = document.createElement('input');\n            alphaInput.type = 'number';\n            alphaInput.className = 'helios-ui-number';\n            alphaInput.min = '0';\n            alphaInput.max = '1';\n            alphaInput.step = '0.01';\n            alphaInput.style.maxWidth = '88px';\n            alphaInput.title = 'Alpha';\n\n            const alphaLabel = document.createElement('span');\n            alphaLabel.textContent = 'Alpha';\n            alphaLabel.style.color = 'var(--helios-ui-muted)';\n\n            const rawValue = getValue();\n            const liveColor = typeof rawValue === 'string' ? rawValue : '#ffffff';\n            const raw = liveColor.startsWith('#') ? liveColor.slice(1) : liveColor;\n            const baseHex = raw.length >= 6 ? `#${raw.slice(0, 6)}` : '#ffffff';\n            const alphaHex = raw.length === 8 ? raw.slice(6, 8) : 'ff';\n            const alpha = Math.round(parseInt(alphaHex, 16) / 255 * 100) / 100;\n\n            colorInput.value = baseHex;\n            alphaInput.value = String(Number.isFinite(alpha) ? alpha : 1);\n            swatch.style.background = colorInput.value;\n\n            const commit = () => {\n              const a = clampNumber(alphaInput.value, { min: 0, max: 1 });\n              if (a == null) return;\n              setValue(toHex8(colorInput.value, a));\n              setDirty(true);\n              swatch.style.background = colorInput.value;\n            };\n            colorInput.addEventListener('input', commit);\n            alphaInput.addEventListener('change', commit);\n\n            swatchWrap.appendChild(swatch);\n            swatchWrap.appendChild(colorInput);\n            row.appendChild(swatchWrap);\n            row.appendChild(alphaLabel);\n            row.appendChild(alphaInput);\n            return row;\n          };\n\n          if (isSplit) {\n            if (!state.pending.value || typeof state.pending.value !== 'object') {\n              const seed = seedSingle();\n              state.pending = { ...state.pending, type: 'constant', value: { source: seed, target: seed } };\n            }\n            wrap.appendChild(makeColorControls({\n              label: 'Source',\n              getValue: () => String(state.pending.value?.source ?? seedSingle()),\n              setValue: (v) => {\n                state.pending = { ...state.pending, type: 'constant', value: { ...(state.pending.value ?? {}), source: v } };\n              },\n            }));\n            wrap.appendChild(makeColorControls({\n              label: 'Target',\n              getValue: () => String(state.pending.value?.target ?? state.pending.value?.source ?? seedSingle()),\n              setValue: (v) => {\n                state.pending = { ...state.pending, type: 'constant', value: { ...(state.pending.value ?? {}), target: v } };\n              },\n            }));\n            editorBody.appendChild(createAlignedRow({\n              title: 'Color',\n              hint: 'Constant color applied to all items.',\n              controls: wrap,\n            }).row);\n          } else {\n            if (!(typeof state.pending.value === 'string' && state.pending.value.length > 0)) {\n              state.pending = { ...state.pending, type: 'constant', value: seedSingle() };\n            }\n            wrap.appendChild(makeColorControls({\n              label: null,\n              getValue: () => String(state.pending.value ?? seedSingle()),\n              setValue: (v) => {\n                state.pending = { ...state.pending, type: 'constant', value: v };\n              },\n            }));\n            editorBody.appendChild(createAlignedRow({\n              title: 'Color',\n              hint: 'Constant color applied to all items.',\n              controls: wrap,\n            }).row);\n          }\n\t        }\n\n\t        if (pendingType === 'linear') {\n\t          state.pending = normalizeRuleList(state.pending);\n\n          const transformWrap = document.createElement('div');\n          transformWrap.style.display = 'flex';\n          transformWrap.style.gap = '8px';\n          transformWrap.style.alignItems = 'center';\n          transformWrap.style.width = '100%';\n\n          const transformSelect = document.createElement('select');\n          transformSelect.className = 'helios-ui-select';\n          transformSelect.style.flex = '1 1 auto';\n          transformSelect.style.maxWidth = 'none';\n          transformSelect.style.minWidth = '0';\n          for (const optVal of ['linear', 'log', 'log1p', 'logit', 'power', 'percentile']) {\n            const opt = document.createElement('option');\n            opt.value = optVal;\n            opt.textContent = formatTransformLabel(optVal);\n            transformSelect.appendChild(opt);\n          }\n          const resolvedTransformType = state.pending.transformType === 'quantile'\n            ? 'percentile'\n            : (state.pending.transformType ?? 'linear');\n          transformSelect.value = String(resolvedTransformType);\n\n          const powerInput = document.createElement('input');\n          powerInput.type = 'number';\n          powerInput.className = 'helios-ui-number';\n          powerInput.style.maxWidth = '96px';\n          powerInput.style.flex = '0 0 auto';\n          powerInput.value = String(Number.isFinite(Number(state.pending.transformPower)) ? state.pending.transformPower : 1);\n          powerInput.hidden = transformSelect.value !== 'power';\n\n          transformSelect.addEventListener('change', () => {\n            const nextType = transformSelect.value || 'linear';\n            const prevType = state.pending.transformType ?? 'linear';\n            powerInput.hidden = nextType !== 'power';\n            const nextPending = { ...state.pending, type: 'linear', transformType: nextType };\n            if (isPercentileTransform(nextType)) {\n              nextPending.domain = [0, 1];\n              markDomainAuto(nextPending, true);\n            } else if (isPercentileTransform(prevType)) {\n              const attr = typeof state.pending.attributes === 'string' ? state.pending.attributes : null;\n              nextPending.domain = attr ? suggestDomainForAttribute(mode, attr) : [0, 1];\n              markDomainAuto(nextPending, true);\n            }\n            state.pending = nextPending;\n            if (nextType !== 'power') {\n              state.pending = { ...state.pending, type: 'linear', transformPower: undefined };\n            } else {\n              state.pending = { ...state.pending, type: 'linear', transformPower: Number(powerInput.value) || 1 };\n            }\n            setDirty(true);\n            renderEditor();\n          });\n\n          powerInput.addEventListener('change', () => {\n            const p = clampNumber(powerInput.value);\n            if (p == null) return;\n            state.pending = { ...state.pending, type: 'linear', transformType: 'power', transformPower: p };\n            setDirty(true);\n            renderEditor();\n          });\n\n          transformWrap.appendChild(transformSelect);\n          transformWrap.appendChild(powerInput);\n          editorBody.appendChild(createAlignedRow({\n            title: 'Transform',\n            hint: 'Optional pre-transform applied before scaling.',\n            controls: transformWrap,\n          }).row);\n\n          const domainWrap = document.createElement('div');\n          domainWrap.style.display = 'grid';\n          domainWrap.style.gap = '2px';\n          domainWrap.style.width = '100%';\n\n          const domainAttr = typeof state.pending.attributes === 'string' ? state.pending.attributes : null;\n          const transformType = state.pending.transformType ?? 'linear';\n          const percentile = isPercentileTransform(transformType);\n          const extent = percentile ? { min: 0, max: 1 } : computeScalarExtent(mode, domainAttr);\n          const min = extent?.min ?? 0;\n          const max = extent?.max ?? 1;\n          const isIntegerDomain = Boolean(extent?.isInteger);\n          const step = percentile ? 0.01 : suggestStepForRange(min, max, isIntegerDomain);\n\n          if (percentile && (!isFiniteNumberPair(state.pending.domain) || state.pending.domain[0] !== 0 || state.pending.domain[1] !== 1)) {\n            const nextPending = { ...state.pending, type: 'linear', domain: [0, 1] };\n            markDomainAuto(nextPending, true);\n            state.pending = nextPending;\n          } else if (!isFiniteNumberPair(state.pending.domain) && domainAttr) {\n            const nextPending = { ...state.pending, type: 'linear', domain: [min, max] };\n            markDomainAuto(nextPending, true);\n            state.pending = nextPending;\n          }\n          const domain = isFiniteNumberPair(state.pending.domain) ? state.pending.domain : [min, max];\n\n          const domainHistogram = (showDistributions && domainAttr)\n            ? createRangeHistogram({\n              min,\n              max,\n              range: domain,\n              scope: mode,\n              rawName: domainAttr,\n            })\n            : null;\n          if (domainHistogram) domainWrap.appendChild(domainHistogram.element);\n\n          const slider = new TwoHandleRange({\n            min,\n            max,\n            step,\n            value: domain,\n            onChange: (next) => {\n              const nextPending = { ...state.pending, type: 'linear', domain: next };\n              markDomainAuto(nextPending, false);\n              state.pending = nextPending;\n              setDirty(true);\n              d0.value = String(next[0]);\n              d1.value = String(next[1]);\n              domainHistogram?.setMarkers(next[0], next[1]);\n            },\n          });\n          registerControl(slider);\n\n          const domainValues = document.createElement('div');\n          domainValues.className = 'helios-ui-range2__values';\n          const d0 = document.createElement('input');\n          d0.type = 'number';\n          d0.className = 'helios-ui-number';\n          d0.style.maxWidth = '96px';\n          const d1 = document.createElement('input');\n          d1.type = 'number';\n          d1.className = 'helios-ui-number';\n          d1.style.maxWidth = '96px';\n\n          d0.value = String(domain[0] ?? min);\n          d1.value = String(domain[1] ?? max);\n\n          const commitDomainTyped = () => {\n            const a = clampNumber(d0.value);\n            const b = clampNumber(d1.value);\n            if (a == null || b == null) return;\n            let lo = Math.min(a, b);\n            let hi = Math.max(a, b);\n            if (isIntegerDomain) {\n              lo = Math.round(lo);\n              hi = Math.round(hi);\n            }\n            const loSlider = Math.max(min, Math.min(max, lo));\n            const hiSlider = Math.max(min, Math.min(max, hi));\n            slider.aInput.value = String(loSlider);\n            slider.bInput.value = String(hiSlider);\n            slider.setVisual(loSlider, hiSlider);\n            const nextPending = { ...state.pending, type: 'linear', domain: [lo, hi] };\n            markDomainAuto(nextPending, false);\n            state.pending = nextPending;\n            setDirty(true);\n            domainHistogram?.setMarkers(lo, hi);\n          };\n          d0.addEventListener('change', commitDomainTyped);\n          d1.addEventListener('change', commitDomainTyped);\n\n          domainValues.appendChild(d0);\n          domainValues.appendChild(d1);\n          domainWrap.appendChild(slider.element);\n          domainWrap.appendChild(domainValues);\n          editorBody.appendChild(createAlignedRow({\n            title: 'Domain',\n            hint: 'Input range used for scaling (min/max).',\n            controls: domainWrap,\n          }).row);\n\n          const rangeWrap = document.createElement('div');\n          rangeWrap.style.display = 'grid';\n          rangeWrap.style.gap = '2px';\n          rangeWrap.style.width = '100%';\n\n          const minAllowed = state.channel === 'opacity' ? 0 : 0;\n          const maxAllowed = state.channel === 'opacity' ? 1 : null;\n\n          const suggestedRange = suggestRangeForChannel(mode, state.channel);\n          const sliderMin = suggestedRange[0];\n          const sliderMax = suggestedRange[1];\n          const stepOut = suggestStepForRange(sliderMin, sliderMax);\n\n          const range = isFiniteNumberPair(state.pending.range) ? state.pending.range : suggestedRange;\n          if (!isFiniteNumberPair(state.pending.range)) {\n            state.pending = { ...state.pending, type: 'linear', range };\n          }\n\n          const rangeSlider = new TwoHandleRange({\n            min: sliderMin,\n            max: sliderMax,\n            step: stepOut,\n            value: range,\n            onChange: (next) => {\n              state.pending = { ...state.pending, type: 'linear', range: next };\n              setDirty(true);\n              r0.value = String(next[0]);\n              r1.value = String(next[1]);\n            },\n          });\n          registerControl(rangeSlider);\n\n          const rangeValues = document.createElement('div');\n          rangeValues.className = 'helios-ui-range2__values';\n          const r0 = document.createElement('input');\n          r0.type = 'number';\n          r0.className = 'helios-ui-number';\n          r0.style.maxWidth = '96px';\n          r0.step = String(stepOut);\n          if (minAllowed != null) r0.min = String(minAllowed);\n          if (maxAllowed != null) r0.max = String(maxAllowed);\n          const r1 = document.createElement('input');\n          r1.type = 'number';\n          r1.className = 'helios-ui-number';\n          r1.style.maxWidth = '96px';\n          r1.step = String(stepOut);\n          if (minAllowed != null) r1.min = String(minAllowed);\n          if (maxAllowed != null) r1.max = String(maxAllowed);\n\n          r0.value = String(range[0] ?? suggestedRange[0]);\n          r1.value = String(range[1] ?? suggestedRange[1]);\n\n          const commitRangeTyped = () => {\n            const a = clampNumber(r0.value, { min: minAllowed, max: maxAllowed });\n            const b = clampNumber(r1.value, { min: minAllowed, max: maxAllowed });\n            if (a == null || b == null) return;\n            const lo = Math.min(a, b);\n            const hi = Math.max(a, b);\n            const loSlider = Math.max(sliderMin, Math.min(sliderMax, lo));\n            const hiSlider = Math.max(sliderMin, Math.min(sliderMax, hi));\n            rangeSlider.aInput.value = String(loSlider);\n            rangeSlider.bInput.value = String(hiSlider);\n            rangeSlider.setVisual(loSlider, hiSlider);\n            state.pending = { ...state.pending, type: 'linear', range: [lo, hi] };\n            setDirty(true);\n          };\n          r0.addEventListener('change', commitRangeTyped);\n          r1.addEventListener('change', commitRangeTyped);\n\n          rangeValues.appendChild(r0);\n          rangeValues.appendChild(r1);\n          rangeWrap.appendChild(rangeSlider.element);\n          rangeWrap.appendChild(rangeValues);\n\n          editorBody.appendChild(createAlignedRow({\n            title: 'Range',\n            hint: 'Output range produced after scaling.',\n            controls: rangeWrap,\n\t          }).row);\n\n\t          const advanced = document.createElement('div');\n\n\t\t          const defaultWrap = document.createElement('div');\n\t\t          defaultWrap.style.display = 'flex';\n\t\t          defaultWrap.style.gap = '8px';\n\t\t          defaultWrap.style.alignItems = 'center';\n\t\t          defaultWrap.style.width = '100%';\n\n\t\t          const defaultInput = document.createElement('input');\n\t\t          defaultInput.type = 'number';\n\t\t          defaultInput.className = 'helios-ui-number';\n\t\t          defaultInput.style.width = '100%';\n\t\t          defaultInput.style.flex = '1 1 auto';\n\t\t          defaultInput.style.minWidth = '0';\n\t          const defaultSeed = Number.isFinite(Number(state.pending.defaultValue)) ? Number(state.pending.defaultValue) : 0;\n\t          defaultInput.value = String(defaultSeed);\n\t          defaultInput.addEventListener('change', () => {\n\t            const v = clampNumber(defaultInput.value);\n\t            if (v == null) return;\n\t            state.pending = { ...state.pending, type: 'linear', defaultValue: v };\n\t            setDirty(true);\n\t          });\n\n\t\t          const clearDefault = document.createElement('button');\n\t\t          clearDefault.type = 'button';\n\t\t          clearDefault.className = 'helios-ui-button helios-ui-button--compact';\n\t\t          clearDefault.textContent = '×';\n\t\t          clearDefault.setAttribute('aria-label', 'Clear default value');\n\t\t          clearDefault.addEventListener('click', () => {\n\t\t            state.pending = { ...state.pending, type: 'linear', defaultValue: undefined };\n\t\t            setDirty(true);\n\t\t            renderEditor();\n\t\t          });\n\t\t          tooltips.attachTooltip(clearDefault, 'Clear the default value.');\n\n\t\t          defaultWrap.appendChild(defaultInput);\n\t\t          defaultWrap.appendChild(clearDefault);\n\t\t          advanced.appendChild(createAlignedRow({\n\t\t            title: 'Default',\n\t\t            hint: 'Fallback value when input is missing/invalid.',\n\t\t            controls: defaultWrap,\n\t\t          }).row);\n\n\t\t          const rulesWrap = document.createElement('div');\n\t\t          rulesWrap.style.display = 'grid';\n\t\t          rulesWrap.style.gap = '8px';\n\t\t          rulesWrap.style.width = '100%';\n\n\t\t          const rulesList = document.createElement('div');\n\t\t          rulesList.style.display = 'grid';\n\t\t          rulesList.style.gap = '8px';\n\t\t          rulesWrap.appendChild(rulesList);\n\n\t          const renderRulesList = () => {\n\t            rulesList.textContent = '';\n\t            const rules = Array.isArray(state.pending.rules) ? state.pending.rules : [];\n\t            for (let i = 0; i < rules.length; i += 1) {\n\t              const rule = rules[i];\n\t              const spec = rule?.__ui && typeof rule.__ui === 'object'\n\t                ? rule.__ui\n\t                : { op: 'eq', rhs: -1, out: 0 };\n\n\t              const item = document.createElement('div');\n              item.style.display = 'grid';\n              item.style.gap = '6px';\n              item.style.position = 'relative';\n              item.style.padding = '8px';\n              item.style.paddingRight = '36px';\n\t              item.style.borderRadius = '10px';\n\t              item.style.border = '1px solid color-mix(in srgb, var(--helios-ui-border) 70%, transparent)';\n\t              item.style.background = 'color-mix(in srgb, var(--helios-ui-bg-solid) 85%, transparent)';\n\n\t              const top = document.createElement('div');\n              top.style.display = 'grid';\n              top.style.gap = '8px';\n              top.style.alignItems = 'center';\n              top.style.gridTemplateColumns = 'auto minmax(0, 1fr)';\n\n              const condRow = document.createElement('div');\n              condRow.style.display = 'grid';\n              condRow.style.gridTemplateColumns = 'auto minmax(0, 1fr) minmax(0, 1fr)';\n              condRow.style.gap = '6px';\n              condRow.style.alignItems = 'center';\n              condRow.style.minWidth = '0';\n\n\t              const opSelect = document.createElement('select');\n              opSelect.className = 'helios-ui-select helios-ui-select--compact';\n              opSelect.style.maxWidth = '56px';\n              opSelect.style.width = '100%';\n\t              const ops = [\n\t                { value: 'eq', label: '=' },\n\t                { value: 'lt', label: '<' },\n\t                { value: 'lte', label: '≤' },\n\t                { value: 'gt', label: '>' },\n\t                { value: 'gte', label: '≥' },\n\t                { value: 'nan', label: 'NaN' },\n\t                { value: 'nullish', label: 'null' },\n\t              ];\n\t              for (const op of ops) {\n\t                const opt = document.createElement('option');\n\t                opt.value = op.value;\n\t                opt.textContent = op.label;\n\t                opSelect.appendChild(opt);\n\t              }\n\t              opSelect.value = ops.some((o) => o.value === spec.op) ? spec.op : 'eq';\n\n\t              const rhsInput = document.createElement('input');\n\t              rhsInput.type = 'number';\n\t              rhsInput.className = 'helios-ui-number';\n              rhsInput.style.maxWidth = 'none';\n              rhsInput.style.width = '100%';\n\t              rhsInput.value = spec.rhs != null ? String(spec.rhs) : '';\n\t              rhsInput.placeholder = 'value';\n\n\t              const outInput = document.createElement('input');\n\t              outInput.type = 'number';\n\t              outInput.className = 'helios-ui-number';\n              outInput.style.maxWidth = '140px';\n              outInput.style.flex = '1 1 96px';\n              outInput.style.minWidth = '0';\n\t              outInput.value = spec.out != null ? String(spec.out) : String(rule.value ?? 0);\n\t              outInput.placeholder = 'output';\n\n\t              const rhsVisible = () => ['eq', 'lt', 'lte', 'gt', 'gte'].includes(opSelect.value);\n\t              rhsInput.style.display = rhsVisible() ? '' : 'none';\n\n\t              const getLiveSpec = () => {\n\t                const current = state.pending?.rules?.[i]?.__ui;\n\t                return current && typeof current === 'object' ? current : spec;\n\t              };\n\n\t              const commitRule = (nextSpec) => {\n\t                const predicate = buildRulePredicate(nextSpec);\n\t                const out = nextSpec.out != null ? Number(nextSpec.out) : undefined;\n\t                const nextRule = {\n\t                  ...rule,\n\t                  __ui: nextSpec,\n\t                  when: (inputs) => predicate(inputs),\n\t                  value: out,\n\t                };\n\t                const nextRules = rules.slice();\n\t                nextRules[i] = nextRule;\n\t                state.pending = { ...state.pending, type: 'linear', rules: nextRules };\n\t                setDirty(true);\n\t              };\n\n\t              opSelect.addEventListener('change', () => {\n\t                rhsInput.style.display = rhsVisible() ? '' : 'none';\n\t                commitRule({ ...getLiveSpec(), op: opSelect.value });\n\t              });\n\n\t              rhsInput.addEventListener('change', () => {\n\t                const rhs = clampNumber(rhsInput.value);\n\t                commitRule({ ...getLiveSpec(), rhs });\n\t              });\n\n\t              outInput.addEventListener('change', () => {\n\t                const out = clampNumber(outInput.value);\n\t                commitRule({ ...getLiveSpec(), out });\n\t              });\n\n\t              const ifLabel = createRuleKeyword(i === 0 ? 'if' : 'else if');\n              condRow.appendChild(ifLabel);\n              condRow.appendChild(opSelect);\n              condRow.appendChild(rhsInput);\n              tooltips.attachTooltip(opSelect, 'Condition operator.');\n              tooltips.attachTooltip(rhsInput, 'Comparison value.');\n              tooltips.attachTooltip(outInput, 'Override output.');\n\n              const remove = document.createElement('button');\n              remove.type = 'button';\n              remove.className = 'helios-ui-button helios-ui-button--compact';\n              remove.textContent = '×';\n              remove.setAttribute('aria-label', 'Remove override');\n              tooltips.attachTooltip(remove, 'Remove this override.');\n              remove.style.position = 'absolute';\n              remove.style.top = '8px';\n              remove.style.right = '8px';\n\t              remove.addEventListener('click', () => {\n\t                const nextRules = rules.filter((_, idx) => idx !== i);\n\t                state.pending = { ...state.pending, type: 'linear', rules: nextRules };\n\t                setDirty(true);\n\t                renderRulesList();\n\t              });\n\n              top.appendChild(condRow);\n\n              const outWrap = document.createElement('div');\n              outWrap.style.display = 'grid';\n              outWrap.style.gridTemplateColumns = 'auto minmax(0, 1fr)';\n              outWrap.style.gap = '6px';\n              outWrap.style.alignItems = 'center';\n              outWrap.style.width = '100%';\n\n              outInput.style.width = '100%';\n\n              outWrap.appendChild(createRuleKeyword('then'));\n              outWrap.appendChild(outInput);\n\n              item.appendChild(top);\n              item.appendChild(outWrap);\n              item.appendChild(remove);\n              rulesList.appendChild(item);\n            }\n          };\n\n\t          const addRuleButton = document.createElement('button');\n\t          addRuleButton.type = 'button';\n\t          addRuleButton.className = 'helios-ui-button helios-ui-button--compact';\n\t          addRuleButton.textContent = 'Add';\n\t          addRuleButton.setAttribute('aria-label', 'Add override');\n\t          tooltips.attachTooltip(addRuleButton, 'Add a value override (rule).');\n\t          addRuleButton.addEventListener('click', () => {\n\t            const spec = { op: 'eq', rhs: -1, out: 0 };\n\t            const predicate = buildRulePredicate(spec);\n\t            const nextRule = { __ui: spec, when: (inputs) => predicate(inputs), value: spec.out };\n\t            const nextRules = [...(state.pending.rules ?? []), nextRule];\n\t            state.pending = { ...state.pending, type: 'linear', rules: nextRules };\n\t            setDirty(true);\n\t            renderRulesList();\n\t          });\n\n\t          renderRulesList();\n\t          const overridesSection = createSubsectionHeader({\n\t            title: 'Overrides',\n\t            tooltip: 'Rules applied before the base mapping.',\n\t            action: addRuleButton,\n\t          });\n\t          overridesSection.wrap.appendChild(rulesWrap);\n\t          advanced.appendChild(overridesSection.wrap);\n\n\t          const advancedStack = new PanelStack();\n\t          advancedStack.add({ id: `${mode}-mapper-advanced`, title: 'Advanced', collapsed: true, content: advanced });\n\t          editorBody.appendChild(advancedStack.element);\n\t          ui._controlCleanups.add(() => advancedStack.destroy());\n\t\t        }\n\n          if (pendingType === 'categorical') {\n            const ensureCategoricalMeta = () => {\n              const meta = state.pending.meta && typeof state.pending.meta === 'object' ? { ...state.pending.meta } : {};\n              const categorical = meta.categorical && typeof meta.categorical === 'object' ? { ...meta.categorical } : {};\n              if (!categorical.sortOrder) categorical.sortOrder = 'frequency';\n              if (categorical.maxCategories == null) categorical.maxCategories = null;\n              if (!categorical.palette) categorical.palette = defaultCategoricalPalette;\n              if (categorical.preferScheme == null) categorical.preferScheme = true;\n              if (!categorical.numericDirection) categorical.numericDirection = 'asc';\n              if (categorical.numericRange == null) categorical.numericRange = null;\n              meta.categorical = categorical;\n              return meta;\n            };\n\n            const updatePendingMeta = (meta) => {\n              state.pending = { ...state.pending, type: 'categorical', meta };\n            };\n\n            if (!state.pending.meta || typeof state.pending.meta !== 'object') {\n              state.pending = { ...state.pending, type: 'categorical', meta: ensureCategoricalMeta() };\n            }\n            const getCategoricalSettings = () => {\n              const metaNow = ensureCategoricalMeta();\n              const categoricalNow = metaNow.categorical ?? {};\n              const paletteNameNow = categoricalNow.palette ?? defaultCategoricalPalette;\n              const preferSchemeNow = categoricalNow.preferScheme !== false;\n              const sortOrderNow = categoricalNow.sortOrder ?? 'frequency';\n              const rawMax = categoricalNow.maxCategories;\n              const parsedMax = rawMax == null || rawMax === '' ? null : Number(rawMax);\n              const maxCategoriesNow = Number.isFinite(parsedMax)\n                ? Math.max(1, Math.floor(parsedMax))\n                : null;\n              return {\n                meta: metaNow,\n                categorical: categoricalNow,\n                paletteName: paletteNameNow,\n                preferScheme: preferSchemeNow,\n                sortOrder: sortOrderNow,\n                maxCategories: maxCategoriesNow,\n              };\n            };\n\n            const { paletteName, preferScheme, sortOrder, maxCategories } = getCategoricalSettings();\n\n            const attrName = typeof state.pending.attributes === 'string' ? state.pending.attributes : '';\n            const attrInfo = attrName ? getAttributeInfo(mode, attrName) : null;\n            if (!attrName) {\n              const note = document.createElement('div');\n              note.style.color = 'var(--helios-ui-muted)';\n              note.textContent = 'Select a categorical attribute to configure colors.';\n              editorBody.appendChild(note);\n            }\n\n            if (attrName && attrInfo && isStringAttributeType(attrInfo.type)) {\n              const scan = scanStringCategorization(mode, attrName);\n              const note = document.createElement('div');\n              note.style.color = 'var(--helios-ui-muted)';\n              note.textContent = scan.ok\n                ? `String attribute detected. ${scan.uniqueCount ?? 0} unique values (max length ${scan.maxLength ?? 0}).`\n                : `Cannot categorize: ${scan.reason}`;\n              editorBody.appendChild(note);\n\n              const convertButton = document.createElement('button');\n              convertButton.type = 'button';\n              convertButton.className = 'helios-ui-button helios-ui-button--compact';\n              convertButton.textContent = 'Convert to categorical';\n              convertButton.disabled = !scan.ok;\n              convertButton.addEventListener('click', () => {\n                const network = net();\n                if (!network) return;\n                const order = sortOrder === 'manual' ? 'frequency' : sortOrder;\n                try {\n                  if (mode === 'edge') {\n                    network.categorizeEdgeAttribute?.(attrName, { sortOrder: order });\n                  } else {\n                    network.categorizeNodeAttribute?.(attrName, { sortOrder: order });\n                  }\n                  state.pending = { ...state.pending, type: 'categorical', domain: [], range: [] };\n                  setDirty(true);\n                  renderEditor();\n                } catch (error) {\n                  console.warn('Failed to categorize string attribute', error);\n                }\n              });\n              editorBody.appendChild(createAlignedRow({\n                title: 'Categorize',\n                hint: 'Convert string values to categorical codes for mapping.',\n                controls: convertButton,\n              }).row);\n              syncApplyEnabled();\n              return;\n            }\n\n            if (attrName && attrInfo && !isCategoricalAttributeType(attrInfo.type)) {\n              const note = document.createElement('div');\n              note.style.color = 'var(--helios-ui-muted)';\n              note.textContent = 'Selected attribute is not categorical.';\n              editorBody.appendChild(note);\n              syncApplyEnabled();\n              return;\n            }\n\n            const entriesRaw = attrName ? resolveCategoryEntries(mode, attrName) : [];\n            if (!entriesRaw.length) {\n              const note = document.createElement('div');\n              note.style.color = 'var(--helios-ui-muted)';\n              note.textContent = 'No categories found for this attribute.';\n              editorBody.appendChild(note);\n              syncApplyEnabled();\n              return;\n            }\n\n            const pendingDomain = Array.isArray(state.pending.domain) ? state.pending.domain : [];\n            const entries = entriesRaw;\n            if (!entries.length) {\n              const note = document.createElement('div');\n              note.style.color = 'var(--helios-ui-muted)';\n              note.textContent = 'No categories found for this attribute.';\n              editorBody.appendChild(note);\n              syncApplyEnabled();\n              return;\n            }\n            const pendingRange = Array.isArray(state.pending.range) ? state.pending.range : [];\n            const entryIds = new Set(entries.map((entry) => entry.id));\n            const hasMissing = pendingDomain.some((id) => !entryIds.has(id));\n            const hasNew = entries.some((entry) => !pendingDomain.includes(entry.id));\n            const currentVisibleEntries = pendingDomain.map((id) => entries.find((entry) => entry.id === id)).filter(Boolean);\n            const hasHiddenEntries = entries.some((entry) => !pendingDomain.includes(entry.id));\n            const specialNoneVisible = currentVisibleEntries.some((entry) => entry.specialNone === true);\n            const regularVisible = currentVisibleEntries.some((entry) => entry.specialNone !== true);\n            let specialNoneNotLast = false;\n            let seenSpecialNone = false;\n            for (const entry of currentVisibleEntries) {\n              if (entry.specialNone === true) {\n                seenSpecialNone = true;\n                continue;\n              }\n              if (seenSpecialNone) {\n                specialNoneNotLast = true;\n                break;\n              }\n            }\n            const needsSpecialNoneRebuild =\n              (hasHiddenEntries && specialNoneVisible && regularVisible) ||\n              (!hasHiddenEntries && specialNoneNotLast);\n            const needsRebuild =\n              pendingDomain.length === 0 ||\n              pendingRange.length !== pendingDomain.length ||\n              hasMissing ||\n              hasNew ||\n              needsSpecialNoneRebuild;\n\n            const AUTO_MAX_CATEGORIES = 20;\n            const resolveMaxCategories = (count) => {\n              const { maxCategories, preferScheme, paletteName } = getCategoricalSettings();\n              if (maxCategories) return Math.min(count, maxCategories);\n              let cap = count;\n              if (preferScheme) {\n                const resolved = resolveColormap(paletteName);\n                if (resolved?.isScheme && typeof resolved.scheme === 'function') {\n                  const scheme = resolved.scheme();\n                  if (Array.isArray(scheme) && scheme.length) cap = Math.min(cap, scheme.length);\n                }\n              }\n              if (cap > AUTO_MAX_CATEGORIES) cap = AUTO_MAX_CATEGORIES;\n              return cap;\n            };\n\n            const buildOrderedEntries = () => {\n              const { sortOrder } = getCategoricalSettings();\n              return orderCategoricalEntries(entries, {\n                sortOrder,\n                manualOrder: Array.isArray(state.pending.domain) ? state.pending.domain : [],\n                maxCategories: resolveMaxCategories(entries.length),\n              });\n            };\n\n            const isColorChannel = state.channel === 'color' || state.channel === 'outlineColor';\n            const [suggestMin, suggestMax] = suggestRangeForChannel(mode, state.channel);\n            const numericStep = suggestStepForRange(suggestMin, suggestMax);\n            const resolveNumericSettings = () => {\n              const { categorical } = getCategoricalSettings();\n              const raw = Array.isArray(categorical?.numericRange) ? categorical.numericRange : [];\n              let min = Number(raw[0]);\n              let max = Number(raw[1]);\n              if (!Number.isFinite(min)) min = suggestMin;\n              if (!Number.isFinite(max)) max = suggestMax;\n              if (min === max) max = min + 1;\n              const direction = categorical?.numericDirection === 'desc' ? 'desc' : 'asc';\n              return { min, max, direction };\n            };\n            const buildNumericPalette = (count) => {\n              const { min, max, direction } = resolveNumericSettings();\n              if (!Number.isFinite(count) || count <= 1) return [min];\n              const span = max - min;\n              const values = Array.from({ length: count }, (_, i) => min + (span * i) / (count - 1));\n              return direction === 'desc' ? values.reverse() : values;\n            };\n\n            const applyOrdering = ({ forcePalette = false } = {}) => {\n              const { paletteName, preferScheme } = getCategoricalSettings();\n              const ordered = buildOrderedEntries();\n              const currentDomain = Array.isArray(state.pending.domain) ? state.pending.domain : [];\n              const currentRange = Array.isArray(state.pending.range) ? state.pending.range : [];\n              const colorById = new Map();\n              for (let i = 0; i < currentDomain.length; i += 1) {\n                colorById.set(currentDomain[i], currentRange[i]);\n              }\n              const palette = isColorChannel\n                ? resolveCategoricalPalette({\n                    paletteName,\n                    count: ordered.length,\n                    preferScheme,\n                  })\n                : buildNumericPalette(ordered.length);\n              const domain = ordered.map((entry) => entry.id);\n              const range = ordered.map((entry, idx) => {\n                if (!forcePalette && colorById.has(entry.id)) return colorById.get(entry.id);\n                if (isColorChannel) return palette[idx] ?? colorFromIndex(idx);\n                return palette[idx] ?? suggestMin;\n              });\n              const nextMeta = ensureCategoricalMeta();\n              const nextPending = { ...state.pending, type: 'categorical', domain, range, meta: nextMeta };\n              state.pending = nextPending;\n              setDirty(true);\n            };\n\n            if (needsRebuild) {\n              applyOrdering({ forcePalette: pendingDomain.length === 0 || pendingRange.length !== pendingDomain.length });\n            }\n\n            const orderSelect = document.createElement('select');\n            orderSelect.className = 'helios-ui-select';\n            const orderOptions = [\n              { value: 'frequency', label: 'Frequency' },\n              { value: 'alphabetical', label: 'Alphabetical' },\n              { value: 'natural', label: 'Natural' },\n              { value: 'manual', label: 'Manual' },\n            ];\n            for (const optInfo of orderOptions) {\n              const opt = document.createElement('option');\n              opt.value = optInfo.value;\n              opt.textContent = optInfo.label;\n              orderSelect.appendChild(opt);\n            }\n            orderSelect.value = orderOptions.some((o) => o.value === sortOrder) ? sortOrder : 'frequency';\n            orderSelect.addEventListener('change', () => {\n              const nextMeta = ensureCategoricalMeta();\n              nextMeta.categorical.sortOrder = orderSelect.value;\n              updatePendingMeta(nextMeta);\n              applyOrdering({ forcePalette: false });\n              renderEditor();\n            });\n            const maxWrap = document.createElement('div');\n            maxWrap.style.display = 'flex';\n            maxWrap.style.gap = '8px';\n            maxWrap.style.alignItems = 'center';\n            maxWrap.style.width = '100%';\n            const maxInput = document.createElement('input');\n            maxInput.type = 'number';\n            maxInput.className = 'helios-ui-number';\n            maxInput.min = '1';\n            maxInput.placeholder = 'Auto';\n            maxInput.value = maxCategories ? String(maxCategories) : '';\n            maxInput.addEventListener('change', () => {\n              const value = clampNumber(maxInput.value, { min: 1 });\n              const nextMeta = ensureCategoricalMeta();\n              nextMeta.categorical.maxCategories = Number.isFinite(value) ? Math.floor(value) : null;\n              updatePendingMeta(nextMeta);\n              applyOrdering({ forcePalette: false });\n              renderEditor();\n            });\n            maxWrap.appendChild(maxInput);\n            const buildFullWidthControl = ({ label, hint, control, alignRight = false }) => {\n              const wrap = document.createElement('div');\n              wrap.style.display = 'grid';\n              wrap.style.gap = '1px';\n              wrap.style.width = '100%';\n              const labelEl = document.createElement('div');\n              labelEl.textContent = label ?? '';\n              labelEl.style.fontSize = '12px';\n              labelEl.style.color = 'var(--helios-ui-muted)';\n              if (alignRight) {\n                labelEl.style.textAlign = 'right';\n                labelEl.style.alignSelf = 'end';\n              }\n              if (hint) tooltips.attachTooltip?.(labelEl, hint);\n              wrap.appendChild(labelEl);\n              wrap.appendChild(control);\n              return wrap;\n            };\n\n            let applyPaletteButton = null;\n            if (isColorChannel) {\n              const paletteEntries = categoricalPaletteCatalog.map((entry) => ({\n                ...entry,\n                search: `${entry.key} ${entry.label} ${entry.group}`.toLowerCase(),\n              }));\n              const paletteCatalog = (() => {\n                const byGroup = new Map();\n                const byKey = new Map();\n                for (const entry of paletteEntries) {\n                  const list = byGroup.get(entry.group) ?? [];\n                  list.push(entry);\n                  byGroup.set(entry.group, list);\n                  byKey.set(entry.key, entry);\n                }\n                for (const list of byGroup.values()) {\n                  list.sort((a, b) => a.label.localeCompare(b.label));\n                }\n                return { entries: paletteEntries, byGroup, byKey };\n              })();\n\n              const palettePicker = document.createElement('div');\n              palettePicker.className = 'helios-ui-colormap-picker';\n              const paletteDisplay = document.createElement('button');\n              paletteDisplay.type = 'button';\n              paletteDisplay.className = 'helios-ui-select helios-ui-colormap-picker__display';\n\t\n              const paletteDisplayLabel = document.createElement('span');\n              paletteDisplayLabel.className = 'helios-ui-ellipsis';\n              paletteDisplay.appendChild(paletteDisplayLabel);\n\n              const palettePreview = document.createElement('div');\n              palettePreview.className = 'helios-ui-colormap-picker__preview helios-ui-colormap-thumb';\n\n              const palettePopover = document.createElement('div');\n              palettePopover.className = 'helios-ui-colormap-popover';\n              palettePopover.hidden = true;\n\n              const palettePopoverPanel = document.createElement('div');\n              palettePopoverPanel.className = 'helios-ui-colormap-popover__panel';\n              palettePopover.appendChild(palettePopoverPanel);\n\n              const paletteHeader = document.createElement('div');\n              paletteHeader.className = 'helios-ui-colormap-popover__header';\n              const paletteSearch = document.createElement('input');\n              paletteSearch.type = 'text';\n              paletteSearch.className = 'helios-ui-text helios-ui-colormap-popover__search';\n              paletteSearch.placeholder = 'Search palettes…';\n              paletteHeader.appendChild(paletteSearch);\n              let palettePreferScheme = preferScheme;\n              const paletteFilterBar = document.createElement('div');\n              paletteFilterBar.className = 'helios-ui-colormap-popover__filters';\n              const schemeFilterButton = document.createElement('button');\n              schemeFilterButton.type = 'button';\n              schemeFilterButton.className = 'helios-ui-colormap-popover__filter';\n              schemeFilterButton.textContent = 'Schemes';\n              schemeFilterButton.title = 'Show only discrete schemes and use scheme colors when available.';\n              const syncSchemeFilterButton = () => {\n                schemeFilterButton.dataset.active = palettePreferScheme ? 'true' : 'false';\n                schemeFilterButton.setAttribute('aria-pressed', palettePreferScheme ? 'true' : 'false');\n              };\n              syncSchemeFilterButton();\n              paletteFilterBar.appendChild(schemeFilterButton);\n              paletteHeader.appendChild(paletteFilterBar);\n              palettePopoverPanel.appendChild(paletteHeader);\n\n              const paletteList = document.createElement('div');\n              paletteList.className = 'helios-ui-colormap-popover__list';\n              palettePopoverPanel.appendChild(paletteList);\n\n              const palettePortal = ui?.container ?? document.body;\n              palettePortal.appendChild(palettePopover);\n              const paletteCleanups = [];\n              const registerPaletteCleanup = (fn) => {\n                if (typeof fn === 'function') paletteCleanups.push(fn);\n              };\n              registerPaletteCleanup(() => palettePopover.remove());\n\n              const paletteToCssGradient = (palette, { isScheme = false } = {}) => {\n                if (!Array.isArray(palette) || palette.length === 0) {\n                  return 'linear-gradient(90deg, rgba(120,120,120,1), rgba(40,40,40,1))';\n                }\n                if (palette.length === 1) {\n                  return `linear-gradient(90deg, ${palette[0]}, ${palette[0]})`;\n                }\n                if (isScheme) {\n                  const step = 100 / palette.length;\n                  const stops = palette.flatMap((color, idx) => {\n                    const start = (idx * step).toFixed(2);\n                    const end = ((idx + 1) * step).toFixed(2);\n                    return [`${color} ${start}%`, `${color} ${end}%`];\n                  });\n                  return `linear-gradient(90deg, ${stops.join(', ')})`;\n                }\n                const stops = palette.map((color, idx) => {\n                  const pct = (idx / (palette.length - 1)) * 100;\n                  return `${color} ${pct.toFixed(2)}%`;\n                });\n                return `linear-gradient(90deg, ${stops.join(', ')})`;\n              };\n\n              const resolvePaletteDisplay = (keyRaw) => {\n                const key = String(keyRaw ?? '').trim();\n                if (!key) return '';\n                const entry = paletteCatalog.byKey.get(key);\n                if (!entry) return key;\n                return `${entry.group}: ${entry.label}`;\n              };\n              let selectedPaletteName = paletteName;\n\n              const updatePalettePreview = (keyRaw) => {\n                const key = String(keyRaw ?? '').trim() || defaultCategoricalPalette;\n                const resolved = resolveColormap(key);\n                const palette = resolveCategoricalPalette({\n                  paletteName: key,\n                  count: 8,\n                  preferScheme: palettePreferScheme,\n                });\n                palettePreview.style.backgroundImage = paletteToCssGradient(palette, { isScheme: resolved?.isScheme });\n              };\n\n              const applyPaletteUi = (keyRaw) => {\n                const key = String(keyRaw ?? '').trim() || defaultCategoricalPalette;\n                selectedPaletteName = key;\n                paletteDisplayLabel.textContent = resolvePaletteDisplay(key);\n                paletteDisplay.title = paletteDisplayLabel.textContent;\n                paletteDisplay.dataset.colormapKey = key;\n                updatePalettePreview(key);\n              };\n\n              const setSelectedPalette = (keyRaw) => {\n                const key = String(keyRaw ?? '').trim() || defaultCategoricalPalette;\n                const nextMeta = ensureCategoricalMeta();\n                nextMeta.categorical.palette = key;\n                updatePendingMeta(nextMeta);\n                applyPaletteUi(key);\n                applyOrdering({ forcePalette: true });\n                setDirty(true);\n              };\n\n              applyPaletteUi(paletteName);\n\n              let paletteObserver = null;\n              const ensurePaletteObserver = () => {\n                if (paletteObserver) return paletteObserver;\n                if (typeof IntersectionObserver !== 'function') return null;\n                paletteObserver = new IntersectionObserver((entries) => {\n                  for (const entry of entries) {\n                    if (!entry.isIntersecting) continue;\n                    const el = entry.target;\n                    const key = el?.dataset?.colormapKey;\n                    if (!key) continue;\n                    if (el.dataset.colormapReady === '1') continue;\n                    el.dataset.colormapReady = '1';\n                    const resolved = resolveColormap(key);\n                    const previewPalette = resolveCategoricalPalette({\n                      paletteName: key,\n                      count: 8,\n                      preferScheme: palettePreferScheme,\n                    });\n                    el.style.backgroundImage = paletteToCssGradient(previewPalette, { isScheme: resolved?.isScheme });\n                    paletteObserver.unobserve(el);\n                  }\n                }, { root: palettePopoverPanel, rootMargin: '64px' });\n                registerPaletteCleanup(() => {\n                  paletteObserver?.disconnect?.();\n                  paletteObserver = null;\n                });\n                return paletteObserver;\n              };\n\n              const renderPalettePopover = (queryRaw) => {\n                paletteList.replaceChildren();\n                const query = String(queryRaw ?? '').trim().toLowerCase();\n                const tokens = query.split(/\\s+/).filter(Boolean);\n                const matches = paletteCatalog.entries.filter((entry) => {\n                  if (!shouldShowCategoricalPaletteEntry(entry, palettePreferScheme)) return false;\n                  if (!tokens.length) return true;\n                  return tokens.every((t) => entry.search.includes(t));\n                });\n\t\n                if (!matches.length) {\n                  const note = document.createElement('div');\n                  note.className = 'helios-ui-colormap-picker__note';\n                  note.textContent = 'No matches.';\n                  paletteList.appendChild(note);\n                  return;\n                }\n\n                const groupOrder = ['d3', 'cmasher', 'CET', 'helios', 'other'];\n                const matchesByGroup = new Map();\n                for (const entry of matches) {\n                  const list = matchesByGroup.get(entry.group) ?? [];\n                  list.push(entry);\n                  matchesByGroup.set(entry.group, list);\n                }\n                for (const list of matchesByGroup.values()) {\n                  list.sort((a, b) => a.label.localeCompare(b.label));\n                }\n\n                const capPerGroup = tokens.length ? 60 : 5000;\n                const capTotal = tokens.length ? 220 : 5000;\n                let total = 0;\n                const observer = ensurePaletteObserver();\n\n                for (const group of groupOrder) {\n                  const list = matchesByGroup.get(group);\n                  if (!list?.length) continue;\n\n                  const section = document.createElement('div');\n                  section.className = 'helios-ui-colormap-section';\n\t\n                  const title = document.createElement('div');\n                  title.className = 'helios-ui-colormap-section__title';\n                  title.textContent = group;\n                  section.appendChild(title);\n\t\n                  const body = document.createElement('div');\n                  body.className = 'helios-ui-colormap-section__body';\n\t\n                  const visible = list.slice(0, capPerGroup);\n                  for (const entry of visible) {\n                    if (total >= capTotal) break;\n                    total += 1;\n\n                    const item = document.createElement('button');\n                    item.type = 'button';\n                    item.className = 'helios-ui-colormap-picker__item';\n                    item.dataset.key = entry.key;\n                    item.dataset.colormapSource = entry.source ?? entry.group ?? '';\n                    item.dataset.colormapKind = entry.kind ?? (entry.isScheme === true ? 'scheme' : 'ramp');\n                    item.dataset.colormapScheme = entry.isScheme === true ? 'true' : 'false';\n\n                    const itemTitle = document.createElement('div');\n                    itemTitle.className = 'helios-ui-colormap-picker__item-title helios-ui-ellipsis';\n                    itemTitle.textContent = entry.label;\n                    itemTitle.title = `${entry.key}`;\n\n                    const itemThumb = document.createElement('div');\n                    itemThumb.className = 'helios-ui-colormap-thumb helios-ui-colormap-thumb--small';\n                    itemThumb.dataset.colormapKey = entry.key;\n                    itemThumb.dataset.colormapReady = '0';\n                    itemThumb.style.backgroundImage = 'linear-gradient(90deg, rgba(60,60,60,1), rgba(30,30,30,1))';\n                    observer?.observe?.(itemThumb);\n\n                    item.appendChild(itemTitle);\n                    item.appendChild(itemThumb);\n\n                    item.addEventListener('pointerdown', (e) => {\n                      e.preventDefault();\n                      setSelectedPalette(entry.key);\n                      palettePopover.hidden = true;\n                    });\n\n                    body.appendChild(item);\n                  }\n\n                  if (list.length > capPerGroup) {\n                    const note = document.createElement('div');\n                    note.className = 'helios-ui-colormap-picker__note';\n                    note.textContent = `Showing ${capPerGroup} of ${list.length} in ${group}.`;\n                    body.appendChild(note);\n                  }\n\n                  section.appendChild(body);\n                  paletteList.appendChild(section);\n                  if (total >= capTotal) break;\n                }\n\n                if (matches.length > capTotal) {\n                  const note = document.createElement('div');\n                  note.className = 'helios-ui-colormap-picker__note';\n                  note.textContent = `Showing ${capTotal} of ${matches.length}. Refine your search.`;\n                  paletteList.appendChild(note);\n                }\n              };\n\n              const paletteOffset = 6;\n              const paletteMargin = 10;\n              const paletteMinHeight = 180;\n              const paletteMinWidth = 240;\n              const paletteMaxWidth = 420;\n              const paletteMaxHeight = 420;\n\n              const positionPalettePopover = () => {\n                if (palettePopover.hidden) return;\n                const anchor = paletteDisplay.getBoundingClientRect();\n                const vw = window.innerWidth;\n                const vh = window.innerHeight;\n\n                const spaceBelow = vh - anchor.bottom - paletteMargin;\n                const spaceAbove = anchor.top - paletteMargin;\n                const spaceRight = vw - anchor.right - paletteMargin;\n                const spaceLeft = anchor.left - paletteMargin;\n\n                palettePopover.style.width = `${Math.max(paletteMinWidth, Math.min(paletteMaxWidth, anchor.width))}px`;\n                palettePopover.style.left = '0px';\n                palettePopover.style.top = '0px';\n                palettePopover.hidden = false;\n\n                const measured = palettePopoverPanel.getBoundingClientRect();\n                const desiredW = measured.width || Math.max(paletteMinWidth, Math.min(paletteMaxWidth, anchor.width));\n                const desiredH = palettePopoverPanel.scrollHeight || measured.height || paletteMinHeight;\n\n                const canVertical = Math.max(spaceBelow, spaceAbove) >= paletteMinHeight;\n                const preferBelow = spaceBelow >= spaceAbove;\n                const canHorizontal = Math.max(spaceRight, spaceLeft) >= paletteMinWidth;\n                const preferRight = spaceRight >= spaceLeft;\n\n                let placement = 'bottom';\n                if (canVertical) {\n                  placement = preferBelow ? 'bottom' : 'top';\n                } else if (canHorizontal) {\n                  placement = preferRight ? 'right' : 'left';\n                } else {\n                  const best = [\n                    { side: 'bottom', size: spaceBelow },\n                    { side: 'top', size: spaceAbove },\n                    { side: 'right', size: spaceRight },\n                    { side: 'left', size: spaceLeft },\n                  ].sort((a, b) => b.size - a.size)[0];\n                  placement = best?.side ?? 'bottom';\n                }\n\n                let left = anchor.left;\n                let top = anchor.bottom + paletteOffset;\n                let maxH = Math.max(80, spaceBelow);\n\t\n                if (placement === 'top') {\n                  maxH = Math.max(80, spaceAbove);\n                  top = Math.max(paletteMargin, anchor.top - paletteOffset - Math.min(desiredH, maxH));\n                } else if (placement === 'right') {\n                  left = anchor.right + paletteOffset;\n                  top = anchor.top;\n                  maxH = Math.max(80, vh - 2 * paletteMargin);\n                } else if (placement === 'left') {\n                  left = Math.max(paletteMargin, anchor.left - paletteOffset - desiredW);\n                  top = anchor.top;\n                  maxH = Math.max(80, vh - 2 * paletteMargin);\n                }\n\n                left = Math.max(paletteMargin, Math.min(vw - paletteMargin - desiredW, left));\n                top = Math.max(paletteMargin, Math.min(vh - paletteMargin - 80, top));\n\t\n                palettePopover.style.width = `${Math.min(desiredW, vw - 2 * paletteMargin)}px`;\n                palettePopover.style.left = `${left}px`;\n                palettePopover.style.top = `${top}px`;\n\t\n                const bottomLimit = placement === 'top' ? Math.max(paletteMargin, anchor.top - paletteOffset) : vh - paletteMargin;\n                const availableH = Math.max(120, bottomLimit - top);\n                palettePopoverPanel.style.maxHeight = `${Math.min(paletteMaxHeight, availableH)}px`;\n                paletteList.style.maxHeight = '';\n              };\n\n              const closePalettePopover = () => {\n                palettePopover.hidden = true;\n              };\n\n              const onPaletteDocPointerDown = (e) => {\n                const target = e.target;\n                if (palettePopover.hidden) return;\n                if (target && (palettePopover.contains(target) || palettePicker.contains(target))) return;\n                closePalettePopover();\n              };\n\n              let pendingPalettePosition = false;\n              const schedulePalettePosition = () => {\n                if (pendingPalettePosition) return;\n                pendingPalettePosition = true;\n                requestAnimationFrame(() => {\n                  pendingPalettePosition = false;\n                  positionPalettePopover();\n                });\n              };\n\n              const onPaletteDocScroll = (e) => {\n                if (palettePopover.hidden) return;\n                const target = e?.target;\n                if (target && palettePopoverPanel.contains(target)) return;\n                schedulePalettePosition();\n              };\n              const onPaletteResize = () => schedulePalettePosition();\n\n              document.addEventListener('pointerdown', onPaletteDocPointerDown, true);\n              document.addEventListener('scroll', onPaletteDocScroll, true);\n              window.addEventListener('resize', onPaletteResize);\n              registerPaletteCleanup(() => document.removeEventListener('pointerdown', onPaletteDocPointerDown, true));\n              registerPaletteCleanup(() => document.removeEventListener('scroll', onPaletteDocScroll, true));\n              registerPaletteCleanup(() => window.removeEventListener('resize', onPaletteResize));\n\n              const openPalettePopover = ({ seedQuery } = {}) => {\n                palettePopover.hidden = false;\n                paletteSearch.value = seedQuery != null ? String(seedQuery) : '';\n                renderPalettePopover(paletteSearch.value);\n                positionPalettePopover();\n                queueMicrotask(() => paletteSearch.focus());\n              };\n\n              const onPaletteDisplayClick = () => openPalettePopover();\n              const onPalettePreviewClick = () => openPalettePopover();\n              const onPaletteDisplayKeyDown = (e) => {\n                if (e.key === 'Enter' || e.key === ' ') {\n                  e.preventDefault();\n                  openPalettePopover();\n                  return;\n                }\n                if (e.key && e.key.length === 1 && !e.metaKey && !e.ctrlKey && !e.altKey) {\n                  e.preventDefault();\n                  openPalettePopover({ seedQuery: e.key });\n                }\n              };\n\n              paletteDisplay.addEventListener('click', onPaletteDisplayClick);\n              palettePreview.addEventListener('click', onPalettePreviewClick);\n              paletteDisplay.addEventListener('keydown', onPaletteDisplayKeyDown);\n              registerPaletteCleanup(() => paletteDisplay.removeEventListener('click', onPaletteDisplayClick));\n              registerPaletteCleanup(() => palettePreview.removeEventListener('click', onPalettePreviewClick));\n              registerPaletteCleanup(() => paletteDisplay.removeEventListener('keydown', onPaletteDisplayKeyDown));\n\n              const onPaletteSearch = () => {\n                renderPalettePopover(paletteSearch.value);\n                positionPalettePopover();\n              };\n              paletteSearch.addEventListener('input', onPaletteSearch);\n              registerPaletteCleanup(() => paletteSearch.removeEventListener('input', onPaletteSearch));\n\n              const onSchemeFilterClick = () => {\n                palettePreferScheme = !palettePreferScheme;\n                syncSchemeFilterButton();\n                const nextMeta = ensureCategoricalMeta();\n                nextMeta.categorical.preferScheme = palettePreferScheme;\n                updatePendingMeta(nextMeta);\n                updatePalettePreview(selectedPaletteName);\n                applyOrdering({ forcePalette: true });\n                renderPalettePopover(paletteSearch.value);\n                positionPalettePopover();\n                setDirty(true);\n              };\n              schemeFilterButton.addEventListener('click', onSchemeFilterClick);\n              registerPaletteCleanup(() => schemeFilterButton.removeEventListener('click', onSchemeFilterClick));\n\n              const onPaletteSearchKeyDown = (e) => {\n                if (e.key === 'Escape') {\n                  closePalettePopover();\n                  paletteDisplay.focus();\n                }\n                if (e.key === 'Enter' && (paletteSearch.value ?? '').trim()) {\n                  closePalettePopover();\n                  const typed = String(paletteSearch.value ?? '').trim();\n                  if (paletteCatalog.byKey.has(typed)) setSelectedPalette(typed);\n                }\n              };\n              paletteSearch.addEventListener('keydown', onPaletteSearchKeyDown);\n              registerPaletteCleanup(() => paletteSearch.removeEventListener('keydown', onPaletteSearchKeyDown));\n\n              const onPaletteFocusOut = () => {\n                queueMicrotask(() => {\n                  if (!palettePicker.contains(document.activeElement) && !palettePopover.contains(document.activeElement)) {\n                    closePalettePopover();\n                  }\n                });\n              };\n              palettePicker.addEventListener('focusout', onPaletteFocusOut);\n              registerPaletteCleanup(() => palettePicker.removeEventListener('focusout', onPaletteFocusOut));\n\n              registerControl({\n                destroy() {\n                  for (const cleanup of paletteCleanups.splice(0)) {\n                    try {\n                      cleanup();\n                    } catch (error) {\n                      console.warn('[HeliosUI][MappersPanel] Palette cleanup failed.', error);\n                    }\n                  }\n                },\n              });\n\n              palettePicker.appendChild(paletteDisplay);\n              palettePicker.appendChild(palettePreview);\n\n              editorBody.appendChild(createAlignedRow({\n                title: 'Palette',\n                hint: 'Pick a categorical palette (schemes preferred when available).',\n                controls: palettePicker,\n              }).row);\n\n              applyPaletteButton = document.createElement('button');\n              applyPaletteButton.type = 'button';\n              applyPaletteButton.className = 'helios-ui-button helios-ui-button--compact';\n              applyPaletteButton.textContent = 'Apply palette';\n              applyPaletteButton.addEventListener('click', () => {\n                applyOrdering({ forcePalette: true });\n                renderEditor();\n              });\n            }\n\n            const orderedEntries = buildOrderedEntries();\n            const domain = Array.isArray(state.pending.domain) ? state.pending.domain : [];\n            const range = Array.isArray(state.pending.range) ? state.pending.range : [];\n\n            const list = document.createElement('div');\n            list.style.display = 'grid';\n            list.style.gap = '4px';\n            list.style.width = '100%';\n            orderedEntries.forEach((entry, idx) => {\n              const row = document.createElement('div');\n              row.style.display = 'grid';\n              row.style.gridTemplateColumns = 'minmax(0, 1fr) auto auto';\n              row.style.alignItems = 'center';\n              row.style.gap = '4px';\n\t\n              const labelWrap = document.createElement('div');\n              labelWrap.style.display = 'grid';\n              labelWrap.style.gap = '1px';\n              labelWrap.style.minWidth = '0';\n              labelWrap.style.textAlign = 'right';\n              labelWrap.style.justifyItems = 'end';\n              const labelEl = document.createElement('div');\n              labelEl.className = 'helios-ui-ellipsis';\n              labelEl.textContent = entry.label ?? `#${entry.id}`;\n              labelEl.title = `${entry.label ?? entry.id} (id ${entry.id})`;\n              const countEl = document.createElement('div');\n              countEl.style.fontSize = '11px';\n              countEl.style.color = 'var(--helios-ui-muted)';\n              countEl.textContent = `count: ${entry.count ?? 0}`;\n              labelWrap.appendChild(labelEl);\n              labelWrap.appendChild(countEl);\n\t\n              const valueEditor = (() => {\n                if (isColorChannel) {\n                  return createHex8ColorEditor({\n                    label: null,\n                    value: range[idx] ?? colorFromIndex(idx),\n                    onChange: (v) => {\n                      const nextDomain = domain.slice();\n                      const nextRange = range.slice();\n                      nextDomain[idx] = entry.id;\n                      nextRange[idx] = v;\n                      state.pending = { ...state.pending, type: 'categorical', domain: nextDomain, range: nextRange };\n                      setDirty(true);\n                    },\n                    compact: true,\n                  });\n                }\n                const raw = range[idx];\n                const seeded = Number.isFinite(Number(raw)) ? Number(raw) : (buildNumericPalette(orderedEntries.length)[idx] ?? suggestMin);\n                const controls = new SuggestedSliderControls({\n                  value: seeded,\n                  suggested: [suggestMin, suggestMax],\n                  step: numericStep,\n                  inputMin: suggestMin,\n                  inputMax: suggestMax,\n                  onCommit: (v) => {\n                    const n = clampNumber(v, { min: suggestMin, max: suggestMax });\n                    if (n == null) return;\n                    const nextDomain = domain.slice();\n                    const nextRange = range.slice();\n                    nextDomain[idx] = entry.id;\n                    nextRange[idx] = n;\n                    state.pending = { ...state.pending, type: 'categorical', domain: nextDomain, range: nextRange };\n                    setDirty(true);\n                  },\n                });\n                registerControl(controls);\n                controls.element.style.maxWidth = '150px';\n                controls.element.style.gap = '6px';\n                controls.input.style.maxWidth = '60px';\n                controls.input.style.height = '28px';\n                return controls.element;\n              })();\n\n              const buttons = document.createElement('div');\n              buttons.style.display = 'grid';\n              buttons.style.gap = '-2px';\n              buttons.style.width = '18px';\n              const up = document.createElement('button');\n              up.type = 'button';\n              up.className = 'helios-ui-button helios-ui-button--compact';\n              up.textContent = '↑';\n              up.disabled = idx === 0;\n              const down = document.createElement('button');\n              down.type = 'button';\n              down.className = 'helios-ui-button helios-ui-button--compact';\n              down.textContent = '↓';\n              down.disabled = idx === orderedEntries.length - 1;\n              up.style.padding = '0px 4px';\n              down.style.padding = '0px 4px';\n              up.style.lineHeight = '1';\n              down.style.lineHeight = '1';\n              up.style.minWidth = '0';\n              down.style.minWidth = '0';\n              up.style.height = '16px';\n              down.style.height = '16px';\n              up.style.border = 'none';\n              down.style.border = 'none';\n              up.style.background = 'transparent';\n              down.style.background = 'transparent';\n              up.style.cursor = 'pointer';\n              down.style.cursor = 'pointer';\n              up.style.color = 'var(--helios-ui-text)';\n              down.style.color = 'var(--helios-ui-text)';\n              up.style.opacity = up.disabled ? '0.4' : '1';\n              down.style.opacity = down.disabled ? '0.4' : '1';\n              const move = (delta) => {\n                const nextDomain = domain.slice();\n                const nextRange = range.slice();\n                const a = idx;\n                const b = idx + delta;\n                [nextDomain[a], nextDomain[b]] = [nextDomain[b], nextDomain[a]];\n                [nextRange[a], nextRange[b]] = [nextRange[b], nextRange[a]];\n                const nextMeta = ensureCategoricalMeta();\n                nextMeta.categorical.sortOrder = 'manual';\n                state.pending = { ...state.pending, type: 'categorical', domain: nextDomain, range: nextRange, meta: nextMeta };\n                setDirty(true);\n                renderEditor();\n              };\n              up.addEventListener('click', () => move(-1));\n              down.addEventListener('click', () => move(1));\n              buttons.appendChild(up);\n              buttons.appendChild(down);\n\n              row.appendChild(labelWrap);\n              row.appendChild(valueEditor);\n              row.appendChild(buttons);\n              list.appendChild(row);\n            });\n\n            const visibleIds = new Set(orderedEntries.map((entry) => entry.id));\n            let hiddenCount = 0;\n            for (const entry of entries) {\n              if (!visibleIds.has(entry.id)) hiddenCount += Number(entry.count ?? 0) || 0;\n            }\n            const othersCount = hiddenCount;\n            const othersRow = document.createElement('div');\n            othersRow.style.display = 'grid';\n            othersRow.style.gridTemplateColumns = 'minmax(0, 1fr) auto auto';\n            othersRow.style.alignItems = 'center';\n            othersRow.style.gap = '4px';\n\n            const othersLabelWrap = document.createElement('div');\n            othersLabelWrap.style.display = 'grid';\n            othersLabelWrap.style.gap = '1px';\n            othersLabelWrap.style.minWidth = '0';\n            othersLabelWrap.style.textAlign = 'right';\n            othersLabelWrap.style.justifyItems = 'end';\n            const othersLabel = document.createElement('div');\n            othersLabel.className = 'helios-ui-ellipsis';\n            othersLabel.textContent = 'Others';\n            othersLabel.title = 'Others (default)';\n            const othersCountEl = document.createElement('div');\n            othersCountEl.style.fontSize = '11px';\n            othersCountEl.style.color = 'var(--helios-ui-muted)';\n            othersCountEl.textContent = `count: ${othersCount}`;\n            othersLabelWrap.appendChild(othersLabel);\n            othersLabelWrap.appendChild(othersCountEl);\n\n            const othersEditor = (() => {\n              if (isColorChannel) {\n                return createHex8ColorEditor({\n                  label: null,\n                  value: typeof state.pending.defaultValue === 'string' ? state.pending.defaultValue : '#888888ff',\n                  onChange: (v) => {\n                    state.pending = { ...state.pending, type: 'categorical', defaultValue: v };\n                    setDirty(true);\n                  },\n                  compact: true,\n                });\n              }\n              const fallback = Number.isFinite(Number(state.pending.defaultValue))\n                ? Number(state.pending.defaultValue)\n                : suggestMin;\n              const controls = new SuggestedSliderControls({\n                value: fallback,\n                suggested: [suggestMin, suggestMax],\n                step: numericStep,\n                inputMin: suggestMin,\n                inputMax: suggestMax,\n                onCommit: (v) => {\n                  const n = clampNumber(v, { min: suggestMin, max: suggestMax });\n                  if (n == null) return;\n                  state.pending = { ...state.pending, type: 'categorical', defaultValue: n };\n                  setDirty(true);\n                },\n              });\n              registerControl(controls);\n              controls.element.style.maxWidth = '150px';\n              controls.element.style.gap = '6px';\n              controls.input.style.maxWidth = '60px';\n              controls.input.style.height = '28px';\n              return controls.element;\n            })();\n\n            const othersSpacer = document.createElement('div');\n            othersSpacer.style.width = '18px';\n            othersSpacer.style.height = '18px';\n\n            othersRow.appendChild(othersLabelWrap);\n            othersRow.appendChild(othersEditor);\n            othersRow.appendChild(othersSpacer);\n            list.appendChild(othersRow);\n\n            const listWrap = document.createElement('div');\n            listWrap.style.maxHeight = '240px';\n            listWrap.style.overflowY = 'auto';\n            listWrap.style.paddingRight = '4px';\n            listWrap.appendChild(list);\n\n            orderSelect.style.maxWidth = '170px';\n            orderSelect.style.width = '100%';\n            orderSelect.style.height = '34px';\n            maxInput.style.maxWidth = '100px';\n            maxInput.style.height = '34px';\n\n            let distributeButton = null;\n            if (!isColorChannel) {\n              distributeButton = document.createElement('button');\n              distributeButton.type = 'button';\n              distributeButton.className = 'helios-ui-button helios-ui-button--compact';\n              distributeButton.textContent = 'Distribute';\n              distributeButton.addEventListener('click', () => {\n                applyOrdering({ forcePalette: true });\n                renderEditor();\n              });\n            }\n\n            const categoriesSection = createSubsectionHeader({\n              title: 'Categories',\n              tooltip: 'Edit category colors and reorder manually when needed.',\n              action: isColorChannel ? applyPaletteButton : distributeButton,\n            });\n            const sectionBody = document.createElement('div');\n            sectionBody.style.display = 'grid';\n            sectionBody.style.gap = '8px';\n            sectionBody.style.width = '100%';\n\n            const topRow = document.createElement('div');\n            topRow.style.display = 'grid';\n            topRow.style.gridTemplateColumns = 'minmax(0, 1fr) auto';\n            topRow.style.gap = '4px';\n            topRow.style.alignItems = 'end';\n            topRow.appendChild(buildFullWidthControl({\n              label: 'Order',\n              hint: 'Sort categories by frequency (default), alphabetical, natural, or manual order.',\n              control: orderSelect,\n              alignRight: false,\n            }));\n            topRow.appendChild(buildFullWidthControl({\n              label: 'Max',\n              hint: 'Limit categories to a maximum (auto uses the palette size when applicable). Leave empty for auto.',\n              control: maxWrap,\n              alignRight: true,\n            }));\n            sectionBody.appendChild(topRow);\n\n            if (!isColorChannel) {\n              const { min: numericMin, max: numericMax, direction: numericDirection } = resolveNumericSettings();\n              const rangeWrap = document.createElement('div');\n              rangeWrap.style.display = 'flex';\n              rangeWrap.style.gap = '6px';\n              rangeWrap.style.alignItems = 'center';\n              const minInput = document.createElement('input');\n              minInput.type = 'number';\n              minInput.className = 'helios-ui-number';\n              minInput.value = String(numericMin);\n              const maxInput = document.createElement('input');\n              maxInput.type = 'number';\n              maxInput.className = 'helios-ui-number';\n              maxInput.value = String(numericMax);\n              minInput.style.maxWidth = '80px';\n              maxInput.style.maxWidth = '80px';\n              minInput.style.height = '30px';\n              maxInput.style.height = '30px';\n\n              const updateNumericRange = () => {\n                const minVal = clampNumber(minInput.value);\n                const maxVal = clampNumber(maxInput.value);\n                const nextMeta = ensureCategoricalMeta();\n                if (Number.isFinite(minVal) && Number.isFinite(maxVal)) {\n                  nextMeta.categorical.numericRange = [minVal, maxVal];\n                } else {\n                  nextMeta.categorical.numericRange = null;\n                }\n                updatePendingMeta(nextMeta);\n              };\n              minInput.addEventListener('change', () => {\n                updateNumericRange();\n              });\n              maxInput.addEventListener('change', () => {\n                updateNumericRange();\n              });\n              rangeWrap.appendChild(minInput);\n              rangeWrap.appendChild(maxInput);\n\n              const directionSelect = document.createElement('select');\n              directionSelect.className = 'helios-ui-select';\n              const ascOpt = document.createElement('option');\n              ascOpt.value = 'asc';\n              ascOpt.textContent = 'Ascending';\n              const descOpt = document.createElement('option');\n              descOpt.value = 'desc';\n              descOpt.textContent = 'Descending';\n              directionSelect.appendChild(ascOpt);\n              directionSelect.appendChild(descOpt);\n              directionSelect.value = numericDirection;\n              directionSelect.style.maxWidth = '140px';\n              directionSelect.style.height = '34px';\n              directionSelect.addEventListener('change', () => {\n                const nextMeta = ensureCategoricalMeta();\n                nextMeta.categorical.numericDirection = directionSelect.value === 'desc' ? 'desc' : 'asc';\n                updatePendingMeta(nextMeta);\n              });\n\n              const numericRow = document.createElement('div');\n              numericRow.style.display = 'grid';\n              numericRow.style.gridTemplateColumns = 'minmax(0, 1fr) auto';\n              numericRow.style.gap = '4px';\n              numericRow.style.alignItems = 'end';\n              numericRow.appendChild(buildFullWidthControl({\n                label: 'Range',\n                hint: 'Range used when distributing category values.',\n                control: rangeWrap,\n                alignRight: false,\n              }));\n              numericRow.appendChild(buildFullWidthControl({\n                label: 'Direction',\n                hint: 'Distribute values in ascending or descending order.',\n                control: directionSelect,\n                alignRight: true,\n              }));\n              sectionBody.appendChild(numericRow);\n            }\n            sectionBody.appendChild(listWrap);\n            categoriesSection.wrap.appendChild(sectionBody);\n            editorBody.appendChild(categoriesSection.wrap);\n\n          }\n\n\t        if (pendingType === 'colormap') {\n\t          state.pending = normalizeRuleList(state.pending);\n\n          const transformWrap = document.createElement('div');\n          transformWrap.style.display = 'flex';\n          transformWrap.style.gap = '8px';\n          transformWrap.style.alignItems = 'center';\n          transformWrap.style.width = '100%';\n\n          const transformSelect = document.createElement('select');\n          transformSelect.className = 'helios-ui-select';\n          transformSelect.style.flex = '1 1 auto';\n          transformSelect.style.maxWidth = 'none';\n          transformSelect.style.minWidth = '0';\n          for (const optVal of ['linear', 'log', 'log1p', 'logit', 'power', 'percentile']) {\n            const opt = document.createElement('option');\n            opt.value = optVal;\n            opt.textContent = formatTransformLabel(optVal);\n            transformSelect.appendChild(opt);\n          }\n          const resolvedTransformType = state.pending.transformType === 'quantile'\n            ? 'percentile'\n            : (state.pending.transformType ?? 'linear');\n          transformSelect.value = String(resolvedTransformType);\n\n          const powerInput = document.createElement('input');\n          powerInput.type = 'number';\n          powerInput.className = 'helios-ui-number';\n          powerInput.style.maxWidth = '96px';\n          powerInput.style.flex = '0 0 auto';\n          powerInput.value = String(Number.isFinite(Number(state.pending.transformPower)) ? state.pending.transformPower : 1);\n          powerInput.hidden = transformSelect.value !== 'power';\n\n          transformSelect.addEventListener('change', () => {\n            const nextType = transformSelect.value || 'linear';\n            const prevType = state.pending.transformType ?? 'linear';\n            powerInput.hidden = nextType !== 'power';\n            const nextPending = { ...state.pending, type: 'colormap', transformType: nextType };\n            if (isPercentileTransform(nextType)) {\n              nextPending.domain = [0, 1];\n              markDomainAuto(nextPending, true);\n            } else if (isPercentileTransform(prevType)) {\n              const attr = typeof state.pending.attributes === 'string' ? state.pending.attributes : null;\n              nextPending.domain = attr ? suggestDomainForAttribute(mode, attr) : [0, 1];\n              markDomainAuto(nextPending, true);\n            }\n            state.pending = nextPending;\n            if (nextType !== 'power') {\n              state.pending = { ...state.pending, type: 'colormap', transformPower: undefined };\n            } else {\n              state.pending = { ...state.pending, type: 'colormap', transformPower: Number(powerInput.value) || 1 };\n            }\n            setDirty(true);\n            renderEditor();\n          });\n\n          powerInput.addEventListener('change', () => {\n            const p = clampNumber(powerInput.value);\n            if (p == null) return;\n            state.pending = { ...state.pending, type: 'colormap', transformType: 'power', transformPower: p };\n            setDirty(true);\n            renderEditor();\n          });\n\n          transformWrap.appendChild(transformSelect);\n          transformWrap.appendChild(powerInput);\n          editorBody.appendChild(createAlignedRow({\n            title: 'Transform',\n            hint: 'Optional pre-transform applied before colormapping.',\n            controls: transformWrap,\n          }).row);\n\n          const colormapPicker = new ColormapPickerControl({\n            catalog: colormapCatalog,\n            portalRoot: ui?.container ?? document.body,\n            value: state.pending.colormap ?? 'interpolateInferno',\n            fallbackValue: 'interpolateInferno',\n            searchPlaceholder: 'Search colormaps (e.g. viridis, CET, cmasher)…',\n            onChange: (key) => {\n              state.pending = { ...state.pending, type: 'colormap', colormap: key };\n              setDirty(true);\n            },\n          });\n          registerControl(colormapPicker);\n\n          editorBody.appendChild(createAlignedRow({\n            title: 'Colormap',\n            hint: 'Choose the named colormap/interpolator to use.',\n            controls: colormapPicker.element,\n          }).row);\n\n          const domainWrap = document.createElement('div');\n          domainWrap.style.display = 'grid';\n          domainWrap.style.gap = '2px';\n          domainWrap.style.width = '100%';\n\n          const domainAttr = typeof state.pending.attributes === 'string' ? state.pending.attributes : null;\n          const transformType = state.pending.transformType ?? 'linear';\n          const percentile = isPercentileTransform(transformType);\n          const allowDivergent = !percentile;\n          const divergent = Boolean(state.pending.divergent) && allowDivergent;\n          const extent = percentile ? { min: 0, max: 1 } : computeScalarExtent(mode, domainAttr);\n          const min = extent?.min ?? 0;\n          const max = extent?.max ?? 1;\n          const extentAbs = divergent ? Math.max(Math.abs(min), Math.abs(max), 1) : null;\n          const sliderMin = divergent ? -extentAbs : min;\n          const sliderMax = divergent ? extentAbs : max;\n          const isIntegerDomain = Boolean(extent?.isInteger);\n          const step = percentile ? 0.01 : suggestStepForRange(sliderMin, sliderMax, isIntegerDomain);\n\n          if (percentile && (!isFiniteNumberPair(state.pending.domain) || state.pending.domain[0] !== 0 || state.pending.domain[1] !== 1)) {\n            const nextPending = { ...state.pending, type: 'colormap', domain: [0, 1] };\n            markDomainAuto(nextPending, true);\n            state.pending = nextPending;\n          } else if (!isFiniteNumberPair(state.pending.domain) && domainAttr) {\n            const nextDomain = divergent ? resolveDivergentDomain([min, max], extent) : [min, max];\n            const nextPending = { ...state.pending, type: 'colormap', domain: nextDomain };\n            markDomainAuto(nextPending, true);\n            state.pending = nextPending;\n          } else if (divergent && isFiniteNumberPair(state.pending.domain)) {\n            const nextPending = { ...state.pending, type: 'colormap', domain: resolveDivergentDomain(state.pending.domain, extent) };\n            markDomainAuto(nextPending, false);\n            state.pending = nextPending;\n          }\n\n          const domain = isFiniteNumberPair(state.pending.domain)\n            ? state.pending.domain\n            : (divergent ? resolveDivergentDomain([min, max], extent) : [min, max]);\n\n          const domainHistogram = (!percentile && showDistributions && domainAttr)\n            ? createRangeHistogram({\n              min,\n              max,\n              range: domain,\n              scope: mode,\n              rawName: domainAttr,\n            })\n            : null;\n          if (domainHistogram) domainWrap.appendChild(domainHistogram.element);\n\n          const slider = new TwoHandleRange({\n            min: sliderMin,\n            max: sliderMax,\n            step,\n            value: domain,\n            allowRangeDrag: !divergent,\n            onChange: (next) => {\n              const prevDomain = Array.isArray(state.pending.domain) ? state.pending.domain : domain;\n              let nextDomain = divergent ? resolveDivergentDomainFromSlider(next, prevDomain) : next;\n              if (isIntegerDomain) {\n                nextDomain = [Math.round(nextDomain[0]), Math.round(nextDomain[1])];\n              }\n              const nextPending = { ...state.pending, type: 'colormap', domain: nextDomain };\n              markDomainAuto(nextPending, false);\n              state.pending = nextPending;\n              setDirty(true);\n              d0.value = String(nextDomain[0]);\n              d1.value = String(nextDomain[1]);\n              if (divergent) {\n                slider.aInput.value = String(nextDomain[0]);\n                slider.bInput.value = String(nextDomain[1]);\n                slider.setVisual(nextDomain[0], nextDomain[1]);\n              }\n              domainHistogram?.setMarkers(nextDomain[0], nextDomain[1]);\n            },\n          });\n          registerControl(slider);\n\n          const values = document.createElement('div');\n          values.className = 'helios-ui-range2__values';\n          const d0 = document.createElement('input');\n          d0.type = 'number';\n          d0.className = 'helios-ui-number';\n          d0.style.maxWidth = '96px';\n          const d1 = document.createElement('input');\n          d1.type = 'number';\n          d1.className = 'helios-ui-number';\n          d1.style.maxWidth = '96px';\n\n          d0.value = String(domain[0] ?? min);\n          d1.value = String(domain[1] ?? max);\n\n          const commitDomainTyped = () => {\n            const a = clampNumber(d0.value);\n            const b = clampNumber(d1.value);\n            if (a == null || b == null) return;\n            let lo = Math.min(a, b);\n            let hi = Math.max(a, b);\n            if (isIntegerDomain) {\n              lo = Math.round(lo);\n              hi = Math.round(hi);\n            }\n            const maxAbs = divergent ? Math.max(Math.abs(lo), Math.abs(hi)) : null;\n            const nextDomain = divergent ? [-maxAbs, maxAbs] : [lo, hi];\n            const loSlider = Math.max(sliderMin, Math.min(sliderMax, nextDomain[0]));\n            const hiSlider = Math.max(sliderMin, Math.min(sliderMax, nextDomain[1]));\n            slider.aInput.value = String(loSlider);\n            slider.bInput.value = String(hiSlider);\n            slider.setVisual(loSlider, hiSlider);\n            const nextPending = { ...state.pending, type: 'colormap', domain: nextDomain };\n            markDomainAuto(nextPending, false);\n            state.pending = nextPending;\n            setDirty(true);\n            d0.value = String(nextDomain[0]);\n            d1.value = String(nextDomain[1]);\n            domainHistogram?.setMarkers(nextDomain[0], nextDomain[1]);\n          };\n          d0.addEventListener('change', commitDomainTyped);\n          d1.addEventListener('change', commitDomainTyped);\n\n          values.appendChild(d0);\n          values.appendChild(d1);\n          domainWrap.appendChild(slider.element);\n          domainWrap.appendChild(values);\n          editorBody.appendChild(createAlignedRow({\n            title: 'Domain',\n            hint: percentile\n              ? 'Percentile range used to map values into the colormap (0 to 1).'\n              : (divergent\n                ? 'Symmetric range around zero used for divergent colormaps.'\n                : 'Input range used to map values into the colormap (min/max).'),\n            controls: domainWrap,\n          }).row);\n\n          const advanced = document.createElement('div');\n          const divergentInput = createToggleControl({\n            checked: Boolean(state.pending.divergent) && allowDivergent,\n            disabled: !allowDivergent,\n            onLabel: 'On',\n            offLabel: 'Off',\n            ariaLabel: 'Use divergent colormap domain',\n          });\n\n          const clampState = normalizeClampSetting(state.pending.clamp);\n          const clampMinInput = createToggleControl({\n            checked: clampState.min,\n            onLabel: 'On',\n            offLabel: 'Off',\n            ariaLabel: 'Clamp values below the colormap domain',\n          });\n          const clampMaxInput = createToggleControl({\n            checked: clampState.max,\n            onLabel: 'On',\n            offLabel: 'Off',\n            ariaLabel: 'Clamp values above the colormap domain',\n          });\n\n          const alphaSeed = clampNumber(state.pending.alpha ?? 1, { min: 0, max: 1 }) ?? 1;\n          const alphaControls = new SuggestedSliderControls({\n            value: alphaSeed,\n            suggested: [0, 1],\n            step: 0.01,\n            inputMin: 0,\n            inputMax: 1,\n            onCommit: (v) => {\n              const a = clampNumber(v, { min: 0, max: 1 });\n              if (a == null) return;\n              state.pending = { ...state.pending, type: 'colormap', alpha: a };\n              setDirty(true);\n            },\n          });\n          registerControl(alphaControls);\n\n          const commitClamp = () => {\n            const nextClamp = { min: clampMinInput.checked, max: clampMaxInput.checked };\n            state.pending = { ...state.pending, type: 'colormap', clamp: nextClamp };\n            setDirty(true);\n          };\n          clampMinInput.addEventListener('change', commitClamp);\n          clampMaxInput.addEventListener('change', commitClamp);\n\n          divergentInput.addEventListener('change', () => {\n            const nextDivergent = divergentInput.checked;\n            const fallbackDomain = domainAttr ? suggestDomainForAttribute(mode, domainAttr) : [0, 1];\n            const baseDomain = Array.isArray(state.pending.domain) ? state.pending.domain : fallbackDomain;\n            const nextDomain = nextDivergent ? resolveDivergentDomain(baseDomain, extent) : fallbackDomain;\n            const nextPending = { ...state.pending, type: 'colormap', divergent: nextDivergent, domain: nextDomain };\n            markDomainAuto(nextPending, true);\n            state.pending = nextPending;\n            setDirty(true);\n            renderEditor();\n          });\n\n          advanced.appendChild(createAlignedRow({\n            title: 'Divergent',\n            hint: allowDivergent\n              ? 'Lock the domain to a symmetric range around zero (for divergent colormaps).'\n              : 'Divergent mode is unavailable for percentile transforms.',\n            controls: divergentInput,\n          }).row);\n\n          advanced.appendChild(createAlignedRow({\n            title: 'Clamp Min',\n            hint: 'Clamp values below the domain to the lowest colormap color.',\n            controls: clampMinInput,\n          }).row);\n          advanced.appendChild(createAlignedRow({\n            title: 'Clamp Max',\n            hint: 'Clamp values above the domain to the highest colormap color.',\n            controls: clampMaxInput,\n          }).row);\n\t          advanced.appendChild(createAlignedRow({\n\t            title: 'Alpha',\n\t            hint: 'Overall opacity multiplier applied after colormapping.',\n\t            controls: alphaControls.element,\n\t          }).row);\n\n\t\t          const defaultWrap = document.createElement('div');\n\t\t          defaultWrap.style.display = 'flex';\n\t\t          defaultWrap.style.gap = '8px';\n\t\t          defaultWrap.style.alignItems = 'center';\n\t\t          defaultWrap.style.width = '100%';\n\n\t\t          const defaultSeed = typeof state.pending.defaultValue === 'string' ? state.pending.defaultValue : '#888888ff';\n\t\t          const defaultEditor = createHex8ColorEditor({\n\t\t            label: null,\n\t\t            value: defaultSeed,\n\t\t            onChange: (v) => {\n\t\t              state.pending = { ...state.pending, type: 'colormap', defaultValue: v };\n\t\t            },\n\t\t          });\n\t\t          defaultEditor.style.flex = '1 1 auto';\n\t\t          defaultEditor.style.minWidth = '0';\n\n\t\t          const clearDefault = document.createElement('button');\n\t\t          clearDefault.type = 'button';\n\t\t          clearDefault.className = 'helios-ui-button helios-ui-button--compact';\n\t\t          clearDefault.textContent = '×';\n\t\t          clearDefault.setAttribute('aria-label', 'Clear default value');\n\t\t          clearDefault.addEventListener('click', () => {\n\t\t            state.pending = { ...state.pending, type: 'colormap', defaultValue: undefined };\n\t\t            setDirty(true);\n\t\t            renderEditor();\n\t\t          });\n\t\t          tooltips.attachTooltip(clearDefault, 'Clear the default value.');\n\n\t\t          defaultWrap.appendChild(defaultEditor);\n\t\t          defaultWrap.appendChild(clearDefault);\n\n\t\t          advanced.appendChild(createAlignedRow({\n\t\t            title: 'Default',\n\t\t            hint: 'Fallback color when input is missing/invalid.',\n\t\t            controls: defaultWrap,\n\t\t          }).row);\n\n\t\t          const rulesWrap = document.createElement('div');\n\t\t          rulesWrap.style.display = 'grid';\n\t\t          rulesWrap.style.gap = '8px';\n\t\t          rulesWrap.style.width = '100%';\n\n\t\t          const rulesList = document.createElement('div');\n\t\t          rulesList.style.display = 'grid';\n\t\t          rulesList.style.gap = '8px';\n\t\t          rulesWrap.appendChild(rulesList);\n\n\t\t          const renderRulesList = () => {\n\t\t            rulesList.textContent = '';\n\t\t            const rules = Array.isArray(state.pending.rules) ? state.pending.rules : [];\n\t\t            for (let i = 0; i < rules.length; i += 1) {\n\t\t              const rule = rules[i];\n\t\t              const spec = rule?.__ui && typeof rule.__ui === 'object'\n\t\t                ? rule.__ui\n\t\t                : { op: 'eq', rhs: -1, out: '#888888ff' };\n\n\t\t              const item = document.createElement('div');\n\t\t              item.style.display = 'grid';\n\t\t              item.style.gap = '6px';\n\t\t              item.style.position = 'relative';\n\t\t              item.style.padding = '8px';\n\t\t              item.style.paddingRight = '36px';\n\t\t              item.style.borderRadius = '10px';\n\t\t              item.style.border = '1px solid color-mix(in srgb, var(--helios-ui-border) 70%, transparent)';\n\t\t              item.style.background = 'color-mix(in srgb, var(--helios-ui-bg-solid) 85%, transparent)';\n\n\t\t              const top = document.createElement('div');\n\t\t              top.style.display = 'grid';\n\t\t              top.style.gap = '8px';\n\t\t              top.style.alignItems = 'center';\n\t\t              top.style.gridTemplateColumns = 'auto minmax(0, 1fr)';\n\n\t\t              const condRow = document.createElement('div');\n\t\t              condRow.style.display = 'grid';\n\t\t              condRow.style.gridTemplateColumns = 'auto minmax(0, 1fr) minmax(0, 1fr)';\n\t\t              condRow.style.gap = '6px';\n\t\t              condRow.style.alignItems = 'center';\n\t\t              condRow.style.minWidth = '0';\n\n\t\t              const opSelect = document.createElement('select');\n\t              opSelect.className = 'helios-ui-select helios-ui-select--compact';\n\t              opSelect.style.maxWidth = '56px';\n\t              opSelect.style.width = '100%';\n\t\t              const ops = [\n\t\t                { value: 'eq', label: '=' },\n\t\t                { value: 'lt', label: '<' },\n\t\t                { value: 'lte', label: '≤' },\n\t                { value: 'gt', label: '>' },\n\t                { value: 'gte', label: '≥' },\n\t                { value: 'nan', label: 'NaN' },\n\t                { value: 'nullish', label: 'null' },\n\t              ];\n\t              for (const op of ops) {\n\t                const opt = document.createElement('option');\n\t                opt.value = op.value;\n\t                opt.textContent = op.label;\n\t                opSelect.appendChild(opt);\n\t              }\n\t              opSelect.value = ops.some((o) => o.value === spec.op) ? spec.op : 'eq';\n\n\t\t              const rhsInput = document.createElement('input');\n\t\t              rhsInput.type = 'number';\n\t\t              rhsInput.className = 'helios-ui-number';\n\t\t              rhsInput.style.maxWidth = 'none';\n\t\t              rhsInput.style.width = '100%';\n\t\t              rhsInput.value = spec.rhs != null ? String(spec.rhs) : '';\n\t\t              rhsInput.placeholder = 'value';\n\n\t              const rhsVisible = () => ['eq', 'lt', 'lte', 'gt', 'gte'].includes(opSelect.value);\n\t              rhsInput.style.display = rhsVisible() ? '' : 'none';\n\n\t              const getLiveSpec = () => {\n\t                const current = state.pending?.rules?.[i]?.__ui;\n\t                return current && typeof current === 'object' ? current : spec;\n\t              };\n\n\t\t              const commitRule = (nextSpec) => {\n\t\t                const predicate = buildRulePredicate(nextSpec);\n\t\t                const nextRule = {\n\t\t                  ...rule,\n\t                  __ui: nextSpec,\n\t                  when: (inputs) => predicate(inputs),\n\t                  value: nextSpec.out ?? rule.value,\n\t                };\n\t                const nextRules = rules.slice();\n\t                nextRules[i] = nextRule;\n\t                state.pending = { ...state.pending, type: 'colormap', rules: nextRules };\n\t                setDirty(true);\n\t              };\n\n\t              opSelect.addEventListener('change', () => {\n\t                rhsInput.style.display = rhsVisible() ? '' : 'none';\n\t                commitRule({ ...getLiveSpec(), op: opSelect.value });\n\t              });\n\n\t\t              rhsInput.addEventListener('change', () => {\n\t\t                const rhs = clampNumber(rhsInput.value);\n\t\t                commitRule({ ...getLiveSpec(), rhs });\n\t\t              });\n\n\t\t              const ifLabel = createRuleKeyword(i === 0 ? 'if' : 'else if');\n\t\t              condRow.appendChild(ifLabel);\n\t\t              condRow.appendChild(opSelect);\n\t\t              condRow.appendChild(rhsInput);\n\t\t              tooltips.attachTooltip(opSelect, 'Condition operator.');\n\t\t              tooltips.attachTooltip(rhsInput, 'Comparison value.');\n\n\t\t              const remove = document.createElement('button');\n\t\t              remove.type = 'button';\n\t\t              remove.className = 'helios-ui-button helios-ui-button--compact';\n\t\t              remove.textContent = '×';\n\t\t              remove.setAttribute('aria-label', 'Remove override');\n\t\t              tooltips.attachTooltip(remove, 'Remove this override.');\n\t\t              remove.style.position = 'absolute';\n\t\t              remove.style.top = '8px';\n\t\t              remove.style.right = '8px';\n\t\t              remove.addEventListener('click', () => {\n\t\t                const nextRules = rules.filter((_, idx) => idx !== i);\n\t\t                state.pending = { ...state.pending, type: 'colormap', rules: nextRules };\n\t\t                setDirty(true);\n\t\t                renderRulesList();\n\t\t              });\n\n\t\t              top.appendChild(condRow);\n\n\t\t              const outRow = createHex8ColorEditor({\n\t\t                label: null,\n\t\t                value: typeof spec.out === 'string' ? spec.out : String(rule.value ?? '#888888ff'),\n\t\t                onChange: (v) => {\n\t\t                  commitRule({ ...getLiveSpec(), out: v });\n\t\t                },\n\t\t                showAlphaLabel: false,\n\t\t                compact: true,\n\t\t              });\n\n\t\t              const outWrap = document.createElement('div');\n\t\t              outWrap.style.display = 'grid';\n\t\t              outWrap.style.gridTemplateColumns = 'auto minmax(0, 1fr)';\n\t\t              outWrap.style.gap = '6px';\n\t\t              outWrap.style.alignItems = 'center';\n\t\t              outWrap.style.width = '100%';\n\n\t\t              outRow.style.width = '100%';\n\n\t\t              outWrap.appendChild(createRuleKeyword('then'));\n\t\t              outWrap.appendChild(outRow);\n\n\t\t              item.appendChild(top);\n\t\t              item.appendChild(outWrap);\n\t\t              item.appendChild(remove);\n\t\t              rulesList.appendChild(item);\n\t\t            }\n\t\t          };\n\n\t\t          renderRulesList();\n\t\t          const addRuleButton = document.createElement('button');\n\t\t          addRuleButton.type = 'button';\n\t\t          addRuleButton.className = 'helios-ui-button helios-ui-button--compact';\n\t\t          addRuleButton.textContent = 'Add';\n\t\t          addRuleButton.setAttribute('aria-label', 'Add override');\n\t\t          tooltips.attachTooltip(addRuleButton, 'Add a value override (rule).');\n\t\t          addRuleButton.addEventListener('click', () => {\n\t\t            const spec = { op: 'eq', rhs: -1, out: '#888888ff' };\n\t\t            const predicate = buildRulePredicate(spec);\n\t\t            const nextRule = { __ui: spec, when: (inputs) => predicate(inputs), value: spec.out };\n\t\t            const nextRules = [...(state.pending.rules ?? []), nextRule];\n\t\t            state.pending = { ...state.pending, type: 'colormap', rules: nextRules };\n\t\t            setDirty(true);\n\t\t            renderRulesList();\n\t\t          });\n\n\t\t          const overridesSection = createSubsectionHeader({\n\t\t            title: 'Overrides',\n\t\t            tooltip: 'Rules applied before the base mapping.',\n\t\t            action: addRuleButton,\n\t\t          });\n\t\t          overridesSection.wrap.appendChild(rulesWrap);\n\t\t          advanced.appendChild(overridesSection.wrap);\n\n\t\t          const advancedStack = new PanelStack();\n\t\t          advancedStack.add({ id: `${mode}-mapper-advanced`, title: 'Advanced', collapsed: true, content: advanced });\n\t\t          editorBody.appendChild(advancedStack.element);\n\t\t          ui._controlCleanups.add(() => advancedStack.destroy());\n\t        }\n\n        if (!isColor && !isScalar && pendingType !== 'passthrough') {\n          const note = document.createElement('div');\n          note.style.color = 'var(--helios-ui-muted)';\n          note.textContent = 'This channel is passthrough-only in the current MVP.';\n          editorBody.appendChild(note);\n        }\n\n        syncApplyEnabled();\n      };\n\n      const resetPendingFromLive = () => {\n        if (mode === 'node' && state.channel === 'position') {\n          const scheduler = helios?.scheduler ?? null;\n          const hasLayout = Boolean(scheduler?.layout);\n          const layoutState = typeof scheduler?.getLayoutState === 'function'\n            ? scheduler.getLayoutState()\n            : (scheduler?.layoutEnabled !== false ? 'running' : 'stopped');\n          const layoutEnabled = hasLayout && layoutState !== 'stopped';\n          state.pending = layoutEnabled ? { name: state.channel, type: 'layout' } : (resolveLiveConfig(mode, state.channel) ?? { name: state.channel });\n        } else {\n          state.pending = resolveLiveConfig(mode, state.channel) ?? { name: state.channel };\n        }\n        setDirty(false);\n        renderEditor();\n      };\n\n      const setChannel = (next) => {\n        if (!channels.includes(next)) return;\n        state.channel = next;\n        resetPendingFromLive();\n      };\n\n      const refreshFromLiveIfClean = (event) => {\n        const detail = event?.detail ?? event ?? {};\n        if (detail.mode && detail.mode !== mode) return;\n        if (detail.channel && detail.channel !== state.channel) return;\n        if (state.dirty) {\n          syncApplyEnabled();\n          return;\n        }\n        resetPendingFromLive();\n      };\n\n      revertButton.addEventListener('click', () => {\n        resetPendingFromLive();\n      });\n\n      applyButton.addEventListener('click', () => {\n        if (!state.pending) return;\n        if (\n          mode === 'edge' &&\n          state.pending &&\n          (state.pending.type === 'nodeToEdge' || state.pending.type === 'nodeAttribute') &&\n          state._nodePassthroughUi\n        ) {\n          const { attrSelect, endpointsSelect } = state._nodePassthroughUi;\n          const bare = attrSelect?.value || state.pending.nodeAttribute || undefined;\n          const endpoints = endpointsSelect?.value || state.pending.endpoints || undefined;\n          state.pending = {\n            ...state.pending,\n            type: 'nodeAttribute',\n            nodeAttribute: bare,\n            endpoints,\n            attributes: bare ? [`@node.${bare}`] : state.pending.attributes,\n          };\n        }\n\n        try {\n          if (window.__HELIOS_DEBUG_MAPPERS_PANEL__) {\n            console.log('[HeliosUI][MappersPanel] apply click (before)', {\n              mode,\n              channel: state.channel,\n              pending: state.pending,\n              live: resolveLiveConfig(mode, state.channel),\n            });\n          }\n        } catch (error) {\n          console.warn('[HeliosUI][MappersPanel] Debug logging failed before applying mapper config.', error);\n        }\n\n        if (mode === 'node' && state.channel === 'position') {\n          if (state.pending.type === 'layout') {\n            helios?.startLayout?.();\n            setDirty(false);\n            return;\n          }\n          helios?.stopLayout?.('ui:mappers');\n        }\n\n        const ok = applyConfig(mode, state.channel, state.pending);\n        if (ok) {\n          try {\n            if (window.__HELIOS_DEBUG_MAPPERS_PANEL__) {\n              const entry = helios?.network?.getNodeToEdgePassthroughs?.().find((p) => p.edgeName === '_helios_visuals_edge_color');\n              console.log('[HeliosUI][MappersPanel] apply click (after)', {\n                mode,\n                channel: state.channel,\n                live: resolveLiveConfig(mode, state.channel),\n                nodeToEdgeEdgeColor: entry ?? null,\n              });\n            }\n          } catch (error) {\n            console.warn('[HeliosUI][MappersPanel] Debug logging failed after applying mapper config.', error);\n          }\n\n          // Ensure visuals update immediately even if the scheduler is currently idle.\n          helios?.scheduler?.requestGeometry?.();\n          helios?.scheduler?.requestRender?.();\n          helios?.requestRender?.();\n\n          if (\n            mode === 'node' &&\n            state.channel === 'outlineColor' &&\n            (state.pending.type ?? state.pending.mode) === 'constant' &&\n            typeof helios?.nodeOutlineColor === 'function'\n          ) {\n            try {\n              helios.nodeOutlineColor(state.pending.value);\n            } catch {\n              // Ignore invalid color inputs; mapper validation covers common cases.\n            }\n          }\n\n          if (mode === 'node' && (state.channel === 'outline' || state.channel === 'outlineColor')) {\n            const outlineCfg = resolveLiveConfig('node', 'outline');\n            const outlineColorCfg = resolveLiveConfig('node', 'outlineColor');\n            const outlineType = outlineCfg?.type ?? outlineCfg?.mode ?? null;\n            const outlineColorType = outlineColorCfg?.type ?? outlineColorCfg?.mode ?? null;\n            const bothConstant = outlineType === 'constant' && outlineColorType === 'constant';\n            if (typeof helios?.nodeOutlineUseAttributes === 'function') {\n              helios.nodeOutlineUseAttributes(!bothConstant);\n            }\n          }\n          setDirty(false);\n        }\n      });\n\n      const updateAutoDomainFromNetwork = () => {\n        const pending = state.pending;\n        if (!pending) return false;\n        const type = pending.type ?? pending.mode ?? null;\n        if (type !== 'linear' && type !== 'colormap') return false;\n        const attr = typeof pending.attributes === 'string' ? pending.attributes : null;\n        if (!attr) return false;\n\n        const uiMeta = pending.__ui && typeof pending.__ui === 'object' ? pending.__ui : null;\n        const domainAuto = uiMeta?.domainAuto === true || attr === '$index';\n        if (!domainAuto) return false;\n\n        const nextDomain = suggestDomainForAttribute(mode, attr);\n        const prevDomain = Array.isArray(pending.domain) ? pending.domain : null;\n        if (prevDomain && prevDomain[0] === nextDomain[0] && prevDomain[1] === nextDomain[1]) return false;\n\n        const nextPending = { ...pending, type, domain: nextDomain };\n        markDomainAuto(nextPending, true);\n        state.pending = nextPending;\n\n        // Keep visuals in sync when the editor wasn't mid-edit.\n        if (!state.dirty) {\n          applyConfig(mode, state.channel, nextPending);\n          setDirty(false);\n        }\n        return true;\n      };\n\n      let networkAttributeUnsub = null;\n      const attachNetworkAttributeListeners = () => {\n        if (networkAttributeUnsub) {\n          networkAttributeUnsub();\n          networkAttributeUnsub = null;\n        }\n        const network = net();\n        if (!network) return;\n        const handler = (event) => {\n          const scope = event?.detail?.scope;\n          if (scope && scope !== mode) return;\n          const type = event?.type ?? '';\n          if (type === 'attribute:changed') {\n            const op = event?.detail?.op ?? '';\n            if (op !== 'categorize' && op !== 'decategorize') return;\n          }\n          renderEditor();\n        };\n        if (typeof network.on === 'function') {\n          const unsubs = [\n            network.on('attribute:defined', handler),\n            network.on('attribute:removed', handler),\n            network.on('attribute:changed', handler),\n          ];\n          networkAttributeUnsub = () => {\n            for (const unsub of unsubs) unsub?.();\n          };\n        } else if (typeof network.addEventListener === 'function') {\n          network.addEventListener('attribute:defined', handler);\n          network.addEventListener('attribute:removed', handler);\n          network.addEventListener('attribute:changed', handler);\n          networkAttributeUnsub = () => {\n            network.removeEventListener('attribute:defined', handler);\n            network.removeEventListener('attribute:removed', handler);\n            network.removeEventListener('attribute:changed', handler);\n          };\n        }\n      };\n\n      // Recompute suggested domains when the underlying network changes.\n      const onNetworkReplaced = () => {\n        updateAutoDomainFromNetwork();\n        attachNetworkAttributeListeners();\n        if (state.dirty) renderEditor();\n        else resetPendingFromLive();\n      };\n      const unsubs = [];\n      if (helios?.on) {\n        unsubs.push(helios.on('network:replaced', onNetworkReplaced));\n        unsubs.push(helios.on('mappers:changed', refreshFromLiveIfClean));\n      } else if (helios?.addEventListener) {\n        helios.addEventListener('network:replaced', onNetworkReplaced);\n        helios.addEventListener('mappers:changed', refreshFromLiveIfClean);\n        unsubs.push(() => helios.removeEventListener('network:replaced', onNetworkReplaced));\n        unsubs.push(() => helios.removeEventListener('mappers:changed', refreshFromLiveIfClean));\n      }\n      if (typeof mappersBehavior?.on === 'function') {\n        unsubs.push(mappersBehavior.on('change', refreshFromLiveIfClean));\n      } else if (typeof mappersBehavior?.addEventListener === 'function') {\n        mappersBehavior.addEventListener('change', refreshFromLiveIfClean);\n        unsubs.push(() => mappersBehavior.removeEventListener('change', refreshFromLiveIfClean));\n      }\n      if (unsubs.length) {\n        ui._controlCleanups.add(() => {\n          for (const unsub of unsubs) unsub?.();\n        });\n      }\n\n      attachNetworkAttributeListeners();\n      if (networkAttributeUnsub) ui._controlCleanups.add(() => networkAttributeUnsub?.());\n\n      resetPendingFromLive();\n      return { root, state, channels, setChannel };\n    };\n\n    const createDensityTab = () => {\n      const root = document.createElement('div');\n      root.className = 'helios-ui-mapper-tab';\n\n      if (!helios || typeof helios.density !== 'function') {\n        const note = document.createElement('div');\n        note.style.color = 'var(--helios-ui-muted)';\n        note.textContent = 'Density controls are unavailable for this Helios instance.';\n        root.appendChild(note);\n        return { root, refresh: () => {} };\n      }\n\n      const editorBody = document.createElement('div');\n      root.appendChild(editorBody);\n\n      const localControls = new Set();\n      const registerControl = (control) => {\n        if (control) localControls.add(control);\n      };\n      const destroyControls = () => {\n        for (const control of localControls) {\n          try {\n            control.destroy?.();\n          } catch (error) {\n            console.warn('[HeliosUI][MappersPanel] Density control cleanup failed.', error);\n          }\n        }\n        localControls.clear();\n      };\n      ui._controlCleanups.add(() => destroyControls());\n\n      const createCheckboxControl = ({ checked = false, onChange, onLabel = 'On', offLabel = 'Off' }) => {\n        const useSegmented = onLabel !== 'On' || offLabel !== 'Off';\n        const toggle = (useSegmented ? createSegmentedToggleControl : createToggleControl)({\n          checked: Boolean(checked),\n          onLabel,\n          offLabel,\n        });\n        const onChangeHandler = () => onChange?.(toggle.checked);\n        toggle.addEventListener('change', onChangeHandler);\n        registerControl({\n          destroy() {\n            toggle.removeEventListener('change', onChangeHandler);\n          },\n        });\n        return toggle;\n      };\n\n      const listDensityAttributes = () => {\n        const network = net();\n        if (!network || typeof network.getNodeAttributeNames !== 'function') {\n          return ['Uniform', 'Degree'];\n        }\n        const names = ['Uniform', 'Degree'];\n        let raw = [];\n        try {\n          raw = network.getNodeAttributeNames() ?? [];\n        } catch (error) {\n          console.warn('[HeliosUI][MappersPanel] Failed to list node attributes for density controls.', error);\n          raw = [];\n        }\n        for (const name of raw) {\n          if (typeof name !== 'string') continue;\n          if (!isPublicAttributeName(name)) continue;\n          let info = null;\n          try {\n            info = network.getNodeAttributeInfo?.(name) ?? null;\n          } catch (error) {\n            console.warn(`[HeliosUI][MappersPanel] Failed to inspect node attribute \"${name}\" for density controls.`, error);\n            info = null;\n          }\n          if (!info || (info.dimension ?? 1) !== 1) continue;\n          if (!isNumericAttributeType(info.type)) continue;\n          names.push(name);\n        }\n        const unique = Array.from(new Set(names));\n        const fixed = unique.filter((name) => name === 'Uniform' || name === 'Degree');\n        const attrs = unique.filter((name) => name !== 'Uniform' && name !== 'Degree');\n        attrs.sort(naturalCompare);\n        return [...fixed, ...attrs];\n      };\n\n      const cfg = () => helios.density();\n      const applyDensity = (patch) => {\n        helios.density(patch);\n        helios.scheduler?.requestRender?.();\n        helios.requestRender?.();\n      };\n      const isLogRatioMode = (state = cfg()) => state?.comparisonMode === 'logRatio';\n      const hasDensityComparison = (state = cfg()) => state?.compareProperty && state.compareProperty !== 'None';\n      const resolveDensityPickerColormap = (state = cfg()) => {\n        if (isLogRatioMode(state)) return state?.logRatioColormap ?? state?.divergingColormap ?? state?.colormap;\n        if (state?.diverging === true) return state?.divergingColormap ?? state?.colormap;\n        return state?.colormap;\n      };\n      const listDensityCompareAttributes = (property) => listDensityAttributes().filter((value) => value !== property);\n      const DENSITY_INTERACTION_FILTERS = [\n        { value: 'auto', label: 'Auto' },\n        { value: 'off', label: 'All Active' },\n        { value: 'selected', label: 'Selected' },\n        { value: 'highlighted', label: 'Highlighted' },\n        { value: 'selected-or-highlighted', label: 'Selected, then Highlighted' },\n      ];\n      const RESOLUTION_PRESETS = [\n        { value: 0.05, label: '1/20' },\n        { value: 0.1, label: '1/10' },\n        { value: 0.2, label: '1/5' },\n        { value: 0.25, label: '1/4' },\n        { value: 1 / 3, label: '1/3' },\n        { value: 0.5, label: '1/2' },\n        { value: 1, label: '1' },\n      ];\n      let autoBackground = false;\n      let manualBackgroundColor = null;\n      let densityBackgroundApplied = false;\n\n      const clamp01 = (value) => {\n        const numeric = Number(value);\n        if (!Number.isFinite(numeric)) return 0;\n        return Math.max(0, Math.min(1, numeric));\n      };\n\n      const normalizeColormapSample = (sample) => {\n        if (Array.isArray(sample) || ArrayBuffer.isView(sample)) {\n          const r = clamp01(sample[0] ?? 0);\n          const g = clamp01(sample[1] ?? 0);\n          const b = clamp01(sample[2] ?? 0);\n          const a = clamp01(sample.length >= 4 ? sample[3] : 1);\n          return [r, g, b, a];\n        }\n        if (typeof sample === 'string') {\n          const raw = sample.trim();\n          const hexMatch = /^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.exec(raw);\n          if (hexMatch) {\n            const hex = hexMatch[1];\n            const expand = (c) => `${c}${c}`;\n            const normalized = hex.length === 3\n              ? hex.split('').map((c) => expand(c)).join('')\n              : hex.length === 6\n                ? hex\n                : hex.slice(0, 6);\n            const alphaHex = hex.length === 8 ? hex.slice(6, 8) : 'ff';\n            return [\n              parseInt(normalized.slice(0, 2), 16) / 255,\n              parseInt(normalized.slice(2, 4), 16) / 255,\n              parseInt(normalized.slice(4, 6), 16) / 255,\n              parseInt(alphaHex, 16) / 255,\n            ];\n          }\n          const rgbMatch = /^rgba?\\(([^)]+)\\)$/i.exec(raw);\n          if (rgbMatch) {\n            const parts = rgbMatch[1].split(',').map((v) => Number(v.trim()));\n            if (parts.length >= 3 && parts.slice(0, 3).every(Number.isFinite)) {\n              const alpha = Number.isFinite(parts[3]) ? parts[3] : 1;\n              return [\n                clamp01(parts[0] / 255),\n                clamp01(parts[1] / 255),\n                clamp01(parts[2] / 255),\n                clamp01(alpha),\n              ];\n            }\n          }\n        }\n        return [0, 0, 0, 1];\n      };\n\n      const getDensityZeroColor = (state = cfg()) => {\n        const key = resolveDensityPickerColormap(state);\n        const resolved = resolveColormap(key) || resolveColormap('interpolateOrRd');\n        const sample = resolved?.interpolate?.(isLogRatioMode(state) || state?.diverging === true ? 0.5 : 0) ?? [0, 0, 0, 1];\n        return normalizeColormapSample(sample);\n      };\n\n      const readCurrentBackgroundColor = () => {\n        const current = helios.clearColor?.();\n        if (!(Array.isArray(current) || ArrayBuffer.isView(current))) return null;\n        return [\n          clamp01(current[0] ?? 0),\n          clamp01(current[1] ?? 0),\n          clamp01(current[2] ?? 0),\n          clamp01(current.length >= 4 ? current[3] : 1),\n        ];\n      };\n\n      const shouldApplyDensityBackground = (state = cfg()) => autoBackground && state?.enabled === true;\n\n      const captureManualBackground = () => {\n        if (densityBackgroundApplied) return;\n        const current = readCurrentBackgroundColor();\n        if (current) manualBackgroundColor = current;\n      };\n\n      captureManualBackground();\n\n      const restoreManualBackground = () => {\n        if (!densityBackgroundApplied) return;\n        densityBackgroundApplied = false;\n        if (!manualBackgroundColor) return;\n        try {\n          helios.clearColor?.(manualBackgroundColor);\n        } catch (error) {\n          console.warn('[HeliosUI][MappersPanel] Failed to restore density background color.', error);\n        }\n      };\n\n      const applyDensityBackground = (state = cfg()) => {\n        if (!shouldApplyDensityBackground(state)) {\n          restoreManualBackground();\n          return;\n        }\n        if (!densityBackgroundApplied) captureManualBackground();\n        try {\n          helios.clearColor?.(getDensityZeroColor(state));\n          densityBackgroundApplied = true;\n        } catch (error) {\n          console.warn('[HeliosUI][MappersPanel] Failed to apply density background color.', error);\n        }\n      };\n\n      const toResolutionIndex = (value) => {\n        const numeric = Number(value);\n        if (!Number.isFinite(numeric)) return 0;\n        let bestIndex = 0;\n        let bestDistance = Infinity;\n        for (let i = 0; i < RESOLUTION_PRESETS.length; i += 1) {\n          const dist = Math.abs(RESOLUTION_PRESETS[i].value - numeric);\n          if (dist < bestDistance) {\n            bestDistance = dist;\n            bestIndex = i;\n          }\n        }\n        return bestIndex;\n      };\n      const setRowEnabled = (row, enabled) => {\n        if (!row) return;\n        row.style.opacity = enabled ? '1' : '0.55';\n        for (const control of row.querySelectorAll('input, select, button, textarea')) {\n          control.disabled = !enabled;\n        }\n      };\n      const setRowVisible = (row, visible) => {\n        if (!row) return;\n        row.style.display = visible ? '' : 'none';\n      };\n\n      const enabledToggle = createCheckboxControl({\n        checked: cfg().enabled === true,\n        onChange: (checked) => {\n          applyDensity({ enabled: checked });\n          applyDensityBackground();\n        },\n        onLabel: 'On',\n        offLabel: 'Off',\n      });\n      editorBody.appendChild(createAlignedRow({\n        title: 'Enabled',\n        hint: 'Enable or disable density rendering.',\n        controls: enabledToggle,\n      }).row);\n\n      const reliefToggle = createCheckboxControl({\n        checked: cfg().topographic === true,\n        onChange: (checked) => applyDensity({ topographic: checked }),\n        onLabel: 'Relief',\n        offLabel: 'Flat',\n      });\n      editorBody.appendChild(createAlignedRow({\n        title: 'Relief',\n        hint: 'Draw topographic contour lines over the density map.',\n        controls: reliefToggle,\n      }).row);\n\n      const autoBackgroundToggle = createCheckboxControl({\n        checked: autoBackground,\n        onChange: (checked) => {\n          autoBackground = checked === true;\n          applyDensityBackground();\n        },\n        onLabel: 'Match',\n        offLabel: 'Manual',\n      });\n      editorBody.appendChild(createAlignedRow({\n        title: 'Map BG',\n        hint: 'Match background to the zero-value color of the active density colormap.',\n        controls: autoBackgroundToggle,\n      }).row);\n\n      const propertySelect = document.createElement('select');\n      propertySelect.className = 'helios-ui-select';\n      editorBody.appendChild(createAlignedRow({\n        title: 'Density',\n        hint: 'Primary density property.',\n        controls: propertySelect,\n      }).row);\n\n      const compareSelect = document.createElement('select');\n      compareSelect.className = 'helios-ui-select';\n      editorBody.appendChild(createAlignedRow({\n        title: 'vs',\n        hint: 'Second property used for density comparison.',\n        controls: compareSelect,\n      }).row);\n\n      const comparisonModeSelect = document.createElement('select');\n      comparisonModeSelect.className = 'helios-ui-select';\n      for (const option of [\n        { value: 'difference', label: 'Difference' },\n        { value: 'logRatio', label: 'Log Ratio' },\n      ]) {\n        const el = document.createElement('option');\n        el.value = option.value;\n        el.textContent = option.label;\n        comparisonModeSelect.appendChild(el);\n      }\n      const modeRow = createAlignedRow({\n        title: 'Mode',\n        hint: 'Use the current normalized difference mode or a real log-ratio density comparison.',\n        controls: comparisonModeSelect,\n      });\n      editorBody.appendChild(modeRow.row);\n\n      const normalizeToggle = createCheckboxControl({\n        checked: cfg().normalizeVs === true,\n        onChange: (checked) => applyDensity({ normalizeVs: checked }),\n        onLabel: 'Normalized',\n        offLabel: 'Raw',\n      });\n      const normalizeRow = createAlignedRow({\n        title: 'Norm.',\n        hint: 'Normalize positive/negative comparison sides independently.',\n        controls: normalizeToggle,\n      });\n      editorBody.appendChild(normalizeRow.row);\n\n      const bandwidthControl = new LogSliderControls({\n        value: cfg().bandwidth ?? 28.1,\n        minExp: -0.9,\n        maxExp: 2.5,\n        stepExp: 0.05,\n        minValue: 0.05,\n        maxValue: 1000,\n        digits: 2,\n        onCommit: (value) => applyDensity({ bandwidth: value }),\n      });\n      registerControl(bandwidthControl);\n      editorBody.appendChild(createAlignedRow({\n        title: 'Bandwidth',\n        hint: 'Kernel bandwidth (log scale).',\n        controls: bandwidthControl.element,\n      }).row);\n\n      const zoomScaleToggle = createCheckboxControl({\n        checked: cfg().scaleWithZoom === true,\n        onChange: (checked) => applyDensity({ scaleWithZoom: checked }),\n        onLabel: 'Scale',\n        offLabel: 'Fixed',\n      });\n      editorBody.appendChild(createAlignedRow({\n        title: 'Zoom',\n        hint: 'Scale bandwidth with 2D zoom so density stays mostly stable while zooming.',\n        controls: zoomScaleToggle,\n      }).row);\n\n      const weightControl = new LogSliderControls({\n        value: cfg().weightScale ?? 398.1071705534973,\n        minExp: 0,\n        maxExp: 10,\n        stepExp: 0.1,\n        minValue: 1,\n        maxValue: 1e8,\n        digits: 2,\n        onCommit: (value) => applyDensity({ weightScale: value }),\n      });\n      registerControl(weightControl);\n      const weightRow = createAlignedRow({\n        title: 'Weight',\n        hint: 'Density intensity multiplier (log scale).',\n        controls: weightControl.element,\n      });\n      editorBody.appendChild(weightRow.row);\n\n      const epsilonControl = new LogSliderControls({\n        value: cfg().epsilon ?? 1e-6,\n        minExp: -9,\n        maxExp: -0.5,\n        stepExp: 0.1,\n        minValue: 1e-9,\n        maxValue: 0.316227766,\n        digits: 6,\n        onCommit: (value) => applyDensity({ epsilon: value }),\n      });\n      registerControl(epsilonControl);\n      const epsilonRow = createAlignedRow({\n        title: 'Epsilon',\n        hint: 'Small stabilizer added to the log-ratio numerator and denominator.',\n        controls: epsilonControl.element,\n      });\n      editorBody.appendChild(epsilonRow.row);\n\n      const logRatioRangeControl = new LogSliderControls({\n        value: cfg().logRatioRange ?? 3,\n        minExp: -0.5,\n        maxExp: 1,\n        stepExp: 0.05,\n        minValue: 0.316227766,\n        maxValue: 10,\n        digits: 3,\n        onCommit: (value) => applyDensity({ logRatioRange: value }),\n      });\n      registerControl(logRatioRangeControl);\n      const logRatioRangeRow = createAlignedRow({\n        title: 'Range',\n        hint: 'Symmetric clipping range for the real-valued log-ratio or approximate z-score color scale.',\n        controls: logRatioRangeControl.element,\n      });\n      editorBody.appendChild(logRatioRangeRow.row);\n\n      const zScoreToggle = createCheckboxControl({\n        checked: cfg().logRatioZScore === true,\n        onChange: (checked) => applyDensity({ logRatioZScore: checked }),\n        onLabel: 'Z',\n        offLabel: 'Log',\n      });\n      const zScoreRow = createAlignedRow({\n        title: 'Z-score',\n        hint: 'Approximate local z-score under a fast effective-count null model. Off shows the raw log-ratio.',\n        controls: zScoreToggle,\n      });\n      editorBody.appendChild(zScoreRow.row);\n\n      const supportCorrectionToggle = createCheckboxControl({\n        checked: cfg().logRatioSupportCorrection !== false,\n        onChange: (checked) => applyDensity({ logRatioSupportCorrection: checked }),\n        onLabel: 'Correct',\n        offLabel: 'Raw',\n      });\n      const supportCorrectionRow = createAlignedRow({\n        title: 'Support',\n        hint: 'Fade unstable low-support log-ratio tails while keeping well-supported regions unchanged.',\n        controls: supportCorrectionToggle,\n      });\n      editorBody.appendChild(supportCorrectionRow.row);\n\n      const resolutionWrap = document.createElement('div');\n      resolutionWrap.style.display = 'flex';\n      resolutionWrap.style.alignItems = 'center';\n      resolutionWrap.style.gap = '8px';\n      resolutionWrap.style.width = '100%';\n\n      const resolutionSlider = document.createElement('input');\n      resolutionSlider.type = 'range';\n      resolutionSlider.className = 'helios-ui-slider';\n      resolutionSlider.min = '0';\n      resolutionSlider.max = String(RESOLUTION_PRESETS.length - 1);\n      resolutionSlider.step = '1';\n      resolutionSlider.style.flex = '1 1 auto';\n\n      const resolutionLabel = document.createElement('span');\n      resolutionLabel.style.color = 'var(--helios-ui-muted)';\n      resolutionLabel.style.fontWeight = '600';\n      resolutionLabel.style.minWidth = '3ch';\n      resolutionLabel.style.textAlign = 'right';\n\n      const setResolutionIndex = (index, { commit = false } = {}) => {\n        const clampedIndex = Math.max(0, Math.min(RESOLUTION_PRESETS.length - 1, Math.floor(Number(index) || 0)));\n        const entry = RESOLUTION_PRESETS[clampedIndex];\n        resolutionSlider.value = String(clampedIndex);\n        resolutionLabel.textContent = entry.label;\n        if (commit) applyDensity({ qualityScale: entry.value });\n      };\n\n      resolutionSlider.addEventListener('input', () => {\n        setResolutionIndex(Number(resolutionSlider.value), { commit: true });\n      });\n\n      resolutionWrap.appendChild(resolutionSlider);\n      resolutionWrap.appendChild(resolutionLabel);\n      editorBody.appendChild(createAlignedRow({\n        title: 'Resolution',\n        hint: 'Density map resolution scale.',\n        controls: resolutionWrap,\n      }).row);\n\n      const interactionFilterSelect = document.createElement('select');\n      interactionFilterSelect.className = 'helios-ui-select';\n      interactionFilterSelect.setAttribute('aria-label', 'Density Focus');\n      for (const option of DENSITY_INTERACTION_FILTERS) {\n        const el = document.createElement('option');\n        el.value = option.value;\n        el.textContent = option.label;\n        interactionFilterSelect.appendChild(el);\n      }\n      interactionFilterSelect.addEventListener('change', () => {\n        applyDensity({ interactionFilter: interactionFilterSelect.value });\n      });\n      editorBody.appendChild(createAlignedRow({\n        title: 'Focus',\n        hint: 'Choose which active nodes contribute to density. Auto uses selected nodes first, then real highlighted nodes, then all active nodes.',\n        controls: interactionFilterSelect,\n      }).row);\n\n      const colormapPicker = new ColormapPickerControl({\n        catalog: colormapCatalog,\n        portalRoot: ui?.container ?? document.body,\n        value: resolveDensityPickerColormap(cfg()),\n        fallbackValue: 'interpolateOrRd',\n        searchPlaceholder: 'Search colormaps…',\n        filters: [\n          {\n            id: 'diverging',\n            label: 'Diverging',\n            title: 'Show diverging colormaps for comparison density maps.',\n            active: hasDensityComparison(cfg()) || cfg()?.diverging === true,\n            predicate: (entry) => entry?.diverging === true,\n          },\n        ],\n        onChange: (key) => {\n          const state = cfg();\n          if (isLogRatioMode(state)) {\n            applyDensity({ logRatioColormap: key });\n          } else if (state?.diverging === true) {\n            applyDensity({ divergingColormap: key });\n          } else {\n            applyDensity({ colormap: key });\n          }\n          applyDensityBackground();\n          refresh();\n        },\n      });\n      registerControl(colormapPicker);\n      editorBody.appendChild(createAlignedRow({\n        title: 'Map',\n        hint: 'Colormap for the density layer (sequential or diverging when required).',\n        controls: colormapPicker.element,\n      }).row);\n\n      propertySelect.addEventListener('change', () => {\n        const nextProperty = propertySelect.value;\n        const currentCompare = compareSelect.value;\n        const nextCompareOptions = listDensityCompareAttributes(nextProperty);\n        const patch = { property: nextProperty };\n        if (currentCompare === nextProperty || (currentCompare !== 'None' && !nextCompareOptions.includes(currentCompare))) {\n          patch.compareProperty = 'None';\n          patch.comparisonMode = 'difference';\n          colormapPicker.setFilterActive('diverging', false, { render: false });\n        }\n        applyDensity(patch);\n        refresh();\n      });\n      compareSelect.addEventListener('change', () => {\n        if (compareSelect.value === 'None') {\n          applyDensity({ compareProperty: 'None', comparisonMode: 'difference' });\n          colormapPicker.setFilterActive('diverging', false, { render: false });\n        } else {\n          applyDensity({ compareProperty: compareSelect.value });\n          colormapPicker.setFilterActive('diverging', true, { render: false });\n        }\n        refresh();\n      });\n      comparisonModeSelect.addEventListener('change', () => {\n        applyDensity({ comparisonMode: comparisonModeSelect.value });\n        if (comparisonModeSelect.value === 'logRatio') {\n          colormapPicker.setFilterActive('diverging', true, { render: false });\n        }\n        refresh();\n      });\n\n      const refresh = () => {\n        const state = cfg();\n        const attrs = listDensityAttributes();\n        const compareAttrs = listDensityCompareAttributes(state.property);\n        const compareEnabled = compareAttrs.length > 0;\n        const hasComparison = hasDensityComparison(state);\n        const logRatioMode = isLogRatioMode(state);\n        captureManualBackground();\n\n        const ensureOptionList = (select, values) => {\n          const current = select.value;\n          select.textContent = '';\n          for (const value of values) {\n            const opt = document.createElement('option');\n            opt.value = value;\n            opt.textContent = value;\n            select.appendChild(opt);\n          }\n          if (values.includes(current)) select.value = current;\n        };\n\n        ensureOptionList(propertySelect, attrs);\n        ensureOptionList(compareSelect, ['None', ...compareAttrs]);\n\n        if (!attrs.includes(state.property)) {\n          propertySelect.value = 'Uniform';\n          applyDensity({ property: 'Uniform' });\n        } else {\n          propertySelect.value = state.property;\n        }\n\n        if (!['None', ...compareAttrs].includes(state.compareProperty)) {\n          compareSelect.value = 'None';\n          applyDensity({ compareProperty: 'None' });\n        } else {\n          compareSelect.value = state.compareProperty;\n        }\n\n        comparisonModeSelect.value = logRatioMode ? 'logRatio' : 'difference';\n        enabledToggle.checked = state.enabled === true;\n        interactionFilterSelect.value = DENSITY_INTERACTION_FILTERS.some((entry) => entry.value === state.interactionFilter)\n          ? state.interactionFilter\n          : 'auto';\n        reliefToggle.checked = state.topographic === true;\n        normalizeToggle.checked = state.normalizeVs === true;\n        zScoreToggle.checked = state.logRatioZScore === true;\n        supportCorrectionToggle.checked = state.logRatioSupportCorrection !== false;\n        zoomScaleToggle.checked = state.scaleWithZoom === true;\n        normalizeToggle.disabled = compareSelect.value === 'None' || logRatioMode;\n\n        bandwidthControl.setValue(Math.max(0.05, Number(state.bandwidth ?? 1)));\n        weightControl.setValue(Math.max(1, Number(state.weightScale ?? 1)));\n        epsilonControl.setValue(Math.max(1e-9, Number(state.epsilon ?? 1e-6)));\n        logRatioRangeControl.setValue(Math.max(0.316227766, Number(state.logRatioRange ?? 3)));\n        setResolutionIndex(toResolutionIndex(state.qualityScale), { commit: false });\n\n        const activeColormap = resolveDensityPickerColormap(state);\n        colormapPicker.setValue(activeColormap);\n        setRowEnabled(compareSelect.closest('.helios-ui-row'), compareEnabled);\n        setRowVisible(modeRow.row, hasComparison);\n        setRowEnabled(normalizeRow.row, !logRatioMode && compareSelect.value !== 'None');\n        setRowEnabled(weightRow.row, !logRatioMode);\n        setRowVisible(epsilonRow.row, hasComparison && logRatioMode);\n        setRowVisible(logRatioRangeRow.row, hasComparison && logRatioMode);\n        setRowVisible(zScoreRow.row, hasComparison && logRatioMode);\n        setRowVisible(supportCorrectionRow.row, hasComparison && logRatioMode);\n        applyDensityBackground(state);\n      };\n\n      const onNetworkReplaced = () => refresh();\n      let unsub = null;\n      if (helios?.on) {\n        unsub = helios.on('network:replaced', onNetworkReplaced);\n      } else if (helios?.addEventListener) {\n        helios.addEventListener('network:replaced', onNetworkReplaced);\n        unsub = () => helios.removeEventListener('network:replaced', onNetworkReplaced);\n      }\n      if (unsub) ui._controlCleanups.add(unsub);\n\n      refresh();\n      return { root, refresh };\n    };\n\n    const nodeTab = createModeTab('node');\n    const edgeTab = createModeTab('edge');\n    const densityTab = createDensityTab();\n\n    let activeMode = 'node';\n\n    const channelSelect = document.createElement('select');\n    channelSelect.className = 'helios-ui-select helios-ui-select--compact';\n    tooltips.attachTooltip(channelSelect, 'Select which visual channel to edit.');\n\n    const getActiveTab = () => {\n      if (activeMode === 'edge') return edgeTab;\n      if (activeMode === 'density') return null;\n      return nodeTab;\n    };\n\n    const syncChannelSelect = () => {\n      const tab = getActiveTab();\n      if (!tab) {\n        channelSelect.disabled = true;\n        channelSelect.style.display = 'none';\n        return;\n      }\n      channelSelect.disabled = false;\n      channelSelect.style.display = '';\n      const { channels, state } = tab;\n      channelSelect.textContent = '';\n      for (const name of channels) {\n        const opt = document.createElement('option');\n        opt.value = name;\n        opt.textContent = CHANNEL_LABELS[name] ?? name;\n        channelSelect.appendChild(opt);\n      }\n      channelSelect.value = channels.includes(state.channel) ? state.channel : channels[0];\n    };\n\n    channelSelect.addEventListener('change', () => {\n      const tab = getActiveTab();\n      if (!tab) return;\n      tab.setChannel(channelSelect.value);\n      syncChannelSelect();\n    });\n\n    syncChannelSelect();\n\n    return ui.createTabbedPanel({\n      id: options.id ?? 'helios-ui-mappers',\n      title: options.title ?? 'Mappers',\n      position: options.position ?? { x: 16, y: 120 },\n      dock: options.dock ?? 'top-left',\n      barRight: channelSelect,\n      onActiveChanged: (tabId) => {\n        if (tabId === 'edges') activeMode = 'edge';\n        else if (tabId === 'density') activeMode = 'density';\n        else activeMode = 'node';\n        if (activeMode === 'density') densityTab.refresh?.();\n        syncChannelSelect();\n      },\n      tabs: [\n        {\n          id: 'nodes',\n          title: 'Nodes',\n          content: nodeTab.root,\n        },\n        {\n          id: 'edges',\n          title: 'Edges',\n          content: edgeTab.root,\n        },\n        { id: 'density', title: 'Density', content: densityTab.root },\n      ],\n      variant: 'panel',\n      panelSchema: MAPPERS_PANEL_SCHEMA,\n    });\n  }\n}\n","import { EVENTS } from '../../Helios.js';\nimport { createToggleControl } from '../controls/createToggleControl.js';\nimport { createAlignedRowEl } from '../controls/createAlignedRowEl.js';\nimport { createDirtyIndicator } from '../controls/createDirtyIndicator.js';\nimport { SuggestedSliderControls } from '../controls/SuggestedSliderControls.js';\nimport { LogSliderControls } from '../controls/LogSliderControls.js';\nimport { LAYOUT_PANEL_SCHEMA, humanizeControlLabel } from './panelSchema.js';\n\nconst CURRENT_POSITION_ATTRIBUTE = '_helios_visuals_position';\n\nfunction toFinite(value, fallback = null) {\n  const numeric = Number(value);\n  return Number.isFinite(numeric) ? numeric : fallback;\n}\n\nfunction formatDisplayNumber(value) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return '—';\n  const abs = Math.abs(numeric);\n  if (abs >= 1000) return numeric.toFixed(0);\n  if (abs >= 100) return numeric.toFixed(1);\n  if (abs >= 10) return numeric.toFixed(2);\n  if (abs >= 1) return numeric.toFixed(3);\n  if (abs >= 0.01) return numeric.toFixed(4);\n  return numeric.toExponential(2);\n}\n\nfunction formatBindingValue(binding, value) {\n  if (typeof binding?.format === 'function') {\n    try {\n      return String(binding.format(value));\n    } catch (_) {\n      return String(value ?? '—');\n    }\n  }\n  if (typeof value === 'number') return formatDisplayNumber(value);\n  if (typeof value === 'boolean') return value ? 'On' : 'Off';\n  if (value == null || value === '') return '—';\n  return String(value);\n}\n\nfunction clampNumber(value, min, max) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return null;\n  let next = numeric;\n  const minValue = resolveFiniteBound(min, null);\n  const maxValue = resolveFiniteBound(max, null);\n  if (Number.isFinite(minValue)) next = Math.max(minValue, next);\n  if (Number.isFinite(maxValue)) next = Math.min(maxValue, next);\n  return next;\n}\n\nfunction resolveFiniteBound(primary, fallback = null) {\n  if (primary == null || primary === '') {\n    if (fallback == null || fallback === '') return null;\n    const fallbackNumeric = Number(fallback);\n    return Number.isFinite(fallbackNumeric) ? fallbackNumeric : null;\n  }\n  const numeric = Number(primary);\n  if (Number.isFinite(numeric)) return numeric;\n  if (fallback == null || fallback === '') return null;\n  const fallbackNumeric = Number(fallback);\n  return Number.isFinite(fallbackNumeric) ? fallbackNumeric : null;\n}\n\nfunction usesLogScale(binding) {\n  return binding?.scale === 'log';\n}\n\nfunction scopeForStatePath(path) {\n  const parts = String(path ?? '').split('.').filter(Boolean);\n  if (parts.length >= 2) return `${parts[0]}.${parts[1]}`;\n  return parts[0] ?? '';\n}\n\nfunction collectStateKeys(detail = {}) {\n  const keys = [];\n  if (typeof detail.storageKey === 'string') keys.push(detail.storageKey);\n  if (typeof detail.stateKey === 'string') keys.push(detail.stateKey);\n  if (Array.isArray(detail.storageKeys)) {\n    for (const key of detail.storageKeys) if (typeof key === 'string') keys.push(key);\n  }\n  if (Array.isArray(detail.stateKeys)) {\n    for (const key of detail.stateKeys) if (typeof key === 'string') keys.push(key);\n  }\n  return keys;\n}\n\nfunction stateKeyMatchesTarget(key, target) {\n  if (!key || !target) return false;\n  return key === target || key.startsWith(`${target}.`) || target.startsWith(`${key}.`);\n}\n\nfunction layoutEventTargetsPath(detail = {}, path = '') {\n  const keys = collectStateKeys(detail);\n  if (!keys.length) return false;\n  return keys.some((key) => (\n    stateKeyMatchesTarget(key, path)\n    || stateKeyMatchesTarget(key, `behaviors.${path}`)\n  ));\n}\n\nfunction formatInputNumber(value, binding) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return '';\n  if (binding?.notation === 'scientific') {\n    return numeric.toExponential(2);\n  }\n  const step = Number(binding?.step);\n  if (Number.isFinite(step) && step >= 1) {\n    return String(Math.round(numeric));\n  }\n  return String(Number(numeric.toFixed(6)));\n}\n\nfunction formatHistoryValue(value, scale = 'linear') {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return null;\n  if (scale === 'log') {\n    return Math.log10(Math.max(1e-6, numeric));\n  }\n  return numeric;\n}\n\nfunction resolveHistoryBound(bound) {\n  const raw = typeof bound === 'function' ? bound() : bound;\n  const numeric = Number(raw);\n  return Number.isFinite(numeric) ? numeric : null;\n}\n\nexport function buildSparklinePath(samples, width, height, scale = 'linear', bounds = null) {\n  const values = samples\n    .map((sample) => Number(sample))\n    .filter((sample) => Number.isFinite(sample));\n  if (!values.length) return '';\n\n  const transformed = values\n    .map((sample) => formatHistoryValue(sample, scale))\n    .filter((sample) => Number.isFinite(sample));\n  if (!transformed.length) return '';\n\n  const boundMin = resolveHistoryBound(bounds?.min);\n  const boundMax = resolveHistoryBound(bounds?.max);\n  const min = Number.isFinite(boundMin)\n    ? formatHistoryValue(boundMin, scale)\n    : Math.min(...transformed);\n  const max = Number.isFinite(boundMax)\n    ? formatHistoryValue(boundMax, scale)\n    : Math.max(...transformed);\n  const span = Math.max(1e-9, max - min);\n  if (transformed.length === 1) {\n    const normalized = span <= 1e-9 ? 0.5 : Math.max(0, Math.min(1, (transformed[0] - min) / span));\n    const y = height - (normalized * height);\n    return `M 0 ${y.toFixed(2)}`;\n  }\n  return transformed.map((value, index) => {\n    const x = (index / Math.max(1, transformed.length - 1)) * width;\n    const normalized = span <= 1e-9 ? 0.5 : Math.max(0, Math.min(1, (value - min) / span));\n    const y = height - (normalized * height);\n    return `${index === 0 ? 'M' : 'L'} ${x.toFixed(2)} ${y.toFixed(2)}`;\n  }).join(' ');\n}\n\nfunction createPlayIcon() {\n  const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n  svg.setAttribute('viewBox', '0 0 24 24');\n  svg.classList.add('helios-ui-button__icon');\n\n  const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n  path.setAttribute('d', 'M8 5.5v13l10-6.5z');\n  path.setAttribute('fill', 'currentColor');\n  path.setAttribute('stroke', 'none');\n\n  svg.appendChild(path);\n  return svg;\n}\n\nfunction createPauseIcon() {\n  const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n  svg.setAttribute('viewBox', '0 0 24 24');\n  svg.classList.add('helios-ui-button__icon');\n\n  for (const x of [7, 13]) {\n    const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n    rect.setAttribute('x', String(x));\n    rect.setAttribute('y', '5.5');\n    rect.setAttribute('width', '4');\n    rect.setAttribute('height', '13');\n    rect.setAttribute('rx', '0.75');\n    rect.setAttribute('fill', 'currentColor');\n    svg.appendChild(rect);\n  }\n\n  return svg;\n}\n\nfunction createStatusSpinnerIcon() {\n  const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n  svg.setAttribute('viewBox', '0 0 24 24');\n  svg.classList.add('helios-ui-layout__status-spinner');\n\n  const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n  path.setAttribute('d', 'M21 12a9 9 0 1 1-3.1-6.8');\n  path.setAttribute('fill', 'none');\n  path.setAttribute('stroke', 'currentColor');\n  path.setAttribute('stroke-width', '2');\n  path.setAttribute('stroke-linecap', 'round');\n  path.setAttribute('stroke-linejoin', 'round');\n\n  svg.appendChild(path);\n  return svg;\n}\n\nfunction subscribe(helios, eventName, handler) {\n  if (!helios || typeof handler !== 'function') return () => {};\n  if (typeof helios.on === 'function') {\n    return helios.on(eventName, handler) ?? (() => {});\n  }\n  if (typeof helios.addEventListener === 'function') {\n    helios.addEventListener(eventName, handler);\n    return () => helios.removeEventListener(eventName, handler);\n  }\n  return () => {};\n}\n\nexport class LayoutPanel {\n  constructor(ui, options = {}) {\n    this.ui = ui;\n    this.options = options;\n  }\n\n  create() {\n    const helios = this.ui.helios ?? null;\n    const content = document.createElement('div');\n    const layoutBehavior = helios?.behavior?.layout ?? helios?.useBehavior?.('layout');\n    const storage = helios?.storage ?? null;\n    const stateManager = helios?.states ?? storage;\n\n    if (!helios || !layoutBehavior) {\n      const placeholder = document.createElement('div');\n      placeholder.className = 'helios-ui-label__hint';\n      placeholder.textContent = this.options.placeholder ?? 'Layout controls require LayoutBehavior.';\n      const { row } = createAlignedRowEl({\n        title: this.options.placeholderTitle ?? 'Status',\n        controls: placeholder,\n      });\n      content.appendChild(row);\n      return this.ui.createPanel({\n        id: this.options.id ?? 'helios-ui-layout',\n        title: this.options.title ?? 'Layout',\n        position: this.options.position ?? { x: 16, y: 360 },\n        dock: this.options.dock ?? 'top-right',\n      content,\n      });\n    }\n\n    const controlsByKey = new Map();\n    const parameterEntryCleanups = new Map();\n    const staticIndicatorCleanups = new Set();\n    let currentDescriptorKey = null;\n    let lastChoiceSignature = null;\n    let lastPositionChoiceSignature = null;\n    let selectedPositionAttribute = layoutBehavior.positionAttribute?.() ?? CURRENT_POSITION_ATTRIBUTE;\n    const getCurrentDescriptor = () => layoutBehavior.descriptor?.() ?? {\n      key: 'static',\n      label: 'Static',\n      dynamic: false,\n      bindings: [],\n    };\n    const setText = (element, value) => {\n      const next = String(value ?? '');\n      if (element && element.textContent !== next) element.textContent = next;\n    };\n    const setAttributeIfChanged = (element, name, value) => {\n      if (!element) return;\n      const next = String(value ?? '');\n      const current = typeof element.getAttribute === 'function'\n        ? element.getAttribute(name)\n        : element.attributes?.get?.(String(name));\n      if (current !== next) element.setAttribute(name, next);\n    };\n    const setDatasetIfChanged = (element, key, value) => {\n      if (!element?.dataset) return;\n      const next = String(value ?? '');\n      if (element.dataset[key] !== next) element.dataset[key] = next;\n    };\n    const setDisplayIfChanged = (element, value) => {\n      if (element && element.style.display !== value) element.style.display = value;\n    };\n\n    const layoutSelect = document.createElement('select');\n    layoutSelect.className = 'helios-ui-select';\n\n    const positionAttributeSelect = document.createElement('select');\n    positionAttributeSelect.className = 'helios-ui-select';\n\n    const statusControls = document.createElement('div');\n    statusControls.className = 'helios-ui-layout__status-shell';\n\n    const statusVisual = document.createElement('div');\n    statusVisual.className = 'helios-ui-layout__status-visual';\n\n    const statusSparkline = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n    statusSparkline.setAttribute('viewBox', '0 0 120 24');\n    statusSparkline.setAttribute('preserveAspectRatio', 'none');\n    statusSparkline.classList.add('helios-ui-layout__sparkline', 'helios-ui-layout__sparkline--status');\n\n    const statusSparklinePath = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n    statusSparklinePath.setAttribute('fill', 'none');\n    statusSparklinePath.setAttribute('vector-effect', 'non-scaling-stroke');\n    statusSparkline.appendChild(statusSparklinePath);\n\n    const statusTempLabel = document.createElement('div');\n    statusTempLabel.className = 'helios-ui-layout__status-temp';\n    statusTempLabel.textContent = 'Temp.';\n\n    const statusBadge = document.createElement('div');\n    statusBadge.className = 'helios-ui-layout__status-badge';\n\n    const statusSpinner = createStatusSpinnerIcon();\n    const statusText = document.createElement('span');\n    statusText.className = 'helios-ui-layout__status-text';\n\n    statusBadge.appendChild(statusSpinner);\n    statusBadge.appendChild(statusText);\n    statusVisual.appendChild(statusSparkline);\n    statusVisual.appendChild(statusTempLabel);\n    statusVisual.appendChild(statusBadge);\n\n    const runButton = document.createElement('button');\n    runButton.type = 'button';\n    runButton.className = 'helios-ui-layout__status-button';\n\n    const runButtonIconWrap = document.createElement('span');\n    runButtonIconWrap.className = 'helios-ui-layout__status-button-icon';\n\n    statusControls.appendChild(statusVisual);\n    statusControls.appendChild(runButton);\n\n    const pauseOnInteractionToggle = createToggleControl({\n      checked: layoutBehavior.pauseOnInteraction?.() === true,\n      onLabel: 'On',\n      offLabel: 'Off',\n      ariaLabel: 'Pause layout on manual camera input',\n    });\n    pauseOnInteractionToggle.dataset.testid = 'controls-layout-pause-on-input';\n\n    const bindingsRoot = document.createElement('div');\n    bindingsRoot.className = 'helios-ui-layout__bindings';\n\n    let statusBinding = null;\n    let statusHistory = [];\n    let lastStatusSampleAt = Number.NEGATIVE_INFINITY;\n\n    const persistenceScopeForLayoutPath = (path, fallback = 'network') => (\n      path === 'layout.running' ? 'session' : fallback\n    );\n    const storageEntryForKey = (path) => stateManager?.entry?.(path) ?? null;\n    const storageValueForKey = (path, fallback = null) => {\n      const entry = storageEntryForKey(path);\n      const value = stateManager?.get?.(path, undefined);\n      return value === undefined ? (entry?.default ?? fallback) : value;\n    };\n    const bindingTypeForStorage = (binding) => {\n      if (binding?.type === 'boolean') return 'boolean';\n      if (binding?.type === 'select') return 'string';\n      if (binding?.type === 'number') return 'number';\n      return 'object';\n    };\n    const bindingLabel = (binding) => (\n      (typeof binding?.label === 'string' && binding.label.trim())\n        ? binding.label.trim()\n        : humanizeControlLabel(binding?.key)\n    );\n    const bindingUiForStorage = (binding) => ({\n      label: bindingLabel(binding),\n      controller: binding?.type === 'select'\n        ? 'select'\n        : (binding?.type === 'boolean' ? 'toggle' : (binding?.type === 'number' ? 'slider' : 'auto')),\n      min: binding?.min ?? binding?.sliderMin ?? null,\n      max: binding?.max ?? binding?.sliderMax ?? null,\n      step: binding?.step ?? binding?.inputStep ?? null,\n      inputMin: binding?.inputMin ?? null,\n      inputMax: Object.prototype.hasOwnProperty.call(binding ?? {}, 'inputMax') ? binding.inputMax : null,\n      sliderMin: binding?.sliderMin ?? null,\n      sliderMax: binding?.sliderMax ?? null,\n      scale: binding?.scale ?? null,\n      options: binding?.options ?? null,\n      debounceMs: 220,\n    });\n    const registerLayoutPersistenceKey = (path, options = {}) => {\n      if (storageEntryForKey(path)) return null;\n      const scope = options.persistenceScope ?? options.scope ?? persistenceScopeForLayoutPath(path);\n      const debounceMs = options.debounceMs ?? (path.startsWith('layout.parameters.') ? 220 : 150);\n      const registerOptions = {\n        scope,\n        debounceMs,\n        metadata: options.metadata ?? {},\n      };\n      if (Object.prototype.hasOwnProperty.call(options, 'defaultValue')) {\n        registerOptions.defaultValue = options.defaultValue;\n      }\n      return this.ui.registerStateControl?.(path, registerOptions)\n        ?? this.ui._registerStateKey?.(path, registerOptions);\n    };\n    const createStateIndicator = (path = '', indicatorScope = null, options = {}) => {\n      if (this.ui.persistenceIndicators === false) return null;\n      if (path) registerLayoutPersistenceKey(path, options);\n      const resolvedIndicatorScope = indicatorScope ?? scopeForStatePath(path);\n      return this.ui.createStateIndicator?.(path, resolvedIndicatorScope, { register: false })\n        ?? createDirtyIndicator({\n          helios,\n          path,\n          scope: resolvedIndicatorScope,\n      });\n    };\n    const persistLayoutValue = (path, value, options = {}) => {\n      const scope = options.scope ?? persistenceScopeForLayoutPath(path);\n      const debounceMs = options.debounceMs ?? (path.startsWith('layout.parameters.') ? 220 : 150);\n      if (typeof stateManager?.set === 'function' && storageEntryForKey(path)) {\n        stateManager.set(path, value, {\n          scope,\n          source: 'ui',\n          reason: options.reason ?? 'layout-control',\n          journal: false,\n        });\n        return;\n      }\n      registerLayoutPersistenceKey(path, { scope, debounceMs, metadata: options.metadata ?? {} });\n      const writer = this.ui.writeStateControl ?? this.ui._writeStateValue;\n      writer?.call(this.ui, path, value, {\n        scope,\n        source: 'ui',\n        reason: options.reason ?? 'layout-control',\n        debounceMs,\n      });\n    };\n    const registerLayoutParameterEntry = (binding) => {\n      const key = typeof binding?.key === 'string' ? binding.key.trim() : '';\n      if (!key || !stateManager || typeof stateManager.register !== 'function') return null;\n      const path = `layout.parameters.${key}`;\n      if (storageEntryForKey(path)) return null;\n      const cleanup = stateManager.register(this, 'behaviors.layout', {\n        [`parameters.${key}`]: {\n          description: binding.hint ?? `Layout parameter ${key}.`,\n          default: binding.get?.(),\n          type: bindingTypeForStorage(binding),\n          scope: 'workspace',\n          aliases: [path],\n          ui: bindingUiForStorage(binding),\n          getter: () => layoutBehavior.parameter?.(key),\n          setter: (value) => layoutBehavior.parameter?.(key, value, { silent: true }),\n          subscribe: (notify) => layoutBehavior.on?.('change', (event) => {\n            const detail = event?.detail ?? {};\n            const changedKey = detail.key ?? null;\n            const changedKeys = Array.isArray(detail.keys) ? detail.keys : [];\n            if (changedKey && changedKey !== key) return;\n            if (changedKeys.length && !changedKeys.includes(key)) return;\n            if (!changedKey && !changedKeys.length && !layoutEventTargetsPath(detail, path)) return;\n            notify(undefined, detail);\n          }),\n        },\n      });\n      if (typeof cleanup === 'function') parameterEntryCleanups.set(path, cleanup);\n      if (stateManager.status?.(path, { ignorePersistence: true })?.hasOverride === true) {\n        const restored = storageValueForKey(path, undefined);\n        if (restored !== undefined) layoutBehavior.parameter?.(key, restored, { silent: true });\n      }\n      return cleanup;\n    };\n    const syncLayoutParameterEntries = (descriptor) => {\n      for (const binding of descriptor?.bindings ?? []) {\n        const key = typeof binding?.key === 'string' ? binding.key.trim() : '';\n        if (!key || binding.type === 'display') continue;\n        registerLayoutParameterEntry(binding);\n      }\n    };\n\n    const trackStaticIndicator = (indicator) => {\n      if (indicator?.destroy) staticIndicatorCleanups.add(() => indicator.destroy());\n      return indicator;\n    };\n\n    const layoutRow = createAlignedRowEl({\n      title: 'Layout',\n      controls: layoutSelect,\n      dirtyIndicator: trackStaticIndicator(createStateIndicator('layout.layoutType', 'layout', {\n        defaultValue: storageEntryForKey('layout.layoutType')?.default ?? getCurrentDescriptor().key,\n      })),\n    });\n    content.appendChild(layoutRow.row);\n\n    const sourceRow = createAlignedRowEl({\n      title: 'Set from',\n      hint: 'Copies a numeric 2D/3D node attribute into the current layout positions.',\n      controls: positionAttributeSelect,\n      dirtyIndicator: null,\n    });\n    content.appendChild(sourceRow.row);\n\n    const runRow = createAlignedRowEl({\n      title: 'Status',\n      controls: statusControls,\n      dirtyIndicator: trackStaticIndicator(createStateIndicator('layout.running', 'layout', {\n        persistenceScope: 'session',\n        defaultValue: storageEntryForKey('layout.running')?.default ?? ((layoutBehavior.runState?.() ?? 'stopped') !== 'stopped'),\n      })),\n    });\n    content.appendChild(runRow.row);\n\n    const pauseOnInteractionRow = createAlignedRowEl({\n      title: 'Pause on input',\n      hint: 'Pauses layout updates during manual pan, rotate, wheel zoom, or pinch. Automatic orbit and camera transitions keep the layout running.',\n      controls: pauseOnInteractionToggle,\n      dirtyIndicator: trackStaticIndicator(createStateIndicator('layout.pauseOnInteraction', 'layout', {\n        defaultValue: storageEntryForKey('layout.pauseOnInteraction')?.default ?? (layoutBehavior.pauseOnInteraction?.() === true),\n      })),\n    });\n    content.appendChild(pauseOnInteractionRow.row);\n    content.appendChild(bindingsRoot);\n\n    const panel = this.ui.createPanel({\n      id: this.options.id ?? 'helios-ui-layout',\n      title: this.options.title ?? 'Layout',\n      position: this.options.position ?? { x: 16, y: 360 },\n      dock: this.options.dock ?? 'top-right',\n      panelSchema: LAYOUT_PANEL_SCHEMA,\n      content,\n    });\n\n    const syncLayoutChoices = () => {\n      const descriptor = getCurrentDescriptor();\n      const choices = layoutBehavior.choices?.() ?? [];\n      const signature = JSON.stringify([\n        descriptor.key,\n        ...choices.map((choice) => [choice.value, choice.label]),\n      ]);\n      if (signature === lastChoiceSignature) {\n        if (layoutSelect.value !== descriptor.key) {\n          layoutSelect.value = descriptor.key;\n        }\n        return;\n      }\n      lastChoiceSignature = signature;\n      layoutSelect.textContent = '';\n      for (const choice of choices) {\n        const option = document.createElement('option');\n        option.value = choice.value;\n        option.textContent = choice.label;\n        layoutSelect.appendChild(option);\n      }\n      if (!choices.some((choice) => choice.value === descriptor.key)) {\n        const option = document.createElement('option');\n        option.value = descriptor.key;\n        option.textContent = descriptor.label;\n        layoutSelect.appendChild(option);\n      }\n      layoutSelect.value = descriptor.key;\n    };\n\n    const syncPositionChoices = () => {\n      const descriptor = getCurrentDescriptor();\n      const layoutState = layoutBehavior.runState?.() ?? 'stopped';\n      const enabled = layoutState !== 'stopped';\n      const choices = typeof layoutBehavior.positionAttributeChoices === 'function'\n        ? layoutBehavior.positionAttributeChoices()\n        : [{ value: CURRENT_POSITION_ATTRIBUTE, label: 'Current positions', dimension: 3 }];\n      const signature = JSON.stringify(choices.map((choice) => [choice.value, choice.label, choice.dimension]));\n      const fallbackValue = choices[0]?.value ?? CURRENT_POSITION_ATTRIBUTE;\n      const shouldUseCurrentPositions = descriptor.dynamic === true && enabled;\n      const desiredValue = shouldUseCurrentPositions ? CURRENT_POSITION_ATTRIBUTE : selectedPositionAttribute;\n      const nextSelected = choices.some((choice) => choice.value === desiredValue)\n        ? desiredValue\n        : fallbackValue;\n\n      if (signature !== lastPositionChoiceSignature) {\n        lastPositionChoiceSignature = signature;\n        positionAttributeSelect.textContent = '';\n        for (const choice of choices) {\n          const option = document.createElement('option');\n          option.value = choice.value;\n          option.textContent = choice.label;\n          positionAttributeSelect.appendChild(option);\n        }\n      }\n\n      if (selectedPositionAttribute !== nextSelected) selectedPositionAttribute = nextSelected;\n      if (positionAttributeSelect.value !== nextSelected) positionAttributeSelect.value = nextSelected;\n    };\n\n    const refreshRunState = () => {\n      const descriptor = getCurrentDescriptor();\n      const dynamic = descriptor.dynamic === true;\n      const state = dynamic ? (layoutBehavior.runState?.() ?? 'stopped') : 'stopped';\n      const running = state === 'running';\n      const stoppable = state === 'running' || state === 'idle';\n      const label = state === 'idle' ? 'idle' : (running ? 'running' : 'stopped');\n\n      setDisplayIfChanged(runRow.row, dynamic ? '' : 'none');\n      setDatasetIfChanged(statusControls, 'state', state);\n      setDatasetIfChanged(statusVisual, 'state', state);\n      setDatasetIfChanged(statusBadge, 'state', state);\n      setText(statusText, label);\n      setDatasetIfChanged(statusText, 'state', state);\n      setDisplayIfChanged(statusSpinner, running ? '' : 'none');\n      setDatasetIfChanged(runButton, 'state', state);\n      const nextActionLabel = stoppable ? 'Stop layout' : 'Start layout';\n      if (runButton.title !== nextActionLabel) runButton.title = nextActionLabel;\n      setAttributeIfChanged(runButton, 'aria-label', nextActionLabel);\n      const iconKind = stoppable ? 'pause' : 'play';\n      if (runButtonIconWrap.dataset.iconKind !== iconKind) {\n        runButtonIconWrap.dataset.iconKind = iconKind;\n        runButtonIconWrap.replaceChildren(stoppable ? createPauseIcon() : createPlayIcon());\n      }\n      if (runButtonIconWrap.parentElement !== runButton) runButton.appendChild(runButtonIconWrap);\n      setAttributeIfChanged(runButton, 'aria-busy', running ? 'true' : 'false');\n    };\n\n    const refreshPauseOnInteraction = () => {\n      if (document.activeElement === pauseOnInteractionToggle) return;\n      pauseOnInteractionToggle.checked = layoutBehavior.pauseOnInteraction?.() === true;\n    };\n\n    const resetStatusHistory = () => {\n      statusHistory = [];\n      lastStatusSampleAt = Number.NEGATIVE_INFINITY;\n      const initialValue = Number(statusBinding?.get?.());\n      if (Number.isFinite(initialValue)) {\n        statusHistory.push(initialValue);\n        lastStatusSampleAt = performance.now();\n      }\n      const scale = statusBinding?.history?.scale === 'log' ? 'log' : 'linear';\n      const bounds = statusBinding?.history ?? null;\n      const d = buildSparklinePath(statusHistory, 120, 24, scale, bounds);\n      statusSparklinePath.setAttribute('d', d || '');\n    };\n\n    const commitBindingValue = (binding, value) => {\n      if (!binding) return;\n      const parameterPath = binding.key ? `layout.parameters.${binding.key}` : null;\n      if (parameterPath && storageEntryForKey(parameterPath) && typeof stateManager?.set === 'function') {\n        stateManager.set(parameterPath, value, {\n          source: 'ui',\n          reason: 'layout-parameter',\n          journal: false,\n        });\n      } else {\n        if (binding.key && typeof layoutBehavior.parameter === 'function') {\n          layoutBehavior.parameter(binding.key, value, { silent: true });\n        } else if (typeof binding.set === 'function') {\n          binding.set(value);\n        } else {\n          return;\n        }\n        layoutBehavior.emitChange?.('parameter', {\n          key: binding.key ?? null,\n          value,\n          source: 'ui',\n        });\n        if (binding.key) {\n          persistLayoutValue(`layout.parameters.${binding.key}`, value, {\n            reason: 'layout-parameter',\n            metadata: { parameter: binding.key },\n          });\n        }\n      }\n      const descriptor = getCurrentDescriptor();\n      const runState = layoutBehavior.runState?.() ?? 'stopped';\n      if (descriptor.dynamic === true && runState !== 'stopped') {\n        helios.startLayout?.();\n      }\n      sync(false);\n    };\n\n    const refreshStatusBinding = () => {\n      setText(statusTempLabel, statusBinding?.label ?? 'Temp.');\n      setDisplayIfChanged(statusVisual, statusBinding ? '' : 'none');\n      resetStatusHistory();\n    };\n\n    const sampleStatusBinding = (now) => {\n      if (!statusBinding?.history) return;\n      const sampleMs = Math.max(250, Number(statusBinding.history.sampleMs ?? 1000) || 1000);\n      if (now - lastStatusSampleAt < sampleMs) return;\n      const nextValue = Number(statusBinding.get?.());\n      if (!Number.isFinite(nextValue)) return;\n      lastStatusSampleAt = now;\n      statusHistory.push(nextValue);\n      const limit = Math.max(2, Math.floor(statusBinding.history.length ?? 20));\n      while (statusHistory.length > limit) statusHistory.shift();\n      const scale = statusBinding.history.scale === 'log' ? 'log' : 'linear';\n      const bounds = statusBinding.history ?? null;\n      const d = buildSparklinePath(statusHistory, 120, 24, scale, bounds);\n      statusSparklinePath.setAttribute('d', d || '');\n    };\n\n    const addBindingRow = (binding) => {\n      let controls = null;\n      let rowClass = null;\n      let refresh = () => {};\n      let sample = null;\n      let destroy = () => {};\n      let dirtyIndicator = null;\n      const parameterPath = binding.key ? `layout.parameters.${binding.key}` : null;\n      const createParameterIndicator = () => (parameterPath\n        ? createStateIndicator(parameterPath, 'layout.parameters', { defaultValue: binding.get?.() })\n        : null);\n      if (parameterPath) registerLayoutParameterEntry(binding);\n\n      if (binding.type === 'display') {\n        const wrap = document.createElement('div');\n        wrap.className = 'helios-ui-layout__display-stack';\n        if (binding.history) {\n          const sparkline = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n          sparkline.setAttribute('viewBox', '0 0 120 28');\n          sparkline.setAttribute('preserveAspectRatio', 'none');\n          sparkline.classList.add('helios-ui-layout__sparkline');\n\n          const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n          path.setAttribute('fill', 'none');\n          path.setAttribute('vector-effect', 'non-scaling-stroke');\n          sparkline.appendChild(path);\n\n          const history = [];\n          const limit = Math.max(2, Math.floor(binding.history.length ?? 20));\n          const scale = binding.history.scale === 'log' ? 'log' : 'linear';\n          const bounds = binding.history ?? null;\n\n          const renderHistory = () => {\n            const d = buildSparklinePath(history, 120, 28, scale, bounds);\n            path.setAttribute('d', d || '');\n          };\n\n          sample = (now) => {\n            const sampleMs = Math.max(250, Number(binding.history.sampleMs ?? 1000) || 1000);\n            const lastAt = sample?._lastAt ?? -Infinity;\n            if (now - lastAt < sampleMs) return;\n            const nextValue = binding.get?.();\n            if (!Number.isFinite(Number(nextValue))) return;\n            sample._lastAt = now;\n            history.push(Number(nextValue));\n            while (history.length > limit) history.shift();\n            renderHistory();\n          };\n\n          const initialValue = Number(binding.get?.());\n          if (Number.isFinite(initialValue)) {\n            history.push(initialValue);\n            sample._lastAt = performance.now();\n            renderHistory();\n          }\n\n          wrap.appendChild(sparkline);\n          controls = wrap;\n          refresh = () => {};\n        } else {\n          const display = document.createElement('div');\n          display.className = 'helios-ui-layout__display';\n          wrap.appendChild(display);\n          controls = wrap;\n          refresh = () => {\n            setText(display, formatBindingValue(binding, binding.get?.()));\n          };\n        }\n      } else if (binding.type === 'boolean') {\n        dirtyIndicator = createParameterIndicator();\n        const label = bindingLabel(binding);\n        const toggle = createToggleControl({\n          checked: Boolean(binding.get?.()),\n          onLabel: 'On',\n          offLabel: 'Off',\n          ariaLabel: label,\n        });\n        toggle.addEventListener('change', () => {\n          commitBindingValue(binding, toggle.checked);\n        });\n        controls = toggle;\n        refresh = () => {\n          if (document.activeElement === toggle) return;\n          toggle.checked = Boolean(binding.get?.());\n        };\n      } else if (binding.type === 'select') {\n        dirtyIndicator = createParameterIndicator();\n        const select = document.createElement('select');\n        select.className = 'helios-ui-select';\n        select.setAttribute('aria-label', bindingLabel(binding));\n        for (const entry of binding.options ?? []) {\n          const option = document.createElement('option');\n          option.value = String(entry.value);\n          option.textContent = entry.label ?? String(entry.value);\n          select.appendChild(option);\n        }\n        select.addEventListener('change', () => {\n          commitBindingValue(binding, select.value);\n        });\n        controls = select;\n        refresh = () => {\n          if (document.activeElement === select) return;\n          const nextValue = String(binding.get?.() ?? '');\n          if (select.value !== nextValue) select.value = nextValue;\n        };\n      } else {\n        dirtyIndicator = createParameterIndicator();\n        const wrap = document.createElement('div');\n        const sliderMin = resolveFiniteBound(binding.sliderMin, binding.min);\n        const sliderMax = resolveFiniteBound(binding.sliderMax, binding.max);\n        const inputMin = resolveFiniteBound(binding.inputMin, binding.min);\n        const inputMax = resolveFiniteBound(binding.inputMax, binding.max);\n        const hasRange = Number.isFinite(sliderMin) && Number.isFinite(sliderMax);\n        if (hasRange) {\n          rowClass = 'helios-ui-row--slider';\n          if (usesLogScale(binding)) {\n            const logControls = new LogSliderControls({\n              value: binding.get?.(),\n              minExp: Math.log10(Math.max(1e-12, sliderMin)),\n              maxExp: Math.log10(Math.max(1e-12, sliderMax)),\n              stepExp: binding.sliderStep ?? 0.01,\n              minValue: sliderMin,\n              maxValue: sliderMax,\n              inputMin,\n              inputMax,\n              format: (next) => formatInputNumber(next, binding),\n              onCommit: (next) => {\n                const clamped = clampNumber(next, inputMin, inputMax);\n                if (clamped == null) return;\n                commitBindingValue(binding, clamped);\n              },\n            });\n            controls = logControls.element;\n            destroy = () => logControls.destroy();\n            refresh = () => {\n              const next = toFinite(binding.get?.());\n              if (next == null) return;\n              if (document.activeElement !== logControls.slider && document.activeElement !== logControls.input) {\n                logControls.setValue(next);\n              }\n            };\n          } else {\n            const linearControls = new SuggestedSliderControls({\n              value: binding.get?.(),\n              suggested: [sliderMin, sliderMax],\n              step: binding.step ?? 0.01,\n              inputMin,\n              inputMax,\n              onCommit: (next) => {\n                const clamped = clampNumber(next, inputMin, inputMax);\n                if (clamped == null) return;\n                commitBindingValue(binding, clamped);\n              },\n            });\n            linearControls.input.inputMode = 'decimal';\n            linearControls.input.step = String(binding.inputStep ?? (binding.step ?? 0.01));\n            controls = linearControls.element;\n            destroy = () => linearControls.destroy();\n            refresh = () => {\n              const next = toFinite(binding.get?.());\n              if (next == null) return;\n              if (document.activeElement !== linearControls.slider && document.activeElement !== linearControls.input) {\n                linearControls.set(next);\n              }\n            };\n          }\n        } else {\n          const input = document.createElement('input');\n          input.type = 'number';\n          input.inputMode = 'decimal';\n          input.className = 'helios-ui-number';\n          input.step = String(binding.inputStep ?? (binding.notation === 'scientific' ? 'any' : (binding.step ?? 0.01)));\n          input.addEventListener('change', () => {\n            const committed = clampNumber(input.value, binding.min, binding.max);\n            if (committed == null) return;\n            input.value = formatInputNumber(committed, binding);\n            commitBindingValue(binding, committed);\n          });\n          wrap.appendChild(input);\n          controls = wrap;\n          refresh = () => {\n            if (document.activeElement === input) return;\n            input.value = formatInputNumber(binding.get?.(), binding);\n          };\n        }\n      }\n\n      const row = createAlignedRowEl({\n        title: bindingLabel(binding),\n        hint: binding.hint ?? null,\n        controls,\n        dirtyIndicator,\n        rowClass,\n      });\n      bindingsRoot.appendChild(row.row);\n      const previousDestroy = destroy;\n      destroy = () => {\n        previousDestroy?.();\n        dirtyIndicator?.destroy?.();\n      };\n      controlsByKey.set(binding.key, { refresh, sample, destroy });\n      refresh();\n      sample?.(performance.now());\n    };\n\n    const rebuildBindings = () => {\n      const descriptor = getCurrentDescriptor();\n      currentDescriptorKey = descriptor.key;\n      syncLayoutParameterEntries(descriptor);\n      for (const control of controlsByKey.values()) {\n        control.destroy?.();\n      }\n      controlsByKey.clear();\n      bindingsRoot.textContent = '';\n      statusBinding = null;\n      refreshStatusBinding();\n\n      if (!descriptor.bindings?.length) {\n        return;\n      }\n\n      for (const binding of descriptor.bindings) {\n        if (binding?.key === 'alphaCurrent' && binding?.type === 'display' && binding?.history) {\n          statusBinding = binding;\n          refreshStatusBinding();\n          sampleStatusBinding(performance.now());\n          continue;\n        }\n        addBindingRow(binding);\n      }\n    };\n\n    let suppressRunButtonClick = false;\n    const activateRunButton = () => {\n      const descriptor = getCurrentDescriptor();\n      if (descriptor.dynamic !== true) return;\n      const state = layoutBehavior.runState?.() ?? 'stopped';\n      if (state === 'running' || state === 'idle') {\n        layoutBehavior.stop?.('ui:layout-panel');\n      } else {\n        layoutBehavior.reheat?.('ui:layout-panel');\n        layoutBehavior.start?.();\n        selectedPositionAttribute = CURRENT_POSITION_ATTRIBUTE;\n      }\n      persistLayoutValue('layout.running', !(state === 'running' || state === 'idle'), {\n        scope: 'session',\n        debounceMs: 0,\n        reason: 'layout-running',\n      });\n      sync(false);\n    };\n\n    const refreshBindingValues = () => {\n      for (const control of controlsByKey.values()) {\n        control.refresh?.();\n      }\n    };\n\n    const sampleBindingValues = (now) => {\n      sampleStatusBinding(now);\n      for (const control of controlsByKey.values()) {\n        control.sample?.(now);\n      }\n    };\n\n    const sync = (force = false) => {\n      syncLayoutChoices();\n      syncPositionChoices();\n      const descriptor = getCurrentDescriptor();\n      if (force || descriptor.key !== currentDescriptorKey) {\n        rebuildBindings();\n      }\n      refreshBindingValues();\n      refreshRunState();\n      refreshPauseOnInteraction();\n    };\n\n    const applySelectedPositionAttribute = () => {\n      layoutBehavior.positionAttribute?.(selectedPositionAttribute);\n      const didSet = layoutBehavior.applyPositionAttribute?.(selectedPositionAttribute);\n      if (!didSet) {\n        sync(false);\n        return;\n      }\n      const descriptor = getCurrentDescriptor();\n      const layoutState = layoutBehavior.runState?.() ?? 'stopped';\n      if (descriptor.dynamic === true && layoutState !== 'stopped') {\n        selectedPositionAttribute = CURRENT_POSITION_ATTRIBUTE;\n      }\n      sync(false);\n    };\n\n    positionAttributeSelect.addEventListener('change', () => {\n      selectedPositionAttribute = positionAttributeSelect.value || CURRENT_POSITION_ATTRIBUTE;\n      applySelectedPositionAttribute();\n    });\n\n    runButton.addEventListener('pointerup', (event) => {\n      if (runButton.disabled) return;\n      if (event.button != null && event.button !== 0) return;\n      suppressRunButtonClick = true;\n      activateRunButton();\n    });\n\n    runButton.addEventListener('click', () => {\n      if (suppressRunButtonClick) {\n        suppressRunButtonClick = false;\n        return;\n      }\n      activateRunButton();\n    });\n\n    pauseOnInteractionToggle.addEventListener('change', () => {\n      layoutBehavior.pauseOnInteraction?.(pauseOnInteractionToggle.checked);\n      persistLayoutValue('layout.pauseOnInteraction', pauseOnInteractionToggle.checked, {\n        reason: 'layout-pause-on-input',\n      });\n      sync(false);\n    });\n\n    layoutSelect.addEventListener('change', () => {\n      layoutBehavior.type?.(layoutSelect.value);\n      persistLayoutValue('layout.layoutType', layoutSelect.value, {\n        reason: 'layout-type',\n      });\n      if (layoutSelect.value === 'static') {\n        layoutBehavior.stop?.('ui:layout-panel');\n        persistLayoutValue('layout.running', false, {\n          scope: 'session',\n          debounceMs: 0,\n          reason: 'layout-running',\n        });\n      } else if ((layoutBehavior.runState?.() ?? 'stopped') !== 'stopped') {\n        selectedPositionAttribute = CURRENT_POSITION_ATTRIBUTE;\n      }\n      sync(false);\n    });\n\n    const unsubscribers = [\n      // Binding updates and run-state changes should refresh values in place.\n      // Rebuilding controls during an active drag breaks native range interaction.\n      layoutBehavior.on?.('change', (event) => {\n        const reason = event?.reason;\n        sync(reason === 'restore' || reason === 'type');\n      }) ?? (() => {}),\n      subscribe(helios, EVENTS.LAYOUT_CHANGED, () => sync(true)),\n      subscribe(helios, EVENTS.LAYOUT_START, () => {\n        selectedPositionAttribute = CURRENT_POSITION_ATTRIBUTE;\n        sync(false);\n      }),\n      subscribe(helios, EVENTS.LAYOUT_STOP, () => refreshRunState()),\n      subscribe(helios, EVENTS.NETWORK_REPLACED, () => sync(true)),\n    ];\n\n    const refreshMs = Math.max(150, Number(this.options.refreshMs ?? 400) || 400);\n    const refreshTimer = window.setInterval(() => sync(false), refreshMs);\n    const sampleTimer = window.setInterval(() => sampleBindingValues(performance.now()), 1000);\n\n    sync(true);\n\n    const originalDestroy = panel.destroy?.bind(panel);\n    if (originalDestroy) {\n      panel.destroy = () => {\n        window.clearInterval(refreshTimer);\n        window.clearInterval(sampleTimer);\n        for (const unsubscribe of unsubscribers) unsubscribe?.();\n        for (const control of controlsByKey.values()) {\n          control.destroy?.();\n        }\n        controlsByKey.clear();\n        for (const cleanup of parameterEntryCleanups.values()) cleanup?.();\n        parameterEntryCleanups.clear();\n        for (const cleanup of staticIndicatorCleanups) cleanup?.();\n        staticIndicatorCleanups.clear();\n        originalDestroy();\n      };\n    }\n\n    return panel;\n  }\n}\n\nexport default LayoutPanel;\n","import { createAlignedRowEl } from '../controls/createAlignedRowEl.js';\nimport { createToggleControl } from '../controls/createToggleControl.js';\nimport { createTooltipManager } from '../controls/createTooltipManager.js';\nimport { SuggestedSliderControls } from '../controls/SuggestedSliderControls.js';\nimport { LEGENDS_PANEL_SCHEMA, resolvePanelItemLabel } from './panelSchema.js';\n\nfunction toFiniteNumber(value, fallback = null) {\n  if (value == null || `${value}`.trim() === '') return fallback;\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return fallback;\n  return numeric;\n}\n\nconst LEGEND_CONTROL_HINTS = Object.freeze({\n  'legends.enabled': 'Enable or disable the SVG legends overlay.',\n  'legends.respectDockInsets': 'Keep legends inside the usable viewport when side panels are docked.',\n  'legends.showNodeColor': 'Show node colormap or categorical color legends.',\n  'legends.showDensity': 'Show the density legend when density mode is active.',\n  'legends.showEdgeColor': 'Show edge color legends when edges are not node-color passthrough.',\n  'legends.showNodeSize': 'Show visual cues for legendable node size mappings.',\n  'legends.showEdgeWidth': 'Show visual cues for legendable edge width mappings.',\n  'legends.maxChars': 'Maximum characters per categorical legend row. Zero disables truncation.',\n  'legends.maxRows': 'Maximum wrapped rows for categorical legend text.',\n  'legends.scale': 'Scale the overall legend layout proportionally.',\n  'legends.continuousHeight': 'Height of continuous colormap legends.',\n});\n\nfunction normalizeSchemaItem(item) {\n  if (typeof item === 'string') return { key: item };\n  if (!item || typeof item !== 'object') return null;\n  if (item.type === 'custom') return null;\n  if (typeof item.key === 'string') return item;\n  return null;\n}\n\nexport class LegendsPanel {\n  constructor(ui, options = {}) {\n    this.ui = ui;\n    this.options = options;\n  }\n\n  create() {\n    const helios = this.ui.helios ?? null;\n    const content = document.createElement('div');\n    this.ui._lastLegendsPanel = this;\n    const legendsBehavior = helios?.behavior?.legends ?? helios?.useBehavior?.('legends');\n    this.legendsBehavior = legendsBehavior ?? null;\n    this.state = legendsBehavior?.state ?? null;\n    if (!helios || !legendsBehavior || typeof legendsBehavior.legends !== 'function') {\n      const placeholder = document.createElement('div');\n      placeholder.textContent = 'Legends controls require LegendsBehavior.';\n      content.appendChild(placeholder);\n      return this.ui.createPanel({\n        id: this.options.id ?? 'helios-ui-legends',\n        title: this.options.title ?? 'Legends',\n        position: this.options.position ?? { x: 16, y: 520 },\n        dock: this.options.dock ?? 'top-right',\n        content,\n      });\n    }\n\n    const tooltips = createTooltipManager();\n    const stateManager = helios?.states ?? helios?.storage ?? null;\n    const createIndicator = (path) => this.ui.createStateIndicator?.(path, 'legends', {\n      register: false,\n    }) ?? null;\n    const createRow = ({ title, hint, controls, persistencePath = null }) => {\n      const built = createAlignedRowEl({\n        title,\n        hint,\n        controls,\n        dirtyIndicator: persistencePath ? createIndicator(persistencePath) : undefined,\n        attachTooltip: tooltips.attachTooltip,\n      });\n      content.appendChild(built.row);\n      return built;\n    };\n    const valueForKey = (key, fallback = null) => {\n      const entry = stateManager?.entry?.(key) ?? null;\n      const value = stateManager?.get?.(key, undefined);\n      return value === undefined ? (entry?.default ?? fallback) : value;\n    };\n    const writeKey = (key, value) => {\n      if (typeof stateManager?.set === 'function') {\n        stateManager.set(key, value, {\n          source: 'ui',\n          reason: `legends:${String(key).split('.').pop() ?? 'control'}`,\n          journal: false,\n        });\n        return;\n      }\n      const prop = String(key).split('.').pop();\n      if (prop) legendsBehavior.legends({ [prop]: value });\n    };\n    const subscribeKey = (key, sync) => {\n      const unsubscribeStorage = stateManager?.subscribe?.(key, (value) => sync(value)) ?? null;\n      if (typeof unsubscribeStorage === 'function') return unsubscribeStorage;\n      return legendsBehavior.on?.('change', () => sync(valueForKey(key))) ?? (() => {});\n    };\n    const createToggleFromSchema = (item) => {\n      const key = item.key;\n      const entry = stateManager?.entry?.(key) ?? null;\n      const label = resolvePanelItemLabel(item, stateManager);\n      const toggle = createToggleControl({\n        checked: Boolean(valueForKey(key, entry?.default ?? false)),\n        ariaLabel: label,\n      });\n      const sync = (value) => {\n        toggle.checked = Boolean(value);\n      };\n      const unsubscribe = subscribeKey(key, sync);\n      toggle.addEventListener('change', () => writeKey(key, toggle.checked));\n      createRow({\n        title: label,\n        hint: item.hint ?? LEGEND_CONTROL_HINTS[key] ?? entry?.description ?? null,\n        controls: toggle,\n        persistencePath: key,\n      });\n      this.ui._controlCleanups.add(() => unsubscribe());\n    };\n    const createNumberFromSchema = (item) => {\n      const key = item.key;\n      const entry = stateManager?.entry?.(key) ?? null;\n      const label = resolvePanelItemLabel(item, stateManager);\n      const ui = entry?.ui ?? {};\n      const min = item.inputMin ?? ui.inputMin ?? ui.min ?? 0;\n      const max = item.inputMax ?? ui.inputMax ?? ui.max ?? 1;\n      const suggested = item.suggested ?? [\n        item.suggestedMin ?? ui.suggestedMin ?? ui.min ?? min,\n        item.suggestedMax ?? ui.suggestedMax ?? ui.max ?? max,\n      ];\n      const controls = new SuggestedSliderControls({\n        value: valueForKey(key, entry?.default ?? 0),\n        suggested,\n        step: item.step ?? ui.step ?? 1,\n        inputMin: min,\n        inputMax: max,\n        onCommit: (value) => {\n          const numeric = toFiniteNumber(value, null);\n          if (numeric == null) return;\n          writeKey(key, numeric);\n        },\n      });\n      const unsubscribe = subscribeKey(key, (value) => {\n        const numeric = toFiniteNumber(value, null);\n        if (numeric != null) controls.set(numeric);\n      });\n      createRow({\n        title: label,\n        hint: item.hint ?? LEGEND_CONTROL_HINTS[key] ?? entry?.description ?? null,\n        controls: controls.element,\n        persistencePath: key,\n      });\n      this.ui._controlCleanups.add(() => {\n        unsubscribe();\n        controls.destroy();\n      });\n    };\n    const createControlFromSchema = (item) => {\n      const normalized = normalizeSchemaItem(item);\n      if (!normalized) return;\n      const entry = stateManager?.entry?.(normalized.key) ?? null;\n      const controller = normalized.controller ?? entry?.ui?.controller ?? entry?.type;\n      if (controller === 'toggle' || entry?.type === 'boolean') {\n        createToggleFromSchema(normalized);\n      } else if (controller === 'slider' || entry?.type === 'number') {\n        createNumberFromSchema(normalized);\n      }\n    };\n\n    for (const section of LEGENDS_PANEL_SCHEMA.sections) {\n      for (const item of section.items) createControlFromSchema(item);\n    }\n\n    this.ui._controlCleanups.add(() => tooltips.destroy());\n\n    return this.ui.createPanel({\n      id: this.options.id ?? 'helios-ui-legends',\n      title: this.options.title ?? 'Legends',\n      position: this.options.position ?? { x: 16, y: 520 },\n      dock: this.options.dock ?? 'top-right',\n      panelSchema: LEGENDS_PANEL_SCHEMA,\n      content,\n    });\n  }\n}\n\nexport default LegendsPanel;\n","import { EVENTS } from '../../Helios.js';\nimport { createAlignedRowEl } from '../controls/createAlignedRowEl.js';\nimport { createToggleControl } from '../controls/createToggleControl.js';\nimport { createTooltipManager } from '../controls/createTooltipManager.js';\nimport { SuggestedSliderControls } from '../controls/SuggestedSliderControls.js';\nimport { createSelectControl } from '../controls/createSelectControl.js';\nimport { createLightDirectionControl } from '../controls/LightDirectionControl.js';\nimport { PanelStack } from './PanelStack.js';\n\nconst AUTO_FIT_FREQUENCY_MIN = 1;\nconst AUTO_FIT_FREQUENCY_MAX = 10;\nconst AUTO_FIT_INTERVAL_MIN_MS = 100;\nconst AUTO_FIT_INTERVAL_MAX_MS = 5000;\nconst CAMERA_MOVE_SYNC_INTERVAL_MS = 240;\n\nfunction subscribe(helios, eventName, handler) {\n  if (!helios || typeof handler !== 'function') return () => {};\n  if (typeof helios.on === 'function') {\n    return helios.on(eventName, handler) ?? (() => {});\n  }\n  if (typeof helios.addEventListener === 'function') {\n    helios.addEventListener(eventName, handler);\n    return () => helios.removeEventListener(eventName, handler);\n  }\n  return () => {};\n}\n\nexport function createTrailingThrottle(callback, delayMs = 0) {\n  let timerId = null;\n  let lastArgs = null;\n  let lastThis = null;\n\n  const invoke = () => {\n    timerId = null;\n    if (!lastArgs) return;\n    const args = lastArgs;\n    const context = lastThis;\n    lastArgs = null;\n    lastThis = null;\n    callback.apply(context, args);\n  };\n\n  const throttled = function throttled(...args) {\n    lastArgs = args;\n    lastThis = this;\n    if (timerId != null) return;\n    timerId = setTimeout(invoke, Math.max(0, delayMs));\n  };\n\n  throttled.flush = () => {\n    if (timerId != null) {\n      clearTimeout(timerId);\n      timerId = null;\n    }\n    invoke();\n  };\n\n  throttled.cancel = () => {\n    if (timerId != null) {\n      clearTimeout(timerId);\n      timerId = null;\n    }\n    lastArgs = null;\n    lastThis = null;\n  };\n\n  return throttled;\n}\n\nfunction clampNumber(value, min, max, fallback) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return fallback;\n  return Math.max(min, Math.min(max, numeric));\n}\n\nfunction normalizeDirection(value, fallback = [0, 1, 0]) {\n  const source = Array.isArray(value) || ArrayBuffer.isView(value) ? value : fallback;\n  const x = Number(source?.[0]);\n  const y = Number(source?.[1]);\n  const z = Number(source?.[2]);\n  const length = Math.hypot(x, y, z);\n  if (!Number.isFinite(length) || length <= 1e-6) return Array.from(fallback);\n  return [x / length, y / length, z / length];\n}\n\nfunction resolveCameraBasis(helios) {\n  const camera = helios?.renderer?.camera ?? null;\n  camera?.updateBasis?.();\n  const right = normalizeDirection(camera?.right, [1, 0, 0]);\n  const up = normalizeDirection(camera?.up, [0, 1, 0]);\n  const forward = normalizeDirection(camera?.forward, [0, 0, -1]);\n  return { right, up, forward };\n}\n\nfunction orbitAxisViewToWorld(helios, viewAxis, basis = resolveCameraBasis(helios)) {\n  const axis = normalizeDirection(viewAxis, [0, 1, 0]);\n  const { right, up, forward } = basis;\n  return normalizeDirection([\n    (axis[0] * right[0]) + (axis[1] * up[0]) - (axis[2] * forward[0]),\n    (axis[0] * right[1]) + (axis[1] * up[1]) - (axis[2] * forward[1]),\n    (axis[0] * right[2]) + (axis[1] * up[2]) - (axis[2] * forward[2]),\n  ]);\n}\n\nfunction updateSliderBounds(controls, min, max, step = null) {\n  if (!controls?.slider || !controls?.input) return;\n  controls.slider.min = String(min);\n  controls.slider.max = String(max);\n  if (step != null) {\n    controls.slider.step = String(step);\n    controls.input.step = String(step);\n  }\n  controls.input.min = String(min);\n  controls.input.max = String(max);\n}\n\nfunction frequencyToIntervalMs(value) {\n  const numeric = clampNumber(value, AUTO_FIT_FREQUENCY_MIN, AUTO_FIT_FREQUENCY_MAX, 5);\n  const t = (numeric - AUTO_FIT_FREQUENCY_MIN) / (AUTO_FIT_FREQUENCY_MAX - AUTO_FIT_FREQUENCY_MIN);\n  const minLog = Math.log(AUTO_FIT_INTERVAL_MIN_MS);\n  const maxLog = Math.log(AUTO_FIT_INTERVAL_MAX_MS);\n  return Math.round(Math.exp(maxLog + ((minLog - maxLog) * t)));\n}\n\nfunction intervalMsToFrequency(value) {\n  const numeric = clampNumber(value, AUTO_FIT_INTERVAL_MIN_MS, AUTO_FIT_INTERVAL_MAX_MS, 900);\n  const minLog = Math.log(AUTO_FIT_INTERVAL_MIN_MS);\n  const maxLog = Math.log(AUTO_FIT_INTERVAL_MAX_MS);\n  const t = (Math.log(numeric) - maxLog) / (minLog - maxLog);\n  return AUTO_FIT_FREQUENCY_MIN + (clampNumber(t, 0, 1, 0) * (AUTO_FIT_FREQUENCY_MAX - AUTO_FIT_FREQUENCY_MIN));\n}\n\nfunction createRowAppender(container, tooltipManager) {\n  return ({ title, hint, controls }) => {\n    const { row } = createAlignedRowEl({\n      title,\n      hint,\n      controls,\n      attachTooltip: tooltipManager.attachTooltip,\n    });\n    container.appendChild(row);\n    return row;\n  };\n}\n\nexport class CameraPanel {\n  constructor(ui, options = {}) {\n    this.ui = ui;\n    this.options = options;\n  }\n\n  create() {\n    const helios = this.ui.helios ?? null;\n    const content = document.createElement('div');\n    if (!helios) {\n      const placeholder = document.createElement('div');\n      placeholder.textContent = this.options.placeholder ?? 'Camera controls require a Helios instance.';\n      content.appendChild(placeholder);\n      return this.ui.createPanel({\n        id: this.options.id ?? 'helios-ui-camera',\n        title: this.options.title ?? 'Camera',\n        position: this.options.position ?? { x: 16, y: 760 },\n        dock: this.options.dock ?? 'top-right',\n        collapsed: this.options.collapsed ?? true,\n        content,\n      });\n    }\n\n    const tooltipManager = createTooltipManager();\n    const appendTopRow = createRowAppender(content, tooltipManager);\n    const persistCameraControl = (patch = {}) => {\n      const current = helios.cameraControls?.() ?? {};\n      for (const [key, value] of Object.entries(patch)) {\n        const path = `camera.controls.${key}`;\n        this.ui._registerStateKey?.(path, {\n          scope: 'network',\n          debounceMs: 500,\n          defaultValue: current[key],\n          metadata: { panel: 'camera', control: key },\n        });\n        this.ui._writeStateValue?.(path, value, {\n          scope: 'network',\n          source: 'ui',\n          reason: 'camera-control',\n          debounceMs: 500,\n        });\n      }\n    };\n    const shouldTrackCameraPoseOverride = (detail = null) => {\n      const origin = String(detail?.origin ?? detail?.change?.origin ?? '').trim();\n      return origin === 'ui' || origin === 'interaction' || origin === 'cli' || origin === 'program';\n    };\n    const persistCameraPose = (pose = helios.cameraPose?.() ?? null, options = {}) => {\n      if (!pose || typeof pose !== 'object') return;\n      this.ui._registerStateKey?.('camera.pose', {\n        scope: 'network',\n        debounceMs: 750,\n        defaultValue: pose,\n        metadata: { panel: 'camera' },\n      });\n      this.ui._writeStateValue?.('camera.pose', pose, {\n        scope: 'network',\n        source: 'ui',\n        reason: 'camera-pose',\n        debounceMs: 750,\n        trackOverride: options.trackOverride === true,\n      });\n    };\n\n    const distanceControls = new SuggestedSliderControls({\n      value: 1,\n      suggested: [0.001, 10],\n      step: 0.001,\n      onCommit: (value) => {\n        const pose = helios.cameraPose?.() ?? null;\n        if (!pose) return;\n        const numeric = Number(value);\n        if (!Number.isFinite(numeric)) return;\n        if (pose.mode === '3d') {\n          helios.setCameraPose({ distance: numeric }, { source: 'ui' });\n        } else {\n          helios.setCameraPose({ zoom: numeric }, { source: 'ui' });\n        }\n        persistCameraPose(null, { trackOverride: true });\n      },\n    });\n    const distanceRow = appendTopRow({\n      title: 'Distance',\n      hint: 'Direct camera zoom in 2D, or camera distance in 3D.',\n      controls: distanceControls.element,\n    });\n\n    const sectionStack = new PanelStack();\n    sectionStack.element.style.marginTop = '6px';\n\n    const autoFitToggle = createToggleControl({\n      checked: true,\n      onLabel: 'On',\n      offLabel: 'Off',\n      ariaLabel: 'Auto fit',\n      });\n      autoFitToggle.addEventListener('change', () => {\n        const patch = { autoFit: autoFitToggle.checked };\n        helios.cameraControls?.(patch);\n        persistCameraControl(patch);\n      });\n    const autoFitBody = document.createElement('div');\n    const appendAutoFitRow = createRowAppender(autoFitBody, tooltipManager);\n\n    const intervalControls = new SuggestedSliderControls({\n      value: intervalMsToFrequency(900),\n      suggested: [AUTO_FIT_FREQUENCY_MIN, AUTO_FIT_FREQUENCY_MAX],\n      step: 0.1,\n      inputMin: AUTO_FIT_FREQUENCY_MIN,\n        inputMax: AUTO_FIT_FREQUENCY_MAX,\n        onCommit: (value) => {\n          const patch = { autoFitIntervalMs: frequencyToIntervalMs(value) };\n          helios.cameraControls?.(patch);\n          persistCameraControl(patch);\n        },\n      });\n    appendAutoFitRow({\n      title: 'Update Freq',\n      hint: 'Higher values update auto-fit more often. Large networks still adapt downward automatically.',\n      controls: intervalControls.element,\n    });\n\n    const fitButton = document.createElement('button');\n    fitButton.type = 'button';\n    fitButton.className = 'helios-ui-button';\n    fitButton.textContent = 'Fit camera';\n    fitButton.addEventListener('click', () => {\n      const controls = helios.cameraControls?.() ?? {};\n      const targetNodeIndices = helios.cameraTargetNodes?.() ?? [];\n      helios.requestFrameNetwork?.({\n        nodeIndices: targetNodeIndices.length ? targetNodeIndices : undefined,\n        coverage: controls.autoFitCoverage,\n        paddingRatio: controls.autoFitPaddingRatio,\n        maxSamples: controls.autoFitMaxSamples,\n        animate: controls.animation === true,\n        durationMs: controls.animationDurationMs,\n        resetOrientation: false,\n        focusMode: targetNodeIndices.length ? 'centroid' : 'bbox',\n      });\n    });\n    appendAutoFitRow({\n      title: 'Fit',\n      hint: 'Forces an immediate fit using the current auto-fit sampling settings.',\n      controls: fitButton,\n    });\n\n    sectionStack.add({\n      id: 'camera-auto-fit',\n      title: 'Auto Fit',\n      collapsed: true,\n      statusDot: false,\n      headerControls: autoFitToggle,\n      content: autoFitBody,\n    });\n\n    const animationToggle = createToggleControl({\n      checked: true,\n      onLabel: 'On',\n      offLabel: 'Off',\n      ariaLabel: 'Camera animation',\n      });\n      animationToggle.addEventListener('change', () => {\n        const patch = { animation: animationToggle.checked };\n        helios.cameraControls?.(patch);\n        persistCameraControl(patch);\n      });\n    const animationBody = document.createElement('div');\n    const appendAnimationRow = createRowAppender(animationBody, tooltipManager);\n\n    const durationControls = new SuggestedSliderControls({\n      value: 280,\n      suggested: [0, 2000],\n      step: 20,\n        inputMin: 0,\n        inputMax: 60000,\n        onCommit: (value) => {\n          const patch = { animationDurationMs: clampNumber(value, 0, 60000, 520) };\n          helios.cameraControls?.(patch);\n          persistCameraControl(patch);\n        },\n      });\n    appendAnimationRow({\n      title: 'Duration',\n      hint: 'Transition duration for fit and focus changes when animation is enabled.',\n      controls: durationControls.element,\n    });\n\n    sectionStack.add({\n      id: 'camera-animation',\n      title: 'Animation',\n      collapsed: true,\n      statusDot: false,\n      headerControls: animationToggle,\n      content: animationBody,\n    });\n\n    const orbitToggle = createToggleControl({\n      checked: false,\n      onLabel: 'On',\n      offLabel: 'Off',\n      ariaLabel: 'Orbit target',\n    });\n    const orbitBody = document.createElement('div');\n    const appendOrbitRow = createRowAppender(orbitBody, tooltipManager);\n\n    const orbitSpeedControls = new SuggestedSliderControls({\n      value: 0.08,\n      suggested: [0, 0.5],\n      step: 0.01,\n      inputMin: 0,\n      inputMax: 10,\n      onCommit: (value) => {\n        const patch = { orbitSpeed: clampNumber(value, 0, 10, 0.08) };\n        helios.cameraControls?.(patch);\n        persistCameraControl(patch);\n      },\n    });\n    appendOrbitRow({\n      title: 'Orbit Speed',\n      hint: 'Orbit speed in rotations per second.',\n      controls: orbitSpeedControls.element,\n    });\n\n    let orbitAxisView = [0, 1, 0];\n    let orbitAxisReferenceBasis = resolveCameraBasis(helios);\n    let lastOrbitEnabled = false;\n    const commitOrbitAxis = (basis = resolveCameraBasis(helios)) => {\n      orbitAxisReferenceBasis = basis;\n      const patch = { orbitAxis: orbitAxisViewToWorld(helios, orbitAxisView, basis) };\n      helios.cameraControls?.(patch);\n      persistCameraControl(patch);\n    };\n    orbitToggle.addEventListener('change', () => {\n      if (orbitToggle.checked) {\n        orbitAxisReferenceBasis = resolveCameraBasis(helios);\n        const patch = {\n          orbit: true,\n          orbitAxis: orbitAxisViewToWorld(helios, orbitAxisView, orbitAxisReferenceBasis),\n        };\n        helios.cameraControls?.(patch);\n        persistCameraControl(patch);\n      } else {\n        const patch = { orbit: false };\n        helios.cameraControls?.(patch);\n        persistCameraControl(patch);\n      }\n    });\n    const orbitAxisAttribute = {\n      readOnly: false,\n      value: () => orbitAxisView,\n      write: (value) => {\n        orbitAxisView = normalizeDirection(value, orbitAxisView);\n        commitOrbitAxis(resolveCameraBasis(helios));\n      },\n    };\n    const orbitAxisControl = createLightDirectionControl(orbitAxisAttribute, {\n      mode: 'axis',\n      ariaLabel: 'Orbit axis',\n      testId: 'controls-camera-orbit-axis',\n      fieldTestIdPrefix: 'controls-camera-orbit-axis',\n    });\n    appendOrbitRow({\n      title: 'Orbit Axis',\n      hint: 'Axis used for 3D camera orbit. Drag either end of the axis or edit the vector fields directly.',\n      controls: orbitAxisControl.element,\n    });\n\n    const directionSelect = createSelectControl({\n      value: 'cw',\n      compact: true,\n      options: [\n        { value: 'cw', label: 'Clockwise' },\n        { value: 'ccw', label: 'Counter' },\n        ],\n        onChange: (value) => {\n          const patch = { orbitDirection: value === 'ccw' ? -1 : 1 };\n          helios.cameraControls?.(patch);\n          persistCameraControl(patch);\n        },\n      });\n    appendOrbitRow({\n      title: 'Direction',\n      hint: 'Orbit direction around the current target.',\n      controls: directionSelect,\n    });\n\n    sectionStack.add({\n      id: 'camera-orbit',\n      title: 'Orbit',\n      collapsed: true,\n      statusDot: false,\n      headerControls: orbitToggle,\n      content: orbitBody,\n    });\n\n    content.appendChild(sectionStack.element);\n\n    const syncDistanceControl = (poseOverride = null) => {\n      const pose = poseOverride ?? helios.cameraPose?.() ?? null;\n      const camera = helios.renderer?.camera ?? null;\n      const is3D = pose?.mode === '3d';\n\n      const minValue = is3D\n        ? Math.max(0.001, Number(camera?.minDistance ?? (10 / 3)))\n        : Math.max(0.0001, Number(camera?.minZoom ?? (0.001 / 3)));\n      const maxValue = is3D\n        ? Math.max(minValue, Number(camera?.maxDistance ?? 75000))\n        : Math.max(minValue, Number(camera?.maxZoom ?? 30));\n      updateSliderBounds(\n        distanceControls,\n        minValue,\n        maxValue,\n        is3D ? Math.max(0.1, (maxValue - minValue) / 500) : 0.001,\n      );\n      distanceControls.set(is3D ? (pose?.distance ?? minValue) : (pose?.zoom ?? minValue));\n    };\n\n    const syncDistanceControlThrottled = createTrailingThrottle((event) => {\n      const detail = event?.detail ?? event ?? null;\n      const state = detail?.state ?? null;\n      const pose = state\n        ? {\n          mode: state.mode,\n          distance: state.distance,\n          zoom: state.zoom,\n        }\n        : null;\n      syncDistanceControl(pose);\n      persistCameraPose(null, { trackOverride: shouldTrackCameraPoseOverride(detail) });\n    }, CAMERA_MOVE_SYNC_INTERVAL_MS);\n\n    const sync = () => {\n      const pose = helios.cameraPose?.() ?? null;\n      const camera = helios.renderer?.camera ?? null;\n      const controls = helios.cameraControls?.() ?? {};\n      const is3D = pose?.mode === '3d';\n\n      syncDistanceControl(pose);\n\n      const distanceLabel = distanceRow.querySelector('.helios-ui-label__title');\n      if (distanceLabel) distanceLabel.textContent = is3D ? 'Distance' : 'Zoom';\n\n      autoFitToggle.checked = controls.autoFit === true;\n      intervalControls.set(intervalMsToFrequency(controls.autoFitIntervalMs ?? 900));\n\n      animationToggle.checked = controls.animation === true;\n      durationControls.set(controls.animationDurationMs ?? 520);\n\n      const orbitEnabled = controls.orbit === true;\n      if (orbitEnabled && !lastOrbitEnabled) {\n        orbitAxisReferenceBasis = resolveCameraBasis(helios);\n      } else if (!orbitEnabled) {\n        orbitAxisReferenceBasis = resolveCameraBasis(helios);\n      }\n      lastOrbitEnabled = orbitEnabled;\n\n      orbitToggle.checked = controls.orbit === true;\n      orbitSpeedControls.set(controls.orbitSpeed ?? 0.08);\n      orbitAxisControl.set(orbitAxisView);\n      directionSelect.value = Number(controls.orbitDirection) < 0 ? 'ccw' : 'cw';\n\n      const orbitSectionItem = sectionStack._items.get('camera-orbit')?.item ?? null;\n      if (orbitSectionItem) orbitSectionItem.hidden = !is3D;\n    };\n    sync();\n\n    const unsubscribers = [\n      subscribe(helios, EVENTS.CAMERA_MOVE, syncDistanceControlThrottled),\n      subscribe(helios, EVENTS.CAMERA_CONTROL_CHANGE, sync),\n      subscribe(helios, EVENTS.NETWORK_REPLACED, sync),\n      subscribe(helios, EVENTS.GRAPH_FILTER_CHANGED, sync),\n      subscribe(helios, EVENTS.MODE_CHANGED, sync),\n      subscribe(helios, EVENTS.RESIZE, sync),\n    ];\n\n    const panel = this.ui.createPanel({\n      id: this.options.id ?? 'helios-ui-camera',\n      title: this.options.title ?? 'Camera',\n      position: this.options.position ?? { x: 16, y: 760 },\n      dock: this.options.dock ?? 'top-right',\n      collapsed: this.options.collapsed ?? true,\n      content,\n    });\n\n    const originalDestroy = panel.destroy?.bind(panel);\n    panel.destroy = () => {\n      syncDistanceControlThrottled.cancel?.();\n      for (const unsubscribe of unsubscribers) unsubscribe?.();\n      tooltipManager.destroy();\n      sectionStack.destroy();\n      distanceControls.destroy();\n      intervalControls.destroy();\n      durationControls.destroy();\n      orbitSpeedControls.destroy();\n      orbitAxisControl.destroy();\n      originalDestroy?.();\n    };\n\n    return panel;\n  }\n}\n\nexport default CameraPanel;\n","import { AttributeType } from 'helios-network';\nimport { TwoHandleRange } from '../controls/TwoHandleRange.js';\nimport { isPublicAttributeName } from '../utils/attributes.js';\n\nconst FILTER_IDENTIFIER_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst FILTER_RANGE_EPSILON = 1e-9;\n\nfunction warnUiDerivationFailure(message, detail) {\n  if (!import.meta.env?.DEV) return;\n  console.warn(`[AttributeRuleEditor] ${message}`, detail);\n}\n\nfunction isNumericAttributeType(type) {\n  return type === AttributeType.Boolean\n    || type === AttributeType.Float\n    || type === AttributeType.Double\n    || type === AttributeType.Integer\n    || type === AttributeType.UnsignedInteger\n    || type === AttributeType.BigInteger\n    || type === AttributeType.UnsignedBigInteger;\n}\n\nfunction isIntegerAttributeType(type) {\n  return type === AttributeType.Integer\n    || type === AttributeType.UnsignedInteger\n    || type === AttributeType.BigInteger\n    || type === AttributeType.UnsignedBigInteger;\n}\n\nfunction isStringAttributeType(type) {\n  return type === AttributeType.String;\n}\n\nfunction isCategoricalAttributeType(type) {\n  return type === AttributeType.Category;\n}\n\nfunction parseCsvValues(text) {\n  const seen = new Set();\n  const out = [];\n  for (const raw of String(text ?? '').split(',')) {\n    const value = raw.trim();\n    if (!value || seen.has(value)) continue;\n    seen.add(value);\n    out.push(value);\n  }\n  return out;\n}\n\nfunction formatCompactCount(value) {\n  const count = Number(value);\n  if (!Number.isFinite(count) || count < 0) return '';\n  if (count >= 1000000) return `${Number((count / 1000000).toPrecision(3))}M`;\n  if (count >= 1000) return `${Number((count / 1000).toPrecision(3))}k`;\n  return String(Math.floor(count));\n}\n\nfunction suggestHistogramBins(count) {\n  if (!Number.isFinite(count) || count <= 1) return 1;\n  return Math.max(8, Math.min(40, Math.round(Math.sqrt(count))));\n}\n\nfunction buildHistogram(view, min, max, indices) {\n  if (!view || typeof view.length !== 'number' || view.length <= 0) return null;\n  if (!Number.isFinite(min) || !Number.isFinite(max) || max <= min) return null;\n  if (!indices || typeof indices.length !== 'number' || indices.length <= 0) return null;\n  const bins = suggestHistogramBins(indices.length);\n  const counts = new Array(bins).fill(0);\n  const span = max - min;\n  let maxCount = 0;\n  let seen = 0;\n  for (let i = 0; i < indices.length; i += 1) {\n    const idxValue = indices[i];\n    const value = Number(view[idxValue]);\n    if (!Number.isFinite(value)) continue;\n    let idx = Math.floor(((value - min) / span) * bins);\n    if (idx < 0) idx = 0;\n    if (idx >= bins) idx = bins - 1;\n    const next = counts[idx] + 1;\n    counts[idx] = next;\n    if (next > maxCount) maxCount = next;\n    seen += 1;\n  }\n  if (!seen || maxCount <= 0) return null;\n  return { counts, maxCount };\n}\n\nfunction suggestStepFromExtent(extent) {\n  if (!extent) return 0.01;\n  if (extent.isInteger) return 1;\n  const span = Math.abs(Number(extent.max) - Number(extent.min));\n  if (!Number.isFinite(span) || span <= 0) return 0.01;\n  return Math.max(span / 400, 1e-6);\n}\n\nfunction formatRangeInputValue(value, isInteger = false) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return '';\n  if (isInteger) return String(Math.round(numeric));\n  return String(Number(numeric.toPrecision(12)));\n}\n\nfunction clampRangeToExtent(range, extent) {\n  if (!extent) return null;\n  const loRaw = Number(Array.isArray(range) ? range[0] : extent.min);\n  const hiRaw = Number(Array.isArray(range) ? range[1] : extent.max);\n  const lo = Number.isFinite(loRaw) ? Math.max(extent.min, Math.min(extent.max, loRaw)) : extent.min;\n  const hi = Number.isFinite(hiRaw) ? Math.max(extent.min, Math.min(extent.max, hiRaw)) : extent.max;\n  return lo <= hi ? [lo, hi] : [hi, lo];\n}\n\nfunction rangesClose(range, extent) {\n  if (!Array.isArray(range) || !extent) return false;\n  return Math.abs(Number(range[0]) - Number(extent.min)) <= FILTER_RANGE_EPSILON\n    && Math.abs(Number(range[1]) - Number(extent.max)) <= FILTER_RANGE_EPSILON;\n}\n\nfunction createRuleShell(attribute, kindLabel, removeTestId, onRemove) {\n  const row = document.createElement('div');\n  row.style.display = 'grid';\n  row.style.gap = '6px';\n  row.style.padding = '8px';\n  row.style.borderRadius = '10px';\n  row.style.border = '1px solid var(--helios-ui-border)';\n  row.style.background = 'color-mix(in srgb, var(--helios-ui-bg-solid) 88%, transparent)';\n\n  const header = document.createElement('div');\n  header.style.display = 'flex';\n  header.style.alignItems = 'center';\n  header.style.justifyContent = 'space-between';\n  header.style.gap = '8px';\n\n  const label = document.createElement('div');\n  label.textContent = `${attribute} (${kindLabel})`;\n  label.style.fontWeight = '600';\n  label.style.overflowWrap = 'anywhere';\n  header.appendChild(label);\n\n  const removeButton = document.createElement('button');\n  removeButton.type = 'button';\n  removeButton.className = 'helios-ui-button';\n  removeButton.textContent = 'X';\n  if (removeTestId) removeButton.dataset.testid = removeTestId;\n  removeButton.addEventListener('click', onRemove);\n  header.appendChild(removeButton);\n\n  const body = document.createElement('div');\n  body.style.display = 'grid';\n  body.style.gap = '6px';\n\n  row.appendChild(header);\n  row.appendChild(body);\n  return { row, body };\n}\n\nexport function createAttributeRuleEditor(options = {}) {\n  const {\n    helios = null,\n    scope = 'node',\n    addPlaceholder = 'Add filter...',\n    onDirty = null,\n    testIds = {},\n  } = options;\n\n  const element = document.createElement('div');\n  element.style.display = 'grid';\n  element.style.gap = '8px';\n\n  const rulesHost = document.createElement('div');\n  rulesHost.style.display = 'grid';\n  rulesHost.style.gap = '8px';\n  element.appendChild(rulesHost);\n\n  const addSelect = document.createElement('select');\n  addSelect.className = 'helios-ui-select helios-ui-select--compact';\n  addSelect.style.maxWidth = '220px';\n  addSelect.style.minWidth = '160px';\n  if (testIds.addSelect) addSelect.dataset.testid = testIds.addSelect;\n\n  const state = {\n    scope,\n    addSelect,\n    rulesHost,\n    catalog: [],\n    catalogByName: new Map(),\n    rules: new Map(),\n  };\n\n  const markDirty = () => {\n    onDirty?.();\n  };\n\n  const getNetwork = () => helios?.network ?? null;\n\n  const getFilterableAttributes = () => {\n    const network = getNetwork();\n    if (!network) return [];\n    const getNames = scope === 'edge'\n      ? network.getEdgeAttributeNames\n      : network.getNodeAttributeNames;\n    const getInfo = scope === 'edge'\n      ? network.getEdgeAttributeInfo\n      : network.getNodeAttributeInfo;\n    if (typeof getNames !== 'function' || typeof getInfo !== 'function') return [];\n\n    const out = [];\n    const names = getNames.call(network) ?? [];\n    for (const name of names) {\n      if (typeof name !== 'string') continue;\n      if (!isPublicAttributeName(name)) continue;\n      if (!FILTER_IDENTIFIER_RE.test(name)) continue;\n      const info = getInfo.call(network, name);\n      if (!info || info.dimension !== 1) continue;\n      let type = null;\n      let label = '';\n      if (isNumericAttributeType(info.type)) {\n        type = 'numeric';\n        label = 'Numeric';\n      } else if (isStringAttributeType(info.type)) {\n        type = 'string';\n        label = 'String';\n      } else if (isCategoricalAttributeType(info.type)) {\n        type = 'categorical';\n        label = 'Categorical';\n      }\n      if (!type) continue;\n      out.push({ name, type, label });\n    }\n    out.push({ name: '__query__', type: 'query', label: 'Query', displayName: 'Query filter' });\n    out.sort((a, b) => {\n      if (a.type === 'query' && b.type !== 'query') return 1;\n      if (b.type === 'query' && a.type !== 'query') return -1;\n      return a.name.localeCompare(b.name);\n    });\n    return out;\n  };\n\n  const getCategoryEntries = (attributeName) => {\n    const network = getNetwork();\n    if (!network || typeof attributeName !== 'string' || !attributeName) return [];\n    const getter = scope === 'edge'\n      ? network.getEdgeAttributeCategoryDictionary\n      : network.getNodeAttributeCategoryDictionary;\n    if (typeof getter !== 'function') return [];\n    try {\n      const dictionary = getter.call(network, attributeName, { sortById: false }) ?? {};\n      const sourceEntries = Array.isArray(dictionary.entries)\n        ? dictionary.entries\n        : Array.isArray(dictionary.labels)\n          ? dictionary.labels.map((label, index) => ({ id: dictionary.ids?.[index], label }))\n          : [];\n      const countsById = new Map();\n      try {\n        const countValues = () => {\n          const buffer = scope === 'edge'\n            ? network.getEdgeAttributeBuffer?.(attributeName)\n            : network.getNodeAttributeBuffer?.(attributeName);\n          const indices = scope === 'edge' ? network.edgeIndices : network.nodeIndices;\n          const view = buffer?.view ?? null;\n          if (!view || !indices || !indices.length) return;\n          for (let i = 0; i < indices.length; i += 1) {\n            const id = Number(view[indices[i]]);\n            if (!Number.isFinite(id)) continue;\n            countsById.set(id, (countsById.get(id) ?? 0) + 1);\n          }\n        };\n        if (typeof network.withBufferAccess === 'function') network.withBufferAccess(countValues);\n        else countValues();\n      } catch (error) {\n        warnUiDerivationFailure('Categorical count computation failed', { scope, attributeName, error });\n      }\n\n      const seen = new Set();\n      const out = [];\n      for (const raw of sourceEntries) {\n        const label = String(raw?.label ?? raw ?? '').trim();\n        if (!label || seen.has(label)) continue;\n        seen.add(label);\n        const id = Number(raw?.id);\n        out.push({\n          label,\n          id: Number.isFinite(id) ? id : null,\n          count: Number.isFinite(id) ? (countsById.get(id) ?? 0) : null,\n        });\n      }\n      out.sort((a, b) => a.label.localeCompare(b.label));\n      return out;\n    } catch (_) {\n      return [];\n    }\n  };\n\n  const computeNumericExtent = (attributeName) => {\n    const network = getNetwork();\n    if (!network || typeof attributeName !== 'string' || !attributeName) return null;\n    try {\n      const getInfo = scope === 'edge'\n        ? network.getEdgeAttributeInfo\n        : network.getNodeAttributeInfo;\n      const info = typeof getInfo === 'function' ? getInfo.call(network, attributeName) : null;\n      const isInteger = Boolean(info && isIntegerAttributeType(info.type));\n      const read = () => {\n        const buffer = scope === 'edge'\n          ? network.getEdgeAttributeBuffer?.(attributeName)\n          : network.getNodeAttributeBuffer?.(attributeName);\n        const indices = scope === 'edge' ? network.edgeIndices : network.nodeIndices;\n        if (!indices || !indices.length) return null;\n        const view = buffer?.view ?? null;\n        if (!view || !view.length) return null;\n        let min = Infinity;\n        let max = -Infinity;\n        for (let i = 0; i < indices.length; i += 1) {\n          const id = indices[i];\n          const value = Number(view[id]);\n          if (!Number.isFinite(value)) continue;\n          if (value < min) min = value;\n          if (value > max) max = value;\n        }\n        if (!Number.isFinite(min) || !Number.isFinite(max)) return null;\n        if (isInteger) {\n          const minInt = Math.floor(min);\n          const maxInt = Math.ceil(max);\n          if (minInt === maxInt) return { min: minInt, max: minInt + 1, isInteger: true };\n          return { min: minInt, max: maxInt, isInteger: true };\n        }\n        if (min === max) return { min, max: min + 1, isInteger: false };\n        return { min, max, isInteger: false };\n      };\n      if (typeof network.withBufferAccess === 'function') {\n        try {\n          return network.withBufferAccess(read);\n        } catch (error) {\n          warnUiDerivationFailure('Numeric extent computation failed inside buffer access', {\n            scope,\n            attributeName,\n            error,\n          });\n          return null;\n        }\n      }\n      return read();\n    } catch (error) {\n      warnUiDerivationFailure('Numeric extent computation failed', { scope, attributeName, error });\n      return null;\n    }\n  };\n\n  const createRangeHistogram = ({ attributeName, range, extent }) => {\n    const network = getNetwork();\n    if (!network || !extent || !attributeName) return null;\n    let data = null;\n    try {\n      const compute = () => {\n        const getBuffer = scope === 'edge'\n          ? network.getEdgeAttributeBuffer\n          : network.getNodeAttributeBuffer;\n        if (typeof getBuffer !== 'function') return null;\n        const buffer = getBuffer.call(network, attributeName);\n        const indices = scope === 'edge' ? network.edgeIndices : network.nodeIndices;\n        if (!indices || !indices.length) return null;\n        const view = buffer?.view ?? null;\n        if (!view || !view.length) return null;\n        return buildHistogram(view, extent.min, extent.max, indices);\n      };\n      if (typeof network.withBufferAccess === 'function') {\n        try {\n          data = network.withBufferAccess(compute);\n        } catch (error) {\n          warnUiDerivationFailure('Numeric histogram computation failed inside buffer access', {\n            scope,\n            attributeName,\n            error,\n          });\n          data = null;\n        }\n      } else {\n        data = compute();\n      }\n    } catch (error) {\n      warnUiDerivationFailure('Numeric histogram computation failed', { scope, attributeName, error });\n      data = null;\n    }\n    if (!data) return null;\n\n    const histogram = document.createElement('div');\n    histogram.className = 'helios-ui-range2__histogram';\n    for (const count of data.counts) {\n      const bar = document.createElement('div');\n      bar.className = 'helios-ui-range2__histogram-bin';\n      bar.style.height = `${Math.max(1, Math.round((count / data.maxCount) * 100))}%`;\n      histogram.appendChild(bar);\n    }\n\n    const minMarker = document.createElement('div');\n    minMarker.className = 'helios-ui-range2__histogram-marker';\n    const maxMarker = document.createElement('div');\n    maxMarker.className = 'helios-ui-range2__histogram-marker';\n    histogram.appendChild(minMarker);\n    histogram.appendChild(maxMarker);\n\n    const setMarkers = (lo, hi) => {\n      const span = extent.max - extent.min;\n      const toPct = (value) => {\n        if (span === 0) return 0;\n        const raw = (value - extent.min) / span;\n        return Math.max(0, Math.min(1, raw));\n      };\n      const toLeft = (pct) =>\n        `calc(${pct} * (100% - var(--helios-ui-range2-thumb)) + (var(--helios-ui-range2-thumb) / 2))`;\n      minMarker.style.left = toLeft(toPct(lo));\n      maxMarker.style.left = toLeft(toPct(hi));\n    };\n\n    setMarkers(Number(range?.[0] ?? extent.min), Number(range?.[1] ?? extent.max));\n    return { element: histogram, setMarkers };\n  };\n\n  const refreshAttributeSelect = () => {\n    const previous = String(addSelect.value ?? '').trim();\n    addSelect.replaceChildren();\n    const none = document.createElement('option');\n    none.value = '';\n    none.textContent = addPlaceholder;\n    addSelect.appendChild(none);\n\n    const available = state.catalog.filter((entry) => !state.rules.has(entry.name));\n    for (const entry of available) {\n      const option = document.createElement('option');\n      option.value = entry.name;\n      const display = entry.displayName ?? entry.name;\n      option.textContent = `${display} (${entry.label})`;\n      addSelect.appendChild(option);\n    }\n    addSelect.value = available.some((entry) => entry.name === previous) ? previous : '';\n    addSelect.disabled = available.length === 0;\n  };\n\n  const setNumericRangeInUi = (rule, nextRange) => {\n    if (!rule.extent) return;\n    let clamped = clampRangeToExtent(nextRange, rule.extent);\n    if (!clamped) return;\n    if (rule.extent.isInteger) {\n      clamped = clampRangeToExtent([Math.round(clamped[0]), Math.round(clamped[1])], rule.extent);\n      if (!clamped) return;\n    }\n    rule.range = clamped;\n    if (rule.slider) {\n      rule.slider.aInput.value = String(clamped[0]);\n      rule.slider.bInput.value = String(clamped[1]);\n      rule.slider.setVisual(clamped[0], clamped[1]);\n    }\n    rule.setMarkers?.(clamped[0], clamped[1]);\n    if (rule.minInput) rule.minInput.value = formatRangeInputValue(clamped[0], rule.extent.isInteger);\n    if (rule.maxInput) rule.maxInput.value = formatRangeInputValue(clamped[1], rule.extent.isInteger);\n  };\n\n  const rebuildNumericRule = (rule, { resetRange = false } = {}) => {\n    rule.sliderHost?.replaceChildren();\n    rule.histogramHost?.replaceChildren();\n    if (rule.slider) {\n      rule.slider.destroy();\n      rule.slider = null;\n    }\n    rule.setMarkers = null;\n    rule.extent = computeNumericExtent(rule.attribute);\n    if (!rule.extent) {\n      if (rule.minInput) {\n        rule.minInput.disabled = true;\n        rule.minInput.value = '';\n      }\n      if (rule.maxInput) {\n        rule.maxInput.disabled = true;\n        rule.maxInput.value = '';\n      }\n      return;\n    }\n\n    rule.range = resetRange || !Array.isArray(rule.range)\n      ? [rule.extent.min, rule.extent.max]\n      : clampRangeToExtent(rule.range, rule.extent);\n\n    if (rule.minInput) {\n      rule.minInput.disabled = false;\n      rule.minInput.step = rule.extent.isInteger ? '1' : 'any';\n      rule.minInput.min = formatRangeInputValue(rule.extent.min, rule.extent.isInteger);\n      rule.minInput.max = formatRangeInputValue(rule.extent.max, rule.extent.isInteger);\n    }\n    if (rule.maxInput) {\n      rule.maxInput.disabled = false;\n      rule.maxInput.step = rule.extent.isInteger ? '1' : 'any';\n      rule.maxInput.min = formatRangeInputValue(rule.extent.min, rule.extent.isInteger);\n      rule.maxInput.max = formatRangeInputValue(rule.extent.max, rule.extent.isInteger);\n    }\n\n    const slider = new TwoHandleRange({\n      min: rule.extent.min,\n      max: rule.extent.max,\n      value: rule.range,\n      step: suggestStepFromExtent(rule.extent),\n      onChange: (nextRange) => {\n        setNumericRangeInUi(rule, nextRange);\n        markDirty();\n      },\n    });\n    if (rule.sliderMinTestId) slider.aInput.dataset.testid = rule.sliderMinTestId;\n    if (rule.sliderMaxTestId) slider.bInput.dataset.testid = rule.sliderMaxTestId;\n    rule.slider = slider;\n    rule.sliderHost?.appendChild(slider.element);\n\n    const histogram = createRangeHistogram({\n      attributeName: rule.attribute,\n      range: rule.range,\n      extent: rule.extent,\n    });\n    if (histogram) {\n      rule.setMarkers = histogram.setMarkers;\n      rule.histogramHost?.appendChild(histogram.element);\n    }\n    setNumericRangeInUi(rule, rule.range);\n  };\n\n  const removeRule = (attribute, { notify = true } = {}) => {\n    const rule = state.rules.get(attribute);\n    if (!rule) return;\n    rule.slider?.destroy?.();\n    rule.row?.remove?.();\n    state.rules.delete(attribute);\n    refreshAttributeSelect();\n    if (notify) markDirty();\n  };\n\n  const refreshCategoricalRuleValues = (rule) => {\n    const entries = getCategoryEntries(rule.attribute);\n    const selected = new Set(Array.from(rule.listSelect?.selectedOptions ?? []).map((option) => option.value));\n    rule.listSelect?.replaceChildren();\n    rule.checklist?.replaceChildren();\n    for (const entry of entries) {\n      const label = entry.label;\n      const option = document.createElement('option');\n      option.value = label;\n      option.textContent = label;\n      if (selected.has(label)) option.selected = true;\n      rule.listSelect?.appendChild(option);\n\n      if (rule.checklist) {\n        const item = document.createElement('label');\n        item.className = 'helios-ui-categorical-checklist__item';\n        item.dataset.value = label;\n\n        const input = document.createElement('input');\n        input.type = 'checkbox';\n        input.value = label;\n        input.checked = selected.has(label);\n        input.addEventListener('change', () => {\n          const matching = Array.from(rule.listSelect?.options ?? []).find((candidate) => candidate.value === label);\n          if (matching) matching.selected = input.checked;\n          syncCategoricalChecklist(rule);\n          markDirty();\n        });\n        item.appendChild(input);\n\n        const text = document.createElement('span');\n        text.className = 'helios-ui-categorical-checklist__label';\n        text.textContent = label;\n        item.appendChild(text);\n\n        const count = document.createElement('span');\n        count.className = 'helios-ui-categorical-checklist__count';\n        count.textContent = formatCompactCount(entry.count);\n        item.appendChild(count);\n\n        rule.checklist.appendChild(item);\n      }\n    }\n    if (rule.listSelect) {\n      rule.listSelect.disabled = entries.length === 0;\n      rule.listSelect.size = Math.max(2, Math.min(6, entries.length || 2));\n    }\n    syncCategoricalChecklist(rule);\n  };\n\n  const syncCategoricalChecklist = (rule) => {\n    const selected = new Set(Array.from(rule.listSelect?.selectedOptions ?? []).map((option) => option.value));\n    const options = Array.from(rule.listSelect?.options ?? []);\n    const total = options.length;\n    if (rule.summary) {\n      rule.summary.textContent = !total\n        ? 'No categories'\n        : selected.size === total\n          ? `All ${total} selected`\n          : `${selected.size} of ${total} selected`;\n    }\n    for (const item of rule.checklist?.querySelectorAll?.('.helios-ui-categorical-checklist__item') ?? []) {\n      const checked = selected.has(item.dataset.value);\n      item.dataset.checked = checked ? 'true' : 'false';\n      const input = item.querySelector('input[type=\"checkbox\"]');\n      if (input) input.checked = checked;\n    }\n  };\n\n  const createNumericRule = (attribute) => {\n    const shell = createRuleShell(attribute, 'Numeric', testIds.numericRemove, () => removeRule(attribute));\n    const rule = {\n      attribute,\n      type: 'numeric',\n      row: shell.row,\n      extent: null,\n      range: null,\n      sliderHost: document.createElement('div'),\n      histogramHost: document.createElement('div'),\n      slider: null,\n      setMarkers: null,\n      minInput: null,\n      maxInput: null,\n      sliderMinTestId: testIds.sliderMin,\n      sliderMaxTestId: testIds.sliderMax,\n    };\n    rule.sliderHost.style.width = '100%';\n    rule.histogramHost.style.width = '100%';\n\n    const valuesHost = document.createElement('div');\n    valuesHost.className = 'helios-ui-range2__values';\n    valuesHost.style.width = '100%';\n\n    const minInput = document.createElement('input');\n    minInput.type = 'number';\n    minInput.className = 'helios-ui-number';\n    if (testIds.minInput) minInput.dataset.testid = testIds.minInput;\n    minInput.disabled = true;\n\n    const maxInput = document.createElement('input');\n    maxInput.type = 'number';\n    maxInput.className = 'helios-ui-number';\n    if (testIds.maxInput) maxInput.dataset.testid = testIds.maxInput;\n    maxInput.disabled = true;\n\n    rule.minInput = minInput;\n    rule.maxInput = maxInput;\n    valuesHost.appendChild(minInput);\n    valuesHost.appendChild(maxInput);\n\n    const commitFromInputs = () => {\n      if (!rule.extent) return;\n      const loRaw = Number(minInput.value);\n      const hiRaw = Number(maxInput.value);\n      if (!Number.isFinite(loRaw) || !Number.isFinite(hiRaw)) {\n        setNumericRangeInUi(rule, rule.range ?? [rule.extent.min, rule.extent.max]);\n        return;\n      }\n      setNumericRangeInUi(rule, [loRaw, hiRaw]);\n      markDirty();\n    };\n\n    minInput.addEventListener('change', commitFromInputs);\n    maxInput.addEventListener('change', commitFromInputs);\n    minInput.addEventListener('blur', commitFromInputs);\n    maxInput.addEventListener('blur', commitFromInputs);\n    minInput.addEventListener('keydown', (event) => {\n      if (event.key !== 'Enter') return;\n      event.preventDefault();\n      commitFromInputs();\n    });\n    maxInput.addEventListener('keydown', (event) => {\n      if (event.key !== 'Enter') return;\n      event.preventDefault();\n      commitFromInputs();\n    });\n\n    shell.body.appendChild(rule.histogramHost);\n    shell.body.appendChild(rule.sliderHost);\n    shell.body.appendChild(valuesHost);\n\n    rebuildNumericRule(rule, { resetRange: true });\n    rulesHost.appendChild(rule.row);\n    state.rules.set(attribute, rule);\n    refreshAttributeSelect();\n    markDirty();\n  };\n\n  const createStringRule = (attribute) => {\n    const shell = createRuleShell(attribute, 'String', testIds.stringRemove, () => removeRule(attribute));\n    const rule = {\n      attribute,\n      type: 'string',\n      row: shell.row,\n      operatorSelect: null,\n      valueInput: null,\n    };\n\n    const operator = document.createElement('select');\n    operator.className = 'helios-ui-select';\n    operator.style.maxWidth = 'none';\n    if (testIds.stringOperator) operator.dataset.testid = testIds.stringOperator;\n    const operators = [\n      { value: 'contains', label: 'Contains' },\n      { value: 'starts_with', label: 'Starts with' },\n      { value: 'ends_with', label: 'Ends with' },\n      { value: 'regex', label: 'Regex' },\n    ];\n    for (const entry of operators) {\n      const option = document.createElement('option');\n      option.value = entry.value;\n      option.textContent = entry.label;\n      operator.appendChild(option);\n    }\n\n    const valueInput = document.createElement('input');\n    valueInput.type = 'text';\n    valueInput.className = 'helios-ui-text';\n    valueInput.placeholder = 'Value';\n    if (testIds.stringValue) valueInput.dataset.testid = testIds.stringValue;\n\n    operator.addEventListener('change', markDirty);\n    valueInput.addEventListener('input', markDirty);\n\n    rule.operatorSelect = operator;\n    rule.valueInput = valueInput;\n\n    shell.body.appendChild(operator);\n    shell.body.appendChild(valueInput);\n\n    rulesHost.appendChild(rule.row);\n    state.rules.set(attribute, rule);\n    refreshAttributeSelect();\n    markDirty();\n  };\n\n  const createCategoricalRule = (attribute) => {\n    const shell = createRuleShell(attribute, 'Categorical', testIds.categoricalRemove, () => removeRule(attribute));\n    const rule = {\n      attribute,\n      type: 'categorical',\n      row: shell.row,\n      modeSelect: null,\n      listSelect: null,\n      textInput: null,\n      checklist: null,\n      summary: null,\n    };\n\n    const mode = document.createElement('select');\n    mode.className = 'helios-ui-select';\n    mode.style.maxWidth = 'none';\n    if (testIds.categoricalMode) mode.dataset.testid = testIds.categoricalMode;\n\n    const listOption = document.createElement('option');\n    listOption.value = 'list';\n    listOption.textContent = 'From list';\n    mode.appendChild(listOption);\n\n    const textOption = document.createElement('option');\n    textOption.value = 'text';\n    textOption.textContent = 'Text (comma separated)';\n    mode.appendChild(textOption);\n\n    const listSelect = document.createElement('select');\n    listSelect.className = 'helios-ui-select helios-ui-categorical-select-bridge';\n    listSelect.multiple = true;\n    if (testIds.categoricalList) listSelect.dataset.testid = testIds.categoricalList;\n\n    const checklistHeader = document.createElement('div');\n    checklistHeader.className = 'helios-ui-categorical-checklist__header';\n    const summary = document.createElement('div');\n    summary.className = 'helios-ui-categorical-checklist__summary';\n    checklistHeader.appendChild(summary);\n\n    const actions = document.createElement('div');\n    actions.className = 'helios-ui-categorical-checklist__actions';\n    const selectAll = document.createElement('button');\n    selectAll.type = 'button';\n    selectAll.className = 'helios-ui-button helios-ui-button--link';\n    selectAll.textContent = 'All';\n    const clearAll = document.createElement('button');\n    clearAll.type = 'button';\n    clearAll.className = 'helios-ui-button helios-ui-button--link';\n    clearAll.textContent = 'None';\n    actions.appendChild(selectAll);\n    actions.appendChild(clearAll);\n    checklistHeader.appendChild(actions);\n\n    const checklist = document.createElement('div');\n    checklist.className = 'helios-ui-categorical-checklist';\n    if (testIds.categoricalList) checklist.dataset.testid = `${testIds.categoricalList}-checklist`;\n\n    const textInput = document.createElement('input');\n    textInput.type = 'text';\n    textInput.className = 'helios-ui-text';\n    textInput.placeholder = 'cat1, cat2';\n    if (testIds.categoricalText) textInput.dataset.testid = testIds.categoricalText;\n    textInput.hidden = true;\n\n    const syncMode = () => {\n      const isText = mode.value === 'text';\n      checklistHeader.hidden = isText;\n      checklist.hidden = isText;\n      textInput.hidden = !isText;\n    };\n\n    mode.addEventListener('change', () => {\n      syncMode();\n      markDirty();\n    });\n    listSelect.addEventListener('change', () => {\n      syncCategoricalChecklist(rule);\n      markDirty();\n    });\n    textInput.addEventListener('input', markDirty);\n    selectAll.addEventListener('click', () => {\n      for (const option of Array.from(listSelect.options)) option.selected = true;\n      syncCategoricalChecklist(rule);\n      markDirty();\n    });\n    clearAll.addEventListener('click', () => {\n      for (const option of Array.from(listSelect.options)) option.selected = false;\n      syncCategoricalChecklist(rule);\n      markDirty();\n    });\n\n    rule.modeSelect = mode;\n    rule.listSelect = listSelect;\n    rule.textInput = textInput;\n    rule.checklist = checklist;\n    rule.summary = summary;\n\n    syncMode();\n    refreshCategoricalRuleValues(rule);\n\n    shell.body.appendChild(mode);\n    shell.body.appendChild(checklistHeader);\n    shell.body.appendChild(checklist);\n    shell.body.appendChild(listSelect);\n    shell.body.appendChild(textInput);\n\n    rulesHost.appendChild(rule.row);\n    state.rules.set(attribute, rule);\n    refreshAttributeSelect();\n    markDirty();\n  };\n\n  const createQueryRule = () => {\n    const attribute = '__query__';\n    const shell = createRuleShell('Query filter', 'Query', testIds.queryRemove, () => removeRule(attribute));\n    const rule = {\n      attribute,\n      type: 'query',\n      row: shell.row,\n      input: null,\n    };\n\n    const queryInput = document.createElement('input');\n    queryInput.type = 'text';\n    queryInput.className = 'helios-ui-text';\n    queryInput.placeholder = 'Query language expression';\n    if (testIds.queryInput) queryInput.dataset.testid = testIds.queryInput;\n    queryInput.addEventListener('input', markDirty);\n    rule.input = queryInput;\n    shell.body.appendChild(queryInput);\n\n    rulesHost.appendChild(rule.row);\n    state.rules.set(attribute, rule);\n    refreshAttributeSelect();\n    markDirty();\n  };\n\n  const addRuleForAttribute = (attribute) => {\n    const name = String(attribute ?? '').trim();\n    if (!name || state.rules.has(name)) return;\n    const entry = state.catalogByName.get(name);\n    if (!entry) return;\n    if (entry.type === 'numeric') createNumericRule(name);\n    else if (entry.type === 'string') createStringRule(name);\n    else if (entry.type === 'categorical') createCategoricalRule(name);\n    else if (entry.type === 'query') createQueryRule();\n  };\n\n  addSelect.addEventListener('change', () => {\n    const attribute = String(addSelect.value ?? '').trim();\n    if (!attribute) return;\n    addRuleForAttribute(attribute);\n    addSelect.value = '';\n  });\n\n  const refreshFromNetwork = () => {\n    state.catalog = getFilterableAttributes();\n    state.catalogByName = new Map(state.catalog.map((entry) => [entry.name, entry]));\n\n    for (const attribute of Array.from(state.rules.keys())) {\n      if (!state.catalogByName.has(attribute)) {\n        removeRule(attribute, { notify: false });\n      }\n    }\n\n    for (const rule of state.rules.values()) {\n      if (rule.type === 'numeric') {\n        rebuildNumericRule(rule, { resetRange: false });\n      } else if (rule.type === 'categorical') {\n        refreshCategoricalRuleValues(rule);\n      }\n    }\n\n    refreshAttributeSelect();\n  };\n\n  const collectRules = () => {\n    const rules = [];\n    for (const rule of state.rules.values()) {\n      if (rule.type === 'numeric') {\n        if (!rule.extent || !Array.isArray(rule.range)) continue;\n        if (rangesClose(rule.range, rule.extent)) continue;\n        rules.push({\n          id: `${scope}-${rule.attribute}`,\n          scope,\n          type: 'numeric',\n          attribute: rule.attribute,\n          min: rule.range[0],\n          max: rule.range[1],\n          extentMin: rule.extent.min,\n          extentMax: rule.extent.max,\n        });\n        continue;\n      }\n      if (rule.type === 'string') {\n        const value = String(rule.valueInput?.value ?? '').trim();\n        if (!value) continue;\n        rules.push({\n          id: `${scope}-${rule.attribute}`,\n          scope,\n          type: 'string',\n          attribute: rule.attribute,\n          operator: String(rule.operatorSelect?.value ?? 'contains'),\n          value,\n        });\n        continue;\n      }\n      if (rule.type === 'categorical') {\n        const useText = String(rule.modeSelect?.value ?? 'list') === 'text';\n        const values = useText\n          ? parseCsvValues(rule.textInput?.value ?? '')\n          : Array.from(rule.listSelect?.selectedOptions ?? []).map((option) => option.value);\n        if (!values.length) continue;\n        rules.push({\n          id: `${scope}-${rule.attribute}`,\n          scope,\n          type: 'categorical',\n          attribute: rule.attribute,\n          values,\n        });\n        continue;\n      }\n      if (rule.type === 'query') {\n        const query = String(rule.input?.value ?? '').trim();\n        if (!query) continue;\n        rules.push({\n          id: `${scope}-query`,\n          scope,\n          type: 'query',\n          query,\n        });\n      }\n    }\n    return rules;\n  };\n\n  const destroy = () => {\n    for (const rule of state.rules.values()) {\n      rule.slider?.destroy?.();\n    }\n    state.rules.clear();\n    addSelect.remove();\n    element.remove();\n  };\n\n  refreshFromNetwork();\n\n  return {\n    element,\n    addSelect,\n    refreshFromNetwork,\n    collectRules,\n    destroy,\n  };\n}\n\nexport default createAttributeRuleEditor;\n","import { AttributeType } from 'helios-network';\nimport { createAlignedRowEl } from '../controls/createAlignedRowEl.js';\nimport { createToggleControl } from '../controls/createToggleControl.js';\nimport { createSegmentedToggleControl } from '../controls/createSegmentedToggleControl.js';\nimport { createTooltipManager } from '../controls/createTooltipManager.js';\nimport { createSelectControl } from '../controls/createSelectControl.js';\nimport { SuggestedSliderControls } from '../controls/SuggestedSliderControls.js';\nimport { clampNumber } from '../utils/numbers.js';\nimport { toHex8 } from '../utils/colors.js';\nimport { PanelStack } from './PanelStack.js';\nimport { createAttributeRuleEditor } from './AttributeRuleEditor.js';\nimport {\n  SELECTION_PANEL_SCHEMA,\n  createPanelSchemaIndicator,\n} from './panelSchema.js';\n\nconst DEFAULT_NODE_SELECTED_STYLE = Object.freeze({\n  sizeMul: 2,\n  opacityMul: 1,\n  outlineMul: 2,\n  discard: false,\n  forceMaxAlpha: true,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0.34, 0.16, 0.02, 0],\n});\n\nconst DEFAULT_NODE_HIGHLIGHT_STYLE = Object.freeze({\n  sizeMul: 1.5,\n  opacityMul: 1,\n  outlineMul: 1.25,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0.02, 0.18, 0.34, 0],\n});\n\nconst DEFAULT_NODE_HOVER_STYLE = Object.freeze({\n  sizeMul: 1.35,\n  opacityMul: 1,\n  outlineMul: 1.1,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0.08, 0.08, 0.08, 0],\n});\n\nconst DEFAULT_EDGE_SELECTED_STYLE = Object.freeze({\n  widthMul: 1.5,\n  opacityMul: 1,\n  discard: false,\n  forceMaxAlpha: true,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0.3, 0.16, 0.04, 0],\n});\n\nconst DEFAULT_EDGE_HIGHLIGHT_STYLE = Object.freeze({\n  widthMul: 1.25,\n  opacityMul: 50,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0.03, 0.16, 0.28, 0],\n});\n\nconst DEFAULT_EDGE_HOVER_STYLE = Object.freeze({\n  widthMul: 1.35,\n  opacityMul: 50,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0.08, 0.08, 0.08, 0],\n});\n\nconst NEUTRAL_NODE_NO_STATE_STYLE = Object.freeze({\n  sizeMul: 1,\n  opacityMul: 1,\n  outlineMul: 1,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0, 0, 0, 0],\n});\n\nconst NEUTRAL_EDGE_NO_STATE_STYLE = Object.freeze({\n  widthMul: 1,\n  opacityMul: 1,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0, 0, 0, 0],\n});\n\nconst DEFAULT_OTHER_SELECTED_NODE_STYLE = Object.freeze({\n  sizeMul: 0.75,\n  opacityMul: 1,\n  outlineMul: 0.75,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0, 0, 0, 0],\n});\n\nconst DEFAULT_OTHER_SELECTED_EDGE_STYLE = Object.freeze({\n  widthMul: 0.85,\n  opacityMul: 0.85,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0, 0, 0, 0],\n});\n\nconst DEFAULT_OTHER_HIGHLIGHT_NODE_STYLE = Object.freeze({\n  sizeMul: 0.9,\n  opacityMul: 1,\n  outlineMul: 0.9,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0, 0, 0, 0],\n});\n\nconst DEFAULT_OTHER_HIGHLIGHT_EDGE_STYLE = Object.freeze({\n  widthMul: 0.9,\n  opacityMul: 0.9,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0, 0, 0, 0],\n});\n\nconst DEFAULT_AUTO_BACKGROUND_TONE_DISABLED = Object.freeze({\n  enabled: true,\n  amount: 0.15,\n});\n\nconst DEFAULT_AUTO_BACKGROUND_TONE_SELECTED = Object.freeze({\n  enabled: true,\n  amount: 0.4,\n});\n\nconst DEFAULT_SELECTION_FOCUS_MAX_ZOOM = 3;\nconst DEFAULT_SELECTION_FOCUS_MIN_DISTANCE = 260;\nconst DEFAULT_SELECTION_FOCUS_ZOOM_TOLERANCE = 0.05;\n\nconst CURRENT_SELECTION_VALUE = '__current_selection__';\n\nfunction subscribe(helios, eventName, handler) {\n  if (!helios || typeof handler !== 'function') return () => {};\n  if (typeof helios.on === 'function') {\n    return helios.on(eventName, handler) ?? (() => {});\n  }\n  if (typeof helios.addEventListener === 'function') {\n    helios.addEventListener(eventName, handler);\n    return () => helios.removeEventListener(eventName, handler);\n  }\n  return () => {};\n}\n\nfunction appendSectionHeading(container, text) {\n  const heading = document.createElement('div');\n  heading.className = 'helios-ui-label__hint';\n  heading.style.margin = '10px 0 6px';\n  heading.style.fontWeight = '700';\n  heading.style.letterSpacing = '0.02em';\n  heading.textContent = text;\n  container.appendChild(heading);\n  return heading;\n}\n\nfunction rgbaArray(value, fallback) {\n  const seed = Array.isArray(fallback) ? fallback : [1, 1, 1, 1];\n  if (!Array.isArray(value) && !ArrayBuffer.isView(value)) return [...seed];\n  return [0, 1, 2, 3].map((index) => {\n    const numeric = Number(value[index]);\n    return Number.isFinite(numeric) ? numeric : seed[index];\n  });\n}\n\nfunction rgbaToHexWithAlpha(value, fallback = '#ffffffff') {\n  const rgba = rgbaArray(value, [1, 1, 1, 1]).map((entry, index) => {\n    if (index === 3) return Math.max(0, Math.min(1, entry));\n    return Math.max(0, Math.min(1, entry));\n  });\n  const r = Math.round(rgba[0] * 255).toString(16).padStart(2, '0');\n  const g = Math.round(rgba[1] * 255).toString(16).padStart(2, '0');\n  const b = Math.round(rgba[2] * 255).toString(16).padStart(2, '0');\n  const a = Math.round(rgba[3] * 255).toString(16).padStart(2, '0');\n  const hex = `#${r}${g}${b}${a}`;\n  return /^#[0-9a-f]{8}$/iu.test(hex) ? hex : fallback;\n}\n\nfunction hexWithAlphaToRgba(value, fallback) {\n  const seed = rgbaArray(fallback, [1, 1, 1, 1]);\n  const raw = String(value ?? '').trim().replace(/^#/, '');\n  if (!/^[0-9a-f]{8}$/iu.test(raw)) return seed;\n  return [\n    Number.parseInt(raw.slice(0, 2), 16) / 255,\n    Number.parseInt(raw.slice(2, 4), 16) / 255,\n    Number.parseInt(raw.slice(4, 6), 16) / 255,\n    Number.parseInt(raw.slice(6, 8), 16) / 255,\n  ];\n}\n\nfunction normalizeFiniteNumber(value, fallback) {\n  if (value == null || `${value}`.trim() === '') return fallback;\n  const numeric = Number(value);\n  return Number.isFinite(numeric) ? numeric : fallback;\n}\n\nfunction normalizeNonNegativeNumber(value, fallback) {\n  return clampNumber(normalizeFiniteNumber(value, null), { min: 0 }) ?? fallback;\n}\n\nfunction normalizeNodeStyle(style, fallback) {\n  const seed = fallback ?? DEFAULT_NODE_SELECTED_STYLE;\n  const next = style && typeof style === 'object' ? style : {};\n  return {\n    sizeMul: normalizeNonNegativeNumber(next.sizeMul ?? seed.sizeMul, seed.sizeMul),\n    opacityMul: normalizeNonNegativeNumber(next.opacityMul ?? seed.opacityMul, seed.opacityMul),\n    outlineMul: normalizeNonNegativeNumber(next.outlineMul ?? seed.outlineMul, seed.outlineMul),\n    discard: next.discard === true,\n    forceMaxAlpha: next.forceMaxAlpha === true,\n    colorMul: rgbaArray(next.colorMul, seed.colorMul),\n    colorAdd: rgbaArray(next.colorAdd, seed.colorAdd),\n  };\n}\n\nfunction normalizeEdgeStyle(style, fallback) {\n  const seed = fallback ?? DEFAULT_EDGE_SELECTED_STYLE;\n  const next = style && typeof style === 'object' ? style : {};\n  return {\n    widthMul: normalizeNonNegativeNumber(next.widthMul ?? seed.widthMul, seed.widthMul),\n    opacityMul: normalizeNonNegativeNumber(next.opacityMul ?? seed.opacityMul, seed.opacityMul),\n    discard: next.discard === true,\n    forceMaxAlpha: next.forceMaxAlpha === true,\n    colorMul: rgbaArray(next.colorMul, seed.colorMul),\n    colorAdd: rgbaArray(next.colorAdd, seed.colorAdd),\n  };\n}\n\nfunction backgroundLuminance(color) {\n  const rgba = rgbaArray(color, [1, 1, 1, 1]);\n  return (rgba[0] * 0.2126) + (rgba[1] * 0.7152) + (rgba[2] * 0.0722);\n}\n\nfunction resolveBackgroundColor(helios) {\n  return helios?.background?.() ?? helios?.clearColor?.() ?? [1, 1, 1, 1];\n}\n\nfunction normalizeAutoBackgroundTone(tone, fallback = DEFAULT_AUTO_BACKGROUND_TONE_DISABLED) {\n  const seed = fallback && typeof fallback === 'object' ? fallback : DEFAULT_AUTO_BACKGROUND_TONE_DISABLED;\n  const next = tone && typeof tone === 'object' ? tone : {};\n  return {\n    enabled: next.enabled == null ? seed.enabled === true : next.enabled === true,\n    amount: clampNumber(next.amount ?? seed.amount, { min: 0, max: 1 }) ?? seed.amount,\n  };\n}\n\nfunction applyAutoBackgroundTone(style, backgroundColor, tone) {\n  const current = {\n    ...style,\n    colorMul: rgbaArray(style?.colorMul, [1, 1, 1, 1]),\n    colorAdd: rgbaArray(style?.colorAdd, [0, 0, 0, 0]),\n  };\n  const resolvedTone = normalizeAutoBackgroundTone(tone);\n  if (!resolvedTone.enabled) return current;\n  const mixAmount = resolvedTone.amount;\n  const background = rgbaArray(backgroundColor, [1, 1, 1, 1]);\n  if (backgroundLuminance(background) < 0.5) {\n    current.colorMul = [\n      1 - (mixAmount * (1 - background[0])),\n      1 - (mixAmount * (1 - background[1])),\n      1 - (mixAmount * (1 - background[2])),\n      1,\n    ];\n    current.colorAdd = [0, 0, 0, 0];\n    return current;\n  }\n  current.colorMul = [1, 1, 1, 1];\n  current.colorAdd = [\n    background[0] * mixAmount * 0.28,\n    background[1] * mixAmount * 0.28,\n    background[2] * mixAmount * 0.28,\n    0,\n  ];\n  return current;\n}\n\nfunction isNeutralNodeStateStyle(style) {\n  const current = normalizeNodeStyle(style, DEFAULT_NODE_SELECTED_STYLE);\n  return current.sizeMul === 1\n    && current.opacityMul === 1\n    && current.outlineMul === 1\n    && current.discard === false\n    && current.forceMaxAlpha === false\n    && current.colorMul.every((value, index) => value === [1, 1, 1, 1][index])\n    && current.colorAdd.every((value) => value === 0);\n}\n\nfunction isNeutralEdgeStateStyle(style) {\n  const current = normalizeEdgeStyle(style, DEFAULT_EDGE_SELECTED_STYLE);\n  return current.widthMul === 1\n    && current.opacityMul === 1\n    && current.discard === false\n    && current.forceMaxAlpha === false\n    && current.colorMul.every((value, index) => value === [1, 1, 1, 1][index])\n    && current.colorAdd.every((value) => value === 0);\n}\n\nfunction resolveStringAttributeNames(network) {\n  if (!network) return [];\n  const entries = [];\n  for (const name of network.getNodeAttributeNames?.() ?? []) {\n    const info = network.getNodeAttributeInfo?.(name);\n    if (info?.type !== AttributeType.String) continue;\n    entries.push(String(name));\n  }\n  entries.sort((a, b) => a.localeCompare(b));\n  return entries;\n}\n\nfunction resolveBooleanAttributeNames(network, scope = 'node') {\n  if (!network) return [];\n  const getNames = scope === 'edge'\n    ? network.getEdgeAttributeNames?.bind(network)\n    : network.getNodeAttributeNames?.bind(network);\n  const getInfo = scope === 'edge'\n    ? network.getEdgeAttributeInfo?.bind(network)\n    : network.getNodeAttributeInfo?.bind(network);\n  const entries = [];\n  for (const name of getNames?.() ?? []) {\n    const info = getInfo?.(name);\n    if (info?.type !== AttributeType.Boolean || info?.dimension !== 1) continue;\n    entries.push(String(name));\n  }\n  entries.sort((a, b) => a.localeCompare(b));\n  return entries;\n}\n\nfunction resolvePreferredHoverLabelSource(network) {\n  if (!network) return '$id';\n  const names = new Map((network.getNodeAttributeNames?.() ?? []).map((name) => [String(name).toLowerCase(), String(name)]));\n  for (const key of ['label', 'name', 'title']) {\n    const found = names.get(key);\n    if (!found) continue;\n    const info = network.getNodeAttributeInfo?.(found);\n    if (info?.type === AttributeType.String) return found;\n  }\n  return '$id';\n}\n\nfunction resolveHoverLabelValue(network, source, id) {\n  if (!network || !Number.isInteger(id) || id < 0) return null;\n  const resolvedSource = source === 'auto' ? resolvePreferredHoverLabelSource(network) : source;\n  if (!resolvedSource || resolvedSource === '$id') return String(id);\n  const info = network.getNodeAttributeInfo?.(resolvedSource);\n  if (!info) return String(id);\n  if (info.type === AttributeType.String) {\n    const value = network.getNodeStringAttribute?.(resolvedSource, id);\n    return value == null || value === '' ? String(id) : String(value);\n  }\n  return String(id);\n}\n\nexport class SelectionPanel {\n  constructor(ui, options = {}) {\n    this.ui = ui;\n    this.options = options;\n  }\n\n  create() {\n    const helios = this.ui.helios ?? null;\n    const content = document.createElement('div');\n    content.style.setProperty('--helios-ui-label-col', '120px');\n\n    if (!helios) {\n      const placeholder = document.createElement('div');\n      placeholder.textContent = this.options.placeholder ?? 'Selection controls require a Helios instance.';\n      content.appendChild(placeholder);\n      return this.ui.createPanel({\n        id: this.options.id ?? 'helios-ui-selection',\n        title: this.options.title ?? 'Selection',\n        position: this.options.position ?? { x: 16, y: 960 },\n        dock: this.options.dock ?? 'top-right',\n        content,\n      });\n    }\n\n    const tooltips = createTooltipManager();\n    const createRow = (container, { title, hint, controls }) => {\n      const built = createAlignedRowEl({\n        title,\n        hint,\n        controls,\n        attachTooltip: tooltips.attachTooltip,\n      });\n      container.appendChild(built.row);\n      return built;\n    };\n\n    const selectionBehavior = helios.useBehavior?.('selection', this.options) ?? helios.behavior?.selection ?? null;\n    const hoverBehavior = helios.useBehavior?.('hover', this.options) ?? helios.behavior?.hover ?? null;\n    const labelsBehavior = helios.behavior?.labels ?? helios.useBehavior?.('labels');\n    if (!selectionBehavior) {\n      throw new Error('SelectionPanel requires Helios.behaviors to provide SelectionBehavior.');\n    }\n    if (!hoverBehavior) {\n      throw new Error('SelectionPanel requires Helios.behaviors to provide HoverBehavior.');\n    }\n    const selectionState = selectionBehavior.state;\n    const hoverState = hoverBehavior.state;\n\n    const defaultOtherSelectedNodeStyle = normalizeNodeStyle(\n      DEFAULT_OTHER_SELECTED_NODE_STYLE,\n      DEFAULT_OTHER_SELECTED_NODE_STYLE,\n    );\n    const defaultOtherSelectedEdgeStyle = normalizeEdgeStyle(\n      DEFAULT_OTHER_SELECTED_EDGE_STYLE,\n      DEFAULT_OTHER_SELECTED_EDGE_STYLE,\n    );\n    const defaultOtherHighlightNodeStyle = normalizeNodeStyle(\n      DEFAULT_OTHER_HIGHLIGHT_NODE_STYLE,\n      DEFAULT_OTHER_HIGHLIGHT_NODE_STYLE,\n    );\n    const defaultOtherHighlightEdgeStyle = normalizeEdgeStyle(\n      DEFAULT_OTHER_HIGHLIGHT_EDGE_STYLE,\n      DEFAULT_OTHER_HIGHLIGHT_EDGE_STYLE,\n    );\n\n    const ensureStateStyleDefaults = () => selectionBehavior.ensureStateStyleDefaults();\n    const applyOtherElementsState = () => selectionBehavior.applyOtherElementsState();\n    const applyHoverConnectedEdges = () => hoverBehavior.applyHoverConnectedEdges();\n    const applyHighlightConnectedEdges = () => hoverBehavior.applyHighlightConnectedEdges();\n    const applySelectedConnectedEdges = () => selectionBehavior.applySelectedConnectedEdges();\n    const clearNodeHover = () => hoverBehavior.clearNodeHover();\n    const clearEdgeHover = () => hoverBehavior.clearEdgeHover();\n    const syncPicking = () => hoverBehavior.syncPicking();\n    const applyHoverLabelConfig = () => hoverBehavior.applyHoverLabelConfig();\n    const applySelectionLabelDefaults = () => selectionBehavior.applySelectionLabelDefaults();\n    const setSelectionBinding = (value = CURRENT_SELECTION_VALUE) => {\n      selectionBehavior.setSelectionBinding(value);\n      refreshSavedSelectionOptions();\n    };\n    const clearSelection = (options = {}) => selectionBehavior.clearSelection(options);\n    const applyNodeSelectionSet = (indices, mode = 'add', options = {}) => selectionBehavior.applyNodeSelectionSet(indices, mode, options);\n    const applyEdgeSelectionSet = (indices, mode = 'add', options = {}) => selectionBehavior.applyEdgeSelectionSet(indices, mode, options);\n\n    const selectionMessageEl = document.createElement('div');\n    selectionMessageEl.className = 'helios-ui-label__hint';\n    selectionMessageEl.style.lineHeight = '1.4';\n    selectionMessageEl.style.margin = '8px 0 0';\n    selectionMessageEl.hidden = true;\n\n    const setSelectionMessage = (message = '') => {\n      const text = typeof message === 'string' ? message.trim() : '';\n      selectionMessageEl.textContent = text;\n      selectionMessageEl.hidden = !text;\n    };\n\n    const runNodeSelector = (mode = 'add') => {\n      try {\n        const rules = nodeSelectorEditor.collectRules();\n        if (!rules.length) {\n          setSelectionMessage('Add at least one selector before applying it.');\n          return;\n        }\n        selectionBehavior.applyNodeSelectionQuery(rules, mode);\n        refreshStatus();\n        setSelectionMessage('');\n      } catch (error) {\n        setSelectionMessage(error instanceof Error ? error.message : String(error));\n      }\n    };\n\n    const expandSelectionToNeighbors = () => {\n      if (!selectionState.selectedNodes.size) {\n        setSelectionMessage('Select at least one node before expanding to neighbors.');\n        return;\n      }\n      try {\n        selectionBehavior.expandSelectionToNeighbors();\n        refreshStatus();\n        setSelectionMessage('');\n      } catch (error) {\n        setSelectionMessage(error instanceof Error ? error.message : String(error));\n      }\n    };\n\n    const centerSelectedNodesOrNetwork = (options = {}) => selectionBehavior.centerSelectedNodesOrNetwork(options);\n\n    const statusEl = document.createElement('div');\n    statusEl.className = 'helios-ui-selection__status helios-ui-label__hint';\n    statusEl.style.margin = '0 0 10px';\n\n    const refreshStatus = () => {\n      statusEl.textContent = `Status: ${selectionState.selectedNodes.size} node${selectionState.selectedNodes.size === 1 ? '' : 's'} ${selectionState.selectedEdges.size} edge${selectionState.selectedEdges.size === 1 ? '' : 's'}`;\n    };\n\n    const actionsWrap = document.createElement('div');\n    actionsWrap.className = 'helios-ui-selection__actions';\n    actionsWrap.style.display = 'flex';\n    actionsWrap.style.flexWrap = 'wrap';\n    actionsWrap.style.gap = '8px';\n    actionsWrap.style.margin = '0 0 8px';\n\n    const clearButton = document.createElement('button');\n    clearButton.type = 'button';\n    clearButton.className = 'helios-ui-button';\n    clearButton.textContent = 'Clear';\n    clearButton.setAttribute('aria-label', 'Clear selection');\n    clearButton.addEventListener('click', () => {\n      clearSelection();\n      refreshStatus();\n      setSelectionMessage('');\n    });\n    actionsWrap.appendChild(clearButton);\n\n    const expandButton = document.createElement('button');\n    expandButton.type = 'button';\n    expandButton.className = 'helios-ui-button';\n    expandButton.textContent = 'Expand Neighbors';\n    expandButton.setAttribute('aria-label', 'Expand selection to neighbors');\n    expandButton.addEventListener('click', () => {\n      expandSelectionToNeighbors();\n    });\n    actionsWrap.appendChild(expandButton);\n\n    const centerButton = document.createElement('button');\n    centerButton.type = 'button';\n    centerButton.className = 'helios-ui-button';\n    centerButton.textContent = 'Center';\n    centerButton.setAttribute('aria-label', 'Center on selection');\n    centerButton.addEventListener('click', () => {\n      centerSelectedNodesOrNetwork();\n      setSelectionMessage('');\n    });\n    actionsWrap.appendChild(centerButton);\n\n    let autoReplaceToggle = null;\n    let selectorInterfaceCount = 0;\n    let selectorStackEntry = null;\n\n    const getSelectorInterfaceCount = () => {\n      const rulesHost = nodeSelectorEditor.element.firstElementChild;\n      return rulesHost instanceof HTMLElement ? rulesHost.childElementCount : 0;\n    };\n\n    const setSelectorCollapsed = (collapsed) => {\n      if (!selectorStackEntry) return;\n      selectorStackEntry.item.dataset.collapsed = collapsed ? 'true' : 'false';\n      selectorStackEntry.header.setAttribute('aria-expanded', collapsed ? 'false' : 'true');\n      const toggle = selectorStackEntry.header.querySelector('.helios-ui-subpanel__toggle');\n      if (toggle) toggle.textContent = collapsed ? '+' : '−';\n    };\n\n    const updateSelectorSectionAvailability = (interfaceCount = 0) => {\n      const hasSelectors = Number(interfaceCount) > 0;\n      selectorApplyWrap.hidden = !hasSelectors;\n      if (!selectorStackEntry) return;\n      selectorStackEntry.header.disabled = !hasSelectors;\n      selectorStackEntry.header.setAttribute('aria-disabled', hasSelectors ? 'false' : 'true');\n      if (!hasSelectors) {\n        setSelectorCollapsed(true);\n      }\n    };\n\n    const nodeSelectorEditor = createAttributeRuleEditor({\n      helios,\n      scope: 'node',\n      addPlaceholder: 'Add selector...',\n      onDirty: () => {\n        const nextInterfaceCount = getSelectorInterfaceCount();\n        selectionBehavior.setSelectorRules?.(nodeSelectorEditor.collectRules());\n        updateSelectorSectionAvailability(nextInterfaceCount);\n        if (nextInterfaceCount > selectorInterfaceCount && selectorStackEntry?.item?.dataset?.collapsed === 'true') {\n          setSelectorCollapsed(false);\n        }\n        selectorInterfaceCount = nextInterfaceCount;\n        if (autoReplaceToggle?.checked && nextInterfaceCount > 0) {\n          runNodeSelector('replace');\n        }\n      },\n    });\n\n    const savedSelectionWrap = document.createElement('div');\n    savedSelectionWrap.className = 'helios-ui-selection__saved';\n    savedSelectionWrap.style.display = 'flex';\n    savedSelectionWrap.style.alignItems = 'center';\n    savedSelectionWrap.style.gap = '8px';\n    savedSelectionWrap.style.margin = '0 0 8px';\n\n    const savedSelectionSelect = createSelectControl({\n      ariaLabel: 'Saved selection attribute',\n    });\n    savedSelectionSelect.style.flex = '1 1 0';\n    savedSelectionWrap.appendChild(savedSelectionSelect);\n\n    const saveSelectionButton = document.createElement('button');\n    saveSelectionButton.type = 'button';\n    saveSelectionButton.className = 'helios-ui-button';\n    saveSelectionButton.textContent = 'Save';\n    saveSelectionButton.setAttribute('aria-label', 'Save selection');\n    savedSelectionWrap.appendChild(saveSelectionButton);\n\n    const saveDialog = document.createElement('dialog');\n    saveDialog.className = 'helios-ui-dialog';\n    saveDialog.setAttribute('aria-label', 'Save selection attribute');\n\n    const saveDialogTitle = document.createElement('div');\n    saveDialogTitle.className = 'helios-ui-dialog__title';\n    saveDialogTitle.textContent = 'Save Selection';\n\n    const saveDialogHint = document.createElement('div');\n    saveDialogHint.className = 'helios-ui-label__hint';\n    saveDialogHint.textContent = 'Enter the attribute name used to store this selection.';\n\n    const saveDialogInput = document.createElement('input');\n    saveDialogInput.type = 'text';\n    saveDialogInput.className = 'helios-ui-text';\n    saveDialogInput.placeholder = 'selection_name';\n    saveDialogInput.autocomplete = 'off';\n    saveDialogInput.spellcheck = false;\n    saveDialogInput.setAttribute('aria-label', 'Selection attribute name');\n\n    const saveDialogError = document.createElement('div');\n    saveDialogError.className = 'helios-ui-label__hint';\n    saveDialogError.style.color = 'var(--helios-ui-danger)';\n    saveDialogError.hidden = true;\n\n    const saveDialogActions = document.createElement('div');\n    saveDialogActions.className = 'helios-ui-dialog__actions';\n\n    const saveDialogCancel = document.createElement('button');\n    saveDialogCancel.type = 'button';\n    saveDialogCancel.className = 'helios-ui-button';\n    saveDialogCancel.textContent = 'Cancel';\n    saveDialogCancel.setAttribute('aria-label', 'Cancel save selection');\n\n    const saveDialogConfirm = document.createElement('button');\n    saveDialogConfirm.type = 'button';\n    saveDialogConfirm.className = 'helios-ui-button';\n    saveDialogConfirm.textContent = 'Save';\n    saveDialogConfirm.setAttribute('aria-label', 'Confirm save selection');\n\n    saveDialogActions.appendChild(saveDialogCancel);\n    saveDialogActions.appendChild(saveDialogConfirm);\n    saveDialog.appendChild(saveDialogTitle);\n    saveDialog.appendChild(saveDialogHint);\n    saveDialog.appendChild(saveDialogInput);\n    saveDialog.appendChild(saveDialogError);\n    saveDialog.appendChild(saveDialogActions);\n    content.appendChild(saveDialog);\n\n    const closeSaveDialog = () => {\n      saveDialogError.hidden = true;\n      saveDialogError.textContent = '';\n      if (typeof saveDialog.close === 'function' && saveDialog.open) saveDialog.close();\n      else saveDialog.removeAttribute('open');\n    };\n\n    const openSaveDialog = (value = '') => {\n      saveDialogError.hidden = true;\n      saveDialogError.textContent = '';\n      saveDialogInput.value = value;\n      if (typeof saveDialog.showModal === 'function' && !saveDialog.open) saveDialog.showModal();\n      else saveDialog.setAttribute('open', '');\n      globalThis.setTimeout(() => {\n        saveDialogInput.focus();\n        saveDialogInput.select();\n      }, 0);\n    };\n\n    const collectSavedSelectionAttributes = () => selectionBehavior.collectSavedSelectionAttributes();\n\n    const resolveSuggestedSelectionName = () => {\n      const entries = collectSavedSelectionAttributes();\n      const names = new Set(entries.map((entry) => entry.name));\n      const current = selectionState.savedSelectionAttribute !== CURRENT_SELECTION_VALUE\n        ? selectionState.savedSelectionAttribute\n        : selectionState.lastNamedSelectionAttribute;\n      const base = (typeof current === 'string' && current.trim()) ? current.trim() : 'selection';\n      if (!names.has(base)) return base;\n      let suffix = 2;\n      while (names.has(`${base}-${suffix}`)) suffix += 1;\n      return `${base}-${suffix}`;\n    };\n\n    const refreshSavedSelectionOptions = () => {\n      const entries = collectSavedSelectionAttributes();\n      const current = typeof selectionState.savedSelectionAttribute === 'string'\n        ? selectionState.savedSelectionAttribute\n        : CURRENT_SELECTION_VALUE;\n      const nextValue = current === CURRENT_SELECTION_VALUE || entries.some((entry) => entry.name === current)\n        ? current\n        : CURRENT_SELECTION_VALUE;\n      const options = [\n        {\n          value: CURRENT_SELECTION_VALUE,\n          label: 'Current Selection',\n        },\n        ...entries.map((entry) => ({\n          value: entry.name,\n          label: entry.node && entry.edge\n            ? entry.name\n            : entry.node\n              ? `${entry.name} (nodes)`\n              : `${entry.name} (edges)`,\n        })),\n      ];\n      selectionState.savedSelectionAttribute = nextValue;\n      savedSelectionSelect.setOptions(options, nextValue);\n    };\n\n    const saveSelectionToAttribute = (name) => {\n      const trimmed = selectionBehavior.saveSelectionToAttribute(name);\n      refreshSavedSelectionOptions();\n      savedSelectionSelect.value = trimmed;\n      setSelectionMessage('');\n      return trimmed;\n    };\n\n    const restoreSelectionFromAttribute = (name) => {\n      selectionBehavior.restoreSelectionFromAttribute(name);\n      refreshStatus();\n      setSelectionMessage('');\n    };\n\n    savedSelectionSelect.addEventListener('change', () => {\n      setSelectionBinding(savedSelectionSelect.value || CURRENT_SELECTION_VALUE);\n      refreshSavedSelectionOptions();\n      if (selectionState.savedSelectionAttribute !== CURRENT_SELECTION_VALUE) {\n        restoreSelectionFromAttribute(selectionState.savedSelectionAttribute);\n      } else {\n        setSelectionMessage('');\n      }\n    });\n\n    saveSelectionButton.addEventListener('click', (event) => {\n      if (event.shiftKey === true || selectionState.savedSelectionAttribute === CURRENT_SELECTION_VALUE) {\n        openSaveDialog(resolveSuggestedSelectionName());\n        return;\n      }\n      if (selectionState.savedSelectionAttribute && selectionState.savedSelectionAttribute !== CURRENT_SELECTION_VALUE) {\n        try {\n          saveSelectionToAttribute(selectionState.savedSelectionAttribute);\n        } catch (error) {\n          setSelectionMessage(error instanceof Error ? error.message : String(error));\n        }\n      }\n    });\n\n    saveDialogCancel.addEventListener('click', () => {\n      closeSaveDialog();\n    });\n\n    saveDialog.addEventListener('cancel', (event) => {\n      event.preventDefault();\n      closeSaveDialog();\n    });\n\n    saveDialogInput.addEventListener('keydown', (event) => {\n      if (event.key !== 'Enter') return;\n      event.preventDefault();\n      saveDialogConfirm.click();\n    });\n\n    saveDialogConfirm.addEventListener('click', () => {\n      try {\n        saveSelectionToAttribute(saveDialogInput.value);\n        closeSaveDialog();\n      } catch (error) {\n        saveDialogError.textContent = error instanceof Error ? error.message : String(error);\n        saveDialogError.hidden = false;\n      }\n    });\n\n    const selectorBody = document.createElement('div');\n    selectorBody.appendChild(nodeSelectorEditor.element);\n\n    const selectorApplyWrap = document.createElement('div');\n    selectorApplyWrap.style.display = 'flex';\n    selectorApplyWrap.style.alignItems = 'center';\n    selectorApplyWrap.style.justifyContent = 'space-between';\n    selectorApplyWrap.style.gap = '12px';\n    selectorApplyWrap.style.marginTop = '8px';\n\n    autoReplaceToggle = createSegmentedToggleControl({\n      checked: false,\n      onLabel: 'Auto Replace',\n      offLabel: 'Manual',\n      ariaLabel: 'Automatically replace selection when selector changes',\n    });\n    autoReplaceToggle.style.transform = 'scale(0.92)';\n    autoReplaceToggle.style.transformOrigin = 'left center';\n    selectorApplyWrap.appendChild(autoReplaceToggle);\n\n    const selectorButtonsWrap = document.createElement('div');\n    selectorButtonsWrap.style.display = 'flex';\n    selectorButtonsWrap.style.alignItems = 'center';\n    selectorButtonsWrap.style.justifyContent = 'flex-end';\n    selectorButtonsWrap.style.gap = '8px';\n\n    const addMatchesButton = document.createElement('button');\n    addMatchesButton.type = 'button';\n    addMatchesButton.className = 'helios-ui-button';\n    addMatchesButton.textContent = 'Add';\n    addMatchesButton.setAttribute('aria-label', 'Add selector matches');\n    addMatchesButton.addEventListener('click', () => {\n      runNodeSelector('add');\n    });\n    selectorButtonsWrap.appendChild(addMatchesButton);\n\n    const replaceMatchesButton = document.createElement('button');\n    replaceMatchesButton.type = 'button';\n    replaceMatchesButton.className = 'helios-ui-button';\n    replaceMatchesButton.textContent = 'Replace';\n    replaceMatchesButton.setAttribute('aria-label', 'Replace node selection with selector matches');\n    replaceMatchesButton.addEventListener('click', () => {\n      runNodeSelector('replace');\n    });\n    selectorButtonsWrap.appendChild(replaceMatchesButton);\n    selectorApplyWrap.appendChild(selectorButtonsWrap);\n    nodeSelectorEditor.element.appendChild(selectorApplyWrap);\n\n    selectorApplyWrap.hidden = true;\n\n    const interactionBody = document.createElement('div');\n    const note = document.createElement('div');\n    note.className = 'helios-ui-label__hint';\n    note.style.margin = '0 0 10px';\n    note.textContent = 'Click selects. Double-click follows selected nodes. Shift-click adds or removes from the current selection.';\n    interactionBody.appendChild(note);\n\n    const nodeClickToggle = createToggleControl({\n      checked: selectionState.nodeClick,\n      ariaLabel: 'Node click selection',\n    });\n    nodeClickToggle.addEventListener('change', () => {\n      selectionBehavior.update({ nodeClick: nodeClickToggle.checked });\n    });\n    createRow(interactionBody, {\n      title: 'Node Click',\n      hint: 'Click nodes to select them. Shift-click toggles membership for multi-select.',\n      controls: nodeClickToggle,\n    });\n\n    const nodeHoverToggle = createToggleControl({\n      checked: hoverState.nodeHover,\n      ariaLabel: 'Node hover highlight',\n    });\n    nodeHoverToggle.addEventListener('change', () => {\n      hoverBehavior.update({ nodeHover: nodeHoverToggle.checked });\n      if (!nodeHoverToggle.checked) clearNodeHover();\n    });\n    createRow(interactionBody, {\n      title: 'Node Hover',\n      hint: 'Apply the dedicated virtual HOVER style to the single hovered node.',\n      controls: nodeHoverToggle,\n    });\n\n    const hoverAffectsOtherElementsToggle = createToggleControl({\n      checked: hoverState.hoverAffectsOtherElements === true,\n      ariaLabel: 'Dim other elements on hover',\n    });\n    hoverAffectsOtherElementsToggle.addEventListener('change', () => {\n      hoverBehavior.update({ hoverAffectsOtherElements: hoverAffectsOtherElementsToggle.checked });\n    });\n    createRow(interactionBody, {\n      title: 'Dim Others on Hover',\n      hint: 'Apply the non-highlight style to other elements during virtual HOVER. Disabled by default; real HIGHLIGHTED groups still dim others.',\n      controls: hoverAffectsOtherElementsToggle,\n    });\n\n    const renderOrderToggle = createToggleControl({\n      checked: helios.interactionRenderOrder?.() !== false,\n      ariaLabel: 'Interaction render order',\n    });\n    renderOrderToggle.addEventListener('change', () => {\n      helios.interactionRenderOrder?.(renderOrderToggle.checked);\n    });\n    createRow(interactionBody, {\n      title: 'Render on Top',\n      hint: 'Draw hovered, highlighted, and selected items later in their node or edge pass by promoting active index order.',\n      controls: renderOrderToggle,\n    });\n\n    appendSectionHeading(interactionBody, 'Connected Edges');\n\n    const hoverConnectedEdgesToggle = createToggleControl({\n      checked: hoverState.hoverConnectedEdges,\n      ariaLabel: 'Connected edges on hover',\n    });\n    hoverConnectedEdgesToggle.addEventListener('change', () => {\n      hoverBehavior.update({ hoverConnectedEdges: hoverConnectedEdgesToggle.checked });\n    });\n    createRow(interactionBody, {\n      title: 'Hover',\n      hint: 'Apply the dedicated virtual HOVER edge style to incident edges while a node is hovered, without mutating edge state buffers.',\n      controls: hoverConnectedEdgesToggle,\n    });\n\n    const highlightConnectedEdgesToggle = createToggleControl({\n      checked: hoverState.highlightConnectedEdges === true,\n      ariaLabel: 'Connected edges on highlight',\n    });\n    highlightConnectedEdgesToggle.addEventListener('change', () => {\n      hoverBehavior.update({ highlightConnectedEdges: highlightConnectedEdgesToggle.checked });\n    });\n    createRow(interactionBody, {\n      title: 'Highlight',\n      hint: 'Apply the real HIGHLIGHTED edge style to edges incident to source-managed highlighted nodes, such as legend hover.',\n      controls: highlightConnectedEdgesToggle,\n    });\n\n    const selectedConnectedEdgesToggle = createToggleControl({\n      checked: selectionState.selectedConnectedEdges,\n      ariaLabel: 'Connected edges on selection',\n    });\n    selectedConnectedEdgesToggle.addEventListener('change', () => {\n      selectionBehavior.update({ selectedConnectedEdges: selectedConnectedEdgesToggle.checked });\n    });\n    createRow(interactionBody, {\n      title: 'Selected',\n      hint: 'Apply the selected edge style to edges incident to selected nodes through a specialized shader path.',\n      controls: selectedConnectedEdgesToggle,\n    });\n\n    const edgeClickToggle = createToggleControl({\n      checked: selectionState.edgeClick,\n      ariaLabel: 'Edge click selection',\n    });\n    edgeClickToggle.addEventListener('change', () => {\n      selectionBehavior.update({ edgeClick: edgeClickToggle.checked });\n    });\n    createRow(interactionBody, {\n      title: 'Edge Click',\n      hint: 'Enable edge selection. Disabled by default so node picking stays primary in the example.',\n      controls: edgeClickToggle,\n    });\n\n    const edgeHoverToggle = createToggleControl({\n      checked: hoverState.edgeHover,\n      ariaLabel: 'Edge hover highlight',\n    });\n    edgeHoverToggle.addEventListener('change', () => {\n      hoverBehavior.update({ edgeHover: edgeHoverToggle.checked });\n      if (!edgeHoverToggle.checked) clearEdgeHover();\n    });\n    createRow(interactionBody, {\n      title: 'Edge Hover',\n      hint: 'Apply the dedicated virtual HOVER style to the single hovered edge.',\n      controls: edgeHoverToggle,\n    });\n\n    const hoverLabelToggle = createToggleControl({\n      checked: hoverState.hoverLabel,\n      ariaLabel: 'Hover label',\n    });\n    hoverLabelToggle.addEventListener('change', () => {\n      hoverBehavior.update({ hoverLabel: hoverLabelToggle.checked });\n    });\n    createRow(interactionBody, {\n      title: 'Hover Label',\n      hint: 'Show a temporary SVG label only for the currently hovered node.',\n      controls: hoverLabelToggle,\n    });\n\n    const hoverLabelSourceSelect = createSelectControl({\n      ariaLabel: 'Hover label source',\n      compact: false,\n    });\n    hoverLabelSourceSelect.addEventListener('change', () => {\n      hoverBehavior.update({ hoverLabelSource: hoverLabelSourceSelect.value || 'auto' });\n    });\n    createRow(interactionBody, {\n      title: 'Label Source',\n      hint: 'Node string attribute used for the hover label. Auto prefers label-like names before falling back to $id.',\n      controls: hoverLabelSourceSelect,\n    });\n\n    const createColorControl = ({ ariaLabel, getValue, setValue, fallback }) => {\n      const row = document.createElement('div');\n      row.style.display = 'flex';\n      row.style.alignItems = 'center';\n      row.style.gap = '8px';\n      row.style.width = '100%';\n\n      const swatchWrap = document.createElement('div');\n      swatchWrap.className = 'helios-ui-color-swatch';\n\n      const swatch = document.createElement('div');\n      swatch.className = 'helios-ui-color-swatch__swatch';\n\n      const colorInput = document.createElement('input');\n      colorInput.type = 'color';\n      colorInput.className = 'helios-ui-color-swatch__input';\n      colorInput.setAttribute('aria-label', `${ariaLabel} color`);\n\n      const alphaLabel = document.createElement('span');\n      alphaLabel.textContent = 'Alpha';\n      alphaLabel.style.color = 'var(--helios-ui-muted)';\n\n      const alphaInput = document.createElement('input');\n      alphaInput.type = 'number';\n      alphaInput.className = 'helios-ui-number';\n      alphaInput.min = '0';\n      alphaInput.max = '1';\n      alphaInput.step = '0.01';\n      alphaInput.style.maxWidth = '88px';\n      alphaInput.setAttribute('aria-label', `${ariaLabel} alpha`);\n\n      const refresh = () => {\n        const hex8 = rgbaToHexWithAlpha(getValue(), rgbaToHexWithAlpha(fallback));\n        colorInput.value = `#${hex8.slice(1, 7)}`;\n        alphaInput.value = String(Math.round((Number.parseInt(hex8.slice(7, 9), 16) / 255) * 100) / 100);\n        swatch.style.background = colorInput.value;\n      };\n\n      const commit = () => {\n        const alpha = clampNumber(alphaInput.value, { min: 0, max: 1 });\n        if (alpha == null) return;\n        setValue(hexWithAlphaToRgba(toHex8(colorInput.value, alpha), fallback));\n        refresh();\n      };\n\n      colorInput.addEventListener('input', commit);\n      alphaInput.addEventListener('change', commit);\n\n      swatchWrap.appendChild(swatch);\n      swatchWrap.appendChild(colorInput);\n      row.appendChild(swatchWrap);\n      row.appendChild(alphaLabel);\n      row.appendChild(alphaInput);\n\n      return {\n        element: row,\n        refresh,\n        destroy: () => {\n          colorInput.removeEventListener('input', commit);\n          alphaInput.removeEventListener('change', commit);\n        },\n      };\n    };\n\n    const sliderControls = [];\n    const colorControls = [];\n\n    const createNodeStyleSection = (container, stateKey, fallback, options = {}) => {\n      appendSectionHeading(container, 'Nodes');\n      const getter = options.getStyle ?? (() => normalizeNodeStyle(helios.nodeStateStyle?.(stateKey), fallback));\n      const patch = options.patchStyle ?? ((changes) => {\n        helios.nodeStateStyle?.(stateKey, normalizeNodeStyle({ ...getter(), ...changes }, fallback));\n      });\n      const toneGetter = options.getTone ?? null;\n      const tonePatch = options.patchTone ?? null;\n\n      const sizeControls = new SuggestedSliderControls({\n        value: getter().sizeMul,\n        suggested: [0, 3],\n        step: 0.05,\n        inputMin: 0,\n        onCommit: (value) => patch({ sizeMul: normalizeNonNegativeNumber(value, getter().sizeMul) }),\n      });\n      sliderControls.push(sizeControls);\n      createRow(container, {\n        title: 'Size',\n        hint: 'Multiplier applied to node size while this state is active.',\n        controls: sizeControls.element,\n      });\n\n      const opacityControls = new SuggestedSliderControls({\n        value: getter().opacityMul,\n        suggested: [0, 5],\n        step: 0.05,\n        inputMin: 0,\n        onCommit: (value) => patch({ opacityMul: normalizeNonNegativeNumber(value, getter().opacityMul) }),\n      });\n      sliderControls.push(opacityControls);\n      const opacityRow = createRow(container, {\n        title: 'Opacity Gain',\n        hint: 'Gain applied to node opacity for this state. The slider suggests a typical range, but typed values can be any non-negative number.',\n        controls: opacityControls.element,\n      });\n      opacityRow.row.dataset.heliosSelectionStyleTarget = 'node';\n      opacityRow.row.dataset.heliosSelectionStyleProperty = 'opacityMul';\n\n      const outlineControls = new SuggestedSliderControls({\n        value: getter().outlineMul,\n        suggested: [0, 3],\n        step: 0.05,\n        inputMin: 0,\n        onCommit: (value) => patch({ outlineMul: normalizeNonNegativeNumber(value, getter().outlineMul) }),\n      });\n      sliderControls.push(outlineControls);\n      createRow(container, {\n        title: 'Outline',\n        hint: 'Multiplier applied to node outline width for this state.',\n        controls: outlineControls.element,\n      });\n\n      const discardToggle = createToggleControl({\n        checked: getter().discard,\n        ariaLabel: `${stateKey.toLowerCase()} node discard`,\n      });\n      discardToggle.addEventListener('change', () => patch({ discard: discardToggle.checked }));\n      createRow(container, {\n        title: 'Discard',\n        hint: 'Discard matched nodes entirely in the fragment shader.',\n        controls: discardToggle,\n      });\n\n      let forceMaxAlphaToggle = null;\n      if (options.allowForceMaxAlpha !== false) {\n        forceMaxAlphaToggle = createToggleControl({\n          checked: getter().forceMaxAlpha === true,\n          ariaLabel: `${stateKey.toLowerCase()} node force max alpha`,\n        });\n        forceMaxAlphaToggle.addEventListener('change', () => patch({ forceMaxAlpha: forceMaxAlphaToggle.checked }));\n        createRow(container, {\n          title: 'Visibility Boost',\n          hint: 'Force full opacity in normal blending and apply a strong accumulation boost in weighted transparency whenever this state slot is active.',\n          controls: forceMaxAlphaToggle,\n        });\n      }\n\n      const tintControls = createColorControl({\n        ariaLabel: `${stateKey.toLowerCase()} node tint`,\n        getValue: () => getter().colorAdd,\n        setValue: (value) => patch({ colorAdd: value }),\n        fallback: fallback.colorAdd,\n      });\n      colorControls.push(tintControls);\n      createRow(container, {\n        title: 'Tint',\n        hint: 'Additive RGBA tint applied after the base node color.',\n        controls: tintControls.element,\n      });\n\n      const blendControls = createColorControl({\n        ariaLabel: `${stateKey.toLowerCase()} node blend`,\n        getValue: () => getter().colorMul,\n        setValue: (value) => patch({ colorMul: value }),\n        fallback: fallback.colorMul,\n      });\n      colorControls.push(blendControls);\n      createRow(container, {\n        title: 'Blend',\n        hint: 'Multiplicative RGBA blend applied to the base node color.',\n        controls: blendControls.element,\n      });\n\n      let autoColorToggle = null;\n      let autoMixControls = null;\n      if (toneGetter && tonePatch) {\n        autoColorToggle = createToggleControl({\n          checked: toneGetter().enabled === true,\n          ariaLabel: `${stateKey.toLowerCase()} node auto color`,\n        });\n        autoColorToggle.addEventListener('change', () => tonePatch({ enabled: autoColorToggle.checked }));\n        createRow(container, {\n          title: 'Auto Color',\n          hint: 'Use the scene background to choose blend or tint automatically. Manual tint and blend stay available when this is off.',\n          controls: autoColorToggle,\n        });\n\n        autoMixControls = new SuggestedSliderControls({\n          value: toneGetter().amount,\n          suggested: [0, 1],\n          step: 0.05,\n          inputMin: 0,\n          inputMax: 1,\n          onCommit: (value) => tonePatch({ amount: clampNumber(value, { min: 0, max: 1 }) ?? toneGetter().amount }),\n        });\n        sliderControls.push(autoMixControls);\n        createRow(container, {\n          title: 'Auto Mix',\n          hint: 'Controls how strongly the automatic background-matched color treatment pulls other nodes toward the scene background.',\n          controls: autoMixControls.element,\n        });\n      }\n\n      return () => {\n        const current = getter();\n        sizeControls.set(current.sizeMul);\n        opacityControls.set(current.opacityMul);\n        outlineControls.set(current.outlineMul);\n        discardToggle.checked = current.discard;\n        if (forceMaxAlphaToggle) forceMaxAlphaToggle.checked = current.forceMaxAlpha === true;\n        tintControls.refresh();\n        blendControls.refresh();\n        if (autoColorToggle) autoColorToggle.checked = toneGetter().enabled === true;\n        if (autoMixControls) autoMixControls.set(toneGetter().amount);\n      };\n    };\n\n    const createEdgeStyleSection = (container, stateKey, fallback, options = {}) => {\n      appendSectionHeading(container, 'Edges');\n      const getter = options.getStyle ?? (() => normalizeEdgeStyle(helios.edgeStateStyle?.(stateKey), fallback));\n      const patch = options.patchStyle ?? ((changes) => {\n        helios.edgeStateStyle?.(stateKey, normalizeEdgeStyle({ ...getter(), ...changes }, fallback));\n      });\n      const toneGetter = options.getTone ?? null;\n      const tonePatch = options.patchTone ?? null;\n\n      const widthControls = new SuggestedSliderControls({\n        value: getter().widthMul,\n        suggested: [0, 3],\n        step: 0.05,\n        inputMin: 0,\n        onCommit: (value) => patch({ widthMul: normalizeNonNegativeNumber(value, getter().widthMul) }),\n      });\n      sliderControls.push(widthControls);\n      createRow(container, {\n        title: 'Width',\n        hint: 'Multiplier applied to edge width while this state is active.',\n        controls: widthControls.element,\n      });\n\n      const opacityControls = new SuggestedSliderControls({\n        value: getter().opacityMul,\n        suggested: [0, 5],\n        step: 0.05,\n        inputMin: 0,\n        onCommit: (value) => patch({ opacityMul: normalizeNonNegativeNumber(value, getter().opacityMul) }),\n      });\n      sliderControls.push(opacityControls);\n      const opacityRow = createRow(container, {\n        title: 'Opacity Gain',\n        hint: 'Gain applied to edge opacity for this state. The slider suggests a typical range, but typed values can be any non-negative number.',\n        controls: opacityControls.element,\n      });\n      opacityRow.row.dataset.heliosSelectionStyleTarget = 'edge';\n      opacityRow.row.dataset.heliosSelectionStyleProperty = 'opacityMul';\n\n      const discardToggle = createToggleControl({\n        checked: getter().discard,\n        ariaLabel: `${stateKey.toLowerCase()} edge discard`,\n      });\n      discardToggle.addEventListener('change', () => patch({ discard: discardToggle.checked }));\n      createRow(container, {\n        title: 'Discard',\n        hint: 'Discard matched edges entirely in the fragment shader.',\n        controls: discardToggle,\n      });\n\n      let forceMaxAlphaToggle = null;\n      if (options.allowForceMaxAlpha !== false) {\n        forceMaxAlphaToggle = createToggleControl({\n          checked: getter().forceMaxAlpha === true,\n          ariaLabel: `${stateKey.toLowerCase()} edge force max alpha`,\n        });\n        forceMaxAlphaToggle.addEventListener('change', () => patch({ forceMaxAlpha: forceMaxAlphaToggle.checked }));\n        createRow(container, {\n          title: 'Visibility Boost',\n          hint: 'Force full opacity in normal blending and apply a strong accumulation boost in weighted transparency whenever this state slot is active.',\n          controls: forceMaxAlphaToggle,\n        });\n      }\n\n      const tintControls = createColorControl({\n        ariaLabel: `${stateKey.toLowerCase()} edge tint`,\n        getValue: () => getter().colorAdd,\n        setValue: (value) => patch({ colorAdd: value }),\n        fallback: fallback.colorAdd,\n      });\n      colorControls.push(tintControls);\n      createRow(container, {\n        title: 'Tint',\n        hint: 'Additive RGBA tint applied after the base edge color.',\n        controls: tintControls.element,\n      });\n\n      const blendControls = createColorControl({\n        ariaLabel: `${stateKey.toLowerCase()} edge blend`,\n        getValue: () => getter().colorMul,\n        setValue: (value) => patch({ colorMul: value }),\n        fallback: fallback.colorMul,\n      });\n      colorControls.push(blendControls);\n      createRow(container, {\n        title: 'Blend',\n        hint: 'Multiplicative RGBA blend applied to the base edge color.',\n        controls: blendControls.element,\n      });\n\n      let autoColorToggle = null;\n      let autoMixControls = null;\n      if (toneGetter && tonePatch) {\n        autoColorToggle = createToggleControl({\n          checked: toneGetter().enabled === true,\n          ariaLabel: `${stateKey.toLowerCase()} edge auto color`,\n        });\n        autoColorToggle.addEventListener('change', () => tonePatch({ enabled: autoColorToggle.checked }));\n        createRow(container, {\n          title: 'Auto Color',\n          hint: 'Use the scene background to choose blend or tint automatically. Manual tint and blend stay available when this is off.',\n          controls: autoColorToggle,\n        });\n\n        autoMixControls = new SuggestedSliderControls({\n          value: toneGetter().amount,\n          suggested: [0, 1],\n          step: 0.05,\n          inputMin: 0,\n          inputMax: 1,\n          onCommit: (value) => tonePatch({ amount: clampNumber(value, { min: 0, max: 1 }) ?? toneGetter().amount }),\n        });\n        sliderControls.push(autoMixControls);\n        createRow(container, {\n          title: 'Auto Mix',\n          hint: 'Controls how strongly the automatic background-matched color treatment pulls other edges toward the scene background.',\n          controls: autoMixControls.element,\n        });\n      }\n\n      return () => {\n        const current = getter();\n        widthControls.set(current.widthMul);\n        opacityControls.set(current.opacityMul);\n        discardToggle.checked = current.discard;\n        if (forceMaxAlphaToggle) forceMaxAlphaToggle.checked = current.forceMaxAlpha === true;\n        tintControls.refresh();\n        blendControls.refresh();\n        if (autoColorToggle) autoColorToggle.checked = toneGetter().enabled === true;\n        if (autoMixControls) autoMixControls.set(toneGetter().amount);\n      };\n    };\n\n    const selectedBody = document.createElement('div');\n    const refreshSelectedNode = createNodeStyleSection(selectedBody, 'SELECTED', DEFAULT_NODE_SELECTED_STYLE);\n    const refreshSelectedEdge = createEdgeStyleSection(selectedBody, 'SELECTED', DEFAULT_EDGE_SELECTED_STYLE);\n\n    const hoverBody = document.createElement('div');\n    const hoverCopyToggle = createToggleControl({\n      checked: hoverState.hoverStyleFromHighlight === true,\n      ariaLabel: 'Copy hover style from highlighted',\n    });\n    hoverCopyToggle.addEventListener('change', () => {\n      hoverBehavior.update({ hoverStyleFromHighlight: hoverCopyToggle.checked });\n    });\n    createRow(hoverBody, {\n      title: 'Use Highlight Style',\n      hint: 'Copy the real HIGHLIGHTED node and edge styles into the virtual HOVER style. Disabled by default so hover and group highlight stay visually distinct.',\n      controls: hoverCopyToggle,\n    });\n\n    const hoverCopyNote = document.createElement('div');\n    hoverCopyNote.className = 'helios-ui-label__hint';\n    hoverCopyNote.style.display = 'none';\n    hoverCopyNote.style.margin = '8px 0 10px';\n    hoverCopyNote.style.padding = '8px 10px';\n    hoverCopyNote.style.border = '1px solid rgba(128, 128, 128, 0.42)';\n    hoverCopyNote.style.borderRadius = '6px';\n    hoverCopyNote.style.background = 'rgba(128, 128, 128, 0.10)';\n    hoverCopyNote.textContent = 'HOVER is currently copying HIGHLIGHTED. Hover style controls are shown read-only until this option is disabled.';\n    hoverBody.appendChild(hoverCopyNote);\n\n    const hoverStyleControls = document.createElement('div');\n    hoverBody.appendChild(hoverStyleControls);\n    const refreshHoverNode = createNodeStyleSection(hoverStyleControls, 'HOVER', DEFAULT_NODE_HOVER_STYLE, {\n      getStyle: () => normalizeNodeStyle(helios.nodeHoverStyle?.(), DEFAULT_NODE_HOVER_STYLE),\n      patchStyle: (changes) => {\n        helios.nodeHoverStyle?.(normalizeNodeStyle({ ...normalizeNodeStyle(helios.nodeHoverStyle?.(), DEFAULT_NODE_HOVER_STYLE), ...changes }, DEFAULT_NODE_HOVER_STYLE));\n      },\n    });\n    const refreshHoverEdge = createEdgeStyleSection(hoverStyleControls, 'HOVER', DEFAULT_EDGE_HOVER_STYLE, {\n      getStyle: () => normalizeEdgeStyle(helios.edgeHoverStyle?.(), DEFAULT_EDGE_HOVER_STYLE),\n      patchStyle: (changes) => {\n        helios.edgeHoverStyle?.(normalizeEdgeStyle({ ...normalizeEdgeStyle(helios.edgeHoverStyle?.(), DEFAULT_EDGE_HOVER_STYLE), ...changes }, DEFAULT_EDGE_HOVER_STYLE));\n      },\n    });\n\n    const highlightBody = document.createElement('div');\n    const refreshHighlightNode = createNodeStyleSection(highlightBody, 'HIGHLIGHTED', DEFAULT_NODE_HIGHLIGHT_STYLE);\n    const refreshHighlightEdge = createEdgeStyleSection(highlightBody, 'HIGHLIGHTED', DEFAULT_EDGE_HIGHLIGHT_STYLE);\n\n    const normalBody = document.createElement('div');\n    const normalNote = document.createElement('div');\n    normalNote.className = 'helios-ui-label__hint';\n    normalNote.style.margin = '0 0 10px';\n    normalNote.textContent = 'Applies to non-selected, non-highlighted elements while a selection or active highlight exists. Selection takes precedence over highlight.';\n    normalBody.appendChild(normalNote);\n\n    appendSectionHeading(normalBody, 'When Selected');\n    const refreshSelectedOtherNode = createNodeStyleSection(normalBody, 'other-selected', defaultOtherSelectedNodeStyle, {\n      allowForceMaxAlpha: false,\n      getStyle: () => normalizeNodeStyle(selectionState.otherSelectedNodeStyle, defaultOtherSelectedNodeStyle),\n      patchStyle: (changes) => {\n        selectionBehavior.update({\n          otherSelectedNodeStyle: normalizeNodeStyle({ ...selectionState.otherSelectedNodeStyle, ...changes }, defaultOtherSelectedNodeStyle),\n        });\n      },\n      getTone: () => normalizeAutoBackgroundTone(selectionState.otherSelectedNodeTone, DEFAULT_AUTO_BACKGROUND_TONE_SELECTED),\n      patchTone: (changes) => {\n        selectionBehavior.update({\n          otherSelectedNodeTone: normalizeAutoBackgroundTone(\n            { ...selectionState.otherSelectedNodeTone, ...changes },\n            DEFAULT_AUTO_BACKGROUND_TONE_SELECTED,\n          ),\n        });\n      },\n    });\n    const refreshSelectedOtherEdge = createEdgeStyleSection(normalBody, 'other-selected', defaultOtherSelectedEdgeStyle, {\n      allowForceMaxAlpha: false,\n      getStyle: () => normalizeEdgeStyle(selectionState.otherSelectedEdgeStyle, defaultOtherSelectedEdgeStyle),\n      patchStyle: (changes) => {\n        selectionBehavior.update({\n          otherSelectedEdgeStyle: normalizeEdgeStyle({ ...selectionState.otherSelectedEdgeStyle, ...changes }, defaultOtherSelectedEdgeStyle),\n        });\n      },\n      getTone: () => normalizeAutoBackgroundTone(selectionState.otherSelectedEdgeTone, DEFAULT_AUTO_BACKGROUND_TONE_SELECTED),\n      patchTone: (changes) => {\n        selectionBehavior.update({\n          otherSelectedEdgeTone: normalizeAutoBackgroundTone(\n            { ...selectionState.otherSelectedEdgeTone, ...changes },\n            DEFAULT_AUTO_BACKGROUND_TONE_SELECTED,\n          ),\n        });\n      },\n    });\n\n    appendSectionHeading(normalBody, 'When Highlighted');\n    const refreshHighlightOtherNode = createNodeStyleSection(normalBody, 'other-highlighted', defaultOtherHighlightNodeStyle, {\n      allowForceMaxAlpha: false,\n      getStyle: () => normalizeNodeStyle(hoverState.otherHighlightNodeStyle, defaultOtherHighlightNodeStyle),\n      patchStyle: (changes) => {\n        hoverBehavior.update({\n          otherHighlightNodeStyle: normalizeNodeStyle({ ...hoverState.otherHighlightNodeStyle, ...changes }, defaultOtherHighlightNodeStyle),\n        });\n      },\n      getTone: () => normalizeAutoBackgroundTone(hoverState.otherHighlightNodeTone, DEFAULT_AUTO_BACKGROUND_TONE_DISABLED),\n      patchTone: (changes) => {\n        hoverBehavior.update({\n          otherHighlightNodeTone: normalizeAutoBackgroundTone(\n            { ...hoverState.otherHighlightNodeTone, ...changes },\n            DEFAULT_AUTO_BACKGROUND_TONE_DISABLED,\n          ),\n        });\n      },\n    });\n    const refreshHighlightOtherEdge = createEdgeStyleSection(normalBody, 'other-highlighted', defaultOtherHighlightEdgeStyle, {\n      allowForceMaxAlpha: false,\n      getStyle: () => normalizeEdgeStyle(hoverState.otherHighlightEdgeStyle, defaultOtherHighlightEdgeStyle),\n      patchStyle: (changes) => {\n        hoverBehavior.update({\n          otherHighlightEdgeStyle: normalizeEdgeStyle({ ...hoverState.otherHighlightEdgeStyle, ...changes }, defaultOtherHighlightEdgeStyle),\n        });\n      },\n      getTone: () => normalizeAutoBackgroundTone(hoverState.otherHighlightEdgeTone, DEFAULT_AUTO_BACKGROUND_TONE_DISABLED),\n      patchTone: (changes) => {\n        hoverBehavior.update({\n          otherHighlightEdgeTone: normalizeAutoBackgroundTone(\n            { ...hoverState.otherHighlightEdgeTone, ...changes },\n            DEFAULT_AUTO_BACKGROUND_TONE_DISABLED,\n          ),\n        });\n      },\n    });\n\n    const refreshStyleControls = () => {\n      refreshSelectedNode();\n      refreshSelectedEdge();\n      refreshHoverNode();\n      refreshHoverEdge();\n      refreshHighlightNode();\n      refreshHighlightEdge();\n      refreshSelectedOtherNode();\n      refreshSelectedOtherEdge();\n      refreshHighlightOtherNode();\n      refreshHighlightOtherEdge();\n      const copyHover = hoverState.hoverStyleFromHighlight === true || helios.hoverStyleFromHighlight?.() === true;\n      hoverCopyToggle.checked = copyHover;\n      hoverCopyNote.style.display = copyHover ? 'block' : 'none';\n      hoverStyleControls.style.opacity = copyHover ? '0.56' : '';\n      hoverStyleControls.style.pointerEvents = copyHover ? 'none' : '';\n      renderOrderToggle.checked = helios.interactionRenderOrder?.() !== false;\n      hoverConnectedEdgesToggle.checked = hoverState.hoverConnectedEdges === true;\n      hoverAffectsOtherElementsToggle.checked = hoverState.hoverAffectsOtherElements === true;\n      highlightConnectedEdgesToggle.checked = hoverState.highlightConnectedEdges === true && helios.highlightConnectedEdges?.() === true;\n    };\n\n    const styleBody = document.createElement('div');\n    const styleStack = new PanelStack();\n    styleStack.add({\n      id: 'selection-style-interaction',\n      title: 'Interaction',\n      collapsed: true,\n      statusDot: false,\n      content: interactionBody,\n    });\n    styleStack.add({\n      id: 'selection-style-selected',\n      title: 'Selected',\n      collapsed: true,\n      statusDot: false,\n      content: selectedBody,\n    });\n    styleStack.add({\n      id: 'selection-style-hover',\n      title: 'Hover',\n      collapsed: true,\n      statusDot: false,\n      content: hoverBody,\n    });\n    styleStack.add({\n      id: 'selection-style-highlight',\n      title: 'Highlight',\n      collapsed: true,\n      statusDot: false,\n      content: highlightBody,\n    });\n    styleStack.add({\n      id: 'selection-style-normal',\n      title: 'Other Elements',\n      collapsed: true,\n      statusDot: false,\n      content: normalBody,\n    });\n    styleBody.appendChild(styleStack.element);\n\n    content.appendChild(statusEl);\n    content.appendChild(actionsWrap);\n    content.appendChild(savedSelectionWrap);\n    content.appendChild(selectionMessageEl);\n\n    const stack = new PanelStack();\n    stack.add({\n      id: 'selection-selectors',\n      title: 'Selectors',\n      collapsed: true,\n      statusDot: false,\n      headerControls: [\n        createPanelSchemaIndicator({\n          helios,\n          schema: SELECTION_PANEL_SCHEMA,\n          sectionId: 'selectors',\n          attachTooltip: tooltips.attachTooltip,\n        }),\n        nodeSelectorEditor.addSelect,\n      ],\n      content: selectorBody,\n    });\n    selectorStackEntry = stack._items.get('selection-selectors') ?? null;\n    stack.add({\n      id: 'selection-style',\n      title: 'Style',\n      collapsed: true,\n      statusDot: false,\n      headerControls: createPanelSchemaIndicator({\n        helios,\n        schema: SELECTION_PANEL_SCHEMA,\n        sectionId: 'style',\n        attachTooltip: tooltips.attachTooltip,\n      }),\n      content: styleBody,\n    });\n    content.appendChild(stack.element);\n\n    const refreshHoverLabelOptions = () => {\n      const network = helios.network ?? null;\n      const preferred = resolvePreferredHoverLabelSource(network);\n      const names = resolveStringAttributeNames(network);\n      const options = [\n        { value: 'auto', label: `Auto (${preferred})` },\n        { value: '$id', label: '$id' },\n        ...names.map((name) => ({ value: name, label: name })),\n      ];\n      hoverLabelSourceSelect.setOptions(options, hoverState.hoverLabelSource);\n      if (!options.some((entry) => entry.value === hoverState.hoverLabelSource)) {\n        hoverState.hoverLabelSource = 'auto';\n        hoverLabelSourceSelect.value = 'auto';\n      }\n    };\n\n    let networkAttributeUnsub = null;\n    const attachNetworkAttributeListeners = () => {\n      if (networkAttributeUnsub) {\n        networkAttributeUnsub();\n        networkAttributeUnsub = null;\n      }\n      const network = helios.network ?? null;\n      if (!network) return;\n      const handler = (event) => {\n        const scope = event?.detail?.scope;\n        const type = event?.type ?? '';\n        if ((!scope || scope === 'node') && (\n          type !== 'attribute:changed'\n          || event?.detail?.op === 'categorize'\n          || event?.detail?.op === 'decategorize'\n        )) {\n          nodeSelectorEditor.refreshFromNetwork();\n        }\n        if (!scope || scope === 'node' || scope === 'edge') {\n          refreshSavedSelectionOptions();\n        }\n      };\n      if (typeof network.on === 'function') {\n        const unsubs = [\n          network.on('attribute:defined', handler),\n          network.on('attribute:removed', handler),\n          network.on('attribute:changed', handler),\n        ];\n        networkAttributeUnsub = () => {\n          for (const unsubscribe of unsubs) unsubscribe?.();\n        };\n      } else if (typeof network.addEventListener === 'function') {\n        network.addEventListener('attribute:defined', handler);\n        network.addEventListener('attribute:removed', handler);\n        network.addEventListener('attribute:changed', handler);\n        networkAttributeUnsub = () => {\n          network.removeEventListener('attribute:defined', handler);\n          network.removeEventListener('attribute:removed', handler);\n          network.removeEventListener('attribute:changed', handler);\n        };\n      }\n    };\n\n    refreshHoverLabelOptions();\n    refreshSavedSelectionOptions();\n    nodeSelectorEditor.refreshFromNetwork();\n    selectorInterfaceCount = getSelectorInterfaceCount();\n    updateSelectorSectionAvailability(selectorInterfaceCount);\n    refreshStyleControls();\n    refreshStatus();\n    attachNetworkAttributeListeners();\n\n    const unsubscribers = [\n      selectionBehavior.on('change', () => {\n        refreshStatus();\n        refreshSavedSelectionOptions();\n        refreshStyleControls();\n      }),\n      hoverBehavior.on('change', () => {\n        refreshStyleControls();\n        refreshHoverLabelOptions();\n      }),\n      subscribe(helios, 'ui:binding-change', (event) => {\n        if (event?.detail?.name === 'interactionRenderOrder') refreshStyleControls();\n      }),\n    ];\n\n    this.ui._controlCleanups.add(() => tooltips.destroy());\n    this.ui._controlCleanups.add(() => {\n      for (const controls of sliderControls) controls.destroy();\n      for (const controls of colorControls) controls.destroy();\n      for (const unsubscribe of unsubscribers) unsubscribe();\n      networkAttributeUnsub?.();\n      nodeSelectorEditor.destroy();\n      closeSaveDialog();\n      saveDialog.remove();\n      styleStack.destroy();\n      stack.destroy();\n    });\n\n    const panel = this.ui.createPanel({\n      id: this.options.id ?? 'helios-ui-selection',\n      title: this.options.title ?? 'Selection',\n      position: this.options.position ?? { x: 16, y: 960 },\n      dock: this.options.dock ?? 'top-right',\n      panelSchema: SELECTION_PANEL_SCHEMA,\n      content,\n    });\n    panel.selectionState = selectionState;\n    panel.selectionBehavior = selectionBehavior;\n    panel.hoverState = hoverState;\n    panel.hoverBehavior = hoverBehavior;\n    panel.labelsBehavior = labelsBehavior ?? null;\n    panel.refreshSelectionPanel = () => {\n      nodeSelectorEditor.refreshFromNetwork();\n      selectorInterfaceCount = getSelectorInterfaceCount();\n      updateSelectorSectionAvailability(selectorInterfaceCount);\n      refreshHoverLabelOptions();\n      refreshSavedSelectionOptions();\n      refreshStyleControls();\n      refreshStatus();\n    };\n    return panel;\n  }\n}\n\nexport default SelectionPanel;\n","/**\n * Built-in figure size presets for Helios exports.\n *\n * @public\n * @remarks Presets include current-window sizes, common video/print raster\n * sizes, and a custom target. Availability still depends on renderer texture\n * limits and requested supersampling.\n */\nexport const FIGURE_EXPORT_PRESETS = Object.freeze([\n  { id: 'window', label: 'Window' },\n  { id: 'window@x2', label: 'Window @2x' },\n  { id: 'window@x4', label: 'Window @4x' },\n  { id: '1080p', label: '1080p' },\n  { id: '4k', label: '4K' },\n  { id: '8k', label: '8K' },\n  { id: 'custom', label: 'Custom' },\n]);\n\nconst PRESET_DIMENSIONS = Object.freeze({\n  '1080p': Object.freeze({ width: 1920, height: 1080 }),\n  '4k': Object.freeze({ width: 3840, height: 2160 }),\n  '8k': Object.freeze({ width: 7680, height: 4320 }),\n});\n\nfunction approximatelyEqual(a, b, epsilon = 1e-6) {\n  return Math.abs(Number(a) - Number(b)) <= epsilon;\n}\n\nfunction normalizePositiveNumber(value, fallback = 1) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric) || numeric <= 0) return fallback;\n  return numeric;\n}\n\nfunction formatWindowScale(value) {\n  const numeric = normalizePositiveNumber(value, 1);\n  if (approximatelyEqual(numeric, Math.round(numeric))) return String(Math.round(numeric));\n  return numeric.toFixed(2).replace(/\\.?0+$/u, '');\n}\n\nfunction resolveWindowPresetScale(preset) {\n  const safePreset = String(preset ?? '').trim().toLowerCase();\n  if (safePreset === 'window') return 1;\n  const fixedMatch = safePreset.match(/^window@x(\\d+(?:\\.\\d+)?)$/u);\n  if (fixedMatch) return normalizePositiveNumber(fixedMatch[1], 1);\n  const match = safePreset.match(/^window@(\\d+(?:\\.\\d+)?)x$/u);\n  if (!match) return null;\n  return normalizePositiveNumber(match[1], 1);\n}\n\nexport function getDefaultFigureExportPreset(windowDevicePixelRatio = 1) {\n  const dpr = normalizePositiveNumber(windowDevicePixelRatio, 1);\n  if (approximatelyEqual(dpr, 1)) return 'window';\n  if (approximatelyEqual(dpr, 2)) return 'window@x2';\n  if (approximatelyEqual(dpr, 4)) return 'window@x4';\n  return `window@${formatWindowScale(dpr)}x`;\n}\n\nexport function resolveFigurePreviewRect(outputWidth, outputHeight, windowSize = {}) {\n  const windowWidth = clampInt(windowSize.width, 1, 1);\n  const windowHeight = clampInt(windowSize.height, 1, 1);\n  const targetAspect = Math.max(1e-6, Number(outputWidth) / Math.max(1, Number(outputHeight)));\n  const windowAspect = windowWidth / Math.max(1, windowHeight);\n  if (approximatelyEqual(windowAspect, targetAspect)) {\n    return { x: 0, y: 0, width: windowWidth, height: windowHeight };\n  }\n  if (targetAspect > windowAspect) {\n    const width = windowWidth;\n    const height = width / targetAspect;\n    return {\n      x: 0,\n      y: (windowHeight - height) * 0.5,\n      width,\n      height,\n    };\n  }\n  const height = windowHeight;\n  const width = height * targetAspect;\n  return {\n    x: (windowWidth - width) * 0.5,\n    y: 0,\n    width,\n    height,\n  };\n}\n\nfunction clampInt(value, min, fallback) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return fallback;\n  return Math.max(min, Math.round(numeric));\n}\n\nexport function sanitizeFigureExportBaseName(value, fallback = 'figure') {\n  const raw = String(value ?? '').trim().replace(/[\\\\/:*?\"<>|\\u0000-\\u001F]/g, '_');\n  return raw || fallback;\n}\n\nexport function normalizeFigureExportFormat(value, fallback = 'png') {\n  const format = String(value ?? fallback).trim().toLowerCase();\n  return format === 'svg' ? 'svg' : 'png';\n}\n\nexport function normalizeFigureExportFilename(filename, format = 'png', fallbackBase = 'figure') {\n  const normalizedFormat = normalizeFigureExportFormat(format, 'png');\n  const raw = String(filename ?? '').trim();\n  const base = sanitizeFigureExportBaseName(raw.replace(/\\.[^.]+$/u, ''), fallbackBase);\n  return `${base}.${normalizedFormat}`;\n}\n\nexport function resolveFigureExportPresetDimensions(preset, windowSize = {}) {\n  const safePreset = String(preset ?? 'window').trim().toLowerCase();\n  const windowWidth = clampInt(windowSize.width, 1, 1);\n  const windowHeight = clampInt(windowSize.height, 1, 1);\n  if (safePreset === 'window') return { width: windowWidth, height: windowHeight, preset: 'window' };\n  if (safePreset === 'window@x2') return { width: windowWidth * 2, height: windowHeight * 2, preset: 'window@x2' };\n  if (safePreset === 'window@x4') return { width: windowWidth * 4, height: windowHeight * 4, preset: 'window@x4' };\n  const dynamicWindowMatch = safePreset.match(/^window@(\\d+(?:\\.\\d+)?)x$/u);\n  if (dynamicWindowMatch) {\n    const factor = normalizePositiveNumber(dynamicWindowMatch[1], 1);\n    return {\n      width: Math.max(1, Math.round(windowWidth * factor)),\n      height: Math.max(1, Math.round(windowHeight * factor)),\n      preset: `window@${formatWindowScale(factor)}x`,\n    };\n  }\n  if (PRESET_DIMENSIONS[safePreset]) return { ...PRESET_DIMENSIONS[safePreset], preset: safePreset };\n  return null;\n}\n\nexport function resolveFigureExportSupersampling(value, fallback = 1) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric) || numeric <= 0) return fallback;\n  if (numeric <= 1) return 1;\n  if (numeric <= 2) return 2;\n  if (numeric <= 4) return 4;\n  return Math.max(1, Math.round(numeric));\n}\n\nexport function resolveFigureLegendScale(value, fallback = 1) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric) || numeric <= 0) return fallback;\n  return Math.max(0.25, Math.min(8, numeric));\n}\n\nexport function resolveFigureRelativeOverlayScale(exportSize = {}, viewSize = {}, fallback = 1) {\n  const exportWidth = normalizePositiveNumber(exportSize.width ?? exportSize.logicalWidth, NaN);\n  const exportHeight = normalizePositiveNumber(exportSize.height ?? exportSize.logicalHeight, NaN);\n  const viewWidth = normalizePositiveNumber(viewSize.width, NaN);\n  const viewHeight = normalizePositiveNumber(viewSize.height, NaN);\n  if (\n    !Number.isFinite(exportWidth)\n    || !Number.isFinite(exportHeight)\n    || !Number.isFinite(viewWidth)\n    || !Number.isFinite(viewHeight)\n  ) {\n    return normalizePositiveNumber(fallback, 1);\n  }\n  return Math.max(1e-6, Math.min(exportWidth / viewWidth, exportHeight / viewHeight));\n}\n\nexport function resolveFigureTransparentBackground(value, fallback = false) {\n  if (value == null) return fallback;\n  return value === true;\n}\n\nexport function resolveFigureExportAlphaMode(value, fallback = 'straight') {\n  const normalized = String(value ?? fallback).trim().toLowerCase();\n  return normalized === 'premultiplied' ? 'premultiplied' : 'straight';\n}\n\n/**\n * Resolve renderer limits that constrain figure export dimensions.\n *\n * @public\n * @param {object} renderer - Active Helios renderer.\n * @param {number|string} [supersampling=1] - Requested supersampling factor.\n * @returns {{supersampling:number,maxBitmapDimension:number,maxFigureDimension:number}}\n * Export capability for the current WebGL/WebGPU device.\n */\nexport function getFigureExportCapability(renderer, supersampling = 1) {\n  const safeSupersampling = resolveFigureExportSupersampling(supersampling, 1);\n  let maxBitmapDimension = 8192;\n  const device = renderer?.device ?? null;\n  if (device?.type === 'webgl2') {\n    const gl = device.gl ?? null;\n    const maxTexture = gl?.getParameter?.(gl.MAX_TEXTURE_SIZE) ?? maxBitmapDimension;\n    const maxRenderbuffer = gl?.getParameter?.(gl.MAX_RENDERBUFFER_SIZE) ?? maxBitmapDimension;\n    maxBitmapDimension = Math.max(1, Math.floor(Math.min(maxTexture, maxRenderbuffer)));\n  } else if (device?.type === 'webgpu') {\n    const limit = device.device?.limits?.maxTextureDimension2D ?? maxBitmapDimension;\n    maxBitmapDimension = Math.max(1, Math.floor(limit));\n  }\n  return {\n    supersampling: safeSupersampling,\n    maxBitmapDimension,\n    maxFigureDimension: Math.max(1, Math.floor(maxBitmapDimension / safeSupersampling)),\n  };\n}\n\n/**\n * Normalize figure export options into concrete dimensions and capture flags.\n *\n * @public\n * @param {object} [options] - Requested filename, format, preset, width,\n * height, supersampling, overlay inclusion, transparency, and legend scale.\n * @param {object} [context] - Renderer, viewport, device pixel ratio, and\n * capability context.\n * @returns {object} Resolved export options including logical dimensions,\n * bitmap dimensions, crop rectangle, filename, and capability fit status.\n * @remarks Callers should check `fitsCapability` before allocating render\n * targets for the result.\n */\nexport function resolveFigureExportOptions(options = {}, context = {}) {\n  const requestedPreset = String(options.preset ?? options.dimensions ?? '').trim().toLowerCase();\n  const windowDevicePixelRatio = normalizePositiveNumber(context.windowDevicePixelRatio, 1);\n  const preset = requestedPreset || (options.width || options.height ? 'custom' : getDefaultFigureExportPreset(windowDevicePixelRatio));\n  const format = normalizeFigureExportFormat(options.format, 'png');\n  const windowSize = context.windowSize ?? {};\n  const baseName = sanitizeFigureExportBaseName(options.baseName ?? options.name ?? options.filename ?? 'figure');\n  const supersampling = resolveFigureExportSupersampling(options.supersampling, 1);\n  const legendScale = resolveFigureLegendScale(options.legendScale, 1);\n  const transparentBackground = resolveFigureTransparentBackground(options.transparentBackground, false);\n  const alphaMode = transparentBackground\n    ? resolveFigureExportAlphaMode(options.alphaMode, 'straight')\n    : 'straight';\n  const capability = context.capability ?? getFigureExportCapability(context.renderer, supersampling);\n\n  let dimensions = null;\n  if (preset !== 'custom') {\n    dimensions = resolveFigureExportPresetDimensions(preset, windowSize);\n  }\n  if (!dimensions) {\n    const fallback = resolveFigureExportPresetDimensions('window', windowSize) ?? { width: 1, height: 1 };\n    const fallbackAspect = Math.max(1e-6, fallback.width / Math.max(1, fallback.height));\n    let width = Number(options.width);\n    let height = Number(options.height);\n    if (!Number.isFinite(width) && Number.isFinite(height)) width = height * fallbackAspect;\n    if (!Number.isFinite(height) && Number.isFinite(width)) height = width / fallbackAspect;\n    dimensions = {\n      preset: 'custom',\n      width: clampInt(width, 1, fallback.width),\n      height: clampInt(height, 1, fallback.height),\n    };\n  }\n\n  const finalWidth = Math.max(1, Math.floor(dimensions.width));\n  const finalHeight = Math.max(1, Math.floor(dimensions.height));\n  const bitmapWidth = Math.max(1, Math.floor(finalWidth * supersampling));\n  const bitmapHeight = Math.max(1, Math.floor(finalHeight * supersampling));\n  const previewRect = resolveFigurePreviewRect(finalWidth, finalHeight, windowSize);\n  const logicalWidth = Math.max(1, Number(previewRect.width ?? finalWidth));\n  const logicalHeight = Math.max(1, Number(previewRect.height ?? finalHeight));\n  const devicePixelRatio = Math.max(\n    1,\n    bitmapWidth / Math.max(1, logicalWidth),\n    bitmapHeight / Math.max(1, logicalHeight),\n  );\n  const renderScale = supersampling;\n  const framebufferWidth = bitmapWidth;\n  const framebufferHeight = bitmapHeight;\n  const cropX = 0;\n  const cropY = 0;\n  const fitsCapability = bitmapWidth <= capability.maxBitmapDimension && bitmapHeight <= capability.maxBitmapDimension;\n\n  return {\n    preset: dimensions.preset,\n    format,\n    baseName,\n    filename: normalizeFigureExportFilename(options.filename ?? baseName, format, baseName),\n    includeLegends: options.includeLegends !== false,\n    includeLabels: options.includeLabels === true,\n    includeInterface: options.includeInterface === true,\n    width: finalWidth,\n    height: finalHeight,\n    bitmapWidth,\n    bitmapHeight,\n    logicalWidth,\n    logicalHeight,\n    devicePixelRatio,\n    renderScale,\n    previewRect,\n    framebufferWidth,\n    framebufferHeight,\n    cropRect: {\n      x: cropX,\n      y: cropY,\n      width: bitmapWidth,\n      height: bitmapHeight,\n    },\n    supersampling,\n    legendScale,\n    transparentBackground,\n    alphaMode,\n    capability,\n    fitsCapability,\n  };\n}\n\nexport function resolveFigurePreviewThumbnailOptions(exportOptions = {}, previewOptions = {}) {\n  const sourceWidth = clampInt(exportOptions.width, 1, 1);\n  const sourceHeight = clampInt(exportOptions.height, 1, 1);\n  const maxWidth = clampInt(previewOptions.maxWidth, 1, 320);\n  const maxHeight = clampInt(previewOptions.maxHeight, 1, 180);\n  const scale = Math.min(maxWidth / sourceWidth, maxHeight / sourceHeight, 1);\n  const width = Math.max(1, Math.round(sourceWidth * scale));\n  const height = Math.max(1, Math.round(sourceHeight * scale));\n  const baseName = sanitizeFigureExportBaseName(exportOptions.baseName ?? exportOptions.filename ?? 'figure');\n\n  return {\n    baseName: `${baseName}-preview`,\n    filename: `${baseName}-preview`,\n    format: 'png',\n    preset: 'custom',\n    width,\n    height,\n    supersampling: resolveFigureExportSupersampling(previewOptions.supersampling, 1),\n    includeLabels: exportOptions.includeLabels === true,\n    includeLegends: exportOptions.includeLegends !== false,\n    includeInterface: exportOptions.includeInterface === true,\n    legendScale: resolveFigureLegendScale(exportOptions.legendScale, 1),\n    transparentBackground: resolveFigureTransparentBackground(exportOptions.transparentBackground, false),\n    alphaMode: resolveFigureExportAlphaMode(exportOptions.alphaMode, 'straight'),\n  };\n}\n\n/**\n * Build export preset metadata for a viewport and renderer capability.\n *\n * @public\n * @param {object} [windowSize] - Current logical viewport size.\n * @param {object} [capability] - Result of `getFigureExportCapability`.\n * @param {number|string} [supersampling=1] - Requested supersampling factor.\n * @returns {Array<object>} Preset records with dimensions and availability.\n */\nexport function buildFigureExportPresetList(windowSize = {}, capability = { maxBitmapDimension: Infinity }, supersampling = 1) {\n  const safeSupersampling = resolveFigureExportSupersampling(supersampling, 1);\n  const maxBitmapDimension = Math.max(1, Math.floor(Number(capability?.maxBitmapDimension) || Infinity));\n  const windowDevicePixelRatio = normalizePositiveNumber(capability?.windowDevicePixelRatio, 1);\n  const dynamicPresetId = getDefaultFigureExportPreset(windowDevicePixelRatio);\n  const presets = [...FIGURE_EXPORT_PRESETS];\n  if (!['window', 'window@x2', 'window@x4'].includes(dynamicPresetId)) {\n    presets.splice(1, 0, { id: dynamicPresetId, label: `Window @${formatWindowScale(windowDevicePixelRatio)}x` });\n  }\n  return presets.map((entry) => {\n    if (entry.id === 'custom') {\n      return { ...entry, available: true, width: null, height: null };\n    }\n    const resolved = resolveFigureExportPresetDimensions(entry.id, windowSize) ?? { width: 1, height: 1 };\n    const available = (resolved.width * safeSupersampling) <= maxBitmapDimension\n      && (resolved.height * safeSupersampling) <= maxBitmapDimension;\n    return {\n      ...entry,\n      width: resolved.width,\n      height: resolved.height,\n      available,\n    };\n  });\n}\n","import { AttributeType } from 'helios-network';\nimport { PanelManager } from './panels/PanelManager.js';\nimport { UIAttribute } from './state/UIAttribute.js';\nimport { ensureDefaultStyles } from './style/defaultStyles.js';\nimport { defineHeliosWebComponents } from './web-components/defineHeliosWebComponents.js';\nimport { createSliderRow } from './controls/createSliderRow.js';\nimport { createAlignedRowEl } from './controls/createAlignedRowEl.js';\nimport { SuggestedSliderControls } from './controls/SuggestedSliderControls.js';\nimport { createDirtyIndicator } from './controls/createDirtyIndicator.js';\nimport { createFpsThrottle } from './controls/createFpsThrottle.js';\nimport { createTooltipManager } from './controls/createTooltipManager.js';\nimport { createToggleControl } from './controls/createToggleControl.js';\nimport { createSegmentedToggleControl } from './controls/createSegmentedToggleControl.js';\nimport { createSelectControl } from './controls/createSelectControl.js';\nimport { createLightDirectionControl } from './controls/LightDirectionControl.js';\nimport { PanelStack } from './panels/PanelStack.js';\nimport { TabbedPanel } from './panels/TabbedPanel.js';\nimport {\n  FILTERS_PANEL_SCHEMA,\n  SCENE_PANEL_SCHEMA,\n  createPanelSchemaIndicator,\n  humanizeControlLabel,\n} from './panels/panelSchema.js';\nimport { colormaps } from '../colors/colormaps.js';\nimport { VISUAL_ATTRIBUTE_MAP } from '../pipeline/constants.js';\nimport { MappersPanel } from './panels/MappersPanel.js';\nimport { LayoutPanel } from './panels/LayoutPanel.js';\nimport { LegendsPanel } from './panels/LegendsPanel.js';\nimport { CameraPanel } from './panels/CameraPanel.js';\nimport { SelectionPanel } from './panels/SelectionPanel.js';\nimport { createAttributeRuleEditor } from './panels/AttributeRuleEditor.js';\nimport { createPanelIcon, resolvePanelIconKind } from './panelIcons.js';\nimport { clampNumber } from './utils/numbers.js';\nimport { toHex8 } from './utils/colors.js';\nimport { isPublicAttributeName } from './utils/attributes.js';\nimport { shallowCloneChannelConfig } from './utils/channelConfig.js';\nimport { HeliosFilter } from '../filters/HeliosFilter.js';\nimport { AMBIENT_OCCLUSION_MODE_OPTIONS } from '../rendering/engine/AmbientOcclusionMode.js';\nimport { AMBIENT_OCCLUSION_QUALITY_OPTIONS } from '../rendering/engine/AmbientOcclusionQuality.js';\nimport {\n  buildFigureExportPresetList,\n  normalizeFigureExportFilename,\n  resolveFigureExportOptions,\n  resolveFigurePreviewThumbnailOptions,\n} from '../export/figureExport.js';\n\nconst INTERFACE_CONTROL_RELEASE_MS = 420;\nconst FULLSCREEN_OVERLAY_LEFT_INSET_PX = 28;\nconst LOGGED_SYNC_FAILURE_KEYS = new Set();\nconst MAX_LOGGED_SYNC_FAILURE_KEYS = 100;\n\nfunction storageCapabilities(helios) {\n  return helios?.storage?.capabilities ?? {};\n}\n\nfunction storageSupportsPersistentUI(helios) {\n  const capabilities = storageCapabilities(helios);\n  return capabilities.persistent === true || capabilities.sessions === true;\n}\n\nfunction storageSupportsSessions(helios) {\n  return storageCapabilities(helios).sessions === true;\n}\n\nconst STATE_ACCESSOR_PATHS = Object.freeze({\n  background: 'appearance.background',\n  clearColor: 'appearance.background',\n  edgeTransparencyMode: 'appearance.edgeTransparencyMode',\n  supersampling: 'appearance.supersampling',\n  nodeSizeScale: 'appearance.nodeStyle.sizeScale',\n  nodeSizeBase: 'appearance.nodeStyle.sizeBase',\n  nodeOpacityScale: 'appearance.nodeStyle.opacityScale',\n  nodeOpacityBase: 'appearance.nodeStyle.opacityBase',\n  nodeOutlineWidthScale: 'appearance.nodeStyle.outlineWidthScale',\n  nodeOutlineWidthBase: 'appearance.nodeStyle.outlineWidthBase',\n  semanticZoomExponent: 'appearance.nodeStyle.semanticZoomExponent',\n  nodeBlendWithEdges: 'appearance.nodeStyle.blendWithEdges',\n  edgeWidthScale: 'appearance.edgeStyle.widthScale',\n  edgeWidthBase: 'appearance.edgeStyle.widthBase',\n  edgeOpacityScale: 'appearance.edgeStyle.opacityScale',\n  edgeOpacityBase: 'appearance.edgeStyle.opacityBase',\n  edgeEndpointTrim: 'appearance.edgeStyle.endpointTrim',\n  edgeDepthWrite: 'appearance.edgeStyle.depthWrite',\n  edgeFastRendering: 'appearance.edgeStyle.fastRendering',\n  edgeWidthClampToNodeDiameter: 'appearance.edgeStyle.clampToNodeDiameter',\n  edgeAdaptiveQualityEnabled: 'appearance.edgeStyle.adaptiveQuality.enabled',\n  edgeAdaptiveQualitySlowFrameThresholdMs: 'appearance.edgeStyle.adaptiveQuality.slowFrameThresholdMs',\n  edgeAdaptiveQualitySlowFrameConsecutiveFrames: 'appearance.edgeStyle.adaptiveQuality.slowFrameConsecutiveFrames',\n  edgeAdaptiveQualityProbeIntervalMs: 'appearance.edgeStyle.adaptiveQuality.probeIntervalMs',\n  edgeAdaptiveQualityInteractionHoldMs: 'appearance.edgeStyle.adaptiveQuality.interactionHoldMs',\n  edgeAdaptiveQualityFastDuringCamera: 'appearance.edgeStyle.adaptiveQuality.fastDuringCamera',\n  edgeAdaptiveQualityFastDuringLayout: 'appearance.edgeStyle.adaptiveQuality.fastDuringLayout',\n  shadedEnabled: 'appearance.shaded.enabled',\n  shadedNodes: 'appearance.shaded.nodes',\n  shadedEdges: 'appearance.shaded.edges',\n  shadedLightDirection: 'appearance.shaded.lightDirection',\n  shadedLightDirectionX: 'appearance.shaded.lightDirection.0',\n  shadedLightDirectionY: 'appearance.shaded.lightDirection.1',\n  shadedLightDirectionZ: 'appearance.shaded.lightDirection.2',\n  shadedLightColor: 'appearance.shaded.lightColor',\n  shadedAmbientTopColor: 'appearance.shaded.ambientTopColor',\n  shadedAmbientBottomColor: 'appearance.shaded.ambientBottomColor',\n  shadedDiffuseStrength: 'appearance.shaded.diffuseStrength',\n  shadedAmbientStrength: 'appearance.shaded.ambientStrength',\n  shadedSpecularColor: 'appearance.shaded.specularColor',\n  shadedSpecularStrength: 'appearance.shaded.specularStrength',\n  shadedShininess: 'appearance.shaded.shininess',\n  ambientOcclusionEnabled: 'appearance.ambientOcclusion.enabled',\n  ambientOcclusionNodes: 'appearance.ambientOcclusion.nodes',\n  ambientOcclusionEdges: 'appearance.ambientOcclusion.edges',\n  ambientOcclusionStrength: 'appearance.ambientOcclusion.strength',\n  ambientOcclusionRadius: 'appearance.ambientOcclusion.radius',\n  ambientOcclusionBias: 'appearance.ambientOcclusion.bias',\n  ambientOcclusionMode: 'appearance.ambientOcclusion.mode',\n  ambientOcclusionIntensityScale: 'appearance.ambientOcclusion.intensityScale',\n  ambientOcclusionIntensityShift: 'appearance.ambientOcclusion.intensityShift',\n  ambientOcclusionQuality: 'appearance.ambientOcclusion.quality',\n  labelsMode: 'labels.mode',\n  labelsSelectedOnlySpaceAware: 'labels.selectedOnlySpaceAware',\n  labelsEnabled: 'labels.enabled',\n  labelsMaxVisible: 'labels.maxVisible',\n  labelsFontSizeScale: 'labels.fontSizeScale',\n  labelsMinScreenRadius: 'labels.minScreenRadius',\n  labelsOutlineWidth: 'labels.outlineWidth',\n  labelsOffsetRadiusFactor: 'labels.offsetRadiusFactor',\n  labelsOffsetPx: 'labels.offsetPx',\n  labelsMaxChars: 'labels.maxChars',\n  labelsMaxRows: 'labels.maxRows',\n  legendsEnabled: 'legends.enabled',\n});\n\nconst STATE_ACCESSOR_DEBOUNCE_MS = 180;\nconst BASELINE_REFRESH_IGNORED_OVERRIDES = new Set(['exporter.baseName', 'exporter.preset']);\n\nfunction stateScopeForPath(path) {\n  const root = String(path ?? '').split('.')[0];\n  if (root === 'ui' || root === 'interface') return 'user';\n  if (root === 'network' || root === 'positions') return 'workspace';\n  return 'network';\n}\n\nfunction persistencePanelPathForId(id, title = '') {\n  const normalizedId = String(id ?? '').trim();\n  const normalizedTitle = String(title ?? '').trim().toLowerCase();\n  if (normalizedId === 'helios-ui-mappers' || normalizedTitle === 'mappers') return 'mappers';\n  if (normalizedId === 'helios-ui-filter' || normalizedTitle === 'filter' || normalizedTitle === 'filters') return 'filters';\n  if (normalizedId === 'helios-ui-layout' || normalizedTitle === 'layout') return 'layout';\n  if (normalizedId === 'helios-ui-legends' || normalizedTitle === 'legends') return 'legends';\n  if (normalizedId === 'helios-ui-camera' || normalizedTitle === 'camera') return 'camera';\n  if (normalizedId === 'helios-ui-selection' || normalizedTitle === 'selection') return 'selection';\n  if (normalizedId === 'helios-ui-metrics' || normalizedTitle === 'metrics') return 'metrics';\n  return null;\n}\n\nfunction stateDebounceForPath(path) {\n  const text = String(path ?? '');\n  if (text.startsWith('camera.')) return 500;\n  if (text.startsWith('layout.')) return 220;\n  if (text.startsWith('mappers.') || text.startsWith('filters.')) return 300;\n  return STATE_ACCESSOR_DEBOUNCE_MS;\n}\n\nfunction clonePersistenceValue(value) {\n  if (value == null || typeof value !== 'object') return value;\n  try {\n    if (typeof structuredClone === 'function') return structuredClone(value);\n  } catch (_) {\n    // Fall back to JSON cloning below.\n  }\n  try {\n    return JSON.parse(JSON.stringify(value));\n  } catch (_) {\n    return value;\n  }\n}\n\nfunction stateValueSignature(value) {\n  try {\n    return JSON.stringify(value);\n  } catch (_) {\n    return String(value);\n  }\n}\n\nfunction scopeForStatePath(path) {\n  const parts = String(path ?? '').split('.').filter(Boolean);\n  if (parts.length >= 2) return `${parts[0]}.${parts[1]}`;\n  return parts[0] ?? '';\n}\n\nfunction resolveUiContainer({ helios, container, layerName }) {\n  if (container) return container;\n  if (helios?.layers?.layers && typeof helios.layers.addLayer === 'function') {\n    const layer = document.createElement('div');\n    layer.className = 'helios-ui';\n    helios.layers.addLayer(layerName ?? 'ui', layer);\n    return layer;\n  }\n  const fallback = document.createElement('div');\n  fallback.className = 'helios-ui';\n  (document.body ?? document.documentElement).appendChild(fallback);\n  return fallback;\n}\n\nfunction createStatChip(labelText, valueEl) {\n  const stat = document.createElement('div');\n  stat.className = 'helios-ui-stat';\n  const label = document.createElement('div');\n  label.className = 'helios-ui-stat__label';\n  label.textContent = labelText;\n  const value = valueEl ?? document.createElement('div');\n  if (!valueEl) {\n    value.className = 'helios-ui-stat__value';\n    value.textContent = '—';\n  } else {\n    value.classList.add('helios-ui-stat__value');\n  }\n  stat.appendChild(label);\n  stat.appendChild(value);\n  return { stat, label, value };\n}\n\nfunction formatAttributeType(type) {\n  switch (type) {\n    case AttributeType.Boolean: return 'Boolean';\n    case AttributeType.Float: return 'Float';\n    case AttributeType.Double: return 'Double';\n    case AttributeType.Integer: return 'Integer';\n    case AttributeType.UnsignedInteger: return 'Unsigned Integer';\n    case AttributeType.Category: return 'Category';\n    case AttributeType.String: return 'String';\n    case AttributeType.Data: return 'Data';\n    case AttributeType.Javascript: return 'Javascript';\n    case AttributeType.BigInteger: return 'Big Integer';\n    case AttributeType.UnsignedBigInteger: return 'Unsigned Big Integer';\n    case AttributeType.MultiCategory: return 'Multi Category';\n    default: return String(type ?? 'Unknown');\n  }\n}\n\nfunction isHiddenAppAttributeName(name) {\n  return typeof name === 'string' && name.startsWith('_');\n}\n\nfunction summarizeChannelConfig(config) {\n  if (!config) return '—';\n  const type = config.type ?? config.mode ?? 'custom';\n  const attr = config.attributes ?? config.from;\n  if (type === 'custom') {\n    const name = config?.meta?.name;\n    const trimmed = typeof name === 'string' ? name.trim() : '';\n    if (!trimmed || trimmed.toLowerCase() === 'custom') return 'custom';\n    return `custom: ${trimmed}`;\n  }\n  if (type === 'constant') {\n    return config.value != null ? `constant` : 'constant';\n  }\n  if (type === 'passthrough') {\n    return typeof attr === 'string' ? `passthrough: ${attr}` : 'passthrough';\n  }\n  if (type === 'linear') {\n    const d = Array.isArray(config.domain) ? config.domain.join('..') : '';\n    const r = Array.isArray(config.range) ? config.range.join('..') : '';\n    const src = typeof attr === 'string' ? attr : 'attr';\n    return `linear: ${src} (${d || '—'} → ${r || '—'})`;\n  }\n  if (type === 'colormap' || config.colormap) {\n    const name = config.colormap ?? config.scale ?? config.range ?? 'colormap';\n    const d = Array.isArray(config.domain) ? config.domain.join('..') : '';\n    const src = typeof attr === 'string' ? attr : 'attr';\n    return `colormap: ${src} → ${name}${d ? ` (${d})` : ''}`;\n  }\n  if (type === 'categorical') {\n    const src = typeof attr === 'string' ? attr : 'attr';\n    return `categorical: ${src}`;\n  }\n  if (type === 'nodeAttribute') return `node attribute: ${config.nodeAttribute ?? ''}`.trim();\n  return String(type);\n}\n\nfunction collectColormapSuggestionNames() {\n  const names = new Set();\n  const add = (value) => {\n    if (!value) return;\n    names.add(String(value));\n  };\n  for (const key of Object.keys(colormaps?.d3 ?? {})) add(key);\n  for (const key of Object.keys(colormaps?.CET ?? {})) add(key);\n  for (const key of Object.keys(colormaps?.helios ?? {})) add(key);\n  for (const key of Object.keys(colormaps?.cmasher ?? {})) {\n    add(key);\n    if (key.startsWith('cmasher_')) {\n      add(`cmasher:${key.slice('cmasher_'.length)}`);\n    }\n  }\n  return Array.from(names).sort((a, b) => a.localeCompare(b));\n}\n\nfunction warnUiDerivationFailure(message, detail) {\n  if (!import.meta.env?.DEV) return;\n  console.warn(`[HeliosUI] ${message}`, detail);\n}\n\nfunction createInterfaceIcon(doc, kind) {\n  const svg = doc.createElementNS('http://www.w3.org/2000/svg', 'svg');\n  svg.setAttribute('viewBox', '0 0 24 24');\n  svg.classList.add('helios-ui-interface-icon');\n  const path = doc.createElementNS('http://www.w3.org/2000/svg', 'path');\n  path.setAttribute('fill', 'none');\n  path.setAttribute('stroke', 'currentColor');\n  path.setAttribute('stroke-width', '1.8');\n  path.setAttribute('stroke-linecap', 'round');\n  path.setAttribute('stroke-linejoin', 'round');\n  if (kind === 'dock-left') path.setAttribute('d', 'M4 5h4v14H4zM10 5h10v14H10z');\n  else if (kind === 'dock-right') path.setAttribute('d', 'M4 5h10v14H4zM16 5h4v14h-4z');\n  else if (kind === 'close') path.setAttribute('d', 'M7 7l10 10M17 7L7 17');\n  else path.setAttribute('d', 'M5 7h14M5 12h14M5 17h14M9 5v4M15 10v4M11 15v4');\n  svg.appendChild(path);\n  return svg;\n}\n\n/**\n * Optional built-in control surface for a Helios visualization.\n *\n * @public\n * @apiSection User Interface\n * @param {object} [options] - UI construction options.\n * @param {Helios} [options.helios] - Helios instance to inspect and control.\n * @param {HTMLElement} [options.container] - Existing UI container. When omitted the UI creates or reuses a layer on the Helios root.\n * @param {string} [options.layerName='ui'] - Layer name used when the UI attaches to the Helios layer manager.\n * @param {'dark'|'light'} [options.theme] - Initial UI theme.\n * @param {'default'|string} [options.styles='default'] - Built-in style preset or external style mode.\n * @param {Document} [options.document] - Document used for custom elements and style installation.\n * @param {boolean} [options.allowDrag=true] - Enable dragging floating panels.\n * @param {number|string} [options.labelColumn] - Optional fixed label-column sizing for generated controls.\n * @param {boolean} [options.persistenceIndicators] - Show dirty/default markers when persistent storage supports them.\n * @param {object} [options.interface] - Interface behavior options passed to `helios.useBehavior('interface', ...)`.\n * @param {object} [options.behaviors] - Behavior option bag used by built-in UI behaviors.\n * @example\n * const ui = new HeliosUI({ helios, theme: 'dark' });\n */\nexport class HeliosUI {\n  constructor(options = {}) {\n    this.helios = options.helios ?? null;\n    if (this.helios && !this.helios.ui) this.helios.ui = this;\n    this.helios?.behaviors?.setUI?.(this);\n    this.layerName = options.layerName ?? 'ui';\n    const hasExplicitTheme = Object.prototype.hasOwnProperty.call(options, 'theme');\n    const autoTheme = this.helios?._autoThemeDefaults?.controls !== false\n      ? this.helios?._autoThemeDefaults?.currentTheme\n      : null;\n    this.theme = options.theme ?? autoTheme ?? 'dark';\n    if (hasExplicitTheme) {\n      this.helios?._handleAutoThemeBindingChange?.('ui.theme', {\n        source: 'program',\n        reason: 'ui-constructor-theme',\n        trackOverride: true,\n      });\n    }\n    this.styles = options.styles ?? 'default';\n    this.persistenceIndicators = options.persistenceIndicators !== false && storageSupportsPersistentUI(this.helios);\n\n    if (this.styles === 'default') ensureDefaultStyles(options.document ?? document);\n\n    // Ensure custom elements exist before panels/controls are created.\n    defineHeliosWebComponents(options.document ?? document);\n\n    this.container = resolveUiContainer({\n      helios: this.helios,\n      container: options.container ?? null,\n      layerName: this.layerName,\n    });\n    this.container.classList.add('helios-ui');\n    this.container.classList.toggle('helios-ui--storage-disabled', !this.persistenceIndicators);\n    this.container.dataset.theme = this.theme;\n    this._controlCleanups = new Set();\n    this._boundAttributesById = new Map();\n    this._heliosBindingUnsubscribe = null;\n    this._latestDockInsets = { top: 0, right: 0, bottom: 0, left: 0 };\n    this._interfaceReleaseTimer = null;\n    this._activeControlScope = null;\n    this._panelHeaderShineTimers = new WeakMap();\n    this._pendingPanelHeaderShine = null;\n    this._persistenceIndicatorObserver = null;\n    this._persistenceIndicatorFrame = null;\n    this._persistenceBaselineRefreshTimer = null;\n    this._stateAccessorBindings = new WeakSet();\n    this._lastLoggedSyncFailure = null;\n\n    this.panelManager = new PanelManager({\n      container: this.container,\n      allowDrag: options.allowDrag ?? true,\n      labelColumn: options.labelColumn ?? undefined,\n    });\n    this.interfaceBehavior = this.helios?.useBehavior?.('interface', options.interface ?? options.behaviors?.options?.interface) ?? null;\n    this._interfaceResizeObserver = null;\n    this._interfaceChrome = this._createInterfaceChrome();\n    this.interfaceBehavior?.bindUI?.(this);\n    this._registerStateKey('ui.theme', {\n      scope: 'user',\n      debounceMs: 0,\n      defaultValue: this.theme,\n      metadata: { control: 'theme' },\n    });\n    this.helios?._applyAutoThemeDefaults?.(this.helios?._autoThemeDefaults?.currentTheme ?? this.theme);\n    this._installInterfaceViewportTracking();\n    this._installInterfaceControlTracking();\n    this._installPersistenceIndicatorFallback();\n    const pendingUiState = this.helios?._pendingVisualizationUiState;\n    if (pendingUiState && typeof pendingUiState === 'object') {\n      const applyPendingUiState = () => {\n        this.restoreState(pendingUiState);\n        this.helios._pendingVisualizationUiState = null;\n        this._writeStateValue('ui.theme', this.theme, {\n          scope: 'user',\n          source: 'restore',\n          reason: 'theme-restore',\n          debounceMs: 0,\n          autosave: false,\n          trackOverride: false,\n        });\n      };\n      applyPendingUiState();\n      if (this.helios?._pendingPersistenceBaselineRefresh === true) {\n        this.helios._pendingPersistenceBaselineRefresh = false;\n      }\n      this.helios._pendingVisualizationUiState = null;\n    }\n    this._syncInterfaceState();\n    const dockMetricsUnsubscribe = this.panelManager.onDockMetricsChange?.((insets) => {\n      this._latestDockInsets = { ...insets };\n      this.container?.style?.setProperty?.('--helios-ui-left-dock-width', `${Math.max(0, Number(insets?.left) || 0)}px`);\n      this.container?.style?.setProperty?.('--helios-ui-right-dock-width', `${Math.max(0, Number(insets?.right) || 0)}px`);\n      this._applyGraphViewportPolicy();\n    });\n    if (dockMetricsUnsubscribe) this._controlCleanups.add(dockMetricsUnsubscribe);\n  }\n\n  _ensureHeliosBindingListener() {\n    if (this._heliosBindingUnsubscribe || !this.helios) return;\n    const handler = (event) => {\n      const detail = event?.detail;\n      const id = detail?.id;\n      if (!id) return;\n      const attribute = this._boundAttributesById.get(id);\n      if (attribute) attribute.notify();\n    };\n    if (typeof this.helios.on === 'function') {\n      this._heliosBindingUnsubscribe = this.helios.on('ui:binding-change', handler);\n    } else if (typeof this.helios.addEventListener === 'function') {\n      this.helios.addEventListener('ui:binding-change', handler);\n      this._heliosBindingUnsubscribe = () => this.helios.removeEventListener('ui:binding-change', handler);\n    }\n    if (this._heliosBindingUnsubscribe) this._controlCleanups.add(this._heliosBindingUnsubscribe);\n  }\n\n  _schedulePersistenceBaselineRefresh() {\n    const storage = this.helios?.storage ?? null;\n    const stateManager = this.helios?.states ?? null;\n    if (!storage || typeof storage.flush !== 'function') return;\n    const hasBlockingOverride = (overrides = {}) => Object.keys(overrides)\n      .some((path) => !BASELINE_REFRESH_IGNORED_OVERRIDES.has(path));\n    if (hasBlockingOverride(stateManager?.getOverrides?.({ aliases: false }) ?? {})) return;\n    if (this._persistenceBaselineRefreshTimer != null) clearTimeout(this._persistenceBaselineRefreshTimer);\n    this._persistenceBaselineRefreshTimer = setTimeout(() => {\n      this._persistenceBaselineRefreshTimer = null;\n      const latestStorage = this.helios?.storage ?? null;\n      const latestStates = this.helios?.states ?? null;\n      if (!latestStorage || hasBlockingOverride(latestStates?.getOverrides?.({ aliases: false }) ?? {})) return;\n      if (this.helios) this.helios._pendingPersistenceBaselineRefresh = false;\n    }, 0);\n  }\n\n  /**\n   * Register a UI-owned value with the Helios state manager.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {string} path - Persistent state path.\n   * @param {object} [options] - State metadata and UI-control hints.\n   * @returns {Function|null} Cleanup function returned by the state manager, or `null` when state tracking is unavailable.\n   */\n  registerStateControl(path, options = {}) {\n    const stateManager = this.helios?.states ?? null;\n    if (!path || typeof stateManager?.register !== 'function') return null;\n    const existingEntry = typeof stateManager?.entry === 'function' ? stateManager.entry(path) : null;\n    const targetPath = existingEntry?.key ?? path;\n    const hasDefaultValue = Object.prototype.hasOwnProperty.call(options, 'defaultValue');\n    const hasOverride = stateManager?.status?.(targetPath)?.hasOverride === true;\n    const defaultValue = hasDefaultValue ? options.defaultValue : existingEntry?.default ?? null;\n    try {\n      return stateManager.register(this, '', {\n        [targetPath]: {\n          ...(existingEntry ?? {}),\n          default: clonePersistenceValue(hasOverride ? stateManager.get(targetPath) : defaultValue),\n          scope: options.scope ?? stateScopeForPath(path),\n          type: options.type ?? existingEntry?.type ?? 'object',\n          ui: {\n            ...(existingEntry?.ui ?? {}),\n            label: options.label ?? existingEntry?.ui?.label,\n            controller: options.controller ?? existingEntry?.ui?.controller,\n            debounceMs: options.debounceMs ?? stateDebounceForPath(path),\n          },\n        },\n      });\n    } catch (error) {\n      console.warn(`[HeliosUI] Failed to register state control \"${path}\".`, error);\n      return null;\n    }\n  }\n\n  _registerStateKey(path, options = {}) {\n    return this.registerStateControl(path, options);\n  }\n\n  /**\n   * Write a UI control value through the Helios state manager.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {string} path - Persistent state path.\n   * @param {*} value - Value to store.\n   * @param {object} [options] - Persistence, debounce, source, and override-tracking options.\n   * @returns {*|null} State-manager write result, or `null` when state tracking is unavailable.\n   */\n  writeStateControl(path, value, options = {}) {\n    const stateStore = this.helios?.states ?? null;\n    if (!path || typeof stateStore?.set !== 'function') return null;\n    try {\n      const writeOptions = {\n        scope: options.scope ?? stateScopeForPath(path),\n        source: options.source ?? 'ui',\n        reason: options.reason ?? 'control',\n        autosave: options.autosave,\n        applyBinding: options.applyBinding,\n        debounceMs: options.debounceMs,\n        journal: options.journal ?? false,\n      };\n      const trackOverride = options.trackOverride ?? this.helios?.storage?.overrideTrackingReady !== false;\n      if (trackOverride === false || Object.prototype.hasOwnProperty.call(options, 'trackOverride')) {\n        writeOptions.trackOverride = trackOverride;\n      }\n      return stateStore.set(path, value, writeOptions);\n    } catch (error) {\n      console.warn(`[HeliosUI] Failed to write state control \"${path}\".`, error);\n      return null;\n    }\n  }\n\n  _writeStateValue(path, value, options = {}) {\n    return this.writeStateControl(path, value, options);\n  }\n\n  /**\n   * Create a dirty/default indicator for a state path or state scope.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {string} [path=''] - State path to observe.\n   * @param {string|null} [scope=null] - Indicator scope override.\n   * @param {object} [options] - Registration and tooltip options.\n   * @returns {HTMLElement|null} Indicator element, or `null` when indicators are disabled.\n   */\n  createStateIndicator(path = '', scope = null, options = {}) {\n    if (!this.persistenceIndicators) return null;\n    const target = String(path ?? '').trim();\n    if (target && options.register !== false) {\n      this.registerStateControl(target, {\n        scope: options.persistenceScope ?? stateScopeForPath(target),\n        debounceMs: options.debounceMs ?? stateDebounceForPath(target),\n        ...(Object.prototype.hasOwnProperty.call(options, 'defaultValue')\n          ? { defaultValue: options.defaultValue }\n          : {}),\n        metadata: options.metadata,\n      });\n    }\n    return createDirtyIndicator({\n      helios: this.helios,\n      path: target,\n      scope: scope ?? options.indicatorScope ?? target,\n      mode: options.mode,\n      attachTooltip: options.attachTooltip,\n    });\n  }\n\n  _trackAttributeState(attribute, path, options = {}) {\n    if (!attribute || !path || this._stateAccessorBindings.has(attribute)) return;\n    this._stateAccessorBindings.add(attribute);\n    const debounceMs = options.debounceMs ?? stateDebounceForPath(path);\n    const scope = options.scope ?? stateScopeForPath(path);\n    const initialValue = typeof attribute.value === 'function' ? attribute.value() : options.defaultValue;\n    this._registerStateKey(path, {\n      scope,\n      debounceMs,\n      defaultValue: options.defaultValue ?? initialValue,\n      metadata: { binding: attribute.id ?? null, ...(options.metadata ?? {}) },\n    });\n    let previousSignature = stateValueSignature(initialValue);\n    const unsubscribe = attribute.subscribe((value) => {\n      const nextSignature = stateValueSignature(value);\n      if (nextSignature === previousSignature) return;\n      previousSignature = nextSignature;\n      this._writeStateValue(path, value, {\n        scope,\n        source: 'ui',\n        reason: options.reason ?? 'control',\n        debounceMs,\n        applyBinding: false,\n      });\n    }, { immediate: false });\n    this._controlCleanups.add(() => unsubscribe());\n  }\n\n  /**\n   * Apply a UI theme.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {'dark'|'light'|string} theme - Theme name stored on the UI container.\n   * @returns {void}\n   */\n  setTheme(theme, options = {}) {\n    this.theme = theme;\n    if (this.container) this.container.dataset.theme = theme;\n    this.helios?._handleAutoThemeBindingChange?.('ui.theme', options);\n    this.helios?._syncQuickControlsTheme?.(theme);\n  }\n\n  /**\n   * Toggle between the built-in dark and light themes.\n   *\n   * @public\n   * @apiSection User Interface\n   * @returns {void}\n   */\n  toggleTheme(options = {}) {\n    this.setTheme(this.theme === 'dark' ? 'light' : 'dark', {\n      source: options.source ?? 'program',\n      reason: options.reason ?? 'theme',\n      trackOverride: options.trackOverride,\n    });\n  }\n\n  /**\n   * Serialize UI panel, dock, theme, and responsive-interface state.\n   *\n   * @public\n   * @apiSection User Interface\n   * @returns {object} Serializable UI state snapshot.\n   */\n  serializeState() {\n    const panelState = this.panelManager?.serializeState?.() ?? {};\n    const interfaceState = this.interfaceBehavior?.serializeInterfaceState?.() ?? {};\n    return {\n      theme: this.theme,\n      panels: panelState.panels ?? {},\n      dockOrder: panelState.dockOrder ?? {},\n      interface: interfaceState,\n    };\n  }\n\n  /**\n   * Restore a UI state snapshot.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {object} [state={}] - Snapshot returned by `serializeState()`.\n   * @returns {HeliosUI} This UI instance.\n   */\n  restoreState(state = {}) {\n    if (!state || typeof state !== 'object') return this;\n    if (typeof state.theme === 'string' && state.theme) {\n      this.setTheme(state.theme, { source: 'restore', reason: 'theme-restore' });\n    }\n    this.panelManager?.restoreState?.(state);\n    this.interfaceBehavior?.restoreInterfaceState?.(state.interface ?? {});\n    this._syncInterfaceState();\n    return this;\n  }\n\n  /**\n   * Resolve the best available viewport width for responsive UI behavior.\n   *\n   * @public\n   * @apiSection User Interface\n   * @returns {number} Width in CSS pixels, or zero when unavailable.\n   */\n  getViewportWidth() {\n    const candidates = [\n      this.container?.clientWidth,\n      this.container?.getBoundingClientRect?.()?.width,\n      this.helios?.layers?.size?.width,\n      this.helios?.size?.width,\n      this.container?.ownerDocument?.defaultView?.innerWidth,\n      globalThis.window?.innerWidth,\n    ];\n    for (const value of candidates) {\n      const width = Number(value);\n      if (Number.isFinite(width) && width > 0) return width;\n    }\n    return 0;\n  }\n\n  /**\n   * Apply responsive interface state to the UI container and panel manager.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {object} [state={}] - Interface behavior snapshot.\n   * @returns {HeliosUI} This UI instance.\n   */\n  applyInterfaceBehaviorState(state = {}) {\n    const snapshot = state && typeof state === 'object' ? state : {};\n    this.container.dataset.interfaceMode = snapshot.mode ?? 'desktop';\n    this.container.dataset.interfaceVisible = snapshot.interfaceVisible === false ? 'false' : 'true';\n    this.panelManager?.setResponsivePresentation?.({\n      mode: snapshot.mode ?? 'desktop',\n      dockSide: snapshot.dockSide ?? 'left',\n      controlsOpen: snapshot.controlsOpen === true,\n      activePanelId: snapshot.activePanelId ?? null,\n      focused: snapshot.focused === true,\n    });\n    if (snapshot.focused !== true || snapshot.controlsOpen !== true) {\n      this._setActiveControlScope(null);\n    }\n    this._applyGraphViewportPolicy(snapshot);\n    this._renderInterfaceChrome(snapshot);\n    return this;\n  }\n\n  _applyGraphViewportPolicy(state = null) {\n    const snapshot = state && typeof state === 'object'\n      ? state\n      : (this.interfaceBehavior?.serializeInterfaceState?.() ?? { mode: 'desktop' });\n    const mode = snapshot.mode ?? 'desktop';\n    if (mode === 'compact') {\n      this.helios?.layers?.setViewportInsets?.(this._latestDockInsets);\n      this.helios?.overlayInsets?.({ top: 0, right: 0, bottom: 0, left: 0 });\n      this.helios?._updateQuickControlsPlacement?.();\n      return;\n    }\n    this.helios?.layers?.setViewportInsets?.({ top: 0, right: 0, bottom: 0, left: 0 });\n    if (mode === 'fullscreen') {\n      this.helios?.overlayInsets?.({ top: 0, right: 0, bottom: 0, left: FULLSCREEN_OVERLAY_LEFT_INSET_PX });\n      this.helios?._updateQuickControlsPlacement?.();\n      return;\n    }\n    this.helios?.overlayInsets?.(this._latestDockInsets);\n    this.helios?._updateQuickControlsPlacement?.();\n  }\n\n  _installInterfaceViewportTracking() {\n    const report = () => {\n      this.interfaceBehavior?.setViewportWidth?.(this.getViewportWidth(), { silent: true });\n      this._syncInterfaceState();\n    };\n    if (typeof ResizeObserver === 'function') {\n      this._interfaceResizeObserver = new ResizeObserver(() => report());\n      this._interfaceResizeObserver.observe(this.container);\n    } else if (typeof window?.addEventListener === 'function') {\n      window.addEventListener('resize', report);\n      this._controlCleanups.add(() => window.removeEventListener('resize', report));\n    }\n    this._controlCleanups.add(() => this._interfaceResizeObserver?.disconnect?.());\n    report();\n  }\n\n  _syncInterfaceState() {\n    this.applyInterfaceBehaviorState(this.interfaceBehavior?.serializeInterfaceState?.({ includeResumePrompt: true }) ?? {\n      dockSide: 'left',\n      mode: 'desktop',\n      interfaceVisible: true,\n      controlsOpen: false,\n      activePanelId: null,\n      focused: false,\n      resumePrompt: null,\n    });\n  }\n\n  _installPersistenceIndicatorFallback() {\n    if (!this.persistenceIndicators || !this.container) return;\n\n    const doc = this.container.ownerDocument ?? document;\n    const win = doc.defaultView ?? globalThis;\n    const fallbackIndicators = new Set();\n    const groupRecords = new Map();\n    const rowIndicators = new WeakMap();\n    const createStaticIndicator = () => {\n      const indicator = createDirtyIndicator({\n        helios: this.helios,\n        path: '',\n      });\n      indicator.classList.add('helios-ui-dirty-indicator--fallback');\n      fallbackIndicators.add(indicator);\n      this._controlCleanups.add(() => {\n        fallbackIndicators.delete(indicator);\n        indicator.destroy?.();\n      });\n      return indicator;\n    };\n    const createGroupIndicator = () => {\n      const indicator = doc.createElement('span');\n      indicator.className = 'helios-ui-dirty-indicator helios-ui-dirty-indicator--static helios-ui-dirty-indicator--group';\n      indicator.dataset.state = 'default';\n      indicator.setAttribute('aria-hidden', 'true');\n      return indicator;\n    };\n    const setIndicatorState = (indicator, state) => {\n      if (indicator?.dataset?.state !== state) indicator.dataset.state = state;\n    };\n    const syncGroupIndicator = (indicator, scope) => {\n      const changed = Boolean(scope?.querySelector?.('.helios-ui-row .helios-ui-dirty-indicator[data-state=\"changed\"]'));\n      setIndicatorState(indicator, changed ? 'partial' : 'default');\n    };\n\n    const registerRow = (row) => {\n      if (!row || rowIndicators.has(row)) return;\n      if (row.querySelector?.(':scope .helios-ui-dirty-indicator')) return;\n      const titleRow = row.querySelector?.(':scope .helios-ui-label__title-row');\n      const target = titleRow ?? row.querySelector?.(':scope .helios-ui-label__title')?.parentElement;\n      if (!target) return;\n      const indicator = createStaticIndicator();\n      target.appendChild(indicator);\n      rowIndicators.set(row, indicator);\n    };\n\n    const registerPanel = (panel) => {\n      if (!panel) return;\n      const titleWrap = panel.querySelector?.(':scope > .helios-ui-panel__header .helios-ui-panel__title-wrap');\n      if (!titleWrap) return;\n      const existingHeaderIndicator = panel.querySelector?.(':scope > .helios-ui-panel__header .helios-ui-panel__persistence-indicator')\n        ?? panel.querySelector?.(':scope > .helios-ui-panel__header .helios-ui-dirty-indicator--schema');\n      if (existingHeaderIndicator) {\n        titleWrap.querySelector?.(':scope > .helios-ui-dirty-indicator--group')?.remove();\n        return;\n      }\n      let indicator = titleWrap.querySelector?.(':scope > .helios-ui-dirty-indicator--group');\n      if (!indicator) {\n        indicator = createGroupIndicator();\n        titleWrap.appendChild(indicator);\n      }\n      const body = panel.querySelector?.(':scope > .helios-ui-panel__body');\n      groupRecords.set(panel, { root: panel, body, indicator });\n      syncGroupIndicator(indicator, body);\n    };\n\n    const registerSubpanel = (subpanel) => {\n      if (!subpanel) return;\n      const header = subpanel.querySelector?.(':scope > .helios-ui-subpanel__header-row > .helios-ui-subpanel__header');\n      if (!header) return;\n      const headerRow = subpanel.querySelector?.(':scope > .helios-ui-subpanel__header-row');\n      const existingHeaderIndicator = headerRow?.querySelector?.(':scope > .helios-ui-subpanel__header-controls .helios-ui-dirty-indicator')\n        ?? header.querySelector?.(':scope > .helios-ui-dirty-indicator--schema');\n      if (existingHeaderIndicator) {\n        header.querySelector?.(':scope > .helios-ui-dirty-indicator--group')?.remove();\n        return;\n      }\n      let indicator = header.querySelector?.(':scope > .helios-ui-dirty-indicator--group');\n      if (!indicator) {\n        indicator = createGroupIndicator();\n        header.appendChild(indicator);\n      }\n      const body = subpanel.querySelector?.(':scope > .helios-ui-subpanel__body');\n      groupRecords.set(subpanel, { root: subpanel, body, indicator });\n      syncGroupIndicator(indicator, body);\n    };\n\n    const registerSubtree = (node) => {\n      if (!node || node.nodeType !== 1) return;\n      if (node.matches?.('.helios-ui-row')) registerRow(node);\n      for (const row of node.querySelectorAll?.('.helios-ui-row') ?? []) registerRow(row);\n      if (node.matches?.('.helios-ui-panel')) registerPanel(node);\n      for (const panel of node.querySelectorAll?.('.helios-ui-panel') ?? []) registerPanel(panel);\n      if (node.matches?.('.helios-ui-subpanel')) registerSubpanel(node);\n      for (const subpanel of node.querySelectorAll?.('.helios-ui-subpanel') ?? []) registerSubpanel(subpanel);\n    };\n\n    const unregisterSubtree = (node) => {\n      if (!node || node.nodeType !== 1) return;\n      for (const indicator of Array.from(fallbackIndicators)) {\n        if (node === indicator || node.contains?.(indicator)) {\n          fallbackIndicators.delete(indicator);\n          indicator.destroy?.();\n        }\n      }\n      for (const [root, record] of Array.from(groupRecords.entries())) {\n        if (node === record.root || node.contains?.(record.root)) groupRecords.delete(root);\n      }\n    };\n\n    const refreshGroups = () => {\n      this._persistenceIndicatorFrame = null;\n      for (const [root, record] of Array.from(groupRecords.entries())) {\n        if (!record.root?.isConnected) {\n          groupRecords.delete(root);\n          continue;\n        }\n        syncGroupIndicator(record.indicator, record.body);\n      }\n    };\n\n    const schedule = () => {\n      if (this._persistenceIndicatorFrame != null) return;\n      this._persistenceIndicatorFrame = win.requestAnimationFrame?.(refreshGroups)\n        ?? win.setTimeout?.(refreshGroups, 0);\n    };\n\n    registerSubtree(this.container);\n    schedule();\n    if (typeof win.MutationObserver === 'function') {\n      this._persistenceIndicatorObserver = new win.MutationObserver((mutations) => {\n        for (const mutation of mutations) {\n          for (const node of mutation.removedNodes ?? []) unregisterSubtree(node);\n          for (const node of mutation.addedNodes ?? []) registerSubtree(node);\n        }\n        schedule();\n      });\n      this._persistenceIndicatorObserver.observe(this.container, {\n        childList: true,\n        subtree: true,\n      });\n      this._controlCleanups.add(() => this._persistenceIndicatorObserver?.disconnect?.());\n    }\n    const storage = this.helios?.storage ?? null;\n    storage?.addEventListener?.('change', schedule);\n    this._controlCleanups.add(() => {\n      storage?.removeEventListener?.('change', schedule);\n    });\n    this._controlCleanups.add(() => {\n      if (this._persistenceIndicatorFrame == null) return;\n      win.cancelAnimationFrame?.(this._persistenceIndicatorFrame);\n      win.clearTimeout?.(this._persistenceIndicatorFrame);\n      this._persistenceIndicatorFrame = null;\n    });\n  }\n\n  _createInterfaceChrome() {\n    const doc = this.container?.ownerDocument ?? document;\n    const surface = doc.createElement('div');\n    surface.className = 'helios-ui-interface-surface';\n\n    const compactDockToggle = doc.createElement('button');\n    compactDockToggle.type = 'button';\n    compactDockToggle.className = 'helios-ui-interface-dock-toggle';\n    compactDockToggle.setAttribute('aria-label', 'Move compact dock to the other side');\n    compactDockToggle.setAttribute('title', 'Move compact dock to the other side');\n    compactDockToggle.addEventListener('click', () => {\n      this.interfaceBehavior?.toggleDockSide?.();\n    });\n\n    const fullscreenBar = doc.createElement('div');\n    fullscreenBar.className = 'helios-ui-interface-fullscreen-bar';\n\n    const launcherButton = doc.createElement('button');\n    launcherButton.type = 'button';\n    launcherButton.className = 'helios-ui-button helios-ui-interface-bar__button helios-ui-interface-bar__button--icon';\n    launcherButton.addEventListener('click', () => {\n      const controlsOpen = this.interfaceBehavior?.controlsOpen?.() === true;\n      if (controlsOpen) {\n        this.interfaceBehavior?.closeControlsSurface?.();\n        this.interfaceBehavior?.clearActiveControl?.();\n        this._setActiveControlScope(null);\n      } else {\n        this.interfaceBehavior?.openControlsSurface?.();\n      }\n    });\n\n    const fullscreenPanelNav = doc.createElement('div');\n    fullscreenPanelNav.className = 'helios-ui-fullscreen-panel-nav';\n\n    fullscreenBar.appendChild(launcherButton);\n    fullscreenBar.appendChild(fullscreenPanelNav);\n\n    const resumePrompt = doc.createElement('div');\n    resumePrompt.className = 'helios-ui-resume-prompt';\n\n    const resumeText = doc.createElement('div');\n    resumeText.className = 'helios-ui-resume-prompt__text';\n\n    const resumeActions = doc.createElement('div');\n    resumeActions.className = 'helios-ui-resume-prompt__actions';\n\n    const resumeButton = doc.createElement('button');\n    resumeButton.type = 'button';\n    resumeButton.className = 'helios-ui-button';\n    resumeButton.textContent = 'Resume';\n    resumeButton.addEventListener('click', async () => {\n      const prompt = this.interfaceBehavior?.resumePrompt?.() ?? null;\n      let sessions = Array.isArray(prompt?.sessions) ? prompt.sessions.filter((entry) => entry?.id) : [];\n      const storage = this.helios?.storage ?? null;\n      const resumeSource = storage;\n      if (sessions.length <= 1 && typeof resumeSource?.getResumeSessions === 'function') {\n        sessions = await resumeSource.getResumeSessions({ limit: 8 });\n      }\n      if (sessions.length > 1) {\n        renderResumeMenu(sessions);\n        resumeMenu.hidden = false;\n        return;\n      }\n      this.interfaceBehavior?.resumeSession?.();\n    });\n\n    const resumeMenu = doc.createElement('div');\n    resumeMenu.className = 'helios-ui-resume-prompt__menu';\n    resumeMenu.hidden = true;\n\n    const renderResumeMenu = (sessions = []) => {\n      resumeMenu.replaceChildren();\n      for (let i = 0; i < sessions.length; i += 1) {\n        const session = sessions[i];\n        const item = doc.createElement('button');\n        item.type = 'button';\n        item.className = 'helios-ui-resume-prompt__menu-item';\n        item.dataset.sessionId = session.id;\n        item.textContent = this._formatResumeSessionLabel(session, i);\n        item.addEventListener('click', async () => {\n          resumeMenu.hidden = true;\n          resumePrompt.hidden = true;\n          item.disabled = true;\n          try {\n            await (this.interfaceBehavior?.resumeSession?.({ sessionId: session.id })\n              ?? this.helios?.storage?.resumeSession?.(session.id));\n          } finally {\n            item.disabled = false;\n          }\n        });\n        resumeMenu.appendChild(item);\n      }\n    };\n    resumeMenu.__heliosRenderSessions = renderResumeMenu;\n\n    const freshButton = doc.createElement('button');\n    freshButton.type = 'button';\n    freshButton.className = 'helios-ui-button';\n    freshButton.textContent = 'Start Fresh';\n    freshButton.addEventListener('click', async () => {\n      resumeMenu.hidden = true;\n      resumePrompt.hidden = true;\n      freshButton.disabled = true;\n      try {\n        await this.interfaceBehavior?.startFresh?.();\n      } finally {\n        freshButton.disabled = false;\n      }\n    });\n\n    resumeActions.appendChild(resumeButton);\n    resumeActions.appendChild(freshButton);\n    resumePrompt.appendChild(resumeText);\n    resumePrompt.appendChild(resumeActions);\n    resumePrompt.appendChild(resumeMenu);\n\n    surface.appendChild(compactDockToggle);\n    surface.appendChild(fullscreenBar);\n    surface.appendChild(resumePrompt);\n    this.container.appendChild(surface);\n\n    return {\n      surface,\n      compactDockToggle,\n      fullscreenBar,\n      launcherButton,\n      fullscreenPanelNav,\n      resumePrompt,\n      resumeText,\n      resumeMenu,\n    };\n  }\n\n  _formatResumeSessionLabel(session, index = 0) {\n    const timestamp = Number(session?.updatedAt);\n    const date = Number.isFinite(timestamp) && timestamp > 0\n      ? new Date(timestamp).toLocaleString(undefined, {\n        month: 'short',\n        day: 'numeric',\n        hour: 'numeric',\n        minute: '2-digit',\n      })\n      : 'unknown date';\n    if (index === 0) return `Latest - ${date}`;\n    const label = String(session?.label ?? session?.id ?? `Session ${index + 1}`).trim() || `Session ${index + 1}`;\n    return `${label} - ${date}`;\n  }\n\n  _renderInterfaceChrome(state = {}) {\n    const snapshot = state && typeof state === 'object' ? state : {};\n    const chrome = this._interfaceChrome;\n    if (!chrome) return;\n\n    chrome.surface.dataset.mode = snapshot.mode ?? 'desktop';\n    chrome.compactDockToggle.hidden = snapshot.mode !== 'compact';\n    chrome.fullscreenBar.hidden = snapshot.mode !== 'fullscreen';\n    chrome.launcherButton.hidden = snapshot.mode !== 'fullscreen';\n    chrome.compactDockToggle.dataset.side = snapshot.dockSide === 'right' ? 'right' : 'left';\n    chrome.compactDockToggle.setAttribute(\n      'aria-label',\n      snapshot.dockSide === 'right' ? 'Move dock to the left side' : 'Move dock to the right side',\n    );\n    chrome.compactDockToggle.setAttribute(\n      'title',\n      snapshot.dockSide === 'right' ? 'Move dock to the left side' : 'Move dock to the right side',\n    );\n    chrome.compactDockToggle.replaceChildren(\n      createInterfaceIcon(\n        this.container?.ownerDocument ?? document,\n        snapshot.dockSide === 'right' ? 'dock-left' : 'dock-right',\n      ),\n    );\n    chrome.launcherButton.setAttribute('aria-label', snapshot.controlsOpen === true ? 'Close controls' : 'Open controls');\n    chrome.launcherButton.setAttribute('title', snapshot.controlsOpen === true ? 'Close controls' : 'Open controls');\n    chrome.launcherButton.replaceChildren(\n      createInterfaceIcon(\n        this.container?.ownerDocument ?? document,\n        snapshot.controlsOpen === true ? 'close' : 'controls',\n      ),\n    );\n    this._renderFullscreenPanelNav(snapshot);\n\n    const prompt = storageSupportsSessions(this.helios) && !this.helios?.storage?.requestedSessionId\n      ? (snapshot.resumePrompt ?? null)\n      : null;\n    chrome.resumePrompt.hidden = !prompt?.visible;\n    if (prompt?.visible) {\n      const sourceName = prompt.networkSource?.name ?? prompt.networkSource?.baseName ?? 'previous session';\n      const sessions = Array.isArray(prompt.sessions) ? prompt.sessions.filter((entry) => entry?.id) : [];\n      chrome.resumeText.textContent = sessions.length > 1\n        ? `Resume a previous session?`\n        : `Resume previous session from ${sourceName}?`;\n      if (chrome.resumeMenu) {\n        chrome.resumeMenu.hidden = true;\n        chrome.resumeMenu.__heliosRenderSessions?.(sessions);\n      }\n    } else if (chrome.resumeMenu) {\n      chrome.resumeMenu.hidden = true;\n      chrome.resumeMenu.replaceChildren();\n    }\n  }\n\n  _orderedFullscreenPanels() {\n    const manager = this.panelManager ?? null;\n    if (!manager) return [];\n    const ordered = [];\n    const seen = new Set();\n    const appendFrom = (container) => {\n      for (const element of Array.from(container?.children ?? [])) {\n        const panelId = element?.dataset?.panelId;\n        if (!panelId || seen.has(panelId)) continue;\n        const panel = manager.getPanel?.(panelId) ?? null;\n        if (!panel) continue;\n        seen.add(panelId);\n        ordered.push(panel);\n      }\n    };\n    appendFrom(manager.fullscreenFlow);\n    appendFrom(manager.dockLeft);\n    appendFrom(manager.dockRight);\n    for (const panel of manager.getPanels?.() ?? []) {\n      if (!panel?.id || seen.has(panel.id)) continue;\n      seen.add(panel.id);\n      ordered.push(panel);\n    }\n    return ordered;\n  }\n\n  _renderFullscreenPanelNav(state = {}) {\n    const chrome = this._interfaceChrome;\n    const nav = chrome?.fullscreenPanelNav;\n    if (!nav) return;\n    const snapshot = state && typeof state === 'object' ? state : {};\n    const visible = snapshot.mode === 'fullscreen' && snapshot.controlsOpen === true;\n    nav.hidden = !visible;\n    if (!visible) {\n      nav.replaceChildren();\n      return;\n    }\n\n    const doc = this.container?.ownerDocument ?? document;\n    const buttons = this._orderedFullscreenPanels().map((panel) => {\n      const button = doc.createElement('button');\n      button.type = 'button';\n      button.className = 'helios-ui-button helios-ui-fullscreen-panel-nav__button';\n      button.dataset.panelId = panel.id;\n      button.dataset.active = snapshot.activePanelId === panel.id ? 'true' : 'false';\n      button.setAttribute('aria-label', `Jump to ${panel.title}`);\n      button.setAttribute('title', panel.title);\n      button.appendChild(\n        createPanelIcon(doc, { id: panel.id, title: panel.title }, { className: 'helios-ui-fullscreen-panel-nav__icon' }),\n      );\n      button.addEventListener('click', () => {\n        this._jumpToFullscreenPanel(panel.id);\n      });\n      return button;\n    });\n    nav.replaceChildren(...buttons);\n  }\n\n  _jumpToFullscreenPanel(panelId) {\n    const panel = this.panelManager?.getPanel?.(panelId) ?? null;\n    if (!panel) return;\n    if (typeof panel.collapsed === 'function' && panel.collapsed()) {\n      panel.setCollapsed?.(false);\n    } else if (panel.element?.dataset?.collapsed === 'true') {\n      panel.setCollapsed?.(false);\n    }\n    this.interfaceBehavior?.clearActiveControl?.();\n    this._setActiveControlScope(null);\n    const scroller = this.panelManager?.fullscreenFlow ?? null;\n    const waitForScroll = this._fullscreenPanelJumpNeedsScroll(panel, scroller);\n    this._queueFullscreenPanelHeaderShine(panel, { scroller, waitForScroll });\n    panel.element?.scrollIntoView?.({ block: 'start', behavior: 'smooth' });\n  }\n\n  _fullscreenPanelJumpNeedsScroll(panel, scroller) {\n    if (!panel?.element?.getBoundingClientRect || !scroller?.getBoundingClientRect) return false;\n    const panelRect = panel.element.getBoundingClientRect();\n    const scrollerRect = scroller.getBoundingClientRect();\n    if (!Number.isFinite(panelRect?.top) || !Number.isFinite(panelRect?.bottom)) return false;\n    if (!Number.isFinite(scrollerRect?.top) || !Number.isFinite(scrollerRect?.bottom)) return false;\n    const tolerance = 2;\n    return panelRect.top < scrollerRect.top + tolerance || panelRect.bottom > scrollerRect.bottom - tolerance;\n  }\n\n  _queueFullscreenPanelHeaderShine(panel, options = {}) {\n    this._cancelPendingPanelHeaderShine();\n    const { scroller = null, waitForScroll = false } = options;\n    if (!waitForScroll || !scroller || typeof scroller.addEventListener !== 'function') {\n      this._shineFullscreenPanelHeader(panel);\n      return;\n    }\n    const clock = this.container?.ownerDocument?.defaultView ?? globalThis;\n    let settleTimer = null;\n    const finish = () => {\n      cleanup();\n      this._shineFullscreenPanelHeader(panel);\n    };\n    const scheduleFinish = (delay = 140) => {\n      if (settleTimer != null) clock.clearTimeout?.(settleTimer);\n      settleTimer = clock.setTimeout?.(finish, delay) ?? null;\n    };\n    const onScroll = () => {\n      scheduleFinish(140);\n    };\n    const cleanup = () => {\n      if (settleTimer != null) {\n        clock.clearTimeout?.(settleTimer);\n        settleTimer = null;\n      }\n      scroller.removeEventListener?.('scroll', onScroll);\n      if (this._pendingPanelHeaderShine?.cleanup === cleanup) this._pendingPanelHeaderShine = null;\n    };\n    this._pendingPanelHeaderShine = { cleanup };\n    scroller.addEventListener('scroll', onScroll);\n    scheduleFinish(160);\n  }\n\n  _cancelPendingPanelHeaderShine() {\n    this._pendingPanelHeaderShine?.cleanup?.();\n    this._pendingPanelHeaderShine = null;\n  }\n\n  _shineFullscreenPanelHeader(panel) {\n    const header = panel?.header ?? panel?.element?.querySelector?.('.helios-ui-panel__header') ?? null;\n    if (!header?.dataset) return;\n    if (!this._panelHeaderShineTimers) this._panelHeaderShineTimers = new WeakMap();\n    const previousTimer = this._panelHeaderShineTimers.get(header);\n    if (previousTimer != null) {\n      const clock = this.container?.ownerDocument?.defaultView ?? globalThis;\n      clock.clearTimeout?.(previousTimer);\n    }\n    header.dataset.navShine = 'true';\n    const clock = this.container?.ownerDocument?.defaultView ?? globalThis;\n    const timer = clock.setTimeout?.(() => {\n      if (header?.dataset) delete header.dataset.navShine;\n      this._panelHeaderShineTimers?.delete?.(header);\n    }, 1150);\n    if (timer != null) this._panelHeaderShineTimers.set(header, timer);\n  }\n\n  _resolveActiveControlScope(target) {\n    if (!target || typeof target.closest !== 'function') return null;\n    if (!this._isTransparencyEligibleControl(target)) return null;\n    const localScope = target.closest('.helios-ui-row, .helios-ui-layout__actions, .helios-ui-network__actions');\n    if (localScope) return localScope;\n    const scopeId = target.closest('[data-interface-focus-scope-id]')?.dataset?.interfaceFocusScopeId;\n    if (!scopeId) return null;\n    return this.container?.querySelector?.(`[data-interface-focus-scope-id=\"${scopeId}\"]`) ?? null;\n  }\n\n  _isTransparencyEligibleControl(target) {\n    if (!target || typeof target.closest !== 'function') return false;\n    if (target.closest('[data-interface-focus-ignore=\"true\"]')) return false;\n    if (target.closest('[data-interface-focus-control=\"true\"]')) return true;\n\n    const control = target.closest('input, select, textarea, [role=\"switch\"], [role=\"radiogroup\"], [role=\"radio\"]');\n    if (!control) return false;\n    if (control.closest('[data-interface-focus-ignore=\"true\"]')) return false;\n    if (control.tagName === 'INPUT') {\n      const type = String(control.getAttribute?.('type') ?? control.type ?? '').toLowerCase();\n      if (type === 'button' || type === 'submit' || type === 'reset' || type === 'file') return false;\n    }\n    return true;\n  }\n\n  _resolveActivePanelId(target, scope = null) {\n    const explicitPanelId = target?.closest?.('[data-interface-panel-id]')?.dataset?.interfacePanelId;\n    if (explicitPanelId) return explicitPanelId;\n    const panelId = scope?.closest?.('.helios-ui-panel')?.dataset?.panelId\n      ?? target?.closest?.('.helios-ui-panel')?.dataset?.panelId\n      ?? null;\n    return typeof panelId === 'string' && panelId ? panelId : null;\n  }\n\n  _installInterfaceControlTracking() {\n    const host = this.container;\n    if (!host?.addEventListener) return;\n\n    const activate = (event) => {\n      const scope = this._resolveActiveControlScope(event?.target);\n      if (!scope) return;\n      this._setActiveControlScope(scope);\n      const panelId = this._resolveActivePanelId(event?.target, scope);\n      if (panelId) this.interfaceBehavior?.activateControl?.(panelId);\n    };\n    const activateFromPointerDown = (event) => {\n      // On touch screens, pointerdown often begins a scroll gesture.\n      // Defer transparency activation until we see a real control interaction\n      // such as input/change/click, otherwise mobile scrolling can get stuck\n      // in focused-control mode.\n      if (event?.pointerType === 'touch') return;\n      activate(event);\n    };\n    const release = () => {\n      this._scheduleInterfaceControlRelease();\n    };\n    const releaseImmediately = () => {\n      if (this._interfaceReleaseTimer != null) {\n        clearTimeout(this._interfaceReleaseTimer);\n        this._interfaceReleaseTimer = null;\n      }\n      this._setActiveControlScope(null);\n      this.interfaceBehavior?.clearActiveControl?.();\n    };\n\n    host.addEventListener('pointerdown', activateFromPointerDown, { capture: true });\n    host.addEventListener('focusin', activate);\n    host.addEventListener('input', activate);\n    host.addEventListener('change', activate);\n    host.addEventListener('click', activate);\n    host.addEventListener('pointerup', release, { capture: true });\n    host.addEventListener('pointercancel', releaseImmediately, { capture: true });\n    host.addEventListener('scroll', releaseImmediately, { capture: true });\n    host.addEventListener('change', release);\n    host.addEventListener('focusout', release);\n\n    this._controlCleanups.add(() => {\n      host.removeEventListener('pointerdown', activateFromPointerDown, { capture: true });\n      host.removeEventListener('focusin', activate);\n      host.removeEventListener('input', activate);\n      host.removeEventListener('change', activate);\n      host.removeEventListener('click', activate);\n      host.removeEventListener('pointerup', release, { capture: true });\n      host.removeEventListener('pointercancel', releaseImmediately, { capture: true });\n      host.removeEventListener('scroll', releaseImmediately, { capture: true });\n      host.removeEventListener('change', release);\n      host.removeEventListener('focusout', release);\n    });\n  }\n\n  _setActiveControlScope(scope) {\n    if (this._activeControlScope === scope) return;\n    if (this._activeControlScope?.dataset) {\n      delete this._activeControlScope.dataset.controlFocusActive;\n    }\n    this._activeControlScope = scope ?? null;\n    if (this._activeControlScope?.dataset) {\n      this._activeControlScope.dataset.controlFocusActive = 'true';\n      if (this.container?.dataset) this.container.dataset.focusedControlScope = 'row';\n    } else if (this.container?.dataset) {\n      delete this.container.dataset.focusedControlScope;\n    }\n  }\n\n  _scheduleInterfaceControlRelease() {\n    if (this._interfaceReleaseTimer != null) {\n      clearTimeout(this._interfaceReleaseTimer);\n    }\n    this._interfaceReleaseTimer = setTimeout(() => {\n      this._interfaceReleaseTimer = null;\n      this._setActiveControlScope(null);\n      this.interfaceBehavior?.clearActiveControl?.();\n    }, INTERFACE_CONTROL_RELEASE_MS);\n  }\n\n  /**\n   * Bind a Helios accessor method to a UIAttribute.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {string} accessorName - Name of the Helios getter/setter method.\n   * @param {object} [options] - Attribute metadata, range, persistence, and labeling options.\n   * @returns {UIAttribute} Attribute wrapper suitable for controls and panels.\n   */\n  bindHeliosAccessor(accessorName, options = {}) {\n    if (!this.helios) {\n      throw new Error('HeliosUI.bindHeliosAccessor requires a Helios instance');\n    }\n    const accessor = this.helios[accessorName];\n    if (typeof accessor !== 'function') {\n      throw new Error(`Helios instance has no accessor method \"${accessorName}()\"`);\n    }\n    const info = typeof this.helios.uiBindingInfo === 'function'\n      ? (this.helios.uiBindingInfo(accessorName) ?? null)\n      : null;\n    const merged = info ? { ...info, ...options } : options;\n    const eventName = merged.eventName ?? (accessorName === 'background' ? 'clearColor' : accessorName);\n    const persistencePath = STATE_ACCESSOR_PATHS[accessorName] ?? STATE_ACCESSOR_PATHS[eventName] ?? null;\n    const storageAttribute = this._createStateBackedAttribute(persistencePath, {\n      ...merged,\n      id: merged.id ?? `helios.${eventName}`,\n      label: merged.label ?? humanizeControlLabel(accessorName),\n      meta: { source: 'helios', accessor: accessorName, eventName, ...merged.meta },\n    });\n    if (storageAttribute) return storageAttribute;\n    const id = merged.id ?? `helios.${eventName}`;\n    const label = merged.label ?? humanizeControlLabel(accessorName);\n    const defaultValue = merged.defaultValue ?? null;\n    const type = merged.type ?? 'number';\n    const makeAttribute = (factory) => factory({\n      id,\n      label,\n      readOnly: Boolean(merged.readOnly ?? false),\n      min: merged.min ?? null,\n      max: merged.max ?? null,\n      step: merged.step ?? null,\n      domain: merged.domain ?? null,\n      recommendedRange: merged.recommendedRange ?? null,\n      meta: { source: 'helios', accessor: accessorName, eventName, ...merged.meta },\n      get: () => {\n        const value = accessor.call(this.helios);\n        return value == null ? defaultValue : value;\n      },\n      set: (value) => accessor.call(this.helios, value),\n    });\n    const attribute = type === 'boolean'\n      ? makeAttribute(UIAttribute.boolean)\n      : type === 'string'\n        ? makeAttribute(UIAttribute.string)\n        : makeAttribute(UIAttribute.number);\n    this._boundAttributesById.set(id, attribute);\n    if (persistencePath) {\n      this._trackAttributeState(attribute, persistencePath, {\n        scope: merged.persistenceScope ?? stateScopeForPath(persistencePath),\n        debounceMs: merged.persistenceDebounceMs ?? stateDebounceForPath(persistencePath),\n        defaultValue,\n        metadata: { accessor: accessorName, eventName },\n      });\n    }\n    this._ensureHeliosBindingListener();\n    return attribute;\n  }\n\n  /**\n   * Bind a behavior accessor method to a UIAttribute.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {Behavior} behavior - Behavior instance that owns the accessor.\n   * @param {string} accessorName - Name of the behavior getter/setter method.\n   * @param {object} [options] - Attribute metadata, range, persistence, and labeling options.\n   * @returns {UIAttribute} Attribute wrapper suitable for controls and panels.\n   */\n  bindBehaviorAccessor(behavior, accessorName, options = {}) {\n    if (!behavior || typeof behavior?.[accessorName] !== 'function') {\n      throw new Error(`Behavior has no accessor method \"${accessorName}()\"`);\n    }\n    const info = typeof this.helios?.uiBindingInfo === 'function'\n      ? (this.helios.uiBindingInfo(accessorName) ?? null)\n      : null;\n    const merged = info ? { ...info, ...options } : options;\n    const id = merged.id ?? `helios.behavior.${behavior.id ?? 'behavior'}.${accessorName}`;\n    const label = merged.label ?? humanizeControlLabel(accessorName);\n    const behaviorId = String(behavior.id ?? 'behavior');\n    const mappedPersistencePath = STATE_ACCESSOR_PATHS[accessorName] ?? null;\n    const persistencePath = merged.persistencePath ?? mappedPersistencePath ?? `behaviors.${behaviorId}.${accessorName}`;\n    const storageAttribute = this._createStateBackedAttribute(persistencePath, {\n      ...merged,\n      id,\n      label,\n      meta: { source: 'behavior', behavior: behavior.id ?? null, accessor: accessorName, ...merged.meta },\n    });\n    if (storageAttribute) return storageAttribute;\n    const defaultValue = merged.defaultValue ?? null;\n    const type = merged.type ?? 'number';\n    const makeAttribute = (factory) => factory({\n      id,\n      label,\n      readOnly: Boolean(merged.readOnly ?? false),\n      min: merged.min ?? null,\n      max: merged.max ?? null,\n      step: merged.step ?? null,\n      domain: merged.domain ?? null,\n      recommendedRange: merged.recommendedRange ?? null,\n      meta: { source: 'behavior', behavior: behavior.id ?? null, accessor: accessorName, ...merged.meta },\n      get: () => {\n        const value = behavior[accessorName]();\n        return value == null ? defaultValue : value;\n      },\n      set: (value) => behavior[accessorName](value),\n    });\n    const attribute = type === 'boolean'\n      ? makeAttribute(UIAttribute.boolean)\n      : type === 'string'\n        ? makeAttribute(UIAttribute.string)\n        : makeAttribute(UIAttribute.number);\n    this._trackAttributeState(attribute, persistencePath, {\n      scope: merged.persistenceScope ?? (behaviorId === 'interface' || behaviorId === 'exporter' ? 'user' : 'network'),\n      debounceMs: merged.persistenceDebounceMs ?? STATE_ACCESSOR_DEBOUNCE_MS,\n      defaultValue,\n      metadata: { behavior: behaviorId, accessor: accessorName },\n    });\n    const unsubscribe = behavior.on?.('change', () => attribute.notify()) ?? (() => {});\n    this._controlCleanups.add(() => unsubscribe());\n    return attribute;\n  }\n\n  _createStateBackedAttribute(path, options = {}) {\n    const stateManager = this.helios?.states ?? null;\n    const target = String(path ?? '').trim();\n    if (!target || typeof stateManager?.entry !== 'function' || typeof stateManager?.set !== 'function') return null;\n    const entry = stateManager.entry(target);\n    if (!entry) return null;\n    const ui = entry.ui ?? {};\n    const type = entry.type === 'boolean'\n      ? 'boolean'\n      : (entry.type === 'string' || entry.type === 'enum' ? 'string' : 'number');\n    const defaultValue = Object.prototype.hasOwnProperty.call(options, 'defaultValue')\n      ? options.defaultValue\n      : entry.default;\n    const meta = {\n      storageKey: target,\n      ...(options.meta ?? {}),\n    };\n    if (ui.inputMin != null) meta.inputMin = ui.inputMin;\n    if (ui.inputMax != null) meta.inputMax = ui.inputMax;\n    const attributeOptions = {\n      id: options.id ?? entry.key ?? target,\n      label: ui.label ?? options.label ?? humanizeControlLabel(entry.key ?? target),\n      readOnly: Boolean(options.readOnly ?? false),\n      min: options.min ?? ui.min ?? ui.sliderMin ?? null,\n      max: options.max ?? ui.max ?? ui.sliderMax ?? null,\n      step: options.step ?? ui.step ?? null,\n      domain: options.domain ?? null,\n      recommendedRange: options.recommendedRange ?? (\n        Number.isFinite(Number(ui.sliderMin)) && Number.isFinite(Number(ui.sliderMax))\n          ? { min: Number(ui.sliderMin), max: Number(ui.sliderMax) }\n          : null\n      ),\n      meta,\n      get: () => {\n        const value = stateManager.get(target, defaultValue);\n        return value == null ? defaultValue : value;\n      },\n      set: (value) => {\n        stateManager.set(target, value, {\n          source: 'ui',\n          reason: options.reason ?? 'control',\n          autosave: options.autosave,\n          debounceMs: type === 'boolean' ? 0 : options.persistenceDebounceMs,\n          journal: false,\n        });\n      },\n    };\n    const attribute = type === 'boolean'\n      ? UIAttribute.boolean(attributeOptions)\n      : type === 'string'\n        ? UIAttribute.string(attributeOptions)\n        : UIAttribute.number(attributeOptions);\n    this._boundAttributesById.set(attribute.id, attribute);\n    const unsubscribe = stateManager.subscribe(target, (_value, detail = {}) => {\n      if (detail?.source === 'ui') return;\n      attribute.notify();\n    }, { immediate: false });\n    this._controlCleanups.add(() => unsubscribe());\n    return attribute;\n  }\n\n  /**\n   * Create a standard Helios UI panel.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {object} options - Panel id, title, placement, content, schema, and persistence options.\n   * @returns {Panel} Panel instance returned by the panel manager.\n   */\n  createPanel(options) {\n    const panel = this.panelManager.createPanel({\n      ...options,\n      icon: options?.icon ?? resolvePanelIconKind({ id: options?.id, title: options?.title }),\n    });\n    const panelSchema = options?.panelSchema ?? null;\n    const persistencePath = options?.persistencePath === false\n      ? null\n      : (panelSchema ? null : (options?.persistencePath ?? persistencePanelPathForId(options?.id, options?.title)));\n    if ((panelSchema || persistencePath) && panel?.actionsEl) {\n      const indicator = panelSchema\n        ? createPanelSchemaIndicator({\n          helios: this.helios,\n          schema: panelSchema,\n        })\n        : this.createStateIndicator(persistencePath, persistencePath, {\n          mode: 'scope',\n          metadata: { panel: options?.id ?? null },\n        });\n      if (indicator) {\n        indicator.classList.add('helios-ui-panel__persistence-indicator');\n        panel.actionsEl.insertBefore(indicator, panel.collapseButton ?? null);\n        this._controlCleanups.add(() => indicator.destroy?.());\n      }\n    }\n    this._schedulePersistenceBaselineRefresh();\n    return panel;\n  }\n\n  /**\n   * Create a panel whose content is managed by a tabbed panel primitive.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {object} [options] - Panel and tab options.\n   * @returns {Panel} Created panel instance.\n   */\n  createTabbedPanel(options = {}) {\n    const tabs = new TabbedPanel({\n      tabs: options.tabs ?? [],\n      activeId: options.activeId,\n      barRight: options.barRight,\n      variant: options.variant,\n      onActiveChanged: options.onActiveChanged,\n    });\n    this._controlCleanups.add(() => tabs.destroy());\n    return this.createPanel({\n      id: options.id,\n      title: options.title,\n      position: options.position,\n      dock: options.dock,\n      persistencePath: options.persistencePath,\n      panelSchema: options.panelSchema,\n      content: tabs.element,\n    });\n  }\n\n  /**\n   * Create the default scene/demo controls panel.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {object} [options] - Panel placement and title options.\n   * @returns {Panel} Created panel instance.\n   */\n  createDemoPanel(options = {}) {\n    const content = document.createElement('div');\n\n    const tooltips = createTooltipManager();\n    this._controlCleanups.add(() => tooltips.destroy());\n\n    const createStateIndicator = (path = '', scope = null) => {\n      if (!this.persistenceIndicators) return null;\n      const indicator = createDirtyIndicator({\n        helios: this.helios,\n        path: path ?? '',\n        scope: scope ?? scopeForStatePath(path),\n        attachTooltip: tooltips.attachTooltip,\n      });\n      this._controlCleanups.add(() => indicator.destroy?.());\n      return indicator;\n    };\n\n    const createAlignedRow = ({ title, hint, controls, dirtyIndicator }) => createAlignedRowEl({\n      title,\n      hint,\n      controls,\n      dirtyIndicator: dirtyIndicator === undefined ? createStateIndicator() : dirtyIndicator,\n      attachTooltip: tooltips.attachTooltip,\n    });\n\n    const statePathForAccessor = (accessorName) => STATE_ACCESSOR_PATHS[accessorName] ?? null;\n\n    const createHeaderControlsWithIndicator = (control, path) => {\n      const controls = document.createElement('div');\n      controls.className = 'helios-ui-row__controls';\n      const indicator = createStateIndicator(path);\n      if (indicator) controls.appendChild(indicator);\n      controls.appendChild(control);\n      return controls;\n    };\n\n    let themeRow = document.createElement('div');\n    const themeToggle = createSegmentedToggleControl({\n      checked: this.theme === 'dark',\n      onLabel: 'Dark',\n      offLabel: 'Light',\n      ariaLabel: 'Theme',\n    });\n    themeToggle.dataset.interfaceFocusIgnore = 'true';\n    themeToggle.addEventListener('change', () => {\n      this.toggleTheme({ source: 'ui', reason: 'theme' });\n      themeToggle.checked = this.theme === 'dark';\n      this._writeStateValue('ui.theme', this.theme, {\n        scope: 'user',\n        source: 'ui',\n        reason: 'theme',\n        debounceMs: 0,\n      });\n    });\n\n    const built = createAlignedRow({\n      title: 'Theme',\n      hint: 'Toggle light/dark',\n      controls: themeToggle,\n      dirtyIndicator: createStateIndicator('ui.theme', 'ui'),\n    });\n    themeRow = built.row;\n\n    if (this.helios) {\n      const bindings = this.helios?.constructor?.UI_BINDINGS ?? null;\n\n      const networkControls = (() => {\n        const container = document.createElement('div');\n        container.className = 'helios-ui-network';\n\n        const fileInput = document.createElement('input');\n        fileInput.type = 'file';\n        fileInput.accept = '.xnet,.zxnet,.bxnet,.gml,.gt,.gt.zst';\n        fileInput.style.display = 'none';\n\n        const formatSelect = document.createElement('select');\n        formatSelect.className = 'helios-ui-select helios-ui-select--compact';\n        for (const fmt of ['bxnet', 'zxnet', 'xnet', 'gml', 'gt']) {\n          const opt = document.createElement('option');\n          opt.value = fmt;\n          opt.textContent = fmt.toUpperCase();\n          formatSelect.appendChild(opt);\n        }\n\n        const formatWarning = document.createElement('span');\n        formatWarning.className = 'helios-ui-network__format-warning';\n        formatWarning.setAttribute('role', 'img');\n        formatWarning.setAttribute('aria-label', 'interoperability export warning');\n        formatWarning.hidden = true;\n        const warningIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n        warningIcon.setAttribute('viewBox', '0 0 24 24');\n        warningIcon.setAttribute('aria-hidden', 'true');\n        warningIcon.classList.add('helios-ui-network__format-warning-icon');\n        const warningPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n        warningPath.setAttribute('d', 'M10.3 4.4 2.5 18a2 2 0 0 0 1.7 3h15.6a2 2 0 0 0 1.7-3L13.7 4.4a2 2 0 0 0-3.4 0ZM12 9v5m0 3h.01');\n        warningPath.setAttribute('fill', 'none');\n        warningPath.setAttribute('stroke', 'currentColor');\n        warningPath.setAttribute('stroke-width', '2');\n        warningPath.setAttribute('stroke-linecap', 'round');\n        warningPath.setAttribute('stroke-linejoin', 'round');\n        warningIcon.appendChild(warningPath);\n        formatWarning.appendChild(warningIcon);\n\n        const loadButton = document.createElement('button');\n        loadButton.type = 'button';\n        loadButton.className = 'helios-ui-button helios-ui-button--icon';\n        loadButton.setAttribute('aria-label', 'Load network…');\n\n        const saveButton = document.createElement('button');\n        saveButton.type = 'button';\n        saveButton.className = 'helios-ui-button helios-ui-button--icon';\n        saveButton.setAttribute('aria-label', 'Save network');\n\n        const makeIcon = (d) => {\n          const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n          svg.setAttribute('viewBox', '0 0 24 24');\n          svg.classList.add('helios-ui-button__icon');\n          const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n          path.setAttribute('d', d);\n          path.setAttribute('fill', 'none');\n          path.setAttribute('stroke', 'currentColor');\n          path.setAttribute('stroke-width', '2');\n          path.setAttribute('stroke-linecap', 'round');\n          path.setAttribute('stroke-linejoin', 'round');\n          svg.appendChild(path);\n          return svg;\n        };\n\n        // Simple, readable icons (stroke, currentColor).\n        const loadIcon = makeIcon('M12 3v10m0 0l-4-4m4 4l4-4M4 17v3h16v-3');\n        const saveIcon = makeIcon('M12 21V11m0 0l-4 4m4-4l4 4M4 7V4h16v3');\n        const syncIcon = makeIcon('M21 12a9 9 0 0 1-15.5 6.2M3 12A9 9 0 0 1 18.5 5.8M18 3v4h-4M6 21v-4h4');\n\n        const loadText = document.createElement('span');\n        loadText.textContent = 'Load';\n        const saveText = document.createElement('span');\n        saveText.textContent = 'Save';\n        loadButton.appendChild(loadIcon);\n        loadButton.appendChild(loadText);\n        saveButton.appendChild(saveIcon);\n        saveButton.appendChild(saveText);\n\n        tooltips.attachTooltip(loadButton, 'Load a network file (.xnet/.zxnet/.bxnet/.gml/.gt/.gt.zst)');\n        tooltips.attachTooltip(saveButton, 'Save the current network, visualization state, and positions as a file');\n        tooltips.attachTooltip(formatSelect, 'Select export format');\n        tooltips.attachTooltip(formatWarning, 'GML and GT exports are interoperability formats: private Helios state and unsupported attribute types may be skipped, renamed, or stringified.');\n\n        const syncContainer = document.createElement('div');\n        syncContainer.className = 'helios-ui-network-persistence';\n        const syncStatus = document.createElement('span');\n        syncStatus.className = 'helios-ui-network-persistence__status';\n        syncStatus.textContent = 'Not synced';\n        const syncControls = document.createElement('div');\n        syncControls.className = 'helios-ui-network-persistence__controls';\n        const syncButton = document.createElement('button');\n        syncButton.type = 'button';\n        syncButton.className = 'helios-ui-button helios-ui-button--icon helios-ui-network-persistence__sync';\n        syncButton.setAttribute('aria-label', 'Synchronize persistence');\n        syncButton.appendChild(syncIcon);\n        syncControls.appendChild(syncButton);\n        syncContainer.appendChild(syncControls);\n        syncContainer.appendChild(syncStatus);\n        tooltips.attachTooltip(syncButton, 'Synchronize settings, network metadata, and positions');\n\n        const autoSyncGroup = document.createElement('div');\n        autoSyncGroup.className = 'helios-ui-network-autosync';\n        const autoSyncLabel = document.createElement('span');\n        autoSyncLabel.className = 'helios-ui-network-autosync__label';\n        autoSyncLabel.textContent = 'Auto Sync';\n        const autoSyncToggle = createToggleControl({\n          checked: this.helios?.states?.get?.('network.persistence.autosave', true) !== false,\n          onLabel: 'On',\n          offLabel: 'Off',\n          ariaLabel: 'Auto sync network persistence',\n          className: 'helios-ui-toggle helios-ui-toggle--compact helios-ui-network-autosync__toggle',\n        });\n        autoSyncGroup.appendChild(autoSyncLabel);\n        autoSyncGroup.appendChild(autoSyncToggle);\n        tooltips.attachTooltip(autoSyncToggle, 'Automatically synchronize network state and positions when they change');\n        syncControls.appendChild(autoSyncGroup);\n\n        const controls = document.createElement('div');\n        controls.className = 'helios-ui-network__actions';\n        controls.style.marginTop = '8px';\n        controls.style.marginBottom = '10px';\n        controls.appendChild(loadButton);\n        controls.appendChild(saveButton);\n        controls.appendChild(formatSelect);\n        controls.appendChild(formatWarning);\n        controls.appendChild(fileInput);\n\n        const formatRelativeSyncTime = (timestamp) => {\n          if (!Number.isFinite(timestamp)) return null;\n          const elapsed = Math.max(0, Date.now() - Number(timestamp));\n          if (elapsed < 60000) return `${Math.floor(elapsed / 1000)}s ago`;\n          if (elapsed < 3600000) return `${Math.floor(elapsed / 60000)}m ago`;\n          return `${Math.floor(elapsed / 3600000)}h ago`;\n        };\n\n        const resolveNetworkPayloadSavedAt = (status) => {\n          const savedAt = Number(status?.networkData?.savedAt);\n          return Number.isFinite(savedAt) && savedAt > 0 ? savedAt : null;\n        };\n\n        const showNetworkFileActions = options.showNetworkFileActions !== false;\n        const showPersistenceSync = options.showPersistenceSync !== false && storageSupportsPersistentUI(this.helios);\n        const showSessionTab = options.showSessionTab !== false && storageSupportsSessions(this.helios);\n\n        let lastPersistenceStatusSignature = '';\n        const syncPersistenceStatus = (statusOverride = null) => {\n          if (!showPersistenceSync) return;\n          const storage = this.helios?.storage ?? null;\n          const status = statusOverride ?? storage?.persistenceStatus?.() ?? storage?.status?.() ?? null;\n          const networkData = status?.networkData ?? {};\n          const backendStatus = status?.backendStatus ?? [];\n          const failed = backendStatus.find((entry) => entry?.ok === false) ?? null;\n          const failureMessage = failed?.error\n            ?? status?.sessionSync?.error\n            ?? status?.lastError\n            ?? networkData.remoteWarning\n            ?? '';\n          const syncWarning = status?.sessionSync?.warning\n            ?? status?.lastWarning\n            ?? networkData.syncWarning\n            ?? '';\n          const logSyncFailure = () => {\n            if (!failureMessage) return;\n            const key = JSON.stringify({\n              message: failureMessage,\n              backend: failed?.id ?? failed?.name ?? failed?.type ?? null,\n              sessionId: status?.sessionId ?? null,\n            });\n            if (this._lastLoggedSyncFailure === key || LOGGED_SYNC_FAILURE_KEYS.has(key)) return;\n            this._lastLoggedSyncFailure = key;\n            LOGGED_SYNC_FAILURE_KEYS.add(key);\n            if (LOGGED_SYNC_FAILURE_KEYS.size > MAX_LOGGED_SYNC_FAILURE_KEYS) {\n              const [oldest] = LOGGED_SYNC_FAILURE_KEYS;\n              LOGGED_SYNC_FAILURE_KEYS.delete(oldest);\n            }\n            console.error('[HeliosStorage] Sync failed', {\n              error: failureMessage,\n              backend: failed ?? null,\n              status,\n            });\n          };\n          const savedAt = resolveNetworkPayloadSavedAt(status);\n          const hasSavedAt = savedAt != null;\n          const signature = JSON.stringify({\n            syncing: status?.syncing === true,\n            sessionStatus: status?.sessionSync?.status ?? null,\n            sessionSavedAt: status?.sessionSync?.savedAt ?? null,\n            networkStatus: networkData.status ?? null,\n            dirty: networkData.dirty === true,\n            networkDirty: networkData.networkDirty === true,\n            positionsDirty: networkData.positionsDirty === true,\n            autosyncDisabled: networkData.autosyncDisabled === true,\n            autosyncDisabledReason: networkData.autosyncDisabledReason?.message ?? '',\n            enabled: networkData.enabled !== false,\n            autosave: networkData.autosave !== false,\n            savedAt,\n            lastError: status?.lastError ?? null,\n            lastWarning: status?.lastWarning ?? null,\n            remoteWarning: networkData.remoteWarning ?? null,\n            timeBucket: hasSavedAt ? Math.floor(Date.now() / 10000) : 0,\n          });\n          if (signature === lastPersistenceStatusSignature) return;\n          lastPersistenceStatusSignature = signature;\n          const cleanSyncedText = hasSavedAt ? 'Synced' : null;\n          const lastSyncedText = hasSavedAt ? `Last synced ${formatRelativeSyncTime(savedAt)}.` : '';\n          const networkPersistenceEnabled = networkData.enabled !== false;\n          const autosyncDisabledReason = networkData.autosyncDisabledReason?.message\n            ?? (networkData.autosyncDisabled === true\n              ? 'Auto sync is disabled for this session. Use manual Sync to save changes.'\n              : '');\n          const autosyncDisabled = networkData.autosyncDisabled === true;\n          autoSyncToggle.checked = autosyncDisabled\n            ? false\n            : networkData.autosave !== false;\n          autoSyncToggle.disabled = !networkPersistenceEnabled || autosyncDisabled;\n          autoSyncGroup.title = autosyncDisabledReason;\n          autoSyncToggle.title = autosyncDisabledReason;\n          autoSyncGroup.dataset.state = autosyncDisabled ? 'disabled' : 'enabled';\n          syncButton.title = '';\n          if (status?.syncing || networkData.status === 'syncing') {\n            syncStatus.textContent = syncWarning ? 'Sync still running' : 'Syncing...';\n            syncButton.dataset.state = 'syncing';\n            syncButton.disabled = true;\n            syncButton.title = syncWarning;\n          } else if (networkData.status === 'skipped' && networkData.skipped?.reason === 'size-limit') {\n            syncStatus.textContent = 'Network too large';\n            syncButton.dataset.state = 'error';\n            syncButton.disabled = false;\n            syncButton.title = 'Network autosave was skipped because the payload is larger than the configured storage limit.';\n          } else if (failed || status?.sessionSync?.status === 'error' || status?.lastError || networkData.remoteWarning) {\n            logSyncFailure();\n            syncStatus.textContent = 'Sync failed';\n            syncButton.dataset.state = 'error';\n            syncButton.disabled = false;\n            syncButton.title = failureMessage;\n          } else if (networkData.positionsDirty) {\n            syncStatus.textContent = 'Unsynced positions';\n            syncButton.dataset.state = 'dirty';\n            syncButton.disabled = false;\n            syncButton.title = `${lastSyncedText} Position changes will sync after interaction idle and the autosync debounce.`.trim();\n          } else if (networkData.dirty) {\n            syncStatus.textContent = 'Unsynced changes';\n            syncButton.dataset.state = 'dirty';\n            syncButton.disabled = false;\n            syncButton.title = `${lastSyncedText} Session changes will sync after interaction idle and the autosync debounce.`.trim();\n          } else if (hasSavedAt) {\n            syncStatus.textContent = cleanSyncedText;\n            syncButton.dataset.state = 'saved';\n            syncButton.disabled = false;\n          } else {\n            syncStatus.textContent = '';\n            syncButton.dataset.state = 'idle';\n            syncButton.disabled = false;\n          }\n        };\n\n        const syncPersistenceStatusForChange = (event) => {\n          const detail = event?.detail && typeof event.detail === 'object' ? event.detail : {};\n          const reason = String(detail.reason ?? '');\n          const networkStatus = detail.status?.networkData && typeof detail.status.networkData === 'object'\n            ? detail.status.networkData\n            : null;\n          const cleanSaved = networkStatus?.status === 'saved'\n            && networkStatus.dirty !== true\n            && networkStatus.positionsDirty !== true;\n          const failed = networkStatus?.status === 'error'\n            || networkStatus?.status === 'skipped'\n            || Boolean(networkStatus?.remoteWarning)\n            || Boolean(detail.error)\n            || Boolean(detail.warning)\n            || detail.status?.sessionSync?.status === 'error';\n          const syncEvent = reason === 'session-save-start'\n            || reason === 'session-save'\n            || reason === 'session-save-finish'\n            || reason === 'session-state-delta-save'\n            || reason === 'session-save-warning'\n            || reason === 'session-save-error'\n            || reason === 'session-restore-error'\n            || reason === 'explicit-session-missing';\n          if (reason === 'load' || reason === 'autosync-size-limit' || reason === 'autosync-disabled' || syncEvent || cleanSaved || failed) {\n            syncPersistenceStatus(detail.status ?? null);\n            return;\n          }\n          if (networkStatus && (networkStatus.dirty === true || networkStatus.positionsDirty === true || networkStatus.status === 'dirty')) {\n            syncPersistenceStatus(detail.status ?? null);\n            return;\n          }\n          const entries = Array.isArray(detail.entries) ? detail.entries : [];\n          if (entries.some((entry) => {\n            const path = String(entry?.path ?? '');\n            return path.startsWith('network.persistence') || path.startsWith('positions.persistence');\n          })) {\n            syncPersistenceStatus(detail.status ?? null);\n          }\n        };\n\n        const currentSessionLoadConfirmationInfo = () => {\n          const storage = this.helios?.storage ?? null;\n          if (!storageSupportsSessions(this.helios) || !storage) return null;\n          const status = storage.persistenceStatus?.() ?? storage.status?.() ?? null;\n          if (!status || !status.sessionId) return null;\n          const networkData = status.networkData ?? {};\n          const sessionSync = status.sessionSync ?? {};\n          const savedAt = resolveNetworkPayloadSavedAt(status);\n          const needsConfirmation = status.syncing === true\n            || sessionSync.pending === true\n            || networkData.dirty === true\n            || networkData.positionsDirty === true\n            || Boolean(status.lastError)\n            || Boolean(networkData.remoteWarning)\n            || sessionSync.status === 'error'\n            || storage.hasPendingStateChanges?.() === true\n            || savedAt == null;\n          if (!needsConfirmation) return null;\n          let reason = 'The current session is not fully synced.';\n          if (status.syncing === true || sessionSync.pending === true) {\n            reason = 'A session sync is still running.';\n          } else if (status.lastError || networkData.remoteWarning || sessionSync.status === 'error') {\n            reason = 'The last session sync failed.';\n          } else if (networkData.positionsDirty === true) {\n            reason = 'The current session has unsynced position changes.';\n          } else if (networkData.dirty === true || storage.hasPendingStateChanges?.() === true) {\n            reason = 'The current session has unsynced changes.';\n          } else if (savedAt == null) {\n            reason = 'The current session has never been synced.';\n          }\n          return {\n            status,\n            reason,\n            syncSummary: savedAt == null ? 'Not synced yet.' : `Last synced ${formatRelativeSyncTime(savedAt)}.`,\n          };\n        };\n\n        const currentSessionSyncPayloadOptions = () => {\n          const storage = this.helios?.storage ?? null;\n          const status = storage?.persistenceStatus?.() ?? storage?.status?.() ?? null;\n          const networkData = status?.networkData ?? {};\n          const hasSavedNetworkPayload = networkData.savedAt != null;\n          const includeNetwork = networkData.networkDirty === true || !hasSavedNetworkPayload;\n          return {\n            includeNetwork,\n            includePositions: networkData.positionsDirty === true,\n            captureThumbnail: includeNetwork ? 'auto' : false,\n          };\n        };\n\n        const showThemedConfirmationDialog = ({\n          title,\n          message,\n          detail = '',\n          confirmLabel = 'Continue',\n          cancelLabel = 'Cancel',\n          confirmClass = '',\n          onConfirm = null,\n        } = {}) => new Promise((resolve) => {\n          const doc = this.container?.ownerDocument ?? document;\n          if (!doc?.createElement) {\n            resolve(false);\n            return;\n          }\n          const dialog = doc.createElement('dialog');\n          dialog.className = 'helios-ui-dialog';\n          dialog.setAttribute('aria-label', title ?? 'Confirm action');\n\n          const titleEl = doc.createElement('div');\n          titleEl.className = 'helios-ui-dialog__title';\n          titleEl.textContent = title ?? 'Confirm';\n\n          const messageEl = doc.createElement('div');\n          messageEl.className = 'helios-ui-dialog__body';\n          messageEl.textContent = message ?? '';\n\n          const detailEl = doc.createElement('div');\n          detailEl.className = 'helios-ui-dialog__meta';\n          detailEl.textContent = detail ?? '';\n          detailEl.hidden = !detailEl.textContent;\n\n          const actions = doc.createElement('div');\n          actions.className = 'helios-ui-dialog__actions';\n\n          const cancel = doc.createElement('button');\n          cancel.type = 'button';\n          cancel.className = 'helios-ui-button';\n          cancel.textContent = cancelLabel;\n\n          const confirm = doc.createElement('button');\n          confirm.type = 'button';\n          confirm.className = `helios-ui-button ${confirmClass}`.trim();\n          confirm.textContent = confirmLabel;\n\n          actions.appendChild(cancel);\n          actions.appendChild(confirm);\n          dialog.appendChild(titleEl);\n          dialog.appendChild(messageEl);\n          dialog.appendChild(detailEl);\n          dialog.appendChild(actions);\n\n          const parent = this.container ?? doc.body;\n          const close = (value) => {\n            if (typeof dialog.close === 'function' && dialog.open) dialog.close();\n            dialog.remove();\n            resolve(value);\n          };\n          cancel.addEventListener('click', () => close(false));\n          confirm.addEventListener('click', () => {\n            if (typeof dialog.close === 'function' && dialog.open) dialog.close();\n            dialog.remove();\n            if (typeof onConfirm === 'function') onConfirm();\n            resolve(true);\n          });\n          dialog.addEventListener('cancel', (event) => {\n            event.preventDefault();\n            close(false);\n          });\n          parent.appendChild(dialog);\n          if (typeof dialog.showModal === 'function') dialog.showModal();\n          else dialog.setAttribute('open', '');\n          globalThis.setTimeout(() => confirm.focus(), 0);\n        });\n\n        const confirmOpenNetworkReplacement = async ({ sourceName = null } = {}) => {\n          const info = currentSessionLoadConfirmationInfo();\n          if (!info) return true;\n          const sourceLabel = sourceName ? ` \"${sourceName}\"` : '';\n          return showThemedConfirmationDialog({\n            title: 'Open Network',\n            message: `Opening${sourceLabel} will replace the current network and start a new session. Helios will try to sync the current session first; if that sync fails, you will be asked again before continuing.`,\n            detail: `${info.syncSummary} ${info.reason}`,\n            confirmLabel: 'Open Network',\n          });\n        };\n\n        const showOpenNetworkConfirmationDialog = (onConfirm) => {\n          void confirmOpenNetworkReplacement().then((confirmed) => {\n            if (confirmed && typeof onConfirm === 'function') onConfirm();\n          });\n        };\n\n        const confirmContinueWithoutSync = async ({ error, previousId, status, sourceName = null } = {}) => {\n          const previousLabel = previousId ? ` (${previousId})` : '';\n          const savedAt = resolveNetworkPayloadSavedAt(status);\n          const syncSummary = savedAt == null ? 'Not synced yet.' : `Last synced ${formatRelativeSyncTime(savedAt)}.`;\n          const errorMessage = error?.message ? ` ${error.message}` : '';\n          const sourceLabel = sourceName ? ` \"${sourceName}\"` : '';\n          return showThemedConfirmationDialog({\n            title: 'Continue Without Sync?',\n            message: `Helios could not sync the current session${previousLabel} before opening${sourceLabel}. Continue anyway? Unsynced changes in the previous session may be lost.`,\n            detail: `${syncSummary}${errorMessage}`,\n            confirmLabel: 'Continue',\n            confirmClass: 'helios-ui-button--danger',\n          });\n        };\n\n        this.helios._confirmNetworkLoadFromUi = confirmOpenNetworkReplacement;\n        this.helios._confirmUnsyncedSessionFromUi = confirmContinueWithoutSync;\n        this._controlCleanups.add(() => {\n          if (this.helios?._confirmNetworkLoadFromUi === confirmOpenNetworkReplacement) {\n            this.helios._confirmNetworkLoadFromUi = null;\n          }\n          if (this.helios?._confirmUnsyncedSessionFromUi === confirmContinueWithoutSync) {\n            this.helios._confirmUnsyncedSessionFromUi = null;\n          }\n        });\n\n        const syncStatusInterval = showPersistenceSync\n          ? setInterval(syncPersistenceStatus, 10000)\n          : null;\n        if (syncStatusInterval != null) {\n          this._controlCleanups.add(() => clearInterval(syncStatusInterval));\n        }\n\n        syncButton.addEventListener('click', async () => {\n          syncButton.disabled = true;\n          syncButton.dataset.state = 'syncing';\n          syncStatus.textContent = 'Syncing...';\n          try {\n            await this.helios?.storage?.sync?.({\n              ...currentSessionSyncPayloadOptions(),\n              retention: { enabled: false },\n            });\n          } catch (error) {\n            console.error('[HeliosStorage] Manual sync failed', error);\n          } finally {\n            syncPersistenceStatus();\n          }\n        });\n\n        autoSyncToggle.addEventListener('change', () => {\n          const stateStore = this.helios?.states ?? null;\n          stateStore?.set?.('network.persistence.autosave', autoSyncToggle.checked, {\n            scope: 'workspace',\n            source: 'ui',\n            reason: 'network-autosync-toggle',\n          });\n          this.helios?.storage?.configure?.({\n            networkPersistence: { autosave: autoSyncToggle.checked },\n          });\n          syncPersistenceStatus();\n        });\n\n        let baseName = this.helios._lastLoadedNetworkBase ?? 'network';\n        let loadedFormat = this.helios._lastLoadedNetworkFormat ?? null;\n        if (loadedFormat && ['bxnet', 'zxnet', 'xnet', 'gml', 'gt'].includes(loadedFormat)) {\n          formatSelect.value = loadedFormat;\n        }\n\n        const sanitizeBaseName = (value) => {\n          const raw = String(value ?? '').trim();\n          // Keep filenames portable and avoid path separators.\n          return raw.replace(/[\\\\/:*?\"<>|\\u0000-\\u001F]/g, '_');\n        };\n\n        let lastValidBaseName = sanitizeBaseName(baseName) || 'network';\n        baseName = lastValidBaseName;\n\n        const downloadBlob = (blob, filename) => {\n          const url = URL.createObjectURL(blob);\n          const a = document.createElement('a');\n          a.href = url;\n          a.download = filename;\n          a.style.display = 'none';\n          document.body.appendChild(a);\n          a.click();\n          a.remove();\n          setTimeout(() => URL.revokeObjectURL(url), 250);\n        };\n\n        const nameBar = document.createElement('div');\n        nameBar.className = 'helios-ui-network__name';\n        nameBar.style.marginTop = '6px';\n\n        const syncRow = document.createElement('div');\n        syncRow.className = 'helios-ui-network__sync-row';\n\n        const nameInput = document.createElement('input');\n        nameInput.type = 'text';\n        nameInput.className = 'helios-ui-text';\n        nameInput.value = lastValidBaseName;\n        nameInput.placeholder = 'network';\n        nameInput.spellcheck = false;\n        nameInput.autocapitalize = 'off';\n        nameInput.autocomplete = 'off';\n        nameInput.inputMode = 'text';\n\n        const extEl = document.createElement('span');\n        extEl.className = 'helios-ui-network__ext';\n\n        const syncExtension = () => {\n          extEl.textContent = `.${formatSelect.value}`;\n          formatWarning.hidden = formatSelect.value !== 'gml' && formatSelect.value !== 'gt';\n        };\n        syncExtension();\n\n        const exportNameInput = document.createElement('input');\n        exportNameInput.type = 'text';\n        exportNameInput.className = 'helios-ui-text';\n        exportNameInput.value = lastValidBaseName;\n        exportNameInput.placeholder = 'figure';\n        exportNameInput.spellcheck = false;\n        exportNameInput.autocapitalize = 'off';\n        exportNameInput.autocomplete = 'off';\n        exportNameInput.inputMode = 'text';\n\n        const exportFormatSelect = document.createElement('select');\n        exportFormatSelect.className = 'helios-ui-select';\n        for (const fmt of ['png', 'svg']) {\n          const opt = document.createElement('option');\n          opt.value = fmt;\n          opt.textContent = fmt.toUpperCase();\n          exportFormatSelect.appendChild(opt);\n        }\n\n        const exportExtEl = document.createElement('span');\n        exportExtEl.className = 'helios-ui-network__ext';\n\n        const commitBaseName = (input) => {\n          const candidate = sanitizeBaseName(input.value);\n          if (candidate) {\n            lastValidBaseName = candidate;\n            baseName = candidate;\n            if (nameInput.value !== candidate) nameInput.value = candidate;\n            if (exportNameInput.value !== candidate) exportNameInput.value = candidate;\n            exporterBehavior?.baseName?.(candidate);\n          } else {\n            input.value = lastValidBaseName;\n          }\n        };\n\n        const syncBaseNameFromHelios = () => {\n          const candidate = sanitizeBaseName(this.helios?._lastLoadedNetworkBase ?? '');\n          if (!candidate || candidate === lastValidBaseName) return;\n          baseName = candidate;\n          lastValidBaseName = candidate;\n          if (nameInput.value !== candidate) nameInput.value = candidate;\n          if (exportNameInput.value !== candidate) exportNameInput.value = candidate;\n          exporterBehavior?.baseName?.(candidate);\n        };\n\n        nameInput.addEventListener('blur', () => commitBaseName(nameInput));\n        nameInput.addEventListener('keydown', (e) => {\n          if (e.key === 'Enter') {\n            e.preventDefault();\n            nameInput.blur();\n          }\n        });\n        exportNameInput.addEventListener('blur', () => commitBaseName(exportNameInput));\n        exportNameInput.addEventListener('keydown', (e) => {\n          if (e.key === 'Enter') {\n            e.preventDefault();\n            exportNameInput.blur();\n          }\n        });\n\n        tooltips.attachTooltip(nameInput, 'Base filename (without extension). Used when saving.');\n        tooltips.attachTooltip(exportNameInput, 'Base filename (without extension). Used when exporting images.');\n\n        nameBar.appendChild(nameInput);\n        nameBar.appendChild(extEl);\n        if (showPersistenceSync) {\n          syncRow.appendChild(syncContainer);\n        }\n\n        const stats = document.createElement('div');\n        stats.className = 'helios-ui-stats helios-ui-network__stats';\n        stats.style.marginBottom = '8px';\n        const nodesValue = document.createElement('div');\n        nodesValue.textContent = '—';\n        const edgesValue = document.createElement('div');\n        edgesValue.textContent = '—';\n        const typeValue = document.createElement('div');\n        typeValue.textContent = '—';\n        const avgDegValue = document.createElement('div');\n        avgDegValue.textContent = '—';\n\n        stats.appendChild(createStatChip('Nodes', nodesValue).stat);\n        stats.appendChild(createStatChip('Edges', edgesValue).stat);\n        stats.appendChild(createStatChip('Type', typeValue).stat);\n        stats.appendChild(createStatChip('Avg deg', avgDegValue).stat);\n\n        const refreshNetworkInfo = () => {\n          const network = this.helios?.network ?? null;\n          const nodes = network?.nodeCount ?? 0;\n          const edges = network?.edgeCount ?? 0;\n          const directed = Boolean(network?.directed);\n          const avgDegree = nodes ? (directed ? edges / nodes : (2 * edges) / nodes) : 0;\n\n          syncBaseNameFromHelios();\n          syncExtension();\n          nodesValue.textContent = String(nodes);\n          edgesValue.textContent = String(edges);\n          typeValue.textContent = directed ? 'directed' : 'undirected';\n          avgDegValue.textContent = Number.isFinite(avgDegree) ? avgDegree.toFixed(2) : '—';\n        };\n\n        refreshNetworkInfo();\n        if (showPersistenceSync) syncPersistenceStatus();\n\n        const networkTab = document.createElement('div');\n        networkTab.appendChild(stats);\n        if (showNetworkFileActions) {\n          networkTab.appendChild(controls);\n          networkTab.appendChild(nameBar);\n        }\n        if (showPersistenceSync) networkTab.appendChild(syncRow);\n\n        const sessionTab = document.createElement('div');\n        sessionTab.className = 'helios-ui-session-tab';\n        const sessionHeader = document.createElement('div');\n        sessionHeader.className = 'helios-ui-session-tab__header';\n        const currentSession = document.createElement('div');\n        currentSession.className = 'helios-ui-session-tab__current';\n        const currentSessionLabel = document.createElement('div');\n        currentSessionLabel.className = 'helios-ui-session-tab__current-label';\n        currentSessionLabel.textContent = 'Current';\n        const currentSessionId = document.createElement('div');\n        currentSessionId.className = 'helios-ui-session-tab__current-id';\n        currentSession.appendChild(currentSessionLabel);\n        currentSession.appendChild(currentSessionId);\n        const sessionActions = document.createElement('div');\n        sessionActions.className = 'helios-ui-session-tab__actions';\n        const newSessionButton = document.createElement('button');\n        newSessionButton.type = 'button';\n        newSessionButton.className = 'helios-ui-button';\n        newSessionButton.textContent = 'Save Session';\n        const refreshSessionsButton = document.createElement('button');\n        refreshSessionsButton.type = 'button';\n        refreshSessionsButton.className = 'helios-ui-button helios-ui-button--icon';\n        refreshSessionsButton.setAttribute('aria-label', 'Refresh sessions');\n        refreshSessionsButton.appendChild(makeIcon('M21 12a9 9 0 0 1-15.5 6.2M3 12A9 9 0 0 1 18.5 5.8M18 3v4h-4M6 21v-4h4'));\n        sessionActions.appendChild(newSessionButton);\n        sessionActions.appendChild(refreshSessionsButton);\n        sessionHeader.appendChild(currentSession);\n        sessionHeader.appendChild(sessionActions);\n        const sessionList = document.createElement('div');\n        sessionList.className = 'helios-ui-session-tab__list';\n        sessionTab.appendChild(sessionHeader);\n        sessionTab.appendChild(sessionList);\n        tooltips.attachTooltip(newSessionButton, 'Save the current network state as a restorable session');\n        tooltips.attachTooltip(refreshSessionsButton, 'Refresh saved sessions');\n\n        const refreshSessionTab = async () => {\n          const storage = this.helios?.storage ?? null;\n          const currentId = storage?.sessionId ?? null;\n          currentSessionId.textContent = currentId || 'none';\n          sessionList.replaceChildren();\n          if (!storage?.capabilities?.sessions) {\n            const empty = document.createElement('div');\n            empty.className = 'helios-ui-label__hint';\n            empty.textContent = 'Session persistence is not enabled.';\n            sessionList.appendChild(empty);\n            return;\n          }\n          let sessions = [];\n          try {\n            const sessionSource = typeof storage?.listSessionSummaries === 'function' ? storage : persistence;\n            sessions = await sessionSource.listSessionSummaries({\n              includeFinished: false,\n              includeAllWorkspaces: true,\n            });\n          } catch (error) {\n            const empty = document.createElement('div');\n            empty.className = 'helios-ui-label__hint';\n            empty.textContent = `Could not load sessions: ${error?.message ?? error}`;\n            sessionList.appendChild(empty);\n            return;\n          }\n          const visibleSessions = sessions.filter((entry) => entry?.id);\n          if (!visibleSessions.length) {\n            const empty = document.createElement('div');\n            empty.className = 'helios-ui-label__hint';\n            empty.textContent = 'No saved sessions.';\n            sessionList.appendChild(empty);\n            return;\n          }\n          for (let i = 0; i < visibleSessions.length; i += 1) {\n            const session = visibleSessions[i];\n            const isCurrent = currentId != null && String(session.id) === String(currentId);\n            const row = document.createElement('div');\n            row.className = 'helios-ui-session-tab__row';\n            row.dataset.current = isCurrent ? 'true' : 'false';\n            row.dataset.sessionId = session.id;\n            const updatedAt = Number(session.updatedAt);\n            const thumbnailCapturedAt = Number(session.thumbnail?.capturedAt);\n            const thumbnailIsFreshForCurrent = !isCurrent\n              || !Number.isFinite(updatedAt)\n              || !Number.isFinite(thumbnailCapturedAt)\n              || thumbnailCapturedAt >= updatedAt;\n            const thumbnail = session.thumbnail?.dataUrl && thumbnailIsFreshForCurrent\n              ? document.createElement('img')\n              : null;\n            if (thumbnail) {\n              row.classList.add('helios-ui-session-tab__row--with-thumbnail');\n              thumbnail.className = 'helios-ui-session-tab__thumbnail';\n              thumbnail.src = session.thumbnail.dataUrl;\n              thumbnail.alt = '';\n              thumbnail.loading = 'lazy';\n            }\n            const details = document.createElement('div');\n            details.className = 'helios-ui-session-tab__details';\n            const title = document.createElement('div');\n            title.className = 'helios-ui-session-tab__title';\n            const compactUpdated = Number.isFinite(updatedAt) && updatedAt > 0\n              ? new Date(updatedAt).toLocaleString(undefined, {\n                month: 'short',\n                day: 'numeric',\n                hour: 'numeric',\n                minute: '2-digit',\n              })\n              : 'unknown date';\n            const networkName = String(\n              session.networkSource?.baseName\n              ?? session.networkSource?.name\n              ?? this.helios?._lastLoadedNetworkBase\n              ?? 'network',\n            ).trim() || 'network';\n            const nickname = String(session.nickname ?? '').trim();\n            const primaryName = nickname || networkName || `Session ${i + 1}`;\n            title.textContent = `${primaryName} - ${compactUpdated}`;\n            const meta = document.createElement('div');\n            meta.className = 'helios-ui-session-tab__meta';\n            const updated = Number.isFinite(updatedAt) && updatedAt > 0\n              ? new Date(updatedAt).toLocaleString()\n              : 'unknown date';\n            const bytes = Number.isFinite(session.bytes) && session.bytes > 0\n              ? `${Math.max(1, Math.round(session.bytes / 1024))} KB`\n              : 'unknown size';\n            const idLine = document.createElement('div');\n            idLine.className = 'helios-ui-session-tab__meta-line helios-ui-session-tab__meta-line--id';\n            idLine.textContent = String(session.id);\n            const updatedLine = document.createElement('div');\n            updatedLine.className = 'helios-ui-session-tab__meta-line';\n            updatedLine.textContent = `latest ${updated} · ${bytes}`;\n            meta.appendChild(idLine);\n            meta.appendChild(updatedLine);\n            details.appendChild(meta);\n            const resume = document.createElement('button');\n            resume.type = 'button';\n            resume.className = 'helios-ui-button';\n            resume.textContent = isCurrent ? 'Current' : 'Resume';\n            resume.disabled = isCurrent;\n            resume.addEventListener('click', async () => {\n              if (isCurrent) return;\n              resume.disabled = true;\n              try {\n                const sessionSource = storage;\n                await (this.interfaceBehavior?.resumeSession?.({ sessionId: session.id })\n                  ?? sessionSource?.resumeSession?.(session.id)\n                  ?? sessionSource?.restoreSession?.(session.id));\n                await storage?.sync?.({\n                  ...currentSessionSyncPayloadOptions(),\n                  retention: { enabled: false },\n                });\n                refreshNetworkInfo();\n                syncPersistenceStatus();\n              } finally {\n                resume.disabled = false;\n              }\n            });\n            const deleteButton = document.createElement('button');\n            deleteButton.type = 'button';\n            deleteButton.className = 'helios-ui-button helios-ui-button--icon helios-ui-session-tab__delete';\n            deleteButton.setAttribute('aria-label', `Delete session ${primaryName}`);\n            deleteButton.appendChild(makeIcon('M3 6h18M8 6V4h8v2M6.5 6l1 14h9l1-14M10 10v6M14 10v6'));\n            tooltips.attachTooltip(deleteButton, 'Delete this saved session');\n            deleteButton.addEventListener('click', async () => {\n              const confirmed = globalThis.confirm?.(`Delete saved session \"${primaryName}\"? This cannot be undone.`) ?? false;\n              if (!confirmed) return;\n              deleteButton.disabled = true;\n              resume.disabled = true;\n              try {\n                await (storage ?? persistence)?.deleteSession?.(session.id);\n                await refreshSessionTab();\n              } finally {\n                deleteButton.disabled = false;\n                resume.disabled = isCurrent;\n              }\n            });\n            const rowActions = document.createElement('div');\n            rowActions.className = 'helios-ui-session-tab__row-actions';\n            rowActions.appendChild(resume);\n            rowActions.appendChild(deleteButton);\n            const body = document.createElement('div');\n            body.className = 'helios-ui-session-tab__body';\n            if (thumbnail) body.appendChild(thumbnail);\n            body.appendChild(details);\n            body.appendChild(rowActions);\n            row.appendChild(title);\n            row.appendChild(body);\n            sessionList.appendChild(row);\n          }\n        };\n\n        newSessionButton.addEventListener('click', async () => {\n          newSessionButton.disabled = true;\n          try {\n            const storage = this.helios?.storage ?? null;\n            const nickname = this.helios?._lastLoadedNetworkBase ?? this.helios?._lastLoadedNetworkName ?? 'network';\n            await storage?.saveSession?.({\n              nickname,\n              networkFormat: 'zxnet',\n              includeNetwork: true,\n              includePositions: true,\n              retention: { enabled: false },\n            });\n            syncPersistenceStatus();\n            await refreshSessionTab();\n          } finally {\n            newSessionButton.disabled = false;\n          }\n        });\n        refreshSessionsButton.addEventListener('click', () => {\n          void refreshSessionTab();\n        });\n\n        const attributesTab = document.createElement('div');\n        const attributesHeader = document.createElement('div');\n        attributesHeader.style.display = 'flex';\n        attributesHeader.style.alignItems = 'center';\n        attributesHeader.style.justifyContent = 'space-between';\n        attributesHeader.style.gap = '8px';\n        attributesHeader.style.margin = '0 0 10px';\n\n        const attributesSummary = document.createElement('div');\n        attributesSummary.className = 'helios-ui-label__hint';\n\n        const hiddenAttributesToggle = createSegmentedToggleControl({\n          checked: false,\n          onLabel: 'Hidden On',\n          offLabel: 'Hidden Off',\n          ariaLabel: 'Show hidden attributes',\n        });\n\n        const hiddenAttributesWrap = document.createElement('div');\n        hiddenAttributesWrap.style.display = 'inline-flex';\n        hiddenAttributesWrap.style.alignItems = 'center';\n        hiddenAttributesWrap.style.gap = '6px';\n        hiddenAttributesWrap.appendChild(hiddenAttributesToggle);\n\n        attributesHeader.appendChild(attributesSummary);\n        attributesHeader.appendChild(hiddenAttributesWrap);\n\n        const attributesTableWrap = document.createElement('div');\n        attributesTableWrap.className = 'helios-ui-attributes-table-wrap';\n\n        const attributesTable = document.createElement('table');\n        attributesTable.className = 'helios-ui-attributes-table';\n\n        const attributesHead = document.createElement('thead');\n        const attributesHeadRow = document.createElement('tr');\n        for (const label of ['Scope', 'Attribute', 'Type', 'Dim']) {\n          const th = document.createElement('th');\n          th.textContent = label;\n          attributesHeadRow.appendChild(th);\n        }\n        attributesHead.appendChild(attributesHeadRow);\n\n        const attributesBody = document.createElement('tbody');\n        attributesTable.appendChild(attributesHead);\n        attributesTable.appendChild(attributesBody);\n        attributesTableWrap.appendChild(attributesTable);\n\n        const attributesEmpty = document.createElement('div');\n        attributesEmpty.className = 'helios-ui-label__hint';\n        attributesEmpty.textContent = 'No attributes to show.';\n        attributesEmpty.hidden = true;\n\n        attributesTab.appendChild(attributesHeader);\n        attributesTab.appendChild(attributesTableWrap);\n        attributesTab.appendChild(attributesEmpty);\n\n        const collectAttributeRows = ({ includeHidden = false } = {}) => {\n          const network = this.helios?.network ?? null;\n          if (!network) return [];\n          const rows = [];\n          const appendRows = (scope, getNames, getInfo) => {\n            const rawNames = getNames?.call(network) ?? [];\n            for (const rawName of rawNames) {\n              const name = String(rawName);\n              if (!includeHidden && isHiddenAppAttributeName(name)) continue;\n              const info = getInfo?.call(network, name) ?? null;\n              rows.push({\n                scope,\n                name,\n                type: formatAttributeType(info?.type),\n                dimension: Number.isFinite(info?.dimension) ? String(info.dimension) : '—',\n              });\n            }\n          };\n          appendRows('node', network.getNodeAttributeNames, network.getNodeAttributeInfo);\n          appendRows('edge', network.getEdgeAttributeNames, network.getEdgeAttributeInfo);\n          appendRows('network', network.getNetworkAttributeNames, network.getNetworkAttributeInfo);\n          rows.sort((a, b) => {\n            const scopeCompare = a.scope.localeCompare(b.scope);\n            if (scopeCompare !== 0) return scopeCompare;\n            return a.name.localeCompare(b.name);\n          });\n          return rows;\n        };\n\n        const renderAttributesTable = () => {\n          const includeHidden = hiddenAttributesToggle.checked === true;\n          const rows = collectAttributeRows({ includeHidden });\n          attributesBody.replaceChildren();\n          attributesSummary.textContent = `${rows.length} attribute${rows.length === 1 ? '' : 's'}`;\n          attributesEmpty.hidden = rows.length > 0;\n          attributesTableWrap.hidden = rows.length === 0;\n          for (const row of rows) {\n            const tr = document.createElement('tr');\n            for (const value of [row.scope, row.name, row.type, row.dimension]) {\n              const td = document.createElement('td');\n              td.textContent = value;\n              tr.appendChild(td);\n            }\n            attributesBody.appendChild(tr);\n          }\n        };\n\n        hiddenAttributesToggle.addEventListener('change', () => {\n          renderAttributesTable();\n        });\n        renderAttributesTable();\n\n        const exportTab = document.createElement('div');\n        const exportNameBar = document.createElement('div');\n        exportNameBar.className = 'helios-ui-network__name';\n        exportNameBar.style.marginTop = '8px';\n        exportNameBar.style.marginBottom = '12px';\n        exportNameBar.appendChild(exportNameInput);\n        exportNameBar.appendChild(exportExtEl);\n\n        const presetSelect = document.createElement('select');\n        presetSelect.className = 'helios-ui-select';\n        const exporterBehavior = this.helios?.behavior?.exporter ?? null;\n\n        const customWidthInput = document.createElement('input');\n        customWidthInput.type = 'number';\n        customWidthInput.className = 'helios-ui-number';\n        customWidthInput.min = '1';\n        customWidthInput.step = '1';\n        customWidthInput.value = String(this.helios?.layers?.size?.width ?? this.helios?.size?.width ?? 1920);\n        customWidthInput.style.maxWidth = '96px';\n\n        const customHeightInput = document.createElement('input');\n        customHeightInput.type = 'number';\n        customHeightInput.className = 'helios-ui-number';\n        customHeightInput.min = '1';\n        customHeightInput.step = '1';\n        customHeightInput.value = String(this.helios?.layers?.size?.height ?? this.helios?.size?.height ?? 1080);\n        customHeightInput.style.maxWidth = '96px';\n\n        const customSizeWrap = document.createElement('div');\n        customSizeWrap.style.display = 'inline-flex';\n        customSizeWrap.style.alignItems = 'center';\n        customSizeWrap.style.gap = '8px';\n        customSizeWrap.appendChild(customWidthInput);\n        customSizeWrap.appendChild(document.createTextNode('×'));\n        customSizeWrap.appendChild(customHeightInput);\n\n        const supersamplingSelect = document.createElement('select');\n        supersamplingSelect.className = 'helios-ui-select';\n        for (const value of [1, 2, 4]) {\n          const opt = document.createElement('option');\n          opt.value = String(value);\n          opt.textContent = `${value}x`;\n          supersamplingSelect.appendChild(opt);\n        }\n\n        const labelsToggle = createToggleControl({\n          checked: false,\n          onLabel: 'On',\n          offLabel: 'Off',\n          ariaLabel: 'Export labels',\n        });\n        const legendsToggle = createToggleControl({\n          checked: true,\n          onLabel: 'On',\n          offLabel: 'Off',\n          ariaLabel: 'Export legends',\n        });\n        const interfaceToggle = createToggleControl({\n          checked: false,\n          onLabel: 'On',\n          offLabel: 'Off',\n          ariaLabel: 'Include interface margins',\n        });\n        const frameToggle = createToggleControl({\n          checked: false,\n          onLabel: 'On',\n          offLabel: 'Off',\n          ariaLabel: 'Show export frame',\n        });\n        const backgroundToggle = createToggleControl({\n          checked: true,\n          onLabel: 'On',\n          offLabel: 'Off',\n          ariaLabel: 'Export background',\n        });\n        const alphaModeControl = createSelectControl({\n          ariaLabel: 'Alpha mode',\n          value: 'straight',\n          options: [\n            { value: 'straight', label: 'Standard' },\n            { value: 'premultiplied', label: 'Premultiplied' },\n          ],\n          onChange: () => syncExportUi(),\n        });\n        let exportLegendScale = exporterBehavior?.legendScale?.() ?? 1;\n        const legendScaleAttribute = UIAttribute.number({\n          id: 'figure.legendScale',\n          label: 'Legend Scale',\n          min: 0.25,\n          max: 4,\n          step: 0.05,\n          domain: { min: 0.25, max: 4 },\n          recommendedRange: { min: 0.5, max: 2.5 },\n          get: () => exportLegendScale,\n          set: (value) => {\n            const numeric = Number(value);\n            if (!Number.isFinite(numeric)) return;\n            exportLegendScale = clampNumber(numeric, 0.25, 4);\n            exporterBehavior?.legendScale?.(exportLegendScale);\n          },\n        });\n        const legendScaleRow = createSliderRow(legendScaleAttribute, {\n          hint: 'Multiplier for exported legend size. At 1x, legends keep the same relative size within the chosen figure.',\n          precision: 2,\n          step: 0.05,\n        });\n        this._controlCleanups.add(legendScaleRow.destroy);\n\n        const exportButton = document.createElement('button');\n        exportButton.type = 'button';\n        exportButton.className = 'helios-ui-button';\n        exportButton.textContent = 'Export';\n        exportButton.style.marginLeft = 'auto';\n\n        const previewContent = document.createElement('div');\n        previewContent.className = 'helios-ui-figure-preview';\n\n        const previewViewport = document.createElement('div');\n        previewViewport.className = 'helios-ui-figure-preview__viewport';\n        const previewImage = document.createElement('img');\n        previewImage.className = 'helios-ui-figure-preview__image';\n        previewImage.alt = 'Figure export preview';\n        previewImage.decoding = 'async';\n        previewImage.loading = 'eager';\n        previewViewport.appendChild(previewImage);\n\n        const previewStatus = document.createElement('div');\n        previewStatus.className = 'helios-ui-figure-preview__status';\n        previewStatus.textContent = '—';\n\n        previewContent.appendChild(previewViewport);\n        previewContent.appendChild(previewStatus);\n\n        const previewStack = new PanelStack();\n        previewStack.add({\n          id: 'figure-preview',\n          title: 'Preview',\n          collapsed: false,\n          statusDot: false,\n          content: previewContent,\n        });\n        const previewEntry = previewStack._items.get('figure-preview') ?? null;\n        const previewPanel = previewEntry?.item ?? null;\n        const previewExpanded = () => previewPanel?.dataset.collapsed !== 'true';\n\n        let previewUrl = null;\n        let previewDirty = true;\n        let previewBusy = false;\n        let previewIgnoreRenderEvents = 0;\n        let previewTimer = null;\n        let previewCaptureGeneration = 0;\n        let previewSceneVersion = 0;\n        let previewCapturedSceneVersion = -1;\n        let previewCapturedSignature = '';\n\n        const clearPreviewUrl = () => {\n          if (!previewUrl) return;\n          URL.revokeObjectURL(previewUrl);\n          previewUrl = null;\n        };\n        this._controlCleanups.add(() => clearPreviewUrl());\n\n        const setPreviewStatus = (message) => {\n          if (previewStatus.textContent === message) return;\n          previewStatus.textContent = message;\n        };\n\n        const markPreviewDirty = () => {\n          previewDirty = true;\n        };\n\n        const renderPreviewSummary = (resolved, thumbnail) => {\n          void thumbnail;\n          setPreviewStatus(`${resolved.width}×${resolved.height}`);\n        };\n\n        const refreshFigurePreview = async ({ force = false } = {}) => {\n          if (!this.helios || !figureTabActive || !previewExpanded() || previewBusy || (!force && !previewDirty)) return;\n          const resolved = resolveFigureState();\n          const thumbnailOptions = resolveFigurePreviewThumbnailOptions(resolved, {\n            maxWidth: 320,\n            maxHeight: 180,\n          });\n          const signature = JSON.stringify(thumbnailOptions);\n          if (!force && previewCapturedSignature === signature && previewCapturedSceneVersion === previewSceneVersion) {\n            previewDirty = false;\n            renderPreviewSummary(resolved, thumbnailOptions);\n            return;\n          }\n          previewBusy = true;\n          previewDirty = false;\n          renderPreviewSummary(resolved, thumbnailOptions);\n          const generation = ++previewCaptureGeneration;\n          try {\n            previewIgnoreRenderEvents += 1;\n            const blob = exporterBehavior\n              ? await exporterBehavior.exportPreviewBlob({}, {\n                maxWidth: 320,\n                maxHeight: 180,\n              })\n              : await this.helios.exportFigurePreviewBlob(resolved, {\n                maxWidth: 320,\n                maxHeight: 180,\n              });\n            const nextUrl = URL.createObjectURL(blob);\n            await new Promise((resolve, reject) => {\n              const image = new Image();\n              image.onload = () => resolve();\n              image.onerror = () => reject(new Error('Failed to decode preview image'));\n              image.src = nextUrl;\n            });\n            if (generation !== previewCaptureGeneration) return;\n            const prevUrl = previewUrl;\n            previewUrl = nextUrl;\n            previewImage.src = nextUrl;\n            previewCapturedSignature = signature;\n            previewCapturedSceneVersion = previewSceneVersion;\n            if (prevUrl) URL.revokeObjectURL(prevUrl);\n            renderPreviewSummary(resolved, thumbnailOptions);\n          } catch (error) {\n            if (generation !== previewCaptureGeneration) return;\n            setPreviewStatus(error instanceof Error ? error.message : 'Failed to render preview.');\n          } finally {\n            previewBusy = false;\n          }\n        };\n\n        const startPreviewTimer = () => {\n          if (previewTimer != null) return;\n          previewTimer = globalThis.setInterval(() => {\n            void refreshFigurePreview();\n          }, 1000);\n        };\n        const stopPreviewTimer = () => {\n          if (previewTimer == null) return;\n          globalThis.clearInterval(previewTimer);\n          previewTimer = null;\n        };\n        this._controlCleanups.add(() => stopPreviewTimer());\n\n        const syncExportExtension = () => {\n          exportExtEl.textContent = `.${exportFormatSelect.value}`;\n        };\n\n        const getExportCapability = () => exporterBehavior?.getCapabilities?.({\n          supersampling: Number(supersamplingSelect.value || 1),\n        }) ?? this.helios?.getFigureExportCapabilities?.({\n          supersampling: Number(supersamplingSelect.value || 1),\n        }) ?? {\n          maxBitmapDimension: 8192,\n          presets: buildFigureExportPresetList(this.helios?.layers?.size ?? this.helios?.size ?? {}, { maxBitmapDimension: 8192 }, Number(supersamplingSelect.value || 1)),\n        };\n\n        const pushExporterUiState = (patch = {}) => {\n          if (!exporterBehavior) return;\n          exporterBehavior.update(patch);\n          exportLegendScale = exporterBehavior.legendScale?.() ?? exportLegendScale;\n        };\n\n        const applyExporterStateToControls = () => {\n          const state = exporterBehavior?.getPublicState?.() ?? null;\n          if (!state) return;\n          if (exportNameInput.value !== state.baseName) exportNameInput.value = state.baseName;\n          if (exportFormatSelect.value !== state.format) exportFormatSelect.value = state.format;\n          if (presetSelect.value !== String(state.preset ?? '')) presetSelect.value = String(state.preset ?? '');\n          if (customWidthInput.value !== String(state.width ?? customWidthInput.value)) customWidthInput.value = String(state.width ?? customWidthInput.value);\n          if (customHeightInput.value !== String(state.height ?? customHeightInput.value)) customHeightInput.value = String(state.height ?? customHeightInput.value);\n          if (supersamplingSelect.value !== String(state.supersampling ?? 1)) supersamplingSelect.value = String(state.supersampling ?? 1);\n          labelsToggle.checked = state.includeLabels === true;\n          legendsToggle.checked = state.includeLegends !== false;\n          interfaceToggle.checked = state.includeInterface === true;\n          frameToggle.checked = state.showFrame === true;\n          backgroundToggle.checked = state.transparentBackground !== true;\n          alphaModeControl.value = state.alphaMode ?? 'straight';\n          exportLegendScale = Number(state.legendScale ?? exportLegendScale);\n          legendScaleAttribute.notify();\n        };\n\n        const exportFrame = document.createElement('div');\n        exportFrame.className = 'helios-ui-export-frame';\n        exportFrame.setAttribute('aria-hidden', 'true');\n        Object.assign(exportFrame.style, {\n          position: 'absolute',\n          display: 'none',\n          boxSizing: 'border-box',\n          border: '2px solid #ff3b30',\n          pointerEvents: 'none',\n        });\n        (this.helios?.layers?.overlay ?? this.container).appendChild(exportFrame);\n        this._controlCleanups.add(() => exportFrame.remove());\n\n        let figureTabActive = false;\n\n        const syncPresetOptions = () => {\n          const capability = getExportCapability();\n          const presets = capability?.presets ?? [];\n          const previous = presetSelect.value || capability?.defaultPreset || 'window';\n          presetSelect.replaceChildren();\n          let firstAvailable = 'custom';\n          for (const entry of presets) {\n            const opt = document.createElement('option');\n            opt.value = entry.id;\n            opt.textContent = entry.available === false ? `${entry.label} (unavailable)` : entry.label;\n            opt.disabled = entry.available === false;\n            if (entry.available !== false && firstAvailable === 'custom') firstAvailable = entry.id;\n            presetSelect.appendChild(opt);\n          }\n          presetSelect.value = Array.from(presetSelect.options).some((opt) => opt.value === previous && !opt.disabled)\n            ? previous\n            : firstAvailable;\n          if (exporterBehavior && exporterBehavior.preset?.() !== presetSelect.value) {\n            pushExporterUiState({ preset: presetSelect.value });\n          }\n        };\n\n        const resolveFigureState = () => exporterBehavior?.getResolvedOptions?.() ?? (() => {\n          const capability = getExportCapability();\n          return resolveFigureExportOptions({\n            filename: exportNameInput.value,\n            format: exportFormatSelect.value,\n            preset: presetSelect.value,\n            width: customWidthInput.value,\n            height: customHeightInput.value,\n            supersampling: Number(supersamplingSelect.value || 1),\n            includeLabels: labelsToggle.checked,\n            includeLegends: legendsToggle.checked,\n            includeInterface: interfaceToggle.checked,\n            legendScale: exportLegendScale,\n            transparentBackground: backgroundToggle.checked !== true,\n            alphaMode: alphaModeControl.value,\n          }, {\n            renderer: this.helios?.renderer,\n            capability,\n            windowSize: this.helios?.layers?.size ?? this.helios?.size ?? { width: 1, height: 1 },\n          });\n        })();\n\n        const syncExportFrame = (resolved) => {\n          const rect = resolved?.previewRect ?? null;\n          const visible = Boolean(figureTabActive && (exporterBehavior?.showFrame?.() ?? frameToggle.checked) && rect);\n          exportFrame.style.display = visible ? 'block' : 'none';\n          if (!visible) return;\n          exportFrame.style.left = `${rect.x}px`;\n          exportFrame.style.top = `${rect.y}px`;\n          exportFrame.style.width = `${rect.width}px`;\n          exportFrame.style.height = `${rect.height}px`;\n        };\n\n        const syncExportUi = () => {\n          syncPresetOptions();\n          applyExporterStateToControls();\n          syncExportExtension();\n          const resolved = resolveFigureState();\n          const isCustom = resolved.preset === 'custom';\n          customWidthInput.disabled = !isCustom;\n          customHeightInput.disabled = !isCustom;\n          alphaModeControl.disabled = backgroundToggle.checked === true;\n          exportButton.disabled = resolved.fitsCapability !== true;\n          exportButton.title = resolved.fitsCapability === true\n            ? 'Export figure'\n            : `Requested raster pass ${resolved.bitmapWidth}×${resolved.bitmapHeight} exceeds the current renderer limit of ${resolved.capability.maxBitmapDimension}px.`;\n          syncExportFrame(resolved);\n          setPreviewStatus(`${resolved.width}×${resolved.height}`);\n          markPreviewDirty();\n          if (figureTabActive && previewExpanded()) {\n            startPreviewTimer();\n            if (!previewImage.src) void refreshFigurePreview({ force: true });\n          } else {\n            stopPreviewTimer();\n          }\n        };\n\n        exportFormatSelect.addEventListener('change', () => {\n          pushExporterUiState({ format: exportFormatSelect.value });\n          syncExportUi();\n        });\n        presetSelect.addEventListener('change', () => {\n          pushExporterUiState({ preset: presetSelect.value });\n          syncExportUi();\n        });\n        supersamplingSelect.addEventListener('change', () => {\n          pushExporterUiState({ supersampling: Number(supersamplingSelect.value || 1) });\n          syncExportUi();\n        });\n        customWidthInput.addEventListener('change', () => {\n          pushExporterUiState({ customSize: { width: customWidthInput.value, height: customHeightInput.value } });\n          syncExportUi();\n        });\n        customHeightInput.addEventListener('change', () => {\n          pushExporterUiState({ customSize: { width: customWidthInput.value, height: customHeightInput.value } });\n          syncExportUi();\n        });\n        labelsToggle.addEventListener('change', () => {\n          pushExporterUiState({ includeLabels: labelsToggle.checked });\n          syncExportUi();\n        });\n        legendsToggle.addEventListener('change', () => {\n          pushExporterUiState({ includeLegends: legendsToggle.checked });\n          syncExportUi();\n        });\n        interfaceToggle.addEventListener('change', () => {\n          pushExporterUiState({ includeInterface: interfaceToggle.checked });\n          syncExportUi();\n        });\n        frameToggle.addEventListener('change', () => {\n          pushExporterUiState({ showFrame: frameToggle.checked });\n          syncExportUi();\n        });\n        backgroundToggle.addEventListener('change', () => {\n          pushExporterUiState({ transparentBackground: backgroundToggle.checked !== true });\n          syncExportUi();\n        });\n        alphaModeControl.addEventListener('change', () => {\n          pushExporterUiState({ alphaMode: alphaModeControl.value });\n          syncExportUi();\n        });\n        const unsubscribeLegendScale = legendScaleAttribute.subscribe(() => syncExportUi(), { immediate: false });\n        this._controlCleanups.add(() => unsubscribeLegendScale());\n        if (exporterBehavior?.on) {\n          const unsubscribe = exporterBehavior.on('change', () => {\n            applyExporterStateToControls();\n            syncExportUi();\n          });\n          this._controlCleanups.add(unsubscribe);\n        }\n\n        const exportTabContent = document.createElement('div');\n        exportTabContent.appendChild(createAlignedRow({\n          title: 'Format',\n          hint: 'PNG exports a bitmap. SVG embeds the bitmap and keeps labels/legends as vectors.',\n          controls: exportFormatSelect,\n        }).row);\n        exportTabContent.appendChild(createAlignedRow({\n          title: 'Size',\n          hint: 'Pick a preset based on the figure size. Window presets use the current view size.',\n          controls: presetSelect,\n        }).row);\n        exportTabContent.appendChild(createAlignedRow({\n          title: 'Custom',\n          hint: 'Used only when the size preset is Custom.',\n          controls: customSizeWrap,\n        }).row);\n        exportTabContent.appendChild(createAlignedRow({\n          title: 'Supersampling',\n          hint: 'Renders the bitmap portion at a larger size and downsamples it for sharper PNGs and embedded SVG images.',\n          controls: supersamplingSelect,\n        }).row);\n        exportTabContent.appendChild(createAlignedRow({\n          title: 'Legends',\n          hint: 'Adds the SVG legends using figure-relative placement, ignoring docked UI insets.',\n          controls: legendsToggle,\n        }).row);\n        exportTabContent.appendChild(createAlignedRow({\n          title: 'Interface',\n          hint: 'Keeps docked-panel margins when placing legends in the export. Off uses the full figure area.',\n          controls: interfaceToggle,\n        }).row);\n        exportTabContent.appendChild(legendScaleRow.element);\n        exportTabContent.appendChild(createAlignedRow({\n          title: 'Labels',\n          hint: 'Adds the current SVG label overlay to the export.',\n          controls: labelsToggle,\n        }).row);\n        exportTabContent.appendChild(createAlignedRow({\n          title: 'Background',\n          hint: 'On exports an opaque figure with the current background color. Off makes the full figure background transparent.',\n          controls: backgroundToggle,\n        }).row);\n        exportTabContent.appendChild(createAlignedRow({\n          title: 'Alpha',\n          hint: 'Only used when Background is off. Standard is regular PNG/SVG alpha; premultiplied keeps raw framebuffer RGB.',\n          controls: alphaModeControl,\n        }).row);\n        exportTabContent.appendChild(createAlignedRow({\n          title: 'Frame',\n          hint: 'Shows the crop that will be exported. Disabled by default.',\n          controls: frameToggle,\n        }).row);\n        exportNameBar.appendChild(exportButton);\n        exportTabContent.appendChild(exportNameBar);\n        previewStack.element.style.marginTop = '8px';\n        exportTabContent.appendChild(previewStack.element);\n        exportTab.appendChild(exportTabContent);\n\n        loadButton.addEventListener('click', () => {\n          showOpenNetworkConfirmationDialog(() => fileInput.click());\n        });\n        fileInput.addEventListener('change', async () => {\n          const file = fileInput.files?.[0] ?? null;\n          fileInput.value = '';\n          if (!file) return;\n          loadButton.disabled = true;\n          saveButton.disabled = true;\n          try {\n            await this.helios.loadNetwork(file, {\n              disposeOld: true,\n              recreateRenderer: true,\n              keepCamera: false,\n              showLoadingOverlay: true,\n              confirmUnsyncedSession: (detail) => confirmContinueWithoutSync({\n                ...detail,\n                sourceName: file.name,\n              }),\n            });\n            const nextBase = this.helios._lastLoadedNetworkBase ?? file.name.replace(/\\.[^.]+$/, '');\n            const sanitized = sanitizeBaseName(nextBase);\n            if (sanitized) {\n              baseName = sanitized;\n              lastValidBaseName = sanitized;\n              nameInput.value = sanitized;\n              exportNameInput.value = sanitized;\n              exporterBehavior?.baseName?.(sanitized);\n            }\n            loadedFormat = this.helios._lastLoadedNetworkFormat ?? loadedFormat;\n            if (loadedFormat && ['bxnet', 'zxnet', 'xnet', 'gml', 'gt'].includes(loadedFormat)) {\n              formatSelect.value = loadedFormat;\n              syncExtension();\n            }\n          } catch (error) {\n            // eslint-disable-next-line no-console\n            console.error('Failed to load network', error);\n          } finally {\n            refreshNetworkInfo();\n            loadButton.disabled = false;\n            saveButton.disabled = false;\n          }\n        });\n\n        saveButton.addEventListener('click', async () => {\n          saveButton.disabled = true;\n          loadButton.disabled = true;\n          try {\n            commitBaseName(nameInput);\n            const fmt = formatSelect.value;\n            let blob = null;\n            if (fmt === 'gml' || fmt === 'gt') {\n              await this.helios.syncDelegatePositionsToNetwork?.();\n              blob = await this.helios.saveNetwork(fmt, { output: 'blob' });\n            } else {\n              const saveOptions = {\n                output: 'blob',\n                includeVisualization: true,\n                includeCurrentPositions: true,\n                fullVisualizationState: true,\n                layoutRuntime: { preferDelegate: true },\n                storage: { includeJournal: false },\n              };\n              blob = await this.helios.storage?.saveNetworkSnapshot?.(fmt, saveOptions)\n                ?? await this.helios.savePortableNetwork?.(fmt, saveOptions)\n                ?? await this.helios.saveNetwork(fmt, { output: 'blob' });\n            }\n            if (blob) {\n              const filename = `${lastValidBaseName}.${fmt}`;\n              downloadBlob(blob, filename);\n            }\n            await this.helios.storage?.sync?.(currentSessionSyncPayloadOptions());\n          } catch (error) {\n            // eslint-disable-next-line no-console\n            console.error('Failed to save network', error);\n          } finally {\n            refreshNetworkInfo();\n            syncPersistenceStatus();\n            saveButton.disabled = false;\n            loadButton.disabled = false;\n          }\n        });\n\n        exportButton.addEventListener('click', async () => {\n          exportButton.disabled = true;\n          try {\n            commitBaseName(exportNameInput);\n            exporterBehavior?.baseName?.(exportNameInput.value);\n            const resolved = resolveFigureState();\n            const blob = exporterBehavior\n              ? await exporterBehavior.exportBlob()\n              : await this.helios.exportFigureBlob(resolved);\n            downloadBlob(blob, resolved.filename);\n          } catch (error) {\n            // eslint-disable-next-line no-console\n            console.error('Failed to export figure', error);\n          } finally {\n            syncExportUi();\n          }\n        });\n\n        formatSelect.addEventListener('change', () => {\n          syncExtension();\n          refreshNetworkInfo();\n        });\n\n        // Update stats if the network is replaced externally.\n        const onNetworkReplaced = () => {\n          attachAttributeListeners();\n          refreshNetworkInfo();\n          syncPersistenceStatus();\n          renderAttributesTable();\n          syncExportUi();\n        };\n        let unsub = null;\n        if (this.helios?.on) {\n          unsub = this.helios.on('network:replaced', onNetworkReplaced);\n        } else if (this.helios?.addEventListener) {\n          this.helios.addEventListener('network:replaced', onNetworkReplaced);\n          unsub = () => this.helios.removeEventListener('network:replaced', onNetworkReplaced);\n        }\n        if (unsub) this._controlCleanups.add(unsub);\n        const storageManager = this.helios?.storage ?? null;\n        storageManager?.addEventListener?.('change', syncPersistenceStatusForChange);\n        this._controlCleanups.add(() => {\n          storageManager?.removeEventListener?.('change', syncPersistenceStatusForChange);\n        });\n        if (exporterBehavior) {\n          exporterBehavior.baseName?.(lastValidBaseName);\n          applyExporterStateToControls();\n        }\n\n        let attributeEventsUnsub = null;\n        const attachAttributeListeners = () => {\n          attributeEventsUnsub?.();\n          attributeEventsUnsub = null;\n          const network = this.helios?.network ?? null;\n          if (!network) return;\n          const handler = (event) => {\n            const scope = event?.detail?.scope;\n            if (scope && scope !== 'node' && scope !== 'edge' && scope !== 'network') return;\n            renderAttributesTable();\n          };\n          if (typeof network.on === 'function') {\n            const unsubs = [\n              network.on('attribute:defined', handler),\n              network.on('attribute:removed', handler),\n              network.on('attribute:changed', handler),\n            ];\n            attributeEventsUnsub = () => {\n              for (const unsubHandler of unsubs) unsubHandler?.();\n            };\n          } else if (typeof network.addEventListener === 'function') {\n            network.addEventListener('attribute:defined', handler);\n            network.addEventListener('attribute:removed', handler);\n            network.addEventListener('attribute:changed', handler);\n            attributeEventsUnsub = () => {\n              network.removeEventListener('attribute:defined', handler);\n              network.removeEventListener('attribute:removed', handler);\n              network.removeEventListener('attribute:changed', handler);\n            };\n          }\n        };\n        attachAttributeListeners();\n        this._controlCleanups.add(() => attributeEventsUnsub?.());\n\n        const onAfterRender = () => {\n          if (previewIgnoreRenderEvents > 0) {\n            previewIgnoreRenderEvents -= 1;\n            return;\n          }\n          previewSceneVersion += 1;\n          markPreviewDirty();\n        };\n        let unsubAfterRender = null;\n        if (this.helios?.on) {\n          unsubAfterRender = this.helios.on('render:after', onAfterRender);\n        } else if (this.helios?.addEventListener) {\n          this.helios.addEventListener('render:after', onAfterRender);\n          unsubAfterRender = () => this.helios.removeEventListener('render:after', onAfterRender);\n        }\n        if (unsubAfterRender) this._controlCleanups.add(unsubAfterRender);\n\n        const unsubResize = this.helios?.layers?.onResize?.(() => syncExportUi());\n        if (unsubResize) this._controlCleanups.add(unsubResize);\n\n        previewEntry?.header.addEventListener('click', () => {\n          if (figureTabActive && previewExpanded()) {\n            markPreviewDirty();\n            startPreviewTimer();\n            if (!previewImage.src) void refreshFigurePreview({ force: true });\n          } else {\n            stopPreviewTimer();\n          }\n        });\n\n        const dataTabs = [\n          { id: 'network', title: 'Network', content: networkTab },\n          { id: 'figure', title: 'Figure', content: exportTab },\n          { id: 'attributes', title: 'Attributes', content: attributesTab },\n        ];\n        if (showSessionTab) dataTabs.push({ id: 'session', title: 'Session', content: sessionTab });\n\n        const tabs = new TabbedPanel({\n          variant: 'panel',\n          onActiveChanged: (id) => {\n            figureTabActive = id === 'figure';\n            syncExportUi();\n          },\n          tabs: dataTabs,\n        });\n        this._controlCleanups.add(() => tabs.destroy());\n        container.appendChild(tabs.element);\n        syncExportUi();\n        if (showSessionTab) void refreshSessionTab();\n        return container;\n      })();\n\n      const createRows = (accessorNames, {\n        source = this.helios,\n        bind = (accessorName) => this.bindHeliosAccessor(accessorName),\n      } = {}) => {\n        const container = document.createElement('div');\n        for (const accessorName of accessorNames) {\n          const info = bindings?.[accessorName] ?? null;\n          if (info?.type && info.type !== 'number') continue;\n          if (typeof source?.[accessorName] !== 'function') continue;\n          const attribute = bind(accessorName);\n          const label = attribute.label ?? info?.label ?? humanizeControlLabel(accessorName);\n          const path = statePathForAccessor(accessorName);\n          const row = createSliderRow(attribute, {\n            title: label,\n            hint: info?.description ?? null,\n            dirtyIndicator: createStateIndicator(path),\n          });\n          container.appendChild(row.element);\n          this._controlCleanups.add(row.destroy);\n        }\n        return container;\n      };\n\n      const createToggleRow = (accessorName, {\n        source = this.helios,\n        bind = (name) => this.bindHeliosAccessor(name),\n      } = {}) => {\n        const info = bindings?.[accessorName] ?? null;\n        if (!info || info.type !== 'boolean') return null;\n        if (typeof source?.[accessorName] !== 'function') return null;\n        const attribute = bind(accessorName);\n        const label = attribute.label ?? info.label ?? humanizeControlLabel(accessorName);\n        const toggle = createToggleControl({\n          checked: false,\n          onLabel: 'On',\n          offLabel: 'Off',\n          ariaLabel: label,\n          disabled: attribute.readOnly,\n        });\n\n        const syncToggle = (value) => {\n          const enabled = Boolean(value);\n          toggle.checked = enabled;\n          toggle.disabled = attribute.readOnly;\n        };\n\n        const unsub = attribute.subscribe((value) => {\n          syncToggle(value);\n        });\n\n        toggle.addEventListener('change', () => {\n          attribute.write(toggle.checked, { source: 'ui', event: 'change' });\n        });\n\n        const controls = document.createElement('div');\n        controls.className = 'helios-ui-row__controls';\n        controls.appendChild(toggle);\n        const { row } = createAlignedRow({\n          title: label,\n          hint: info.description ?? null,\n          controls,\n          dirtyIndicator: createStateIndicator(statePathForAccessor(accessorName)),\n        });\n        this._controlCleanups.add(() => unsub());\n        return row;\n      };\n\n      const createSelectRow = (accessorName, options, {\n        source = this.helios,\n        bind = (name) => this.bindHeliosAccessor(name),\n      } = {}) => {\n        const info = bindings?.[accessorName] ?? null;\n        if (!info || info.type !== 'string') return null;\n        if (typeof source?.[accessorName] !== 'function') return null;\n        const attribute = bind(accessorName);\n        const label = attribute.label ?? info.label ?? humanizeControlLabel(accessorName);\n        const select = createSelectControl({\n          ariaLabel: label,\n          options,\n          value: attribute.value(),\n        });\n\n        const syncSelect = (value) => {\n          select.value = String(value ?? '');\n          select.disabled = attribute.readOnly;\n        };\n\n        const unsub = attribute.subscribe((value) => {\n          syncSelect(value);\n        });\n\n        select.addEventListener('change', () => {\n          attribute.write(select.value, { source: 'ui', event: 'change' });\n        });\n\n        const controls = document.createElement('div');\n        controls.className = 'helios-ui-row__controls';\n        controls.appendChild(select);\n        const { row } = createAlignedRow({\n          title: label,\n          hint: info.description ?? null,\n          controls,\n          dirtyIndicator: createStateIndicator(statePathForAccessor(accessorName)),\n        });\n        this._controlCleanups.add(() => unsub());\n        return row;\n      };\n\n      const clamp01 = (value) => {\n        const v = Number(value);\n        if (!Number.isFinite(v)) return 0;\n        return Math.max(0, Math.min(1, v));\n      };\n\n      const rgba01ToHex6 = (rgba) => {\n        const r = Math.round(255 * clamp01(rgba?.[0] ?? 0));\n        const g = Math.round(255 * clamp01(rgba?.[1] ?? 0));\n        const b = Math.round(255 * clamp01(rgba?.[2] ?? 0));\n        return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n      };\n      const hexToRgba01 = (value) => {\n        const raw = String(value ?? '').trim().replace(/^#/, '');\n        if (!/^([0-9a-f]{6}|[0-9a-f]{8})$/i.test(raw)) return null;\n        const r = parseInt(raw.slice(0, 2), 16);\n        const g = parseInt(raw.slice(2, 4), 16);\n        const b = parseInt(raw.slice(4, 6), 16);\n        const a = raw.length === 8 ? parseInt(raw.slice(6, 8), 16) : 255;\n        if (![r, g, b, a].every(Number.isFinite)) return null;\n        return [r / 255, g / 255, b / 255, a / 255];\n      };\n      const applyBackgroundColor = (value) => {\n        const normalized = hexToRgba01(value) ?? value;\n        const target = appearanceBehavior?.background ?? this.helios?.background ?? this.helios?.clearColor;\n        if (typeof target === 'function') target.call(appearanceBehavior ?? this.helios, normalized);\n        writeAccessorPersistenceValue('background', normalized, 'background');\n      };\n\n      const createColorWithAlphaControls = ({ ariaLabel, getValue, setValue }) => {\n        const row = document.createElement('div');\n        row.style.display = 'flex';\n        row.style.gap = '8px';\n        row.style.alignItems = 'center';\n        row.style.width = '100%';\n\n        const swatchWrap = document.createElement('div');\n        swatchWrap.className = 'helios-ui-color-swatch';\n\n        const swatch = document.createElement('div');\n        swatch.className = 'helios-ui-color-swatch__swatch';\n\n        const colorInput = document.createElement('input');\n        colorInput.type = 'color';\n        colorInput.className = 'helios-ui-color-swatch__input';\n        colorInput.setAttribute('aria-label', ariaLabel);\n\n        const alphaInput = document.createElement('input');\n        alphaInput.type = 'number';\n        alphaInput.className = 'helios-ui-number';\n        alphaInput.min = '0';\n        alphaInput.max = '1';\n        alphaInput.step = '0.01';\n        alphaInput.style.maxWidth = '88px';\n        alphaInput.title = 'Alpha';\n        alphaInput.setAttribute('aria-label', `${ariaLabel} alpha`);\n\n        const alphaLabel = document.createElement('span');\n        alphaLabel.textContent = 'Alpha';\n        alphaLabel.style.color = 'var(--helios-ui-muted)';\n\n        const rawValue = getValue?.();\n\n        let baseHex = '#000000';\n        let alpha = 1;\n        if (typeof rawValue === 'string') {\n          const raw = rawValue.startsWith('#') ? rawValue.slice(1) : rawValue;\n          baseHex = raw.length >= 6 ? `#${raw.slice(0, 6)}` : '#000000';\n          const alphaHex = raw.length === 8 ? raw.slice(6, 8) : 'ff';\n          alpha = Math.round((parseInt(alphaHex, 16) / 255) * 100) / 100;\n        } else if (Array.isArray(rawValue) || ArrayBuffer.isView(rawValue)) {\n          baseHex = rgba01ToHex6(rawValue);\n          alpha = clamp01(rawValue?.[3] ?? 1);\n        }\n\n        colorInput.value = baseHex;\n        alphaInput.value = String(Number.isFinite(alpha) ? alpha : 1);\n        let lastCommittedValue = toHex8(colorInput.value, clamp01(alphaInput.value));\n        swatch.style.background = colorInput.value;\n\n        const commit = () => {\n          const a = clampNumber(alphaInput.value, { min: 0, max: 1 });\n          if (a == null) return;\n          const nextValue = toHex8(colorInput.value, a);\n          if (nextValue === lastCommittedValue) return;\n          lastCommittedValue = nextValue;\n          setValue?.(nextValue);\n          swatch.style.background = colorInput.value;\n        };\n\n        colorInput.addEventListener('input', commit);\n        alphaInput.addEventListener('change', commit);\n\n        swatchWrap.appendChild(swatch);\n        swatchWrap.appendChild(colorInput);\n        row.appendChild(swatchWrap);\n        row.appendChild(alphaLabel);\n        row.appendChild(alphaInput);\n        return row;\n      };\n\n      const createColorControls = ({ ariaLabel, getValue, setValue }) => {\n        const row = document.createElement('div');\n        row.style.display = 'flex';\n        row.style.gap = '8px';\n        row.style.alignItems = 'center';\n        row.style.width = '100%';\n\n        const swatchWrap = document.createElement('div');\n        swatchWrap.className = 'helios-ui-color-swatch';\n\n        const swatch = document.createElement('div');\n        swatch.className = 'helios-ui-color-swatch__swatch';\n\n        const colorInput = document.createElement('input');\n        colorInput.type = 'color';\n        colorInput.className = 'helios-ui-color-swatch__input';\n        colorInput.setAttribute('aria-label', ariaLabel);\n\n        colorInput.value = rgba01ToHex6(getValue?.());\n        let lastCommittedValue = toHex8(colorInput.value, 1);\n        swatch.style.background = colorInput.value;\n        const commit = () => {\n          const nextValue = toHex8(colorInput.value, 1);\n          if (nextValue === lastCommittedValue) return;\n          lastCommittedValue = nextValue;\n          setValue?.(nextValue);\n          swatch.style.background = colorInput.value;\n        };\n        colorInput.addEventListener('input', commit);\n\n        swatchWrap.appendChild(swatch);\n        swatchWrap.appendChild(colorInput);\n        row.appendChild(swatchWrap);\n        return row;\n      };\n\n      const createLabelSourceSelect = (labelsBehavior = null) => {\n        const select = document.createElement('select');\n        select.className = 'helios-ui-select';\n        select.setAttribute('aria-label', 'Label source attribute');\n\n        const readNodeAttributeNames = () => {\n          const network = this.helios?.network ?? null;\n          if (!network || typeof network.getNodeAttributeNames !== 'function') return [];\n          try {\n            const raw = network.getNodeAttributeNames() ?? [];\n            const out = [];\n            for (const name of raw) {\n              if (typeof name !== 'string') continue;\n              if (!isPublicAttributeName(name)) continue;\n              out.push(name);\n            }\n            out.sort((a, b) => a.localeCompare(b));\n            return out;\n          } catch (_) {\n            return [];\n          }\n        };\n\n        const refreshOptions = () => {\n          const currentRaw = labelsBehavior?.source?.() ?? this.helios?.labelSource?.();\n          const current = typeof currentRaw === 'string' ? currentRaw.trim() : '';\n          const currentUi = current === '$id' ? '$index' : current;\n\n          const options = [\n            { value: '', label: 'Auto (Label, Name, id)' },\n            { value: '$index', label: '$index (node id)' },\n          ];\n          const seen = new Set(options.map((entry) => entry.value));\n          for (const name of readNodeAttributeNames()) {\n            if (seen.has(name)) continue;\n            options.push({ value: name, label: name });\n            seen.add(name);\n          }\n          if (currentUi && !seen.has(currentUi)) {\n            options.push({ value: currentUi, label: `${currentUi} (custom)` });\n            seen.add(currentUi);\n          }\n\n          select.replaceChildren();\n          for (const entry of options) {\n            const opt = document.createElement('option');\n            opt.value = entry.value;\n            opt.textContent = entry.label;\n            select.appendChild(opt);\n          }\n          select.value = seen.has(currentUi) ? currentUi : '';\n        };\n\n        select.addEventListener('change', () => {\n          const next = String(select.value ?? '').trim();\n          if (!next) {\n            labelsBehavior?.source?.(null) ?? this.helios?.labelSource?.(null);\n          } else if (next === '$index') {\n            labelsBehavior?.source?.('$id') ?? this.helios?.labelSource?.('$id');\n          } else {\n            labelsBehavior?.source?.(next) ?? this.helios?.labelSource?.(next);\n          }\n          refreshOptions();\n        });\n\n        const onNetworkReplaced = () => refreshOptions();\n        let unsubscribe = null;\n        if (this.helios?.on) {\n          unsubscribe = this.helios.on('network:replaced', onNetworkReplaced);\n        } else if (this.helios?.addEventListener) {\n          this.helios.addEventListener('network:replaced', onNetworkReplaced);\n          unsubscribe = () => this.helios.removeEventListener('network:replaced', onNetworkReplaced);\n        }\n\n        refreshOptions();\n        return {\n          element: select,\n          destroy() {\n            if (typeof unsubscribe === 'function') unsubscribe();\n          },\n        };\n      };\n\n      const createLabelFontFamilyInput = (labelsBehavior = null) => {\n        const input = document.createElement('input');\n        input.type = 'text';\n        input.className = 'helios-ui-text';\n        input.placeholder = 'ui-sans-serif, system-ui, sans-serif';\n        input.setAttribute('aria-label', 'Label font family');\n        input.value = String(labelsBehavior?.fontFamily?.() ?? this.helios?.labelFontFamily?.() ?? '');\n        input.addEventListener('change', () => {\n          const next = String(input.value ?? '').trim();\n          labelsBehavior?.fontFamily?.(next) ?? this.helios?.labelFontFamily?.(next);\n        });\n        return input;\n      };\n\n      const appearanceBehavior = this.helios?.behavior?.appearance ?? this.helios?.useBehavior?.('appearance');\n      this._lastAppearanceBehavior = appearanceBehavior ?? null;\n      const bindAppearanceAccessor = (accessorName, options = {}) => (\n        appearanceBehavior\n          ? this.bindBehaviorAccessor(appearanceBehavior, accessorName, options)\n          : this.bindHeliosAccessor(accessorName, options)\n      );\n      const appearanceAccessorSource = appearanceBehavior ?? this.helios;\n      const registerAccessorPersistenceKey = (accessorName, read) => {\n        const path = statePathForAccessor(accessorName);\n        if (!path) return null;\n        this._registerStateKey(path, {\n          scope: stateScopeForPath(path),\n          debounceMs: stateDebounceForPath(path),\n          defaultValue: read?.(),\n          metadata: { accessor: accessorName },\n        });\n        return path;\n      };\n      const writeAccessorPersistenceValue = (accessorName, value, reason = accessorName) => {\n        const path = statePathForAccessor(accessorName);\n        if (!path) return null;\n        return this._writeStateValue(path, value, {\n          scope: stateScopeForPath(path),\n          source: 'ui',\n          reason,\n          debounceMs: stateDebounceForPath(path),\n          applyBinding: false,\n        });\n      };\n      const writeAppearanceAccessor = (accessorName, value, reason = accessorName) => {\n        const path = statePathForAccessor(accessorName);\n        const stateManager = this.helios?.states ?? null;\n        if (path && typeof stateManager?.entry === 'function' && typeof stateManager?.set === 'function' && stateManager.entry(path)) {\n          return this._writeStateValue(path, value, {\n            scope: stateScopeForPath(path),\n            source: 'ui',\n            reason,\n            debounceMs: stateDebounceForPath(path),\n            applyBinding: true,\n          });\n        }\n        const fallbackAccessorName = accessorName === 'background' ? 'clearColor' : accessorName;\n        const target = appearanceBehavior?.[accessorName] ?? this.helios?.[fallbackAccessorName];\n        if (typeof target === 'function') target.call(appearanceBehavior ?? this.helios, value);\n        return writeAccessorPersistenceValue(accessorName, value, reason);\n      };\n\n      const createAppearanceContent = () => {\n        const wrapper = document.createElement('div');\n        wrapper.appendChild(themeRow);\n\n        const dimensionToggle = createSegmentedToggleControl({\n          checked: false,\n          onLabel: '3D',\n          offLabel: '2D',\n          ariaLabel: 'Scene dimension',\n        });\n        dimensionToggle.dataset.testid = 'controls-appearance-dimension';\n        const readSceneDimension = () => (\n          (this.helios?.mode?.() ?? this.helios?.options?.mode ?? '2d') === '3d' ? '3d' : '2d'\n        );\n        const defaultSceneDimension = this.helios?._initialMode === '3d' ? '3d' : '2d';\n        this._registerStateKey('scene.dimension', {\n          scope: 'network',\n          debounceMs: 0,\n          defaultValue: defaultSceneDimension,\n          metadata: { control: 'dimension' },\n        });\n        const unbindSceneDimension = this.helios?.states?.subscribe?.('scene.dimension', (value) => {\n            const nextMode = value === '3d' ? '3d' : '2d';\n            if (readSceneDimension() === nextMode) return;\n            this.helios?.setMode?.(nextMode);\n        });\n        if (typeof unbindSceneDimension === 'function') this._controlCleanups.add(unbindSceneDimension);\n\n        const syncDimensionToggle = (mode = null) => {\n          const nextMode = mode === '3d'\n            ? '3d'\n            : readSceneDimension();\n          dimensionToggle.checked = nextMode === '3d';\n          dimensionToggle.disabled = typeof this.helios?.setMode !== 'function';\n        };\n\n        dimensionToggle.addEventListener('change', () => {\n          const targetMode = dimensionToggle.checked ? '3d' : '2d';\n          Promise.resolve(this.helios?.setMode?.(targetMode))\n            .then(() => {\n              const currentMode = readSceneDimension();\n              if (currentMode !== targetMode) {\n                syncDimensionToggle(currentMode);\n                return;\n              }\n              this._writeStateValue('scene.dimension', currentMode, {\n                scope: 'network',\n                source: 'ui',\n                reason: 'dimension',\n                debounceMs: 0,\n              });\n            })\n            .catch((error) => {\n              // eslint-disable-next-line no-console\n              console.error(error);\n              syncDimensionToggle();\n            });\n        });\n\n        let unsubscribeMode = null;\n        const onModeChanged = (event) => syncDimensionToggle(event?.detail?.mode ?? event?.mode ?? null);\n        if (this.helios?.on) {\n          unsubscribeMode = this.helios.on('mode:changed', onModeChanged);\n        } else if (this.helios?.addEventListener) {\n          this.helios.addEventListener('mode:changed', onModeChanged);\n          unsubscribeMode = () => this.helios.removeEventListener('mode:changed', onModeChanged);\n        }\n        if (unsubscribeMode) this._controlCleanups.add(unsubscribeMode);\n        syncDimensionToggle();\n\n        registerAccessorPersistenceKey('background', () => appearanceBehavior?.background?.() ?? this.helios?.clearColor?.());\n        wrapper.appendChild(createAlignedRow({\n          title: 'Dimension',\n          hint: 'Switch camera and active layout between 2D and 3D.',\n          controls: dimensionToggle,\n          dirtyIndicator: createStateIndicator('scene.dimension', 'scene'),\n        }).row);\n\n        wrapper.appendChild(createAlignedRow({\n          title: 'Background',\n          hint: 'Clear/background color (including opacity).',\n          controls: createColorWithAlphaControls({\n            ariaLabel: 'Background color',\n            getValue: () => appearanceBehavior?.background?.() ?? this.helios?.clearColor?.(),\n            setValue: applyBackgroundColor,\n          }),\n          dirtyIndicator: createStateIndicator(statePathForAccessor('background')),\n        }).row);\n\n        const modes = [\n          { value: 'alpha', label: 'Alpha' },\n          { value: 'weighted', label: 'Smooth' },\n          { value: 'additive', label: 'Additive' },\n          { value: 'screen', label: 'Screen' },\n          { value: 'max', label: 'Max' },\n          { value: 'additive-normalized', label: 'Additive (normalized)' },\n          { value: 'additive-tonemapped', label: 'Additive (tonemapped)' },\n          { value: 'additive-normalized-bright', label: 'Additive (normalized bright)' },\n        ];\n        const edgeTransparencyAttribute = bindAppearanceAccessor('edgeTransparencyMode');\n        const modeSelect = createSelectControl({\n          ariaLabel: 'Edge transparency mode',\n          options: modes,\n          value: edgeTransparencyAttribute.value(),\n        });\n        tooltips.attachTooltip(modeSelect, 'How edges blend/accumulate when overlapping.');\n        const syncEdgeMode = (value) => {\n          const next = typeof value === 'string' ? value : 'weighted';\n          modeSelect.value = modes.some((entry) => entry.value === next) ? next : 'weighted';\n          modeSelect.disabled = edgeTransparencyAttribute.readOnly;\n        };\n        const unsubscribeEdgeMode = edgeTransparencyAttribute.subscribe((value) => syncEdgeMode(value));\n        modeSelect.addEventListener('change', () => {\n          edgeTransparencyAttribute.write(modeSelect.value, { source: 'ui', event: 'change' });\n        });\n        this._controlCleanups.add(() => unsubscribeEdgeMode());\n\n        wrapper.appendChild(createAlignedRow({\n          title: 'Blend Mode',\n          hint: 'Controls how overlapping edges are composited (\"Smooth\" reduces overlap artifacts).',\n          controls: modeSelect,\n          dirtyIndicator: createStateIndicator(statePathForAccessor('edgeTransparencyMode')),\n        }).row);\n\n        return wrapper;\n      };\n\n      const createLabelsContent = () => {\n        const wrapper = document.createElement('div');\n        const labelsBehavior = this.helios?.behavior?.labels ?? this.helios?.useBehavior?.('labels');\n\n        const labelsModeSelect = createSelectControl({\n          ariaLabel: 'Label Mode',\n          options: [\n            { value: 'off', label: 'Off' },\n            { value: 'auto', label: 'Auto Labels' },\n            { value: 'selected-only', label: 'Selected Only' },\n          ],\n          value: labelsBehavior?.mode?.() ?? this.helios?.labelsMode?.(),\n        });\n        const syncLabelsMode = (value) => {\n          const next = value === 'selected-only' ? 'selected-only' : (value === 'off' ? 'off' : 'auto');\n          labelsModeSelect.value = next;\n          labelsModeSelect.disabled = false;\n        };\n        const unsubscribeLabelsMode = labelsBehavior?.on?.('change', (event) => {\n          syncLabelsMode(event?.detail?.state?.enabled === true\n            ? (event?.detail?.state?.selectionMode === 'selected-only' ? 'selected-only' : 'auto')\n            : 'off');\n        }) ?? (() => {});\n        labelsModeSelect.addEventListener('change', () => {\n          labelsBehavior?.mode?.(labelsModeSelect.value);\n        });\n        this._controlCleanups.add(() => unsubscribeLabelsMode());\n        wrapper.appendChild(createAlignedRow({\n          title: 'Labels',\n          hint: 'Off hides regular labels. Auto Labels ranks visible labels. Selected Only limits regular labels to selected nodes.',\n          controls: labelsModeSelect,\n          dirtyIndicator: createStateIndicator('labels.mode', 'labels'),\n        }).row);\n\n        const selectedOnlySpaceAwareToggle = createToggleControl({\n          checked: labelsBehavior?.state?.selectedOnlySpaceAware === true,\n          onLabel: 'On',\n          offLabel: 'Off',\n          ariaLabel: 'Selected-only labels use regular space-aware placement',\n          disabled: false,\n        });\n        const syncSelectedOnlySpaceAware = (value) => {\n          selectedOnlySpaceAwareToggle.checked = Boolean(value);\n          selectedOnlySpaceAwareToggle.disabled = false;\n        };\n        const unsubscribeSelectedOnlySpaceAware = labelsBehavior?.on?.('change', (event) => {\n          syncSelectedOnlySpaceAware(event?.detail?.state?.selectedOnlySpaceAware === true);\n        }) ?? (() => {});\n        selectedOnlySpaceAwareToggle.addEventListener('change', () => {\n          labelsBehavior?.update?.({ selectedOnlySpaceAware: selectedOnlySpaceAwareToggle.checked });\n        });\n        this._controlCleanups.add(() => unsubscribeSelectedOnlySpaceAware());\n        const selectedOnlySpaceAwareRow = createAlignedRow({\n          title: 'Use Available Space',\n          hint: 'When Selected Only is active, apply the same collision and space-availability logic used by regular labels.',\n          dirtyIndicator: createStateIndicator('labels.selectedOnlySpaceAware', 'labels'),\n          controls: (() => {\n            const controls = document.createElement('div');\n            controls.className = 'helios-ui-row__controls';\n            controls.appendChild(selectedOnlySpaceAwareToggle);\n            return controls;\n          })(),\n        }).row;\n        const syncSelectedOnlySpaceAwareVisibility = (mode) => {\n          selectedOnlySpaceAwareRow.style.display = mode === 'selected-only' ? '' : 'none';\n        };\n        syncSelectedOnlySpaceAwareVisibility(labelsBehavior?.mode?.() ?? this.helios?.labelsMode?.());\n        const unsubscribeLabelsModeForSpaceAware = labelsBehavior?.on?.('change', (event) => {\n          const state = event?.detail?.state ?? {};\n          syncSelectedOnlySpaceAwareVisibility(state.enabled === true\n            ? (state.selectionMode === 'selected-only' ? 'selected-only' : 'auto')\n            : 'off');\n        }) ?? (() => {});\n        this._controlCleanups.add(() => unsubscribeLabelsModeForSpaceAware());\n        wrapper.appendChild(selectedOnlySpaceAwareRow);\n\n        wrapper.appendChild(createRows([\n          'labelsMaxVisible',\n          'labelsFontSizeScale',\n          'labelsMinScreenRadius',\n          'labelsOutlineWidth',\n          'labelsOffsetRadiusFactor',\n          'labelsOffsetPx',\n          'labelsMaxChars',\n          'labelsMaxRows',\n        ]));\n\n        const labelSourceControl = createLabelSourceSelect(labelsBehavior);\n        wrapper.appendChild(createAlignedRow({\n          title: 'Source',\n          hint: 'Node attribute used for labels. Empty = auto fallback (Label, Name, id).',\n          controls: labelSourceControl.element,\n          dirtyIndicator: createStateIndicator('labels.source', 'labels'),\n        }).row);\n        this._controlCleanups.add(() => labelSourceControl.destroy());\n\n        wrapper.appendChild(createAlignedRow({\n          title: 'Font Family',\n          hint: 'CSS font-family used by SVG labels.',\n          controls: createLabelFontFamilyInput(labelsBehavior),\n          dirtyIndicator: createStateIndicator('labels.fontFamily', 'labels'),\n        }).row);\n\n        wrapper.appendChild(createAlignedRow({\n          title: 'Fill',\n          hint: 'Label text color + alpha.',\n          dirtyIndicator: createStateIndicator('labels.fill', 'labels'),\n          controls: createColorWithAlphaControls({\n            ariaLabel: 'Label fill color',\n            getValue: () => labelsBehavior?.fill?.() ?? this.helios?.labelFill?.(),\n            setValue: (value) => labelsBehavior?.fill?.(value) ?? this.helios?.labelFill?.(value),\n          }),\n        }).row);\n\n        wrapper.appendChild(createAlignedRow({\n          title: 'Outline',\n          hint: 'Label outline/halo color + alpha.',\n          dirtyIndicator: createStateIndicator('labels.outlineColor', 'labels'),\n          controls: createColorWithAlphaControls({\n            ariaLabel: 'Label outline color',\n            getValue: () => labelsBehavior?.outlineColor?.() ?? this.helios?.labelOutlineColor?.(),\n            setValue: (value) => labelsBehavior?.outlineColor?.(value) ?? this.helios?.labelOutlineColor?.(value),\n          }),\n        }).row);\n        return wrapper;\n      };\n\n      const createAdvancedContent = () => {\n        const advanced = document.createElement('div');\n        advanced.appendChild(createRows([\n          'nodeSizeBase',\n          'semanticZoomExponent',\n          'nodeOpacityBase',\n          'nodeOutlineWidthBase',\n          'edgeWidthBase',\n          'edgeOpacityBase',\n          'edgeEndpointTrim',\n        ]));\n\n        if (typeof this.helios?.supersampling === 'function') {\n          const supersampling = this.bindHeliosAccessor('supersampling');\n          const supersamplingSelect = document.createElement('select');\n          supersamplingSelect.className = 'helios-ui-select';\n          supersamplingSelect.setAttribute('aria-label', 'Supersampling');\n          tooltips.attachTooltip(supersamplingSelect, 'Canvas resolution scale. Auto keeps retina screens native and boosts lower-DPR screens.');\n          for (const option of [\n            { value: 'off', label: 'Off' },\n            { value: 'auto', label: 'Auto' },\n            { value: '2x', label: '2x' },\n          ]) {\n            const element = document.createElement('option');\n            element.value = option.value;\n            element.textContent = option.label;\n            supersamplingSelect.appendChild(element);\n          }\n          const syncSupersampling = (value) => {\n            const next = value === 'off' || value === '2x' ? value : 'auto';\n            supersamplingSelect.value = next;\n          };\n          const unsubscribeSupersampling = supersampling.subscribe((value) => {\n            syncSupersampling(value);\n          });\n          supersamplingSelect.addEventListener('change', () => {\n            supersampling.write(supersamplingSelect.value, { source: 'ui', event: 'change' });\n          });\n          this._controlCleanups.add(() => unsubscribeSupersampling());\n              advanced.appendChild(createAlignedRow({\n                title: 'Supersampling',\n                hint: 'Adjust canvas backing resolution live. Auto matches the legacy default.',\n                controls: supersamplingSelect,\n                dirtyIndicator: createStateIndicator(statePathForAccessor('supersampling')),\n              }).row);\n        }\n\n        const nodeBlendRow = createToggleRow('nodeBlendWithEdges', {\n          source: appearanceAccessorSource,\n          bind: bindAppearanceAccessor,\n        });\n        if (nodeBlendRow) advanced.appendChild(nodeBlendRow);\n        const edgeDepthRow = createToggleRow('edgeDepthWrite');\n        if (edgeDepthRow) advanced.appendChild(edgeDepthRow);\n        const edgeWidthClampRow = createToggleRow('edgeWidthClampToNodeDiameter', {\n          source: appearanceAccessorSource,\n          bind: bindAppearanceAccessor,\n        });\n        if (edgeWidthClampRow) advanced.appendChild(edgeWidthClampRow);\n        return advanced;\n      };\n\n      const nodeEdgeStack = new PanelStack();\n      const createShadedAppearanceContent = () => {\n        const container = document.createElement('div');\n        registerAccessorPersistenceKey('shadedLightColor', () => appearanceBehavior?.shadedLightColor?.() ?? this.helios?.shadedLightColor?.());\n        registerAccessorPersistenceKey('shadedAmbientTopColor', () => appearanceBehavior?.shadedAmbientTopColor?.() ?? this.helios?.shadedAmbientTopColor?.());\n        registerAccessorPersistenceKey('shadedAmbientBottomColor', () => appearanceBehavior?.shadedAmbientBottomColor?.() ?? this.helios?.shadedAmbientBottomColor?.());\n        registerAccessorPersistenceKey('shadedSpecularColor', () => appearanceBehavior?.shadedSpecularColor?.() ?? this.helios?.shadedSpecularColor?.());\n        const nodesRow = createToggleRow('shadedNodes', {\n          source: appearanceAccessorSource,\n          bind: bindAppearanceAccessor,\n        });\n        if (nodesRow) container.appendChild(nodesRow);\n        const edgesRow = createToggleRow('shadedEdges', {\n          source: appearanceAccessorSource,\n          bind: bindAppearanceAccessor,\n        });\n        if (edgesRow) container.appendChild(edgesRow);\n        const lightDirectionAttribute = bindAppearanceAccessor('shadedLightDirection', {\n          label: 'Light Direction',\n          defaultValue: [0.577350269, 0.577350269, 0.577350269],\n        });\n        const lightDirectionControl = createLightDirectionControl(lightDirectionAttribute, {\n          ariaLabel: 'Shaded light direction',\n        });\n        container.appendChild(createAlignedRow({\n          title: 'Light Direction',\n          hint: 'Drag the end marker to aim shaded lighting; edit X/Y/Z directly for precise values.',\n          controls: lightDirectionControl.element,\n          dirtyIndicator: createStateIndicator(statePathForAccessor('shadedLightDirection')),\n        }).row);\n        this._controlCleanups.add(() => lightDirectionControl.destroy());\n        container.appendChild(createAlignedRow({\n          title: 'Light Color',\n          hint: 'Diffuse light tint used by shaded nodes and edges.',\n          controls: createColorControls({\n            ariaLabel: 'Shaded light color',\n            getValue: () => appearanceBehavior?.shadedLightColor?.() ?? this.helios?.shadedLightColor?.(),\n            setValue: (value) => {\n              writeAppearanceAccessor('shadedLightColor', value, 'shaded-light-color');\n            },\n          }),\n          dirtyIndicator: createStateIndicator(statePathForAccessor('shadedLightColor')),\n        }).row);\n        container.appendChild(createRows(['shadedDiffuseStrength'], {\n          source: appearanceAccessorSource,\n          bind: bindAppearanceAccessor,\n        }));\n        container.appendChild(createAlignedRow({\n          title: 'Ambient Top',\n          hint: 'Ambient tint on the camera-facing top hemisphere.',\n          controls: createColorControls({\n            ariaLabel: 'Shaded ambient top color',\n            getValue: () => appearanceBehavior?.shadedAmbientTopColor?.() ?? this.helios?.shadedAmbientTopColor?.(),\n            setValue: (value) => {\n              writeAppearanceAccessor('shadedAmbientTopColor', value, 'shaded-ambient-top-color');\n            },\n          }),\n          dirtyIndicator: createStateIndicator(statePathForAccessor('shadedAmbientTopColor')),\n        }).row);\n        container.appendChild(createAlignedRow({\n          title: 'Ambient Bottom',\n          hint: 'Ambient tint on the lower hemisphere.',\n          controls: createColorControls({\n            ariaLabel: 'Shaded ambient bottom color',\n            getValue: () => appearanceBehavior?.shadedAmbientBottomColor?.() ?? this.helios?.shadedAmbientBottomColor?.(),\n            setValue: (value) => {\n              writeAppearanceAccessor('shadedAmbientBottomColor', value, 'shaded-ambient-bottom-color');\n            },\n          }),\n          dirtyIndicator: createStateIndicator(statePathForAccessor('shadedAmbientBottomColor')),\n        }).row);\n        container.appendChild(createRows(['shadedAmbientStrength'], {\n          source: appearanceAccessorSource,\n          bind: bindAppearanceAccessor,\n        }));\n        container.appendChild(createAlignedRow({\n          title: 'Specular Color',\n          hint: 'Highlight tint added by shaded lighting.',\n          controls: createColorControls({\n            ariaLabel: 'Shaded specular color',\n            getValue: () => appearanceBehavior?.shadedSpecularColor?.() ?? this.helios?.shadedSpecularColor?.(),\n            setValue: (value) => {\n              writeAppearanceAccessor('shadedSpecularColor', value, 'shaded-specular-color');\n            },\n          }),\n          dirtyIndicator: createStateIndicator(statePathForAccessor('shadedSpecularColor')),\n        }).row);\n        container.appendChild(createRows(['shadedSpecularStrength', 'shadedShininess'], {\n          source: appearanceAccessorSource,\n          bind: bindAppearanceAccessor,\n        }));\n        return container;\n      };\n\n      const createAmbientOcclusionContent = () => {\n        const container = document.createElement('div');\n        const nodesRow = createToggleRow('ambientOcclusionNodes', {\n          source: appearanceAccessorSource,\n          bind: bindAppearanceAccessor,\n        });\n        if (nodesRow) container.appendChild(nodesRow);\n        const edgesRow = createToggleRow('ambientOcclusionEdges', {\n          source: appearanceAccessorSource,\n          bind: bindAppearanceAccessor,\n        });\n        if (edgesRow) container.appendChild(edgesRow);\n        const modeRow = createSelectRow('ambientOcclusionMode', AMBIENT_OCCLUSION_MODE_OPTIONS, {\n          source: appearanceAccessorSource,\n          bind: bindAppearanceAccessor,\n        });\n        if (modeRow) container.appendChild(modeRow);\n        const qualityRow = createSelectRow('ambientOcclusionQuality', AMBIENT_OCCLUSION_QUALITY_OPTIONS, {\n          source: appearanceAccessorSource,\n          bind: bindAppearanceAccessor,\n        });\n        if (qualityRow) container.appendChild(qualityRow);\n        container.appendChild(createRows([\n          'ambientOcclusionStrength',\n          'ambientOcclusionRadius',\n          'ambientOcclusionBias',\n          'ambientOcclusionIntensityScale',\n          'ambientOcclusionIntensityShift',\n        ], {\n          source: appearanceAccessorSource,\n          bind: bindAppearanceAccessor,\n        }));\n        return container;\n      };\n      const ambientOcclusionDeviceType = String(this.helios?.renderer?.device?.type ?? '').toLowerCase();\n      const supportsAmbientOcclusion = ambientOcclusionDeviceType === 'webgpu' || ambientOcclusionDeviceType === 'webgl2';\n\n      const shadedEnabled = bindAppearanceAccessor('shadedEnabled');\n      const shadedToggle = createToggleControl({\n        checked: false,\n        onLabel: 'On',\n        offLabel: 'Off',\n        ariaLabel: 'Shaded',\n        disabled: shadedEnabled.readOnly,\n      });\n      const syncShadedToggle = (value) => {\n        shadedToggle.checked = Boolean(value);\n        shadedToggle.disabled = shadedEnabled.readOnly;\n      };\n      const unsubscribeShadedToggle = shadedEnabled.subscribe((value) => {\n        syncShadedToggle(value);\n      });\n      shadedToggle.addEventListener('change', () => {\n        shadedEnabled.write(shadedToggle.checked, { source: 'ui', event: 'change' });\n      });\n      this._controlCleanups.add(() => unsubscribeShadedToggle());\n      let ambientOcclusionToggle = null;\n      if (supportsAmbientOcclusion) {\n        const ambientOcclusionEnabled = bindAppearanceAccessor('ambientOcclusionEnabled');\n        ambientOcclusionToggle = createToggleControl({\n          checked: false,\n          onLabel: 'On',\n          offLabel: 'Off',\n          ariaLabel: 'Ambient Occlusion',\n          disabled: ambientOcclusionEnabled.readOnly,\n        });\n        const syncAmbientOcclusionToggle = (value) => {\n          ambientOcclusionToggle.checked = Boolean(value);\n          ambientOcclusionToggle.disabled = ambientOcclusionEnabled.readOnly;\n        };\n        const unsubscribeAmbientOcclusionToggle = ambientOcclusionEnabled.subscribe((value) => {\n          syncAmbientOcclusionToggle(value);\n        });\n        ambientOcclusionToggle.addEventListener('change', () => {\n          ambientOcclusionEnabled.write(ambientOcclusionToggle.checked, { source: 'ui', event: 'change' });\n        });\n        this._controlCleanups.add(() => unsubscribeAmbientOcclusionToggle());\n      }\n      const createEdgeAppearanceContent = () => {\n        const container = document.createElement('div');\n        container.appendChild(createRows(['edgeWidthScale', 'edgeOpacityScale'], {\n          source: appearanceAccessorSource,\n          bind: bindAppearanceAccessor,\n        }));\n        const edgeFastRow = createToggleRow('edgeFastRendering', {\n          source: appearanceAccessorSource,\n          bind: bindAppearanceAccessor,\n        });\n        if (edgeFastRow) container.appendChild(edgeFastRow);\n        if (typeof this.helios?.edgeAdaptiveQuality === 'function') {\n          const adaptiveContent = document.createElement('div');\n          const enabledRow = createToggleRow('edgeAdaptiveQualityEnabled', {\n            source: appearanceAccessorSource,\n            bind: bindAppearanceAccessor,\n          });\n          if (enabledRow) adaptiveContent.appendChild(enabledRow);\n          adaptiveContent.appendChild(createRows([\n            'edgeAdaptiveQualitySlowFrameThresholdMs',\n            'edgeAdaptiveQualitySlowFrameConsecutiveFrames',\n            'edgeAdaptiveQualityProbeIntervalMs',\n            'edgeAdaptiveQualityInteractionHoldMs',\n          ], {\n            source: appearanceAccessorSource,\n            bind: bindAppearanceAccessor,\n          }));\n          const fastDuringCameraRow = createToggleRow('edgeAdaptiveQualityFastDuringCamera', {\n            source: appearanceAccessorSource,\n            bind: bindAppearanceAccessor,\n          });\n          if (fastDuringCameraRow) adaptiveContent.appendChild(fastDuringCameraRow);\n          const fastDuringLayoutRow = createToggleRow('edgeAdaptiveQualityFastDuringLayout', {\n            source: appearanceAccessorSource,\n            bind: bindAppearanceAccessor,\n          });\n          if (fastDuringLayoutRow) adaptiveContent.appendChild(fastDuringLayoutRow);\n\n          const adaptiveStack = new PanelStack();\n          adaptiveStack.add({\n            id: 'edge-adaptive-quality',\n            title: 'Adaptive',\n            collapsed: true,\n            statusDot: false,\n            content: adaptiveContent,\n          });\n          container.appendChild(adaptiveStack.element);\n          this._controlCleanups.add(() => adaptiveStack.destroy());\n        }\n\n        return container;\n      };\n      nodeEdgeStack.add({\n        id: 'node-appearance',\n        title: 'Nodes',\n        content: createRows(['nodeSizeScale', 'nodeOpacityScale', 'nodeOutlineWidthScale'], {\n          source: appearanceAccessorSource,\n          bind: bindAppearanceAccessor,\n        }),\n      });\n      nodeEdgeStack.add({\n        id: 'edge-appearance',\n        title: 'Edges',\n        content: createEdgeAppearanceContent(),\n      });\n      nodeEdgeStack.add({\n        id: 'shaded-appearance',\n        title: 'Shaded',\n        collapsed: true,\n        statusDot: false,\n        headerControls: createHeaderControlsWithIndicator(shadedToggle, statePathForAccessor('shadedEnabled')),\n        content: createShadedAppearanceContent(),\n      });\n      if (supportsAmbientOcclusion) {\n        nodeEdgeStack.add({\n          id: 'ambient-occlusion-appearance',\n          title: 'Ambient Occlusion',\n          collapsed: true,\n          statusDot: false,\n          headerControls: createHeaderControlsWithIndicator(ambientOcclusionToggle, statePathForAccessor('ambientOcclusionEnabled')),\n          content: createAmbientOcclusionContent(),\n        });\n      }\n      this._controlCleanups.add(() => nodeEdgeStack.destroy());\n\n      const appearanceTab = document.createElement('div');\n      appearanceTab.appendChild(createAppearanceContent());\n      appearanceTab.appendChild(nodeEdgeStack.element);\n\n      const sceneTabs = new TabbedPanel({\n        variant: 'panel',\n        tabs: [\n          {\n            id: 'appearance',\n            title: 'Appearance',\n            content: appearanceTab,\n          },\n          {\n            id: 'labels',\n            title: 'Labels',\n            content: createLabelsContent(),\n          },\n          {\n            id: 'advanced',\n            title: 'Advanced',\n            content: createAdvancedContent(),\n          },\n        ],\n      });\n      content.appendChild(sceneTabs.element);\n      this._controlCleanups.add(() => sceneTabs.destroy());\n\n      let dataPanel = null;\n      if (options.includeDataPanel ?? true) {\n        dataPanel = this.createPanel({\n          id: options.dataPanelId ?? 'helios-ui-data',\n          title: options.dataPanelTitle ?? 'Data',\n          position: options.dataPanelPosition ?? { x: 16, y: 16 },\n          dock: options.dataPanelDock ?? options.dock ?? 'top-left',\n          content: networkControls,\n        });\n      }\n\n      const scenePanel = this.createPanel({\n        id: options.id ?? 'helios-ui-demo',\n        title: options.title ?? 'Scene',\n        position: options.position ?? { x: 16, y: 220 },\n        dock: options.dock ?? 'top-left',\n        panelSchema: SCENE_PANEL_SCHEMA,\n        content,\n      });\n\n      if (dataPanel) {\n        scenePanel.dataPanel = dataPanel;\n      }\n\n      return scenePanel;\n    } else {\n      content.appendChild(themeRow);\n    }\n\n    return this.createPanel({\n      id: options.id ?? 'helios-ui-demo',\n      title: options.title ?? 'Scene',\n      position: options.position ?? { x: 16, y: 16 },\n      dock: options.dock ?? 'top-left',\n      content,\n    });\n  }\n\n  /**\n   * Create the graph filtering panel with node and edge rule editors.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {object} [options] - Panel placement, throttling, width, and initial filter options.\n   * @returns {Panel} Created panel instance.\n   */\n  createFilterPanel(options = {}) {\n    const content = document.createElement('div');\n    content.className = 'helios-ui-filter';\n\n    const FILTER_SCOPE_RENDER = 'render';\n    const FILTER_SCOPE_RENDER_LAYOUT = 'render+layout';\n    const updateIntervalMs = Number.isFinite(options?.updateIntervalMs)\n      ? Math.max(0, Math.floor(options.updateIntervalMs))\n      : Number.isFinite(options?.debounceMs)\n        ? Math.max(0, Math.floor(options.debounceMs))\n        : 32;\n\n    const filterBehavior = this.helios?.behavior?.filters ?? this.helios?.useBehavior?.('filters');\n    if (options.filterModel instanceof HeliosFilter) {\n      filterBehavior?.setFilterModel?.(options.filterModel, { reason: 'panel-init' });\n    }\n\n    let applyTimer = null;\n    let lastApplyAt = 0;\n\n    const clearApplyTimer = () => {\n      if (applyTimer == null) return;\n      clearTimeout(applyTimer);\n      applyTimer = null;\n    };\n\n    const applyFilterNow = () => {\n      clearApplyTimer();\n      lastApplyAt = (typeof performance !== 'undefined' && typeof performance.now === 'function')\n        ? performance.now()\n        : Date.now();\n      try {\n        filterBehavior?.replaceRules?.({\n          scope: layoutCheckbox.checked ? FILTER_SCOPE_RENDER_LAYOUT : FILTER_SCOPE_RENDER,\n          nodeRules: nodeEditor.collectRules(),\n          edgeRules: edgeEditor.collectRules(),\n          minComponentSize: Math.max(1, Math.floor(Number(minComponentControls.input.value) || 1)),\n        });\n      } catch (error) {\n        // eslint-disable-next-line no-console\n        console.error('[HeliosUI] Failed to apply graph filter', error);\n      }\n    };\n\n    const scheduleApply = () => {\n      const now = (typeof performance !== 'undefined' && typeof performance.now === 'function')\n        ? performance.now()\n        : Date.now();\n      const elapsed = Math.max(0, now - lastApplyAt);\n      if (elapsed >= updateIntervalMs) {\n        applyFilterNow();\n        return;\n      }\n      clearApplyTimer();\n      applyTimer = setTimeout(applyFilterNow, Math.max(0, updateIntervalMs - elapsed));\n    };\n\n    const nodeEditor = createAttributeRuleEditor({\n      helios: this.helios,\n      scope: 'node',\n      addPlaceholder: 'Add filter...',\n      onDirty: scheduleApply,\n      testIds: {\n        addSelect: 'controls-filter-node-attribute',\n        sliderMin: 'controls-filter-node-min-slider',\n        sliderMax: 'controls-filter-node-max-slider',\n        minInput: 'controls-filter-node-min',\n        maxInput: 'controls-filter-node-max',\n        numericRemove: 'controls-filter-node-numeric-remove',\n        stringOperator: 'controls-filter-node-string-operator',\n        stringValue: 'controls-filter-node-string-value',\n        stringRemove: 'controls-filter-node-string-remove',\n        categoricalMode: 'controls-filter-node-categorical-mode',\n        categoricalList: 'controls-filter-node-categorical-list',\n        categoricalText: 'controls-filter-node-categorical-text',\n        categoricalRemove: 'controls-filter-node-categorical-remove',\n        queryInput: 'controls-filter-node-query',\n        queryRemove: 'controls-filter-node-query-remove',\n      },\n    });\n\n    const edgeEditor = createAttributeRuleEditor({\n      helios: this.helios,\n      scope: 'edge',\n      addPlaceholder: 'Add filter...',\n      onDirty: scheduleApply,\n      testIds: {\n        addSelect: 'controls-filter-edge-attribute',\n        sliderMin: 'controls-filter-edge-min-slider',\n        sliderMax: 'controls-filter-edge-max-slider',\n        minInput: 'controls-filter-edge-min',\n        maxInput: 'controls-filter-edge-max',\n        numericRemove: 'controls-filter-edge-numeric-remove',\n        stringOperator: 'controls-filter-edge-string-operator',\n        stringValue: 'controls-filter-edge-string-value',\n        stringRemove: 'controls-filter-edge-string-remove',\n        categoricalMode: 'controls-filter-edge-categorical-mode',\n        categoricalList: 'controls-filter-edge-categorical-list',\n        categoricalText: 'controls-filter-edge-categorical-text',\n        categoricalRemove: 'controls-filter-edge-categorical-remove',\n        queryInput: 'controls-filter-edge-query',\n        queryRemove: 'controls-filter-edge-query-remove',\n      },\n    });\n\n    const tabBarFilterHost = document.createElement('div');\n    tabBarFilterHost.style.display = 'flex';\n    tabBarFilterHost.style.alignItems = 'center';\n    tabBarFilterHost.style.justifyContent = 'flex-end';\n    tabBarFilterHost.style.minWidth = '0';\n    tabBarFilterHost.appendChild(nodeEditor.addSelect);\n    tabBarFilterHost.appendChild(edgeEditor.addSelect);\n\n    const syncTabBarFilterForActiveTab = (tabId) => {\n      const active = tabId === 'edges' ? 'edge' : 'node';\n      nodeEditor.addSelect.hidden = active !== 'node';\n      edgeEditor.addSelect.hidden = active !== 'edge';\n    };\n\n    const tabs = new TabbedPanel({\n      variant: 'panel',\n      barRight: tabBarFilterHost,\n      onActiveChanged: (tabId) => {\n        syncTabBarFilterForActiveTab(tabId);\n      },\n      tabs: [\n        {\n          id: 'nodes',\n          title: 'Nodes',\n          content: nodeEditor.element,\n        },\n        {\n          id: 'edges',\n          title: 'Edges',\n          content: edgeEditor.element,\n        },\n      ],\n    });\n    this._controlCleanups.add(() => tabs.destroy());\n    syncTabBarFilterForActiveTab(tabs.activeId?.() ?? 'nodes');\n\n    const layoutCheckbox = createSegmentedToggleControl({\n      checked: false,\n      onLabel: 'Layout+Render',\n      offLabel: 'Render Only',\n      ariaLabel: 'Apply filter scope to layout',\n    });\n    layoutCheckbox.dataset.testid = 'controls-filter-layout';\n    layoutCheckbox.addEventListener('change', scheduleApply);\n\n    const minComponentControls = new SuggestedSliderControls({\n      value: Math.max(1, Math.floor(Number(options.minComponentSize) || 1)),\n      suggested: [1, 10],\n      step: 1,\n      inputMin: 1,\n      inputMax: null,\n      onCommit: (value) => {\n        const next = Math.max(1, Math.floor(Number(value) || 1));\n        minComponentControls.set(next);\n        scheduleApply();\n      },\n    });\n    minComponentControls.slider.dataset.testid = 'controls-filter-min-component-size-slider';\n    minComponentControls.input.dataset.testid = 'controls-filter-min-component-size';\n    minComponentControls.input.inputMode = 'numeric';\n    minComponentControls.input.setAttribute('aria-label', 'Minimum component size');\n\n    const minComponentRow = createAlignedRowEl({\n      title: 'Comp. size',\n      hint: 'Minimum connected-component size to keep. Set to 1 to keep all components.',\n      controls: minComponentControls.element,\n      dirtyIndicator: this.createStateIndicator('filters.minComponentSize', 'filters.minComponentSize'),\n    });\n\n    const layoutWrap = document.createElement('div');\n    layoutWrap.style.display = 'inline-flex';\n    layoutWrap.style.alignItems = 'center';\n    layoutWrap.style.gap = '6px';\n    layoutWrap.style.marginTop = '6px';\n    layoutWrap.style.flexWrap = 'wrap';\n    layoutWrap.style.userSelect = 'none';\n    layoutWrap.appendChild(layoutCheckbox);\n\n    const syncScopeFromFilter = () => {\n      const filter = filterBehavior?.filters?.() ?? this.helios?.getGraphFilter?.() ?? null;\n      layoutCheckbox.checked = filter?.scope === FILTER_SCOPE_RENDER_LAYOUT;\n      const minComponentSize = Math.max(\n        1,\n        Math.floor(Number(filter?.minComponentSize ?? filter?.options?.minComponentSize) || 1),\n      );\n      if (\n        document.activeElement !== minComponentControls.slider\n        && document.activeElement !== minComponentControls.input\n      ) {\n        minComponentControls.set(minComponentSize);\n      }\n    };\n\n    const refreshFromNetwork = () => {\n      nodeEditor.refreshFromNetwork();\n      edgeEditor.refreshFromNetwork();\n    };\n\n    let networkAttributeUnsub = null;\n    const attachNetworkAttributeListeners = () => {\n      if (networkAttributeUnsub) {\n        networkAttributeUnsub();\n        networkAttributeUnsub = null;\n      }\n      const network = this.helios?.network ?? null;\n      if (!network) return;\n      const handler = (event) => {\n        const scope = event?.detail?.scope;\n        if (scope && scope !== 'node' && scope !== 'edge') return;\n        const type = event?.type ?? '';\n        if (type === 'attribute:changed') {\n          const op = event?.detail?.op ?? '';\n          if (op !== 'categorize' && op !== 'decategorize') return;\n        }\n        refreshFromNetwork();\n      };\n      if (typeof network.on === 'function') {\n        const unsubs = [\n          network.on('attribute:defined', handler),\n          network.on('attribute:removed', handler),\n          network.on('attribute:changed', handler),\n        ];\n        networkAttributeUnsub = () => {\n          for (const unsub of unsubs) unsub?.();\n        };\n      } else if (typeof network.addEventListener === 'function') {\n        network.addEventListener('attribute:defined', handler);\n        network.addEventListener('attribute:removed', handler);\n        network.addEventListener('attribute:changed', handler);\n        networkAttributeUnsub = () => {\n          network.removeEventListener('attribute:defined', handler);\n          network.removeEventListener('attribute:removed', handler);\n          network.removeEventListener('attribute:changed', handler);\n        };\n      }\n    };\n\n    const onNetworkReplaced = () => {\n      attachNetworkAttributeListeners();\n      refreshFromNetwork();\n      scheduleApply();\n    };\n\n    const onFilterChanged = () => {\n      syncScopeFromFilter();\n    };\n\n    let unsubNetwork = null;\n    let unsubFilter = null;\n    if (this.helios?.on) {\n      unsubNetwork = this.helios.on('network:replaced', onNetworkReplaced);\n      unsubFilter = this.helios.on('graph:filter-changed', onFilterChanged);\n    } else if (this.helios?.addEventListener) {\n      this.helios.addEventListener('network:replaced', onNetworkReplaced);\n      this.helios.addEventListener('graph:filter-changed', onFilterChanged);\n      unsubNetwork = () => this.helios.removeEventListener('network:replaced', onNetworkReplaced);\n      unsubFilter = () => this.helios.removeEventListener('graph:filter-changed', onFilterChanged);\n    }\n    if (unsubNetwork) this._controlCleanups.add(unsubNetwork);\n    if (unsubFilter) this._controlCleanups.add(unsubFilter);\n    const unsubBehavior = filterBehavior?.on?.('change', onFilterChanged) ?? null;\n    if (unsubBehavior) this._controlCleanups.add(unsubBehavior);\n    attachNetworkAttributeListeners();\n    if (networkAttributeUnsub) this._controlCleanups.add(() => networkAttributeUnsub?.());\n    this._controlCleanups.add(() => {\n      clearApplyTimer();\n      nodeEditor.destroy();\n      edgeEditor.destroy();\n      minComponentControls.destroy();\n    });\n\n    syncScopeFromFilter();\n    refreshFromNetwork();\n\n    content.appendChild(tabs.element);\n    content.appendChild(layoutWrap);\n    content.appendChild(minComponentRow.row);\n\n    return this.createPanel({\n      id: options.id ?? 'helios-ui-filter',\n      title: options.title ?? 'Filter',\n      position: options.position ?? { x: 16, y: 250 },\n      dock: options.dock ?? 'top-left',\n      width: options.width,\n      minWidth: options.minWidth,\n      panelSchema: FILTERS_PANEL_SCHEMA,\n      content,\n    });\n  }\n  /**\n   * Create a metrics panel for basic graph and renderer counters.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {object} [options] - Panel placement and collapsed-state options.\n   * @returns {Panel} Created panel instance.\n   */\n  createMetricsPanel(options = {}) {\n    const content = document.createElement('div');\n    content.style.setProperty('--helios-ui-label-col', '130px');\n\n    const tooltipCleanups = new Set();\n\n    const attachTooltip = (anchorEl, hint) => {\n      if (!anchorEl || !hint) return () => {};\n\n      let tooltip = null;\n      let tooltipRoot = null;\n      let hideTooltipTimer = null;\n\n      const resolveTooltipRoot = () => anchorEl.closest?.('.helios-ui') ?? anchorEl.ownerDocument?.body ?? document.body;\n\n      const setTooltipHidden = (hidden) => {\n        if (!tooltip) return;\n        tooltip.dataset.open = hidden ? 'false' : 'true';\n        tooltip.hidden = hidden;\n      };\n\n      const placeTooltip = () => {\n        if (!tooltip) return;\n        const anchor = tooltip.dataset.anchorId ? anchorEl.ownerDocument?.getElementById?.(tooltip.dataset.anchorId) : null;\n        const el = anchor ?? null;\n        if (!el) return;\n\n        const margin = 8;\n        const rect = el.getBoundingClientRect();\n        const { innerWidth: vw, innerHeight: vh } = window;\n\n        tooltip.style.left = '0px';\n        tooltip.style.top = '0px';\n        tooltip.style.transform = 'translate(-9999px, -9999px)';\n        const tipRect = tooltip.getBoundingClientRect();\n\n        const preferredLeft = rect.left + rect.width / 2 - tipRect.width / 2;\n        const left = Math.max(margin, Math.min(vw - margin - tipRect.width, preferredLeft));\n\n        const preferredTop = rect.top - 8 - tipRect.height;\n        const fallbackTop = rect.bottom + 8;\n        const top = preferredTop >= margin ? preferredTop : Math.min(vh - margin - tipRect.height, fallbackTop);\n\n        tooltip.style.left = `${left}px`;\n        tooltip.style.top = `${top}px`;\n        tooltip.style.transform = 'translate(0, 0)';\n      };\n\n      const scheduleHideTooltip = () => {\n        if (hideTooltipTimer != null) window.clearTimeout(hideTooltipTimer);\n        hideTooltipTimer = window.setTimeout(() => setTooltipHidden(true), 120);\n      };\n\n      const showTooltip = () => {\n        if (!tooltip) return;\n        if (hideTooltipTimer != null) window.clearTimeout(hideTooltipTimer);\n        if (!tooltipRoot) {\n          tooltipRoot = resolveTooltipRoot();\n          tooltipRoot.appendChild(tooltip);\n        }\n        setTooltipHidden(false);\n        placeTooltip();\n      };\n\n      tooltip = document.createElement('div');\n      tooltip.className = 'helios-ui-tooltip';\n      tooltip.hidden = true;\n      tooltip.dataset.open = 'false';\n      tooltip.textContent = hint;\n      tooltip.setAttribute('role', 'tooltip');\n\n      const tooltipId = `helios-ui-tooltip-${Math.random().toString(16).slice(2)}`;\n      tooltip.dataset.anchorId = tooltipId;\n      anchorEl.id = tooltipId;\n      anchorEl.tabIndex = 0;\n\n      const onPointerEnter = () => showTooltip();\n      const onPointerLeave = () => scheduleHideTooltip();\n      const onFocus = () => showTooltip();\n      const onBlur = () => setTooltipHidden(true);\n      const onKeyDown = (e) => {\n        if (e.key === 'Escape') {\n          setTooltipHidden(true);\n          anchorEl.blur();\n        }\n      };\n      const onScrollOrResize = () => {\n        if (!tooltip || tooltip.hidden) return;\n        placeTooltip();\n      };\n\n      anchorEl.addEventListener('pointerenter', onPointerEnter);\n      anchorEl.addEventListener('pointerleave', onPointerLeave);\n      anchorEl.addEventListener('focus', onFocus);\n      anchorEl.addEventListener('blur', onBlur);\n      anchorEl.addEventListener('keydown', onKeyDown);\n      window.addEventListener('scroll', onScrollOrResize, { capture: true });\n      window.addEventListener('resize', onScrollOrResize);\n\n      const cleanup = () => {\n        if (hideTooltipTimer != null) window.clearTimeout(hideTooltipTimer);\n        anchorEl.removeEventListener('pointerenter', onPointerEnter);\n        anchorEl.removeEventListener('pointerleave', onPointerLeave);\n        anchorEl.removeEventListener('focus', onFocus);\n        anchorEl.removeEventListener('blur', onBlur);\n        anchorEl.removeEventListener('keydown', onKeyDown);\n        window.removeEventListener('scroll', onScrollOrResize, { capture: true });\n        window.removeEventListener('resize', onScrollOrResize);\n        tooltip?.remove?.();\n        tooltip = null;\n        tooltipRoot = null;\n      };\n\n      tooltipCleanups.add(cleanup);\n      return cleanup;\n    };\n\n    const createAlignedRow = ({ title, hint, controls }) => {\n      const row = document.createElement('div');\n      row.className = 'helios-ui-row helios-ui-row--aligned';\n      const label = document.createElement('div');\n      label.className = 'helios-ui-label';\n\n      const titleRowEl = document.createElement('div');\n      titleRowEl.className = 'helios-ui-label__title-row';\n      const titleEl = document.createElement('div');\n      titleEl.className = 'helios-ui-label__title';\n      titleEl.textContent = title ?? '';\n      titleRowEl.appendChild(titleEl);\n      label.appendChild(titleRowEl);\n      if (hint) attachTooltip(titleEl, hint);\n\n      row.appendChild(label);\n      const controlWrap = document.createElement('div');\n      controlWrap.className = 'helios-ui-row__controls';\n      if (controls) controlWrap.appendChild(controls);\n      row.appendChild(controlWrap);\n      return { row, titleEl, controlWrap };\n    };\n\n    const updateSliderVisual = (slider) => {\n      if (!slider) return;\n      const min = Number(slider.min);\n      const max = Number(slider.max);\n      const value = Number(slider.value);\n      if (!Number.isFinite(min) || !Number.isFinite(max) || !Number.isFinite(value) || min === max) return;\n      const pct = ((value - min) / (max - min)) * 100;\n      slider.style.setProperty('--pct', String(Math.max(0, Math.min(100, pct))));\n    };\n\n    const formatCompactNumber = (value, sigDigits = 6) => {\n      const v = Number(value);\n      if (!Number.isFinite(v)) return '';\n      if (v === 0) return '0';\n      return String(Number(v.toPrecision(sigDigits)));\n    };\n\n    const createLinearSliderRow = ({ title, hint, valueInput, range, step = 1, inputMin = null, inputMax = null, clampInput = true }) => {\n      const { row, controlWrap } = createAlignedRow({ title, hint, controls: null });\n      row.classList.add('helios-ui-row--slider');\n\n      const controls = document.createElement('div');\n      controls.className = 'helios-ui-slider-controls';\n\n      const slider = document.createElement('input');\n      slider.className = 'helios-ui-slider';\n      slider.type = 'range';\n      slider.min = String(range.min);\n      slider.max = String(range.max);\n      slider.step = String(step);\n\n      valueInput.classList.add('helios-ui-number');\n      valueInput.type = 'number';\n      valueInput.step = String(step);\n      valueInput.min = String(inputMin ?? range.min);\n      if (inputMax != null) valueInput.max = String(inputMax);\n      else valueInput.removeAttribute('max');\n\n      const write = (next) => {\n        const n = Number(next);\n        if (!Number.isFinite(n)) return;\n        const nextValue = clampInput ? Math.max(range.min, Math.min(range.max, n)) : n;\n        const sliderValue = Math.max(range.min, Math.min(range.max, n));\n        slider.value = String(sliderValue);\n        valueInput.value = String(nextValue);\n        updateSliderVisual(slider);\n      };\n\n      write(valueInput.value || range.min);\n\n      slider.addEventListener('input', () => write(slider.value));\n      valueInput.addEventListener('change', () => write(valueInput.value));\n      valueInput.addEventListener('keydown', (e) => {\n        if (e.key === 'Enter') {\n          write(valueInput.value);\n          valueInput.blur();\n        }\n      });\n\n      controls.appendChild(slider);\n      controls.appendChild(valueInput);\n      controlWrap.appendChild(controls);\n      return { row, slider, write };\n    };\n\n    const createLogSliderRow = ({ title, hint, valueInput, minExp = -4, maxExp = 4, stepExp = 0.01 }) => {\n      const { row, controlWrap } = createAlignedRow({ title, hint, controls: null });\n      row.classList.add('helios-ui-row--slider');\n\n      const controls = document.createElement('div');\n      controls.className = 'helios-ui-slider-controls';\n\n      const slider = document.createElement('input');\n      slider.className = 'helios-ui-slider';\n      slider.type = 'range';\n      slider.min = String(minExp);\n      slider.max = String(maxExp);\n      slider.step = String(stepExp);\n\n      const minValue = 10 ** minExp;\n      const maxValue = 10 ** maxExp;\n\n      valueInput.classList.add('helios-ui-number');\n      valueInput.type = 'number';\n      valueInput.step = 'any';\n      valueInput.min = '0';\n\n      const write = (next) => {\n        const n = Number(next);\n        if (!Number.isFinite(n) || n <= 0) return;\n        // Keep the numeric value unbounded (>0); only clamp the slider's position\n        // to the suggested exponent window.\n        const exp = Math.log10(n);\n        slider.value = String(Math.max(minExp, Math.min(maxExp, exp)));\n        valueInput.value = formatCompactNumber(n, 6);\n        updateSliderVisual(slider);\n      };\n\n      const writeFromSlider = () => {\n        const exp = Number(slider.value);\n        if (!Number.isFinite(exp)) return;\n        const value = 10 ** exp;\n        valueInput.value = formatCompactNumber(value, 6);\n        updateSliderVisual(slider);\n      };\n\n      // Initialize from the provided numeric value.\n      write(valueInput.value || 1);\n\n      slider.addEventListener('input', () => writeFromSlider());\n      valueInput.addEventListener('change', () => write(valueInput.value));\n      valueInput.addEventListener('keydown', (e) => {\n        if (e.key === 'Enter') {\n          write(valueInput.value);\n          valueInput.blur();\n        }\n      });\n\n      controls.appendChild(slider);\n      controls.appendChild(valueInput);\n      controlWrap.appendChild(controls);\n      return { row, slider, write };\n    };\n\n    const net = () => this.helios?.network ?? null;\n    const defer = (ms = 0) => new Promise((resolve) => setTimeout(resolve, Math.max(0, Number(ms) || 0)));\n\n    const formatNumber = (value, digits = 3) => {\n      if (!Number.isFinite(value)) return '—';\n      return Number(value).toFixed(digits);\n    };\n\n    const makeValue = (text = '—') => {\n      const el = document.createElement('div');\n      el.className = 'helios-ui-value';\n      el.textContent = text;\n      return el;\n    };\n\n    const createStat = (labelText, valueEl) => {\n      const stat = document.createElement('div');\n      stat.className = 'helios-ui-stat';\n      const label = document.createElement('div');\n      label.className = 'helios-ui-stat__label';\n      label.textContent = labelText;\n      const value = valueEl ?? document.createElement('div');\n      if (!valueEl) {\n        value.className = 'helios-ui-stat__value';\n        value.textContent = '—';\n      } else {\n        value.classList.add('helios-ui-stat__value');\n      }\n      stat.appendChild(label);\n      stat.appendChild(value);\n      return { stat, label, value };\n    };\n\n    const setDisabled = (el, disabled) => {\n      if (!el) return;\n      el.disabled = Boolean(disabled);\n    };\n\n    const setProgressActionButtonState = (button, running) => {\n      if (!button) return;\n      const isRunning = Boolean(running);\n      button.classList.toggle('helios-ui-button--danger', isRunning);\n      button.classList.toggle('helios-ui-button--spinning', isRunning);\n      button.textContent = isRunning ? 'Cancel' : 'Calculate';\n      button.title = isRunning\n        ? 'Cancel current run'\n        : (button.dataset.calcTitle || 'Calculate');\n      button.setAttribute('aria-busy', isRunning ? 'true' : 'false');\n    };\n\n    const normalizeDimensionMethod = (value) => {\n      const normalized = String(value ?? '').trim().toLowerCase();\n      if (normalized === 'forward' || normalized === 'fw') return 'forward';\n      if (normalized === 'backward' || normalized === 'bk') return 'backward';\n      if (normalized === 'central' || normalized === 'centered' || normalized === 'ce') return 'central';\n      return 'leastsquares';\n    };\n\n    const maxOrderForDimensionMethod = (method) => {\n      const normalized = normalizeDimensionMethod(method);\n      if (normalized === 'forward' || normalized === 'backward') return 6;\n      if (normalized === 'central') return 4;\n      return 32;\n    };\n\n    const maxFiniteArrayValue = (values) => {\n      if (!values || typeof values.length !== 'number') return NaN;\n      let max = Number.NEGATIVE_INFINITY;\n      for (let i = 0; i < values.length; i += 1) {\n        const v = Number(values[i]);\n        if (Number.isFinite(v) && v > max) {\n          max = v;\n        }\n      }\n      return Number.isFinite(max) ? max : NaN;\n    };\n\n    const summarizeFiniteValues = (values) => {\n      if (!values || typeof values.length !== 'number') {\n        return {\n          count: 0,\n          min: NaN,\n          max: NaN,\n          mean: NaN,\n        };\n      }\n      let count = 0;\n      let min = Number.POSITIVE_INFINITY;\n      let max = Number.NEGATIVE_INFINITY;\n      let sum = 0;\n      for (let i = 0; i < values.length; i += 1) {\n        const v = Number(values[i]);\n        if (!Number.isFinite(v)) continue;\n        count += 1;\n        sum += v;\n        if (v < min) min = v;\n        if (v > max) max = v;\n      }\n      return {\n        count,\n        min: count > 0 ? min : NaN,\n        max: count > 0 ? max : NaN,\n        mean: count > 0 ? sum / count : NaN,\n      };\n    };\n\n    const writeNodeMetricValues = (network, attributeName, result) => {\n      if (!network || !attributeName || typeof attributeName !== 'string') return false;\n      const trimmed = attributeName.trim();\n      if (!trimmed) return false;\n\n      const writeBuffer = () => network.withBufferAccess(() => {\n        const buffer = network.getNodeAttributeBuffer(trimmed);\n        const view = buffer?.view ?? null;\n        if (!view || typeof view.length !== 'number') return false;\n\n        const full = result?.valuesByNode;\n        if (full && typeof full.length === 'number') {\n          const n = Math.min(view.length, full.length);\n          for (let i = 0; i < n; i += 1) {\n            const v = Number(full[i]);\n            view[i] = Number.isFinite(v) ? v : 0;\n          }\n        } else {\n          const nodeIndices = result?.nodeIndices;\n          const values = result?.values;\n          if (!nodeIndices || !values || typeof nodeIndices.length !== 'number' || typeof values.length !== 'number') {\n            return false;\n          }\n          const n = Math.min(nodeIndices.length, values.length);\n          for (let i = 0; i < n; i += 1) {\n            const node = Number(nodeIndices[i]);\n            if (!Number.isInteger(node) || node < 0 || node >= view.length) continue;\n            const v = Number(values[i]);\n            view[node] = Number.isFinite(v) ? v : 0;\n          }\n        }\n\n        if (typeof buffer.bumpVersion === 'function') {\n          buffer.bumpVersion();\n        }\n        return true;\n      });\n\n      try {\n        return Boolean(writeBuffer());\n      } catch (_) {\n        if (typeof network.defineNodeAttribute !== 'function') return false;\n      }\n\n      network.defineNodeAttribute(trimmed, AttributeType.Float, 1);\n      return Boolean(writeBuffer());\n    };\n\n    const markMetricOutputDirty = (metricName, attributes = []) => {\n      const names = Array.from(new Set((Array.isArray(attributes) ? attributes : [attributes])\n        .map((name) => String(name ?? '').trim())\n        .filter(Boolean)));\n      if (!names.length) return;\n      this.registerStateControl?.('metrics.lastOutput', {\n        scope: 'network',\n        debounceMs: 500,\n        defaultValue: null,\n        metadata: { panel: 'metrics' },\n      });\n      this.writeStateControl?.('metrics.lastOutput', {\n        metric: String(metricName ?? 'metric'),\n        attributes: names,\n        updatedAt: Date.now(),\n      }, {\n        scope: 'network',\n        source: 'ui',\n        reason: `metrics:${metricName ?? 'metric'}`,\n        debounceMs: 500,\n      });\n      this.helios?.storage?.markNetworkDirty?.(`metrics:${metricName ?? 'metric'}`);\n    };\n\n    const styleStatusHint = (el) => {\n      if (!el) return;\n      el.className = 'helios-ui-label__hint';\n      el.style.marginTop = '0px';\n      el.style.fontSize = '10px';\n      el.style.lineHeight = '1.2';\n      el.style.whiteSpace = 'normal';\n      el.style.overflow = 'visible';\n      el.style.textOverflow = 'clip';\n      el.style.maxWidth = '100%';\n      el.style.minWidth = '0';\n    };\n\n    const reportMeasurementError = (metricName, error, context = null) => {\n      const err = error instanceof Error ? error : new Error(String(error));\n      const message = err?.message ?? String(err);\n      const detail = err?.stack ? `${message}\\n${err.stack}` : message;\n      if (typeof globalThis !== 'undefined' && typeof globalThis.reportError === 'function') {\n        try {\n          globalThis.reportError(err);\n        } catch (reportErrorFailure) {\n          console.warn('[HeliosUI] reportError failed while reporting a metric error.', reportErrorFailure);\n        }\n      }\n      // eslint-disable-next-line no-console\n      console.error(`[HeliosUI] ${metricName} failed`, { error: err, context });\n      return detail;\n    };\n\n    const normalizeNeighborDirection = (value) => {\n      const normalized = String(value ?? '').trim().toLowerCase();\n      if (normalized === 'out' || normalized === 'outgoing') return 'out';\n      if (normalized === 'in' || normalized === 'incoming') return 'in';\n      return 'both';\n    };\n\n    const normalizeStrengthMeasure = (value) => {\n      const normalized = String(value ?? '').trim().toLowerCase();\n      if (normalized === 'average' || normalized === 'avg' || normalized === 'mean') return 'average';\n      if (normalized === 'maximum' || normalized === 'max') return 'maximum';\n      if (normalized === 'minimum' || normalized === 'min') return 'minimum';\n      return 'sum';\n    };\n\n    const normalizeClusteringVariant = (value) => {\n      const normalized = String(value ?? '').trim().toLowerCase();\n      if (normalized === 'onnela') return 'onnela';\n      if (normalized === 'newman' || normalized === 'barrat' || normalized === 'weighted') return 'newman';\n      return 'unweighted';\n    };\n\n    const isNumericEdgeWeightType = (type) =>\n      type === AttributeType.Float ||\n      type === AttributeType.Double ||\n      type === AttributeType.Integer ||\n      type === AttributeType.UnsignedInteger ||\n      type === AttributeType.BigInteger ||\n      type === AttributeType.UnsignedBigInteger;\n\n    const createDirectionSelect = (testid, initialValue = 'both') => {\n      const select = document.createElement('select');\n      select.className = 'helios-ui-select';\n      if (testid) select.dataset.testid = testid;\n      for (const entry of [\n        { value: 'both', label: 'Both' },\n        { value: 'in', label: 'In' },\n        { value: 'out', label: 'Out' },\n      ]) {\n        const opt = document.createElement('option');\n        opt.value = entry.value;\n        opt.textContent = entry.label;\n        select.appendChild(opt);\n      }\n      select.value = normalizeNeighborDirection(initialValue);\n      return select;\n    };\n\n    const edgeWeightSelects = [];\n    const createEdgeWeightSelect = (testid, initialValue = '') => {\n      const select = document.createElement('select');\n      select.className = 'helios-ui-select';\n      if (testid) select.dataset.testid = testid;\n      select.dataset.initialValue = initialValue ? String(initialValue) : '';\n      select.dataset.userSelected = 'false';\n      select.addEventListener('change', () => {\n        select.dataset.userSelected = 'true';\n      });\n      edgeWeightSelects.push(select);\n      return select;\n    };\n\n    // --- Degree --------------------------------------------------------------\n    const degree = document.createElement('div');\n\n    const degreeDirectionSelect = createDirectionSelect('metrics-degree-direction', options?.degree?.direction ?? 'both');\n    const degreeOutAttrInput = document.createElement('input');\n    degreeOutAttrInput.type = 'text';\n    degreeOutAttrInput.className = 'helios-ui-text';\n    degreeOutAttrInput.placeholder = 'degree';\n    degreeOutAttrInput.value = String(options?.degree?.outNodeAttribute ?? 'degree');\n    degreeOutAttrInput.dataset.testid = 'metrics-degree-outAttr';\n\n    const degreeCalcButton = document.createElement('button');\n    degreeCalcButton.type = 'button';\n    degreeCalcButton.className = 'helios-ui-button';\n    degreeCalcButton.textContent = 'Calculate';\n    degreeCalcButton.title = 'Calculate degree';\n    degreeCalcButton.dataset.testid = 'metrics-degree-calc';\n\n    const degreeStatusEl = document.createElement('div');\n    degreeStatusEl.dataset.testid = 'metrics-degree-status';\n    degreeStatusEl.textContent = '';\n    styleStatusHint(degreeStatusEl);\n\n    degree.appendChild(createAlignedRow({\n      title: 'Direction',\n      hint: 'For directed networks: In, Out, or Both',\n      controls: degreeDirectionSelect,\n    }).row);\n    degree.appendChild(createAlignedRow({\n      title: 'Status',\n      hint: 'Latest run status',\n      controls: degreeStatusEl,\n    }).row);\n\n    const degreeStats = document.createElement('div');\n    degreeStats.className = 'helios-ui-stats';\n    const degreeMaxValue = makeValue('—');\n    degreeMaxValue.dataset.testid = 'metrics-degree-max';\n    const degreeMeanValue = makeValue('—');\n    degreeMeanValue.dataset.testid = 'metrics-degree-mean';\n    const degreeElapsedValue = makeValue('—');\n    degreeElapsedValue.dataset.testid = 'metrics-degree-elapsed';\n    degreeStats.appendChild(createStat('Max', degreeMaxValue).stat);\n    degreeStats.appendChild(createStat('Mean', degreeMeanValue).stat);\n    degreeStats.appendChild(createStat('Elapsed', degreeElapsedValue).stat);\n    degreeStats.style.marginTop = '2px';\n    degreeStats.style.marginBottom = '8px';\n    degree.appendChild(degreeStats);\n\n    const degreeAdvanced = document.createElement('div');\n    degreeAdvanced.appendChild(createAlignedRow({\n      title: 'Output Attr',\n      hint: 'Writes Float node degree values',\n      controls: degreeOutAttrInput,\n    }).row);\n    const degreeInnerStack = new PanelStack();\n    degreeInnerStack.add({ id: 'metrics-degree-advanced', title: 'Advanced', collapsed: true, statusDot: false, content: degreeAdvanced });\n    degreeInnerStack.element.style.marginTop = '6px';\n\n    // --- Strength ------------------------------------------------------------\n    const strength = document.createElement('div');\n\n    const strengthDirectionSelect = createDirectionSelect('metrics-strength-direction', options?.strength?.direction ?? 'both');\n    const strengthMeasureSelect = document.createElement('select');\n    strengthMeasureSelect.className = 'helios-ui-select';\n    strengthMeasureSelect.dataset.testid = 'metrics-strength-measure';\n    for (const entry of [\n      { value: 'sum', label: 'Sum' },\n      { value: 'average', label: 'Average' },\n      { value: 'maximum', label: 'Maximum' },\n      { value: 'minimum', label: 'Minimum' },\n    ]) {\n      const opt = document.createElement('option');\n      opt.value = entry.value;\n      opt.textContent = entry.label;\n      strengthMeasureSelect.appendChild(opt);\n    }\n    strengthMeasureSelect.value = normalizeStrengthMeasure(options?.strength?.measure ?? 'sum');\n\n    const strengthWeightSelect = createEdgeWeightSelect('metrics-strength-weight', options?.strength?.edgeWeightAttribute ?? '');\n    const strengthOutAttrInput = document.createElement('input');\n    strengthOutAttrInput.type = 'text';\n    strengthOutAttrInput.className = 'helios-ui-text';\n    strengthOutAttrInput.placeholder = 'strength';\n    strengthOutAttrInput.value = String(options?.strength?.outNodeAttribute ?? 'strength');\n    strengthOutAttrInput.dataset.testid = 'metrics-strength-outAttr';\n\n    const strengthCalcButton = document.createElement('button');\n    strengthCalcButton.type = 'button';\n    strengthCalcButton.className = 'helios-ui-button';\n    strengthCalcButton.textContent = 'Calculate';\n    strengthCalcButton.title = 'Calculate strength';\n    strengthCalcButton.dataset.testid = 'metrics-strength-calc';\n\n    const strengthStatusEl = document.createElement('div');\n    strengthStatusEl.dataset.testid = 'metrics-strength-status';\n    strengthStatusEl.textContent = '';\n    styleStatusHint(strengthStatusEl);\n\n    strength.appendChild(createAlignedRow({\n      title: 'Direction',\n      hint: 'For directed networks: In, Out, or Both',\n      controls: strengthDirectionSelect,\n    }).row);\n    strength.appendChild(createAlignedRow({\n      title: 'Measure',\n      hint: 'Aggregation over incident edge weights',\n      controls: strengthMeasureSelect,\n    }).row);\n    strength.appendChild(createAlignedRow({\n      title: 'Edge Weight',\n      hint: 'Optional edge weight attribute',\n      controls: strengthWeightSelect,\n    }).row);\n    strength.appendChild(createAlignedRow({\n      title: 'Status',\n      hint: 'Latest run status',\n      controls: strengthStatusEl,\n    }).row);\n\n    const strengthStats = document.createElement('div');\n    strengthStats.className = 'helios-ui-stats';\n    const strengthMaxValue = makeValue('—');\n    strengthMaxValue.dataset.testid = 'metrics-strength-max';\n    const strengthMeanValue = makeValue('—');\n    strengthMeanValue.dataset.testid = 'metrics-strength-mean';\n    const strengthElapsedValue = makeValue('—');\n    strengthElapsedValue.dataset.testid = 'metrics-strength-elapsed';\n    strengthStats.appendChild(createStat('Max', strengthMaxValue).stat);\n    strengthStats.appendChild(createStat('Mean', strengthMeanValue).stat);\n    strengthStats.appendChild(createStat('Elapsed', strengthElapsedValue).stat);\n    strengthStats.style.marginTop = '2px';\n    strengthStats.style.marginBottom = '8px';\n    strength.appendChild(strengthStats);\n\n    const strengthAdvanced = document.createElement('div');\n    strengthAdvanced.appendChild(createAlignedRow({\n      title: 'Output Attr',\n      hint: 'Writes Float node strength values',\n      controls: strengthOutAttrInput,\n    }).row);\n    const strengthInnerStack = new PanelStack();\n    strengthInnerStack.add({ id: 'metrics-strength-advanced', title: 'Advanced', collapsed: true, statusDot: false, content: strengthAdvanced });\n    strengthInnerStack.element.style.marginTop = '6px';\n\n    // --- Local Clustering ----------------------------------------------------\n    const clustering = document.createElement('div');\n\n    const clusteringDirectionSelect = createDirectionSelect('metrics-clustering-direction', options?.clustering?.direction ?? 'both');\n    const clusteringVariantSelect = document.createElement('select');\n    clusteringVariantSelect.className = 'helios-ui-select';\n    clusteringVariantSelect.dataset.testid = 'metrics-clustering-variant';\n    for (const entry of [\n      { value: 'unweighted', label: 'Unweighted' },\n      { value: 'onnela', label: 'Onnela (Weighted)' },\n      { value: 'newman', label: 'Newman (Weighted)' },\n    ]) {\n      const opt = document.createElement('option');\n      opt.value = entry.value;\n      opt.textContent = entry.label;\n      clusteringVariantSelect.appendChild(opt);\n    }\n    clusteringVariantSelect.value = normalizeClusteringVariant(options?.clustering?.variant ?? 'unweighted');\n\n    const clusteringWeightSelect = createEdgeWeightSelect('metrics-clustering-weight', options?.clustering?.edgeWeightAttribute ?? '');\n    const clusteringOutAttrInput = document.createElement('input');\n    clusteringOutAttrInput.type = 'text';\n    clusteringOutAttrInput.className = 'helios-ui-text';\n    clusteringOutAttrInput.placeholder = 'clustering';\n    clusteringOutAttrInput.value = String(options?.clustering?.outNodeAttribute ?? 'clustering');\n    clusteringOutAttrInput.dataset.testid = 'metrics-clustering-outAttr';\n\n    const clusteringCalcButton = document.createElement('button');\n    clusteringCalcButton.type = 'button';\n    clusteringCalcButton.className = 'helios-ui-button';\n    clusteringCalcButton.textContent = 'Calculate';\n    clusteringCalcButton.title = 'Calculate local clustering';\n    clusteringCalcButton.dataset.testid = 'metrics-clustering-calc';\n\n    const clusteringStatusEl = document.createElement('div');\n    clusteringStatusEl.dataset.testid = 'metrics-clustering-status';\n    clusteringStatusEl.textContent = '';\n    styleStatusHint(clusteringStatusEl);\n\n    clustering.appendChild(createAlignedRow({\n      title: 'Variant',\n      hint: 'Unweighted, Onnela, or Newman formulation',\n      controls: clusteringVariantSelect,\n    }).row);\n    clustering.appendChild(createAlignedRow({\n      title: 'Direction',\n      hint: 'For directed networks: In, Out, or Both',\n      controls: clusteringDirectionSelect,\n    }).row);\n    clustering.appendChild(createAlignedRow({\n      title: 'Edge Weight',\n      hint: 'Required for weighted variants',\n      controls: clusteringWeightSelect,\n    }).row);\n    clustering.appendChild(createAlignedRow({\n      title: 'Status',\n      hint: 'Latest run status',\n      controls: clusteringStatusEl,\n    }).row);\n\n    const clusteringStats = document.createElement('div');\n    clusteringStats.className = 'helios-ui-stats';\n    const clusteringMaxValue = makeValue('—');\n    clusteringMaxValue.dataset.testid = 'metrics-clustering-max';\n    const clusteringMeanValue = makeValue('—');\n    clusteringMeanValue.dataset.testid = 'metrics-clustering-mean';\n    const clusteringElapsedValue = makeValue('—');\n    clusteringElapsedValue.dataset.testid = 'metrics-clustering-elapsed';\n    clusteringStats.appendChild(createStat('Max', clusteringMaxValue).stat);\n    clusteringStats.appendChild(createStat('Mean', clusteringMeanValue).stat);\n    clusteringStats.appendChild(createStat('Elapsed', clusteringElapsedValue).stat);\n    clusteringStats.style.marginTop = '2px';\n    clusteringStats.style.marginBottom = '8px';\n    clustering.appendChild(clusteringStats);\n\n    const clusteringAdvanced = document.createElement('div');\n    clusteringAdvanced.appendChild(createAlignedRow({\n      title: 'Output Attr',\n      hint: 'Writes Float local clustering coefficients',\n      controls: clusteringOutAttrInput,\n    }).row);\n    const clusteringInnerStack = new PanelStack();\n    clusteringInnerStack.add({ id: 'metrics-clustering-advanced', title: 'Advanced', collapsed: true, statusDot: false, content: clusteringAdvanced });\n    clusteringInnerStack.element.style.marginTop = '6px';\n\n    // --- Eigenvector Centrality ---------------------------------------------\n    const eigenvector = document.createElement('div');\n\n    const eigenvectorDirectionSelect = createDirectionSelect('metrics-eigen-direction', options?.eigenvector?.direction ?? 'both');\n    const eigenvectorWeightSelect = createEdgeWeightSelect('metrics-eigen-weight', options?.eigenvector?.edgeWeightAttribute ?? '');\n\n    const eigenvectorMaxIterationsInput = document.createElement('input');\n    eigenvectorMaxIterationsInput.type = 'number';\n    eigenvectorMaxIterationsInput.className = 'helios-ui-number';\n    eigenvectorMaxIterationsInput.value = String(options?.eigenvector?.maxIterations ?? 256);\n    eigenvectorMaxIterationsInput.dataset.testid = 'metrics-eigen-maxIterations';\n\n    const eigenvectorToleranceInput = document.createElement('input');\n    eigenvectorToleranceInput.type = 'number';\n    eigenvectorToleranceInput.className = 'helios-ui-number';\n    eigenvectorToleranceInput.value = String(options?.eigenvector?.tolerance ?? 1e-6);\n    eigenvectorToleranceInput.dataset.testid = 'metrics-eigen-tolerance';\n\n    const eigenvectorOutAttrInput = document.createElement('input');\n    eigenvectorOutAttrInput.type = 'text';\n    eigenvectorOutAttrInput.className = 'helios-ui-text';\n    eigenvectorOutAttrInput.placeholder = 'eigenvector_centrality';\n    eigenvectorOutAttrInput.value = String(options?.eigenvector?.outNodeAttribute ?? 'eigenvector_centrality');\n    eigenvectorOutAttrInput.dataset.testid = 'metrics-eigen-outAttr';\n\n    const eigenvectorCalcButton = document.createElement('button');\n    eigenvectorCalcButton.type = 'button';\n    eigenvectorCalcButton.className = 'helios-ui-button';\n    eigenvectorCalcButton.textContent = 'Calculate';\n    eigenvectorCalcButton.title = 'Calculate eigenvector centrality';\n    eigenvectorCalcButton.dataset.calcTitle = 'Calculate eigenvector centrality';\n    eigenvectorCalcButton.dataset.testid = 'metrics-eigen-calc';\n\n    const eigenvectorStatusEl = document.createElement('div');\n    eigenvectorStatusEl.dataset.testid = 'metrics-eigen-status';\n    eigenvectorStatusEl.textContent = '';\n    styleStatusHint(eigenvectorStatusEl);\n\n    eigenvector.appendChild(createAlignedRow({\n      title: 'Direction',\n      hint: 'For directed networks: In, Out, or Both',\n      controls: eigenvectorDirectionSelect,\n    }).row);\n    eigenvector.appendChild(createAlignedRow({\n      title: 'Edge Weight',\n      hint: 'Optional edge weight attribute',\n      controls: eigenvectorWeightSelect,\n    }).row);\n    const eigenvectorMaxIterationsRow = createLinearSliderRow({\n      title: 'Max Iterations',\n      hint: 'Maximum power-iteration steps',\n      valueInput: eigenvectorMaxIterationsInput,\n      range: { min: 1, max: 2048 },\n      step: 1,\n    });\n    eigenvector.appendChild(eigenvectorMaxIterationsRow.row);\n    const eigenvectorToleranceRow = createLogSliderRow({\n      title: 'Tolerance',\n      hint: 'Convergence threshold • log scale',\n      valueInput: eigenvectorToleranceInput,\n      minExp: -12,\n      maxExp: -1,\n      stepExp: 0.05,\n    });\n    eigenvector.appendChild(eigenvectorToleranceRow.row);\n    eigenvector.appendChild(createAlignedRow({\n      title: 'Status',\n      hint: 'Latest run status',\n      controls: eigenvectorStatusEl,\n    }).row);\n\n    const eigenvectorProgressWrap = document.createElement('div');\n    eigenvectorProgressWrap.style.display = 'grid';\n    eigenvectorProgressWrap.style.gridTemplateColumns = 'minmax(0, 1fr) auto';\n    eigenvectorProgressWrap.style.columnGap = '8px';\n    eigenvectorProgressWrap.style.rowGap = '2px';\n    eigenvectorProgressWrap.style.alignItems = 'center';\n    eigenvectorProgressWrap.style.width = '100%';\n\n    const eigenvectorProgressEl = document.createElement('progress');\n    eigenvectorProgressEl.className = 'helios-ui-progress';\n    eigenvectorProgressEl.max = 1;\n    eigenvectorProgressEl.value = 0;\n    eigenvectorProgressEl.dataset.testid = 'metrics-eigen-progress';\n\n    const eigenvectorProgressPct = makeValue('0%');\n    eigenvectorProgressPct.dataset.testid = 'metrics-eigen-progressPct';\n    eigenvectorProgressWrap.appendChild(eigenvectorProgressEl);\n    eigenvectorProgressWrap.appendChild(eigenvectorProgressPct);\n\n    const { row: eigenvectorProgressRow } = createAlignedRow({\n      title: 'Progress',\n      hint: 'Chunked power-iteration progress',\n      controls: eigenvectorProgressWrap,\n    });\n    eigenvector.appendChild(eigenvectorProgressRow);\n\n    const eigenvectorStats = document.createElement('div');\n    eigenvectorStats.className = 'helios-ui-stats';\n    const eigenvectorMaxValue = makeValue('—');\n    eigenvectorMaxValue.dataset.testid = 'metrics-eigen-max';\n    const eigenvectorEigenvalueValue = makeValue('—');\n    eigenvectorEigenvalueValue.dataset.testid = 'metrics-eigen-eigenvalue';\n    const eigenvectorElapsedValue = makeValue('—');\n    eigenvectorElapsedValue.dataset.testid = 'metrics-eigen-elapsed';\n    eigenvectorStats.appendChild(createStat('Max', eigenvectorMaxValue).stat);\n    eigenvectorStats.appendChild(createStat('Eigenvalue', eigenvectorEigenvalueValue).stat);\n    eigenvectorStats.appendChild(createStat('Elapsed', eigenvectorElapsedValue).stat);\n    eigenvectorStats.style.marginTop = '2px';\n    eigenvectorStats.style.marginBottom = '8px';\n    eigenvector.appendChild(eigenvectorStats);\n\n    const eigenvectorAdvanced = document.createElement('div');\n    eigenvectorAdvanced.appendChild(createAlignedRow({\n      title: 'Output Attr',\n      hint: 'Writes Float eigenvector-centrality values',\n      controls: eigenvectorOutAttrInput,\n    }).row);\n\n    const eigenvectorChunkIterationsInput = document.createElement('input');\n    eigenvectorChunkIterationsInput.type = 'number';\n    eigenvectorChunkIterationsInput.className = 'helios-ui-number';\n    eigenvectorChunkIterationsInput.value = String(options?.eigenvector?.chunkIterations ?? 16);\n    eigenvectorChunkIterationsInput.dataset.testid = 'metrics-eigen-chunkIterations';\n    const eigenvectorChunkIterationsRow = createLinearSliderRow({\n      title: 'Chunk Iterations',\n      hint: 'Iterations per chunk before yielding',\n      valueInput: eigenvectorChunkIterationsInput,\n      range: { min: 1, max: 256 },\n      step: 1,\n    });\n    eigenvectorAdvanced.appendChild(eigenvectorChunkIterationsRow.row);\n\n    const eigenvectorYieldMsInput = document.createElement('input');\n    eigenvectorYieldMsInput.type = 'number';\n    eigenvectorYieldMsInput.className = 'helios-ui-number';\n    eigenvectorYieldMsInput.value = String(options?.eigenvector?.yieldMs ?? 0);\n    eigenvectorYieldMsInput.dataset.testid = 'metrics-eigen-yieldMs';\n    const eigenvectorYieldRow = createLinearSliderRow({\n      title: 'Yield (ms)',\n      hint: 'Delay between chunks to keep UI responsive',\n      valueInput: eigenvectorYieldMsInput,\n      range: { min: 0, max: 100 },\n      step: 1,\n    });\n    eigenvectorAdvanced.appendChild(eigenvectorYieldRow.row);\n    const eigenvectorInnerStack = new PanelStack();\n    eigenvectorInnerStack.add({ id: 'metrics-eigen-advanced', title: 'Advanced', collapsed: true, statusDot: false, content: eigenvectorAdvanced });\n    eigenvectorInnerStack.element.style.marginTop = '6px';\n\n    // --- Betweenness Centrality ---------------------------------------------\n    const betweenness = document.createElement('div');\n\n    const betweennessWeightSelect = createEdgeWeightSelect('metrics-betweenness-weight', options?.betweenness?.edgeWeightAttribute ?? '');\n    const betweennessNormalizeCheckbox = createToggleControl({\n      checked: options?.betweenness?.normalize !== false,\n      onLabel: 'On',\n      offLabel: 'Off',\n      ariaLabel: 'Normalize betweenness values',\n    });\n    betweennessNormalizeCheckbox.dataset.testid = 'metrics-betweenness-normalize';\n\n    const betweennessOutAttrInput = document.createElement('input');\n    betweennessOutAttrInput.type = 'text';\n    betweennessOutAttrInput.className = 'helios-ui-text';\n    betweennessOutAttrInput.placeholder = 'betweenness_centrality';\n    betweennessOutAttrInput.value = String(options?.betweenness?.outNodeAttribute ?? 'betweenness_centrality');\n    betweennessOutAttrInput.dataset.testid = 'metrics-betweenness-outAttr';\n\n    const betweennessCalcButton = document.createElement('button');\n    betweennessCalcButton.type = 'button';\n    betweennessCalcButton.className = 'helios-ui-button';\n    betweennessCalcButton.textContent = 'Calculate';\n    betweennessCalcButton.title = 'Calculate betweenness centrality';\n    betweennessCalcButton.dataset.calcTitle = 'Calculate betweenness centrality';\n    betweennessCalcButton.dataset.testid = 'metrics-betweenness-calc';\n\n    const betweennessStatusEl = document.createElement('div');\n    betweennessStatusEl.dataset.testid = 'metrics-betweenness-status';\n    betweennessStatusEl.textContent = '';\n    styleStatusHint(betweennessStatusEl);\n\n    betweenness.appendChild(createAlignedRow({\n      title: 'Edge Weight',\n      hint: 'Optional edge weight attribute',\n      controls: betweennessWeightSelect,\n    }).row);\n    betweenness.appendChild(createAlignedRow({\n      title: 'Normalize',\n      hint: 'Normalize values by graph size',\n      controls: betweennessNormalizeCheckbox,\n    }).row);\n    betweenness.appendChild(createAlignedRow({\n      title: 'Status',\n      hint: 'Latest run status',\n      controls: betweennessStatusEl,\n    }).row);\n\n    const betweennessProgressWrap = document.createElement('div');\n    betweennessProgressWrap.style.display = 'grid';\n    betweennessProgressWrap.style.gridTemplateColumns = 'minmax(0, 1fr) auto';\n    betweennessProgressWrap.style.columnGap = '8px';\n    betweennessProgressWrap.style.rowGap = '2px';\n    betweennessProgressWrap.style.alignItems = 'center';\n    betweennessProgressWrap.style.width = '100%';\n\n    const betweennessProgressEl = document.createElement('progress');\n    betweennessProgressEl.className = 'helios-ui-progress';\n    betweennessProgressEl.max = 1;\n    betweennessProgressEl.value = 0;\n    betweennessProgressEl.dataset.testid = 'metrics-betweenness-progress';\n\n    const betweennessProgressPct = makeValue('0%');\n    betweennessProgressPct.dataset.testid = 'metrics-betweenness-progressPct';\n    betweennessProgressWrap.appendChild(betweennessProgressEl);\n    betweennessProgressWrap.appendChild(betweennessProgressPct);\n\n    const { row: betweennessProgressRow } = createAlignedRow({\n      title: 'Progress',\n      hint: 'Chunked source-node progress',\n      controls: betweennessProgressWrap,\n    });\n    betweenness.appendChild(betweennessProgressRow);\n\n    const betweennessStats = document.createElement('div');\n    betweennessStats.className = 'helios-ui-stats';\n    const betweennessMaxValue = makeValue('—');\n    betweennessMaxValue.dataset.testid = 'metrics-betweenness-max';\n    const betweennessSourceCountValue = makeValue('—');\n    betweennessSourceCountValue.dataset.testid = 'metrics-betweenness-sourceCount';\n    const betweennessElapsedValue = makeValue('—');\n    betweennessElapsedValue.dataset.testid = 'metrics-betweenness-elapsed';\n    betweennessStats.appendChild(createStat('Max', betweennessMaxValue).stat);\n    betweennessStats.appendChild(createStat('Sources', betweennessSourceCountValue).stat);\n    betweennessStats.appendChild(createStat('Elapsed', betweennessElapsedValue).stat);\n    betweennessStats.style.marginTop = '2px';\n    betweennessStats.style.marginBottom = '8px';\n    betweenness.appendChild(betweennessStats);\n\n    const betweennessAdvanced = document.createElement('div');\n    betweennessAdvanced.appendChild(createAlignedRow({\n      title: 'Output Attr',\n      hint: 'Writes Float betweenness-centrality values',\n      controls: betweennessOutAttrInput,\n    }).row);\n\n    const betweennessSourceChunkInput = document.createElement('input');\n    betweennessSourceChunkInput.type = 'number';\n    betweennessSourceChunkInput.className = 'helios-ui-number';\n    betweennessSourceChunkInput.value = String(options?.betweenness?.sourceChunkSize ?? 64);\n    betweennessSourceChunkInput.dataset.testid = 'metrics-betweenness-sourceChunk';\n    const betweennessSourceChunkRow = createLinearSliderRow({\n      title: 'Source Chunk',\n      hint: 'Number of source nodes processed per chunk',\n      valueInput: betweennessSourceChunkInput,\n      range: { min: 1, max: 512 },\n      step: 1,\n    });\n    betweennessAdvanced.appendChild(betweennessSourceChunkRow.row);\n\n    const betweennessYieldMsInput = document.createElement('input');\n    betweennessYieldMsInput.type = 'number';\n    betweennessYieldMsInput.className = 'helios-ui-number';\n    betweennessYieldMsInput.value = String(options?.betweenness?.yieldMs ?? 0);\n    betweennessYieldMsInput.dataset.testid = 'metrics-betweenness-yieldMs';\n    const betweennessYieldRow = createLinearSliderRow({\n      title: 'Yield (ms)',\n      hint: 'Delay between source chunks',\n      valueInput: betweennessYieldMsInput,\n      range: { min: 0, max: 100 },\n      step: 1,\n    });\n    betweennessAdvanced.appendChild(betweennessYieldRow.row);\n    const betweennessInnerStack = new PanelStack();\n    betweennessInnerStack.add({ id: 'metrics-betweenness-advanced', title: 'Advanced', collapsed: true, statusDot: false, content: betweennessAdvanced });\n    betweennessInnerStack.element.style.marginTop = '6px';\n\n    // --- Leiden --------------------------------------------------------------\n    const leiden = document.createElement('div');\n\n    const weightSelect = document.createElement('select');\n    weightSelect.className = 'helios-ui-select';\n    weightSelect.dataset.testid = 'metrics-leiden-weight';\n    weightSelect.dataset.initialValue = String(options?.leiden?.edgeWeightAttribute ?? '');\n    edgeWeightSelects.push(weightSelect);\n\n    const resolutionInput = document.createElement('input');\n    resolutionInput.type = 'number';\n    resolutionInput.className = 'helios-ui-number';\n    resolutionInput.value = String(options?.leiden?.resolution ?? 1);\n    resolutionInput.dataset.testid = 'metrics-leiden-resolution';\n\n    const seedInput = document.createElement('input');\n    seedInput.type = 'number';\n    seedInput.className = 'helios-ui-number';\n    seedInput.value = String(options?.leiden?.seed ?? 1);\n    seedInput.dataset.testid = 'metrics-leiden-seed';\n\n    const maxLevelsInput = document.createElement('input');\n    maxLevelsInput.type = 'number';\n    maxLevelsInput.className = 'helios-ui-number';\n    maxLevelsInput.value = String(options?.leiden?.maxLevels ?? 32);\n    maxLevelsInput.dataset.testid = 'metrics-leiden-maxLevels';\n\n    const maxPassesInput = document.createElement('input');\n    maxPassesInput.type = 'number';\n    maxPassesInput.className = 'helios-ui-number';\n    maxPassesInput.value = String(options?.leiden?.passes ?? options?.leiden?.maxPasses ?? 8);\n    maxPassesInput.dataset.testid = 'metrics-leiden-maxPasses';\n\n    const outAttributeInput = document.createElement('input');\n    outAttributeInput.type = 'text';\n    outAttributeInput.className = 'helios-ui-text';\n    outAttributeInput.placeholder = 'community';\n    outAttributeInput.value = String(options?.leiden?.outNodeCommunityAttribute ?? 'community');\n    outAttributeInput.dataset.testid = 'metrics-leiden-outAttr';\n\n    const calcButton = document.createElement('button');\n    calcButton.type = 'button';\n    calcButton.className = 'helios-ui-button';\n    calcButton.textContent = 'Calculate';\n    calcButton.title = 'Calculate communities (Leiden)';\n    calcButton.dataset.calcTitle = 'Calculate communities (Leiden)';\n    calcButton.dataset.testid = 'metrics-calc';\n\n    const statusEl = document.createElement('div');\n    statusEl.className = 'helios-ui-label__hint';\n    statusEl.dataset.testid = 'metrics-status';\n    statusEl.textContent = '';\n\n    const { row: weightRow } = createAlignedRow({\n      title: 'Edge Weight',\n      hint: 'Optional edge weight attribute',\n      controls: weightSelect,\n    });\n    leiden.appendChild(weightRow);\n\n    const resolutionRow = createLogSliderRow({\n      title: 'Resolution',\n      hint: 'Gamma (higher → more communities) • log scale',\n      valueInput: resolutionInput,\n      minExp: -4,\n      maxExp: 4,\n      stepExp: 0.02,\n    });\n    leiden.appendChild(resolutionRow.row);\n\n    const leidenStats = document.createElement('div');\n    leidenStats.className = 'helios-ui-stats';\n    const modularityValue = makeValue('—');\n    modularityValue.dataset.testid = 'metrics-modularity';\n    const communityValue = makeValue('—');\n    communityValue.dataset.testid = 'metrics-communityCount';\n    const elapsedValue = makeValue('—');\n    elapsedValue.dataset.testid = 'metrics-elapsed';\n\n    leidenStats.appendChild(createStat('Modularity', modularityValue).stat);\n    leidenStats.appendChild(createStat('Communities', communityValue).stat);\n    leidenStats.appendChild(createStat('Elapsed', elapsedValue).stat);\n\n    leidenStats.style.marginTop = '2px';\n\n    const progressWrap = document.createElement('div');\n    progressWrap.style.display = 'grid';\n    progressWrap.style.gridTemplateColumns = 'minmax(0, 1fr) auto';\n    progressWrap.style.columnGap = '8px';\n    progressWrap.style.rowGap = '2px';\n    progressWrap.style.alignItems = 'center';\n    progressWrap.style.width = '100%';\n\n    const progressEl = document.createElement('progress');\n    progressEl.className = 'helios-ui-progress';\n    progressEl.max = 1;\n    progressEl.value = 0;\n    progressEl.dataset.testid = 'metrics-progress';\n\n    const progressPct = makeValue('0%');\n    progressPct.dataset.testid = 'metrics-progressPct';\n    progressWrap.appendChild(progressEl);\n    progressWrap.appendChild(progressPct);\n\n    // Status text lives directly under the progress bar.\n    statusEl.style.gridColumn = '1 / -1';\n    statusEl.style.marginTop = '0px';\n    statusEl.style.fontSize = '10px';\n    statusEl.style.lineHeight = '1.1';\n    statusEl.style.whiteSpace = 'nowrap';\n    statusEl.style.overflow = 'hidden';\n    statusEl.style.textOverflow = 'ellipsis';\n    statusEl.style.maxWidth = '100%';\n    statusEl.style.minWidth = '0';\n    progressWrap.appendChild(statusEl);\n\n    const { row: progressRow } = createAlignedRow({\n      title: 'Progress',\n      hint: 'Worker progress for the current run',\n      controls: progressWrap,\n    });\n    leiden.appendChild(progressRow);\n\n    // Results shown without an extra title row.\n    leiden.appendChild(leidenStats);\n    leidenStats.style.marginBottom = '8px';\n\n    // Advanced options collapsed inside Leiden.\n    const advanced = document.createElement('div');\n\n    const seedRow = createLinearSliderRow({\n      title: 'Seed',\n      hint: 'Deterministic RNG seed',\n      valueInput: seedInput,\n      range: { min: 0, max: 1_000_000 },\n      step: 1,\n    });\n    advanced.appendChild(seedRow.row);\n\n    const levelsRow = createLinearSliderRow({\n      title: 'Max Levels',\n      hint: 'Hierarchy aggregation levels',\n      valueInput: maxLevelsInput,\n      range: { min: 1, max: 128 },\n      step: 1,\n    });\n    advanced.appendChild(levelsRow.row);\n\n    const passesRow = createLinearSliderRow({\n      title: 'Max Passes',\n      hint: 'Local move passes per level',\n      valueInput: maxPassesInput,\n      range: { min: 1, max: 64 },\n      step: 1,\n    });\n    advanced.appendChild(passesRow.row);\n\n    advanced.appendChild(createAlignedRow({\n      title: 'Output Attr',\n      hint: 'Writes UnsignedInteger node communities',\n      controls: outAttributeInput,\n    }).row);\n\n    const yieldMsInput = document.createElement('input');\n    yieldMsInput.type = 'number';\n    yieldMsInput.className = 'helios-ui-number';\n    yieldMsInput.value = String(options?.worker?.yieldMs ?? 0);\n    yieldMsInput.dataset.testid = 'metrics-yieldMs';\n\n    const timeoutMsInput = document.createElement('input');\n    timeoutMsInput.type = 'number';\n    timeoutMsInput.className = 'helios-ui-number';\n    timeoutMsInput.value = String(options?.worker?.timeoutMs ?? 60);\n    timeoutMsInput.dataset.testid = 'metrics-timeoutMs';\n\n    const chunkBudgetInput = document.createElement('input');\n    chunkBudgetInput.type = 'number';\n    chunkBudgetInput.className = 'helios-ui-number';\n    chunkBudgetInput.value = String(options?.worker?.chunkBudget ?? 20000);\n    chunkBudgetInput.dataset.testid = 'metrics-chunkBudget';\n\n    advanced.appendChild(createLinearSliderRow({ title: 'Yield (ms)', hint: 'Delay between worker chunks', valueInput: yieldMsInput, range: { min: 0, max: 100 }, step: 1 }).row);\n    advanced.appendChild(createLinearSliderRow({ title: 'Timeout (ms)', hint: 'Max time per step() (slider shows 0–500ms suggestion)', valueInput: timeoutMsInput, range: { min: 0, max: 500 }, step: 1, inputMin: 0, inputMax: null, clampInput: false }).row);\n    advanced.appendChild(createLinearSliderRow({ title: 'Chunk Budget', hint: 'Work per step() slice', valueInput: chunkBudgetInput, range: { min: 100, max: 100_000 }, step: 100 }).row);\n\n    const leidenInnerStack = new PanelStack();\n    leidenInnerStack.add({ id: 'metrics-leiden-advanced', title: 'Advanced', collapsed: true, statusDot: false, content: advanced });\n    leidenInnerStack.element.style.marginTop = '6px';\n\n    // --- Dimensionality ------------------------------------------------------\n    const dimension = document.createElement('div');\n\n    const dimensionMethodSelect = document.createElement('select');\n    dimensionMethodSelect.className = 'helios-ui-select';\n    dimensionMethodSelect.dataset.testid = 'metrics-dimension-method';\n    const dimensionMethodValue = normalizeDimensionMethod(options?.dimension?.method ?? 'leastsquares');\n    for (const entry of [\n      { value: 'leastsquares', label: 'Least Squares (LS)' },\n      { value: 'central', label: 'Centered Difference (CE)' },\n      { value: 'backward', label: 'Backward Difference (BK)' },\n      { value: 'forward', label: 'Forward Difference (FW)' },\n    ]) {\n      const opt = document.createElement('option');\n      opt.value = entry.value;\n      opt.textContent = entry.label;\n      dimensionMethodSelect.appendChild(opt);\n    }\n    dimensionMethodSelect.value = dimensionMethodValue;\n\n    const dimensionMaxLevelInput = document.createElement('input');\n    dimensionMaxLevelInput.type = 'number';\n    dimensionMaxLevelInput.className = 'helios-ui-number';\n    dimensionMaxLevelInput.value = String(options?.dimension?.maxLevel ?? 12);\n    dimensionMaxLevelInput.dataset.testid = 'metrics-dimension-maxLevel';\n\n    const dimensionOrderInput = document.createElement('input');\n    dimensionOrderInput.type = 'number';\n    dimensionOrderInput.className = 'helios-ui-number';\n    dimensionOrderInput.value = String(options?.dimension?.order ?? 2);\n    dimensionOrderInput.dataset.testid = 'metrics-dimension-order';\n\n    const dimensionOutMaxAttrInput = document.createElement('input');\n    dimensionOutMaxAttrInput.type = 'text';\n    dimensionOutMaxAttrInput.className = 'helios-ui-text';\n    dimensionOutMaxAttrInput.placeholder = 'dimension_max';\n    dimensionOutMaxAttrInput.value = String(options?.dimension?.outNodeMaxDimensionAttribute ?? 'dimension_max');\n    dimensionOutMaxAttrInput.dataset.testid = 'metrics-dimension-outMaxAttr';\n\n    const dimensionOutLevelsAttrInput = document.createElement('input');\n    dimensionOutLevelsAttrInput.type = 'text';\n    dimensionOutLevelsAttrInput.className = 'helios-ui-text';\n    dimensionOutLevelsAttrInput.placeholder = 'dimension_levels';\n    dimensionOutLevelsAttrInput.value = String(options?.dimension?.outNodeDimensionLevelsAttribute ?? '');\n    dimensionOutLevelsAttrInput.dataset.testid = 'metrics-dimension-outLevelsAttr';\n\n    const dimensionSaveLevelsCheckbox = createToggleControl({\n      checked: Boolean(\n        options?.dimension?.saveLevelsDistribution\n        ?? options?.dimension?.saveNodeDimensionLevels\n        ?? options?.dimension?.outNodeDimensionLevelsAttribute\n      ),\n      onLabel: 'On',\n      offLabel: 'Off',\n      ariaLabel: 'Write levels distribution',\n    });\n    dimensionSaveLevelsCheckbox.dataset.testid = 'metrics-dimension-saveLevels';\n\n    const dimensionLevelsEncodingSelect = document.createElement('select');\n    dimensionLevelsEncodingSelect.className = 'helios-ui-select';\n    dimensionLevelsEncodingSelect.dataset.testid = 'metrics-dimension-levelsEncoding';\n    for (const entry of [\n      { value: 'vector', label: 'Vector (Float)' },\n      { value: 'string', label: 'String (JSON)' },\n    ]) {\n      const opt = document.createElement('option');\n      opt.value = entry.value;\n      opt.textContent = entry.label;\n      dimensionLevelsEncodingSelect.appendChild(opt);\n    }\n    const initialLevelsEncoding = String(options?.dimension?.dimensionLevelsEncoding ?? 'vector').trim().toLowerCase();\n    dimensionLevelsEncodingSelect.value = initialLevelsEncoding === 'string' ? 'string' : 'vector';\n\n    const dimensionLevelsPrecisionInput = document.createElement('input');\n    dimensionLevelsPrecisionInput.type = 'number';\n    dimensionLevelsPrecisionInput.className = 'helios-ui-number';\n    dimensionLevelsPrecisionInput.min = '0';\n    dimensionLevelsPrecisionInput.max = '12';\n    dimensionLevelsPrecisionInput.step = '1';\n    dimensionLevelsPrecisionInput.value = String(options?.dimension?.dimensionLevelsStringPrecision ?? 6);\n    dimensionLevelsPrecisionInput.dataset.testid = 'metrics-dimension-levelsPrecision';\n\n    const dimensionCalcButton = document.createElement('button');\n    dimensionCalcButton.type = 'button';\n    dimensionCalcButton.className = 'helios-ui-button';\n    dimensionCalcButton.textContent = 'Calculate';\n    dimensionCalcButton.title = 'Calculate dimensionality';\n    dimensionCalcButton.dataset.calcTitle = 'Calculate dimensionality';\n    dimensionCalcButton.dataset.testid = 'metrics-dimension-calc';\n\n    const dimensionStatusEl = document.createElement('div');\n    dimensionStatusEl.className = 'helios-ui-label__hint';\n    dimensionStatusEl.dataset.testid = 'metrics-dimension-status';\n    dimensionStatusEl.textContent = '';\n\n    const { row: dimensionMethodRow } = createAlignedRow({\n      title: 'Method',\n      hint: 'Dimension estimator: LS, CE, BK, or FW',\n      controls: dimensionMethodSelect,\n    });\n    dimension.appendChild(dimensionMethodRow);\n\n    const dimensionMaxLevelRow = createLinearSliderRow({\n      title: 'Max Level',\n      hint: 'Largest concentric geodesic level r',\n      valueInput: dimensionMaxLevelInput,\n      range: { min: 1, max: 128 },\n      step: 1,\n    });\n    dimension.appendChild(dimensionMaxLevelRow.row);\n\n    const dimensionOrderRow = createLinearSliderRow({\n      title: 'Order',\n      hint: 'Estimator order (LS window order or finite-difference order)',\n      valueInput: dimensionOrderInput,\n      range: { min: 1, max: 32 },\n      step: 1,\n    });\n    dimension.appendChild(dimensionOrderRow.row);\n\n    const dimensionStats = document.createElement('div');\n    dimensionStats.className = 'helios-ui-stats';\n    const dimensionGlobalMaxValue = makeValue('—');\n    dimensionGlobalMaxValue.dataset.testid = 'metrics-dimension-globalMax';\n    const dimensionSelectedCountValue = makeValue('—');\n    dimensionSelectedCountValue.dataset.testid = 'metrics-dimension-selectedCount';\n    const dimensionElapsedValue = makeValue('—');\n    dimensionElapsedValue.dataset.testid = 'metrics-dimension-elapsed';\n\n    dimensionStats.appendChild(createStat('Global Dmax', dimensionGlobalMaxValue).stat);\n    dimensionStats.appendChild(createStat('Nodes', dimensionSelectedCountValue).stat);\n    dimensionStats.appendChild(createStat('Elapsed', dimensionElapsedValue).stat);\n    dimensionStats.style.marginTop = '2px';\n\n    const dimensionProgressWrap = document.createElement('div');\n    dimensionProgressWrap.style.display = 'grid';\n    dimensionProgressWrap.style.gridTemplateColumns = 'minmax(0, 1fr) auto';\n    dimensionProgressWrap.style.columnGap = '8px';\n    dimensionProgressWrap.style.rowGap = '2px';\n    dimensionProgressWrap.style.alignItems = 'center';\n    dimensionProgressWrap.style.width = '100%';\n\n    const dimensionProgressEl = document.createElement('progress');\n    dimensionProgressEl.className = 'helios-ui-progress';\n    dimensionProgressEl.max = 1;\n    dimensionProgressEl.value = 0;\n    dimensionProgressEl.dataset.testid = 'metrics-dimension-progress';\n\n    const dimensionProgressPct = makeValue('0%');\n    dimensionProgressPct.dataset.testid = 'metrics-dimension-progressPct';\n    dimensionProgressWrap.appendChild(dimensionProgressEl);\n    dimensionProgressWrap.appendChild(dimensionProgressPct);\n\n    dimensionStatusEl.style.gridColumn = '1 / -1';\n    dimensionStatusEl.style.marginTop = '0px';\n    dimensionStatusEl.style.fontSize = '10px';\n    dimensionStatusEl.style.lineHeight = '1.1';\n    dimensionStatusEl.style.whiteSpace = 'nowrap';\n    dimensionStatusEl.style.overflow = 'hidden';\n    dimensionStatusEl.style.textOverflow = 'ellipsis';\n    dimensionStatusEl.style.maxWidth = '100%';\n    dimensionStatusEl.style.minWidth = '0';\n    dimensionProgressWrap.appendChild(dimensionStatusEl);\n\n    const { row: dimensionProgressRow } = createAlignedRow({\n      title: 'Progress',\n      hint: 'Incremental progress while measuring selected nodes',\n      controls: dimensionProgressWrap,\n    });\n    dimension.appendChild(dimensionProgressRow);\n\n    dimension.appendChild(dimensionStats);\n    dimensionStats.style.marginBottom = '8px';\n\n    const dimensionAdvanced = document.createElement('div');\n    dimensionAdvanced.appendChild(createAlignedRow({\n      title: 'Output Dmax',\n      hint: 'Writes maximum local dimension per node (Float, dim 1)',\n      controls: dimensionOutMaxAttrInput,\n    }).row);\n    dimensionAdvanced.appendChild(createAlignedRow({\n      title: 'Save Levels',\n      hint: 'Enable writing the local dimension distribution across concentric levels',\n      controls: dimensionSaveLevelsCheckbox,\n    }).row);\n    dimensionAdvanced.appendChild(createAlignedRow({\n      title: 'Output Levels',\n      hint: 'Optional full per-level local dimension profile per node',\n      controls: dimensionOutLevelsAttrInput,\n    }).row);\n    dimensionAdvanced.appendChild(createAlignedRow({\n      title: 'Levels Encoding',\n      hint: 'Vector writes Float dimension=maxLevel+1; String writes JSON array string',\n      controls: dimensionLevelsEncodingSelect,\n    }).row);\n\n    const dimensionPrecisionRow = createLinearSliderRow({\n      title: 'String Precision',\n      hint: 'Applied only when Levels Encoding is String',\n      valueInput: dimensionLevelsPrecisionInput,\n      range: { min: 0, max: 12 },\n      step: 1,\n    });\n    dimensionAdvanced.appendChild(dimensionPrecisionRow.row);\n\n    const dimensionYieldMsInput = document.createElement('input');\n    dimensionYieldMsInput.type = 'number';\n    dimensionYieldMsInput.className = 'helios-ui-number';\n    dimensionYieldMsInput.value = String(options?.dimension?.worker?.yieldMs ?? options?.worker?.yieldMs ?? 0);\n    dimensionYieldMsInput.dataset.testid = 'metrics-dimension-yieldMs';\n\n    const dimensionTimeoutMsInput = document.createElement('input');\n    dimensionTimeoutMsInput.type = 'number';\n    dimensionTimeoutMsInput.className = 'helios-ui-number';\n    dimensionTimeoutMsInput.value = String(options?.dimension?.worker?.timeoutMs ?? options?.worker?.timeoutMs ?? 60);\n    dimensionTimeoutMsInput.dataset.testid = 'metrics-dimension-timeoutMs';\n\n    const dimensionChunkBudgetInput = document.createElement('input');\n    dimensionChunkBudgetInput.type = 'number';\n    dimensionChunkBudgetInput.className = 'helios-ui-number';\n    dimensionChunkBudgetInput.value = String(options?.dimension?.worker?.chunkBudget ?? options?.worker?.chunkBudget ?? 200);\n    dimensionChunkBudgetInput.dataset.testid = 'metrics-dimension-chunkBudget';\n\n    dimensionAdvanced.appendChild(createLinearSliderRow({ title: 'Yield (ms)', hint: 'Delay between step() calls', valueInput: dimensionYieldMsInput, range: { min: 0, max: 100 }, step: 1 }).row);\n    dimensionAdvanced.appendChild(createLinearSliderRow({ title: 'Timeout (ms)', hint: 'Max time per step() (slider shows 0–500ms suggestion)', valueInput: dimensionTimeoutMsInput, range: { min: 0, max: 500 }, step: 1, inputMin: 0, inputMax: null, clampInput: false }).row);\n    dimensionAdvanced.appendChild(createLinearSliderRow({ title: 'Chunk Budget', hint: 'Nodes processed per step() chunk', valueInput: dimensionChunkBudgetInput, range: { min: 1, max: 10_000 }, step: 1 }).row);\n\n    const dimensionInnerStack = new PanelStack();\n    dimensionInnerStack.add({ id: 'metrics-dimension-advanced', title: 'Advanced', collapsed: true, statusDot: false, content: dimensionAdvanced });\n    dimensionInnerStack.element.style.marginTop = '6px';\n\n    // --- State + wiring ------------------------------------------------------\n    let leidenRunning = false;\n    let leidenAbortController = null;\n    let dimensionRunning = false;\n    let dimensionAbortController = null;\n    let degreeRunning = false;\n    let strengthRunning = false;\n    let clusteringRunning = false;\n    let eigenvectorRunning = false;\n    let betweennessRunning = false;\n    let eigenvectorAbortController = null;\n    let betweennessAbortController = null;\n    let metricsStack = null;\n\n    const setMetricSectionState = (sectionId, state) => {\n      metricsStack?.setStatus?.(sectionId, state);\n    };\n    const resetMetricSectionStates = () => {\n      for (const id of [\n        'metrics-degree',\n        'metrics-strength',\n        'metrics-clustering',\n        'metrics-eigen',\n        'metrics-betweenness',\n        'metrics-leiden',\n        'metrics-dimension',\n      ]) {\n        setMetricSectionState(id, 'idle');\n      }\n    };\n\n    const setDegreeStatus = (text) => {\n      const value = text ?? '';\n      degreeStatusEl.textContent = value;\n      degreeStatusEl.title = value;\n    };\n\n    const setDegreeRunning = (nextRunning) => {\n      degreeRunning = Boolean(nextRunning);\n      setDisabled(degreeCalcButton, degreeRunning);\n      setDisabled(degreeDirectionSelect, degreeRunning);\n      setDisabled(degreeOutAttrInput, degreeRunning);\n    };\n\n    const setStrengthStatus = (text) => {\n      const value = text ?? '';\n      strengthStatusEl.textContent = value;\n      strengthStatusEl.title = value;\n    };\n\n    const setStrengthRunning = (nextRunning) => {\n      strengthRunning = Boolean(nextRunning);\n      setDisabled(strengthCalcButton, strengthRunning);\n      setDisabled(strengthDirectionSelect, strengthRunning);\n      setDisabled(strengthMeasureSelect, strengthRunning);\n      setDisabled(strengthWeightSelect, strengthRunning);\n      setDisabled(strengthOutAttrInput, strengthRunning);\n    };\n\n    const setClusteringStatus = (text) => {\n      const value = text ?? '';\n      clusteringStatusEl.textContent = value;\n      clusteringStatusEl.title = value;\n    };\n\n    const setClusteringRunning = (nextRunning) => {\n      clusteringRunning = Boolean(nextRunning);\n      setDisabled(clusteringCalcButton, clusteringRunning);\n      setDisabled(clusteringVariantSelect, clusteringRunning);\n      setDisabled(clusteringDirectionSelect, clusteringRunning);\n      setDisabled(clusteringWeightSelect, clusteringRunning || clusteringVariantSelect.value === 'unweighted');\n      setDisabled(clusteringOutAttrInput, clusteringRunning);\n    };\n\n    const setEigenvectorStatus = (text) => {\n      const value = text ?? '';\n      eigenvectorStatusEl.textContent = value;\n      eigenvectorStatusEl.title = value;\n    };\n\n    const setEigenvectorProgress = (current, total) => {\n      if (!Number.isFinite(total) || total <= 0 || !Number.isFinite(current) || current < 0) {\n        eigenvectorProgressEl.removeAttribute('value');\n        eigenvectorProgressPct.textContent = '—';\n        return;\n      }\n      const pct = Math.max(0, Math.min(1, current / total));\n      eigenvectorProgressEl.value = pct;\n      eigenvectorProgressPct.textContent = `${Math.round(pct * 100)}%`;\n    };\n\n    const setEigenvectorRunning = (nextRunning) => {\n      eigenvectorRunning = Boolean(nextRunning);\n      setProgressActionButtonState(eigenvectorCalcButton, eigenvectorRunning);\n      setDisabled(eigenvectorDirectionSelect, eigenvectorRunning);\n      setDisabled(eigenvectorWeightSelect, eigenvectorRunning);\n      setDisabled(eigenvectorMaxIterationsInput, eigenvectorRunning);\n      setDisabled(eigenvectorMaxIterationsRow.slider, eigenvectorRunning);\n      setDisabled(eigenvectorToleranceInput, eigenvectorRunning);\n      setDisabled(eigenvectorToleranceRow.slider, eigenvectorRunning);\n      setDisabled(eigenvectorOutAttrInput, eigenvectorRunning);\n      setDisabled(eigenvectorChunkIterationsInput, eigenvectorRunning);\n      setDisabled(eigenvectorChunkIterationsRow.slider, eigenvectorRunning);\n      setDisabled(eigenvectorYieldMsInput, eigenvectorRunning);\n      setDisabled(eigenvectorYieldRow.slider, eigenvectorRunning);\n    };\n\n    const setBetweennessStatus = (text) => {\n      const value = text ?? '';\n      betweennessStatusEl.textContent = value;\n      betweennessStatusEl.title = value;\n    };\n\n    const setBetweennessProgress = (current, total) => {\n      if (!Number.isFinite(total) || total <= 0 || !Number.isFinite(current) || current < 0) {\n        betweennessProgressEl.removeAttribute('value');\n        betweennessProgressPct.textContent = '—';\n        return;\n      }\n      const pct = Math.max(0, Math.min(1, current / total));\n      betweennessProgressEl.value = pct;\n      betweennessProgressPct.textContent = `${Math.round(pct * 100)}%`;\n    };\n\n    const setBetweennessRunning = (nextRunning) => {\n      betweennessRunning = Boolean(nextRunning);\n      setProgressActionButtonState(betweennessCalcButton, betweennessRunning);\n      setDisabled(betweennessWeightSelect, betweennessRunning);\n      setDisabled(betweennessNormalizeCheckbox, betweennessRunning);\n      setDisabled(betweennessOutAttrInput, betweennessRunning);\n      setDisabled(betweennessSourceChunkInput, betweennessRunning);\n      setDisabled(betweennessSourceChunkRow.slider, betweennessRunning);\n      setDisabled(betweennessYieldMsInput, betweennessRunning);\n      setDisabled(betweennessYieldRow.slider, betweennessRunning);\n    };\n\n    const setLeidenStatus = (text) => {\n      statusEl.textContent = text ?? '';\n    };\n\n    const setLeidenProgress = (current, total) => {\n      if (!Number.isFinite(total) || total <= 0 || !Number.isFinite(current) || current < 0) {\n        progressEl.removeAttribute('value');\n        progressPct.textContent = '—';\n        return;\n      }\n      const pct = Math.max(0, Math.min(1, current / total));\n      progressEl.value = pct;\n      progressPct.textContent = `${Math.round(pct * 100)}%`;\n    };\n\n    const setLeidenRunning = (nextRunning) => {\n      leidenRunning = Boolean(nextRunning);\n      setProgressActionButtonState(calcButton, leidenRunning);\n      setDisabled(weightSelect, leidenRunning);\n      setDisabled(resolutionInput, leidenRunning);\n      setDisabled(resolutionRow.slider, leidenRunning);\n      setDisabled(seedInput, leidenRunning);\n      setDisabled(seedRow.slider, leidenRunning);\n      setDisabled(maxLevelsInput, leidenRunning);\n      setDisabled(levelsRow.slider, leidenRunning);\n      setDisabled(maxPassesInput, leidenRunning);\n      setDisabled(passesRow.slider, leidenRunning);\n      setDisabled(outAttributeInput, leidenRunning);\n      setDisabled(yieldMsInput, leidenRunning);\n      setDisabled(timeoutMsInput, leidenRunning);\n      setDisabled(chunkBudgetInput, leidenRunning);\n    };\n\n    const setDimensionStatus = (text) => {\n      dimensionStatusEl.textContent = text ?? '';\n    };\n\n    const setDimensionProgress = (current, total) => {\n      if (!Number.isFinite(total) || total <= 0 || !Number.isFinite(current) || current < 0) {\n        dimensionProgressEl.removeAttribute('value');\n        dimensionProgressPct.textContent = '—';\n        return;\n      }\n      const pct = Math.max(0, Math.min(1, current / total));\n      dimensionProgressEl.value = pct;\n      dimensionProgressPct.textContent = `${Math.round(pct * 100)}%`;\n    };\n\n    const setDimensionRunning = (nextRunning) => {\n      dimensionRunning = Boolean(nextRunning);\n      setProgressActionButtonState(dimensionCalcButton, dimensionRunning);\n      setDisabled(dimensionMethodSelect, dimensionRunning);\n      setDisabled(dimensionMaxLevelInput, dimensionRunning);\n      setDisabled(dimensionMaxLevelRow.slider, dimensionRunning);\n      setDisabled(dimensionOrderInput, dimensionRunning);\n      setDisabled(dimensionOrderRow.slider, dimensionRunning);\n      setDisabled(dimensionOutMaxAttrInput, dimensionRunning);\n      setDisabled(dimensionSaveLevelsCheckbox, dimensionRunning);\n      setDisabled(dimensionOutLevelsAttrInput, dimensionRunning || !dimensionSaveLevelsCheckbox.checked);\n      setDisabled(dimensionLevelsEncodingSelect, dimensionRunning || !dimensionSaveLevelsCheckbox.checked);\n      setDisabled(dimensionLevelsPrecisionInput, dimensionRunning || !dimensionSaveLevelsCheckbox.checked || dimensionLevelsEncodingSelect.value !== 'string');\n      setDisabled(dimensionPrecisionRow.slider, dimensionRunning || !dimensionSaveLevelsCheckbox.checked || dimensionLevelsEncodingSelect.value !== 'string');\n      setDisabled(dimensionYieldMsInput, dimensionRunning);\n      setDisabled(dimensionTimeoutMsInput, dimensionRunning);\n      setDisabled(dimensionChunkBudgetInput, dimensionRunning);\n    };\n\n    const refreshDimensionOrderLimits = () => {\n      const method = normalizeDimensionMethod(dimensionMethodSelect.value);\n      const methodMaxOrder = maxOrderForDimensionMethod(method);\n      dimensionOrderInput.max = String(methodMaxOrder);\n      dimensionOrderRow.slider.max = String(methodMaxOrder);\n      const currentOrder = Math.max(1, Number(dimensionOrderInput.value) || 1);\n      if (currentOrder > methodMaxOrder) {\n        dimensionOrderRow.write(methodMaxOrder);\n      } else {\n        dimensionOrderRow.write(currentOrder);\n      }\n    };\n\n    const refreshDimensionLevelEncodingControls = () => {\n      const saveLevels = Boolean(dimensionSaveLevelsCheckbox.checked);\n      const allowPrecision = saveLevels && dimensionLevelsEncodingSelect.value === 'string';\n      setDisabled(dimensionOutLevelsAttrInput, dimensionRunning || !saveLevels);\n      setDisabled(dimensionLevelsEncodingSelect, dimensionRunning || !saveLevels);\n      setDisabled(dimensionLevelsPrecisionInput, dimensionRunning || !allowPrecision);\n      setDisabled(dimensionPrecisionRow.slider, dimensionRunning || !allowPrecision);\n    };\n\n    dimensionMethodSelect.addEventListener('change', refreshDimensionOrderLimits);\n    dimensionOutLevelsAttrInput.addEventListener('input', refreshDimensionLevelEncodingControls);\n    dimensionSaveLevelsCheckbox.addEventListener('change', refreshDimensionLevelEncodingControls);\n    dimensionLevelsEncodingSelect.addEventListener('change', refreshDimensionLevelEncodingControls);\n\n    const refreshClusteringWeightControls = () => {\n      setDisabled(clusteringWeightSelect, clusteringRunning || clusteringVariantSelect.value === 'unweighted');\n    };\n\n    clusteringVariantSelect.addEventListener('change', refreshClusteringWeightControls);\n\n    const edgeWeightInfoWarnings = new Set();\n    const refreshEdgeWeightOptions = () => {\n      const network = net();\n      const names = network && typeof network.getEdgeAttributeNames === 'function'\n        ? (network.getEdgeAttributeNames() ?? []).filter((name) => isPublicAttributeName(name))\n        : [];\n      const numericNames = [];\n      if (network && typeof network.getEdgeAttributeInfo === 'function') {\n        for (const name of names) {\n          try {\n            const info = network.getEdgeAttributeInfo(name);\n            if (info && isNumericEdgeWeightType(info.type)) numericNames.push(name);\n          } catch (error) {\n            if (!edgeWeightInfoWarnings.has(name)) {\n              edgeWeightInfoWarnings.add(name);\n              console.warn(`[HeliosUI] Failed to inspect edge attribute \"${name}\" for clustering weight controls.`, error);\n            }\n          }\n        }\n      }\n      const autoStrengthWeight = numericNames.includes('weight')\n        ? 'weight'\n        : (numericNames[0] ?? '');\n      for (const select of edgeWeightSelects) {\n        const existing = select.value;\n        const preferred = select.dataset.initialValue ?? '';\n        const userSelected = select.dataset.userSelected === 'true';\n        select.textContent = '';\n        const optNone = document.createElement('option');\n        optNone.value = '';\n        optNone.textContent = 'None';\n        select.appendChild(optNone);\n        for (const name of names) {\n          const opt = document.createElement('option');\n          opt.value = name;\n          opt.textContent = name;\n          select.appendChild(opt);\n        }\n        const availableValues = new Set(Array.from(select.options, (o) => o.value));\n        if (userSelected && availableValues.has(existing)) {\n          select.value = existing;\n        } else if (existing && availableValues.has(existing)) {\n          select.value = existing;\n        } else if (preferred && availableValues.has(preferred)) {\n          select.value = preferred;\n        } else if (select === strengthWeightSelect && autoStrengthWeight && !userSelected && availableValues.has(autoStrengthWeight)) {\n          select.value = autoStrengthWeight;\n        } else {\n          select.value = '';\n        }\n      }\n    };\n\n    const refreshAll = () => {\n      refreshEdgeWeightOptions();\n      refreshClusteringWeightControls();\n      refreshDimensionOrderLimits();\n      refreshDimensionLevelEncodingControls();\n    };\n\n    const cancelLeidenRun = () => {\n      if (!leidenAbortController) return;\n      leidenAbortController.abort();\n    };\n\n    const cancelDimensionRun = () => {\n      if (!dimensionAbortController) return;\n      dimensionAbortController.abort();\n    };\n\n    const cancelEigenvectorRun = () => {\n      if (!eigenvectorAbortController) return;\n      eigenvectorAbortController.abort();\n    };\n\n    const cancelBetweennessRun = () => {\n      if (!betweennessAbortController) return;\n      betweennessAbortController.abort();\n    };\n\n    const runDegree = () => {\n      const network = net();\n      if (!network || typeof network.measureDegree !== 'function') {\n        setDegreeStatus('Degree measurement is not available on this network');\n        setMetricSectionState('metrics-degree', 'error');\n        return;\n      }\n      const direction = normalizeNeighborDirection(degreeDirectionSelect.value);\n      const outNodeAttribute = degreeOutAttrInput.value.trim();\n\n      setDegreeStatus('Running…');\n      setMetricSectionState('metrics-degree', 'running');\n      degreeMaxValue.textContent = '—';\n      degreeMeanValue.textContent = '—';\n      degreeElapsedValue.textContent = '—';\n      setDegreeRunning(true);\n\n      const started = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n      try {\n        const result = network.measureDegree({\n          direction,\n          outNodeAttribute: outNodeAttribute || null,\n        });\n        const ended = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n        const summary = summarizeFiniteValues(result?.values ?? result?.valuesByNode);\n        const wrote = Boolean(outNodeAttribute);\n        degreeMaxValue.textContent = formatNumber(summary.max, 4);\n        degreeMeanValue.textContent = formatNumber(summary.mean, 4);\n        degreeElapsedValue.textContent = `${Math.round(Math.max(0, ended - started))} ms`;\n        setDegreeStatus(wrote ? `Done • wrote \"${outNodeAttribute}\"` : 'Done');\n        setMetricSectionState('metrics-degree', 'success');\n        if (wrote) markMetricOutputDirty('degree', outNodeAttribute);\n        refreshAll();\n        this.helios?.requestRender?.();\n      } catch (error) {\n        setDegreeStatus(error?.message ?? String(error));\n        setMetricSectionState('metrics-degree', 'error');\n      } finally {\n        setDegreeRunning(false);\n      }\n    };\n\n    const runStrength = () => {\n      const network = net();\n      if (!network || typeof network.measureStrength !== 'function') {\n        setStrengthStatus('Strength measurement is not available on this network');\n        setMetricSectionState('metrics-strength', 'error');\n        return;\n      }\n      const direction = normalizeNeighborDirection(strengthDirectionSelect.value);\n      const measure = normalizeStrengthMeasure(strengthMeasureSelect.value);\n      const edgeWeightAttribute = strengthWeightSelect.value ? String(strengthWeightSelect.value) : null;\n      const outNodeAttribute = strengthOutAttrInput.value.trim();\n\n      setStrengthStatus('Running…');\n      setMetricSectionState('metrics-strength', 'running');\n      strengthMaxValue.textContent = '—';\n      strengthMeanValue.textContent = '—';\n      strengthElapsedValue.textContent = '—';\n      setStrengthRunning(true);\n\n      const started = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n      try {\n        const result = network.measureStrength({\n          direction,\n          measure,\n          edgeWeightAttribute,\n          outNodeAttribute: outNodeAttribute || null,\n        });\n        const ended = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n        const summary = summarizeFiniteValues(result?.values ?? result?.valuesByNode);\n        const wrote = Boolean(outNodeAttribute);\n        strengthMaxValue.textContent = formatNumber(summary.max, 4);\n        strengthMeanValue.textContent = formatNumber(summary.mean, 4);\n        strengthElapsedValue.textContent = `${Math.round(Math.max(0, ended - started))} ms`;\n        setStrengthStatus(wrote ? `Done • wrote \"${outNodeAttribute}\"` : 'Done');\n        setMetricSectionState('metrics-strength', 'success');\n        if (wrote) markMetricOutputDirty('strength', outNodeAttribute);\n        refreshAll();\n        this.helios?.requestRender?.();\n      } catch (error) {\n        setStrengthStatus(error?.message ?? String(error));\n        setMetricSectionState('metrics-strength', 'error');\n      } finally {\n        setStrengthRunning(false);\n      }\n    };\n\n    const runClustering = () => {\n      const network = net();\n      if (!network || typeof network.measureLocalClusteringCoefficient !== 'function') {\n        setClusteringStatus('Local clustering measurement is not available on this network');\n        setMetricSectionState('metrics-clustering', 'error');\n        return;\n      }\n      const direction = normalizeNeighborDirection(clusteringDirectionSelect.value);\n      const variant = normalizeClusteringVariant(clusteringVariantSelect.value);\n      const edgeWeightAttribute = clusteringWeightSelect.value ? String(clusteringWeightSelect.value) : null;\n      if (variant !== 'unweighted' && !edgeWeightAttribute) {\n        setClusteringStatus('Choose an edge weight attribute for weighted variants');\n        setMetricSectionState('metrics-clustering', 'error');\n        return;\n      }\n      const outNodeAttribute = clusteringOutAttrInput.value.trim();\n\n      setClusteringStatus('Running…');\n      setMetricSectionState('metrics-clustering', 'running');\n      clusteringMaxValue.textContent = '—';\n      clusteringMeanValue.textContent = '—';\n      clusteringElapsedValue.textContent = '—';\n      setClusteringRunning(true);\n\n      const started = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n      try {\n        const result = network.measureLocalClusteringCoefficient({\n          direction,\n          variant,\n          edgeWeightAttribute: variant === 'unweighted' ? null : edgeWeightAttribute,\n          outNodeAttribute: outNodeAttribute || null,\n        });\n        const ended = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n        const summary = summarizeFiniteValues(result?.values ?? result?.valuesByNode);\n        const wrote = Boolean(outNodeAttribute);\n        clusteringMaxValue.textContent = formatNumber(summary.max, 4);\n        clusteringMeanValue.textContent = formatNumber(summary.mean, 4);\n        clusteringElapsedValue.textContent = `${Math.round(Math.max(0, ended - started))} ms`;\n        setClusteringStatus(wrote ? `Done • wrote \"${outNodeAttribute}\"` : 'Done');\n        setMetricSectionState('metrics-clustering', 'success');\n        if (wrote) markMetricOutputDirty('local-clustering', outNodeAttribute);\n        refreshAll();\n        this.helios?.requestRender?.();\n      } catch (error) {\n        setClusteringStatus(error?.message ?? String(error));\n        setMetricSectionState('metrics-clustering', 'error');\n      } finally {\n        setClusteringRunning(false);\n      }\n    };\n\n    const runEigenvector = async () => {\n      const network = net();\n      if (!network || typeof network.measureEigenvectorCentrality !== 'function') {\n        setEigenvectorStatus('Eigenvector centrality is not available on this network');\n        setMetricSectionState('metrics-eigen', 'error');\n        return;\n      }\n\n      const direction = normalizeNeighborDirection(eigenvectorDirectionSelect.value);\n      const edgeWeightAttribute = eigenvectorWeightSelect.value ? String(eigenvectorWeightSelect.value) : null;\n      const maxIterations = Math.max(1, Number(eigenvectorMaxIterationsInput.value) || 1);\n      const chunkIterations = Math.max(1, Number(eigenvectorChunkIterationsInput.value) || 1);\n      const yieldMs = Math.max(0, Number(eigenvectorYieldMsInput.value) || 0);\n      const toleranceRaw = Number(eigenvectorToleranceInput.value);\n      const tolerance = Number.isFinite(toleranceRaw) && toleranceRaw > 0 ? toleranceRaw : 1e-6;\n      const outNodeAttribute = eigenvectorOutAttrInput.value.trim();\n\n      setEigenvectorStatus('Starting…');\n      setMetricSectionState('metrics-eigen', 'running');\n      setEigenvectorProgress(0, maxIterations);\n      eigenvectorMaxValue.textContent = '—';\n      eigenvectorEigenvalueValue.textContent = '—';\n      eigenvectorElapsedValue.textContent = '—';\n      setEigenvectorRunning(true);\n      eigenvectorAbortController = new AbortController();\n      const signal = eigenvectorAbortController.signal;\n\n      const started = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n      let processedIterations = 0;\n      let currentValues = null;\n      let lastResult = null;\n      try {\n        while (processedIterations < maxIterations) {\n          if (signal.aborted) {\n            throw new Error('Canceled');\n          }\n          const remaining = maxIterations - processedIterations;\n          const stepIterations = Math.max(1, Math.min(chunkIterations, remaining));\n          lastResult = network.measureEigenvectorCentrality({\n            direction,\n            edgeWeightAttribute,\n            maxIterations: stepIterations,\n            tolerance,\n            initialValues: currentValues,\n            executionMode: 'single-thread',\n            outNodeAttribute: outNodeAttribute || null,\n          });\n          currentValues = lastResult?.valuesByNode ?? currentValues;\n          const stepDone = Math.max(1, Number(lastResult?.iterations ?? stepIterations));\n          processedIterations = Math.min(maxIterations, processedIterations + stepDone);\n          setEigenvectorProgress(processedIterations, maxIterations);\n          setEigenvectorStatus(`Running… ${processedIterations}/${maxIterations} iterations`);\n          if (lastResult?.converged) break;\n          await defer(yieldMs);\n        }\n        if (!currentValues) {\n          throw new Error('Eigenvector centrality returned no values');\n        }\n        const ended = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n        const summary = summarizeFiniteValues(currentValues);\n        const wrote = Boolean(outNodeAttribute);\n        const converged = lastResult?.converged ? 'converged' : 'max iterations reached';\n        const iterations = processedIterations;\n        setEigenvectorProgress(1, 1);\n        eigenvectorMaxValue.textContent = formatNumber(summary.max, 6);\n        eigenvectorEigenvalueValue.textContent = formatNumber(Number(lastResult?.eigenvalue ?? NaN), 6);\n        eigenvectorElapsedValue.textContent = `${Math.round(Math.max(0, ended - started))} ms`;\n        const writeMsg = wrote ? ` • wrote \"${outNodeAttribute}\"` : '';\n        setEigenvectorStatus(`Done • ${converged} in ${iterations} iterations${writeMsg}`);\n        setMetricSectionState('metrics-eigen', 'success');\n        if (wrote) markMetricOutputDirty('eigenvector-centrality', outNodeAttribute);\n        refreshAll();\n        this.helios?.requestRender?.();\n      } catch (error) {\n        const message = error?.message ?? String(error);\n        const lower = message.toLowerCase();\n        const aborted = signal.aborted || lower.includes('aborted') || lower.includes('canceled');\n        if (aborted) {\n          setEigenvectorStatus('Canceled');\n          setMetricSectionState('metrics-eigen', 'idle');\n        } else {\n          const detail = reportMeasurementError('Eigenvector centrality', error, {\n            direction,\n            edgeWeightAttribute,\n            maxIterations,\n            chunkIterations,\n            tolerance,\n            processedIterations,\n          });\n          setEigenvectorStatus(detail);\n          setMetricSectionState('metrics-eigen', 'error');\n        }\n      } finally {\n        eigenvectorAbortController = null;\n        setEigenvectorRunning(false);\n      }\n    };\n\n    const runBetweenness = async () => {\n      const network = net();\n      if (!network || typeof network.measureBetweennessCentrality !== 'function') {\n        setBetweennessStatus('Betweenness centrality is not available on this network');\n        setMetricSectionState('metrics-betweenness', 'error');\n        return;\n      }\n      const edgeWeightAttribute = betweennessWeightSelect.value ? String(betweennessWeightSelect.value) : null;\n      const normalize = Boolean(betweennessNormalizeCheckbox.checked);\n      const outNodeAttribute = betweennessOutAttrInput.value.trim();\n\n      const totalSources = Math.max(0, Number(network.nodeCount) || 0);\n      if (!totalSources) {\n        setBetweennessStatus('No active nodes to process');\n        setMetricSectionState('metrics-betweenness', 'error');\n        betweennessMaxValue.textContent = '—';\n        betweennessSourceCountValue.textContent = '0';\n        betweennessElapsedValue.textContent = '0 ms';\n        setBetweennessProgress(1, 1);\n        return;\n      }\n\n      setBetweennessStatus('Starting…');\n      setMetricSectionState('metrics-betweenness', 'running');\n      setBetweennessProgress(0, totalSources);\n      betweennessMaxValue.textContent = '—';\n      betweennessSourceCountValue.textContent = '—';\n      betweennessElapsedValue.textContent = '—';\n      setBetweennessRunning(true);\n      betweennessAbortController = new AbortController();\n      const signal = betweennessAbortController.signal;\n\n      const started = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n      let processedSources = 0;\n      try {\n        if (signal.aborted) {\n          throw new Error('Canceled');\n        }\n        setBetweennessStatus(`Running… ${totalSources}/${totalSources} sources`);\n        const result = network.measureBetweennessCentrality({\n          edgeWeightAttribute,\n          normalize,\n          executionMode: 'single-thread',\n          outNodeAttribute: outNodeAttribute || null,\n        });\n        const finalValues = result?.valuesByNode ?? null;\n        processedSources = Math.max(0, Number(result?.processedSources) || totalSources);\n        setBetweennessProgress(processedSources, totalSources);\n        if (!finalValues) {\n          throw new Error('Betweenness centrality returned no values');\n        }\n        const ended = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n        const summary = summarizeFiniteValues(finalValues);\n        const wrote = Boolean(outNodeAttribute);\n        setBetweennessProgress(1, 1);\n        betweennessMaxValue.textContent = formatNumber(summary.max, 6);\n        betweennessSourceCountValue.textContent = String(processedSources);\n        betweennessElapsedValue.textContent = `${Math.round(Math.max(0, ended - started))} ms`;\n        const writeMsg = wrote ? ` • wrote \"${outNodeAttribute}\"` : '';\n        setBetweennessStatus(`Done${writeMsg}`);\n        setMetricSectionState('metrics-betweenness', 'success');\n        if (wrote) markMetricOutputDirty('betweenness-centrality', outNodeAttribute);\n        refreshAll();\n        this.helios?.requestRender?.();\n      } catch (error) {\n        const message = error?.message ?? String(error);\n        const lower = message.toLowerCase();\n        const aborted = signal.aborted || lower.includes('aborted') || lower.includes('canceled');\n        if (aborted) {\n          setBetweennessStatus('Canceled');\n          setMetricSectionState('metrics-betweenness', 'idle');\n        } else {\n          const detail = reportMeasurementError('Betweenness centrality', error, {\n            edgeWeightAttribute,\n            normalize,\n            sourceChunkSize,\n            processedSources,\n            totalSources,\n          });\n          setBetweennessStatus(detail);\n          setMetricSectionState('metrics-betweenness', 'error');\n        }\n      } finally {\n        betweennessAbortController = null;\n        setBetweennessRunning(false);\n      }\n    };\n\n    const runLeiden = async () => {\n      const network = net();\n      if (!network || typeof network.createLeidenSession !== 'function') {\n        setLeidenStatus('Leiden is not available on this network');\n        setMetricSectionState('metrics-leiden', 'error');\n        return;\n      }\n\n      const resolution = Number(resolutionInput.value || 1);\n      const seed = Number(seedInput.value || 0);\n      const maxLevels = Number(maxLevelsInput.value || 32);\n      const maxPasses = Number(maxPassesInput.value || 8);\n      const edgeWeightAttribute = weightSelect.value ? String(weightSelect.value) : null;\n      const outNodeCommunityAttribute = String(outAttributeInput.value || 'community');\n\n      const timeoutMs = Math.max(0, Number(timeoutMsInput.value) || 0);\n      const chunkBudget = Math.max(1, Number(chunkBudgetInput.value) || 20000);\n      const yieldMs = Math.max(0, Number(yieldMsInput.value) || 0);\n\n      setLeidenStatus('Starting…');\n      setMetricSectionState('metrics-leiden', 'running');\n      setLeidenProgress(0, 1);\n      modularityValue.textContent = '—';\n      communityValue.textContent = '—';\n      elapsedValue.textContent = '—';\n      setLeidenRunning(true);\n      leidenAbortController = new AbortController();\n\n      const started = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n      try {\n        const session = network.createLeidenSession({\n          edgeWeightAttribute,\n          resolution,\n          seed,\n          maxLevels,\n          maxPasses,\n          outNodeCommunityAttribute,\n        });\n\n        const result = await session.runWorker({\n          signal: leidenAbortController.signal,\n          yieldMs,\n          stepOptions: { timeoutMs, chunkBudget },\n          onProgress: (progress) => {\n            if (!progress) return;\n            setLeidenProgress(progress.progressCurrent, progress.progressTotal);\n            const phase = progress.phase ?? 0;\n            const level = progress.level ?? 0;\n            const maxL = progress.maxLevels ?? 0;\n            const pass = progress.pass ?? 0;\n            const maxP = progress.maxPasses ?? 0;\n            const communities = progress.communityCount ?? 0;\n            setLeidenStatus(`Running… phase ${phase} • level ${level}/${maxL} • pass ${pass}/${maxP} • k=${communities}`);\n          },\n        });\n\n        const ended = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n        const elapsedMs = Math.max(0, ended - started);\n        setLeidenProgress(1, 1);\n        setLeidenStatus(`Done • wrote \"${outNodeCommunityAttribute}\"`);\n        setMetricSectionState('metrics-leiden', 'success');\n        modularityValue.textContent = formatNumber(result?.modularity ?? NaN, 6);\n        communityValue.textContent = String(result?.communityCount ?? '—');\n        elapsedValue.textContent = `${Math.round(elapsedMs)} ms`;\n        markMetricOutputDirty('leiden-communities', outNodeCommunityAttribute);\n        refreshAll();\n        this.helios?.requestRender?.();\n      } catch (error) {\n        const message = error?.message ?? String(error);\n        const lower = message.toLowerCase();\n        const aborted = leidenAbortController?.signal?.aborted || lower.includes('aborted') || lower.includes('canceled');\n        if (aborted) {\n          setLeidenStatus('Canceled');\n          setMetricSectionState('metrics-leiden', 'idle');\n        } else {\n          setLeidenStatus(message);\n          setMetricSectionState('metrics-leiden', 'error');\n        }\n      } finally {\n        leidenAbortController = null;\n        setLeidenRunning(false);\n      }\n    };\n\n    const runDimension = async () => {\n      const network = net();\n      if (!network || typeof network.createDimensionSession !== 'function') {\n        setDimensionStatus('Dimension session is not available on this network');\n        setMetricSectionState('metrics-dimension', 'error');\n        return;\n      }\n\n      refreshDimensionOrderLimits();\n      const method = normalizeDimensionMethod(dimensionMethodSelect.value);\n      const maxLevel = Math.max(0, Number(dimensionMaxLevelInput.value) || 0);\n      const methodMaxOrder = maxOrderForDimensionMethod(method);\n      const order = Math.min(methodMaxOrder, Math.max(1, Number(dimensionOrderInput.value) || 1));\n      dimensionOrderRow.write(order);\n\n      const outNodeMaxDimensionAttribute = dimensionOutMaxAttrInput.value.trim() || null;\n      const saveLevels = Boolean(dimensionSaveLevelsCheckbox.checked);\n      let outNodeDimensionLevelsAttribute = null;\n      if (saveLevels) {\n        outNodeDimensionLevelsAttribute = dimensionOutLevelsAttrInput.value.trim() || 'dimension_levels';\n        dimensionOutLevelsAttrInput.value = outNodeDimensionLevelsAttribute;\n      }\n      const dimensionLevelsEncoding = dimensionLevelsEncodingSelect.value === 'string' ? 'string' : 'vector';\n      const dimensionLevelsStringPrecision = Math.max(0, Math.min(12, Number(dimensionLevelsPrecisionInput.value) || 0));\n\n      const timeoutMs = Math.max(0, Number(dimensionTimeoutMsInput.value) || 0);\n      const chunkBudget = Math.max(1, Number(dimensionChunkBudgetInput.value) || 200);\n      const yieldMs = Math.max(0, Number(dimensionYieldMsInput.value) || 0);\n\n      setDimensionStatus('Starting…');\n      setMetricSectionState('metrics-dimension', 'running');\n      setDimensionProgress(0, 1);\n      dimensionGlobalMaxValue.textContent = '—';\n      dimensionSelectedCountValue.textContent = '—';\n      dimensionElapsedValue.textContent = '—';\n      setDimensionRunning(true);\n      dimensionAbortController = new AbortController();\n\n      const started = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n      let session = null;\n      try {\n        session = network.createDimensionSession({\n          maxLevel,\n          method,\n          order,\n          captureNodeDimensionProfiles: Boolean(outNodeDimensionLevelsAttribute),\n          outNodeMaxDimensionAttribute,\n          outNodeDimensionLevelsAttribute,\n          dimensionLevelsEncoding,\n          dimensionLevelsStringPrecision,\n        });\n\n        await session.run({\n          signal: dimensionAbortController.signal,\n          yieldMs,\n          stepOptions: { timeoutMs, chunkBudget },\n          onProgress: (progress) => {\n            if (!progress) return;\n            setDimensionProgress(progress.progressCurrent, progress.progressTotal);\n            const phase = progress.phase ?? 0;\n            const processed = progress.processedNodes ?? progress.progressCurrent ?? 0;\n            const total = progress.nodeCount ?? progress.progressTotal ?? 0;\n            setDimensionStatus(`Running… phase ${phase} • ${processed}/${total} nodes`);\n          },\n        });\n\n        const result = session.finalize({\n          outNodeMaxDimensionAttribute,\n          outNodeDimensionLevelsAttribute,\n          dimensionLevelsEncoding,\n          dimensionLevelsStringPrecision,\n        });\n        const ended = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n        const elapsedMs = Math.max(0, ended - started);\n        const dmax = maxFiniteArrayValue(result?.globalDimension);\n\n        const writes = [];\n        if (outNodeMaxDimensionAttribute) writes.push(`\"${outNodeMaxDimensionAttribute}\"`);\n        if (outNodeDimensionLevelsAttribute) writes.push(`\"${outNodeDimensionLevelsAttribute}\"`);\n        setDimensionProgress(1, 1);\n        setDimensionStatus(writes.length ? `Done • wrote ${writes.join(', ')}` : 'Done');\n        setMetricSectionState('metrics-dimension', 'success');\n        dimensionGlobalMaxValue.textContent = formatNumber(dmax, 4);\n        dimensionSelectedCountValue.textContent = String(result?.selectedCount ?? '—');\n        dimensionElapsedValue.textContent = `${Math.round(elapsedMs)} ms`;\n        if (writes.length) markMetricOutputDirty('dimension', [outNodeMaxDimensionAttribute, outNodeDimensionLevelsAttribute]);\n        refreshAll();\n        this.helios?.requestRender?.();\n      } catch (error) {\n        const message = error?.message ?? String(error);\n        const lower = message.toLowerCase();\n        const aborted = dimensionAbortController?.signal?.aborted || lower.includes('aborted') || lower.includes('canceled');\n        if (aborted) {\n          setDimensionStatus('Canceled');\n          setMetricSectionState('metrics-dimension', 'idle');\n        } else {\n          setDimensionStatus(message);\n          setMetricSectionState('metrics-dimension', 'error');\n        }\n      } finally {\n        if (session && typeof session.dispose === 'function') {\n          try {\n            session.dispose();\n          } catch (error) {\n            warnUiDerivationFailure('Dimension metric session disposal failed', { error });\n          }\n        }\n        dimensionAbortController = null;\n        setDimensionRunning(false);\n      }\n    };\n\n    degreeCalcButton.addEventListener('click', () => {\n      if (degreeRunning) return;\n      runDegree();\n    });\n    strengthCalcButton.addEventListener('click', () => {\n      if (strengthRunning) return;\n      runStrength();\n    });\n    clusteringCalcButton.addEventListener('click', () => {\n      if (clusteringRunning) return;\n      runClustering();\n    });\n    eigenvectorCalcButton.addEventListener('click', () => {\n      if (eigenvectorRunning) {\n        cancelEigenvectorRun();\n        return;\n      }\n      runEigenvector();\n    });\n    betweennessCalcButton.addEventListener('click', () => {\n      if (betweennessRunning) {\n        cancelBetweennessRun();\n        return;\n      }\n      runBetweenness();\n    });\n\n    calcButton.addEventListener('click', () => {\n      if (leidenRunning) {\n        cancelLeidenRun();\n        return;\n      }\n      runLeiden();\n    });\n    dimensionCalcButton.addEventListener('click', () => {\n      if (dimensionRunning) {\n        cancelDimensionRun();\n        return;\n      }\n      runDimension();\n    });\n\n    refreshAll();\n\n    // Status is rendered under the Progress bar.\n\n    metricsStack = new PanelStack();\n    const stack = metricsStack;\n    stack.add({\n      id: 'metrics-degree',\n      title: 'Degree',\n      collapsed: options?.collapsedDegree ?? true,\n      statusDot: true,\n      headerControls: degreeCalcButton,\n      content: (() => {\n        const wrapper = document.createElement('div');\n        wrapper.appendChild(degree);\n        wrapper.appendChild(degreeInnerStack.element);\n        return wrapper;\n      })(),\n    });\n    stack.add({\n      id: 'metrics-strength',\n      title: 'Strength',\n      collapsed: options?.collapsedStrength ?? true,\n      statusDot: true,\n      headerControls: strengthCalcButton,\n      content: (() => {\n        const wrapper = document.createElement('div');\n        wrapper.appendChild(strength);\n        wrapper.appendChild(strengthInnerStack.element);\n        return wrapper;\n      })(),\n    });\n    stack.add({\n      id: 'metrics-clustering',\n      title: 'Local Clustering',\n      collapsed: options?.collapsedClustering ?? true,\n      statusDot: true,\n      headerControls: clusteringCalcButton,\n      content: (() => {\n        const wrapper = document.createElement('div');\n        wrapper.appendChild(clustering);\n        wrapper.appendChild(clusteringInnerStack.element);\n        return wrapper;\n      })(),\n    });\n    stack.add({\n      id: 'metrics-eigen',\n      title: 'Eigenvector Centrality',\n      collapsed: options?.collapsedEigenvector ?? true,\n      statusDot: true,\n      headerControls: eigenvectorCalcButton,\n      content: (() => {\n        const wrapper = document.createElement('div');\n        wrapper.appendChild(eigenvector);\n        wrapper.appendChild(eigenvectorInnerStack.element);\n        return wrapper;\n      })(),\n    });\n    stack.add({\n      id: 'metrics-betweenness',\n      title: 'Betweenness Centrality',\n      collapsed: options?.collapsedBetweenness ?? true,\n      statusDot: true,\n      headerControls: betweennessCalcButton,\n      content: (() => {\n        const wrapper = document.createElement('div');\n        wrapper.appendChild(betweenness);\n        wrapper.appendChild(betweennessInnerStack.element);\n        return wrapper;\n      })(),\n    });\n    stack.add({\n      id: 'metrics-leiden',\n      title: 'Communities (Leiden)',\n      collapsed: options?.collapsedLeiden ?? true,\n      statusDot: true,\n      headerControls: calcButton,\n      content: (() => {\n        const wrapper = document.createElement('div');\n        wrapper.appendChild(leiden);\n        wrapper.appendChild(leidenInnerStack.element);\n        return wrapper;\n      })(),\n    });\n    stack.add({\n      id: 'metrics-dimension',\n      title: 'Dimensionality',\n      collapsed: options?.collapsedDimension ?? true,\n      statusDot: true,\n      headerControls: dimensionCalcButton,\n      content: (() => {\n        const wrapper = document.createElement('div');\n        wrapper.appendChild(dimension);\n        wrapper.appendChild(dimensionInnerStack.element);\n        return wrapper;\n      })(),\n    });\n    resetMetricSectionStates();\n    content.appendChild(stack.element);\n    this._controlCleanups.add(() => stack.destroy());\n    this._controlCleanups.add(() => degreeInnerStack.destroy());\n    this._controlCleanups.add(() => strengthInnerStack.destroy());\n    this._controlCleanups.add(() => clusteringInnerStack.destroy());\n    this._controlCleanups.add(() => eigenvectorInnerStack.destroy());\n    this._controlCleanups.add(() => betweennessInnerStack.destroy());\n    this._controlCleanups.add(() => leidenInnerStack.destroy());\n    this._controlCleanups.add(() => dimensionInnerStack.destroy());\n\n    this._controlCleanups.add(() => {\n      for (const cleanup of tooltipCleanups) cleanup();\n      tooltipCleanups.clear();\n    });\n\n    // Refresh on network changes (and cancel any in-flight run).\n    const onNetworkReplaced = () => {\n      cancelLeidenRun();\n      cancelDimensionRun();\n      cancelEigenvectorRun();\n      cancelBetweennessRun();\n      resetMetricSectionStates();\n      refreshAll();\n    };\n    let unsub = null;\n    if (this.helios?.on) {\n      unsub = this.helios.on('network:replaced', onNetworkReplaced);\n    } else if (this.helios?.addEventListener) {\n      this.helios.addEventListener('network:replaced', onNetworkReplaced);\n      unsub = () => this.helios.removeEventListener('network:replaced', onNetworkReplaced);\n    }\n    if (unsub) this._controlCleanups.add(unsub);\n\n    return this.createPanel({\n      id: options.id ?? 'helios-ui-metrics',\n      title: options.title ?? 'Metrics',\n      position: options.position ?? { x: 16, y: 340 },\n      dock: options.dock ?? 'top-left',\n      collapsed: options.collapsed ?? true,\n      content,\n    });\n  }\n\n  /**\n   * Create a debug panel for persistence and state-manager counters.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {object} [options] - Panel placement and refresh-window options.\n   * @returns {Panel} Created panel instance.\n   */\n  createDebugPanel(options = {}) {\n    const content = document.createElement('div');\n    content.className = 'helios-ui-debug-panel';\n    const windowMs = Number.isFinite(options.windowMs)\n      ? Math.max(1000, Number(options.windowMs))\n      : 5 * 60 * 1000;\n    const refreshMs = Number.isFinite(options.refreshMs)\n      ? Math.max(500, Number(options.refreshMs))\n      : 1500;\n\n    const rows = [\n      ['trackedStateCount', 'Tracked states'],\n      ['stateChangeCount', 'State changes'],\n      ['uiChangeCount', 'UI changes'],\n      ['persistenceChangeCount', 'Persistence changes'],\n    ].map(([key, label]) => {\n      const row = document.createElement('div');\n      row.className = 'helios-ui-debug-panel__row';\n      const labelEl = document.createElement('span');\n      labelEl.className = 'helios-ui-debug-panel__label';\n      labelEl.textContent = label;\n      const valueEl = document.createElement('span');\n      valueEl.className = 'helios-ui-debug-panel__value';\n      valueEl.textContent = '0';\n      row.append(labelEl, valueEl);\n      content.appendChild(row);\n      return { key, valueEl };\n    });\n\n    const meta = document.createElement('div');\n    meta.className = 'helios-ui-debug-panel__meta';\n    content.appendChild(meta);\n\n    let updateFrame = 0;\n    const update = () => {\n      updateFrame = 0;\n      const stats = this.helios?.storage?.debugStats?.({\n        windowMs,\n        includeRecent: false,\n        includeKeys: false,\n        includeNetworkData: false,\n      })\n        ?? this.helios?.states?.debugStats?.({ windowMs, includeRecent: false, includeKeys: false })\n        ?? {};\n      for (const row of rows) {\n        const value = Number(stats[row.key] ?? 0);\n        const nextText = Number.isFinite(value) ? String(value) : '0';\n        if (row.valueEl.textContent !== nextText) row.valueEl.textContent = nextText;\n      }\n      const minutes = Math.max(1, Math.round(windowMs / 60000));\n      const sessionId = stats.sessionId ? String(stats.sessionId) : 'none';\n      const networkStatus = stats.networkStatus\n        ? String(stats.networkStatus)\n        : (stats.networkData?.status ? String(stats.networkData.status) : 'unknown');\n      const nextMeta = `${minutes} min window | ${networkStatus} | ${sessionId}`;\n      if (meta.textContent !== nextMeta) meta.textContent = nextMeta;\n    };\n    const scheduleUpdate = () => {\n      if (updateFrame) return;\n      if (typeof window.requestAnimationFrame === 'function') {\n        updateFrame = window.requestAnimationFrame(update);\n      } else {\n        updateFrame = window.setTimeout(update, 16);\n      }\n    };\n    update();\n    const interval = window.setInterval(scheduleUpdate, refreshMs);\n    this._controlCleanups.add(() => {\n      window.clearInterval(interval);\n      if (updateFrame) {\n        if (typeof window.cancelAnimationFrame === 'function') window.cancelAnimationFrame(updateFrame);\n        else window.clearTimeout(updateFrame);\n        updateFrame = 0;\n      }\n    });\n    const unsubscribeState = this.helios?.states?.subscribe?.('', scheduleUpdate, { immediate: false });\n    if (typeof unsubscribeState === 'function') this._controlCleanups.add(unsubscribeState);\n    if (typeof this.helios?.storage?.addEventListener === 'function') {\n      const onStorageChange = () => scheduleUpdate();\n      this.helios.storage.addEventListener('change', onStorageChange);\n      this._controlCleanups.add(() => this.helios?.storage?.removeEventListener?.('change', onStorageChange));\n    }\n\n    return this.createPanel({\n      id: options.id ?? 'helios-ui-debug',\n      title: options.title ?? 'Debug',\n      position: options.position ?? { x: 16, y: 420 },\n      dock: options.dock ?? 'right',\n      width: options.width ?? 320,\n      minWidth: options.minWidth ?? 280,\n      persistencePath: false,\n      collapsed: options.collapsed ?? true,\n      content,\n    });\n  }\n\n  /**\n   * Dispose all UI controls, panels, listeners, timers, and container resources.\n   *\n   * @public\n   * @apiSection User Interface\n   * @returns {void}\n   */\n  destroy() {\n    if (this._persistenceBaselineRefreshTimer != null) clearTimeout(this._persistenceBaselineRefreshTimer);\n    this._persistenceBaselineRefreshTimer = null;\n    for (const cleanup of this._controlCleanups) cleanup();\n    this._controlCleanups.clear();\n    this._boundAttributesById.clear();\n    this._heliosBindingUnsubscribe = null;\n    this.helios?.overlayInsets?.({ top: 0, right: 0, bottom: 0, left: 0 });\n    this.panelManager?.destroy();\n    if (this.helios?.ui === this) this.helios.ui = null;\n    if (this.helios?.layers && typeof this.helios.layers.removeLayer === 'function') {\n      this.helios.layers.removeLayer(this.layerName);\n      return;\n    }\n    this.container?.remove?.();\n  }\n\n  /**\n   * Create the visual mapper configuration panel.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {object} [options] - Panel placement and mapper panel options.\n   * @returns {Panel} Created panel instance.\n   */\n  createMappersPanel(options = {}) {\n    return new MappersPanel(this, options).create();\n\n    const helios = this.helios;\n    const network = helios?.network ?? null;\n\n    const CHANNEL_LABELS = {\n      color: 'Color',\n      size: 'Size',\n      outline: 'Outline Width',\n      outlineColor: 'Outline Color',\n      position: 'Position',\n      width: 'Width',\n      opacity: 'Opacity',\n      endpointSize: 'Endpoint Size',\n    };\n\n    const MAPPER_TYPE_LABELS = {\n      layout: 'Layout',\n      constant: 'Constant',\n      passthrough: 'Passthrough',\n      nodeAttribute: 'From Nodes',\n      linear: 'Scale',\n      colormap: 'Colormap',\n    };\n\n    const nodeChannels = ['color', 'size', 'outline', 'outlineColor', 'position'];\n    // Edge endpoint channels are node-derived and intentionally not exposed in the UI.\n    const edgeChannels = ['color', 'width', 'opacity'];\n\n    const colormapNames = collectColormapSuggestionNames();\n\n    let customPresetCounter = 1;\n    const customPresetsByMode = {\n      node: new Map(),\n      edge: new Map(),\n    };\n\n    const getCustomPresetMap = (mode, channel) => {\n      const modeMap = customPresetsByMode[mode];\n      if (!modeMap) return new Map();\n      let byChannel = modeMap.get(channel);\n      if (!byChannel) {\n        byChannel = new Map();\n        modeMap.set(channel, byChannel);\n      }\n      return byChannel;\n    };\n\n    const isEditorTransferableConfig = (config) => {\n      if (!config) return false;\n      const type = config.type ?? config.mode ?? null;\n      if (type === 'layout') return true;\n\n      // Editor currently doesn't represent exception rules.\n      if (Array.isArray(config.rules) && config.rules.length > 0) return false;\n\n      // Any custom function makes the config non-roundtrippable for now.\n      if (typeof config.transform === 'function' && !config.transformType) return false;\n      if (typeof config.scale === 'function') return false;\n\n      // Cache/internal fields like __colormapScale are ignored.\n\n      if (type === 'constant') return true;\n      if (type === 'passthrough') return true;\n      if (type === 'linear') return true;\n      if (type === 'nodeAttribute') return true;\n\n      if (type === 'colormap' || config.colormap) {\n        // Only support selecting named colormaps in the editor for now.\n        return typeof (config.colormap ?? config.scale ?? config.range) === 'string';\n      }\n\n      return false;\n    };\n\n    // Domains shown in the UI are always in the original attribute scale.\n    // When a transform is selected, the runtime will transform the domain internally.\n\n    const isEphemeralCustomPreset = (config) => {\n      if (!config) return false;\n      if (isEditorTransferableConfig(config)) return false;\n      const meta = config.meta && typeof config.meta === 'object' ? config.meta : null;\n      if (!meta) return true;\n      const keys = Object.keys(meta);\n      if (!keys.length) return true;\n      const hasLabel =\n        (typeof meta.name === 'string' && meta.name.trim()) ||\n        (typeof meta.source === 'string' && meta.source.trim()) ||\n        (typeof meta.description === 'string' && meta.description.trim());\n      return !hasLabel;\n    };\n\n    const registerCustomPreset = (mode, channel, config) => {\n      if (!config) return null;\n      const meta = config.meta && typeof config.meta === 'object' ? config.meta : {};\n      const preferredName = typeof meta.name === 'string' ? meta.name.trim() : '';\n      const baseId = preferredName || `custom-${customPresetCounter++}`;\n      const ephemeral = isEphemeralCustomPreset(config);\n\n      const byId = getCustomPresetMap(mode, channel);\n      let id = baseId;\n      if (byId.has(id)) {\n        const existing = byId.get(id);\n        if (existing?.config === config) return id;\n        let n = 2;\n        while (byId.has(`${baseId} (${n})`)) n += 1;\n        id = `${baseId} (${n})`;\n      }\n\n      byId.set(id, {\n        id,\n        label: preferredName || 'custom',\n        ephemeral,\n        config: shallowCloneChannelConfig(config) ?? config,\n      });\n      return id;\n    };\n\n    const pruneEphemeralCustomPresets = (mode, channel) => {\n      const byId = getCustomPresetMap(mode, channel);\n      for (const [id, preset] of byId.entries()) {\n        if (preset?.ephemeral) byId.delete(id);\n      }\n    };\n\n    const isHexColorString = (value) => {\n      if (typeof value !== 'string') return false;\n      const hex = value.trim();\n      return /^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(hex);\n    };\n\n    const isNumericAttributeType = (type) => typeof type === 'number';\n    const isIntegerAttributeType = (type) =>\n      type === AttributeType.Integer ||\n      type === AttributeType.UnsignedInteger ||\n      type === AttributeType.BigInteger ||\n      type === AttributeType.UnsignedBigInteger;\n\n    const resolveVisualAlias = (name) => {\n      if (typeof name !== 'string') return name;\n      return VISUAL_ATTRIBUTE_MAP[name] ?? name;\n    };\n\n    const getAttributeInfo = (scope, rawName) => {\n      if (!network) return null;\n      if (rawName === '$index') return { dimension: 1, type: null };\n      if (typeof rawName !== 'string' || !rawName.length) return null;\n\n      if (scope === 'edge' && rawName.startsWith('@node.')) {\n        const key = rawName.slice('@node.'.length);\n        const resolved = resolveVisualAlias(key);\n        return network.getNodeAttributeInfo?.(resolved) ?? null;\n      }\n\n      const resolved = resolveVisualAlias(rawName);\n      return scope === 'edge'\n        ? (network.getEdgeAttributeInfo?.(resolved) ?? null)\n        : (network.getNodeAttributeInfo?.(resolved) ?? null);\n    };\n\n    const isCompatibleAttribute = (scope, channel, mapperType, name) => {\n      const info = getAttributeInfo(scope, name);\n      if (!info) return false;\n      if (info.type != null && !isNumericAttributeType(info.type)) return false;\n\n      const dim = info.dimension ?? 1;\n      const isEdge = scope === 'edge';\n      const isColorChannel = channel === 'color' || channel === 'outlineColor';\n      const isPositionChannel = scope === 'node' && channel === 'position';\n      const isScalarChannel =\n        channel === 'size' ||\n        channel === 'outline' ||\n        channel === 'width' ||\n        channel === 'opacity' ||\n        channel === 'endpointSize';\n\n      if (mapperType === 'colormap') {\n        return dim === 1;\n      }\n\n      if (mapperType === 'linear') {\n        return dim === 1;\n      }\n\n      if (mapperType === 'nodeAttribute') {\n        if (isColorChannel) return dim === 3 || dim === 4 || dim === 1;\n        if (isScalarChannel) return dim === 1;\n        return false;\n      }\n\n      if (mapperType === 'passthrough') {\n        if (isPositionChannel) {\n          return dim === 3;\n        }\n        if (isColorChannel) {\n          if (isEdge && typeof name === 'string' && name.startsWith('@node.')) return false;\n          if (isEdge) return dim === 4 || dim === 8;\n          return dim === 3 || dim === 4;\n        }\n        if (isScalarChannel) {\n          if (isEdge) return dim === 1 || dim === 2;\n          return dim === 1;\n        }\n        return false;\n      }\n\n      return true;\n    };\n\n    const listAttributeNames = (scope, { channel, mapperType } = {}) => {\n      if (!network) return [];\n      const getNames = scope === 'edge' ? network.getEdgeAttributeNames : network.getNodeAttributeNames;\n      if (typeof getNames !== 'function') return [];\n      const raw = getNames.call(network) ?? [];\n      const out = [];\n\n      // Special built-in attribute implemented by Mapper.resolveAttribute.\n      out.push('$index');\n\n      // Friendly aliases for internal visual attributes (avoid showing _helios_*).\n      if (scope === 'node') {\n        out.push('color', 'size', 'outline', 'outlineColor', 'position');\n      } else {\n        out.push('edgeColor', 'edgeWidth', 'edgeOpacity', 'edgeEndpointSize');\n      }\n\n      for (const name of raw) {\n        if (typeof name !== 'string') continue;\n        if (!isPublicAttributeName(name)) continue;\n        out.push(name);\n      }\n\n      // For edge mappers, allow selecting node endpoint values with @node.*.\n      if (scope === 'edge' && typeof network.getNodeAttributeNames === 'function') {\n        const nodeRaw = network.getNodeAttributeNames() ?? [];\n        for (const name of nodeRaw) {\n          if (typeof name !== 'string') continue;\n          if (!isPublicAttributeName(name)) continue;\n          out.push(`@node.${name}`);\n        }\n      }\n\n      const unique = Array.from(new Set(out));\n      unique.sort((a, b) => {\n        if (a === '$index') return -1;\n        if (b === '$index') return 1;\n        return a.localeCompare(b);\n      });\n\n      if (channel && mapperType) {\n        return unique.filter((name) => isCompatibleAttribute(scope, channel, mapperType, name));\n      }\n      return unique;\n    };\n\n    const resolveCollection = (mode) => {\n      if (!helios) return null;\n      return mode === 'edge' ? helios.edgeMapper : helios.nodeMapper;\n    };\n\n    const computeScalarExtent = (scope, rawName) => {\n      if (!network) return null;\n      if (typeof rawName !== 'string' || !rawName) return null;\n\n      if (rawName === '$index') {\n        const count = scope === 'edge' ? (network.edgeCount ?? network.edgesCount ?? null) : (network.nodeCount ?? network.nodesCount ?? null);\n        if (Number.isFinite(count) && count > 0) return { min: 0, max: Math.max(0, count - 1), isInteger: true };\n        return null;\n      }\n\n      const resolveName = (n) => resolveVisualAlias(n);\n      const isNodeProxy = scope === 'edge' && rawName.startsWith('@node.');\n      const name = isNodeProxy ? rawName.slice('@node.'.length) : rawName;\n      const resolved = resolveName(name);\n      const info = getAttributeInfo(scope, rawName);\n      const integerType = info?.type != null && isIntegerAttributeType(info.type);\n\n      const compute = () => {\n        try {\n          const indices = scope === 'network'\n            ? [0]\n            : (isNodeProxy || scope === 'node')\n              ? network.nodeIndices\n              : network.edgeIndices;\n          if (!indices || typeof indices.length !== 'number' || indices.length === 0) return null;\n          const buffer = isNodeProxy\n            ? network.getNodeAttributeBuffer?.(resolved)\n            : (scope === 'edge' ? network.getEdgeAttributeBuffer?.(resolved) : network.getNodeAttributeBuffer?.(resolved));\n\n          const view = buffer?.view ?? null;\n          if (!view || typeof view.length !== 'number' || view.length <= 0) return null;\n\n          let min = Infinity;\n          let max = -Infinity;\n          for (let i = 0; i < indices.length; i += 1) {\n            const idx = indices[i];\n            const v = Number(view[idx]);\n            if (!Number.isFinite(v)) continue;\n            if (v < min) min = v;\n            if (v > max) max = v;\n          }\n          if (!Number.isFinite(min) || !Number.isFinite(max)) return null;\n          if (integerType) {\n            const minInt = Math.floor(min);\n            const maxInt = Math.ceil(max);\n            if (minInt === maxInt) return { min: minInt, max: minInt + 1, isInteger: true };\n            return { min: minInt, max: maxInt, isInteger: true };\n          }\n          if (min === max) return { min, max: min + 1 };\n          return { min, max };\n        } catch (error) {\n          warnUiDerivationFailure('Scalar extent computation failed', { scope, rawName, error });\n          return null;\n        }\n      };\n\n      if (typeof network.withBufferAccess === 'function') {\n        return network.withBufferAccess(compute);\n      }\n      return compute();\n    };\n\n    const suggestDomainForAttribute = (scope, rawName) => {\n      const extent = computeScalarExtent(scope, rawName);\n      if (extent && Number.isFinite(extent.min) && Number.isFinite(extent.max)) return [extent.min, extent.max];\n      return [0, 1];\n    };\n\n    const suggestRangeForChannel = (mode, channel) => {\n      if (mode === 'node') {\n        if (channel === 'size') return [1, 20];\n        if (channel === 'outline') return [0, 6];\n      }\n      if (mode === 'edge') {\n        if (channel === 'width') return [0.5, 6];\n        if (channel === 'opacity') return [0, 1];\n      }\n      return [0, 1];\n    };\n\n    const suggestStepForRange = (min, max, isInteger = false) => {\n      if (isInteger) return 1;\n      const span = Math.abs(Number(max) - Number(min));\n      if (!Number.isFinite(span) || span <= 0) return 0.01;\n      const magnitude = Math.floor(Math.log10(span));\n      const step = Math.pow(10, magnitude - 3);\n      return Math.max(step, 1e-6);\n    };\n\n    const isPercentileTransform = (transformType) => transformType === 'percentile' || transformType === 'quantile';\n\n    const formatTransformLabel = (value) => {\n      if (value === 'log1p') return 'Log1p';\n      if (value === 'percentile' || value === 'quantile') return 'Percentile';\n      return `${value.slice(0, 1).toUpperCase()}${value.slice(1)}`;\n    };\n\n    const normalizeClampSetting = (clamp) => {\n      if (clamp && typeof clamp === 'object') {\n        return { min: clamp.min !== false, max: clamp.max !== false };\n      }\n      if (clamp === false) return { min: false, max: false };\n      return { min: true, max: true };\n    };\n\n    const resolveDivergentDomain = (domain, extent) => {\n      if (!Array.isArray(domain) || domain.length !== 2) {\n        const min = extent?.min ?? -1;\n        const max = extent?.max ?? 1;\n        const maxAbs = Math.max(Math.abs(min), Math.abs(max), 1);\n        return [-maxAbs, maxAbs];\n      }\n      const maxAbs = Math.max(Math.abs(domain[0]), Math.abs(domain[1]));\n      if (!Number.isFinite(maxAbs) || maxAbs === 0) return [-1, 1];\n      return [-maxAbs, maxAbs];\n    };\n\n    const resolveDivergentDomainFromSlider = (next, prev) => {\n      const prevAbs = Math.abs(prev?.[1] ?? prev?.[0] ?? 0);\n      const loAbs = Math.abs(next?.[0] ?? 0);\n      const hiAbs = Math.abs(next?.[1] ?? 0);\n      const loChanged = Math.abs(loAbs - prevAbs) > 1e-6;\n      const hiChanged = Math.abs(hiAbs - prevAbs) > 1e-6;\n      const maxAbs = loChanged && !hiChanged\n        ? loAbs\n        : (hiChanged && !loChanged ? hiAbs : Math.max(loAbs, hiAbs));\n      if (!Number.isFinite(maxAbs) || maxAbs === 0) return [-1, 1];\n      return [-maxAbs, maxAbs];\n    };\n\n    const updateSliderVisual = (slider) => {\n      if (!slider) return;\n      const min = Number(slider.min);\n      const max = Number(slider.max);\n      const value = Number(slider.value);\n      if (!Number.isFinite(min) || !Number.isFinite(max) || !Number.isFinite(value) || min === max) return;\n      const pct = ((value - min) / (max - min)) * 100;\n      slider.style.setProperty('--pct', String(Math.max(0, Math.min(100, pct))));\n    };\n\n    const createSuggestedSliderControls = ({\n      value,\n      suggested,\n      step,\n      inputMin = null,\n      inputMax = null,\n      onCommit,\n    }) => {\n      const controls = document.createElement('div');\n      controls.className = 'helios-ui-slider-controls';\n\n      const slider = document.createElement('input');\n      slider.type = 'range';\n      slider.className = 'helios-ui-slider';\n      slider.min = String(suggested[0]);\n      slider.max = String(suggested[1]);\n      slider.step = String(step);\n\n      const input = document.createElement('input');\n      input.type = 'number';\n      input.className = 'helios-ui-number';\n      input.step = String(step);\n      if (inputMin != null) input.min = String(inputMin);\n      else input.removeAttribute('min');\n      if (inputMax != null) input.max = String(inputMax);\n      else input.removeAttribute('max');\n\n      const set = (next) => {\n        const n = Number(next);\n        if (!Number.isFinite(n)) return;\n        const min = Number(slider.min);\n        const max = Number(slider.max);\n        const clamped = Math.max(min, Math.min(max, n));\n        slider.value = String(clamped);\n        input.value = String(n);\n        updateSliderVisual(slider);\n      };\n\n      set(value);\n      const commitSliderValue = createFpsThrottle((nextValue) => {\n        onCommit?.(nextValue);\n      });\n\n      slider.addEventListener('input', () => {\n        input.value = String(slider.value);\n        updateSliderVisual(slider);\n        commitSliderValue(slider.value);\n      });\n      slider.addEventListener('change', () => {\n        input.value = String(slider.value);\n        updateSliderVisual(slider);\n        commitSliderValue(slider.value);\n        commitSliderValue.flush();\n      });\n      input.addEventListener('change', () => {\n        set(input.value);\n        onCommit?.(input.value);\n      });\n      input.addEventListener('keydown', (event) => {\n        if (event.key === 'Enter') {\n          set(input.value);\n          onCommit?.(input.value);\n          input.blur();\n        }\n      });\n\n      controls.appendChild(slider);\n      controls.appendChild(input);\n      return { element: controls, slider, input, set };\n    };\n\n    const createTwoHandleRange = ({ min, max, value, step, onChange, allowRangeDrag = true }) => {\n      const wrap = document.createElement('div');\n      wrap.className = 'helios-ui-range2';\n\n      const track = document.createElement('div');\n      track.className = 'helios-ui-range2__track';\n      const bar = document.createElement('div');\n      bar.className = 'helios-ui-range2__bar';\n      const rangeEl = document.createElement('div');\n      rangeEl.className = 'helios-ui-range2__range';\n      track.appendChild(bar);\n      track.appendChild(rangeEl);\n\n      const aInput = document.createElement('input');\n      aInput.type = 'range';\n      aInput.className = 'helios-ui-slider helios-ui-range2__input';\n      const bInput = document.createElement('input');\n      bInput.type = 'range';\n      bInput.className = 'helios-ui-slider helios-ui-range2__input';\n\n      const syncRanges = () => {\n        aInput.min = String(min);\n        aInput.max = String(max);\n        aInput.step = String(step);\n        bInput.min = String(min);\n        bInput.max = String(max);\n        bInput.step = String(step);\n      };\n      syncRanges();\n\n      const clampTo = (v) => {\n        const n = Number(v);\n        if (!Number.isFinite(n)) return null;\n        const snappedMin = Math.abs(n - min) <= step / 2 ? min : n;\n        const snappedMax = Math.abs(snappedMin - max) <= step / 2 ? max : snappedMin;\n        return Math.max(min, Math.min(max, snappedMax));\n      };\n\n      const setVisual = (lo, hi) => {\n        const span = max - min;\n        const loPct = span === 0 ? 0 : ((lo - min) / span) * 100;\n        const hiPct = span === 0 ? 100 : ((hi - min) / span) * 100;\n        track.style.setProperty('--min-pct', String(Math.max(0, Math.min(100, loPct))));\n        track.style.setProperty('--max-pct', String(Math.max(0, Math.min(100, hiPct))));\n      };\n\n      const commitBoth = (lo, hi) => {\n        const nextLo = clampTo(lo);\n        const nextHi = clampTo(hi);\n        if (nextLo == null || nextHi == null) return;\n        const orderedLo = Math.min(nextLo, nextHi);\n        const orderedHi = Math.max(nextLo, nextHi);\n        aInput.value = String(orderedLo);\n        bInput.value = String(orderedHi);\n        setVisual(orderedLo, orderedHi);\n        emitRangeChange(orderedLo, orderedHi);\n      };\n\n      const seedLo = clampTo(value?.[0] ?? min) ?? min;\n      const seedHi = clampTo(value?.[1] ?? max) ?? max;\n      const lo0 = Math.min(seedLo, seedHi);\n      const hi0 = Math.max(seedLo, seedHi);\n      aInput.value = String(lo0);\n      bInput.value = String(hi0);\n      setVisual(lo0, hi0);\n      const emitRangeChange = createFpsThrottle((lo, hi) => {\n        onChange?.([lo, hi]);\n      });\n\n      const commit = (source) => {\n        const a = clampTo(aInput.value);\n        const b = clampTo(bInput.value);\n        if (a == null || b == null) return;\n        const lo = Math.min(a, b);\n        const hi = Math.max(a, b);\n        // Keep thumbs from crossing visually.\n        if (source === 'a' && a > hi) aInput.value = String(hi);\n        if (source === 'b' && b < lo) bInput.value = String(lo);\n        setVisual(lo, hi);\n        emitRangeChange(lo, hi);\n      };\n\n      // Dragging the highlighted range pans both thumbs together.\n      const onRangePointerDown = (event) => {\n        // Only handle primary pointer interactions.\n        if (event.button != null && event.button !== 0) return;\n        event.preventDefault();\n\n        const rect = track.getBoundingClientRect();\n        const widthPx = Math.max(1, rect.width);\n        const domainSpan = max - min;\n        if (!Number.isFinite(domainSpan) || Math.abs(domainSpan) < 1e-9) return;\n\n        const startX = event.clientX;\n        const startA = clampTo(aInput.value) ?? min;\n        const startB = clampTo(bInput.value) ?? max;\n        const startLo = Math.min(startA, startB);\n        const startHi = Math.max(startA, startB);\n        const rangeSpan = startHi - startLo;\n\n        const clampRangeToBounds = (lo, hi) => {\n          let nextLo = lo;\n          let nextHi = hi;\n          if (nextLo < min) {\n            const shift = min - nextLo;\n            nextLo = min;\n            nextHi += shift;\n          }\n          if (nextHi > max) {\n            const shift = nextHi - max;\n            nextHi = max;\n            nextLo -= shift;\n          }\n          // If span is larger than domain (shouldn't happen), fall back.\n          if (nextLo < min) nextLo = min;\n          if (nextHi > max) nextHi = max;\n          // Preserve original span when possible.\n          if (Number.isFinite(rangeSpan) && rangeSpan >= 0) {\n            const currentSpan = nextHi - nextLo;\n            if (currentSpan !== rangeSpan) {\n              nextHi = Math.min(max, nextLo + rangeSpan);\n              nextLo = Math.max(min, nextHi - rangeSpan);\n            }\n          }\n          return [nextLo, nextHi];\n        };\n\n        const onMove = (moveEvent) => {\n          const dx = moveEvent.clientX - startX;\n          const delta = (dx / widthPx) * domainSpan;\n          if (!Number.isFinite(delta)) return;\n          const [nextLo, nextHi] = clampRangeToBounds(startLo + delta, startHi + delta);\n          commitBoth(nextLo, nextHi);\n        };\n\n        const onUp = () => {\n          window.removeEventListener('pointermove', onMove);\n          window.removeEventListener('pointerup', onUp);\n          window.removeEventListener('pointercancel', onUp);\n          emitRangeChange.flush();\n        };\n\n        window.addEventListener('pointermove', onMove);\n        window.addEventListener('pointerup', onUp);\n        window.addEventListener('pointercancel', onUp);\n      };\n      if (allowRangeDrag) {\n        rangeEl.addEventListener('pointerdown', onRangePointerDown);\n      }\n\n      aInput.style.zIndex = '2';\n      bInput.style.zIndex = '3';\n      aInput.addEventListener('input', () => commit('a'));\n      bInput.addEventListener('input', () => commit('b'));\n\n      track.appendChild(aInput);\n      track.appendChild(bInput);\n      wrap.appendChild(track);\n\n      return { element: wrap, setVisual: (lo, hi) => setVisual(lo, hi), aInput, bInput };\n    };\n\n    const resolveLiveConfig = (mode, channel) => {\n      const collection = resolveCollection(mode);\n      const mapper = collection?.defaultMapper ?? null;\n      if (!mapper || typeof mapper.getChannel !== 'function') return null;\n      return shallowCloneChannelConfig(mapper.getChannel(channel));\n    };\n\n    const applyConfig = (mode, channel, config) => {\n      const collection = resolveCollection(mode);\n      const mapper = collection?.defaultMapper ?? null;\n      if (!collection || !mapper || typeof mapper.setChannel !== 'function') return false;\n      mapper.setChannel(channel, config);\n      collection.touch?.();\n      return true;\n    };\n\n    const createModeTab = (mode) => {\n      const root = document.createElement('div');\n\n      const state = {\n        channel: (mode === 'edge' ? (options.defaultEdgeChannel ?? 'color') : (options.defaultNodeChannel ?? 'color')),\n        pending: null,\n        dirty: false,\n      };\n\n      const channels = mode === 'edge' ? edgeChannels : nodeChannels;\n      if (!channels.includes(state.channel)) state.channel = channels[0];\n\n      const editorStack = new PanelStack();\n      const editorBody = document.createElement('div');\n      editorStack.add({ id: `${mode}-mapper-basic`, title: 'Editor', content: editorBody });\n      root.appendChild(editorStack.element);\n      this._controlCleanups.add(() => editorStack.destroy());\n\n      const applyRow = document.createElement('div');\n      applyRow.style.display = 'flex';\n      applyRow.style.justifyContent = 'flex-end';\n      applyRow.style.gap = '8px';\n\n      const revertButton = document.createElement('button');\n      revertButton.type = 'button';\n      revertButton.className = 'helios-ui-button';\n      revertButton.textContent = 'Revert';\n\n      const applyButton = document.createElement('button');\n      applyButton.type = 'button';\n      applyButton.className = 'helios-ui-button';\n      applyButton.textContent = 'Apply';\n\n      applyRow.appendChild(revertButton);\n      applyRow.appendChild(applyButton);\n      root.appendChild(applyRow);\n\n      const canApplyPending = () => {\n        if (!state.pending) return false;\n        const collection = resolveCollection(mode);\n        const mapper = collection?.defaultMapper ?? null;\n        if (!collection || !mapper || typeof mapper.setChannel !== 'function') return false;\n\n        // If the editor can't fully represent the config, treat it as a custom mapper.\n        const rawType = state.pending.type ?? state.pending.mode ?? null;\n        const type = isEditorTransferableConfig(state.pending) ? (rawType ?? 'passthrough') : 'custom';\n\n        if (mode === 'node' && state.channel === 'position' && type === 'layout') {\n          const scheduler = helios?.scheduler ?? null;\n          if (!scheduler || typeof scheduler.setLayoutEnabled !== 'function') return false;\n          return Boolean(scheduler.layout);\n        }\n\n        if (type === 'passthrough') {\n          return typeof state.pending.attributes === 'string' && state.pending.attributes.length > 0;\n        }\n\n        if (type === 'nodeAttribute') {\n          return typeof state.pending.nodeAttribute === 'string' && state.pending.nodeAttribute.length > 0;\n        }\n\n        if (type === 'constant') {\n          const v = state.pending.value;\n          const isArrayLike = Array.isArray(v) || ArrayBuffer.isView(v);\n          if (mode === 'node' && state.channel === 'position') {\n            return isArrayLike && v.length === 3 && Array.from(v).every((x) => Number.isFinite(x));\n          }\n          if (isArrayLike) return v.length === 3 || v.length === 4;\n          if (v && typeof v === 'object') {\n            if (mode === 'edge') {\n              if (state.channel === 'color') {\n                const src = v.source ?? v.start ?? null;\n                const dst = v.target ?? v.end ?? null;\n                if (src != null && !isHexColorString(String(src))) return false;\n                if (dst != null && !isHexColorString(String(dst))) return false;\n                return src != null || dst != null;\n              }\n              if (state.channel === 'width' || state.channel === 'opacity' || state.channel === 'endpointSize') {\n                const src = Number(v.source ?? v.start);\n                const dst = Number(v.target ?? v.end);\n                const srcOk = Number.isFinite(src);\n                const dstOk = Number.isFinite(dst);\n                return srcOk || dstOk;\n              }\n            }\n            return false;\n          }\n          if (typeof v === 'number') return Number.isFinite(v);\n          if (typeof v === 'string') return isHexColorString(v);\n          return false;\n        }\n\n        if (type === 'linear') {\n          if (!(typeof state.pending.attributes === 'string' && state.pending.attributes.length > 0)) return false;\n          const domain = state.pending.domain;\n          const range = state.pending.range;\n          const domainOk = Array.isArray(domain) && domain.length === 2 && domain.every((x) => Number.isFinite(x));\n          const rangeOk = Array.isArray(range) && range.length === 2 && range.every((x) => Number.isFinite(x));\n          return domainOk && rangeOk;\n        }\n\n        if (type === 'colormap') {\n          if (!(typeof state.pending.attributes === 'string' && state.pending.attributes.length > 0)) return false;\n          if (!(typeof state.pending.colormap === 'string' && state.pending.colormap.length > 0)) return false;\n          return true;\n        }\n\n        if (type === 'custom') {\n          return true;\n        }\n\n        return true;\n      };\n\n      const syncApplyEnabled = () => {\n        applyButton.disabled = !canApplyPending();\n      };\n\n      const setDirty = (dirty) => {\n        state.dirty = Boolean(dirty);\n        syncApplyEnabled();\n      };\n\n\n      const resolveAllowedTypes = (channel) => {\n        if (mode === 'node' && channel === 'position') return ['layout', 'constant', 'passthrough'];\n        const isColor = channel === 'color' || channel === 'outlineColor';\n        const isScalar =\n          channel === 'size' ||\n          channel === 'outline' ||\n          channel === 'width' ||\n          channel === 'opacity' ||\n          channel === 'endpointSize';\n        if (mode === 'edge' && isColor) return ['constant', 'passthrough', 'nodeAttribute', 'colormap'];\n        if (mode === 'edge' && isScalar) return ['constant', 'passthrough', 'nodeAttribute', 'linear'];\n        if (isColor) return ['constant', 'passthrough', 'colormap'];\n        if (isScalar) return ['constant', 'passthrough', 'linear'];\n        // MVP: other channels are passthrough only.\n        return ['passthrough'];\n      };\n\n      const renderEditor = () => {\n        editorBody.textContent = '';\n        const live = resolveLiveConfig(mode, state.channel);\n\n        if (!state.pending) {\n          if (mode === 'node' && state.channel === 'position') {\n            const scheduler = helios?.scheduler ?? null;\n            const hasLayout = Boolean(scheduler?.layout);\n            const layoutState = typeof scheduler?.getLayoutState === 'function'\n              ? scheduler.getLayoutState()\n              : (scheduler?.layoutEnabled !== false ? 'running' : 'stopped');\n            const layoutEnabled = hasLayout && layoutState !== 'stopped';\n            state.pending = layoutEnabled ? { name: state.channel, type: 'layout' } : (shallowCloneChannelConfig(live) ?? { name: state.channel });\n          } else {\n            state.pending = shallowCloneChannelConfig(live) ?? { name: state.channel };\n          }\n        }\n\n        const allowedTypes = resolveAllowedTypes(state.channel);\n        const customPresets = getCustomPresetMap(mode, state.channel);\n\n        // Decide current selection first, registering custom presets before building the dropdown.\n        const resolveCurrentTypeKey = () => {\n          const pendingType = state.pending?.type ?? state.pending?.mode ?? null;\n\n          if (pendingType === 'layout' && allowedTypes.includes('layout')) return 'layout';\n\n          if (state.pending && isEditorTransferableConfig(state.pending) && allowedTypes.includes(pendingType)) {\n            return pendingType;\n          }\n\n          const candidate = state.pending ?? live;\n          if (candidate && !isEditorTransferableConfig(candidate)) {\n            const id = registerCustomPreset(mode, state.channel, candidate);\n            if (id) return `custom:${id}`;\n          }\n\n          // If live is custom but pending isn't set yet, ensure the live custom preset exists.\n          if (live && !isEditorTransferableConfig(live)) {\n            const id = registerCustomPreset(mode, state.channel, live);\n            if (id) return `custom:${id}`;\n          }\n\n          return allowedTypes[0];\n        };\n\n        const currentKey = resolveCurrentTypeKey();\n\n        const typeSelect = document.createElement('select');\n        typeSelect.className = 'helios-ui-select';\n\n        for (const t of allowedTypes) {\n          const opt = document.createElement('option');\n          opt.value = t;\n          opt.textContent = MAPPER_TYPE_LABELS[t] ?? t;\n          typeSelect.appendChild(opt);\n        }\n\n        for (const preset of customPresets.values()) {\n          const opt = document.createElement('option');\n          opt.value = `custom:${preset.id}`;\n          const label = typeof preset.label === 'string' ? preset.label.trim() : '';\n          opt.textContent = label && label.toLowerCase() !== 'custom' ? `Custom: ${label}` : 'Custom';\n          typeSelect.appendChild(opt);\n        }\n\n        const availableKeys = [\n          ...allowedTypes,\n          ...Array.from(customPresets.keys()).map((id) => `custom:${id}`),\n        ];\n        typeSelect.value = availableKeys.includes(currentKey) ? currentKey : availableKeys[0];\n\n        const setPendingType = (nextType) => {\n          const prev = state.pending ?? {};\n          const base = nextType === 'layout'\n            ? { name: state.channel, type: nextType }\n            : {\n              name: state.channel,\n              type: nextType,\n              attributes: prev.attributes ?? live?.attributes ?? live?.from,\n              defaultValue: prev.defaultValue ?? live?.defaultValue,\n            };\n          if (nextType === 'constant') {\n            base.value = prev.value ?? live?.value;\n          }\n          if (nextType === 'passthrough') {\n            // nothing else\n          }\n          if (nextType === 'nodeAttribute') {\n            base.nodeAttribute = prev.nodeAttribute ?? live?.nodeAttribute ?? '';\n            base.endpoints = prev.endpoints ?? live?.endpoints ?? 'both';\n            if (!base.nodeAttribute) {\n              const isColorChannel = state.channel === 'color' || state.channel === 'outlineColor';\n              base.nodeAttribute = isColorChannel ? 'color' : 'size';\n            }\n            base.attributes = [`@node.${base.nodeAttribute}`];\n          }\n          if (nextType === 'linear') {\n            const attr = typeof base.attributes === 'string' ? base.attributes : null;\n            base.transformType = prev.transformType ?? live?.transformType ?? 'linear';\n            base.transformPower = prev.transformPower ?? live?.transformPower ?? 1;\n            base.domain = Array.isArray(prev.domain)\n              ? prev.domain\n              : (Array.isArray(live?.domain) ? live.domain : suggestDomainForAttribute(mode, attr));\n            const suggested = suggestRangeForChannel(mode, state.channel);\n            base.range = Array.isArray(prev.range) ? prev.range : (Array.isArray(live?.range) ? live.range : suggested);\n          }\n          if (nextType === 'colormap') {\n            base.colormap = prev.colormap ?? live?.colormap ?? 'interpolateInferno';\n            const attr = typeof base.attributes === 'string' ? base.attributes : null;\n            base.transformType = prev.transformType ?? live?.transformType ?? 'linear';\n            base.transformPower = prev.transformPower ?? live?.transformPower ?? 1;\n            base.domain = Array.isArray(prev.domain)\n              ? prev.domain\n              : (Array.isArray(live?.domain) ? live.domain : suggestDomainForAttribute(mode, attr));\n            base.alpha = prev.alpha ?? live?.alpha ?? 1;\n            base.clamp = prev.clamp ?? live?.clamp ?? true;\n          }\n          state.pending = base;\n          setDirty(true);\n          renderEditor();\n        };\n\n        typeSelect.addEventListener('change', () => {\n          const next = typeSelect.value;\n          if (next.startsWith('custom:')) {\n            const id = next.slice('custom:'.length);\n            const preset = customPresets.get(id) ?? null;\n            if (preset?.config) {\n              state.pending = shallowCloneChannelConfig(preset.config) ?? preset.config;\n              setDirty(true);\n              renderEditor();\n            }\n            return;\n          }\n          pruneEphemeralCustomPresets(mode, state.channel);\n          setPendingType(next);\n        });\n\n        editorBody.appendChild(createAlignedRowEl({ title: 'Type', controls: typeSelect }).row);\n\n        const pendingTypeKey = typeSelect.value;\n        const pendingType = pendingTypeKey.startsWith('custom:') ? 'custom' : pendingTypeKey;\n        const isColor = state.channel === 'color' || state.channel === 'outlineColor';\n        const isScalar =\n          state.channel === 'size' ||\n          state.channel === 'outline' ||\n          state.channel === 'width' ||\n          state.channel === 'opacity' ||\n          state.channel === 'endpointSize';\n        const isPosition = mode === 'node' && state.channel === 'position';\n\n        if (pendingType === 'layout') {\n          const note = document.createElement('div');\n          note.style.color = 'var(--helios-ui-muted)';\n          note.textContent = 'Uses the active layout (no position mapper applied).';\n          editorBody.appendChild(note);\n        }\n\n        if (pendingType === 'custom') {\n          const meta = state.pending?.meta && typeof state.pending.meta === 'object' ? state.pending.meta : {};\n          const description = typeof meta.description === 'string' ? meta.description : '';\n          const source = typeof meta.source === 'string' ? meta.source : '';\n\n          const descEl = document.createElement('div');\n          descEl.style.whiteSpace = 'pre-wrap';\n          descEl.style.color = 'var(--helios-ui-muted)';\n          descEl.textContent = description || '—';\n          editorBody.appendChild(createAlignedRowEl({ title: 'Description', controls: descEl }).row);\n\n          const srcEl = document.createElement('div');\n          srcEl.style.whiteSpace = 'pre-wrap';\n          srcEl.style.color = 'var(--helios-ui-muted)';\n          srcEl.textContent = source || '—';\n          editorBody.appendChild(createAlignedRowEl({ title: 'Source', controls: srcEl }).row);\n        }\n\n        if (pendingType === 'passthrough') {\n          const attrSelect = document.createElement('select');\n          attrSelect.className = 'helios-ui-select';\n          const names = listAttributeNames(mode, { channel: state.channel, mapperType: 'passthrough' });\n          const current = typeof state.pending.attributes === 'string'\n            ? state.pending.attributes\n            : (typeof live?.attributes === 'string' ? live.attributes : '');\n          const optBlank = document.createElement('option');\n          optBlank.value = '';\n          optBlank.textContent = names.length ? 'Select attribute…' : 'No attributes';\n          attrSelect.appendChild(optBlank);\n          for (const name of names) {\n            const opt = document.createElement('option');\n            opt.value = name;\n            opt.textContent = name;\n            attrSelect.appendChild(opt);\n          }\n          attrSelect.value = names.includes(current) ? current : '';\n          attrSelect.addEventListener('change', () => {\n            state.pending = { ...state.pending, type: 'passthrough', attributes: attrSelect.value || undefined };\n            setDirty(true);\n          });\n          editorBody.appendChild(createAlignedRowEl({ title: 'Attribute', controls: attrSelect }).row);\n        }\n\n        if (pendingType === 'nodeAttribute') {\n          const attrSelect = document.createElement('select');\n          attrSelect.className = 'helios-ui-select';\n          const names = listAttributeNames('node', { channel: state.channel, mapperType: 'nodeAttribute' });\n          const current = typeof state.pending.nodeAttribute === 'string'\n            ? state.pending.nodeAttribute\n            : (typeof live?.nodeAttribute === 'string' ? live.nodeAttribute : '');\n\n          const optBlank = document.createElement('option');\n          optBlank.value = '';\n          optBlank.textContent = names.length ? 'Select node attribute…' : 'No node attributes';\n          attrSelect.appendChild(optBlank);\n\n          for (const name of names) {\n            const bare = name.startsWith('@node.') ? name.slice('@node.'.length) : name;\n            if (bare === '$index') continue;\n            const opt = document.createElement('option');\n            opt.value = bare;\n            opt.textContent = bare;\n            attrSelect.appendChild(opt);\n          }\n\n          attrSelect.value = current || '';\n          attrSelect.addEventListener('change', () => {\n            const bare = attrSelect.value || undefined;\n            state.pending = {\n              ...state.pending,\n              type: 'nodeAttribute',\n              nodeAttribute: bare,\n              endpoints: state.pending.endpoints ?? 'both',\n              attributes: bare ? [`@node.${bare}`] : undefined,\n            };\n            setDirty(true);\n          });\n          editorBody.appendChild(createAlignedRowEl({ title: 'From/To', controls: attrSelect }).row);\n        }\n\n        if (pendingType === 'constant' && isScalar) {\n          const wrap = document.createElement('div');\n          wrap.style.display = 'grid';\n          wrap.style.gap = '6px';\n          wrap.style.width = '100%';\n\n          const minAllowed = (() => {\n            if (state.channel === 'opacity') return 0;\n            if (state.channel === 'size' || state.channel === 'outline' || state.channel === 'width' || state.channel === 'endpointSize') return 0;\n            return null;\n          })();\n          const maxAllowed = state.channel === 'opacity' ? 1 : null;\n\n          const [suggestMin, suggestMax] = suggestRangeForChannel(mode, state.channel);\n          const step = suggestStepForRange(suggestMin, suggestMax);\n\n          const isEdgeSplitCapable = mode === 'edge' && (state.channel === 'width' || state.channel === 'opacity' || state.channel === 'endpointSize');\n          const pendingValue = state.pending.value ?? live?.value;\n          const isSplit =\n            isEdgeSplitCapable &&\n            pendingValue &&\n            typeof pendingValue === 'object' &&\n            ('source' in pendingValue || 'target' in pendingValue);\n\n          if (isEdgeSplitCapable) {\n            const toggle = createSegmentedToggleControl({\n              checked: Boolean(isSplit),\n              onLabel: 'Source/Target',\n              offLabel: 'Single',\n            });\n            wrap.appendChild(toggle);\n\n            toggle.addEventListener('change', () => {\n              const raw = state.pending.value ?? live?.value;\n              const seed = Number.isFinite(Number(raw)) ? Number(raw) : 1;\n              if (toggle.checked) {\n                state.pending = { ...state.pending, type: 'constant', value: { source: seed, target: seed } };\n              } else {\n                const src = raw && typeof raw === 'object' ? Number(raw.source ?? raw.start) : seed;\n                const next = Number.isFinite(src) ? src : seed;\n                state.pending = { ...state.pending, type: 'constant', value: next };\n              }\n              setDirty(true);\n              renderEditor();\n            });\n          }\n\n          const commit = (value, endpoint) => {\n            const n = clampNumber(value, { min: minAllowed, max: maxAllowed });\n            if (n == null) return;\n\n            if (isSplit) {\n              const current = state.pending.value && typeof state.pending.value === 'object' ? state.pending.value : {};\n              const next = endpoint === 'target'\n                ? { ...current, target: n }\n                : { ...current, source: n };\n              state.pending = { ...state.pending, type: 'constant', value: next };\n            } else {\n              state.pending = { ...state.pending, type: 'constant', value: n };\n            }\n            setDirty(true);\n          };\n\n          if (isSplit) {\n            const labelStyle = (el) => {\n              el.style.fontSize = '12px';\n              el.style.color = 'var(--helios-ui-muted)';\n            };\n\n            const sourceLabel = document.createElement('div');\n            sourceLabel.textContent = 'Source';\n            labelStyle(sourceLabel);\n            wrap.appendChild(sourceLabel);\n\n            const srcSeed = Number(pendingValue?.source ?? pendingValue?.start ?? 1);\n            const srcValue = Number.isFinite(srcSeed) ? srcSeed : 1;\n            wrap.appendChild(createSuggestedSliderControls({\n              value: srcValue,\n              suggested: [suggestMin, suggestMax],\n              step,\n              inputMin: minAllowed,\n              inputMax: maxAllowed,\n              onCommit: (v) => commit(v, 'source'),\n            }).element);\n\n            const targetLabel = document.createElement('div');\n            targetLabel.textContent = 'Target';\n            labelStyle(targetLabel);\n            wrap.appendChild(targetLabel);\n\n            const dstSeed = Number(pendingValue?.target ?? pendingValue?.end ?? srcValue);\n            const dstValue = Number.isFinite(dstSeed) ? dstSeed : srcValue;\n            wrap.appendChild(createSuggestedSliderControls({\n              value: dstValue,\n              suggested: [suggestMin, suggestMax],\n              step,\n              inputMin: minAllowed,\n              inputMax: maxAllowed,\n              onCommit: (v) => commit(v, 'target'),\n            }).element);\n          } else {\n            const fallbackValue = Number.isFinite(Number(live?.value)) ? Number(live.value) : 1;\n            const seeded = Number.isFinite(Number(state.pending.value)) ? Number(state.pending.value) : fallbackValue;\n            if (!Number.isFinite(Number(state.pending.value))) {\n              state.pending = { ...state.pending, type: 'constant', value: seeded };\n            }\n            wrap.appendChild(createSuggestedSliderControls({\n              value: seeded,\n              suggested: [suggestMin, suggestMax],\n              step,\n              inputMin: minAllowed,\n              inputMax: maxAllowed,\n              onCommit: (v) => commit(v),\n            }).element);\n          }\n\n          editorBody.appendChild(createAlignedRowEl({ title: 'Value', controls: wrap }).row);\n        }\n\n        if (pendingType === 'constant' && isPosition) {\n          const wrap = document.createElement('div');\n          wrap.style.display = 'flex';\n          wrap.style.gap = '8px';\n\n          const makeNum = () => {\n            const input = document.createElement('input');\n            input.type = 'number';\n            input.className = 'helios-ui-number';\n            return input;\n          };\n\n          const xInput = makeNum();\n          const yInput = makeNum();\n          const zInput = makeNum();\n\n          const seeded = (() => {\n            const v = state.pending.value ?? live?.value;\n            const isArrayLike = Array.isArray(v) || ArrayBuffer.isView(v);\n            if (isArrayLike && v.length >= 3) {\n              const x = Number(v[0]);\n              const y = Number(v[1]);\n              const z = Number(v[2]);\n              if (Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z)) return [x, y, z];\n            }\n            return [0, 0, 0];\n          })();\n\n          if (!Array.isArray(state.pending.value) && !ArrayBuffer.isView(state.pending.value)) {\n            state.pending = { ...state.pending, type: 'constant', value: seeded };\n          }\n\n          xInput.value = String(seeded[0]);\n          yInput.value = String(seeded[1]);\n          zInput.value = String(seeded[2]);\n\n          const commit = () => {\n            const x = clampNumber(xInput.value);\n            const y = clampNumber(yInput.value);\n            const z = clampNumber(zInput.value);\n            if (x == null || y == null || z == null) return;\n            state.pending = { ...state.pending, type: 'constant', value: [x, y, z] };\n            setDirty(true);\n          };\n          xInput.addEventListener('change', commit);\n          yInput.addEventListener('change', commit);\n          zInput.addEventListener('change', commit);\n\n          wrap.appendChild(xInput);\n          wrap.appendChild(yInput);\n          wrap.appendChild(zInput);\n          editorBody.appendChild(createAlignedRowEl({ title: 'Value', controls: wrap }).row);\n        }\n\n        if (pendingType === 'constant' && isColor) {\n          const wrap = document.createElement('div');\n          wrap.style.display = 'grid';\n          wrap.style.gap = '6px';\n          wrap.style.width = '100%';\n\n          const isEdgeSplitCapable = mode === 'edge' && state.channel === 'color';\n          const pendingValue = state.pending.value ?? live?.value;\n          const isSplit =\n            isEdgeSplitCapable &&\n            pendingValue &&\n            typeof pendingValue === 'object' &&\n            ('source' in pendingValue || 'target' in pendingValue);\n\n          const seedSingle = () => {\n            const seed = typeof pendingValue === 'string'\n              ? pendingValue\n              : (typeof live?.value === 'string' ? live.value : '#ffffff');\n            return typeof seed === 'string' && seed.length ? seed : '#ffffff';\n          };\n\n          if (isEdgeSplitCapable) {\n            const toggle = createSegmentedToggleControl({\n              checked: Boolean(isSplit),\n              onLabel: 'Source/Target',\n              offLabel: 'Single',\n            });\n            wrap.appendChild(toggle);\n\n            toggle.addEventListener('change', () => {\n              const seed = seedSingle();\n              if (toggle.checked) {\n                state.pending = { ...state.pending, type: 'constant', value: { source: seed, target: seed } };\n              } else {\n                const raw = state.pending.value ?? live?.value;\n                const next = raw && typeof raw === 'object' ? String(raw.source ?? raw.start ?? seed) : seed;\n                state.pending = { ...state.pending, type: 'constant', value: next };\n              }\n              setDirty(true);\n              renderEditor();\n            });\n          }\n\n          const makeColorControls = ({ label, getValue, setValue }) => {\n            const row = document.createElement('div');\n            row.style.display = 'flex';\n            row.style.gap = '8px';\n            row.style.alignItems = 'center';\n            row.style.width = '100%';\n\n            if (label) {\n              const labelEl = document.createElement('div');\n              labelEl.textContent = label;\n              labelEl.style.fontSize = '12px';\n              labelEl.style.color = 'var(--helios-ui-muted)';\n              labelEl.style.minWidth = '52px';\n              row.appendChild(labelEl);\n            }\n\n            const swatchWrap = document.createElement('div');\n            swatchWrap.className = 'helios-ui-color-swatch';\n\n            const swatch = document.createElement('div');\n            swatch.className = 'helios-ui-color-swatch__swatch';\n\n            const colorInput = document.createElement('input');\n            colorInput.type = 'color';\n            colorInput.className = 'helios-ui-color-swatch__input';\n            colorInput.setAttribute('aria-label', label ? `${label} color` : 'Color');\n\n            const alphaInput = document.createElement('input');\n            alphaInput.type = 'number';\n            alphaInput.className = 'helios-ui-number';\n            alphaInput.min = '0';\n            alphaInput.max = '1';\n            alphaInput.step = '0.01';\n            alphaInput.style.maxWidth = '88px';\n            alphaInput.title = 'Alpha';\n\n            const alphaLabel = document.createElement('span');\n            alphaLabel.textContent = 'Alpha';\n            alphaLabel.style.color = 'var(--helios-ui-muted)';\n\n            const rawValue = getValue();\n            const liveColor = typeof rawValue === 'string' ? rawValue : '#ffffff';\n            const raw = liveColor.startsWith('#') ? liveColor.slice(1) : liveColor;\n            const baseHex = raw.length >= 6 ? `#${raw.slice(0, 6)}` : '#ffffff';\n            const alphaHex = raw.length === 8 ? raw.slice(6, 8) : 'ff';\n            const alpha = Math.round(parseInt(alphaHex, 16) / 255 * 100) / 100;\n\n            colorInput.value = baseHex;\n            alphaInput.value = String(Number.isFinite(alpha) ? alpha : 1);\n            swatch.style.background = colorInput.value;\n\n            const commit = () => {\n              const a = clampNumber(alphaInput.value, { min: 0, max: 1 });\n              if (a == null) return;\n              setValue(toHex8(colorInput.value, a));\n              setDirty(true);\n              swatch.style.background = colorInput.value;\n            };\n            colorInput.addEventListener('input', commit);\n            alphaInput.addEventListener('change', commit);\n\n            swatchWrap.appendChild(swatch);\n            swatchWrap.appendChild(colorInput);\n            row.appendChild(swatchWrap);\n            row.appendChild(alphaLabel);\n            row.appendChild(alphaInput);\n            return row;\n          };\n\n          if (isSplit) {\n            if (!state.pending.value || typeof state.pending.value !== 'object') {\n              const seed = seedSingle();\n              state.pending = { ...state.pending, type: 'constant', value: { source: seed, target: seed } };\n            }\n            wrap.appendChild(makeColorControls({\n              label: 'Source',\n              getValue: () => String(state.pending.value?.source ?? seedSingle()),\n              setValue: (v) => {\n                state.pending = { ...state.pending, type: 'constant', value: { ...(state.pending.value ?? {}), source: v } };\n              },\n            }));\n            wrap.appendChild(makeColorControls({\n              label: 'Target',\n              getValue: () => String(state.pending.value?.target ?? state.pending.value?.source ?? seedSingle()),\n              setValue: (v) => {\n                state.pending = { ...state.pending, type: 'constant', value: { ...(state.pending.value ?? {}), target: v } };\n              },\n            }));\n            editorBody.appendChild(createAlignedRowEl({ title: 'Color', controls: wrap }).row);\n          } else {\n            if (!(typeof state.pending.value === 'string' && state.pending.value.length > 0)) {\n              state.pending = { ...state.pending, type: 'constant', value: seedSingle() };\n            }\n            wrap.appendChild(makeColorControls({\n              label: null,\n              getValue: () => String(state.pending.value ?? seedSingle()),\n              setValue: (v) => {\n                state.pending = { ...state.pending, type: 'constant', value: v };\n              },\n            }));\n            editorBody.appendChild(createAlignedRowEl({ title: 'Color', controls: wrap }).row);\n          }\n        }\n\n        if (pendingType === 'linear') {\n          const srcRow = document.createElement('div');\n          srcRow.style.display = 'grid';\n          srcRow.style.gap = '6px';\n\n          const attrSelect = document.createElement('select');\n          attrSelect.className = 'helios-ui-select';\n          const names = listAttributeNames(mode, { channel: state.channel, mapperType: 'linear' });\n          const current = typeof state.pending.attributes === 'string'\n            ? state.pending.attributes\n            : (typeof live?.attributes === 'string' ? live.attributes : '');\n          const optBlank = document.createElement('option');\n          optBlank.value = '';\n          optBlank.textContent = names.length ? 'Select attribute…' : 'No attributes';\n          attrSelect.appendChild(optBlank);\n          for (const name of names) {\n            const opt = document.createElement('option');\n            opt.value = name;\n            opt.textContent = name;\n            attrSelect.appendChild(opt);\n          }\n          attrSelect.value = names.includes(current) ? current : '';\n          attrSelect.addEventListener('change', () => {\n            const attr = attrSelect.value || undefined;\n            const domain = attr ? suggestDomainForAttribute(mode, attr) : [0, 1];\n            state.pending = { ...state.pending, type: 'linear', attributes: attr, domain };\n            setDirty(true);\n            renderEditor();\n          });\n          editorBody.appendChild(createAlignedRowEl({ title: 'Attribute', controls: attrSelect }).row);\n\n          const transformWrap = document.createElement('div');\n          transformWrap.style.display = 'flex';\n          transformWrap.style.gap = '8px';\n          transformWrap.style.alignItems = 'center';\n\n          const transformSelect = document.createElement('select');\n          transformSelect.className = 'helios-ui-select';\n          for (const optVal of ['linear', 'log', 'log1p', 'logit', 'power', 'percentile']) {\n            const opt = document.createElement('option');\n            opt.value = optVal;\n            opt.textContent = formatTransformLabel(optVal);\n            transformSelect.appendChild(opt);\n          }\n          const resolvedTransformType = state.pending.transformType === 'quantile'\n            ? 'percentile'\n            : (state.pending.transformType ?? 'linear');\n          transformSelect.value = String(resolvedTransformType);\n\n          const powerInput = document.createElement('input');\n          powerInput.type = 'number';\n          powerInput.className = 'helios-ui-number';\n          powerInput.style.maxWidth = '96px';\n          powerInput.value = String(Number.isFinite(Number(state.pending.transformPower)) ? state.pending.transformPower : 1);\n          powerInput.hidden = transformSelect.value !== 'power';\n\n          transformSelect.addEventListener('change', () => {\n            const nextType = transformSelect.value || 'linear';\n            const prevType = state.pending.transformType ?? 'linear';\n            powerInput.hidden = nextType !== 'power';\n            const nextPending = { ...state.pending, type: 'linear', transformType: nextType };\n            if (isPercentileTransform(nextType)) {\n              nextPending.domain = [0, 1];\n            } else if (isPercentileTransform(prevType)) {\n              const attr = typeof state.pending.attributes === 'string' ? state.pending.attributes : null;\n              nextPending.domain = attr ? suggestDomainForAttribute(mode, attr) : [0, 1];\n            }\n            state.pending = nextPending;\n            if (nextType !== 'power') {\n              state.pending = { ...state.pending, type: 'linear', transformPower: undefined };\n            } else {\n              state.pending = { ...state.pending, type: 'linear', transformPower: Number(powerInput.value) || 1 };\n            }\n            setDirty(true);\n            renderEditor();\n          });\n\n          powerInput.addEventListener('change', () => {\n            const p = clampNumber(powerInput.value);\n            if (p == null) return;\n            state.pending = { ...state.pending, type: 'linear', transformType: 'power', transformPower: p };\n            setDirty(true);\n            renderEditor();\n          });\n\n          transformWrap.appendChild(transformSelect);\n          transformWrap.appendChild(powerInput);\n          editorBody.appendChild(createAlignedRowEl({ title: 'Transform', controls: transformWrap }).row);\n\n          const domainWrap = document.createElement('div');\n          domainWrap.style.display = 'grid';\n          domainWrap.style.gap = '2px';\n          domainWrap.style.width = '100%';\n\n          const domainAttr = typeof state.pending.attributes === 'string' ? state.pending.attributes : null;\n          const transformType = state.pending.transformType ?? 'linear';\n          const percentile = isPercentileTransform(transformType);\n          const extent = percentile ? { min: 0, max: 1 } : computeScalarExtent(mode, domainAttr);\n          const min = extent?.min ?? 0;\n          const max = extent?.max ?? 1;\n          const isIntegerDomain = Boolean(extent?.isInteger);\n          const step = percentile ? 0.01 : suggestStepForRange(min, max, isIntegerDomain);\n\n          if (percentile && (!Array.isArray(state.pending.domain) || state.pending.domain[0] !== 0 || state.pending.domain[1] !== 1)) {\n            state.pending = { ...state.pending, type: 'linear', domain: [0, 1] };\n          } else if (!Array.isArray(state.pending.domain) && domainAttr) {\n            state.pending = { ...state.pending, type: 'linear', domain: [min, max] };\n          }\n          const domain = Array.isArray(state.pending.domain) ? state.pending.domain : [min, max];\n\n          const slider = createTwoHandleRange({\n            min,\n            max,\n            step,\n            value: domain,\n            onChange: (next) => {\n              state.pending = { ...state.pending, type: 'linear', domain: next };\n              setDirty(true);\n              d0.value = String(next[0]);\n              d1.value = String(next[1]);\n            },\n          });\n\n          const values = document.createElement('div');\n          values.className = 'helios-ui-range2__values';\n          const d0 = document.createElement('input');\n          d0.type = 'number';\n          d0.className = 'helios-ui-number';\n          d0.style.maxWidth = '96px';\n          const d1 = document.createElement('input');\n          d1.type = 'number';\n          d1.className = 'helios-ui-number';\n          d1.style.maxWidth = '96px';\n\n          d0.value = String(domain[0] ?? min);\n          d1.value = String(domain[1] ?? max);\n\n          const commitDomainTyped = () => {\n            const a = clampNumber(d0.value);\n            const b = clampNumber(d1.value);\n            if (a == null || b == null) return;\n            let lo = Math.min(a, b);\n            let hi = Math.max(a, b);\n            if (isIntegerDomain) {\n              lo = Math.round(lo);\n              hi = Math.round(hi);\n            }\n            const loSlider = Math.max(min, Math.min(max, lo));\n            const hiSlider = Math.max(min, Math.min(max, hi));\n            slider.aInput.value = String(loSlider);\n            slider.bInput.value = String(hiSlider);\n            slider.setVisual(loSlider, hiSlider);\n            state.pending = { ...state.pending, type: 'linear', domain: [lo, hi] };\n            setDirty(true);\n          };\n          d0.addEventListener('change', commitDomainTyped);\n          d1.addEventListener('change', commitDomainTyped);\n\n          values.appendChild(d0);\n          values.appendChild(d1);\n          domainWrap.appendChild(slider.element);\n          domainWrap.appendChild(values);\n          editorBody.appendChild(createAlignedRowEl({ title: 'Domain', controls: domainWrap }).row);\n\n          const rangeWrap = document.createElement('div');\n          rangeWrap.style.display = 'grid';\n          rangeWrap.style.gap = '6px';\n          rangeWrap.style.width = '100%';\n\n          const minAllowed = (() => {\n            if (state.channel === 'opacity') return 0;\n            if (state.channel === 'size' || state.channel === 'outline' || state.channel === 'width' || state.channel === 'endpointSize') return 0;\n            return null;\n          })();\n          const maxAllowed = state.channel === 'opacity' ? 1 : null;\n\n          const suggestedRange = suggestRangeForChannel(mode, state.channel);\n          const stepOut = suggestStepForRange(suggestedRange[0], suggestedRange[1]);\n\n          const range = Array.isArray(state.pending.range) ? state.pending.range : suggestedRange;\n          if (!Array.isArray(state.pending.range)) {\n            state.pending = { ...state.pending, type: 'linear', range };\n          }\n\n          const commitRangeAt = (idx, value) => {\n            const n = clampNumber(value, { min: minAllowed, max: maxAllowed });\n            if (n == null) return;\n            const current = Array.isArray(state.pending.range) ? state.pending.range : suggestedRange;\n            const next = [current[0], current[1]];\n            next[idx] = n;\n            state.pending = { ...state.pending, type: 'linear', range: next };\n            setDirty(true);\n          };\n\n          const labelStyle = (el) => {\n            el.style.fontSize = '12px';\n            el.style.color = 'var(--helios-ui-muted)';\n          };\n\n          const minLabel = document.createElement('div');\n          minLabel.textContent = 'Min';\n          labelStyle(minLabel);\n          rangeWrap.appendChild(minLabel);\n          rangeWrap.appendChild(createSuggestedSliderControls({\n            value: Number(range[0] ?? suggestedRange[0]),\n            suggested: [suggestedRange[0], suggestedRange[1]],\n            step: stepOut,\n            inputMin: minAllowed,\n            inputMax: maxAllowed,\n            onCommit: (v) => commitRangeAt(0, v),\n          }).element);\n\n          const maxLabel = document.createElement('div');\n          maxLabel.textContent = 'Max';\n          labelStyle(maxLabel);\n          rangeWrap.appendChild(maxLabel);\n          rangeWrap.appendChild(createSuggestedSliderControls({\n            value: Number(range[1] ?? suggestedRange[1]),\n            suggested: [suggestedRange[0], suggestedRange[1]],\n            step: stepOut,\n            inputMin: minAllowed,\n            inputMax: maxAllowed,\n            onCommit: (v) => commitRangeAt(1, v),\n          }).element);\n\n          editorBody.appendChild(createAlignedRowEl({ title: 'Range', controls: rangeWrap }).row);\n        }\n\n        if (pendingType === 'colormap') {\n          const attrSelect = document.createElement('select');\n          attrSelect.className = 'helios-ui-select';\n          const names = listAttributeNames(mode, { channel: state.channel, mapperType: 'colormap' });\n          const current = typeof state.pending.attributes === 'string'\n            ? state.pending.attributes\n            : (typeof live?.attributes === 'string' ? live.attributes : '');\n          const optBlank = document.createElement('option');\n          optBlank.value = '';\n          optBlank.textContent = names.length ? 'Select attribute…' : 'No attributes';\n          attrSelect.appendChild(optBlank);\n          for (const name of names) {\n            const opt = document.createElement('option');\n            opt.value = name;\n            opt.textContent = name;\n            attrSelect.appendChild(opt);\n          }\n          attrSelect.value = names.includes(current) ? current : '';\n          attrSelect.addEventListener('change', () => {\n            const attr = attrSelect.value || undefined;\n            const domain = attr ? suggestDomainForAttribute(mode, attr) : [0, 1];\n            state.pending = { ...state.pending, type: 'colormap', attributes: attr, domain };\n            setDirty(true);\n            renderEditor();\n          });\n          editorBody.appendChild(createAlignedRowEl({ title: 'Attribute', controls: attrSelect }).row);\n\n          const transformWrap = document.createElement('div');\n          transformWrap.style.display = 'flex';\n          transformWrap.style.gap = '8px';\n          transformWrap.style.alignItems = 'center';\n\n          const transformSelect = document.createElement('select');\n          transformSelect.className = 'helios-ui-select';\n          for (const optVal of ['linear', 'log', 'log1p', 'logit', 'power', 'percentile']) {\n            const opt = document.createElement('option');\n            opt.value = optVal;\n            opt.textContent = formatTransformLabel(optVal);\n            transformSelect.appendChild(opt);\n          }\n          const resolvedTransformType = state.pending.transformType === 'quantile'\n            ? 'percentile'\n            : (state.pending.transformType ?? 'linear');\n          transformSelect.value = String(resolvedTransformType);\n\n          const powerInput = document.createElement('input');\n          powerInput.type = 'number';\n          powerInput.className = 'helios-ui-number';\n          powerInput.style.maxWidth = '96px';\n          powerInput.value = String(Number.isFinite(Number(state.pending.transformPower)) ? state.pending.transformPower : 1);\n          powerInput.hidden = transformSelect.value !== 'power';\n\n          transformSelect.addEventListener('change', () => {\n            const nextType = transformSelect.value || 'linear';\n            const prevType = state.pending.transformType ?? 'linear';\n            powerInput.hidden = nextType !== 'power';\n            const nextPending = { ...state.pending, type: 'colormap', transformType: nextType };\n            if (isPercentileTransform(nextType)) {\n              nextPending.domain = [0, 1];\n            } else if (isPercentileTransform(prevType)) {\n              const attr = typeof state.pending.attributes === 'string' ? state.pending.attributes : null;\n              nextPending.domain = attr ? suggestDomainForAttribute(mode, attr) : [0, 1];\n            }\n            state.pending = nextPending;\n            if (nextType !== 'power') {\n              state.pending = { ...state.pending, type: 'colormap', transformPower: undefined };\n            } else {\n              state.pending = { ...state.pending, type: 'colormap', transformPower: Number(powerInput.value) || 1 };\n            }\n            setDirty(true);\n            renderEditor();\n          });\n\n          powerInput.addEventListener('change', () => {\n            const p = clampNumber(powerInput.value);\n            if (p == null) return;\n            state.pending = { ...state.pending, type: 'colormap', transformType: 'power', transformPower: p };\n            setDirty(true);\n            renderEditor();\n          });\n\n          transformWrap.appendChild(transformSelect);\n          transformWrap.appendChild(powerInput);\n          editorBody.appendChild(createAlignedRowEl({ title: 'Transform', controls: transformWrap }).row);\n\n          const nameWrap = document.createElement('div');\n          nameWrap.style.display = 'grid';\n          nameWrap.style.gap = '6px';\n          const colormapInput = document.createElement('input');\n          colormapInput.type = 'text';\n          colormapInput.className = 'helios-ui-text';\n          colormapInput.placeholder = 'interpolateInferno';\n          colormapInput.value = String(state.pending.colormap ?? 'interpolateInferno');\n\n          const datalistId = `helios-ui-colormap-datalist-${Math.random().toString(16).slice(2)}`;\n          const datalist = document.createElement('datalist');\n          datalist.id = datalistId;\n          for (const name of colormapNames) {\n            const opt = document.createElement('option');\n            opt.value = name;\n            datalist.appendChild(opt);\n          }\n          colormapInput.setAttribute('list', datalistId);\n          nameWrap.appendChild(colormapInput);\n          nameWrap.appendChild(datalist);\n\n          colormapInput.addEventListener('change', () => {\n            state.pending = { ...state.pending, type: 'colormap', colormap: colormapInput.value || 'interpolateInferno' };\n            setDirty(true);\n          });\n          editorBody.appendChild(createAlignedRowEl({ title: 'Colormap', controls: nameWrap }).row);\n\n          const domainWrap = document.createElement('div');\n          domainWrap.style.display = 'grid';\n          domainWrap.style.gap = '2px';\n          domainWrap.style.width = '100%';\n\n          const domainAttr = typeof state.pending.attributes === 'string' ? state.pending.attributes : null;\n          const transformType = state.pending.transformType ?? 'linear';\n          const percentile = isPercentileTransform(transformType);\n          const allowDivergent = !percentile;\n          const divergent = Boolean(state.pending.divergent) && allowDivergent;\n          const extent = percentile ? { min: 0, max: 1 } : computeScalarExtent(mode, domainAttr);\n          const min = extent?.min ?? 0;\n          const max = extent?.max ?? 1;\n          const extentAbs = divergent ? Math.max(Math.abs(min), Math.abs(max), 1) : null;\n          const sliderMin = divergent ? -extentAbs : min;\n          const sliderMax = divergent ? extentAbs : max;\n          const isIntegerDomain = Boolean(extent?.isInteger);\n          const step = percentile ? 0.01 : suggestStepForRange(sliderMin, sliderMax, isIntegerDomain);\n\n          if (percentile && (!Array.isArray(state.pending.domain) || state.pending.domain[0] !== 0 || state.pending.domain[1] !== 1)) {\n            state.pending = { ...state.pending, type: 'colormap', domain: [0, 1] };\n          } else if (!Array.isArray(state.pending.domain) && domainAttr) {\n            const nextDomain = divergent ? resolveDivergentDomain([min, max], extent) : [min, max];\n            state.pending = { ...state.pending, type: 'colormap', domain: nextDomain };\n          } else if (divergent && Array.isArray(state.pending.domain)) {\n            state.pending = { ...state.pending, type: 'colormap', domain: resolveDivergentDomain(state.pending.domain, extent) };\n          }\n\n          const domain = Array.isArray(state.pending.domain) ? state.pending.domain : (divergent ? resolveDivergentDomain([min, max], extent) : [min, max]);\n\n          const slider = createTwoHandleRange({\n            min: sliderMin,\n            max: sliderMax,\n            step,\n            value: domain,\n            allowRangeDrag: !divergent,\n            onChange: (next) => {\n              const prevDomain = Array.isArray(state.pending.domain) ? state.pending.domain : domain;\n            let nextDomain = divergent ? resolveDivergentDomainFromSlider(next, prevDomain) : next;\n            if (isIntegerDomain) {\n              nextDomain = [Math.round(nextDomain[0]), Math.round(nextDomain[1])];\n            }\n            state.pending = { ...state.pending, type: 'colormap', domain: nextDomain };\n            setDirty(true);\n            d0.value = String(nextDomain[0]);\n              d1.value = String(nextDomain[1]);\n              if (divergent) {\n                slider.aInput.value = String(nextDomain[0]);\n                slider.bInput.value = String(nextDomain[1]);\n                slider.setVisual(nextDomain[0], nextDomain[1]);\n              }\n            },\n          });\n\n          const values = document.createElement('div');\n          values.className = 'helios-ui-range2__values';\n          const d0 = document.createElement('input');\n          d0.type = 'number';\n          d0.className = 'helios-ui-number';\n          d0.style.maxWidth = '96px';\n          const d1 = document.createElement('input');\n          d1.type = 'number';\n          d1.className = 'helios-ui-number';\n          d1.style.maxWidth = '96px';\n\n          d0.value = String(domain[0] ?? min);\n          d1.value = String(domain[1] ?? max);\n\n          const commitDomainTyped = () => {\n            const a = clampNumber(d0.value);\n            const b = clampNumber(d1.value);\n            if (a == null || b == null) return;\n            let lo = Math.min(a, b);\n            let hi = Math.max(a, b);\n            if (isIntegerDomain) {\n              lo = Math.round(lo);\n              hi = Math.round(hi);\n            }\n            const maxAbs = divergent ? Math.max(Math.abs(lo), Math.abs(hi)) : null;\n            const nextDomain = divergent ? [-maxAbs, maxAbs] : [lo, hi];\n            const loSlider = Math.max(sliderMin, Math.min(sliderMax, nextDomain[0]));\n            const hiSlider = Math.max(sliderMin, Math.min(sliderMax, nextDomain[1]));\n            slider.aInput.value = String(loSlider);\n            slider.bInput.value = String(hiSlider);\n            slider.setVisual(loSlider, hiSlider);\n            state.pending = { ...state.pending, type: 'colormap', domain: nextDomain };\n            setDirty(true);\n            d0.value = String(nextDomain[0]);\n            d1.value = String(nextDomain[1]);\n          };\n          d0.addEventListener('change', commitDomainTyped);\n          d1.addEventListener('change', commitDomainTyped);\n\n          values.appendChild(d0);\n          values.appendChild(d1);\n          domainWrap.appendChild(slider.element);\n          domainWrap.appendChild(values);\n          editorBody.appendChild(createAlignedRowEl({\n            title: 'Domain',\n            controls: domainWrap,\n            hint: percentile\n              ? 'Percentile range used to map values into the colormap (0 to 1).'\n              : (divergent\n                ? 'Symmetric range around zero used for divergent colormaps.'\n                : 'Input range used to map values into the colormap (min/max).'),\n          }).row);\n\n          const advanced = document.createElement('div');\n          const divergentInput = createToggleControl({\n            checked: Boolean(state.pending.divergent) && allowDivergent,\n            disabled: !allowDivergent,\n            onLabel: 'On',\n            offLabel: 'Off',\n            ariaLabel: 'Use divergent colormap domain',\n          });\n\n          const clampState = normalizeClampSetting(state.pending.clamp);\n          const clampMinInput = createToggleControl({\n            checked: clampState.min,\n            onLabel: 'On',\n            offLabel: 'Off',\n            ariaLabel: 'Clamp values below the colormap domain',\n          });\n          const clampMaxInput = createToggleControl({\n            checked: clampState.max,\n            onLabel: 'On',\n            offLabel: 'Off',\n            ariaLabel: 'Clamp values above the colormap domain',\n          });\n\n          const alphaSeed = clampNumber(state.pending.alpha ?? 1, { min: 0, max: 1 }) ?? 1;\n          const alphaControls = createSuggestedSliderControls({\n            value: alphaSeed,\n            suggested: [0, 1],\n            step: 0.01,\n            inputMin: 0,\n            inputMax: 1,\n            onCommit: (v) => {\n              const a = clampNumber(v, { min: 0, max: 1 });\n              if (a == null) return;\n              state.pending = { ...state.pending, type: 'colormap', alpha: a };\n              setDirty(true);\n            },\n          });\n\n          const commitClamp = () => {\n            const nextClamp = { min: clampMinInput.checked, max: clampMaxInput.checked };\n            state.pending = { ...state.pending, type: 'colormap', clamp: nextClamp };\n            setDirty(true);\n          };\n          clampMinInput.addEventListener('change', commitClamp);\n          clampMaxInput.addEventListener('change', commitClamp);\n\n          divergentInput.addEventListener('change', () => {\n            const nextDivergent = divergentInput.checked;\n            const fallbackDomain = domainAttr ? suggestDomainForAttribute(mode, domainAttr) : [0, 1];\n            const baseDomain = Array.isArray(state.pending.domain) ? state.pending.domain : fallbackDomain;\n            const nextDomain = nextDivergent ? resolveDivergentDomain(baseDomain, extent) : fallbackDomain;\n            state.pending = { ...state.pending, type: 'colormap', divergent: nextDivergent, domain: nextDomain };\n            setDirty(true);\n            renderEditor();\n          });\n\n          advanced.appendChild(createAlignedRowEl({\n            title: 'Divergent',\n            controls: divergentInput,\n            hint: allowDivergent\n              ? 'Lock the domain to a symmetric range around zero (for divergent colormaps).'\n              : 'Divergent mode is unavailable for percentile transforms.',\n          }).row);\n\n          advanced.appendChild(createAlignedRowEl({\n            title: 'Clamp Min',\n            controls: clampMinInput,\n            hint: 'Clamp values below the domain to the lowest colormap color.',\n          }).row);\n\n          advanced.appendChild(createAlignedRowEl({\n            title: 'Clamp Max',\n            controls: clampMaxInput,\n            hint: 'Clamp values above the domain to the highest colormap color.',\n          }).row);\n\n          advanced.appendChild(createAlignedRowEl({ title: 'Alpha', controls: alphaControls.element }).row);\n\n          const advancedStack = new PanelStack();\n          advancedStack.add({ id: `${mode}-mapper-advanced`, title: 'Advanced', collapsed: true, content: advanced });\n          editorBody.appendChild(advancedStack.element);\n          this._controlCleanups.add(() => advancedStack.destroy());\n        }\n\n        if (!isColor && !isScalar && pendingType !== 'passthrough') {\n          const note = document.createElement('div');\n          note.style.color = 'var(--helios-ui-muted)';\n          note.textContent = 'This channel is passthrough-only in the current MVP.';\n          editorBody.appendChild(note);\n        }\n\n        syncApplyEnabled();\n      };\n\n      const resetPendingFromLive = () => {\n        if (mode === 'node' && state.channel === 'position') {\n          const scheduler = helios?.scheduler ?? null;\n          const hasLayout = Boolean(scheduler?.layout);\n          const layoutState = typeof scheduler?.getLayoutState === 'function'\n            ? scheduler.getLayoutState()\n            : (scheduler?.layoutEnabled !== false ? 'running' : 'stopped');\n          const layoutEnabled = hasLayout && layoutState !== 'stopped';\n          state.pending = layoutEnabled ? { name: state.channel, type: 'layout' } : (resolveLiveConfig(mode, state.channel) ?? { name: state.channel });\n        } else {\n          state.pending = resolveLiveConfig(mode, state.channel) ?? { name: state.channel };\n        }\n        setDirty(false);\n        renderEditor();\n      };\n\n      const setChannel = (next) => {\n        if (!channels.includes(next)) return;\n        state.channel = next;\n        resetPendingFromLive();\n      };\n\n      revertButton.addEventListener('click', () => {\n        resetPendingFromLive();\n      });\n\n      applyButton.addEventListener('click', () => {\n        if (!state.pending) return;\n\n        if (mode === 'node' && state.channel === 'position') {\n          if (state.pending.type === 'layout') {\n            helios?.startLayout?.();\n            setDirty(false);\n            return;\n          }\n          helios?.stopLayout?.('ui:mappers');\n        }\n\n        const ok = applyConfig(mode, state.channel, state.pending);\n        if (ok) {\n          if (\n            mode === 'node' &&\n            state.channel === 'outlineColor' &&\n            (state.pending.type ?? state.pending.mode) === 'constant' &&\n            typeof helios?.nodeOutlineColor === 'function'\n          ) {\n            try {\n              helios.nodeOutlineColor(state.pending.value);\n            } catch {\n              // Ignore invalid color inputs; mapper validation covers common cases.\n            }\n          }\n\n          if (mode === 'node' && (state.channel === 'outline' || state.channel === 'outlineColor')) {\n            const outlineCfg = resolveLiveConfig('node', 'outline');\n            const outlineColorCfg = resolveLiveConfig('node', 'outlineColor');\n            const outlineType = outlineCfg?.type ?? outlineCfg?.mode ?? null;\n            const outlineColorType = outlineColorCfg?.type ?? outlineColorCfg?.mode ?? null;\n            const bothConstant = outlineType === 'constant' && outlineColorType === 'constant';\n            if (typeof helios?.nodeOutlineUseAttributes === 'function') {\n              helios.nodeOutlineUseAttributes(!bothConstant);\n            }\n          }\n          setDirty(false);\n        }\n      });\n\n      resetPendingFromLive();\n      return { root, state, channels, setChannel };\n    };\n\n    const nodeTab = createModeTab('node');\n    const edgeTab = createModeTab('edge');\n\n    let activeMode = 'node';\n\n    const channelSelect = document.createElement('select');\n    channelSelect.className = 'helios-ui-select helios-ui-select--compact';\n\n    const getActiveTab = () => (activeMode === 'edge' ? edgeTab : nodeTab);\n\n    const syncChannelSelect = () => {\n      const { channels, state } = getActiveTab();\n      channelSelect.textContent = '';\n      for (const name of channels) {\n        const opt = document.createElement('option');\n        opt.value = name;\n        opt.textContent = CHANNEL_LABELS[name] ?? name;\n        channelSelect.appendChild(opt);\n      }\n      channelSelect.value = channels.includes(state.channel) ? state.channel : channels[0];\n    };\n\n    channelSelect.addEventListener('change', () => {\n      const tab = getActiveTab();\n      tab.setChannel(channelSelect.value);\n      syncChannelSelect();\n    });\n\n    syncChannelSelect();\n\n    return this.createTabbedPanel({\n      id: options.id ?? 'helios-ui-mappers',\n      title: options.title ?? 'Mappers',\n      position: options.position ?? { x: 16, y: 120 },\n      dock: options.dock ?? 'top-left',\n      barRight: channelSelect,\n      onActiveChanged: (tabId) => {\n        activeMode = tabId === 'edges' ? 'edge' : 'node';\n        syncChannelSelect();\n      },\n      tabs: [\n        { id: 'nodes', title: 'Nodes', content: nodeTab.root },\n        { id: 'edges', title: 'Edges', content: edgeTab.root },\n      ],\n    });\n  }\n\n  /**\n   * Create the layout controls panel.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {object} [options] - Panel placement and layout panel options.\n   * @returns {Panel} Created panel instance.\n   */\n  createLayoutPanel(options = {}) {\n    return new LayoutPanel(this, options).create();\n  }\n\n  /**\n   * Create the legends controls panel.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {object} [options] - Panel placement and legend panel options.\n   * @returns {Panel} Created panel instance.\n   */\n  createLegendsPanel(options = {}) {\n    return new LegendsPanel(this, options).create();\n  }\n\n  /**\n   * Create the camera controls panel.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {object} [options] - Panel placement and camera panel options.\n   * @returns {Panel} Created panel instance.\n   */\n  createCameraPanel(options = {}) {\n    return new CameraPanel(this, options).create();\n  }\n\n  /**\n   * Create the selection and hover controls panel.\n   *\n   * @public\n   * @apiSection User Interface\n   * @param {object} [options] - Panel placement and selection panel options.\n   * @returns {Panel} Created panel instance.\n   */\n  createSelectionPanel(options = {}) {\n    return new SelectionPanel(this, options).create();\n  }\n}\n","function createDetailEvent(type, detail) {\n  if (typeof CustomEvent === 'function') return new CustomEvent(type, { detail });\n  if (typeof Event === 'function') {\n    const event = new Event(type);\n    event.detail = detail;\n    return event;\n  }\n  return { type, detail };\n}\n\n/**\n * Base class for reusable Helios application behaviors.\n *\n * @public\n * @param {object} [options] - Serializable configuration owned by the behavior.\n * @returns {Behavior} Detached behavior instance; Helios attaches it through\n * `helios.useBehavior(...)` or `BehaviorManager.use(...)`.\n * @remarks Behaviors attach to a Helios context, own serializable state, emit\n * change events, and register cleanup hooks for listeners, timers, and UI\n * bindings. Custom behaviors should override `attach`, `detach`, `serialize`,\n * and `restore` only where needed.\n * @example\n * class PulseBehavior extends Behavior {\n *   static id = 'pulse';\n *   attach(context) {\n *     super.attach(context);\n *     const timer = setInterval(() => context.helios.requestRender(), 500);\n *     this.addCleanup(() => clearInterval(timer));\n *     return this;\n *   }\n * }\n */\nexport class Behavior extends EventTarget {\n  static id = null;\n\n  constructor(options = {}) {\n    super();\n    this.options = options && typeof options === 'object' ? { ...options } : {};\n    this.context = null;\n    this.id = this.constructor.id ?? null;\n    this._cleanups = new Set();\n  }\n\n  attach(context) {\n    this.context = context ?? null;\n    return this;\n  }\n\n  detach() {\n    for (const cleanup of this._cleanups) {\n      try {\n        cleanup?.();\n      } catch (error) {\n        console.warn(`Helios behavior \"${this.id ?? this.constructor.name}\" cleanup failed during detach.`, error);\n      }\n    }\n    this._cleanups.clear();\n    this.context = null;\n    return this;\n  }\n\n  update(options = {}) {\n    if (options && typeof options === 'object') {\n      this.options = { ...this.options, ...options };\n    }\n    return this;\n  }\n\n  serialize() {\n    return { options: { ...this.options } };\n  }\n\n  restore(snapshot = {}) {\n    if (snapshot?.options && typeof snapshot.options === 'object') {\n      this.update(snapshot.options);\n    }\n    return this;\n  }\n\n  addCleanup(cleanup) {\n    if (typeof cleanup !== 'function') return cleanup;\n    this._cleanups.add(cleanup);\n    return cleanup;\n  }\n\n  removeCleanup(cleanup) {\n    this._cleanups.delete(cleanup);\n    return this;\n  }\n\n  emit(type, detail) {\n    this.dispatchEvent(createDetailEvent(type, detail));\n    return this;\n  }\n\n  on(type, handler, options) {\n    this.addEventListener(type, handler, options);\n    return () => this.removeEventListener(type, handler, options);\n  }\n}\n\nexport default Behavior;\n","import { Behavior } from './Behavior.js';\n\nconst ACCESSOR_NAMES = Object.freeze([\n  'background',\n  'clearColor',\n  'edgeTransparencyMode',\n  'nodeSizeScale',\n  'nodeSizeBase',\n  'nodeOpacityScale',\n  'nodeOpacityBase',\n  'nodeOutlineWidthScale',\n  'nodeOutlineWidthBase',\n  'semanticZoomExponent',\n  'edgeWidthScale',\n  'edgeWidthBase',\n  'edgeOpacityScale',\n  'edgeOpacityBase',\n  'edgeEndpointTrim',\n  'nodeBlendWithEdges',\n  'edgeWidthClampToNodeDiameter',\n  'edgeDepthWrite',\n  'edgeFastRendering',\n  'edgeAdaptiveQuality',\n  'edgeAdaptiveQualityEnabled',\n  'edgeAdaptiveQualitySlowFrameThresholdMs',\n  'edgeAdaptiveQualitySlowFrameConsecutiveFrames',\n  'edgeAdaptiveQualityProbeIntervalMs',\n  'edgeAdaptiveQualityInteractionHoldMs',\n  'edgeAdaptiveQualityFastDuringCamera',\n  'edgeAdaptiveQualityFastDuringLayout',\n  'shadedEnabled',\n  'shadedNodes',\n  'shadedEdges',\n  'shadedLightDirection',\n  'shadedLightDirectionX',\n  'shadedLightDirectionY',\n  'shadedLightDirectionZ',\n  'shadedLightColor',\n  'shadedAmbientTopColor',\n  'shadedAmbientBottomColor',\n  'shadedDiffuseStrength',\n  'shadedAmbientStrength',\n  'shadedSpecularColor',\n  'shadedSpecularStrength',\n  'shadedShininess',\n  'ambientOcclusionEnabled',\n  'ambientOcclusionNodes',\n  'ambientOcclusionEdges',\n  'ambientOcclusionStrength',\n  'ambientOcclusionRadius',\n  'ambientOcclusionBias',\n  'ambientOcclusionMode',\n  'ambientOcclusionIntensityScale',\n  'ambientOcclusionIntensityShift',\n  'ambientOcclusionQuality',\n  'supersampling',\n]);\n\nconst ACCESSOR_NAME_SET = new Set(ACCESSOR_NAMES);\nconst SOURCE_EVENT_NAMES = new Set([\n  'clearColor',\n  ...ACCESSOR_NAMES,\n]);\n\nconst LEGACY_APPEARANCE_PATHS = Object.freeze({\n  background: 'appearance.background',\n  clearColor: 'appearance.background',\n  edgeTransparencyMode: 'appearance.edgeTransparencyMode',\n  supersampling: 'appearance.supersampling',\n  nodeSizeScale: 'appearance.nodeStyle.sizeScale',\n  nodeSizeBase: 'appearance.nodeStyle.sizeBase',\n  nodeOpacityScale: 'appearance.nodeStyle.opacityScale',\n  nodeOpacityBase: 'appearance.nodeStyle.opacityBase',\n  nodeOutlineWidthScale: 'appearance.nodeStyle.outlineWidthScale',\n  nodeOutlineWidthBase: 'appearance.nodeStyle.outlineWidthBase',\n  semanticZoomExponent: 'appearance.nodeStyle.semanticZoomExponent',\n  nodeBlendWithEdges: 'appearance.nodeStyle.blendWithEdges',\n  edgeWidthScale: 'appearance.edgeStyle.widthScale',\n  edgeWidthBase: 'appearance.edgeStyle.widthBase',\n  edgeOpacityScale: 'appearance.edgeStyle.opacityScale',\n  edgeOpacityBase: 'appearance.edgeStyle.opacityBase',\n  edgeEndpointTrim: 'appearance.edgeStyle.endpointTrim',\n  edgeDepthWrite: 'appearance.edgeStyle.depthWrite',\n  edgeFastRendering: 'appearance.edgeStyle.fastRendering',\n  edgeWidthClampToNodeDiameter: 'appearance.edgeStyle.clampToNodeDiameter',\n  edgeAdaptiveQuality: 'appearance.edgeStyle.adaptiveQuality',\n  edgeAdaptiveQualityEnabled: 'appearance.edgeStyle.adaptiveQuality.enabled',\n  edgeAdaptiveQualitySlowFrameThresholdMs: 'appearance.edgeStyle.adaptiveQuality.slowFrameThresholdMs',\n  edgeAdaptiveQualitySlowFrameConsecutiveFrames: 'appearance.edgeStyle.adaptiveQuality.slowFrameConsecutiveFrames',\n  edgeAdaptiveQualityProbeIntervalMs: 'appearance.edgeStyle.adaptiveQuality.probeIntervalMs',\n  edgeAdaptiveQualityInteractionHoldMs: 'appearance.edgeStyle.adaptiveQuality.interactionHoldMs',\n  edgeAdaptiveQualityFastDuringCamera: 'appearance.edgeStyle.adaptiveQuality.fastDuringCamera',\n  edgeAdaptiveQualityFastDuringLayout: 'appearance.edgeStyle.adaptiveQuality.fastDuringLayout',\n  shadedEnabled: 'appearance.shaded.enabled',\n  shadedNodes: 'appearance.shaded.nodes',\n  shadedEdges: 'appearance.shaded.edges',\n  shadedLightDirection: 'appearance.shaded.lightDirection',\n  shadedLightDirectionX: 'appearance.shaded.lightDirection.0',\n  shadedLightDirectionY: 'appearance.shaded.lightDirection.1',\n  shadedLightDirectionZ: 'appearance.shaded.lightDirection.2',\n  shadedLightColor: 'appearance.shaded.lightColor',\n  shadedAmbientTopColor: 'appearance.shaded.ambientTopColor',\n  shadedAmbientBottomColor: 'appearance.shaded.ambientBottomColor',\n  shadedDiffuseStrength: 'appearance.shaded.diffuseStrength',\n  shadedAmbientStrength: 'appearance.shaded.ambientStrength',\n  shadedSpecularColor: 'appearance.shaded.specularColor',\n  shadedSpecularStrength: 'appearance.shaded.specularStrength',\n  shadedShininess: 'appearance.shaded.shininess',\n  ambientOcclusionEnabled: 'appearance.ambientOcclusion.enabled',\n  ambientOcclusionNodes: 'appearance.ambientOcclusion.nodes',\n  ambientOcclusionEdges: 'appearance.ambientOcclusion.edges',\n  ambientOcclusionStrength: 'appearance.ambientOcclusion.strength',\n  ambientOcclusionRadius: 'appearance.ambientOcclusion.radius',\n  ambientOcclusionBias: 'appearance.ambientOcclusion.bias',\n  ambientOcclusionMode: 'appearance.ambientOcclusion.mode',\n  ambientOcclusionIntensityScale: 'appearance.ambientOcclusion.intensityScale',\n  ambientOcclusionIntensityShift: 'appearance.ambientOcclusion.intensityShift',\n  ambientOcclusionQuality: 'appearance.ambientOcclusion.quality',\n});\n\nfunction collectStateKeys(detail = {}) {\n  const keys = [];\n  if (typeof detail.storageKey === 'string') keys.push(detail.storageKey);\n  if (typeof detail.stateKey === 'string') keys.push(detail.stateKey);\n  if (Array.isArray(detail.storageKeys)) {\n    for (const key of detail.storageKeys) if (typeof key === 'string') keys.push(key);\n  }\n  if (Array.isArray(detail.stateKeys)) {\n    for (const key of detail.stateKeys) if (typeof key === 'string') keys.push(key);\n  }\n  return keys;\n}\n\nfunction keyMatchesTarget(key, target) {\n  if (!key || !target) return false;\n  return key === target || key.startsWith(`${target}.`) || target.startsWith(`${key}.`);\n}\n\nfunction appearanceEventTargetsEntry(detail = {}, entryKey = '', storagePath = '') {\n  const eventName = typeof detail.name === 'string' ? detail.name : '';\n  const eventPath = LEGACY_APPEARANCE_PATHS[eventName] ?? '';\n  const targetPath = storagePath || LEGACY_APPEARANCE_PATHS[entryKey] || '';\n  if (eventName && (eventName === entryKey || (eventPath && keyMatchesTarget(eventPath, targetPath)))) return true;\n  const keys = collectStateKeys(detail);\n  if (!keys.length) return false;\n  const behaviorPath = entryKey ? `behaviors.appearance.${entryKey}` : '';\n  return keys.some((key) => (\n    keyMatchesTarget(key, targetPath)\n    || keyMatchesTarget(key, behaviorPath)\n  ));\n}\n\nconst APPEARANCE_CONTROL_LABELS = Object.freeze({\n  edgeAdaptiveQuality: 'Adaptive Edge Quality',\n  edgeAdaptiveQualityEnabled: 'Adaptive Edges',\n  edgeAdaptiveQualitySlowFrameThresholdMs: 'Slow Frame Threshold',\n  edgeAdaptiveQualitySlowFrameConsecutiveFrames: 'Averaging Frames',\n  edgeAdaptiveQualityProbeIntervalMs: 'Probe Interval',\n  edgeAdaptiveQualityInteractionHoldMs: 'Interaction Hold',\n  edgeAdaptiveQualityFastDuringCamera: 'Fast During Camera',\n  edgeAdaptiveQualityFastDuringLayout: 'Fast During Layout',\n  shadedEnabled: 'Shaded',\n  shadedNodes: 'Nodes',\n  shadedEdges: 'Edges',\n  shadedLightDirection: 'Light Direction',\n  shadedLightDirectionX: 'Light X',\n  shadedLightDirectionY: 'Light Y',\n  shadedLightDirectionZ: 'Light Z',\n  shadedLightColor: 'Light Color',\n  shadedAmbientTopColor: 'Ambient Top',\n  shadedAmbientBottomColor: 'Ambient Bottom',\n  shadedDiffuseStrength: 'Diffuse',\n  shadedAmbientStrength: 'Ambient',\n  shadedSpecularColor: 'Specular Color',\n  shadedSpecularStrength: 'Specular',\n  shadedShininess: 'Shininess',\n  ambientOcclusionEnabled: 'Ambient Occlusion',\n  ambientOcclusionNodes: 'Nodes',\n  ambientOcclusionEdges: 'Edges',\n  ambientOcclusionStrength: 'Strength',\n  ambientOcclusionRadius: 'Radius',\n  ambientOcclusionBias: 'Bias',\n  ambientOcclusionMode: 'Mode',\n  ambientOcclusionIntensityScale: 'Fast Scale',\n  ambientOcclusionIntensityShift: 'Fast Shift',\n  ambientOcclusionQuality: 'Quality',\n  nodeSizeScale: 'Node Size Scale',\n  nodeSizeBase: 'Node Size Base',\n  nodeOpacityScale: 'Node Opacity Scale',\n  nodeOpacityBase: 'Node Opacity Base',\n  nodeOutlineWidthScale: 'Outline Width Scale',\n  nodeOutlineWidthBase: 'Outline Width Base',\n  semanticZoomExponent: 'Semantic Zoom Exp.',\n  nodeBlendWithEdges: 'Blend Nodes',\n  edgeWidthScale: 'Edge Width Scale',\n  edgeWidthBase: 'Edge Width Base',\n  edgeOpacityScale: 'Edge Opacity Scale',\n  edgeOpacityBase: 'Edge Opacity Base',\n  edgeEndpointTrim: 'Edge Endpoint Trim',\n  edgeDepthWrite: 'Edge Depth Write',\n  edgeFastRendering: 'Fast Edge Lines',\n  edgeWidthClampToNodeDiameter: 'Clamp Edge Widths',\n});\n\nfunction fallbackControlLabel(value) {\n  return String(value ?? '')\n    .replace(/[_-]+/gu, ' ')\n    .replace(/([a-z0-9])([A-Z])/gu, '$1 $2')\n    .replace(/([A-Z]+)([A-Z][a-z])/gu, '$1 $2')\n    .replace(/\\s+/gu, ' ')\n    .trim()\n    .replace(/\\b\\w/gu, (match) => match.toUpperCase());\n}\n\nfunction appearanceControlLabel(key) {\n  return APPEARANCE_CONTROL_LABELS[key] ?? fallbackControlLabel(key);\n}\n\nfunction cloneSerializable(value) {\n  if (Array.isArray(value)) return value.map((entry) => cloneSerializable(entry));\n  if (ArrayBuffer.isView(value)) return Array.from(value, (entry) => cloneSerializable(entry));\n  if (!value || typeof value !== 'object') return value;\n  const next = {};\n  for (const [key, entry] of Object.entries(value)) {\n    if (typeof entry === 'function') continue;\n    next[key] = cloneSerializable(entry);\n  }\n  return next;\n}\n\nfunction appearanceValueFromState(key, state = {}) {\n  const nodeStyle = state.nodeStyle ?? {};\n  const edgeStyle = state.edgeStyle ?? {};\n  const adaptiveQuality = edgeStyle.adaptiveQuality ?? {};\n  const shaded = state.shaded ?? {};\n  const ambientOcclusion = state.ambientOcclusion ?? {};\n  const values = {\n    background: state.background,\n    clearColor: state.background,\n    edgeTransparencyMode: state.edgeTransparencyMode,\n    supersampling: state.supersampling,\n    nodeSizeScale: nodeStyle.sizeScale,\n    nodeSizeBase: nodeStyle.sizeBase,\n    nodeOpacityScale: nodeStyle.opacityScale,\n    nodeOpacityBase: nodeStyle.opacityBase,\n    nodeOutlineWidthScale: nodeStyle.outlineWidthScale,\n    nodeOutlineWidthBase: nodeStyle.outlineWidthBase,\n    semanticZoomExponent: nodeStyle.semanticZoomExponent,\n    nodeBlendWithEdges: nodeStyle.blendWithEdges,\n    edgeWidthScale: edgeStyle.widthScale,\n    edgeWidthBase: edgeStyle.widthBase,\n    edgeOpacityScale: edgeStyle.opacityScale,\n    edgeOpacityBase: edgeStyle.opacityBase,\n    edgeEndpointTrim: edgeStyle.endpointTrim,\n    edgeWidthClampToNodeDiameter: edgeStyle.clampToNodeDiameter,\n    edgeDepthWrite: edgeStyle.depthWrite,\n    edgeFastRendering: edgeStyle.fastRendering,\n    edgeAdaptiveQuality: edgeStyle.adaptiveQuality,\n    edgeAdaptiveQualityEnabled: adaptiveQuality.enabled,\n    edgeAdaptiveQualitySlowFrameThresholdMs: adaptiveQuality.slowFrameThresholdMs,\n    edgeAdaptiveQualitySlowFrameConsecutiveFrames: adaptiveQuality.slowFrameConsecutiveFrames,\n    edgeAdaptiveQualityProbeIntervalMs: adaptiveQuality.probeIntervalMs,\n    edgeAdaptiveQualityInteractionHoldMs: adaptiveQuality.interactionHoldMs,\n    edgeAdaptiveQualityFastDuringCamera: adaptiveQuality.fastDuringCamera,\n    edgeAdaptiveQualityFastDuringLayout: adaptiveQuality.fastDuringLayout,\n    shadedEnabled: shaded.enabled,\n    shadedNodes: shaded.nodes,\n    shadedEdges: shaded.edges,\n    shadedLightDirection: shaded.lightDirection,\n    shadedLightDirectionX: Array.isArray(shaded.lightDirection) ? shaded.lightDirection[0] : undefined,\n    shadedLightDirectionY: Array.isArray(shaded.lightDirection) ? shaded.lightDirection[1] : undefined,\n    shadedLightDirectionZ: Array.isArray(shaded.lightDirection) ? shaded.lightDirection[2] : undefined,\n    shadedLightColor: shaded.lightColor,\n    shadedAmbientTopColor: shaded.ambientTopColor,\n    shadedAmbientBottomColor: shaded.ambientBottomColor,\n    shadedDiffuseStrength: shaded.diffuseStrength,\n    shadedAmbientStrength: shaded.ambientStrength,\n    shadedSpecularColor: shaded.specularColor,\n    shadedSpecularStrength: shaded.specularStrength,\n    shadedShininess: shaded.shininess,\n    ambientOcclusionEnabled: ambientOcclusion.enabled,\n    ambientOcclusionNodes: ambientOcclusion.nodes,\n    ambientOcclusionEdges: ambientOcclusion.edges,\n    ambientOcclusionStrength: ambientOcclusion.strength,\n    ambientOcclusionRadius: ambientOcclusion.radius,\n    ambientOcclusionBias: ambientOcclusion.bias,\n    ambientOcclusionMode: ambientOcclusion.mode,\n    ambientOcclusionIntensityScale: ambientOcclusion.intensityScale,\n    ambientOcclusionIntensityShift: ambientOcclusion.intensityShift,\n    ambientOcclusionQuality: ambientOcclusion.quality,\n  };\n  return values[key];\n}\n\nfunction supportsAmbientOcclusion(helios) {\n  const type = String(helios?.renderer?.device?.type ?? '').toLowerCase();\n  return type === 'webgpu' || type === 'webgl2';\n}\n\nfunction normalizeAppearancePatch(options = {}) {\n  const next = {};\n  if (!options || typeof options !== 'object') return next;\n\n  for (const name of ACCESSOR_NAMES) {\n    if (Object.prototype.hasOwnProperty.call(options, name)) {\n      next[name] = cloneSerializable(options[name]);\n    }\n  }\n\n  if (Object.prototype.hasOwnProperty.call(options, 'background')) {\n    next.background = cloneSerializable(options.background);\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'clearColor') && !Object.prototype.hasOwnProperty.call(next, 'background')) {\n    next.background = cloneSerializable(options.clearColor);\n  }\n\n  const nodeStyle = options.nodeStyle;\n  if (nodeStyle && typeof nodeStyle === 'object') {\n    if (Object.prototype.hasOwnProperty.call(nodeStyle, 'sizeScale')) next.nodeSizeScale = cloneSerializable(nodeStyle.sizeScale);\n    if (Object.prototype.hasOwnProperty.call(nodeStyle, 'sizeBase')) next.nodeSizeBase = cloneSerializable(nodeStyle.sizeBase);\n    if (Object.prototype.hasOwnProperty.call(nodeStyle, 'opacityScale')) next.nodeOpacityScale = cloneSerializable(nodeStyle.opacityScale);\n    if (Object.prototype.hasOwnProperty.call(nodeStyle, 'opacityBase')) next.nodeOpacityBase = cloneSerializable(nodeStyle.opacityBase);\n    if (Object.prototype.hasOwnProperty.call(nodeStyle, 'outlineWidthScale')) next.nodeOutlineWidthScale = cloneSerializable(nodeStyle.outlineWidthScale);\n    if (Object.prototype.hasOwnProperty.call(nodeStyle, 'outlineWidthBase')) next.nodeOutlineWidthBase = cloneSerializable(nodeStyle.outlineWidthBase);\n    if (Object.prototype.hasOwnProperty.call(nodeStyle, 'semanticZoomExponent')) next.semanticZoomExponent = cloneSerializable(nodeStyle.semanticZoomExponent);\n    if (Object.prototype.hasOwnProperty.call(nodeStyle, 'blendWithEdges')) next.nodeBlendWithEdges = nodeStyle.blendWithEdges === true;\n  }\n\n  const edgeStyle = options.edgeStyle;\n  if (edgeStyle && typeof edgeStyle === 'object') {\n    if (Object.prototype.hasOwnProperty.call(edgeStyle, 'widthScale')) next.edgeWidthScale = cloneSerializable(edgeStyle.widthScale);\n    if (Object.prototype.hasOwnProperty.call(edgeStyle, 'widthBase')) next.edgeWidthBase = cloneSerializable(edgeStyle.widthBase);\n    if (Object.prototype.hasOwnProperty.call(edgeStyle, 'opacityScale')) next.edgeOpacityScale = cloneSerializable(edgeStyle.opacityScale);\n    if (Object.prototype.hasOwnProperty.call(edgeStyle, 'opacityBase')) next.edgeOpacityBase = cloneSerializable(edgeStyle.opacityBase);\n    if (Object.prototype.hasOwnProperty.call(edgeStyle, 'endpointTrim')) next.edgeEndpointTrim = cloneSerializable(edgeStyle.endpointTrim);\n    if (Object.prototype.hasOwnProperty.call(edgeStyle, 'fastRendering')) next.edgeFastRendering = edgeStyle.fastRendering === true;\n    if (Object.prototype.hasOwnProperty.call(edgeStyle, 'depthWrite')) next.edgeDepthWrite = edgeStyle.depthWrite === true;\n    if (Object.prototype.hasOwnProperty.call(edgeStyle, 'clampToNodeDiameter')) {\n      next.edgeWidthClampToNodeDiameter = edgeStyle.clampToNodeDiameter !== false;\n    }\n    if (Object.prototype.hasOwnProperty.call(edgeStyle, 'adaptiveQuality')) {\n      next.edgeAdaptiveQuality = cloneSerializable(edgeStyle.adaptiveQuality);\n    }\n  }\n\n  const shaded = options.shaded;\n  if (shaded && typeof shaded === 'object') {\n    if (Object.prototype.hasOwnProperty.call(shaded, 'enabled')) next.shadedEnabled = shaded.enabled === true;\n    if (Object.prototype.hasOwnProperty.call(shaded, 'nodes')) next.shadedNodes = shaded.nodes !== false;\n    if (Object.prototype.hasOwnProperty.call(shaded, 'edges')) next.shadedEdges = shaded.edges === true;\n    if (Object.prototype.hasOwnProperty.call(shaded, 'lightDirection')) next.shadedLightDirection = cloneSerializable(shaded.lightDirection);\n    if (Object.prototype.hasOwnProperty.call(shaded, 'lightColor')) next.shadedLightColor = cloneSerializable(shaded.lightColor);\n    if (Object.prototype.hasOwnProperty.call(shaded, 'ambientTopColor')) next.shadedAmbientTopColor = cloneSerializable(shaded.ambientTopColor);\n    if (Object.prototype.hasOwnProperty.call(shaded, 'ambientBottomColor')) next.shadedAmbientBottomColor = cloneSerializable(shaded.ambientBottomColor);\n    if (Object.prototype.hasOwnProperty.call(shaded, 'diffuseStrength')) next.shadedDiffuseStrength = cloneSerializable(shaded.diffuseStrength);\n    if (Object.prototype.hasOwnProperty.call(shaded, 'ambientStrength')) next.shadedAmbientStrength = cloneSerializable(shaded.ambientStrength);\n    if (Object.prototype.hasOwnProperty.call(shaded, 'specularColor')) next.shadedSpecularColor = cloneSerializable(shaded.specularColor);\n    if (Object.prototype.hasOwnProperty.call(shaded, 'specularStrength')) next.shadedSpecularStrength = cloneSerializable(shaded.specularStrength);\n    if (Object.prototype.hasOwnProperty.call(shaded, 'shininess')) next.shadedShininess = cloneSerializable(shaded.shininess);\n  }\n\n  const ambientOcclusion = options.ambientOcclusion;\n  if (ambientOcclusion && typeof ambientOcclusion === 'object') {\n    if (Object.prototype.hasOwnProperty.call(ambientOcclusion, 'enabled')) next.ambientOcclusionEnabled = ambientOcclusion.enabled === true;\n    if (Object.prototype.hasOwnProperty.call(ambientOcclusion, 'nodes')) next.ambientOcclusionNodes = ambientOcclusion.nodes !== false;\n    if (Object.prototype.hasOwnProperty.call(ambientOcclusion, 'edges')) next.ambientOcclusionEdges = ambientOcclusion.edges === true;\n    if (Object.prototype.hasOwnProperty.call(ambientOcclusion, 'strength')) next.ambientOcclusionStrength = cloneSerializable(ambientOcclusion.strength);\n    if (Object.prototype.hasOwnProperty.call(ambientOcclusion, 'radius')) next.ambientOcclusionRadius = cloneSerializable(ambientOcclusion.radius);\n    if (Object.prototype.hasOwnProperty.call(ambientOcclusion, 'bias')) next.ambientOcclusionBias = cloneSerializable(ambientOcclusion.bias);\n    if (Object.prototype.hasOwnProperty.call(ambientOcclusion, 'mode')) next.ambientOcclusionMode = cloneSerializable(ambientOcclusion.mode);\n    if (Object.prototype.hasOwnProperty.call(ambientOcclusion, 'intensityScale')) next.ambientOcclusionIntensityScale = cloneSerializable(ambientOcclusion.intensityScale);\n    if (Object.prototype.hasOwnProperty.call(ambientOcclusion, 'intensityShift')) next.ambientOcclusionIntensityShift = cloneSerializable(ambientOcclusion.intensityShift);\n    if (Object.prototype.hasOwnProperty.call(ambientOcclusion, 'quality')) next.ambientOcclusionQuality = cloneSerializable(ambientOcclusion.quality);\n  }\n\n  return next;\n}\n\nfunction buildAppearanceSnapshot(helios, fallback = {}) {\n  const read = (name, defaultValue = undefined) => {\n    if (typeof helios?.[name] === 'function') {\n      const value = helios[name]();\n      if (value !== undefined && (value !== null || defaultValue == null)) {\n        return cloneSerializable(value);\n      }\n    }\n    if (Object.prototype.hasOwnProperty.call(fallback, name)) {\n      const value = fallback[name];\n      if (value !== undefined && (value !== null || defaultValue == null)) {\n        return cloneSerializable(value);\n      }\n    }\n    return defaultValue;\n  };\n\n  return {\n    background: read('background', null),\n    edgeTransparencyMode: read('edgeTransparencyMode', 'weighted'),\n    supersampling: read('supersampling', 'auto'),\n    nodeStyle: {\n      sizeScale: read('nodeSizeScale', 1),\n      sizeBase: read('nodeSizeBase', 0),\n      opacityScale: read('nodeOpacityScale', 1),\n      opacityBase: read('nodeOpacityBase', 0),\n      outlineWidthScale: read('nodeOutlineWidthScale', 1),\n      outlineWidthBase: read('nodeOutlineWidthBase', 0),\n      semanticZoomExponent: read('semanticZoomExponent', 0),\n      blendWithEdges: read('nodeBlendWithEdges', false),\n    },\n    edgeStyle: {\n      widthScale: read('edgeWidthScale', 1),\n      widthBase: read('edgeWidthBase', 0),\n      opacityScale: read('edgeOpacityScale', 1),\n      opacityBase: read('edgeOpacityBase', 0),\n      endpointTrim: read('edgeEndpointTrim', 0.8),\n      clampToNodeDiameter: read('edgeWidthClampToNodeDiameter', true),\n      depthWrite: read('edgeDepthWrite', false),\n      fastRendering: read('edgeFastRendering', false),\n      adaptiveQuality: read('edgeAdaptiveQuality', null),\n    },\n    shaded: {\n      enabled: read('shadedEnabled', false),\n      nodes: read('shadedNodes', true),\n      edges: read('shadedEdges', false),\n      lightDirection: read('shadedLightDirection', null),\n      lightColor: read('shadedLightColor', null),\n      ambientTopColor: read('shadedAmbientTopColor', null),\n      ambientBottomColor: read('shadedAmbientBottomColor', null),\n      diffuseStrength: read('shadedDiffuseStrength', null),\n      ambientStrength: read('shadedAmbientStrength', null),\n      specularColor: read('shadedSpecularColor', null),\n      specularStrength: read('shadedSpecularStrength', null),\n      shininess: read('shadedShininess', null),\n    },\n    ambientOcclusion: {\n      supported: supportsAmbientOcclusion(helios),\n      enabled: read('ambientOcclusionEnabled', false),\n      nodes: read('ambientOcclusionNodes', true),\n      edges: read('ambientOcclusionEdges', false),\n      strength: read('ambientOcclusionStrength', null),\n      radius: read('ambientOcclusionRadius', null),\n      bias: read('ambientOcclusionBias', null),\n      mode: read('ambientOcclusionMode', null),\n      intensityScale: read('ambientOcclusionIntensityScale', null),\n      intensityShift: read('ambientOcclusionIntensityShift', null),\n      quality: read('ambientOcclusionQuality', null),\n    },\n  };\n}\n\n/**\n * Built-in behavior for global visual appearance and render quality.\n *\n * @public\n * @param {object} [options] - Background, node/edge scale and opacity,\n * shading, ambient occlusion, and adaptive edge quality options.\n * @returns {AppearanceBehavior} Behavior that keeps appearance settings\n * serializable and synchronized with UI bindings.\n * @remarks Renderer capability affects some appearance options. Query\n * `supportsAmbientOcclusion()` after `await helios.ready` before exposing\n * ambient-occlusion controls.\n */\nexport class AppearanceBehavior extends Behavior {\n  static id = 'appearance';\n\n  constructor(options = {}) {\n    super(options);\n    this._pendingPatch = normalizeAppearancePatch(options);\n    this._muteSourceEvents = 0;\n    this.state = buildAppearanceSnapshot(null, this._pendingPatch);\n  }\n\n  attach(context) {\n    super.attach(context);\n    this.addCleanup(this.context.subscribe(this.context?.helios, 'ui:binding-change', (event) => {\n      const name = String(event?.detail?.name ?? '');\n      if (this._muteSourceEvents > 0 || !SOURCE_EVENT_NAMES.has(name)) return;\n      const storageKey = LEGACY_APPEARANCE_PATHS[name] ?? null;\n      this.emitChange('binding-change', {\n        name,\n        value: cloneSerializable(event?.detail?.value),\n        source: event?.detail?.source,\n        trackOverride: event?.detail?.trackOverride === true,\n        storageKeys: storageKey ? [storageKey] : [],\n      });\n    }));\n    if (Object.keys(this._pendingPatch).length > 0) {\n      this._applyPatch(this._pendingPatch, { silent: true });\n    }\n    this.emitChange('attach', { source: 'default', trackOverride: false });\n    return this;\n  }\n\n  update(options = {}) {\n    super.update(options);\n    const patch = normalizeAppearancePatch(options);\n    if (!Object.keys(patch).length) return this;\n    this._pendingPatch = { ...this._pendingPatch, ...patch };\n    this._applyPatch(patch, { silent: true });\n    this.emitChange('options', { source: 'default', trackOverride: false });\n    return this;\n  }\n\n  serialize() {\n    return {\n      options: this.getPublicState(),\n    };\n  }\n\n  stateEntries() {\n    const subscribeForEntry = (entryKey, storagePath) => (notify) => this.on('change', (event) => {\n      const detail = event?.detail ?? event ?? {};\n      if (!appearanceEventTargetsEntry(detail, entryKey, storagePath)) return;\n      notify(undefined, detail);\n    });\n    const state = this.getPublicState();\n    const inferType = (value) => {\n      if (Array.isArray(value)) return 'array';\n      if (typeof value === 'boolean') return 'boolean';\n      if (typeof value === 'number') return 'number';\n      if (typeof value === 'string') return 'string';\n      return 'object';\n    };\n    const accessorEntry = (key) => {\n      const publicState = this.getPublicState();\n      const fallbackValue = appearanceValueFromState(key, publicState);\n      const rawValue = typeof this[key] === 'function'\n        ? this[key]()\n        : fallbackValue;\n      const value = rawValue !== undefined && rawValue !== null ? rawValue : fallbackValue;\n      return {\n        description: `Appearance ${key} setting.`,\n        default: cloneSerializable(value),\n        type: inferType(value),\n        scope: 'workspace',\n        aliases: LEGACY_APPEARANCE_PATHS[key] ? [LEGACY_APPEARANCE_PATHS[key]] : [],\n        ui: { label: appearanceControlLabel(key), controller: inferType(value) === 'boolean' ? 'toggle' : 'auto' },\n        getter: () => (typeof this[key] === 'function'\n          ? cloneSerializable(this[key]() ?? appearanceValueFromState(key, this.getPublicState()))\n          : cloneSerializable(appearanceValueFromState(key, this.getPublicState()))),\n        setter: (nextValue) => this._applyStateEntryValue(key, nextValue),\n        subscribe: subscribeForEntry(key, LEGACY_APPEARANCE_PATHS[key]),\n      };\n    };\n    const groupedEntry = (key, label) => ({\n      description: `Appearance ${label.toLowerCase()} settings.`,\n      default: cloneSerializable(state[key]),\n      type: 'object',\n      scope: 'workspace',\n      aliases: [`appearance.${key}`],\n      ui: { label, controller: 'object' },\n      getter: () => cloneSerializable(this.getPublicState()[key]),\n      setter: (value) => this.update({ [key]: value }),\n      subscribe: subscribeForEntry(key, `appearance.${key}`),\n    });\n    return {\n      state: {\n        description: 'Serializable appearance behavior state.',\n        default: this.serialize(),\n        type: 'object',\n        scope: 'workspace',\n        aliases: ['appearance.state'],\n        getter: () => this.serialize(),\n        setter: (value) => this.restore(value),\n        subscribe: () => () => {},\n      },\n      background: {\n        description: 'Scene background color.',\n        default: cloneSerializable(state.background),\n        type: 'array',\n        scope: 'workspace',\n        aliases: ['appearance.background'],\n        ui: { label: 'Background', controller: 'color' },\n        getter: () => cloneSerializable(this.getPublicState().background),\n        setter: (value) => this._applyStateEntryValue('background', value),\n        subscribe: subscribeForEntry('background', 'appearance.background'),\n      },\n      edgeTransparencyMode: {\n        description: 'Edge transparency mode.',\n        default: state.edgeTransparencyMode,\n        type: 'string',\n        scope: 'workspace',\n        aliases: ['appearance.edgeTransparencyMode'],\n        ui: {\n          label: 'Edge Transparency',\n          controller: 'select',\n          options: ['weighted', 'alpha', 'max'],\n        },\n        getter: () => this.getPublicState().edgeTransparencyMode,\n        setter: (value) => this._applyStateEntryValue('edgeTransparencyMode', value),\n        subscribe: subscribeForEntry('edgeTransparencyMode', 'appearance.edgeTransparencyMode'),\n      },\n      supersampling: {\n        description: 'Supersampling quality setting.',\n        default: state.supersampling,\n        type: 'string',\n        scope: 'workspace',\n        aliases: ['appearance.supersampling'],\n        ui: {\n          label: 'Supersampling',\n          controller: 'select',\n          options: ['auto', 'off', 'on'],\n        },\n        getter: () => this.getPublicState().supersampling,\n        setter: (value) => this._applyStateEntryValue('supersampling', value),\n        subscribe: subscribeForEntry('supersampling', 'appearance.supersampling'),\n      },\n      nodeStyle: groupedEntry('nodeStyle', 'Node Style'),\n      edgeStyle: groupedEntry('edgeStyle', 'Edge Style'),\n      shaded: groupedEntry('shaded', 'Shading'),\n      ambientOcclusion: groupedEntry('ambientOcclusion', 'Ambient Occlusion'),\n      ...Object.fromEntries(ACCESSOR_NAMES\n        .filter((key) => !['background', 'edgeTransparencyMode', 'supersampling'].includes(key))\n        .map((key) => [key, accessorEntry(key)])),\n    };\n  }\n\n  restore(snapshot = {}) {\n    const options = snapshot?.options && typeof snapshot.options === 'object' ? snapshot.options : {};\n    this.update(options);\n    this.emitChange('restore', { source: 'restore', trackOverride: false });\n    return this;\n  }\n\n  appearance(options) {\n    if (arguments.length === 0) return this.getPublicState();\n    return this.update(options);\n  }\n\n  supportsAmbientOcclusion() {\n    return supportsAmbientOcclusion(this.context?.helios ?? null);\n  }\n\n  getPublicState() {\n    return buildAppearanceSnapshot(this.context?.helios ?? null, this._pendingPatch);\n  }\n\n  emitChange(reason, detail = {}) {\n    this.state = this.getPublicState();\n    this.emit('change', { reason, state: this.state, ...detail });\n    return this;\n  }\n\n  _applyPatch(patch = {}, { silent = false } = {}) {\n    const helios = this.context?.helios ?? null;\n    if (!helios) {\n      this.state = buildAppearanceSnapshot(null, { ...this._pendingPatch, ...patch });\n      return this;\n    }\n    this._muteSourceEvents += 1;\n    try {\n      for (const [name, value] of Object.entries(patch)) {\n        const accessor = name === 'background' ? 'background' : name;\n        if (!ACCESSOR_NAME_SET.has(accessor) && accessor !== 'background') continue;\n        if (typeof helios?.[accessor] !== 'function') continue;\n        helios[accessor](cloneSerializable(value));\n      }\n    } finally {\n      this._muteSourceEvents = Math.max(0, this._muteSourceEvents - 1);\n    }\n    this.state = this.getPublicState();\n    if (!silent) this.emitChange('apply');\n    return this;\n  }\n\n  _applyStateEntryValue(key, value) {\n    const patch = normalizeAppearancePatch({ [key]: value });\n    if (!Object.keys(patch).length) return this;\n    this._pendingPatch = { ...this._pendingPatch, ...patch };\n    const helios = this.context?.helios ?? null;\n    if (!helios) {\n      this.state = buildAppearanceSnapshot(null, this._pendingPatch);\n      return this;\n    }\n    this._muteSourceEvents += 1;\n    helios._suppressStateBindingUiEvent = (helios._suppressStateBindingUiEvent ?? 0) + 1;\n    try {\n      for (const [name, nextValue] of Object.entries(patch)) {\n        const accessor = name === 'background' ? 'background' : name;\n        if (!ACCESSOR_NAME_SET.has(accessor) && accessor !== 'background') continue;\n        if (typeof helios?.[accessor] !== 'function') continue;\n        helios[accessor](nextValue);\n      }\n    } finally {\n      helios._suppressStateBindingUiEvent = Math.max(0, (helios._suppressStateBindingUiEvent ?? 1) - 1);\n      this._muteSourceEvents = Math.max(0, this._muteSourceEvents - 1);\n    }\n    return this;\n  }\n}\n\nfor (const accessorName of ACCESSOR_NAMES) {\n  AppearanceBehavior.prototype[accessorName] = function accessor(value) {\n    const helios = this.context?.helios ?? null;\n    if (arguments.length === 0) {\n      if (typeof helios?.[accessorName] === 'function') {\n        return cloneSerializable(helios[accessorName]());\n      }\n      return cloneSerializable(this._pendingPatch[accessorName]);\n    }\n\n    if (!helios || typeof helios?.[accessorName] !== 'function') {\n      this._pendingPatch[accessorName] = cloneSerializable(value);\n      this.emitChange('local-update', {\n        name: accessorName,\n        source: 'program',\n        trackOverride: true,\n        storageKeys: [LEGACY_APPEARANCE_PATHS[accessorName]].filter(Boolean),\n      });\n      return this;\n    }\n\n    this._muteSourceEvents += 1;\n    try {\n      helios[accessorName](cloneSerializable(value));\n    } finally {\n      this._muteSourceEvents = Math.max(0, this._muteSourceEvents - 1);\n    }\n    this.emitChange('command', {\n      name: accessorName,\n      source: 'program',\n      trackOverride: true,\n      storageKeys: [LEGACY_APPEARANCE_PATHS[accessorName]].filter(Boolean),\n    });\n    return this;\n  };\n}\n\nAppearanceBehavior.prototype.clearColor = function clearColor(value) {\n  if (arguments.length === 0) return this.background();\n  return this.background(value);\n};\n\nexport default AppearanceBehavior;\n","function subscribe(target, eventName, handler, options) {\n  if (!target || typeof handler !== 'function') return () => {};\n  if (typeof target.on === 'function') {\n    return target.on(eventName, handler, options) ?? (() => {});\n  }\n  if (typeof target.addEventListener === 'function') {\n    target.addEventListener(eventName, handler, options);\n    return () => target.removeEventListener(eventName, handler, options);\n  }\n  return () => {};\n}\n\nexport class BehaviorContext {\n  constructor(manager) {\n    this.manager = manager;\n  }\n\n  get helios() {\n    return this.manager.helios ?? null;\n  }\n\n  get network() {\n    return this.helios?.network ?? null;\n  }\n\n  get ui() {\n    return this.manager.ui ?? null;\n  }\n\n  get behaviors() {\n    return this.manager;\n  }\n\n  subscribe(target, eventName, handler, options) {\n    return subscribe(target, eventName, handler, options);\n  }\n\n  getBehavior(id) {\n    return this.manager.get(id);\n  }\n}\n\nexport default BehaviorContext;\n","import { Behavior } from './Behavior.js';\nimport { BehaviorContext } from './BehaviorContext.js';\n\n/**\n * Runtime owner for active behavior instances on a Helios visualization.\n *\n * @public\n * @param {import('../Helios.js').Helios} helios - Visualization controller that\n * behaviors will attach to.\n * @param {BehaviorRegistry} registry - Registry used to instantiate named\n * behaviors.\n * @returns {BehaviorManager} Manager with no active behaviors attached.\n * @remarks The manager creates, attaches, detaches, serializes, and restores\n * behavior instances against a shared Helios context. Use the higher-level\n * `helios.behavior` namespace for most app code.\n */\nexport class BehaviorManager {\n  constructor(helios, registry) {\n    this.helios = helios ?? null;\n    this.registry = registry;\n    this.ui = null;\n    this._attached = new Map();\n    this._storageBindings = new Map();\n  }\n\n  setUI(ui) {\n    this.ui = ui ?? null;\n    return this;\n  }\n\n  has(id) {\n    return this._attached.has(String(id ?? '').trim());\n  }\n\n  get(id) {\n    return this._attached.get(String(id ?? '').trim()) ?? null;\n  }\n\n  entries() {\n    return Array.from(this._attached.entries());\n  }\n\n  values() {\n    return Array.from(this._attached.values());\n  }\n\n  use(idOrBehavior, options = {}) {\n    if (typeof idOrBehavior === 'string') {\n      const existing = this.get(idOrBehavior);\n      if (existing) {\n        existing.update(options);\n        return existing;\n      }\n      const created = this.registry.create(idOrBehavior, options);\n      return this._attach(created);\n    }\n\n    const behavior = idOrBehavior;\n    if (!(behavior instanceof Behavior) && (!behavior || typeof behavior.attach !== 'function')) {\n      throw new TypeError('behaviors.use(...) expects a registered behavior name or a Behavior instance');\n    }\n    if (options && typeof options === 'object' && Object.keys(options).length > 0) {\n      behavior.update?.(options);\n    }\n    return this._attach(behavior);\n  }\n\n  detach(id) {\n    const key = String(id ?? '').trim();\n    const existing = this._attached.get(key);\n    if (!existing) return false;\n    this._storageBindings.get(key)?.();\n    this._storageBindings.delete(key);\n    existing.detach?.();\n    this._attached.delete(key);\n    return true;\n  }\n\n  detachAll() {\n    for (const [id, behavior] of this._attached.entries()) {\n      try {\n        this._storageBindings.get(id)?.();\n        this._storageBindings.delete(id);\n        behavior.detach?.();\n      } finally {\n        this._attached.delete(id);\n      }\n    }\n    return this;\n  }\n\n  destroy() {\n    this.detachAll();\n    this.ui = null;\n    this.helios = null;\n  }\n\n  serialize() {\n    const snapshot = {};\n    for (const [id, behavior] of this._attached.entries()) {\n      if (typeof behavior.serialize !== 'function') continue;\n      snapshot[id] = behavior.serialize();\n    }\n    return snapshot;\n  }\n\n  restore(snapshot = {}) {\n    if (!snapshot || typeof snapshot !== 'object') return this;\n    for (const [id, state] of Object.entries(snapshot)) {\n      const behavior = this.get(id) ?? (this.registry.has(id) ? this.use(id) : null);\n      behavior?.restore?.(state);\n    }\n    return this;\n  }\n\n  _attach(behavior) {\n    const id = String(behavior?.id ?? behavior?.constructor?.id ?? '').trim();\n    if (!id) throw new Error('Attached behaviors must expose an id');\n    const existing = this._attached.get(id);\n    if (existing && existing !== behavior) {\n      this._storageBindings.get(id)?.();\n      this._storageBindings.delete(id);\n      existing.detach?.();\n    }\n    behavior.id = id;\n    this._attached.set(id, behavior);\n    try {\n      behavior.attach?.(new BehaviorContext(this));\n    } catch (error) {\n      this._attached.delete(id);\n      throw error;\n    }\n    const stateManager = this.helios?.states ?? this.helios?.storage;\n    if (typeof behavior.stateEntries === 'function' && typeof stateManager?.register === 'function') {\n      const entries = behavior.stateEntries();\n      if (entries && typeof entries === 'object') {\n        const cleanup = stateManager.register(behavior, `behaviors.${id}`, entries);\n        if (typeof cleanup === 'function') this._storageBindings.set(id, cleanup);\n      }\n    }\n    return behavior;\n  }\n}\n\nexport default BehaviorManager;\n","/**\n * Registry mapping behavior ids to behavior constructors or factories.\n *\n * @public\n * @returns {BehaviorRegistry} Empty registry ready for built-in or custom\n * behavior registration.\n * @remarks The registry is the public extension point behind\n * `helios.registerBehavior(...)`; created behaviors still attach through\n * `BehaviorManager`, so persistence and cleanup flow remains consistent.\n * @example\n * const registry = new BehaviorRegistry().register('custom', CustomBehavior);\n */\nexport class BehaviorRegistry {\n  constructor() {\n    this._entries = new Map();\n  }\n\n  register(id, behavior) {\n    const key = String(id ?? '').trim();\n    if (!key) throw new Error('BehaviorRegistry.register(id, behavior) requires a non-empty id');\n    if (typeof behavior !== 'function') {\n      throw new TypeError(`BehaviorRegistry entry for \"${key}\" must be a constructor or factory`);\n    }\n    this._entries.set(key, behavior);\n    return this;\n  }\n\n  has(id) {\n    return this._entries.has(String(id ?? '').trim());\n  }\n\n  create(id, options) {\n    const key = String(id ?? '').trim();\n    const entry = this._entries.get(key);\n    if (!entry) throw new Error(`Unknown behavior \"${key}\"`);\n    const instance = entry.prototype ? new entry(options) : entry(options);\n    if (!instance || typeof instance !== 'object') {\n      throw new Error(`Behavior factory for \"${key}\" did not return an instance`);\n    }\n    instance.id = key;\n    return instance;\n  }\n}\n\nexport default BehaviorRegistry;\n","import { Behavior } from './Behavior.js';\nimport {\n  buildFigureExportPresetList,\n  normalizeFigureExportFormat,\n  resolveFigureExportAlphaMode,\n  resolveFigureExportOptions,\n  resolveFigureExportSupersampling,\n  resolveFigureLegendScale,\n  resolveFigureTransparentBackground,\n  sanitizeFigureExportBaseName,\n} from '../export/figureExport.js';\n\nconst STABLE_CONFIG_KEYS = Object.freeze([\n  'baseName',\n  'format',\n  'preset',\n  'width',\n  'height',\n  'supersampling',\n  'includeLabels',\n  'includeLegends',\n  'includeInterface',\n  'legendScale',\n  'transparentBackground',\n  'alphaMode',\n]);\n\nfunction clampPositiveInt(value, fallback = null) {\n  if (value == null || value === '') return fallback;\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric) || numeric <= 0) return fallback;\n  return Math.max(1, Math.round(numeric));\n}\n\nfunction cloneSerializable(value) {\n  if (Array.isArray(value)) return value.map((entry) => cloneSerializable(entry));\n  if (ArrayBuffer.isView(value)) return Array.from(value, (entry) => cloneSerializable(entry));\n  if (!value || typeof value !== 'object') return value;\n  const next = {};\n  for (const [key, entry] of Object.entries(value)) {\n    if (typeof entry === 'function') continue;\n    next[key] = cloneSerializable(entry);\n  }\n  return next;\n}\n\nfunction normalizePreset(value, fallback = null) {\n  if (value == null || value === '') return fallback;\n  return String(value).trim().toLowerCase() || fallback;\n}\n\nfunction normalizeConfigPatch(options = {}) {\n  const next = {};\n  if (!options || typeof options !== 'object') return next;\n\n  if (Object.prototype.hasOwnProperty.call(options, 'baseName')) {\n    next.baseName = sanitizeFigureExportBaseName(options.baseName, 'figure');\n  } else if (Object.prototype.hasOwnProperty.call(options, 'name')) {\n    next.baseName = sanitizeFigureExportBaseName(options.name, 'figure');\n  } else if (Object.prototype.hasOwnProperty.call(options, 'filename')) {\n    next.baseName = sanitizeFigureExportBaseName(String(options.filename).replace(/\\.[^.]+$/u, ''), 'figure');\n  }\n\n  if (Object.prototype.hasOwnProperty.call(options, 'format')) {\n    next.format = normalizeFigureExportFormat(options.format, 'png');\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'preset')) {\n    next.preset = normalizePreset(options.preset, null);\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'width')) {\n    next.width = clampPositiveInt(options.width, null);\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'height')) {\n    next.height = clampPositiveInt(options.height, null);\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'customSize') && options.customSize && typeof options.customSize === 'object') {\n    if (Object.prototype.hasOwnProperty.call(options.customSize, 'width')) {\n      next.width = clampPositiveInt(options.customSize.width, null);\n    }\n    if (Object.prototype.hasOwnProperty.call(options.customSize, 'height')) {\n      next.height = clampPositiveInt(options.customSize.height, null);\n    }\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'supersampling')) {\n    next.supersampling = resolveFigureExportSupersampling(options.supersampling, 1);\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'includeLabels')) {\n    next.includeLabels = options.includeLabels === true;\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'includeLegends')) {\n    next.includeLegends = options.includeLegends !== false;\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'includeInterface')) {\n    next.includeInterface = options.includeInterface === true;\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'legendScale')) {\n    next.legendScale = resolveFigureLegendScale(options.legendScale, 1);\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'transparentBackground')) {\n    next.transparentBackground = resolveFigureTransparentBackground(options.transparentBackground, false);\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'alphaMode')) {\n    next.alphaMode = resolveFigureExportAlphaMode(options.alphaMode, 'straight');\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'showFrame')) {\n    next.showFrame = options.showFrame === true;\n  }\n\n  return next;\n}\n\nfunction pickStableConfig(config = {}) {\n  const next = {};\n  for (const key of STABLE_CONFIG_KEYS) {\n    if (!Object.prototype.hasOwnProperty.call(config, key)) continue;\n    next[key] = cloneSerializable(config[key]);\n  }\n  return next;\n}\n\nfunction summarizeBehaviorState(behavior, fallbackEnabled = null) {\n  const state = behavior?.getPublicState?.() ?? behavior?.state ?? null;\n  if (!state || typeof state !== 'object') return { attached: false, enabled: fallbackEnabled };\n  const enabled = Object.prototype.hasOwnProperty.call(state, 'enabled')\n    ? state.enabled === true\n    : fallbackEnabled;\n  return { attached: true, enabled };\n}\n\nfunction summarizeViewState(helios) {\n  const camera = helios?.renderer?.camera ?? null;\n  return {\n    width: Number(helios?.layers?.size?.width ?? helios?.size?.width ?? 1),\n    height: Number(helios?.layers?.size?.height ?? helios?.size?.height ?? 1),\n    mode: camera?.mode ?? null,\n    projection: camera?.projection ?? null,\n  };\n}\n\n/**\n * Built-in behavior for figure export settings and preview capture.\n *\n * @public\n * @param {object} [options] - Figure filename, format, preset, custom\n * dimensions, supersampling, label/legend/interface inclusion, transparency,\n * and frame-preview options.\n * @returns {ExporterBehavior} Behavior that stores export settings and calls\n * `helios.exportFigureBlob`, `helios.exportFigurePreviewBlob`, or\n * `helios.exportFigure`.\n * @remarks The actual capture capability depends on the active renderer and\n * should be checked through `capabilities()` after the renderer is ready.\n */\nexport class ExporterBehavior extends Behavior {\n  static id = 'exporter';\n\n  constructor(options = {}) {\n    super(options);\n    this.config = {\n      baseName: 'figure',\n      format: 'png',\n      preset: null,\n      width: null,\n      height: null,\n      supersampling: 1,\n      includeLabels: false,\n      includeLegends: true,\n      includeInterface: false,\n      legendScale: 1,\n      transparentBackground: false,\n      alphaMode: 'straight',\n      showFrame: false,\n      ...normalizeConfigPatch(options),\n    };\n    this.state = this._computeState();\n  }\n\n  attach(context) {\n    super.attach(context);\n    for (const id of ['appearance', 'labels', 'legends', 'filters', 'layout']) {\n      const dependency = this.context?.getBehavior(id);\n      if (!dependency?.on) continue;\n      this.addCleanup(dependency.on('change', () => {\n        this.emitChange(`${id}-behavior`);\n      }));\n    }\n    this.addCleanup(this.context.subscribe(this.context?.helios, 'network:replaced', () => {\n      this.emitChange('network-replaced');\n    }));\n    this.addCleanup(this.context.subscribe(this.context?.helios, 'renderer:changed', () => {\n      this.emitChange('renderer-changed');\n    }));\n    this.state = this._computeState();\n    this.emitChange('attach');\n    return this;\n  }\n\n  update(options = {}) {\n    super.update(options);\n    const patch = normalizeConfigPatch(options);\n    if (Object.keys(patch).length === 0) return this;\n    this.config = {\n      ...this.config,\n      ...patch,\n    };\n    this.state = this._computeState();\n    this.emitChange('options');\n    return this;\n  }\n\n  serialize() {\n    return {\n      options: pickStableConfig(this.config),\n    };\n  }\n\n  restore(snapshot = {}) {\n    const options = snapshot?.options && typeof snapshot.options === 'object' ? snapshot.options : {};\n    this.update(options);\n    this.emitChange('restore');\n    return this;\n  }\n\n  getPublicState() {\n    this.state = this._computeState();\n    return cloneSerializable(this.state);\n  }\n\n  emitChange(reason, detail = {}) {\n    this.state = this._computeState();\n    this.emit('change', { reason, state: cloneSerializable(this.state), ...detail });\n  }\n\n  exporter(options) {\n    if (arguments.length === 0) return this.getPublicState();\n    return this.update(options);\n  }\n\n  baseName(value) {\n    if (arguments.length === 0) return this.config.baseName;\n    return this.update({ baseName: value });\n  }\n\n  format(value) {\n    if (arguments.length === 0) return this.config.format;\n    return this.update({ format: value });\n  }\n\n  preset(value) {\n    if (arguments.length === 0) return this.config.preset;\n    return this.update({ preset: value });\n  }\n\n  customSize(value) {\n    if (arguments.length === 0) {\n      return {\n        width: this.config.width,\n        height: this.config.height,\n      };\n    }\n    return this.update({ customSize: value });\n  }\n\n  supersampling(value) {\n    if (arguments.length === 0) return this.config.supersampling;\n    return this.update({ supersampling: value });\n  }\n\n  includeLabels(value) {\n    if (arguments.length === 0) return this.config.includeLabels === true;\n    return this.update({ includeLabels: value === true });\n  }\n\n  includeLegends(value) {\n    if (arguments.length === 0) return this.config.includeLegends !== false;\n    return this.update({ includeLegends: value !== false });\n  }\n\n  includeInterface(value) {\n    if (arguments.length === 0) return this.config.includeInterface === true;\n    return this.update({ includeInterface: value === true });\n  }\n\n  legendScale(value) {\n    if (arguments.length === 0) return this.config.legendScale;\n    return this.update({ legendScale: value });\n  }\n\n  transparentBackground(value) {\n    if (arguments.length === 0) return this.config.transparentBackground === true;\n    return this.update({ transparentBackground: value === true });\n  }\n\n  alphaMode(value) {\n    if (arguments.length === 0) return this.config.alphaMode;\n    return this.update({ alphaMode: value });\n  }\n\n  showFrame(value) {\n    if (arguments.length === 0) return this.config.showFrame === true;\n    return this.update({ showFrame: value === true });\n  }\n\n  getCapabilities(options = {}) {\n    const helios = this.context?.helios ?? null;\n    const supersampling = Object.prototype.hasOwnProperty.call(options, 'supersampling')\n      ? resolveFigureExportSupersampling(options.supersampling, this.config.supersampling)\n      : this.config.supersampling;\n    return helios?.getFigureExportCapabilities?.({ supersampling }) ?? {\n      supersampling,\n      maxBitmapDimension: 8192,\n      windowDevicePixelRatio: globalThis.window?.devicePixelRatio ?? 1,\n      defaultPreset: 'window',\n      presets: buildFigureExportPresetList(\n        helios?.layers?.size ?? helios?.size ?? { width: 1, height: 1 },\n        { maxBitmapDimension: 8192, windowDevicePixelRatio: globalThis.window?.devicePixelRatio ?? 1 },\n        supersampling,\n      ),\n    };\n  }\n\n  getResolvedOptions(overrides = {}) {\n    const helios = this.context?.helios ?? null;\n    const patch = normalizeConfigPatch(overrides);\n    const nextConfig = {\n      ...this.config,\n      ...patch,\n    };\n    const request = {\n      baseName: nextConfig.baseName,\n      filename: nextConfig.baseName,\n      format: nextConfig.format,\n      preset: nextConfig.preset,\n      width: nextConfig.width,\n      height: nextConfig.height,\n      supersampling: nextConfig.supersampling,\n      includeLabels: nextConfig.includeLabels,\n      includeLegends: nextConfig.includeLegends,\n      includeInterface: nextConfig.includeInterface,\n      legendScale: nextConfig.legendScale,\n      transparentBackground: nextConfig.transparentBackground,\n      alphaMode: nextConfig.alphaMode,\n    };\n    if (typeof helios?._resolveFigureExportOptions === 'function') {\n      return helios._resolveFigureExportOptions(request);\n    }\n    return resolveFigureExportOptions(request, {\n      renderer: helios?.renderer,\n      capability: this.getCapabilities({ supersampling: request.supersampling }),\n      windowSize: helios?.layers?.size ?? helios?.size ?? { width: 1, height: 1 },\n      windowDevicePixelRatio: globalThis.window?.devicePixelRatio ?? 1,\n    });\n  }\n\n  async exportBlob(options = {}) {\n    const helios = this.context?.helios ?? null;\n    if (typeof helios?.exportFigureBlob !== 'function') {\n      throw new Error('ExporterBehavior requires helios.exportFigureBlob(...)');\n    }\n    const resolved = this.getResolvedOptions(options);\n    return await helios.exportFigureBlob(resolved);\n  }\n\n  async exportPreviewBlob(options = {}, previewOptions = {}) {\n    const helios = this.context?.helios ?? null;\n    if (typeof helios?.exportFigurePreviewBlob !== 'function') {\n      throw new Error('ExporterBehavior requires helios.exportFigurePreviewBlob(...)');\n    }\n    const resolved = this.getResolvedOptions(options);\n    return await helios.exportFigurePreviewBlob(resolved, previewOptions);\n  }\n\n  async export(options = {}) {\n    const helios = this.context?.helios ?? null;\n    if (typeof helios?.exportFigure !== 'function') {\n      throw new Error('ExporterBehavior requires helios.exportFigure(...)');\n    }\n    const resolved = this.getResolvedOptions(options);\n    return await helios.exportFigure(resolved);\n  }\n\n  _computeState() {\n    const helios = this.context?.helios ?? null;\n    const capability = this.getCapabilities();\n    const resolved = this.getResolvedOptions();\n    const labels = summarizeBehaviorState(this.context?.getBehavior('labels'), false);\n    const legends = summarizeBehaviorState(this.context?.getBehavior('legends'), true);\n    const filters = summarizeBehaviorState(this.context?.getBehavior('filters'), false);\n    const layoutBehavior = this.context?.getBehavior('layout');\n    return {\n      ...cloneSerializable(this.config),\n      filename: resolved.filename,\n      fitsCapability: resolved.fitsCapability === true,\n      resolved: cloneSerializable(resolved),\n      capability: cloneSerializable(capability),\n      dependencies: {\n        labels,\n        legends,\n        filters,\n        layout: {\n          attached: Boolean(layoutBehavior),\n          running: layoutBehavior?.state?.running === true,\n        },\n      },\n      view: summarizeViewState(helios),\n    };\n  }\n}\n\nexport default ExporterBehavior;\n","import { Behavior } from './Behavior.js';\nimport { HeliosFilter } from '../filters/HeliosFilter.js';\n\nfunction cloneRules(rules = []) {\n  return Array.isArray(rules)\n    ? rules.map((rule) => ({\n      ...rule,\n      values: Array.isArray(rule?.values) ? [...rule.values] : rule?.values,\n    }))\n    : [];\n}\n\nfunction createFilterModel(options = {}) {\n  if (options instanceof HeliosFilter) return options.clone();\n  return new HeliosFilter({\n    id: options.id,\n    name: options.name,\n    scope: options.scope,\n    rules: cloneRules(options.rules),\n  });\n}\n\nfunction normalizeMinComponentSize(value) {\n  const numeric = Math.floor(Number(value));\n  return Number.isFinite(numeric) && numeric > 1 ? numeric : 1;\n}\n\nfunction summarizeFilter(helios, model) {\n  const graphFilter = helios?.getGraphFilter?.() ?? null;\n  return {\n    enabled: graphFilter?.enabled === true,\n    scope: model?.getScope?.() ?? graphFilter?.scope ?? 'render',\n    rules: cloneRules(model?.getRules?.() ?? []),\n    minComponentSize: normalizeMinComponentSize(graphFilter?.options?.minComponentSize),\n    options: graphFilter?.options ? { ...graphFilter.options } : null,\n    nodeCount: graphFilter?.nodeCount ?? null,\n    edgeCount: graphFilter?.edgeCount ?? null,\n    baseNodeCount: graphFilter?.baseNodeCount ?? null,\n    baseEdgeCount: graphFilter?.baseEdgeCount ?? null,\n    error: graphFilter?.error ?? null,\n  };\n}\n\n/**\n * Built-in behavior for graph filtering.\n *\n * @public\n * @param {object|HeliosFilter} [options] - Filter model or rule options for\n * numeric, categorical, string, and query rules.\n * @returns {FilterBehavior} Behavior that applies render-only or\n * render-plus-layout filtered graph views.\n * @remarks `scope: \"render\"` keeps the layout topology intact; `scope:\n * \"render+layout\"` rebuilds the active graph view used by both rendering and\n * dynamic layouts.\n */\nexport class FilterBehavior extends Behavior {\n  static id = 'filters';\n\n  constructor(options = {}) {\n    super(options);\n    this._muteGraphSync = 0;\n    this.minComponentSize = normalizeMinComponentSize(options.minComponentSize);\n    this.filterModel = createFilterModel(options.filterModel ?? options);\n    this.state = summarizeFilter(null, this.filterModel);\n  }\n\n  attach(context) {\n    super.attach(context);\n    this.syncFromHelios({ preferActiveModel: true, silent: true });\n    this.addCleanup(this.context.subscribe(this.context?.helios, 'graph:filter-changed', () => {\n      if (this._muteGraphSync > 0) return;\n      this.syncFromHelios({ preferActiveModel: true, silent: true });\n      this.emitChange('graph-filter');\n    }));\n    this.addCleanup(this.context.subscribe(this.context?.helios, 'network:replaced', () => {\n      this.syncFromHelios({ preferActiveModel: true, silent: true });\n      this.emitChange('network-replaced', { source: 'refresh', trackOverride: false });\n    }));\n    return this;\n  }\n\n  update(options = {}) {\n    super.update(options);\n    if (!options || typeof options !== 'object') return this;\n    if (options.filterModel instanceof HeliosFilter) {\n      return this.setFilterModel(options.filterModel);\n    }\n    const nextModel = createFilterModel({\n      id: options.id ?? this.filterModel?.id,\n      name: options.name ?? this.filterModel?.name,\n      scope: options.scope ?? this.filterModel?.getScope?.(),\n      rules: Object.prototype.hasOwnProperty.call(options, 'rules')\n        ? options.rules\n        : this.filterModel?.getRules?.(),\n    });\n    if (Object.prototype.hasOwnProperty.call(options, 'minComponentSize')) {\n      this.minComponentSize = normalizeMinComponentSize(options.minComponentSize);\n    }\n    return this.setFilterModel(nextModel, { reason: 'options' });\n  }\n\n  serialize() {\n    return {\n      options: {\n        id: this.filterModel?.id ?? null,\n        name: this.filterModel?.name ?? '',\n      },\n      filter: {\n        scope: this.filterModel?.getScope?.() ?? 'render',\n        rules: cloneRules(this.filterModel?.getRules?.() ?? []),\n        minComponentSize: this.minComponentSize,\n      },\n    };\n  }\n\n  stateEntries() {\n    const subscribe = (notify) => this.on('change', (event) => notify(undefined, event?.detail ?? event));\n    return {\n      enabled: {\n        description: 'Whether graph filters are active.',\n        default: this.state.enabled === true,\n        type: 'boolean',\n        scope: 'workspace',\n        aliases: ['filters.enabled'],\n        ui: {\n          label: 'Enabled',\n          controller: 'toggle',\n        },\n        getter: () => this.state.enabled === true,\n        setter: (value) => {\n          if (value === false) this.clear();\n          else if (this.filterModel?.hasCriteria?.() || this.minComponentSize > 1) this.setFilterModel(this.filterModel, { reason: 'enabled' });\n        },\n        subscribe,\n      },\n      scope: {\n        description: 'Filter scope.',\n        default: this.filterModel?.getScope?.() ?? 'render',\n        type: 'string',\n        scope: 'workspace',\n        aliases: ['filters.scope'],\n        ui: {\n          label: 'Scope',\n          controller: 'select',\n          options: ['render', 'render+layout'],\n        },\n        getter: () => this.filterModel?.getScope?.() ?? 'render',\n        setter: (value) => this.setScope(value),\n        subscribe,\n      },\n      rules: {\n        description: 'Active graph filter rules.',\n        default: cloneRules(this.filterModel?.getRules?.() ?? []),\n        type: 'array',\n        scope: 'workspace',\n        aliases: ['filters.rules'],\n        ui: {\n          label: 'Rules',\n          controller: 'custom',\n        },\n        getter: () => cloneRules(this.filterModel?.getRules?.() ?? []),\n        setter: (value) => this.replaceRules({\n          nodeRules: cloneRules(value).filter((rule) => rule?.scope !== 'edge'),\n          edgeRules: cloneRules(value).filter((rule) => rule?.scope === 'edge'),\n          scope: this.filterModel?.getScope?.() ?? 'render',\n        }),\n        subscribe,\n      },\n      minComponentSize: {\n        description: 'Minimum active connected-component size to keep in the graph filter.',\n        default: this.minComponentSize,\n        type: 'number',\n        scope: 'workspace',\n        aliases: ['filters.minComponentSize'],\n        ui: {\n          label: 'Min component size',\n          controller: 'number',\n        },\n        getter: () => this.minComponentSize,\n        setter: (value) => this.setMinComponentSize(value),\n        subscribe,\n      },\n    };\n  }\n\n  restore(snapshot = {}) {\n    const filter = snapshot?.filter && typeof snapshot.filter === 'object' ? snapshot.filter : {};\n    const options = snapshot?.options && typeof snapshot.options === 'object' ? snapshot.options : {};\n    const restored = createFilterModel({\n      id: options.id ?? this.filterModel?.id,\n      name: options.name ?? this.filterModel?.name,\n      scope: filter.scope ?? this.filterModel?.getScope?.(),\n      rules: filter.rules ?? [],\n    });\n    this.minComponentSize = normalizeMinComponentSize(filter.minComponentSize);\n    this.setFilterModel(restored, { reason: 'restore', trackOverride: false });\n    this.emitChange('restore', { source: 'restore', trackOverride: false });\n    return this;\n  }\n\n  emitChange(reason, detail = {}) {\n    this.emit('change', { reason, state: this.getPublicState(), ...detail });\n  }\n\n  getPublicState() {\n    return {\n      ...this.state,\n      rules: cloneRules(this.state.rules),\n      options: this.state.options ? { ...this.state.options } : null,\n    };\n  }\n\n  getModel() {\n    return this.filterModel?.clone?.() ?? createFilterModel();\n  }\n\n  filters(options) {\n    if (arguments.length === 0) return this.getPublicState();\n    if (options == null || options === false || options?.enabled === false) return this.clear();\n    if (options instanceof HeliosFilter) return this.setFilterModel(options);\n    return this.update(options);\n  }\n\n  setScope(scope) {\n    const next = this.getModel();\n    next.setScope(scope);\n    return this.setFilterModel(next, { reason: 'scope' });\n  }\n\n  setMinComponentSize(value) {\n    this.minComponentSize = normalizeMinComponentSize(value);\n    return this.setFilterModel(this.filterModel, { reason: 'min-component-size' });\n  }\n\n  /**\n   * Replace all active node and edge filter rules.\n   *\n   * @public\n   * @apiSection Filtering And State\n   * @param {object} [options] - Replacement filter options.\n   * @param {Array<object>} [options.nodeRules] - Node rules to apply.\n   * @param {Array<object>} [options.edgeRules] - Edge rules to apply.\n   * @param {'render'|'render+layout'} [options.scope] - Filter scope.\n   * @returns {FilterBehavior} This behavior instance.\n   * @remarks `render+layout` changes the graph view consumed by dynamic\n   * layouts. Use `render` when hiding items should not change layout forces.\n   */\n  replaceRules({ nodeRules = [], edgeRules = [], scope, minComponentSize } = {}) {\n    const next = createFilterModel({\n      id: this.filterModel?.id,\n      name: this.filterModel?.name,\n      scope: scope ?? this.filterModel?.getScope?.(),\n      rules: [...cloneRules(nodeRules), ...cloneRules(edgeRules)],\n    });\n    if (minComponentSize != null) {\n      this.minComponentSize = normalizeMinComponentSize(minComponentSize);\n    }\n    return this.setFilterModel(next, { reason: 'rules' });\n  }\n\n  /**\n   * Remove the active graph filter and restore the unfiltered render view.\n   *\n   * @public\n   * @apiSection Filtering And State\n   * @returns {FilterBehavior} This behavior instance.\n   */\n  clear() {\n    const helios = this.context?.helios ?? null;\n    this.filterModel = createFilterModel({\n      id: this.filterModel?.id,\n      name: this.filterModel?.name,\n      scope: 'render',\n      rules: [],\n    });\n    this.minComponentSize = 1;\n    if (helios?.clearGraphFilter) {\n      this._muteGraphSync += 1;\n      try {\n        helios.clearGraphFilter();\n      } finally {\n        this._muteGraphSync -= 1;\n      }\n    }\n    this.state = summarizeFilter(helios, this.filterModel);\n    this.emitChange('clear');\n    return this;\n  }\n\n  setFilterModel(model, { reason = 'model', trackOverride = true } = {}) {\n    this.filterModel = createFilterModel(model);\n    const helios = this.context?.helios ?? null;\n    const graphOptions = this.filterModel.toGraphFilterOptions();\n    if (this.minComponentSize > 1) {\n      graphOptions.minComponentSize = this.minComponentSize;\n    }\n    if (helios?.setGraphFilter) {\n      this._muteGraphSync += 1;\n      try {\n        if (this.filterModel.hasCriteria() || this.minComponentSize > 1) helios.setGraphFilter(graphOptions);\n        else helios.clearGraphFilter?.();\n      } finally {\n        this._muteGraphSync -= 1;\n      }\n    }\n    this.state = summarizeFilter(helios, this.filterModel);\n    this.emitChange(reason, {\n      trackOverride: trackOverride !== false,\n      storageKeys: ['filters.enabled', 'filters.scope', 'filters.rules', 'filters.minComponentSize'],\n    });\n    return this;\n  }\n\n  syncFromHelios({ preferActiveModel = false, silent = false } = {}) {\n    const helios = this.context?.helios ?? null;\n    const activeModel = preferActiveModel ? (helios?.getActiveHeliosFilter?.() ?? null) : null;\n    if (activeModel instanceof HeliosFilter) {\n      this.filterModel = activeModel.clone();\n    } else if (!this.filterModel) {\n      this.filterModel = createFilterModel();\n    }\n    const graphFilter = helios?.getGraphFilter?.() ?? null;\n    if (Object.prototype.hasOwnProperty.call(graphFilter?.options ?? {}, 'minComponentSize')) {\n      this.minComponentSize = normalizeMinComponentSize(graphFilter.options.minComponentSize);\n    } else if (graphFilter?.enabled === false || graphFilter?.options) {\n      this.minComponentSize = 1;\n    }\n    this.state = summarizeFilter(helios, this.filterModel);\n    if (!silent) this.emitChange('sync');\n    return this;\n  }\n}\n\nexport default FilterBehavior;\n","import { AttributeType } from 'helios-network';\n\nexport const DEFAULT_NODE_SELECTED_STYLE = Object.freeze({\n  sizeMul: 2,\n  opacityMul: 1,\n  outlineMul: 2,\n  discard: false,\n  forceMaxAlpha: true,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0.34, 0.16, 0.02, 0],\n});\n\nexport const DEFAULT_NODE_HIGHLIGHT_STYLE = Object.freeze({\n  sizeMul: 1.5,\n  opacityMul: 1,\n  outlineMul: 1.25,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0.02, 0.18, 0.34, 0],\n});\n\nexport const DEFAULT_NODE_HOVER_STYLE = Object.freeze({\n  sizeMul: 1.35,\n  opacityMul: 1,\n  outlineMul: 1.1,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0.08, 0.08, 0.08, 0],\n});\n\nexport const DEFAULT_EDGE_SELECTED_STYLE = Object.freeze({\n  widthMul: 1.5,\n  opacityMul: 1,\n  discard: false,\n  forceMaxAlpha: true,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0.3, 0.16, 0.04, 0],\n});\n\nexport const DEFAULT_EDGE_HIGHLIGHT_STYLE = Object.freeze({\n  widthMul: 1.25,\n  opacityMul: 50,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0.03, 0.16, 0.28, 0],\n});\n\nexport const DEFAULT_EDGE_HOVER_STYLE = Object.freeze({\n  widthMul: 1.35,\n  opacityMul: 50,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0.08, 0.08, 0.08, 0],\n});\n\nexport const NEUTRAL_NODE_NO_STATE_STYLE = Object.freeze({\n  sizeMul: 1,\n  opacityMul: 1,\n  outlineMul: 1,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0, 0, 0, 0],\n});\n\nexport const NEUTRAL_EDGE_NO_STATE_STYLE = Object.freeze({\n  widthMul: 1,\n  opacityMul: 1,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0, 0, 0, 0],\n});\n\nexport const DEFAULT_OTHER_SELECTED_NODE_STYLE = Object.freeze({\n  sizeMul: 0.75,\n  opacityMul: 1,\n  outlineMul: 0.75,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0, 0, 0, 0],\n});\n\nexport const DEFAULT_OTHER_SELECTED_EDGE_STYLE = Object.freeze({\n  widthMul: 0.85,\n  opacityMul: 0.85,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0, 0, 0, 0],\n});\n\nexport const DEFAULT_OTHER_HIGHLIGHT_NODE_STYLE = Object.freeze({\n  sizeMul: 0.9,\n  opacityMul: 1,\n  outlineMul: 0.9,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0, 0, 0, 0],\n});\n\nexport const DEFAULT_OTHER_HIGHLIGHT_EDGE_STYLE = Object.freeze({\n  widthMul: 0.9,\n  opacityMul: 0.9,\n  discard: false,\n  forceMaxAlpha: false,\n  colorMul: [1, 1, 1, 1],\n  colorAdd: [0, 0, 0, 0],\n});\n\nexport const DEFAULT_AUTO_BACKGROUND_TONE_DISABLED = Object.freeze({\n  enabled: true,\n  amount: 0.15,\n});\n\nexport const DEFAULT_AUTO_BACKGROUND_TONE_SELECTED = Object.freeze({\n  enabled: true,\n  amount: 0.4,\n});\n\nexport const DEFAULT_SELECTION_FOCUS_MAX_ZOOM = 3;\nexport const DEFAULT_SELECTION_FOCUS_MIN_DISTANCE = 260;\nexport const DEFAULT_SELECTION_FOCUS_ZOOM_TOLERANCE = 0.05;\nexport const CURRENT_SELECTION_VALUE = '__current_selection__';\n\nexport function clampNumber(value, { min = Number.NEGATIVE_INFINITY, max = Number.POSITIVE_INFINITY } = {}) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return null;\n  return Math.min(max, Math.max(min, numeric));\n}\n\nexport function rgbaArray(value, fallback) {\n  const seed = Array.isArray(fallback) ? fallback : [1, 1, 1, 1];\n  if (!Array.isArray(value) && !ArrayBuffer.isView(value)) return [...seed];\n  return [0, 1, 2, 3].map((index) => {\n    const numeric = Number(value[index]);\n    return Number.isFinite(numeric) ? numeric : seed[index];\n  });\n}\n\nexport function normalizeFiniteNumber(value, fallback) {\n  if (value == null || `${value}`.trim() === '') return fallback;\n  const numeric = Number(value);\n  return Number.isFinite(numeric) ? numeric : fallback;\n}\n\nexport function normalizeNonNegativeNumber(value, fallback) {\n  return clampNumber(normalizeFiniteNumber(value, null), { min: 0 }) ?? fallback;\n}\n\nexport function normalizeNodeStyle(style, fallback) {\n  const seed = fallback ?? DEFAULT_NODE_SELECTED_STYLE;\n  const next = style && typeof style === 'object' ? style : {};\n  return {\n    sizeMul: normalizeNonNegativeNumber(next.sizeMul ?? seed.sizeMul, seed.sizeMul),\n    opacityMul: normalizeNonNegativeNumber(next.opacityMul ?? seed.opacityMul, seed.opacityMul),\n    outlineMul: normalizeNonNegativeNumber(next.outlineMul ?? seed.outlineMul, seed.outlineMul),\n    discard: next.discard === true,\n    forceMaxAlpha: next.forceMaxAlpha === true,\n    colorMul: rgbaArray(next.colorMul, seed.colorMul),\n    colorAdd: rgbaArray(next.colorAdd, seed.colorAdd),\n  };\n}\n\nexport function normalizeEdgeStyle(style, fallback) {\n  const seed = fallback ?? DEFAULT_EDGE_SELECTED_STYLE;\n  const next = style && typeof style === 'object' ? style : {};\n  return {\n    widthMul: normalizeNonNegativeNumber(next.widthMul ?? seed.widthMul, seed.widthMul),\n    opacityMul: normalizeNonNegativeNumber(next.opacityMul ?? seed.opacityMul, seed.opacityMul),\n    discard: next.discard === true,\n    forceMaxAlpha: next.forceMaxAlpha === true,\n    colorMul: rgbaArray(next.colorMul, seed.colorMul),\n    colorAdd: rgbaArray(next.colorAdd, seed.colorAdd),\n  };\n}\n\nexport function backgroundLuminance(color) {\n  const rgba = rgbaArray(color, [1, 1, 1, 1]);\n  return (rgba[0] * 0.2126) + (rgba[1] * 0.7152) + (rgba[2] * 0.0722);\n}\n\nexport function resolveBackgroundColor(helios) {\n  return helios?.background?.() ?? helios?.clearColor?.() ?? [1, 1, 1, 1];\n}\n\nexport function normalizeAutoBackgroundTone(tone, fallback = DEFAULT_AUTO_BACKGROUND_TONE_DISABLED) {\n  const seed = fallback && typeof fallback === 'object' ? fallback : DEFAULT_AUTO_BACKGROUND_TONE_DISABLED;\n  const next = tone && typeof tone === 'object' ? tone : {};\n  return {\n    enabled: next.enabled == null ? seed.enabled === true : next.enabled === true,\n    amount: clampNumber(next.amount ?? seed.amount, { min: 0, max: 1 }) ?? seed.amount,\n  };\n}\n\nexport function applyAutoBackgroundTone(style, backgroundColor, tone) {\n  const current = {\n    ...style,\n    colorMul: rgbaArray(style?.colorMul, [1, 1, 1, 1]),\n    colorAdd: rgbaArray(style?.colorAdd, [0, 0, 0, 0]),\n  };\n  const resolvedTone = normalizeAutoBackgroundTone(tone);\n  if (!resolvedTone.enabled) return current;\n  const mixAmount = resolvedTone.amount;\n  const background = rgbaArray(backgroundColor, [1, 1, 1, 1]);\n  if (backgroundLuminance(background) < 0.5) {\n    current.colorMul = [\n      1 - (mixAmount * (1 - background[0])),\n      1 - (mixAmount * (1 - background[1])),\n      1 - (mixAmount * (1 - background[2])),\n      1,\n    ];\n    current.colorAdd = [0, 0, 0, 0];\n    return current;\n  }\n  current.colorMul = [1, 1, 1, 1];\n  current.colorAdd = [\n    background[0] * mixAmount * 0.28,\n    background[1] * mixAmount * 0.28,\n    background[2] * mixAmount * 0.28,\n    0,\n  ];\n  return current;\n}\n\nexport function isNeutralNodeStateStyle(style) {\n  const current = normalizeNodeStyle(style, DEFAULT_NODE_SELECTED_STYLE);\n  return current.sizeMul === 1\n    && current.opacityMul === 1\n    && current.outlineMul === 1\n    && current.discard === false\n    && current.forceMaxAlpha === false\n    && current.colorMul.every((value, index) => value === [1, 1, 1, 1][index])\n    && current.colorAdd.every((value) => value === 0);\n}\n\nexport function isNeutralEdgeStateStyle(style) {\n  const current = normalizeEdgeStyle(style, DEFAULT_EDGE_SELECTED_STYLE);\n  return current.widthMul === 1\n    && current.opacityMul === 1\n    && current.discard === false\n    && current.forceMaxAlpha === false\n    && current.colorMul.every((value, index) => value === [1, 1, 1, 1][index])\n    && current.colorAdd.every((value) => value === 0);\n}\n\nexport function resolveStringAttributeNames(network) {\n  if (!network) return [];\n  const entries = [];\n  for (const name of network.getNodeAttributeNames?.() ?? []) {\n    const info = network.getNodeAttributeInfo?.(name);\n    if (info?.type !== AttributeType.String) continue;\n    entries.push(String(name));\n  }\n  entries.sort((a, b) => a.localeCompare(b));\n  return entries;\n}\n\nexport function resolveBooleanAttributeNames(network, scope = 'node') {\n  if (!network) return [];\n  const getNames = scope === 'edge'\n    ? network.getEdgeAttributeNames?.bind(network)\n    : network.getNodeAttributeNames?.bind(network);\n  const getInfo = scope === 'edge'\n    ? network.getEdgeAttributeInfo?.bind(network)\n    : network.getNodeAttributeInfo?.bind(network);\n  const entries = [];\n  for (const name of getNames?.() ?? []) {\n    const info = getInfo?.(name);\n    if (info?.type !== AttributeType.Boolean || info?.dimension !== 1) continue;\n    entries.push(String(name));\n  }\n  entries.sort((a, b) => a.localeCompare(b));\n  return entries;\n}\n\nexport function resolvePreferredHoverLabelSource(network) {\n  if (!network) return '$id';\n  const names = new Map((network.getNodeAttributeNames?.() ?? []).map((name) => [String(name).toLowerCase(), String(name)]));\n  for (const key of ['label', 'name', 'title']) {\n    const found = names.get(key);\n    if (!found) continue;\n    const info = network.getNodeAttributeInfo?.(found);\n    if (info?.type === AttributeType.String) return found;\n  }\n  return '$id';\n}\n\nexport function resolveHoverLabelValue(network, source, id) {\n  if (!network || !Number.isInteger(id) || id < 0) return null;\n  const resolvedSource = source === 'auto' ? resolvePreferredHoverLabelSource(network) : source;\n  if (!resolvedSource || resolvedSource === '$id') return String(id);\n  const info = network.getNodeAttributeInfo?.(resolvedSource);\n  if (!info) return String(id);\n  if (info.type === AttributeType.String) {\n    const value = network.getNodeStringAttribute?.(resolvedSource, id);\n    return value == null || value === '' ? String(id) : String(value);\n  }\n  return String(id);\n}\n","import {\n  DEFAULT_AUTO_BACKGROUND_TONE_DISABLED,\n  DEFAULT_AUTO_BACKGROUND_TONE_SELECTED,\n  DEFAULT_EDGE_HIGHLIGHT_STYLE,\n  DEFAULT_EDGE_HOVER_STYLE,\n  DEFAULT_EDGE_SELECTED_STYLE,\n  DEFAULT_NODE_HIGHLIGHT_STYLE,\n  DEFAULT_NODE_HOVER_STYLE,\n  DEFAULT_NODE_SELECTED_STYLE,\n  NEUTRAL_EDGE_NO_STATE_STYLE,\n  NEUTRAL_NODE_NO_STATE_STYLE,\n  applyAutoBackgroundTone,\n  isNeutralEdgeStateStyle,\n  isNeutralNodeStateStyle,\n  resolveBackgroundColor,\n} from './selectionShared.js';\n\nexport const DEFAULT_PICKING_OPTIONS = Object.freeze({\n  resolutionScale: 0.25,\n  trackDepth: false,\n  maxFps: 20,\n});\n\nfunction getSelectionState(context) {\n  return context?.getBehavior?.('selection')?.state ?? null;\n}\n\nfunction getHoverState(context) {\n  return context?.getBehavior?.('hover')?.state ?? null;\n}\n\nexport function ensureInteractionStateStyleDefaults(helios) {\n  if (!helios) return;\n  const selectedNodeStyle = helios.nodeStateStyle?.('SELECTED') ?? null;\n  const highlightedNodeStyle = helios.nodeStateStyle?.('HIGHLIGHTED') ?? null;\n  const selectedEdgeStyle = helios.edgeStateStyle?.('SELECTED') ?? null;\n  const highlightedEdgeStyle = helios.edgeStateStyle?.('HIGHLIGHTED') ?? null;\n  if (!selectedNodeStyle || isNeutralNodeStateStyle(selectedNodeStyle)) {\n    helios.nodeStateStyle?.('SELECTED', { ...DEFAULT_NODE_SELECTED_STYLE });\n  }\n  if (!highlightedNodeStyle || isNeutralNodeStateStyle(highlightedNodeStyle)) {\n    helios.nodeStateStyle?.('HIGHLIGHTED', { ...DEFAULT_NODE_HIGHLIGHT_STYLE });\n  }\n  if (!selectedEdgeStyle || isNeutralEdgeStateStyle(selectedEdgeStyle)) {\n    helios.edgeStateStyle?.('SELECTED', { ...DEFAULT_EDGE_SELECTED_STYLE });\n  }\n  if (!highlightedEdgeStyle || isNeutralEdgeStateStyle(highlightedEdgeStyle)) {\n    helios.edgeStateStyle?.('HIGHLIGHTED', { ...DEFAULT_EDGE_HIGHLIGHT_STYLE });\n  }\n  if (!helios.nodeHoverStyle?.()) {\n    helios.nodeHoverStyle?.({ ...DEFAULT_NODE_HOVER_STYLE });\n  }\n  if (!helios.edgeHoverStyle?.()) {\n    helios.edgeHoverStyle?.({ ...DEFAULT_EDGE_HOVER_STYLE });\n  }\n}\n\nexport function resolveOtherElementsMode(context) {\n  const selectionState = getSelectionState(context);\n  if (selectionState && (selectionState.selectedNodes.size > 0 || selectionState.selectedEdges.size > 0)) {\n    return 'selected';\n  }\n  const helios = context?.helios ?? null;\n  const highlightUnion = helios?._highlightUnion ?? null;\n  if (highlightUnion && ((highlightUnion.nodes?.size ?? 0) > 0 || (highlightUnion.edges?.size ?? 0) > 0)) {\n    return 'highlighted';\n  }\n  const hoverState = getHoverState(context);\n  if (hoverState?.hoverAffectsOtherElements === true && (\n    (hoverState.nodeHover && hoverState.hoveredNode >= 0)\n    || (hoverState.edgeHover && hoverState.hoveredEdge >= 0)\n  )) {\n    return 'highlighted';\n  }\n  return 'neutral';\n}\n\nfunction resolveOtherElementsStyle(context, mode) {\n  const helios = context?.helios ?? null;\n  const background = resolveBackgroundColor(helios);\n  const selectionState = getSelectionState(context);\n  const hoverState = getHoverState(context);\n  if (mode === 'selected' && selectionState) {\n    return {\n      node: applyAutoBackgroundTone(selectionState.otherSelectedNodeStyle, background, selectionState.otherSelectedNodeTone),\n      edge: applyAutoBackgroundTone(selectionState.otherSelectedEdgeStyle, background, selectionState.otherSelectedEdgeTone),\n    };\n  }\n  if (mode === 'highlighted' && hoverState) {\n    return {\n      node: applyAutoBackgroundTone(hoverState.otherHighlightNodeStyle, background, hoverState.otherHighlightNodeTone),\n      edge: applyAutoBackgroundTone(hoverState.otherHighlightEdgeStyle, background, hoverState.otherHighlightEdgeTone),\n    };\n  }\n  return {\n    node: { ...NEUTRAL_NODE_NO_STATE_STYLE },\n    edge: { ...NEUTRAL_EDGE_NO_STATE_STYLE },\n  };\n}\n\nexport function applyOtherElementsState(context) {\n  const helios = context?.helios ?? null;\n  if (!helios) return;\n  const mode = resolveOtherElementsMode(context);\n  const styles = resolveOtherElementsStyle(context, mode);\n  const graphLayer = helios.renderer?.graphLayer ?? null;\n  helios.nodeNoStateStyle?.(styles.node);\n  helios.edgeNoStateStyle?.(styles.edge);\n  if (graphLayer) {\n    const enabled = mode !== 'neutral';\n    graphLayer.nodeNoStateStyleEnabled = enabled;\n    graphLayer.edgeNoStateStyleEnabled = enabled;\n  }\n  helios.requestRender?.();\n}\n\nexport function applyHoverConnectedEdges(context) {\n  const helios = context?.helios ?? null;\n  const graphLayer = helios?.renderer?.graphLayer ?? null;\n  const hoverState = getHoverState(context);\n  if (graphLayer) {\n    graphLayer.propagateHoveredNodeToEdges = hoverState?.hoverConnectedEdges === true;\n  }\n  if (graphLayer?.propagateHoveredNodeToEdges === true && Number.isInteger(hoverState?.hoveredNode) && hoverState.hoveredNode >= 0) {\n    helios?._promoteInteractionNodes?.([hoverState.hoveredNode], { connectedEdges: true });\n    helios?._reprioritizePersistentInteractionRenderOrder?.();\n  }\n  helios?.requestRender?.();\n}\n\nexport function applySelectedConnectedEdges(context) {\n  const helios = context?.helios ?? null;\n  const graphLayer = helios?.renderer?.graphLayer ?? null;\n  const selectionState = getSelectionState(context);\n  if (graphLayer) {\n    graphLayer.propagateSelectedNodesToEdges = selectionState?.selectedConnectedEdges === true;\n  }\n  if (graphLayer?.propagateSelectedNodesToEdges === true) {\n    helios?._reprioritizePersistentInteractionRenderOrder?.();\n  }\n  helios?.requestRender?.();\n}\n\nexport function needsNodeHoverTracking(context) {\n  const hoverState = getHoverState(context);\n  return hoverState\n    ? (hoverState.nodeHover || hoverState.hoverLabel || hoverState.hoverConnectedEdges)\n    : false;\n}\n\nexport function needsEdgeHoverTracking(context) {\n  return getHoverState(context)?.edgeHover === true;\n}\n\nexport function syncPicking(context, options = {}) {\n  const helios = context?.helios ?? null;\n  if (!helios) return;\n  const selectionState = getSelectionState(context);\n  const needsNodePicking = (selectionState?.nodeClick === true) || needsNodeHoverTracking(context);\n  const needsEdgePicking = (selectionState?.edgeClick === true) || needsEdgeHoverTracking(context);\n  const pickingOptions = {\n    ...DEFAULT_PICKING_OPTIONS,\n    resolutionScale: options.pickingResolutionScale ?? DEFAULT_PICKING_OPTIONS.resolutionScale,\n    trackDepth: options.pickingTrackDepth === true,\n    maxFps: options.pickingMaxFps ?? DEFAULT_PICKING_OPTIONS.maxFps,\n  };\n  if (needsNodePicking) helios.enableNodePicking?.({ ...pickingOptions, hoverEnabled: needsNodeHoverTracking(context) });\n  else helios.disableNodePicking?.();\n  if (needsEdgePicking) helios.enableEdgePicking?.({ ...pickingOptions, hoverEnabled: needsEdgeHoverTracking(context) });\n  else helios.disableEdgePicking?.();\n}\n\nexport function applyHoverLabelConfig(context) {\n  const helios = context?.helios ?? null;\n  const hoverBehavior = context?.getBehavior?.('hover') ?? null;\n  const labelsBehavior = context?.getBehavior?.('labels') ?? null;\n  if (!helios || !hoverBehavior) return;\n  if (labelsBehavior?.setHoverPolicy) {\n    labelsBehavior.setHoverPolicy({\n      enabled: hoverBehavior.state.hoverLabel,\n      source: hoverBehavior.state.hoverLabel\n        ? ((id, network) => hoverBehavior.resolveHoverLabelValue(id, network))\n        : null,\n    });\n    return;\n  }\n  helios.labels?.({\n    hoveredNodeEnabled: hoverBehavior.state.hoverLabel,\n    hoveredNodeSource: hoverBehavior.state.hoverLabel\n      ? ((id, network) => hoverBehavior.resolveHoverLabelValue(id, network))\n      : null,\n  });\n}\n\nexport default {\n  DEFAULT_PICKING_OPTIONS,\n  ensureInteractionStateStyleDefaults,\n  resolveOtherElementsMode,\n  applyOtherElementsState,\n  applyHoverConnectedEdges,\n  applySelectedConnectedEdges,\n  needsNodeHoverTracking,\n  needsEdgeHoverTracking,\n  syncPicking,\n  applyHoverLabelConfig,\n};\n","import { Behavior } from './Behavior.js';\nimport {\n  DEFAULT_AUTO_BACKGROUND_TONE_DISABLED,\n  DEFAULT_AUTO_BACKGROUND_TONE_SELECTED,\n  DEFAULT_OTHER_HIGHLIGHT_EDGE_STYLE,\n  DEFAULT_OTHER_HIGHLIGHT_NODE_STYLE,\n  normalizeAutoBackgroundTone,\n  normalizeEdgeStyle,\n  normalizeNodeStyle,\n  resolveHoverLabelValue,\n} from './selectionShared.js';\nimport {\n  applyHoverConnectedEdges,\n  applyHoverLabelConfig,\n  applyOtherElementsState,\n  ensureInteractionStateStyleDefaults,\n  needsEdgeHoverTracking,\n  needsNodeHoverTracking,\n  syncPicking,\n} from './interactionShared.js';\n\n/**\n * Built-in behavior for hover picking and hover labels.\n *\n * @public\n * @param {object} [options] - Hover options including `nodeHover`,\n * `edgeHover`, `hoverLabel`, and connected-edge highlighting.\n * @returns {HoverBehavior} Behavior that tracks the current hovered node and\n * edge.\n * @remarks Hover requires picking to be available on the active renderer. The\n * behavior coordinates with `LabelsBehavior` when transient hover labels are\n * enabled.\n */\nexport class HoverBehavior extends Behavior {\n  static id = 'hover';\n\n  constructor(options = {}) {\n    super(options);\n    this.state = {\n      nodeHover: true,\n      edgeHover: false,\n      hoverLabel: true,\n      hoverLabelSource: 'auto',\n      hoverConnectedEdges: true,\n      highlightConnectedEdges: false,\n      hoverAffectsOtherElements: false,\n      hoverStyleFromHighlight: false,\n      hoveredNode: -1,\n      hoveredEdge: -1,\n      otherHighlightNodeStyle: normalizeNodeStyle(DEFAULT_OTHER_HIGHLIGHT_NODE_STYLE, DEFAULT_OTHER_HIGHLIGHT_NODE_STYLE),\n      otherHighlightEdgeStyle: normalizeEdgeStyle(DEFAULT_OTHER_HIGHLIGHT_EDGE_STYLE, DEFAULT_OTHER_HIGHLIGHT_EDGE_STYLE),\n      otherHighlightNodeTone: normalizeAutoBackgroundTone(DEFAULT_AUTO_BACKGROUND_TONE_DISABLED, DEFAULT_AUTO_BACKGROUND_TONE_DISABLED),\n      otherHighlightEdgeTone: normalizeAutoBackgroundTone(DEFAULT_AUTO_BACKGROUND_TONE_DISABLED, DEFAULT_AUTO_BACKGROUND_TONE_DISABLED),\n      initialHoverLabelConfig: {\n        hoveredNodeEnabled: false,\n        hoveredNodeSource: null,\n      },\n    };\n    this.update(options);\n  }\n\n  attach(context) {\n    super.attach(context);\n    const helios = this.context?.helios ?? null;\n    const labelsBehavior = this.context?.getBehavior?.('labels') ?? null;\n    if (!labelsBehavior) {\n      const initialLabelsConfig = helios?.labels?.() ?? { enabled: false };\n      this.state.initialHoverLabelConfig = {\n        hoveredNodeEnabled: initialLabelsConfig.hoveredNodeEnabled === true,\n        hoveredNodeSource: initialLabelsConfig.hoveredNodeSource ?? null,\n      };\n    }\n    this.ensureStateStyleDefaults();\n    this.applyHoverStylePolicy();\n    this.applyHoverLabelConfig();\n    this.applyHoverConnectedEdges();\n    this.applyHighlightConnectedEdges();\n    this.syncPicking();\n    this.applyOtherElementsState();\n\n    this.addCleanup(this.context.subscribe(helios, 'node:hover', (event) => this.handleNodeHover(event)));\n    this.addCleanup(this.context.subscribe(helios, 'edge:hover', (event) => this.handleEdgeHover(event)));\n    this.addCleanup(this.context.subscribe(helios, 'highlight:change', () => this.handleHighlightChange()));\n    this.addCleanup(this.context.subscribe(helios, 'network:replaced', () => this.handleNetworkReplaced()));\n    this.addCleanup(this.context.subscribe(helios, 'ui:binding-change', (event) => this.handleUiBindingChange(event)));\n    return this;\n  }\n\n  detach() {\n    const labelsBehavior = this.context?.getBehavior?.('labels') ?? null;\n    if (labelsBehavior?.clearHoverPolicy) labelsBehavior.clearHoverPolicy({ silent: true });\n    else this.context?.helios?.labels?.(this.state.initialHoverLabelConfig);\n    this.clearNodeHover({ silent: true });\n    this.clearEdgeHover({ silent: true });\n    const graphLayer = this.context?.helios?.renderer?.graphLayer ?? null;\n    if (graphLayer) graphLayer.propagateHoveredNodeToEdges = false;\n    this.syncPicking();\n    this.applyOtherElementsState();\n    return super.detach();\n  }\n\n  update(options = {}) {\n    super.update(options);\n    if (!options || typeof options !== 'object') return this;\n    const state = this.state;\n    if (Object.prototype.hasOwnProperty.call(options, 'enableNodeHover')) state.nodeHover = options.enableNodeHover !== false;\n    if (Object.prototype.hasOwnProperty.call(options, 'nodeHover')) state.nodeHover = options.nodeHover === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'enableEdgeHover')) state.edgeHover = options.enableEdgeHover === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'edgeHover')) state.edgeHover = options.edgeHover === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'enableHoverLabels')) state.hoverLabel = options.enableHoverLabels !== false;\n    if (Object.prototype.hasOwnProperty.call(options, 'hoverLabel')) state.hoverLabel = options.hoverLabel === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'hoverLabelSource') && typeof options.hoverLabelSource === 'string') {\n      state.hoverLabelSource = options.hoverLabelSource || 'auto';\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'hoverConnectedEdges')) state.hoverConnectedEdges = options.hoverConnectedEdges !== false;\n    if (Object.prototype.hasOwnProperty.call(options, 'highlightConnectedEdges')) state.highlightConnectedEdges = options.highlightConnectedEdges !== false;\n    if (Object.prototype.hasOwnProperty.call(options, 'hoverAffectsOtherElements')) state.hoverAffectsOtherElements = options.hoverAffectsOtherElements === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'hoverStyleFromHighlight')) {\n      state.hoverStyleFromHighlight = options.hoverStyleFromHighlight === true;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'otherHighlightNodeStyle')) {\n      state.otherHighlightNodeStyle = normalizeNodeStyle(options.otherHighlightNodeStyle, DEFAULT_OTHER_HIGHLIGHT_NODE_STYLE);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'otherHighlightEdgeStyle')) {\n      state.otherHighlightEdgeStyle = normalizeEdgeStyle(options.otherHighlightEdgeStyle, DEFAULT_OTHER_HIGHLIGHT_EDGE_STYLE);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'otherHighlightNodeTone')) {\n      state.otherHighlightNodeTone = normalizeAutoBackgroundTone(options.otherHighlightNodeTone, DEFAULT_AUTO_BACKGROUND_TONE_DISABLED);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'otherHighlightEdgeTone')) {\n      state.otherHighlightEdgeTone = normalizeAutoBackgroundTone(options.otherHighlightEdgeTone, DEFAULT_AUTO_BACKGROUND_TONE_DISABLED);\n    }\n    if (this.context) {\n      if (!needsNodeHoverTracking(this.context)) this.clearNodeHover({ silent: true });\n      if (!needsEdgeHoverTracking(this.context)) this.clearEdgeHover({ silent: true });\n      this.applyHoverLabelConfig();\n      this.applyHoverConnectedEdges();\n      this.applyHighlightConnectedEdges();\n      this.context?.helios?.hoverStyleFromHighlight?.(state.hoverStyleFromHighlight);\n      this.syncPicking();\n      this.applyOtherElementsState();\n    }\n    this.emitChange('options');\n    return this;\n  }\n\n  serialize() {\n    return {\n      options: {\n        nodeHover: this.state.nodeHover,\n        edgeHover: this.state.edgeHover,\n        hoverLabel: this.state.hoverLabel,\n        hoverLabelSource: this.state.hoverLabelSource,\n        hoverConnectedEdges: this.state.hoverConnectedEdges,\n        highlightConnectedEdges: this.state.highlightConnectedEdges,\n        hoverAffectsOtherElements: this.state.hoverAffectsOtherElements,\n        hoverStyleFromHighlight: this.state.hoverStyleFromHighlight,\n        otherHighlightNodeStyle: { ...this.state.otherHighlightNodeStyle },\n        otherHighlightEdgeStyle: { ...this.state.otherHighlightEdgeStyle },\n        otherHighlightNodeTone: { ...this.state.otherHighlightNodeTone },\n        otherHighlightEdgeTone: { ...this.state.otherHighlightEdgeTone },\n      },\n    };\n  }\n\n  restore(snapshot = {}) {\n    const options = snapshot?.options && typeof snapshot.options === 'object' ? snapshot.options : {};\n    this.update(options);\n    this.clearNodeHover({ silent: true });\n    this.clearEdgeHover({ silent: true });\n    this.emitChange('restore');\n    return this;\n  }\n\n  emitChange(reason, detail = {}) {\n    this.emit('change', { reason, state: this.getPublicState(), ...detail });\n  }\n\n  getPublicState() {\n    return { ...this.state };\n  }\n\n  ensureStateStyleDefaults() {\n    ensureInteractionStateStyleDefaults(this.context?.helios ?? null);\n  }\n\n  applyHoverLabelConfig() {\n    applyHoverLabelConfig(this.context);\n  }\n\n  applyHoverConnectedEdges() {\n    applyHoverConnectedEdges(this.context);\n  }\n\n  applyHighlightConnectedEdges() {\n    this.context?.helios?.highlightConnectedEdges?.(this.state.highlightConnectedEdges);\n  }\n\n  applyHoverStylePolicy() {\n    this.context?.helios?.hoverStyleFromHighlight?.(this.state.hoverStyleFromHighlight);\n  }\n\n  applyOtherElementsState() {\n    applyOtherElementsState(this.context);\n  }\n\n  syncPicking() {\n    syncPicking(this.context, this.options);\n  }\n\n  resolveHoverLabelValue(index, network = this.context?.network ?? null) {\n    return resolveHoverLabelValue(network, this.state.hoverLabelSource, index);\n  }\n\n  clearNodeHover(options = {}) {\n    if (this.state.hoveredNode < 0 && options.force !== true) return;\n    this.state.hoveredNode = -1;\n    this.context?.helios?.hoverNodeState?.(null, 0);\n    this.applyOtherElementsState();\n    if (options.silent !== true) this.emitChange('node-hover-clear');\n  }\n\n  clearEdgeHover(options = {}) {\n    if (this.state.hoveredEdge < 0 && options.force !== true) return;\n    this.state.hoveredEdge = -1;\n    this.context?.helios?.hoverEdgeState?.(null, 0);\n    this.applyOtherElementsState();\n    if (options.silent !== true) this.emitChange('edge-hover-clear');\n  }\n\n  handleNodeHover(event) {\n    const detail = event?.detail;\n    if (!detail || !needsNodeHoverTracking(this.context)) return;\n    if (detail.state === 'in') {\n      this.state.hoveredNode = detail.index;\n      if (this.state.nodeHover) this.context?.helios?.hoverNodeState?.(detail.index, 'HOVER');\n    } else if (detail.state === 'out' && this.state.hoveredNode === detail.index) {\n      this.clearNodeHover({ silent: true });\n    }\n    this.applyOtherElementsState();\n    this.emitChange('node-hover');\n  }\n\n  handleEdgeHover(event) {\n    const detail = event?.detail;\n    if (!detail || !needsEdgeHoverTracking(this.context)) return;\n    if (detail.state === 'in') {\n      this.state.hoveredEdge = detail.index;\n      if (this.state.edgeHover) this.context?.helios?.hoverEdgeState?.(detail.index, 'HOVER');\n    } else if (detail.state === 'out' && this.state.hoveredEdge === detail.index) {\n      this.clearEdgeHover({ silent: true });\n    }\n    this.applyOtherElementsState();\n    this.emitChange('edge-hover');\n  }\n\n  handleNetworkReplaced() {\n    const labelsBehavior = this.context?.getBehavior?.('labels') ?? null;\n    if (!labelsBehavior) {\n      const labelsConfig = this.context?.helios?.labels?.() ?? { enabled: false };\n      this.state.initialHoverLabelConfig = {\n        hoveredNodeEnabled: labelsConfig.hoveredNodeEnabled === true,\n        hoveredNodeSource: labelsConfig.hoveredNodeSource ?? null,\n      };\n    }\n    this.clearNodeHover({ silent: true, force: true });\n    this.clearEdgeHover({ silent: true, force: true });\n    this.ensureStateStyleDefaults();\n    this.applyHoverConnectedEdges();\n    this.applyHighlightConnectedEdges();\n    this.applyOtherElementsState();\n    this.applyHoverLabelConfig();\n    this.syncPicking();\n    this.emitChange('network-replaced');\n  }\n\n  handleUiBindingChange(event) {\n    const bindingName = event?.detail?.name ?? null;\n    if (bindingName !== 'clearColor' && bindingName !== 'background') return;\n    this.applyOtherElementsState();\n    this.emitChange('ui-binding');\n  }\n\n  handleHighlightChange() {\n    this.applyOtherElementsState();\n    this.emitChange('highlight');\n  }\n}\n\nexport default HoverBehavior;\n","import { Behavior } from './Behavior.js';\n\nconst DEFAULT_OPTIONS = Object.freeze({\n  compactBreakpoint: 1100,\n  fullscreenBreakpoint: 720,\n  preferredDockSide: 'left',\n  restorePrompt: true,\n});\n\nfunction cloneSerializable(value) {\n  if (Array.isArray(value)) return value.map((entry) => cloneSerializable(entry));\n  if (value && typeof value === 'object') {\n    const next = {};\n    for (const [key, entry] of Object.entries(value)) next[key] = cloneSerializable(entry);\n    return next;\n  }\n  return value;\n}\n\nfunction normalizeDockSide(value, fallback = DEFAULT_OPTIONS.preferredDockSide) {\n  if (value === 'left' || value === 'right') return value;\n  return fallback;\n}\n\nfunction normalizeNumber(value, fallback) {\n  const numeric = Number(value);\n  return Number.isFinite(numeric) ? numeric : fallback;\n}\n\nfunction normalizeResumePrompt(value = {}) {\n  if (!value || typeof value !== 'object') return null;\n  const sessionId = typeof value.sessionId === 'string' ? value.sessionId : null;\n  if (!sessionId) return null;\n  return {\n    visible: value.visible !== false,\n    sessionId,\n    status: typeof value.status === 'string' ? value.status : 'prompt',\n    updatedAt: Number.isFinite(value.updatedAt) ? Number(value.updatedAt) : null,\n    networkSource: value.networkSource && typeof value.networkSource === 'object'\n      ? cloneSerializable(value.networkSource)\n      : null,\n  };\n}\n\nfunction normalizeInterfaceSnapshot(value = {}) {\n  const source = value && typeof value === 'object' ? value : {};\n  return {\n    dockSide: normalizeDockSide(source.dockSide, DEFAULT_OPTIONS.preferredDockSide),\n    viewportWidth: Number.isFinite(source.viewportWidth) ? Number(source.viewportWidth) : null,\n    mode: typeof source.mode === 'string' ? source.mode : 'desktop',\n    controlsOpen: source.controlsOpen === true,\n    activePanelId: typeof source.activePanelId === 'string' ? source.activePanelId : null,\n    focused: source.focused === true,\n    interfaceVisible: source.interfaceVisible !== false,\n    resumePrompt: normalizeResumePrompt(source.resumePrompt),\n  };\n}\n\nfunction resolveMode(width, options) {\n  const numericWidth = Number(width);\n  if (!Number.isFinite(numericWidth)) return 'desktop';\n  if (numericWidth <= Number(options.fullscreenBreakpoint)) return 'fullscreen';\n  if (numericWidth <= Number(options.compactBreakpoint)) return 'compact';\n  return 'desktop';\n}\n\n/**\n * Built-in behavior for responsive interface and touch-oriented app state.\n *\n * @public\n * @param {object} [options] - Compact/fullscreen breakpoints, preferred dock\n * side, and restore-prompt behavior.\n * @returns {InterfaceBehavior} Behavior that tracks dock side, viewport class,\n * active panels, controls visibility, and resume-session prompts.\n * @remarks Helios Web can render without `HeliosUI`; this behavior stores the\n * serializable interface state that an app shell or UI layer can bind to.\n */\nexport class InterfaceBehavior extends Behavior {\n  static id = 'interface';\n\n  constructor(options = {}) {\n    super({ ...DEFAULT_OPTIONS, ...(options && typeof options === 'object' ? options : {}) });\n    this._preferencesLoaded = false;\n    this._persistenceReady = null;\n    this._uiReady = false;\n    this.state = normalizeInterfaceSnapshot({\n      dockSide: normalizeDockSide(options?.preferredDockSide, DEFAULT_OPTIONS.preferredDockSide),\n      mode: 'desktop',\n      controlsOpen: false,\n      focused: false,\n      interfaceVisible: true,\n    });\n  }\n\n  attach(context) {\n    super.attach(context);\n    this._applyToUI();\n    this.ensurePersistenceReady();\n    this.emitChange('attach');\n    return this;\n  }\n\n  update(options = {}) {\n    super.update(options);\n    this.options = {\n      ...DEFAULT_OPTIONS,\n      ...this.options,\n      ...(options && typeof options === 'object' ? options : {}),\n      preferredDockSide: normalizeDockSide(\n        options?.preferredDockSide ?? this.options?.preferredDockSide ?? this.state.dockSide,\n        this.state.dockSide,\n      ),\n    };\n    if (Object.prototype.hasOwnProperty.call(options ?? {}, 'preferredDockSide')) {\n      this.state = {\n        ...this.state,\n        dockSide: normalizeDockSide(options.preferredDockSide, this.state.dockSide),\n      };\n      this.persistResponsivePreferences();\n    }\n    this.recomputeMode({ silent: true });\n    this._applyToUI();\n    this.emitChange('options');\n    return this;\n  }\n\n  bindUI(ui = null) {\n    this._uiReady = Boolean(ui);\n    this._applyToUI();\n    return this;\n  }\n\n  compactBreakpoint(value) {\n    if (arguments.length === 0) return normalizeNumber(this.options.compactBreakpoint, DEFAULT_OPTIONS.compactBreakpoint);\n    this.update({ compactBreakpoint: normalizeNumber(value, this.options.compactBreakpoint) });\n    return this;\n  }\n\n  fullscreenBreakpoint(value) {\n    if (arguments.length === 0) return normalizeNumber(this.options.fullscreenBreakpoint, DEFAULT_OPTIONS.fullscreenBreakpoint);\n    this.update({ fullscreenBreakpoint: normalizeNumber(value, this.options.fullscreenBreakpoint) });\n    return this;\n  }\n\n  dockSide(value) {\n    if (arguments.length === 0) return this.state.dockSide;\n    const next = normalizeDockSide(value, this.state.dockSide);\n    if (next === this.state.dockSide) return this;\n    this.state = { ...this.state, dockSide: next };\n    this.persistResponsivePreferences();\n    this._applyToUI();\n    this.emitChange('dock-side', { dockSide: next });\n    return this;\n  }\n\n  toggleDockSide() {\n    return this.dockSide(this.state.dockSide === 'left' ? 'right' : 'left');\n  }\n\n  mode() {\n    return this.state.mode;\n  }\n\n  isCompact() {\n    return this.state.mode === 'compact' || this.state.mode === 'fullscreen';\n  }\n\n  isFullscreen() {\n    return this.state.mode === 'fullscreen';\n  }\n\n  viewportWidth() {\n    return this.state.viewportWidth;\n  }\n\n  setViewportWidth(width, options = {}) {\n    const numericWidth = Number(width);\n    const nextWidth = Number.isFinite(numericWidth) ? numericWidth : null;\n    const previousMode = this.state.mode;\n    const nextMode = resolveMode(nextWidth, this.options);\n    const enteringDesktop = previousMode !== 'desktop' && nextMode === 'desktop';\n    const enteringFullscreen = previousMode !== 'fullscreen' && nextMode === 'fullscreen';\n    const leavingFullscreen = previousMode === 'fullscreen' && nextMode !== 'fullscreen';\n    const nextState = {\n      ...this.state,\n      viewportWidth: nextWidth,\n      mode: nextMode,\n    };\n\n    if (enteringDesktop) {\n      nextState.controlsOpen = false;\n      nextState.activePanelId = null;\n      nextState.focused = false;\n    } else if (nextMode === 'compact') {\n      nextState.controlsOpen = false;\n      nextState.activePanelId = null;\n      nextState.focused = false;\n    } else if (enteringFullscreen) {\n      nextState.controlsOpen = false;\n      nextState.activePanelId = null;\n      nextState.focused = false;\n    } else if (leavingFullscreen && nextMode === 'compact') {\n      nextState.controlsOpen = false;\n      nextState.activePanelId = null;\n      nextState.focused = false;\n    }\n\n    this.state = nextState;\n    this.persistResponsivePreferences({ includeViewportClass: true });\n    this._applyToUI();\n    if (options.silent !== true || previousMode !== nextMode) {\n      this.emitChange('viewport', {\n        viewportWidth: nextWidth,\n        mode: nextMode,\n        previousMode,\n      });\n    }\n    return this;\n  }\n\n  recomputeMode(options = {}) {\n    return this.setViewportWidth(this.context?.ui?.getViewportWidth?.() ?? this.state.viewportWidth, options);\n  }\n\n  controlsOpen(value) {\n    if (arguments.length === 0) return this.state.controlsOpen;\n    const next = value === true;\n    if (this.state.mode !== 'fullscreen') return this;\n    this.state = {\n      ...this.state,\n      controlsOpen: next,\n      activePanelId: next ? this.state.activePanelId : null,\n      focused: next ? this.state.focused : false,\n    };\n    this._applyToUI();\n    this.emitChange('controls-open', { open: next });\n    return this;\n  }\n\n  openControlsSurface() {\n    return this.controlsOpen(true);\n  }\n\n  closeControlsSurface() {\n    return this.controlsOpen(false);\n  }\n\n  activateControl(panelId) {\n    if (this.state.mode !== 'fullscreen') return this;\n    const id = typeof panelId === 'string' && panelId.trim() ? panelId.trim() : null;\n    if (!id) return this;\n    const nextState = {\n      ...this.state,\n      controlsOpen: true,\n      activePanelId: id,\n      focused: true,\n    };\n    this.state = nextState;\n    this._applyToUI();\n    this.emitChange('active-control', { panelId: id, focused: nextState.focused });\n    return this;\n  }\n\n  clearActiveControl() {\n    if (!this.state.activePanelId && !this.state.focused) return this;\n    this.state = {\n      ...this.state,\n      activePanelId: null,\n      focused: false,\n    };\n    this._applyToUI();\n    this.emitChange('active-control-cleared', {});\n    return this;\n  }\n\n  interfaceVisible(value) {\n    if (arguments.length === 0) return this.state.interfaceVisible;\n    const next = value !== false;\n    if (next === this.state.interfaceVisible) return this;\n    this.state = { ...this.state, interfaceVisible: next };\n    this._applyToUI();\n    this.emitChange('interface-visible', { visible: next });\n    return this;\n  }\n\n  serialize() {\n    return {\n      options: {\n        compactBreakpoint: this.compactBreakpoint(),\n        fullscreenBreakpoint: this.fullscreenBreakpoint(),\n        preferredDockSide: this.state.dockSide,\n        restorePrompt: this.options.restorePrompt !== false,\n      },\n      state: {\n        dockSide: this.state.dockSide,\n        interfaceVisible: this.state.interfaceVisible,\n      },\n    };\n  }\n\n  restore(snapshot = {}) {\n    super.restore(snapshot);\n    const source = snapshot && typeof snapshot === 'object' ? snapshot : {};\n    const nextDockSide = source.state?.dockSide ?? source.options?.preferredDockSide ?? this.state.dockSide;\n    const nextVisible = source.state?.interfaceVisible ?? this.state.interfaceVisible;\n    this.state = {\n      ...this.state,\n      dockSide: normalizeDockSide(nextDockSide, this.state.dockSide),\n      interfaceVisible: nextVisible !== false,\n    };\n    this.recomputeMode({ silent: true });\n    this._applyToUI();\n    return this;\n  }\n\n  serializeInterfaceState(options = {}) {\n    const includeResumePrompt = options.includeResumePrompt === true;\n    return {\n      dockSide: this.state.dockSide,\n      mode: this.state.mode,\n      interfaceVisible: this.state.interfaceVisible,\n      controlsOpen: this.state.mode === 'fullscreen' ? this.state.controlsOpen : false,\n      activePanelId: this.state.mode === 'fullscreen' ? this.state.activePanelId : null,\n      focused: this.state.mode === 'fullscreen' ? this.state.focused : false,\n      resumePrompt: includeResumePrompt ? this.resumePrompt() : null,\n    };\n  }\n\n  restoreInterfaceState(snapshot = {}, options = {}) {\n    const next = normalizeInterfaceSnapshot({\n      ...this.state,\n      ...(snapshot && typeof snapshot === 'object' ? snapshot : {}),\n    });\n    const storage = this.context?.helios?.storage ?? null;\n    const shouldShowRestorePrompt = storage?.capabilities?.sessions === true\n      && !storage.requestedSessionId;\n    const restoredPrompt = shouldShowRestorePrompt ? next.resumePrompt : null;\n    const modeFromViewport = resolveMode(this.context?.ui?.getViewportWidth?.() ?? next.viewportWidth, this.options);\n    this.state = {\n      ...next,\n      mode: options.keepStoredMode === true ? next.mode : modeFromViewport,\n      controlsOpen: modeFromViewport === 'fullscreen' ? next.controlsOpen : false,\n      activePanelId: modeFromViewport === 'fullscreen' ? next.activePanelId : null,\n      focused: modeFromViewport === 'fullscreen' ? next.focused : false,\n      resumePrompt: restoredPrompt,\n    };\n    this._applyToUI();\n    this.emitChange('restore-interface', this.serializeInterfaceState());\n    return this;\n  }\n\n  async ensurePersistenceReady() {\n    if (this._persistenceReady) return this._persistenceReady;\n    this._persistenceReady = this._loadPersistenceState();\n    return this._persistenceReady;\n  }\n\n  async _loadPersistenceState() {\n    const storage = this.context?.helios?.storage ?? null;\n    if (!storage) return null;\n\n    if (!this._preferencesLoaded && typeof storage?.loadPreferences === 'function') {\n      const preferences = await storage.loadPreferences();\n      this._preferencesLoaded = true;\n      const persistedDockSide = preferences?.responsive?.compactDockSide;\n      if (persistedDockSide === 'left' || persistedDockSide === 'right') {\n        this.state = { ...this.state, dockSide: persistedDockSide };\n      }\n    }\n\n    const shouldShowRestorePrompt = storage?.capabilities?.sessions === true\n      && !storage.requestedSessionId;\n    if (!shouldShowRestorePrompt && this.state.resumePrompt) {\n      this.state = {\n        ...this.state,\n        resumePrompt: null,\n      };\n    }\n    const promptSource = storage;\n    if (shouldShowRestorePrompt && this.options.restorePrompt !== false && typeof promptSource?.getResumePrompt === 'function') {\n      const prompt = await promptSource.getResumePrompt({ limit: this.options.restorePromptLimit ?? 8 });\n      if (prompt?.sessionId) {\n        this.state = {\n          ...this.state,\n          resumePrompt: cloneSerializable(prompt),\n        };\n      }\n    }\n\n    this._applyToUI();\n    this.emitChange('persistence-ready', {\n      dockSide: this.state.dockSide,\n      resumePrompt: cloneSerializable(this.state.resumePrompt),\n    });\n    return true;\n  }\n\n  async persistResponsivePreferences(options = {}) {\n    const storage = this.context?.helios?.storage ?? null;\n    if (!storage?.updatePreferences) return null;\n    const patch = {\n      responsive: {\n        compactDockSide: this.state.dockSide,\n      },\n    };\n    if (options.includeViewportClass === true) {\n      patch.responsive.lastViewportClass = this.state.mode;\n      patch.responsive.preferredMode = this.state.mode === 'desktop' ? null : this.state.mode;\n    }\n    try {\n      return await storage.updatePreferences(patch);\n    } catch (error) {\n      console.warn('Helios interface preferences failed to persist.', error);\n      return null;\n    }\n  }\n\n  resumePrompt() {\n    return this.state.resumePrompt ? cloneSerializable(this.state.resumePrompt) : null;\n  }\n\n  async resumeSession(options = {}) {\n    const prompt = this.state.resumePrompt;\n    const storage = this.context?.helios?.storage ?? null;\n    const sessionId = options.sessionId ?? prompt?.sessionId ?? null;\n    const sessionSource = storage;\n    if (!sessionId || (!sessionSource?.resumeSession && !sessionSource?.restoreSession)) return null;\n    this.state = {\n      ...this.state,\n      resumePrompt: null,\n    };\n    this._applyToUI();\n    const restored = await (sessionSource.resumeSession?.(sessionId, options)\n      ?? sessionSource.restoreSession?.(sessionId, options));\n    this.emitChange('resume-session', {\n      sessionId,\n      restored: restored != null,\n    });\n    return restored;\n  }\n\n  async startFresh(options = {}) {\n    const prompt = this.state.resumePrompt;\n    const storage = this.context?.helios?.storage ?? null;\n    this._persistenceReady = Promise.resolve(true);\n    if (prompt?.sessionId && storage) {\n      const sessionSource = storage;\n      if ((options.delete === true || options.deletePendingSession === true)) {\n        await sessionSource?.deleteSession?.(prompt.sessionId);\n      } else if (options.markFinished === true) {\n        await sessionSource?.markSessionFinished?.(prompt.sessionId);\n      }\n    }\n    this.state = {\n      ...this.state,\n      resumePrompt: null,\n    };\n    this._applyToUI();\n    this.emitChange('start-fresh', {\n      sessionId: prompt?.sessionId ?? null,\n    });\n    return true;\n  }\n\n  dismissResumePrompt() {\n    if (!this.state.resumePrompt) return this;\n    this.state = {\n      ...this.state,\n      resumePrompt: null,\n    };\n    this._applyToUI();\n    this.emitChange('dismiss-resume-prompt', {});\n    return this;\n  }\n\n  _applyToUI() {\n    const ui = this.context?.ui ?? null;\n    if (!ui || typeof ui.applyInterfaceBehaviorState !== 'function') return;\n    ui.applyInterfaceBehaviorState({\n      dockSide: this.state.dockSide,\n      mode: this.state.mode,\n      compact: this.isCompact(),\n      fullscreen: this.isFullscreen(),\n      controlsOpen: this.state.controlsOpen,\n      activePanelId: this.state.activePanelId,\n      focused: this.state.focused,\n      interfaceVisible: this.state.interfaceVisible,\n      resumePrompt: this.resumePrompt(),\n    });\n  }\n\n  emitChange(reason, detail = {}) {\n    this.emit('change', {\n      reason,\n      ...cloneSerializable(detail),\n      state: this.serializeInterfaceState(),\n    });\n    return this;\n  }\n}\n\nexport default InterfaceBehavior;\n","import { Behavior } from './Behavior.js';\nimport { StaticLayout, WorkerLayout } from '../layouts/Layout.js';\nimport { D3Force3DLayout } from '../layouts/d3force3dLayoutWorker.js';\nimport { GpuForceLayout } from '../layouts/GpuForceLayout.js';\n\nconst CURRENT_POSITION_ATTRIBUTE = '_helios_visuals_position';\nconst RANDOM_LAYOUT_POSITION_CHOICE = '$random';\nconst CAMERA_MOVE_EVENT = 'camera:move';\nconst PAUSE_ON_INTERACTION_NODE_COUNT = 1_000_000;\nconst PAUSE_ON_INTERACTION_RESUME_DELAY_MS = 300;\n\nfunction cloneSerializable(value) {\n  if (Array.isArray(value)) return value.map((entry) => cloneSerializable(entry));\n  if (!value || typeof value !== 'object') return value;\n  const next = {};\n  for (const [key, entry] of Object.entries(value)) {\n    if (typeof entry === 'function') continue;\n    if (key === 'helios') continue;\n    next[key] = cloneSerializable(entry);\n  }\n  return next;\n}\n\nfunction collectStateKeys(detail = {}) {\n  const keys = [];\n  if (typeof detail.storageKey === 'string') keys.push(detail.storageKey);\n  if (typeof detail.stateKey === 'string') keys.push(detail.stateKey);\n  if (Array.isArray(detail.storageKeys)) {\n    for (const key of detail.storageKeys) if (typeof key === 'string') keys.push(key);\n  }\n  if (Array.isArray(detail.stateKeys)) {\n    for (const key of detail.stateKeys) if (typeof key === 'string') keys.push(key);\n  }\n  return keys;\n}\n\nfunction keyMatchesTarget(key, target) {\n  if (!key || !target) return false;\n  return key === target || key.startsWith(`${target}.`) || target.startsWith(`${key}.`);\n}\n\nfunction layoutEventTargetsPath(detail = {}, path = '') {\n  const keys = collectStateKeys(detail);\n  if (!keys.length) return false;\n  return keys.some((key) => keyMatchesTarget(key, path) || keyMatchesTarget(key, `behaviors.${path}`));\n}\n\nfunction getLayoutDescriptor(layout) {\n  const descriptor = typeof layout?.getParameterBindings === 'function'\n    ? (layout.getParameterBindings() ?? null)\n    : null;\n  if (descriptor && typeof descriptor === 'object') return descriptor;\n  return {\n    key: 'static',\n    label: layout?.constructor?.name ?? 'Layout',\n    dynamic: false,\n    bindings: [],\n  };\n}\n\nfunction getRendererLabel(helios) {\n  const type = String(helios?.renderer?.device?.type ?? '').toLowerCase();\n  if (type === 'webgpu') return 'GPU/WebGPU';\n  if (type === 'webgl2' || type === 'webgl') return 'GPU/WebGL2';\n  return 'GPU';\n}\n\nfunction getLayoutChoices(helios) {\n  return [\n    { value: 'worker:force3d', label: 'Force (worker)' },\n    { value: 'gpu-force', label: `Force (${getRendererLabel(helios)})` },\n    { value: 'd3force3d', label: 'D3 Force 3D (worker)' },\n    { value: 'worker:jitter', label: 'Jitter (worker)' },\n    { value: 'static', label: 'Static (no layout)' },\n  ];\n}\n\nfunction getLayoutRunState(helios) {\n  const scheduler = helios?.scheduler ?? null;\n  if (!scheduler) return 'stopped';\n  if (typeof scheduler.getLayoutState === 'function') {\n    return scheduler.getLayoutState();\n  }\n  return scheduler.layoutEnabled !== false ? 'running' : 'stopped';\n}\n\nfunction graphSizeForInteractionPause(helios) {\n  const network = helios?.network ?? null;\n  const nodeCount = Number(network?.nodeCount);\n  const nodeCapacity = Number(network?.nodeCapacity);\n  return Math.max(\n    Number.isFinite(nodeCount) ? nodeCount : 0,\n    Number.isFinite(nodeCapacity) ? nodeCapacity : 0,\n  );\n}\n\nfunction defaultPauseOnInteraction(helios) {\n  return graphSizeForInteractionPause(helios) >= PAUSE_ON_INTERACTION_NODE_COUNT;\n}\n\nfunction normalizeOptionalBoolean(value) {\n  if (value === true) return true;\n  if (value === false) return false;\n  return null;\n}\n\nfunction normalizeNonNegativeNumber(value, fallback, max = Number.POSITIVE_INFINITY) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric) || numeric < 0) return fallback;\n  return Math.min(numeric, max);\n}\n\nfunction interactionNow() {\n  return typeof performance !== 'undefined' && typeof performance.now === 'function'\n    ? performance.now()\n    : Date.now();\n}\n\nfunction isManualCameraMove(detail = {}) {\n  const source = String(detail?.origin ?? detail?.source ?? '').toLowerCase();\n  if (source === 'interaction') return true;\n  return detail?.manual === true || detail?.change?.manual === true;\n}\n\nfunction buildLayoutInstance(helios, value) {\n  const mode = helios?.options?.mode === '3d' ? '3d' : '2d';\n  const nodeCount = Math.max(1, Number(helios?.network?.nodeCount ?? helios?.network?.nodeCapacity ?? 1000));\n  const radius = 220 * Math.sqrt(nodeCount / 1000);\n  const depth = mode === '3d' ? 140 : 0;\n\n  if (value === 'static') {\n    return helios.createLayout({\n      type: 'static',\n      options: { bounds: [-500, -500, 500, 500] },\n    });\n  }\n\n  if (value === 'd3force3d') {\n    return helios.createLayout({\n      type: 'd3force3d',\n      options: {\n        settings: {\n          use2D: mode !== '3d',\n          alphaDecay: 0.003,\n        },\n      },\n    });\n  }\n\n  if (value === 'gpu-force') {\n    return helios.createLayout({\n      type: 'gpu-force',\n      options: {\n        mode,\n        center: [0, 0, 0],\n        radius,\n        depth,\n        eta: 0.4,\n        damping: 0.82,\n        maxStep: 2.5,\n      },\n    });\n  }\n\n  if (value === 'worker:jitter') {\n    return helios.createLayout({\n      type: 'worker',\n      options: {\n        layout: 'jitter',\n        mode,\n        center: [0, 0, 0],\n        radius,\n        depth,\n        jitter: 3,\n      },\n    });\n  }\n\n  return helios.createLayout({\n    type: 'worker',\n    options: {\n      layout: 'force3d',\n      mode,\n      center: [0, 0, 0],\n      radius,\n      depth,\n      kRepulsion: 3,\n      kAttraction: 0.003,\n      kGravity: 0.0008,\n      repulsionStrategy: 'barnes-hut',\n      negativesPerNode: 64,\n      negativeSampling: true,\n    },\n  });\n}\n\nfunction snapshotLayoutBindingValues(layout) {\n  const descriptor = getLayoutDescriptor(layout);\n  const parameters = {};\n  for (const binding of descriptor.bindings ?? []) {\n    if (!binding || binding.type === 'display' || typeof binding.get !== 'function') continue;\n    parameters[binding.key] = cloneSerializable(binding.get());\n  }\n  return parameters;\n}\n\nfunction bindingStateEntryType(binding) {\n  const type = String(binding?.type ?? '').trim();\n  if (type === 'boolean') return 'boolean';\n  if (type === 'select') return 'string';\n  if (type === 'number') return 'number';\n  if (type === 'string') return 'string';\n  return 'object';\n}\n\nconst LAYOUT_PARAMETER_LABELS = Object.freeze({\n  jitter: 'Jitter',\n  kRepulsion: 'Repulsion',\n  kAttraction: 'Attraction',\n  kGravity: 'Gravity',\n  eta: 'Step Rate',\n  damping: 'Velocity Retention',\n  maxStep: 'Max Step',\n  theta: 'Theta',\n  repulsionStrategy: 'Repulsion',\n  negativeSampling: 'Extra Negatives',\n  negativesPerNode: 'Negatives / Node',\n  negativeSampleRate: 'Negative Sample Rate',\n  negativeSampleChurn: 'Negative Sample Churn',\n  maxNeighborsPerNode: 'Neighbors / Node',\n  outputScale: 'Output Scale',\n  rotationDamping: 'Rotation Damping',\n  minDistance: 'Min Distance',\n  maxForce: 'Max Force',\n  leafSize: 'Leaf Size',\n});\n\nfunction fallbackControlLabel(value) {\n  return String(value ?? '')\n    .replace(/[_-]+/gu, ' ')\n    .replace(/([a-z0-9])([A-Z])/gu, '$1 $2')\n    .replace(/([A-Z]+)([A-Z][a-z])/gu, '$1 $2')\n    .replace(/\\s+/gu, ' ')\n    .trim()\n    .replace(/\\b\\w/gu, (match) => match.toUpperCase());\n}\n\nfunction layoutParameterLabel(binding) {\n  const explicit = typeof binding?.label === 'string' ? binding.label.trim() : '';\n  if (explicit) return explicit;\n  const key = typeof binding?.key === 'string' ? binding.key.trim() : '';\n  return LAYOUT_PARAMETER_LABELS[key] ?? fallbackControlLabel(key);\n}\n\nfunction bindingStateEntryUi(binding) {\n  const controller = binding?.type === 'select'\n    ? 'select'\n    : (binding?.type === 'boolean' ? 'toggle' : (binding?.type === 'number' ? 'slider' : 'auto'));\n  return {\n    label: layoutParameterLabel(binding),\n    controller,\n    min: binding?.min ?? binding?.sliderMin ?? null,\n    max: binding?.max ?? binding?.sliderMax ?? null,\n    step: binding?.step ?? binding?.inputStep ?? null,\n    inputMin: binding?.inputMin ?? null,\n    inputMax: Object.prototype.hasOwnProperty.call(binding ?? {}, 'inputMax') ? binding.inputMax : null,\n    sliderMin: binding?.sliderMin ?? null,\n    sliderMax: binding?.sliderMax ?? null,\n    scale: binding?.scale ?? null,\n    options: binding?.options ?? null,\n    debounceMs: 220,\n  };\n}\n\nfunction layoutParameterStateEntries(layoutBehavior) {\n  const entries = {};\n  for (const binding of layoutBehavior.bindings() ?? []) {\n    const key = typeof binding?.key === 'string' ? binding.key.trim() : '';\n    if (!key || binding.type === 'display' || typeof binding.get !== 'function') continue;\n    entries[`parameters.${key}`] = {\n      description: binding.hint ?? `Layout parameter ${key}.`,\n      default: cloneSerializable(binding.get()),\n      type: bindingStateEntryType(binding),\n      scope: 'workspace',\n      aliases: [`layout.parameters.${key}`],\n      ui: bindingStateEntryUi(binding),\n      getter: () => cloneSerializable(layoutBehavior.parameter(key)),\n      setter: (value) => layoutBehavior.parameter(key, value, { silent: true }),\n      subscribe: (notify) => layoutBehavior.on('change', (event) => {\n          const detail = event?.detail ?? event ?? {};\n          const changedKey = detail.key ?? null;\n          const changedKeys = Array.isArray(detail.keys) ? detail.keys : [];\n          if (changedKey && changedKey !== key) return;\n          if (changedKeys.length && !changedKeys.includes(key)) return;\n          if (!changedKey && !changedKeys.length && !layoutEventTargetsPath(detail, `layout.parameters.${key}`)) return;\n          notify(undefined, detail);\n        }),\n    };\n  }\n  return entries;\n}\n\nfunction snapshotLowLevelLayoutConfig(layout) {\n  if (!layout) return null;\n  if (layout instanceof GpuForceLayout) {\n    return { type: 'gpu-force', options: cloneSerializable(layout.options) };\n  }\n  if (layout instanceof D3Force3DLayout) {\n    return {\n      type: 'd3force3d',\n      options: {\n        ...cloneSerializable(layout.options),\n        settings: cloneSerializable(layout.settings),\n      },\n    };\n  }\n  if (layout instanceof WorkerLayout) {\n    return { type: 'worker', options: cloneSerializable(layout.options) };\n  }\n  if (layout instanceof StaticLayout) {\n    return { type: 'static', options: { bounds: cloneSerializable(layout.bounds) } };\n  }\n  return null;\n}\n\n/**\n * Built-in behavior for choosing and controlling the active layout.\n *\n * @public\n * @param {object} [options] - Layout options such as `layoutType`,\n * `positionAttribute`, low-level `parameters`, and `running` state.\n * @returns {LayoutBehavior} Behavior wrapping static, worker, D3 force, and\n * GPU force layouts.\n * @remarks Use this behavior when UI or persistence needs to switch layouts,\n * copy numeric position attributes into current positions, or start/stop a\n * dynamic layout without replacing the Helios instance.\n */\nexport class LayoutBehavior extends Behavior {\n  static id = 'layout';\n\n  constructor(options = {}) {\n    super(options);\n    this.state = {\n      positionAttribute: CURRENT_POSITION_ATTRIBUTE,\n      pauseOnInteraction: false,\n    };\n    this._pauseOnInteractionExplicit = Object.prototype.hasOwnProperty.call(options, 'pauseOnInteraction')\n      && normalizeOptionalBoolean(options.pauseOnInteraction) !== null;\n    this._pauseOnInteractionResumeDelayMs = PAUSE_ON_INTERACTION_RESUME_DELAY_MS;\n    this._interactionPauseTimer = null;\n    this._interactionPauseActive = false;\n    this._interactionPointerIds = new Set();\n    this._lastInteractionAt = 0;\n    this.update(options);\n  }\n\n  attach(context) {\n    super.attach(context);\n    const helios = this.context?.helios ?? null;\n    this._refreshPauseOnInteractionDefault({ emit: false, rebaseline: false });\n    this.addCleanup(() => {\n      this._clearInteractionPauseTimer();\n      this._resumeAfterCameraInteraction();\n    });\n    this._attachInteractionDebounceListeners(helios);\n    this.addCleanup(this.context.subscribe(helios, 'layout:changed', () => this.emitChange('layout-changed', { source: 'refresh', trackOverride: false })));\n    this.addCleanup(this.context.subscribe(helios, 'layout:start', () => this.emitChange('layout-start', { source: 'refresh', trackOverride: false })));\n    this.addCleanup(this.context.subscribe(helios, 'layout:stop', () => this.emitChange('layout-stop', { source: 'refresh', trackOverride: false })));\n    this.addCleanup(this.context.subscribe(helios, 'network:replaced', () => {\n      this._refreshPauseOnInteractionDefault({ emit: true });\n      this.refreshParameterStateEntries();\n      this.emitChange('network-replaced', { trackOverride: false });\n    }));\n    this.addCleanup(this.context.subscribe(helios, CAMERA_MOVE_EVENT, (event) => {\n      this._maybePauseForCameraInteraction(event?.detail ?? event ?? {});\n    }));\n    this.emitChange('attach', { source: 'default', trackOverride: false });\n    return this;\n  }\n\n  update(options = {}) {\n    super.update(options);\n    if (!options || typeof options !== 'object') return this;\n    if (Object.prototype.hasOwnProperty.call(options, 'positionAttribute')) {\n      const value = options.positionAttribute;\n      this.state.positionAttribute = typeof value === 'string' && value.trim()\n        ? value.trim()\n        : CURRENT_POSITION_ATTRIBUTE;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'pauseOnInteraction')) {\n      const value = normalizeOptionalBoolean(options.pauseOnInteraction);\n      if (value !== null) {\n        this.state.pauseOnInteraction = value;\n        this._pauseOnInteractionExplicit = true;\n      }\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'pauseOnInteractionResumeDelayMs')) {\n      this._pauseOnInteractionResumeDelayMs = normalizeNonNegativeNumber(\n        options.pauseOnInteractionResumeDelayMs,\n        PAUSE_ON_INTERACTION_RESUME_DELAY_MS,\n        10_000,\n      );\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'layoutType')) {\n      this.type(options.layoutType, { preserveRunState: options.preserveRunState !== false });\n    }\n    if (options.parameters && typeof options.parameters === 'object') {\n      this.parameters(options.parameters, { silent: true });\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'running')) {\n      if (options.running === true) this.start();\n      else this.stop('behavior:layout-options');\n    }\n    this.emitChange('options');\n    return this;\n  }\n\n  serialize() {\n    const layout = this.context?.helios?.layout?.() ?? null;\n    return {\n      options: {\n        layoutType: this.type(),\n        parameters: snapshotLayoutBindingValues(layout),\n        running: this.runState() !== 'stopped',\n        pauseOnInteraction: this.pauseOnInteraction(),\n      },\n    };\n  }\n\n  stateEntries() {\n    return {\n      state: {\n        description: 'Serializable layout behavior state.',\n        default: this.serialize(),\n        type: 'object',\n        scope: 'workspace',\n        aliases: ['layout.state'],\n        getter: () => this.serialize(),\n        setter: (value) => this.restore(value),\n        subscribe: (notify) => this.on('change', (event) => {\n          const detail = event?.detail ?? event ?? {};\n          const reason = detail.reason ?? null;\n          if (reason === 'parameter' || reason === 'parameters') return;\n          if (!layoutEventTargetsPath(detail, 'layout.state')) return;\n          notify(undefined, detail);\n        }),\n      },\n      layoutType: {\n        description: 'Active layout implementation.',\n        default: this.type(),\n        type: 'string',\n        scope: 'workspace',\n        aliases: ['layout.layoutType'],\n        ui: {\n          label: 'Layout',\n          controller: 'select',\n          options: () => this.choices(),\n        },\n        getter: () => this.type(),\n        setter: (value) => this.type(value, { preserveRunState: false }),\n        subscribe: (notify) => this.on('change', (event) => {\n          const detail = event?.detail ?? event ?? {};\n          if (!layoutEventTargetsPath(detail, 'layout.layoutType')) return;\n          notify(undefined, detail);\n        }),\n      },\n      running: {\n        description: 'Whether the active dynamic layout is running.',\n        default: this.runState() !== 'stopped',\n        type: 'boolean',\n        scope: 'session',\n        aliases: ['layout.running'],\n        ui: {\n          label: 'Running',\n          controller: 'toggle',\n        },\n        getter: () => this.runState() !== 'stopped',\n        setter: (value) => {\n          if (value === true) this.start();\n          else this.stop('storage');\n        },\n        subscribe: (notify) => this.on('change', (event) => {\n          const detail = event?.detail ?? event ?? {};\n          if (!layoutEventTargetsPath(detail, 'layout.running')) return;\n          notify(undefined, detail);\n        }),\n      },\n      pauseOnInteraction: this._pauseOnInteractionStateEntry(),\n      parameters: {\n        description: 'Active layout parameter values.',\n        default: this.parameters(),\n        type: 'object',\n        scope: 'workspace',\n        aliases: ['layout.parameters'],\n        ui: {\n          label: 'Parameters',\n          controller: 'object',\n          debounceMs: 220,\n        },\n        getter: () => this.parameters(),\n        setter: (value) => this.parameters(value, { silent: false }),\n        subscribe: () => () => {},\n      },\n      ...layoutParameterStateEntries(this),\n    };\n  }\n\n  refreshParameterStateEntries() {\n    const stateManager = this.context?.helios?.states ?? this.context?.helios?.storage ?? null;\n    if (typeof stateManager?.register !== 'function') return this;\n    const entries = layoutParameterStateEntries(this);\n    if (Object.keys(entries).length > 0) {\n      stateManager.register(this, 'behaviors.layout', entries);\n    }\n    return this;\n  }\n\n  refreshPauseOnInteractionStateEntry() {\n    const stateManager = this.context?.helios?.states ?? this.context?.helios?.storage ?? null;\n    if (typeof stateManager?.register !== 'function') return this;\n    stateManager.register(this, 'behaviors.layout', {\n      pauseOnInteraction: this._pauseOnInteractionStateEntry(),\n    });\n    return this;\n  }\n\n  restore(snapshot = {}) {\n    const options = snapshot?.options && typeof snapshot.options === 'object' ? snapshot.options : {};\n    if (options.layoutType) {\n      this.type(options.layoutType, { preserveRunState: false, emitChange: false });\n    }\n    if (options.parameters && typeof options.parameters === 'object') {\n      this.parameters(options.parameters, { silent: true });\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'pauseOnInteraction')) {\n      const value = normalizeOptionalBoolean(options.pauseOnInteraction);\n      if (value !== null) {\n        this.state.pauseOnInteraction = value;\n        this._pauseOnInteractionExplicit = true;\n      }\n    }\n    if (options.running === true && this.isDynamic()) {\n      this.start();\n    } else if (options.running === false || !this.isDynamic()) {\n      this.stop('restore');\n    }\n    this.emitChange('restore', { source: 'restore', trackOverride: false });\n    return this;\n  }\n\n  _pauseOnInteractionStateEntry() {\n    return {\n      description: 'Pause layout updates during manual camera pan, zoom, or rotation.',\n      default: this.pauseOnInteraction(),\n      type: 'boolean',\n      scope: 'workspace',\n      aliases: ['layout.pauseOnInteraction'],\n      ui: {\n        label: 'Pause On Input',\n        controller: 'toggle',\n      },\n      getter: () => this.pauseOnInteraction(),\n      setter: (value) => this.pauseOnInteraction(value),\n      subscribe: (notify) => this.on('change', (event) => {\n        const detail = event?.detail ?? event ?? {};\n        if (!layoutEventTargetsPath(detail, 'layout.pauseOnInteraction')) return;\n        notify(undefined, detail);\n      }),\n    };\n  }\n\n  emitChange(reason, detail = {}) {\n    this.emit('change', { reason, state: this.getPublicState(), ...detail });\n    return this;\n  }\n\n  getPublicState() {\n    const descriptor = this.descriptor();\n    const runState = this.runState();\n    const dynamic = descriptor.dynamic === true;\n    return {\n      layoutType: descriptor.key,\n      layoutLabel: descriptor.label,\n      dynamic,\n      runState,\n      running: runState !== 'stopped',\n      pauseOnInteraction: this.pauseOnInteraction(),\n      pauseOnInteractionAuto: this._pauseOnInteractionExplicit !== true,\n      positionAttribute: this.state.positionAttribute,\n      effectivePositionAttribute: dynamic && runState !== 'stopped'\n        ? CURRENT_POSITION_ATTRIBUTE\n        : this.state.positionAttribute,\n      layoutChoices: this.choices(),\n      lowLevelLayout: snapshotLowLevelLayoutConfig(this.context?.helios?.layout?.() ?? null),\n    };\n  }\n\n  descriptor() {\n    return getLayoutDescriptor(this.context?.helios?.layout?.() ?? null);\n  }\n\n  choices() {\n    return getLayoutChoices(this.context?.helios ?? null);\n  }\n\n  bindings() {\n    return this.descriptor().bindings ?? [];\n  }\n\n  runState() {\n    return getLayoutRunState(this.context?.helios ?? null);\n  }\n\n  isDynamic() {\n    return this.descriptor().dynamic === true;\n  }\n\n  type(value, options = {}) {\n    const helios = this.context?.helios ?? null;\n    if (arguments.length === 0) return this.descriptor().key;\n    if (!helios || typeof helios.createLayout !== 'function' || typeof helios.layout !== 'function') return this;\n    const previousRunState = this.runState();\n    const nextLayout = buildLayoutInstance(helios, String(value ?? '').trim() || 'static');\n    helios.layout(nextLayout);\n    this.refreshParameterStateEntries();\n    if (this.type() === 'static') {\n      helios.stopLayout?.(options.reason ?? 'behavior:layout-type');\n    } else if (options.preserveRunState !== false && previousRunState !== 'stopped') {\n      nextLayout?.reheat?.(options.reason ?? 'behavior:layout-type');\n      helios.startLayout?.();\n    }\n    if (options.emitChange !== false) this.emitChange('type', {\n      trackOverride: options.trackOverride !== false,\n      storageKeys: ['layout.layoutType'],\n    });\n    return this;\n  }\n\n  parameter(key, value, options = {}) {\n    if (arguments.length === 1) {\n      const binding = this.bindings().find((entry) => entry?.key === key);\n      return typeof binding?.get === 'function' ? binding.get() : undefined;\n    }\n    const binding = this.bindings().find((entry) => entry?.key === key);\n    if (typeof binding?.set !== 'function') return this;\n    binding.set(value);\n    if (options.silent !== true) this.emitChange('parameter', {\n      key,\n      value,\n      trackOverride: options.trackOverride !== false,\n      storageKeys: [`layout.parameters.${key}`],\n    });\n    return this;\n  }\n\n  parameters(patch = {}, options = {}) {\n    if (arguments.length === 0) return snapshotLayoutBindingValues(this.context?.helios?.layout?.() ?? null);\n    const keys = [];\n    for (const [key, value] of Object.entries(patch ?? {})) {\n      keys.push(key);\n      this.parameter(key, value, { silent: true });\n    }\n    if (options.silent !== true) this.emitChange('parameters', {\n      keys,\n      trackOverride: options.trackOverride !== false,\n      storageKeys: keys.map((key) => `layout.parameters.${key}`),\n    });\n    return this;\n  }\n\n  pauseOnInteraction(value, options = {}) {\n    if (arguments.length === 0) return this.state.pauseOnInteraction === true;\n    const normalized = normalizeOptionalBoolean(value);\n    if (normalized === null) return this;\n    const changed = this.state.pauseOnInteraction !== normalized;\n    this.state.pauseOnInteraction = normalized;\n    this._pauseOnInteractionExplicit = true;\n    if (normalized === false) {\n      this._clearInteractionPauseTimer();\n      this._resumeAfterCameraInteraction({ force: true });\n    }\n    if (changed || options.forceEmit === true) {\n      this.emitChange('pause-on-interaction', {\n        trackOverride: options.trackOverride !== false,\n        storageKeys: ['layout.pauseOnInteraction'],\n      });\n    }\n    return this;\n  }\n\n  _refreshPauseOnInteractionDefault(options = {}) {\n    if (this._pauseOnInteractionExplicit === true) return this;\n    const next = defaultPauseOnInteraction(this.context?.helios ?? null);\n    if (this.state.pauseOnInteraction === next) return this;\n    this.state.pauseOnInteraction = next;\n    if (options.rebaseline !== false) {\n      this.refreshPauseOnInteractionStateEntry();\n    }\n    if (options.emit === true) {\n      this.emitChange('pause-on-interaction-default', {\n        source: 'default',\n        trackOverride: false,\n      });\n    }\n    return this;\n  }\n\n  _clearInteractionPauseTimer() {\n    if (this._interactionPauseTimer == null) return this;\n    clearTimeout(this._interactionPauseTimer);\n    this._interactionPauseTimer = null;\n    return this;\n  }\n\n  _attachInteractionDebounceListeners(helios = null) {\n    const canvas = helios?.layers?.canvas ?? helios?.renderer?.canvas ?? null;\n    if (!canvas || typeof canvas.addEventListener !== 'function') return this;\n    const onPointerDown = (event) => {\n      const pointerId = event?.pointerId;\n      if (pointerId != null) this._interactionPointerIds.add(pointerId);\n      this._recordManualInteractionActivity();\n    };\n    const onPointerMove = (event) => {\n      const pointerId = event?.pointerId;\n      if (pointerId != null && !this._interactionPointerIds.has(pointerId)) return;\n      this._recordManualInteractionActivity();\n    };\n    const onPointerEnd = (event) => {\n      const pointerId = event?.pointerId;\n      if (pointerId != null) this._interactionPointerIds.delete(pointerId);\n      this._recordManualInteractionActivity();\n      if (this._interactionPauseActive) this._scheduleInteractionResume();\n    };\n    const onPointerLeave = (event) => {\n      if (event?.buttons != null && event.buttons !== 0) return;\n      const pointerId = event?.pointerId;\n      if (pointerId != null) this._interactionPointerIds.delete(pointerId);\n      this._recordManualInteractionActivity();\n      if (this._interactionPauseActive) this._scheduleInteractionResume();\n    };\n    const onWheel = () => {\n      this._recordManualInteractionActivity();\n      if (this._interactionPauseActive) this._scheduleInteractionResume();\n    };\n    canvas.addEventListener('pointerdown', onPointerDown, { passive: true });\n    canvas.addEventListener('pointermove', onPointerMove, { passive: true });\n    canvas.addEventListener('pointerup', onPointerEnd, { passive: true });\n    canvas.addEventListener('pointercancel', onPointerEnd, { passive: true });\n    canvas.addEventListener('pointerleave', onPointerLeave, { passive: true });\n    canvas.addEventListener('wheel', onWheel, { passive: true });\n    this.addCleanup(() => {\n      canvas.removeEventListener?.('pointerdown', onPointerDown);\n      canvas.removeEventListener?.('pointermove', onPointerMove);\n      canvas.removeEventListener?.('pointerup', onPointerEnd);\n      canvas.removeEventListener?.('pointercancel', onPointerEnd);\n      canvas.removeEventListener?.('pointerleave', onPointerLeave);\n      canvas.removeEventListener?.('wheel', onWheel);\n      this._interactionPointerIds.clear();\n    });\n    return this;\n  }\n\n  _recordManualInteractionActivity() {\n    this._lastInteractionAt = interactionNow();\n    if (this._interactionPauseActive && this._interactionPointerIds.size > 0) {\n      this._clearInteractionPauseTimer();\n    }\n    return this;\n  }\n\n  _scheduleInteractionResume() {\n    this._clearInteractionPauseTimer();\n    if (this._interactionPointerIds.size > 0) return this;\n    const delayMs = this._pauseOnInteractionResumeDelayMs;\n    this._interactionPauseTimer = setTimeout(() => {\n      this._interactionPauseTimer = null;\n      const elapsed = interactionNow() - this._lastInteractionAt;\n      if (elapsed < delayMs || this._interactionPointerIds.size > 0) {\n        this._scheduleInteractionResume();\n        return;\n      }\n      this._resumeAfterCameraInteraction();\n    }, delayMs);\n    return this;\n  }\n\n  _pauseLayoutForCameraInteraction() {\n    const helios = this.context?.helios ?? null;\n    const scheduler = helios?.scheduler ?? null;\n    if (!scheduler || typeof scheduler.setLayoutEnabled !== 'function') return false;\n    scheduler.setLayoutEnabled(false, 'idle');\n    scheduler.requestRender?.();\n    this._interactionPauseActive = true;\n    this.emitChange('interaction-pause', {\n      source: 'interaction',\n      trackOverride: false,\n    });\n    return true;\n  }\n\n  _resumeAfterCameraInteraction(options = {}) {\n    if (!this._interactionPauseActive) return false;\n    this._interactionPauseActive = false;\n    if (options.force !== true && this.pauseOnInteraction() !== true) return false;\n    if (!this.isDynamic()) return false;\n    if (this.runState() !== 'idle') return false;\n    const scheduler = this.context?.helios?.scheduler ?? null;\n    if (!scheduler || typeof scheduler.setLayoutEnabled !== 'function') return false;\n    scheduler.setLayoutEnabled(true, 'camera-interaction');\n    scheduler.requestLayout?.('camera-interaction');\n    this.emitChange('interaction-resume', {\n      source: 'interaction',\n      trackOverride: false,\n    });\n    return true;\n  }\n\n  _maybePauseForCameraInteraction(detail = {}) {\n    if (this.pauseOnInteraction() !== true) return false;\n    if (!isManualCameraMove(detail)) return false;\n    if (!this.isDynamic()) return false;\n    this._recordManualInteractionActivity();\n    const state = this.runState();\n    if (state === 'stopped') return false;\n    if (state === 'running') {\n      this._pauseLayoutForCameraInteraction();\n    }\n    this._scheduleInteractionResume();\n    return this._interactionPauseActive;\n  }\n\n  positionAttribute(value, options = {}) {\n    if (arguments.length === 0) return this.state.positionAttribute;\n    const next = typeof value === 'string' && value.trim() ? value.trim() : CURRENT_POSITION_ATTRIBUTE;\n    this.state.positionAttribute = next;\n    this.emitChange('position-attribute', {\n      trackOverride: options.trackOverride !== false,\n    });\n    return this;\n  }\n\n  positionAttributeChoices() {\n    return this.context?.helios?.getLayoutPositionAttributeChoices?.() ?? [\n      { value: CURRENT_POSITION_ATTRIBUTE, label: 'Current positions', dimension: 3 },\n      { value: RANDOM_LAYOUT_POSITION_CHOICE, label: 'Random positions', dimension: 3 },\n    ];\n  }\n\n  applyPositionAttribute(value = this.state.positionAttribute, options = {}) {\n    const helios = this.context?.helios ?? null;\n    if (!helios?.setLayoutPositionsFromNodeAttribute) return false;\n    const selected = typeof value === 'string' && value.trim() ? value.trim() : CURRENT_POSITION_ATTRIBUTE;\n    this.state.positionAttribute = selected;\n    const wrote = helios.setLayoutPositionsFromNodeAttribute(selected);\n    if (!wrote) {\n      if (options.silent !== true) this.emitChange('position-attribute-failed', { positionAttribute: selected });\n      return false;\n    }\n    const layout = helios.layout?.() ?? null;\n    layout?.seedFromNetworkPositions?.();\n    if (this.isDynamic() && this.runState() !== 'stopped') {\n      layout?.reheat?.(options.reason ?? 'behavior:layout-position-attribute');\n      helios.startLayout?.();\n    }\n    if (options.silent !== true) this.emitChange('position-attribute-applied', { positionAttribute: selected });\n    return true;\n  }\n\n  start() {\n    if (!this.isDynamic()) return this;\n    this.context?.helios?.startLayout?.();\n    this.emitChange('start');\n    return this;\n  }\n\n  stop(reason = 'behavior:layout') {\n    this.context?.helios?.stopLayout?.(reason);\n    this.emitChange('stop', { stopReason: reason });\n    return this;\n  }\n\n  reheat(reason = 'behavior:layout') {\n    const helios = this.context?.helios ?? null;\n    const layout = helios?.layout?.() ?? null;\n    layout?.reheat?.(reason);\n    if (this.isDynamic() && this.runState() !== 'stopped') {\n      helios?.startLayout?.();\n    }\n    this.emitChange('reheat', { reheatReason: reason });\n    return this;\n  }\n\n  reset(options = {}) {\n    const helios = this.context?.helios ?? null;\n    const selected = options.positionAttribute ?? this.state.positionAttribute;\n    const wrote = helios?.setLayoutPositionsFromNodeAttribute?.(selected);\n    if (!wrote) {\n      this.emitChange('reset-failed');\n      return false;\n    }\n    this.state.positionAttribute = selected;\n    const layout = helios?.layout?.() ?? null;\n    layout?.seedFromNetworkPositions?.();\n    if (options.reheat !== false) {\n      layout?.reheat?.(options.reason ?? 'behavior:layout-reset');\n    }\n    if (options.start === true || (this.isDynamic() && this.runState() !== 'stopped')) {\n      helios?.startLayout?.();\n    }\n    this.emitChange('reset');\n    return true;\n  }\n}\n\nexport default LayoutBehavior;\n","import { Behavior } from './Behavior.js';\n\nconst LEGEND_KINDS = new Set(['nodeColor', 'density', 'edgeColor', 'nodeSize', 'edgeWidth']);\n\nfunction cloneTitles(titles = {}) {\n  const next = {};\n  if (!titles || typeof titles !== 'object') return next;\n  for (const [key, value] of Object.entries(titles)) {\n    if (!LEGEND_KINDS.has(key)) continue;\n    next[key] = value == null ? null : String(value);\n  }\n  return next;\n}\n\nfunction clonePlacements(placements = {}) {\n  const next = {};\n  if (!placements || typeof placements !== 'object') return next;\n  for (const [key, value] of Object.entries(placements)) {\n    if (!LEGEND_KINDS.has(key)) continue;\n    if (value && typeof value === 'object' && !Array.isArray(value)) {\n      next[key] = {\n        x: Number(value.x ?? 0),\n        y: Number(value.y ?? 0),\n      };\n      continue;\n    }\n    next[key] = value == null ? 'auto' : String(value).trim();\n  }\n  return next;\n}\n\nfunction cloneState(state = {}) {\n  return {\n    ...state,\n    titles: cloneTitles(state.titles),\n    placements: clonePlacements(state.placements),\n  };\n}\n\nfunction normalizeConfigPatch(options = {}) {\n  const next = {};\n  if (!options || typeof options !== 'object') return next;\n\n  const booleanKeys = [\n    'enabled',\n    'respectDockInsets',\n    'illustratorCompatible',\n    'zoomAwareSizeIn2D',\n    'showPanel',\n    'textOutline',\n    'showNodeColor',\n    'showDensity',\n    'showEdgeColor',\n    'showNodeSize',\n    'showEdgeWidth',\n    'scalePreviewLegends',\n    'interactiveCategorical',\n    'legendHoverHighlight',\n    'legendClickSelect',\n  ];\n  for (const key of booleanKeys) {\n    if (Object.prototype.hasOwnProperty.call(options, key)) next[key] = options[key] === true;\n  }\n\n  const scalarKeys = [\n    'margin',\n    'gap',\n    'maxChars',\n    'maxRows',\n    'fontSize',\n    'scale',\n    'continuousHeight',\n    'panelOpacity',\n    'textOutlineWidth',\n    'maxScale',\n  ];\n  for (const key of scalarKeys) {\n    if (Object.prototype.hasOwnProperty.call(options, key)) next[key] = options[key];\n  }\n\n  if (Object.prototype.hasOwnProperty.call(options, 'fontFamily')) {\n    next.fontFamily = typeof options.fontFamily === 'string' ? options.fontFamily.trim() : options.fontFamily;\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'legendClickAction')) {\n    const action = String(options.legendClickAction ?? '').trim().toLowerCase();\n    if (action === 'highlight' || action === 'select') next.legendClickAction = action;\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'titles')) {\n    next.titles = cloneTitles(options.titles);\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'placements')) {\n    next.placements = clonePlacements(options.placements);\n  }\n\n  return next;\n}\n\n/**\n * Built-in behavior for legend overlays.\n *\n * @public\n * @param {object} [options] - Legend visibility, placement, typography, scale,\n * title, and export compatibility options.\n * @returns {LegendsBehavior} Behavior controlling SVG legends for mapper and\n * density channels.\n * @remarks Legends read mapper and density configuration from the live Helios\n * instance and preserve serializable placement, title, and visibility state.\n */\nexport class LegendsBehavior extends Behavior {\n  static id = 'legends';\n\n  constructor(options = {}) {\n    super(options);\n    this.state = {\n      enabled: true,\n      titles: {},\n      placements: {},\n      ...normalizeConfigPatch(options),\n    };\n  }\n\n  attach(context) {\n    super.attach(context);\n    const current = this.context?.helios?._getLegendsControllerConfig?.() ?? { enabled: true };\n    this.state = {\n      ...cloneState(current),\n      ...cloneState(this.state),\n      titles: {\n        ...cloneTitles(current?.titles),\n        ...cloneTitles(this.state?.titles),\n      },\n      placements: {\n        ...clonePlacements(current?.placements),\n        ...clonePlacements(this.state?.placements),\n      },\n    };\n    this.applyConfig({ silent: true, reason: 'attach' });\n    this.addCleanup(this.context.subscribe(this.context?.helios, 'network:replaced', () => {\n      this.emitChange('network-replaced', { source: 'refresh', trackOverride: false });\n    }));\n    return this;\n  }\n\n  update(options = {}, changeOptions = {}) {\n    super.update(options);\n    const patch = normalizeConfigPatch(options);\n    if (!Object.keys(patch).length) return this;\n    this.state = {\n      ...this.state,\n      ...patch,\n      titles: Object.prototype.hasOwnProperty.call(patch, 'titles')\n        ? { ...cloneTitles(this.state.titles), ...cloneTitles(patch.titles) }\n        : cloneTitles(this.state.titles),\n      placements: Object.prototype.hasOwnProperty.call(patch, 'placements')\n        ? { ...clonePlacements(this.state.placements), ...clonePlacements(patch.placements) }\n        : clonePlacements(this.state.placements),\n    };\n    this.applyConfig({ silent: true, reason: 'options' });\n    this.emitChange('options', {\n      trackOverride: changeOptions.trackOverride !== false,\n      storageKeys: Object.keys(patch).map((key) => `legends.${key}`),\n    });\n    return this;\n  }\n\n  serialize() {\n    return {\n      options: cloneState(this.state),\n    };\n  }\n\n  stateEntries() {\n    const subscribe = (notify) => this.on('change', (event) => notify(undefined, event?.detail ?? event));\n    const defaultOn = new Set([\n      'enabled',\n      'respectDockInsets',\n      'showNodeColor',\n      'showDensity',\n      'showEdgeColor',\n    ]);\n    const readBoolean = (key) => (defaultOn.has(key)\n      ? this.state[key] !== false\n      : this.state[key] === true);\n    const numberDefaults = {\n      maxChars: 24,\n      maxRows: 2,\n      scale: 1,\n      continuousHeight: 132,\n    };\n    const readNumber = (key) => {\n      const numeric = Number(this.state[key]);\n      if (Number.isFinite(numeric)) return numeric;\n      return numberDefaults[key] ?? this.state[key];\n    };\n    const booleanEntry = (key, label) => ({\n      description: `Legend ${label.toLowerCase()} setting.`,\n      default: readBoolean(key),\n      type: 'boolean',\n      scope: 'workspace',\n      aliases: [`legends.${key}`],\n      ui: { label, controller: 'toggle' },\n      getter: () => readBoolean(key),\n      setter: (value) => this.update({ [key]: value === true }, { trackOverride: false }),\n      subscribe,\n    });\n    const numberEntry = (key, label, ui = {}) => ({\n      description: `Legend ${label.toLowerCase()} setting.`,\n      default: readNumber(key),\n      type: 'number',\n      scope: 'workspace',\n      aliases: [`legends.${key}`],\n      ui: { label, controller: 'slider', ...ui },\n      getter: () => readNumber(key),\n      setter: (value) => this.update({ [key]: value }, { trackOverride: false }),\n      subscribe,\n    });\n    return {\n      state: {\n        description: 'Serializable legend behavior state.',\n        default: this.serialize(),\n        type: 'object',\n        scope: 'workspace',\n        aliases: ['legends.state'],\n        getter: () => this.serialize(),\n        setter: (value) => this.restore(value),\n        subscribe,\n      },\n      enabled: booleanEntry('enabled', 'Visible'),\n      respectDockInsets: booleanEntry('respectDockInsets', 'Dock Aware'),\n      showNodeColor: booleanEntry('showNodeColor', 'Node Colors'),\n      showDensity: booleanEntry('showDensity', 'Density'),\n      showEdgeColor: booleanEntry('showEdgeColor', 'Edge Colors'),\n      showNodeSize: booleanEntry('showNodeSize', 'Node Sizes'),\n      showEdgeWidth: booleanEntry('showEdgeWidth', 'Edge Widths'),\n      maxChars: numberEntry('maxChars', 'Max Chars', { min: 0, max: 80, step: 1 }),\n      maxRows: numberEntry('maxRows', 'Max Rows', { min: 1, max: 8, step: 1 }),\n      scale: numberEntry('scale', 'Scale', { min: 0.25, max: 4, step: 0.05 }),\n      continuousHeight: numberEntry('continuousHeight', 'Bar Height', { min: 24, max: 260, step: 1 }),\n      titles: {\n        description: 'Custom legend titles.',\n        default: cloneTitles(this.state.titles),\n        type: 'object',\n        scope: 'workspace',\n        aliases: ['legends.titles'],\n        getter: () => cloneTitles(this.state.titles),\n        setter: (value) => this.update({ titles: value }, { trackOverride: false }),\n        subscribe,\n      },\n      placements: {\n        description: 'Custom legend placements.',\n        default: clonePlacements(this.state.placements),\n        type: 'object',\n        scope: 'workspace',\n        aliases: ['legends.placements'],\n        getter: () => clonePlacements(this.state.placements),\n        setter: (value) => this.update({ placements: value }, { trackOverride: false }),\n        subscribe,\n      },\n    };\n  }\n\n  restore(snapshot = {}) {\n    const options = snapshot?.options && typeof snapshot.options === 'object' ? snapshot.options : {};\n    this.update(options, { trackOverride: false });\n    this.emitChange('restore', { trackOverride: false });\n    return this;\n  }\n\n  getPublicState() {\n    return cloneState(this.state);\n  }\n\n  emitChange(reason, detail = {}) {\n    this.emit('change', { reason, state: this.getPublicState(), ...detail });\n  }\n\n  legends(options) {\n    if (arguments.length === 0) return this.getPublicState();\n    if (options === false || options == null) return this.update({ enabled: false });\n    return this.update(options);\n  }\n\n  enabled(value) {\n    if (arguments.length === 0) return this.state.enabled === true;\n    return this.update({ enabled: value === true });\n  }\n\n  titles(value) {\n    if (arguments.length === 0) return cloneTitles(this.state.titles);\n    return this.update({ titles: value });\n  }\n\n  placements(value) {\n    if (arguments.length === 0) return clonePlacements(this.state.placements);\n    return this.update({ placements: value });\n  }\n\n  getLegendItems(options = {}) {\n    return this.context?.helios?._getLegendItems?.({\n      config: {\n        ...cloneState(this.state),\n        ...(options?.config && typeof options.config === 'object' ? cloneState(options.config) : {}),\n      },\n      size: options?.size,\n      viewportHeight: options?.viewportHeight,\n      projection: options?.projection,\n      zoom: options?.zoom,\n      distance: options?.distance,\n    }) ?? [];\n  }\n\n  applyConfig({ silent = false } = {}) {\n    const helios = this.context?.helios ?? null;\n    helios?._applyLegendsControllerConfig?.(cloneState(this.state), { silent });\n    const applied = helios?._getLegendsControllerConfig?.() ?? null;\n    if (applied) this.state = cloneState(applied);\n    return this;\n  }\n}\n\nexport default LegendsBehavior;\n","import { Behavior } from './Behavior.js';\n\nfunction normalizeMode(value, fallback = 'off') {\n  const raw = String(value ?? fallback).trim().toLowerCase();\n  if (raw === 'selected' || raw === 'selected-only' || raw === 'selected_only') return 'selected-only';\n  if (raw === 'off' || raw === 'none' || raw === 'disabled' || raw === 'false') return 'off';\n  return 'auto';\n}\n\nfunction normalizeConfigPatch(options = {}) {\n  const next = {};\n  if (!options || typeof options !== 'object') return next;\n  if (Object.prototype.hasOwnProperty.call(options, 'enabled')) next.enabled = options.enabled === true;\n  if (Object.prototype.hasOwnProperty.call(options, 'source')) {\n    const value = options.source;\n    next.source = typeof value === 'function'\n      ? value\n      : (value == null || String(value).trim() === '' ? null : String(value).trim());\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'selectionMode')) {\n    next.selectionMode = normalizeMode(options.selectionMode, 'auto') === 'selected-only' ? 'selected-only' : 'ranked';\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'selectedOnlySpaceAware')) {\n    next.selectedOnlySpaceAware = options.selectedOnlySpaceAware === true;\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'fallbackSources') && Array.isArray(options.fallbackSources)) {\n    next.fallbackSources = options.fallbackSources.map((entry) => String(entry ?? '').trim()).filter(Boolean);\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'pinnedNodes')) {\n    next.pinnedNodes = Array.from(new Set(Array.from(options.pinnedNodes ?? [], (entry) => Number(entry))\n      .filter((entry) => Number.isInteger(entry) && entry >= 0)));\n  }\n  const scalarKeys = [\n    'maxVisible',\n    'minScreenRadiusPx',\n    'fontSizeScale',\n    'outlineWidth',\n    'offsetRadiusFactor',\n    'offsetPx',\n    'maxChars',\n    'maxRows',\n    'maxUpdateFps',\n    'keepBoost',\n    'selectedBoost',\n    'hoveredBoost',\n    'delegateSnapshotMaxFps',\n    'collisionPaddingPx',\n    'collisionCellPx',\n  ];\n  for (const key of scalarKeys) {\n    if (Object.prototype.hasOwnProperty.call(options, key)) next[key] = options[key];\n  }\n  const stringKeys = ['fill', 'outlineColor', 'fontFamily'];\n  for (const key of stringKeys) {\n    if (!Object.prototype.hasOwnProperty.call(options, key)) continue;\n    const value = options[key];\n    next[key] = typeof value === 'string' ? value.trim() : value;\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'illustratorCompatible')) {\n    next.illustratorCompatible = options.illustratorCompatible === true;\n  }\n  return next;\n}\n\nfunction detailTargetsPath(detail = {}, path = '') {\n  const keys = [];\n  if (typeof detail.storageKey === 'string') keys.push(detail.storageKey);\n  if (typeof detail.stateKey === 'string') keys.push(detail.stateKey);\n  if (Array.isArray(detail.storageKeys)) {\n    for (const key of detail.storageKeys) if (typeof key === 'string') keys.push(key);\n  }\n  if (Array.isArray(detail.stateKeys)) {\n    for (const key of detail.stateKeys) if (typeof key === 'string') keys.push(key);\n  }\n  if (!keys.length) return false;\n  return keys.some((key) => key === path || key.startsWith(`${path}.`) || path.startsWith(`${key}.`));\n}\n\nfunction createEntrySubscribe(behavior, path) {\n  return (notify) => {\n    if (typeof notify !== 'function') return () => {};\n    return behavior.on('change', (event) => {\n      const detail = event?.detail ?? event ?? {};\n      if (!detailTargetsPath(detail, path)) return;\n      notify(undefined, detail);\n    });\n  };\n}\n\n/**\n * Built-in behavior for SVG label overlays.\n *\n * @public\n * @param {object} [options] - Label options including `enabled`, `source`,\n * `selectionMode`, `maxVisible`, collision settings, font settings, and export\n * compatibility flags.\n * @returns {LabelsBehavior} Behavior controlling the live label overlay.\n * @remarks Labels can be driven by a node attribute, callback, selection state,\n * hover state, and screen-space collision/ranking limits.\n * @example\n * helios.behavior.labels.update({\n *   enabled: true,\n *   source: 'label',\n *   selectionMode: 'ranked',\n *   maxVisible: 80,\n * });\n */\nexport class LabelsBehavior extends Behavior {\n  static id = 'labels';\n\n  constructor(options = {}) {\n    super(options);\n    this.state = {\n      enabled: false,\n      ...normalizeConfigPatch(options),\n    };\n    this._hoverPolicy = {\n      enabled: false,\n      source: null,\n    };\n  }\n\n  attach(context) {\n    super.attach(context);\n    const current = this.context?.helios?._getLabelsControllerConfig?.() ?? { enabled: false };\n    this.state = { ...current, ...this.state };\n    this.applyConfig({ silent: true, reason: 'attach' });\n    this.addCleanup(this.context.subscribe(this.context?.helios, 'network:replaced', () => {\n      this.applyConfig({ silent: true, reason: 'network-replaced' });\n      this.emitChange('network-replaced');\n    }));\n    return this;\n  }\n\n  update(options = {}, changeOptions = {}) {\n    super.update(options);\n    const patch = normalizeConfigPatch(options);\n    if (Object.keys(patch).length === 0) return this;\n    this.state = { ...this.state, ...patch };\n    this.applyConfig({ silent: true, reason: 'options' });\n    const storageKeys = new Set(Object.keys(patch).map((key) => `labels.${key}`));\n    if (Object.prototype.hasOwnProperty.call(patch, 'enabled') || Object.prototype.hasOwnProperty.call(patch, 'selectionMode')) {\n      storageKeys.add('labels.enabled');\n      storageKeys.add('labels.mode');\n    }\n    this.emitChange('options', {\n      trackOverride: changeOptions.trackOverride !== false,\n      storageKeys: Array.from(storageKeys),\n    });\n    return this;\n  }\n\n  serialize() {\n    return {\n      options: { ...this.state },\n    };\n  }\n\n  stateEntries() {\n    const subscribe = (key) => createEntrySubscribe(this, `labels.${key}`);\n    return {\n      state: {\n        description: 'Serializable label behavior state.',\n        default: this.serialize(),\n        type: 'object',\n        scope: 'workspace',\n        aliases: ['labels.state'],\n        getter: () => this.serialize(),\n        setter: (value) => this.restore(value),\n        subscribe: () => () => {},\n      },\n      enabled: {\n        description: 'Whether labels are visible.',\n        default: this.state.enabled === true,\n        type: 'boolean',\n        scope: 'workspace',\n        aliases: ['labels.enabled'],\n        ui: { label: 'Visible', controller: 'toggle' },\n        getter: () => this.state.enabled === true,\n        setter: (value) => this.enabled(value === true, { trackOverride: false }),\n        subscribe: subscribe('enabled'),\n      },\n      mode: {\n        description: 'Label selection mode.',\n        default: this.mode(),\n        type: 'string',\n        scope: 'workspace',\n        aliases: ['labels.mode'],\n        ui: {\n          label: 'Mode',\n          controller: 'select',\n          options: ['off', 'auto', 'selected-only'],\n        },\n        getter: () => this.mode(),\n        setter: (value) => this.mode(value, { trackOverride: false }),\n        subscribe: subscribe('mode'),\n      },\n      source: {\n        description: 'Node attribute or source used for labels.',\n        default: this.state.source ?? null,\n        type: 'string',\n        scope: 'workspace',\n        aliases: ['labels.source'],\n        ui: { label: 'Source', controller: 'text' },\n        getter: () => this.source(),\n        setter: (value) => this.source(value),\n        subscribe: subscribe('source'),\n      },\n      maxVisible: {\n        description: 'Maximum visible labels.',\n        default: this.maxVisible(),\n        type: 'number',\n        scope: 'workspace',\n        aliases: ['labels.maxVisible'],\n        ui: { label: 'Max Visible', controller: 'slider', min: 0, max: 1000, step: 1 },\n        getter: () => this.maxVisible(),\n        setter: (value) => this.maxVisible(value),\n        subscribe: subscribe('maxVisible'),\n      },\n      selectedOnlySpaceAware: {\n        description: 'Whether selected-only labels use regular collision and space-aware placement.',\n        default: this.selectedOnlySpaceAware(),\n        type: 'boolean',\n        scope: 'workspace',\n        aliases: ['labels.selectedOnlySpaceAware'],\n        ui: { label: 'Use Available Space', controller: 'toggle' },\n        getter: () => this.selectedOnlySpaceAware(),\n        setter: (value) => this.selectedOnlySpaceAware(value === true),\n        subscribe: subscribe('selectedOnlySpaceAware'),\n      },\n      fontSizeScale: {\n        description: 'Label font-size scale.',\n        default: this.fontSizeScale(),\n        type: 'number',\n        scope: 'workspace',\n        aliases: ['labels.fontSizeScale'],\n        ui: { label: 'Font Size Scale', controller: 'slider', min: 0.25, max: 4, step: 0.05 },\n        getter: () => this.fontSizeScale(),\n        setter: (value) => this.fontSizeScale(value),\n        subscribe: subscribe('fontSizeScale'),\n      },\n      minScreenRadiusPx: {\n        description: 'Minimum node screen radius for labels.',\n        default: this.minScreenRadius(),\n        type: 'number',\n        scope: 'workspace',\n        aliases: ['labels.minScreenRadius'],\n        ui: { label: 'Min Screen Radius', controller: 'slider', min: 0, max: 64, step: 0.5 },\n        getter: () => this.minScreenRadius(),\n        setter: (value) => this.minScreenRadius(value),\n        subscribe: subscribe('minScreenRadiusPx'),\n      },\n      outlineWidth: {\n        description: 'Label outline width in pixels.',\n        default: this.outlineWidth(),\n        type: 'number',\n        scope: 'workspace',\n        aliases: ['labels.outlineWidth'],\n        ui: { label: 'Outline Width', controller: 'slider', min: 0, max: 12, step: 0.25 },\n        getter: () => this.outlineWidth(),\n        setter: (value) => this.outlineWidth(value),\n        subscribe: subscribe('outlineWidth'),\n      },\n      offsetRadiusFactor: {\n        description: 'Label radial offset factor.',\n        default: this.offsetRadiusFactor(),\n        type: 'number',\n        scope: 'workspace',\n        aliases: ['labels.offsetRadiusFactor'],\n        ui: { label: 'Offset Radius Factor', controller: 'slider', min: -4, max: 8, step: 0.05 },\n        getter: () => this.offsetRadiusFactor(),\n        setter: (value) => this.offsetRadiusFactor(value),\n        subscribe: subscribe('offsetRadiusFactor'),\n      },\n      offsetPx: {\n        description: 'Label pixel offset.',\n        default: this.offsetPx(),\n        type: 'number',\n        scope: 'workspace',\n        aliases: ['labels.offsetPx'],\n        ui: { label: 'Offset', controller: 'slider', min: -64, max: 64, step: 0.5 },\n        getter: () => this.offsetPx(),\n        setter: (value) => this.offsetPx(value),\n        subscribe: subscribe('offsetPx'),\n      },\n      maxChars: {\n        description: 'Maximum characters per label row.',\n        default: this.maxChars(),\n        type: 'number',\n        scope: 'workspace',\n        aliases: ['labels.maxChars'],\n        ui: { label: 'Max Chars', controller: 'slider', min: 0, max: 256, step: 1 },\n        getter: () => this.maxChars(),\n        setter: (value) => this.maxChars(value),\n        subscribe: subscribe('maxChars'),\n      },\n      maxRows: {\n        description: 'Maximum label rows.',\n        default: this.maxRows(),\n        type: 'number',\n        scope: 'workspace',\n        aliases: ['labels.maxRows'],\n        ui: { label: 'Max Rows', controller: 'slider', min: 1, max: 8, step: 1 },\n        getter: () => this.maxRows(),\n        setter: (value) => this.maxRows(value),\n        subscribe: subscribe('maxRows'),\n      },\n      fill: {\n        description: 'Label fill color.',\n        default: this.fill(),\n        type: 'string',\n        scope: 'workspace',\n        aliases: ['labels.fill'],\n        ui: { label: 'Fill', controller: 'color' },\n        getter: () => this.fill(),\n        setter: (value) => this.fill(value),\n        subscribe: subscribe('fill'),\n      },\n      outlineColor: {\n        description: 'Label outline color.',\n        default: this.outlineColor(),\n        type: 'string',\n        scope: 'workspace',\n        aliases: ['labels.outlineColor'],\n        ui: { label: 'Outline', controller: 'color' },\n        getter: () => this.outlineColor(),\n        setter: (value) => this.outlineColor(value),\n        subscribe: subscribe('outlineColor'),\n      },\n      fontFamily: {\n        description: 'Label font family.',\n        default: this.fontFamily(),\n        type: 'string',\n        scope: 'workspace',\n        aliases: ['labels.fontFamily'],\n        ui: { label: 'Font Family', controller: 'text' },\n        getter: () => this.fontFamily(),\n        setter: (value) => this.fontFamily(value),\n        subscribe: subscribe('fontFamily'),\n      },\n    };\n  }\n\n  restore(snapshot = {}) {\n    const options = snapshot?.options && typeof snapshot.options === 'object' ? snapshot.options : {};\n    this.update(options, { trackOverride: false });\n    this.emitChange('restore', { trackOverride: false });\n    return this;\n  }\n\n  getPublicState() {\n    return {\n      ...this.state,\n      pinnedNodes: Array.from(this.state.pinnedNodes ?? []),\n      hoveredNodeEnabled: this._hoverPolicy.enabled,\n      hoveredNodeSource: this._hoverPolicy.enabled ? this._hoverPolicy.source : null,\n    };\n  }\n\n  emitChange(reason, detail = {}) {\n    this.emit('change', { reason, state: this.getPublicState(), ...detail });\n  }\n\n  labels(options) {\n    if (arguments.length === 0) return this.getPublicState();\n    if (options == null) {\n      this.state = { ...this.state, enabled: false };\n      this.clearHoverPolicy({ silent: true });\n      this.applyConfig({ silent: true, reason: 'disable' });\n      this.emitChange('disable');\n      return this;\n    }\n    if (options && typeof options === 'object' && options.enabled === true\n      && !Object.prototype.hasOwnProperty.call(options, 'selectionMode')) {\n      return this.update({ selectionMode: 'ranked', ...options });\n    }\n    return this.update(options);\n  }\n\n  enabled(value, options = {}) {\n    if (arguments.length === 0) return this.mode() !== 'off';\n    return this.mode(value === true ? 'auto' : 'off', options);\n  }\n\n  mode(value, options = {}) {\n    if (arguments.length === 0) {\n      if (this.state.enabled !== true) return 'off';\n      return this.state.selectionMode === 'selected-only' ? 'selected-only' : 'auto';\n    }\n    const next = normalizeMode(value, this.mode());\n    if (next === 'off') return this.update({ enabled: false }, options);\n    return this.update({\n      enabled: true,\n      selectionMode: next === 'selected-only' ? 'selected-only' : 'ranked',\n    }, options);\n  }\n\n  selectedOnlySpaceAware(value) {\n    if (arguments.length === 0) return this.state.selectedOnlySpaceAware === true;\n    return this.update({ selectedOnlySpaceAware: value === true });\n  }\n\n  maxVisible(value) {\n    if (arguments.length === 0) return Number(this.state.maxVisible ?? 0);\n    return this.update({ maxVisible: Math.max(0, Math.floor(Number(value) || 0)) });\n  }\n\n  fontSizeScale(value) {\n    if (arguments.length === 0) return Number(this.state.fontSizeScale ?? 1);\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this.update({ fontSizeScale: Math.max(0.25, numeric) });\n  }\n\n  minScreenRadius(value) {\n    if (arguments.length === 0) return Number(this.state.minScreenRadiusPx ?? 0);\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this.update({ minScreenRadiusPx: Math.max(0, numeric) });\n  }\n\n  outlineWidth(value) {\n    if (arguments.length === 0) return Number(this.state.outlineWidth ?? 0);\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this.update({ outlineWidth: Math.max(0, numeric) });\n  }\n\n  offsetRadiusFactor(value) {\n    if (arguments.length === 0) return Number(this.state.offsetRadiusFactor ?? 1);\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this.update({ offsetRadiusFactor: numeric });\n  }\n\n  offsetPx(value) {\n    if (arguments.length === 0) return Number(this.state.offsetPx ?? 4);\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this.update({ offsetPx: numeric });\n  }\n\n  maxChars(value) {\n    if (arguments.length === 0) return Number(this.state.maxChars ?? 0);\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this.update({ maxChars: Math.max(0, Math.floor(numeric)) });\n  }\n\n  maxRows(value) {\n    if (arguments.length === 0) return Number(this.state.maxRows ?? 1);\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this.update({ maxRows: Math.max(1, Math.floor(numeric)) });\n  }\n\n  fill(value) {\n    if (arguments.length === 0) return this.state.fill ?? null;\n    return this.update({ fill: value });\n  }\n\n  outlineColor(value) {\n    if (arguments.length === 0) return this.state.outlineColor ?? null;\n    return this.update({ outlineColor: value });\n  }\n\n  fontFamily(value) {\n    if (arguments.length === 0) return this.state.fontFamily ?? '';\n    return this.update({ fontFamily: String(value ?? '').trim() });\n  }\n\n  source(value) {\n    if (arguments.length === 0) return this.state.source ?? null;\n    if (typeof value === 'function') return this.update({ source: value });\n    const next = value == null ? null : String(value).trim();\n    return this.update({ source: next || null });\n  }\n\n  applySelectionDefaults() {\n    if (this.options.enableSelectionLabels === false) return this;\n    const nextMode = this.state.enabled === true && this.state.selectionMode === 'ranked'\n      ? 'auto'\n      : 'selected-only';\n    return this.mode(nextMode, { trackOverride: false });\n  }\n\n  setHoverPolicy({ enabled = false, source = null } = {}) {\n    this._hoverPolicy = {\n      enabled: enabled === true,\n      source: enabled === true ? (source ?? null) : null,\n    };\n    this.applyConfig({ silent: true, reason: 'hover-policy' });\n    this.emitChange('hover-policy');\n    return this;\n  }\n\n  clearHoverPolicy(options = {}) {\n    this._hoverPolicy = { enabled: false, source: null };\n    this.applyConfig({ silent: true, reason: 'hover-policy-clear' });\n    if (options.silent !== true) this.emitChange('hover-policy-clear');\n    return this;\n  }\n\n  applyConfig({ silent = false } = {}) {\n    const helios = this.context?.helios ?? null;\n    helios?._applyLabelsControllerConfig?.({\n      ...this.state,\n      hoveredNodeEnabled: this._hoverPolicy.enabled,\n      hoveredNodeSource: this._hoverPolicy.enabled ? this._hoverPolicy.source : null,\n    }, { silent });\n    return this;\n  }\n}\n\nexport default LabelsBehavior;\n","import { Mapper } from '../pipeline/Mapper.js';\nimport { shallowCloneChannelConfig } from '../ui/utils/channelConfig.js';\n\nfunction cloneSerializable(value) {\n  if (Array.isArray(value)) return value.map((entry) => cloneSerializable(entry));\n  if (ArrayBuffer.isView(value)) return Array.from(value, (entry) => cloneSerializable(entry));\n  if (!value || typeof value !== 'object') return value;\n  const next = {};\n  for (const [key, entry] of Object.entries(value)) {\n    if (typeof entry === 'function') continue;\n    next[key] = cloneSerializable(entry);\n  }\n  return next;\n}\n\nfunction extractScalarForRule(inputs) {\n  if (inputs == null) return inputs;\n  if (typeof inputs === 'number') return inputs;\n  if (Array.isArray(inputs) || ArrayBuffer.isView(inputs)) return inputs[0];\n  if (typeof inputs === 'object') {\n    const keys = Object.keys(inputs);\n    if (keys.length) return inputs[keys[0]];\n  }\n  return inputs;\n}\n\nexport function buildMapperRulePredicate(spec = {}) {\n  const op = spec?.op ?? 'eq';\n  const rhsRaw = spec?.rhs;\n  const rhs = rhsRaw != null ? Number(rhsRaw) : undefined;\n  return (inputs) => {\n    const valueRaw = extractScalarForRule(inputs);\n    if (op === 'nullish') return valueRaw == null;\n    if (op === 'nan') return valueRaw != null && Number.isNaN(Number(valueRaw));\n    const value = Number(valueRaw);\n    if (!Number.isFinite(value)) return false;\n    if (op === 'eq') return rhs != null && value === rhs;\n    if (op === 'lt') return rhs != null && value < rhs;\n    if (op === 'lte') return rhs != null && value <= rhs;\n    if (op === 'gt') return rhs != null && value > rhs;\n    if (op === 'gte') return rhs != null && value >= rhs;\n    return false;\n  };\n}\n\nfunction isSerializableRule(rule) {\n  const ui = rule?.__ui && typeof rule.__ui === 'object' ? rule.__ui : null;\n  if (!ui) return false;\n  if (typeof rule?.when !== 'function') return false;\n  return rule?.value !== undefined;\n}\n\nfunction serializeRule(rule) {\n  if (!isSerializableRule(rule)) {\n    return {\n      unsupported: true,\n      meta: cloneSerializable(rule?.meta ?? null),\n    };\n  }\n  return {\n    __ui: cloneSerializable(rule.__ui),\n    value: cloneSerializable(rule.value),\n    defaultValue: cloneSerializable(rule.defaultValue),\n    type: typeof rule.type === 'string' ? rule.type : undefined,\n    meta: cloneSerializable(rule.meta),\n  };\n}\n\nfunction restoreRule(snapshot) {\n  if (!snapshot || snapshot.unsupported === true) return null;\n  const spec = snapshot.__ui && typeof snapshot.__ui === 'object' ? cloneSerializable(snapshot.__ui) : null;\n  if (!spec) return null;\n  return {\n    __ui: spec,\n    when: buildMapperRulePredicate(spec),\n    value: cloneSerializable(snapshot.value),\n    defaultValue: cloneSerializable(snapshot.defaultValue),\n    type: typeof snapshot.type === 'string' ? snapshot.type : undefined,\n    meta: cloneSerializable(snapshot.meta),\n  };\n}\n\nexport function isSerializableChannelConfig(config) {\n  if (!config || typeof config !== 'object') return false;\n  const type = config.type ?? config.mode ?? null;\n  if (typeof config.scale === 'function') return false;\n  if (typeof config.transform === 'function' && !config.transformType) return false;\n  if (type === 'layout') return true;\n  if (type === 'constant') return true;\n  if (type === 'passthrough') return true;\n  if (type === 'linear') return true;\n  if (type === 'nodeAttribute') return true;\n  if (type === 'nodeToEdge') return true;\n  if (type === 'categorical') return true;\n  if (type === 'colormap' || config.colormap) {\n    return typeof (config.colormap ?? config.scale ?? config.range) === 'string';\n  }\n  return false;\n}\n\nexport function serializeChannelConfig(config) {\n  const cloned = shallowCloneChannelConfig(config);\n  if (!cloned) return null;\n  const serializable = isSerializableChannelConfig(cloned);\n  const snapshot = {\n    serializable,\n    type: typeof cloned.type === 'string' ? cloned.type : (typeof cloned.mode === 'string' ? cloned.mode : undefined),\n    attributes: cloneSerializable(cloned.attributes),\n    transformType: cloned.transformType,\n    transformPower: cloneSerializable(cloned.transformPower),\n    colormap: cloneSerializable(cloned.colormap),\n    alpha: cloneSerializable(cloned.alpha),\n    clamp: cloneSerializable(cloned.clamp),\n    divergent: cloned.divergent === true,\n    endpoints: cloneSerializable(cloned.endpoints),\n    nodeAttribute: cloneSerializable(cloned.nodeAttribute),\n    domain: cloneSerializable(cloned.domain),\n    range: cloneSerializable(cloned.range),\n    value: cloneSerializable(cloned.value),\n    defaultValue: cloneSerializable(cloned.defaultValue),\n    meta: cloneSerializable(cloned.meta),\n    __ui: cloneSerializable(cloned.__ui),\n    rules: Array.isArray(cloned.rules) ? cloned.rules.map((rule) => serializeRule(rule)) : [],\n  };\n  if (!serializable) {\n    snapshot.unsupported = true;\n    delete snapshot.attributes;\n    delete snapshot.transformType;\n    delete snapshot.transformPower;\n    delete snapshot.colormap;\n    delete snapshot.alpha;\n    delete snapshot.clamp;\n    delete snapshot.divergent;\n    delete snapshot.endpoints;\n    delete snapshot.nodeAttribute;\n    delete snapshot.domain;\n    delete snapshot.range;\n    delete snapshot.value;\n    delete snapshot.defaultValue;\n    delete snapshot.__ui;\n    delete snapshot.rules;\n  }\n  return snapshot;\n}\n\nexport function restoreChannelConfig(snapshot) {\n  if (!snapshot || snapshot.unsupported === true) return null;\n  const next = {\n    type: snapshot.type,\n    attributes: cloneSerializable(snapshot.attributes),\n    transformType: snapshot.transformType,\n    transformPower: cloneSerializable(snapshot.transformPower),\n    colormap: cloneSerializable(snapshot.colormap),\n    alpha: cloneSerializable(snapshot.alpha),\n    clamp: cloneSerializable(snapshot.clamp),\n    divergent: snapshot.divergent === true,\n    endpoints: cloneSerializable(snapshot.endpoints),\n    nodeAttribute: cloneSerializable(snapshot.nodeAttribute),\n    domain: cloneSerializable(snapshot.domain),\n    range: cloneSerializable(snapshot.range),\n    value: cloneSerializable(snapshot.value),\n    defaultValue: cloneSerializable(snapshot.defaultValue),\n    meta: cloneSerializable(snapshot.meta),\n    __ui: cloneSerializable(snapshot.__ui),\n    rules: Array.isArray(snapshot.rules)\n      ? snapshot.rules.map((rule) => restoreRule(rule)).filter(Boolean)\n      : [],\n  };\n  return next;\n}\n\nfunction resetMapper(mapper) {\n  if (!mapper?.channels) return;\n  for (const config of mapper.channels.values()) {\n    mapper.unregisterChannel?.(config);\n  }\n  mapper.channels.clear();\n}\n\nfunction snapshotExistingChannels(collection) {\n  const existing = new Map();\n  for (const [id, mapper] of collection?.mappers?.entries?.() ?? []) {\n    const channels = new Map();\n    for (const [channelName, config] of mapper?.channels?.entries?.() ?? []) {\n      const snapshot = serializeChannelConfig(config);\n      if (snapshot && snapshot.unsupported !== true) channels.set(channelName, snapshot);\n    }\n    existing.set(id, channels);\n  }\n  return existing;\n}\n\nfunction restoreChannelSnapshot(channelSnapshot, fallbackSnapshot = null) {\n  return restoreChannelConfig(channelSnapshot)\n    ?? restoreChannelConfig(fallbackSnapshot);\n}\n\nexport function serializeMapperCollection(collection) {\n  const mappers = {};\n  for (const [id, mapper] of collection?.mappers?.entries?.() ?? []) {\n    const channels = {};\n    for (const [channelName, config] of mapper?.channels?.entries?.() ?? []) {\n      channels[channelName] = serializeChannelConfig(config);\n    }\n    mappers[id] = { channels };\n  }\n  let defaultId = null;\n  for (const [id, mapper] of collection?.mappers?.entries?.() ?? []) {\n    if (mapper === collection?.defaultMapper) {\n      defaultId = id;\n      break;\n    }\n  }\n  return {\n    mode: collection?.mode ?? null,\n    defaultId,\n    mappers,\n  };\n}\n\nexport function restoreMapperCollection(collection, snapshot) {\n  if (!collection || !snapshot || typeof snapshot !== 'object') return collection;\n  const existingChannels = snapshotExistingChannels(collection);\n  for (const mapper of collection.mappers?.values?.() ?? []) {\n    resetMapper(mapper);\n  }\n  collection.mappers.clear();\n  const restored = [];\n  for (const [id, mapperSnapshot] of Object.entries(snapshot.mappers ?? {})) {\n    const mapper = new Mapper({ mode: collection.mode, network: collection.network });\n    const fallbackChannels = existingChannels.get(id) ?? (id === 'default' ? existingChannels.get(snapshot.defaultId) : null);\n    for (const [channelName, channelSnapshot] of Object.entries(mapperSnapshot?.channels ?? {})) {\n      const fallbackSnapshot = fallbackChannels?.get?.(channelName) ?? null;\n      const config = restoreChannelSnapshot(channelSnapshot, fallbackSnapshot);\n      if (!config) continue;\n      mapper.setChannel(channelName, config);\n    }\n    collection.mappers.set(id, mapper);\n    restored.push([id, mapper]);\n  }\n  if (!restored.length) {\n    const mapper = collection.defaultMapper instanceof Mapper\n      ? collection.defaultMapper\n      : new Mapper({ mode: collection.mode, network: collection.network });\n    resetMapper(mapper);\n    collection.mappers.set('default', mapper);\n    collection.defaultMapper = mapper;\n    collection.touch?.();\n    return collection;\n  }\n  const desiredDefaultId = typeof snapshot.defaultId === 'string' ? snapshot.defaultId : null;\n  collection.defaultMapper = (desiredDefaultId && collection.mappers.get(desiredDefaultId))\n    || collection.mappers.get('default')\n    || restored[0][1]\n    || null;\n  collection.touch?.();\n  return collection;\n}\n\nexport function cloneMapperSnapshot(snapshot) {\n  return cloneSerializable(snapshot);\n}\n","import { Behavior } from './Behavior.js';\nimport {\n  cloneMapperSnapshot,\n  restoreChannelConfig,\n  restoreMapperCollection,\n  serializeChannelConfig,\n  serializeMapperCollection,\n} from './mapperBehaviorShared.js';\nimport { shallowCloneChannelConfig } from '../ui/utils/channelConfig.js';\n\nfunction snapshotState(helios) {\n  return {\n    node: serializeMapperCollection(helios?.nodeMapper),\n    edge: serializeMapperCollection(helios?.edgeMapper),\n  };\n}\n\nfunction cloneCollectionSnapshot(snapshot) {\n  return snapshot ? cloneMapperSnapshot(snapshot) : { mode: null, defaultId: null, mappers: {} };\n}\n\nfunction cloneBehaviorState(state) {\n  return {\n    node: cloneCollectionSnapshot(state?.node),\n    edge: cloneCollectionSnapshot(state?.edge),\n  };\n}\n\nfunction getCollection(helios, mode) {\n  return mode === 'edge' ? helios?.edgeMapper ?? null : helios?.nodeMapper ?? null;\n}\n\nconst MAPPER_CHANNEL_ENTRIES = Object.freeze({\n  node: Object.freeze({\n    color: 'Node Color',\n    size: 'Node Size',\n    opacity: 'Node Opacity',\n    outline: 'Node Outline',\n    outlineColor: 'Node Outline Color',\n    position: 'Node Position',\n  }),\n  edge: Object.freeze({\n    color: 'Edge Color',\n    width: 'Edge Width',\n    opacity: 'Edge Opacity',\n  }),\n});\n\nfunction createSharedChangeSubscribe(behavior) {\n  const listeners = new Set();\n  let cleanup = null;\n  return (notify) => {\n    if (typeof notify !== 'function') return () => {};\n    listeners.add(notify);\n    if (!cleanup) {\n      cleanup = behavior.on('change', (event) => {\n        const detail = event?.detail ?? event ?? {};\n        for (const listener of listeners) listener(undefined, { ...detail, trackOverride: false });\n      });\n    }\n    return () => {\n      listeners.delete(notify);\n      if (listeners.size === 0) {\n        cleanup?.();\n        cleanup = null;\n      }\n    };\n  };\n}\n\n/**\n * Built-in behavior for node and edge visual mappers.\n *\n * @public\n * @param {object} [options] - Serializable node/edge mapper snapshots or\n * channel configurations for color, size, opacity, outline, and edge width.\n * @returns {MappersBehavior} Behavior that applies and serializes mapper\n * channel state.\n * @remarks Mapper channel configs should avoid functions when they need to be\n * persisted. Use serializable `constant`, `linear`, `categorical`,\n * `colormap`, `nodeToEdge`, and `passthrough` configurations.\n * @example\n * helios.behavior.mappers.setChannelConfig('node', 'color', {\n *   type: 'colormap',\n *   attributes: 'score',\n *   colormap: 'interpolateViridis',\n *   domain: [0, 1],\n * });\n */\nexport class MappersBehavior extends Behavior {\n  static id = 'mappers';\n\n  constructor(options = {}) {\n    super(options);\n    this._muteSourceEvents = 0;\n    this.state = cloneBehaviorState(options.state);\n  }\n\n  attach(context) {\n    super.attach(context);\n    this.syncFromHelios({ silent: true });\n    this.addCleanup(this.context.subscribe(this.context?.helios, 'mappers:changed', () => {\n      if (this._muteSourceEvents > 0) return;\n      this.syncFromHelios({ silent: true });\n      this.emitChange('mappers');\n    }));\n    this.addCleanup(this.context.subscribe(this.context?.helios, 'network:replaced', () => {\n      this.syncFromHelios({ silent: true });\n      this.emitChange('network-replaced');\n    }));\n    if (optionsHasMapperConfig(this.options)) {\n      this.update(this.options);\n    }\n    return this;\n  }\n\n  update(options = {}) {\n    super.update(options);\n    if (!optionsHasMapperConfig(options)) return this;\n    if (options.node) this.setModeSnapshot('node', options.node, { reason: 'options' });\n    if (options.edge) this.setModeSnapshot('edge', options.edge, { reason: 'options' });\n    if (options.nodeChannels) this.replaceDefaultChannels('node', options.nodeChannels, { reason: 'options' });\n    if (options.edgeChannels) this.replaceDefaultChannels('edge', options.edgeChannels, { reason: 'options' });\n    return this;\n  }\n\n  serialize() {\n    return {\n      options: this.getPublicState(),\n    };\n  }\n\n  stateEntries() {\n    const subscribe = createSharedChangeSubscribe(this);\n    const entries = {\n      node: {\n        description: 'Node mapper collection snapshot.',\n        default: cloneCollectionSnapshot(this.state.node),\n        type: 'object',\n        scope: 'workspace',\n        aliases: ['mappers.node'],\n        ui: {\n          label: 'Node Mappers',\n          controller: 'custom',\n        },\n        getter: () => cloneCollectionSnapshot(this.state.node),\n        setter: (value) => this.setModeSnapshot('node', value, { reason: 'storage' }),\n        subscribe,\n      },\n      edge: {\n        description: 'Edge mapper collection snapshot.',\n        default: cloneCollectionSnapshot(this.state.edge),\n        type: 'object',\n        scope: 'workspace',\n        aliases: ['mappers.edge'],\n        ui: {\n          label: 'Edge Mappers',\n          controller: 'custom',\n        },\n        getter: () => cloneCollectionSnapshot(this.state.edge),\n        setter: (value) => this.setModeSnapshot('edge', value, { reason: 'storage' }),\n        subscribe,\n      },\n    };\n    for (const [mode, channels] of Object.entries(MAPPER_CHANNEL_ENTRIES)) {\n      for (const [channel, label] of Object.entries(channels)) {\n        entries[`${mode}.${channel}`] = {\n          description: `${label} mapper channel configuration.`,\n          default: this.getSerializedChannelConfig(mode, channel),\n          type: 'object',\n          scope: 'workspace',\n          aliases: [`mappers.${mode}.${channel}`],\n          ui: {\n            label,\n            controller: 'custom',\n          },\n          getter: () => this.getSerializedChannelConfig(mode, channel),\n          setter: (value) => {\n            if (!value || typeof value !== 'object') return;\n            this.setChannelConfig(mode, channel, value);\n          },\n          subscribe: (notify) => this.on('change', (event) => {\n            const detail = event?.detail ?? event ?? {};\n            const matchesChannel = detail.reason === 'channel' && detail.mode === mode && detail.channel === channel;\n            if (!matchesChannel) return;\n            notify(undefined, detail);\n          }),\n        };\n      }\n    }\n    return entries;\n  }\n\n  restore(snapshot = {}) {\n    const options = snapshot?.options && typeof snapshot.options === 'object' ? snapshot.options : {};\n    if (options.node) this.setModeSnapshot('node', options.node, { reason: 'restore', trackOverride: false });\n    if (options.edge) this.setModeSnapshot('edge', options.edge, { reason: 'restore', trackOverride: false });\n    this.syncFromHelios({ silent: true });\n    this.emitChange('restore');\n    return this;\n  }\n\n  emitChange(reason, detail = {}) {\n    this.emit('change', { reason, state: this.getPublicState(), ...detail });\n  }\n\n  getPublicState() {\n    return cloneBehaviorState(this.state);\n  }\n\n  mappers(options) {\n    if (arguments.length === 0) return this.getPublicState();\n    return this.update(options);\n  }\n\n  getChannelConfig(mode, channel) {\n    const collection = getCollection(this.context?.helios, mode);\n    const mapper = collection?.defaultMapper ?? null;\n    if (!mapper || typeof mapper.getChannel !== 'function') return null;\n    return shallowCloneChannelConfig(mapper.getChannel(channel));\n  }\n\n  /**\n   * Return a serializable snapshot for one visual channel.\n   *\n   * @public\n   * @apiSection Mapper Configuration\n   * @param {'node'|'edge'} mode - Mapper collection to inspect.\n   * @param {string} channel - Visual channel name such as `color`, `size`,\n   * `opacity`, `outline`, or `width`.\n   * @returns {object|null} JSON-safe channel configuration, or `null` when\n   * the channel is not registered.\n   */\n  getSerializedChannelConfig(mode, channel) {\n    return serializeChannelConfig(this.getChannelConfig(mode, channel));\n  }\n\n  /**\n   * Replace the default mapper configuration for one visual channel.\n   *\n   * @public\n   * @apiSection Mapper Configuration\n   * @param {'node'|'edge'} mode - Mapper collection to update.\n   * @param {string} channel - Visual channel name.\n   * @param {object} config - Serializable channel configuration.\n   * @returns {boolean} `true` when the channel was applied.\n   * @remarks This mutates the active default mapper and emits a mapper change\n   * event. Persisted configurations should avoid functions.\n   * @example\n   * helios.behavior.mappers.setChannelConfig('node', 'color', {\n   *   type: 'colormap',\n   *   attributes: 'score',\n   *   colormap: 'interpolateViridis',\n   *   domain: [0, 1],\n   * });\n   */\n  setChannelConfig(mode, channel, config, options = {}) {\n    const collection = getCollection(this.context?.helios, mode);\n    const mapper = collection?.defaultMapper ?? null;\n    if (!collection || !mapper || typeof mapper.setChannel !== 'function') return false;\n    this._muteSourceEvents += 1;\n    try {\n      mapper.setChannel(channel, config);\n      collection.touch?.();\n    } finally {\n      this._muteSourceEvents -= 1;\n    }\n    this.syncFromHelios({ silent: true });\n    this.emitChange('channel', {\n      mode,\n      channel,\n      trackOverride: options.trackOverride !== false,\n      storageKeys: [`mappers.${mode}.${channel}`],\n    });\n    return true;\n  }\n\n  replaceDefaultChannels(mode, channels = {}, { reason = 'channels', trackOverride = true } = {}) {\n    const collection = getCollection(this.context?.helios, mode);\n    const mapper = collection?.defaultMapper ?? null;\n    if (!collection || !mapper) return this;\n    this._muteSourceEvents += 1;\n    try {\n      for (const config of mapper.channels.values()) mapper.unregisterChannel?.(config);\n      mapper.channels.clear();\n      for (const [channelName, channelConfig] of Object.entries(channels ?? {})) {\n        const restored = restoreChannelConfig(channelConfig) ?? channelConfig;\n        if (!restored) continue;\n        mapper.setChannel(channelName, restored);\n      }\n      collection.touch?.();\n    } finally {\n      this._muteSourceEvents -= 1;\n    }\n    this.syncFromHelios({ silent: true });\n    this.emitChange(reason, { mode, trackOverride: trackOverride !== false });\n    return this;\n  }\n\n  setModeSnapshot(mode, snapshot, { reason = 'mode', trackOverride = true } = {}) {\n    const collection = getCollection(this.context?.helios, mode);\n    if (!collection) return this;\n    this._muteSourceEvents += 1;\n    try {\n      restoreMapperCollection(collection, snapshot);\n    } finally {\n      this._muteSourceEvents -= 1;\n    }\n    this.syncFromHelios({ silent: true });\n    this.emitChange(reason, { mode, trackOverride: trackOverride !== false });\n    return this;\n  }\n\n  syncFromHelios({ silent = false } = {}) {\n    this.state = snapshotState(this.context?.helios);\n    if (!silent) this.emitChange('sync');\n    return this;\n  }\n}\n\nfunction optionsHasMapperConfig(options) {\n  return Boolean(\n    options\n    && typeof options === 'object'\n    && (\n      options.node\n      || options.edge\n      || options.nodeChannels\n      || options.edgeChannels\n    )\n  );\n}\n\nexport default MappersBehavior;\n","import { AttributeType } from 'helios-network';\nimport { HeliosFilter } from '../filters/HeliosFilter.js';\nimport { Behavior } from './Behavior.js';\nimport {\n  CURRENT_SELECTION_VALUE,\n  DEFAULT_AUTO_BACKGROUND_TONE_SELECTED,\n  DEFAULT_OTHER_SELECTED_EDGE_STYLE,\n  DEFAULT_OTHER_SELECTED_NODE_STYLE,\n  DEFAULT_SELECTION_FOCUS_MAX_ZOOM,\n  DEFAULT_SELECTION_FOCUS_MIN_DISTANCE,\n  DEFAULT_SELECTION_FOCUS_ZOOM_TOLERANCE,\n  normalizeAutoBackgroundTone,\n  normalizeEdgeStyle,\n  normalizeNodeStyle,\n  resolveBooleanAttributeNames,\n} from './selectionShared.js';\nimport {\n  applyOtherElementsState,\n  applySelectedConnectedEdges,\n  ensureInteractionStateStyleDefaults,\n  syncPicking,\n} from './interactionShared.js';\n\nfunction sortedArray(values) {\n  return Array.from(values ?? []).sort((a, b) => a - b);\n}\n\nfunction collectUniqueIndices(indices) {\n  const next = [];\n  const seen = new Set();\n  for (const raw of indices ?? []) {\n    const index = Number(raw);\n    if (!Number.isInteger(index) || index < 0 || seen.has(index)) continue;\n    seen.add(index);\n    next.push(index);\n  }\n  return next;\n}\n\nfunction cloneRules(rules = []) {\n  return Array.isArray(rules)\n    ? rules.map((rule) => ({\n      ...rule,\n      values: Array.isArray(rule?.values) ? [...rule.values] : rule?.values,\n    }))\n    : [];\n}\n\nfunction selectionOptionStorageKeys(options = {}) {\n  const keys = new Set();\n  if (Object.prototype.hasOwnProperty.call(options, 'enableNodeSelection') || Object.prototype.hasOwnProperty.call(options, 'nodeClick')) {\n    keys.add('selection.nodeClick');\n  }\n  if (Object.prototype.hasOwnProperty.call(options, 'enableEdgeSelection') || Object.prototype.hasOwnProperty.call(options, 'edgeClick')) {\n    keys.add('selection.edgeClick');\n  }\n  for (const key of [\n    'selectedConnectedEdges',\n    'otherSelectedNodeStyle',\n    'otherSelectedEdgeStyle',\n    'otherSelectedNodeTone',\n    'otherSelectedEdgeTone',\n  ]) {\n    if (Object.prototype.hasOwnProperty.call(options, key)) keys.add(`selection.${key}`);\n  }\n  return Array.from(keys);\n}\n\nfunction detailTargetsPath(detail = {}, path = '') {\n  const keys = [];\n  if (typeof detail.storageKey === 'string') keys.push(detail.storageKey);\n  if (typeof detail.stateKey === 'string') keys.push(detail.stateKey);\n  if (Array.isArray(detail.storageKeys)) {\n    for (const key of detail.storageKeys) if (typeof key === 'string') keys.push(key);\n  }\n  if (Array.isArray(detail.stateKeys)) {\n    for (const key of detail.stateKeys) if (typeof key === 'string') keys.push(key);\n  }\n  if (!keys.length) return false;\n  return keys.some((key) => key === path || key.startsWith(`${path}.`) || path.startsWith(`${key}.`));\n}\n\nfunction createEntrySubscribe(behavior, path) {\n  return (notify) => {\n    if (typeof notify !== 'function') return () => {};\n    return behavior.on('change', (event) => {\n      const detail = event?.detail ?? event ?? {};\n      if (!detailTargetsPath(detail, path)) return;\n      notify(undefined, detail);\n    });\n  };\n}\n\n/**\n * Built-in behavior for node and edge selection state.\n *\n * @public\n * @param {object} [options] - Selection options such as `nodeClick`,\n * `edgeClick`, `selectedConnectedEdges`, saved-selection attribute names, and\n * inactive-item styling.\n * @returns {SelectionBehavior} Behavior that can be attached through\n * `helios.useBehavior('selection', options)`.\n * @remarks Selection state is serializable. The behavior also synchronizes\n * picking, labels, and optional connected-edge highlighting.\n * @example\n * helios.behavior.selection.selectNodes([0, 2, 4], { mode: 'replace' });\n */\nexport class SelectionBehavior extends Behavior {\n  static id = 'selection';\n\n  constructor(options = {}) {\n    super(options);\n    this.state = {\n      nodeClick: true,\n      edgeClick: false,\n      selectedConnectedEdges: true,\n      selectedNodes: new Set(),\n      selectedEdges: new Set(),\n      savedSelectionAttribute: CURRENT_SELECTION_VALUE,\n      lastNamedSelectionAttribute: '',\n      selectorRules: [],\n      otherSelectedNodeStyle: normalizeNodeStyle(DEFAULT_OTHER_SELECTED_NODE_STYLE, DEFAULT_OTHER_SELECTED_NODE_STYLE),\n      otherSelectedEdgeStyle: normalizeEdgeStyle(DEFAULT_OTHER_SELECTED_EDGE_STYLE, DEFAULT_OTHER_SELECTED_EDGE_STYLE),\n      otherSelectedNodeTone: normalizeAutoBackgroundTone(DEFAULT_AUTO_BACKGROUND_TONE_SELECTED, DEFAULT_AUTO_BACKGROUND_TONE_SELECTED),\n      otherSelectedEdgeTone: normalizeAutoBackgroundTone(DEFAULT_AUTO_BACKGROUND_TONE_SELECTED, DEFAULT_AUTO_BACKGROUND_TONE_SELECTED),\n    };\n    this.selectionFilterModel = new HeliosFilter({\n      id: 'helios-selection-behavior-model',\n      name: 'Selection Rules',\n      scope: 'render',\n    });\n    this._networkAttributeUnsub = null;\n    this.update(options);\n  }\n\n  attach(context) {\n    super.attach(context);\n    const helios = this.context?.helios ?? null;\n    this.ensureStateStyleDefaults();\n    this.applySelectionLabelDefaults();\n    this.applySelectedConnectedEdges();\n    this.syncPicking();\n    this.applyOtherElementsState();\n    this.attachNetworkAttributeListeners();\n\n    this.addCleanup(this.context.subscribe(helios, 'graph:click', (event) => this.handleGraphClick(event)));\n    this.addCleanup(this.context.subscribe(helios, 'graph:dblclick', (event) => this.handleGraphDoubleClick(event)));\n    this.addCleanup(this.context.subscribe(helios, 'network:replaced', () => this.handleNetworkReplaced()));\n    this.addCleanup(this.context.subscribe(helios, 'ui:binding-change', (event) => this.handleUiBindingChange(event)));\n    return this;\n  }\n\n  detach() {\n    this.clearSelection({ preserveBinding: true, preserveCameraFollow: false, silent: true });\n    const graphLayer = this.context?.helios?.renderer?.graphLayer ?? null;\n    if (graphLayer) graphLayer.propagateSelectedNodesToEdges = false;\n    this.context?.helios?.requestRender?.();\n    this._networkAttributeUnsub?.();\n    this._networkAttributeUnsub = null;\n    return super.detach();\n  }\n\n  update(options = {}) {\n    super.update(options);\n    if (!options || typeof options !== 'object') return this;\n    const state = this.state;\n    if (Object.prototype.hasOwnProperty.call(options, 'enableNodeSelection')) state.nodeClick = options.enableNodeSelection !== false;\n    if (Object.prototype.hasOwnProperty.call(options, 'nodeClick')) state.nodeClick = options.nodeClick !== false;\n    if (Object.prototype.hasOwnProperty.call(options, 'enableEdgeSelection')) state.edgeClick = options.enableEdgeSelection === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'edgeClick')) state.edgeClick = options.edgeClick === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'selectedConnectedEdges')) state.selectedConnectedEdges = options.selectedConnectedEdges !== false;\n    if (Object.prototype.hasOwnProperty.call(options, 'otherSelectedNodeStyle')) {\n      state.otherSelectedNodeStyle = normalizeNodeStyle(options.otherSelectedNodeStyle, DEFAULT_OTHER_SELECTED_NODE_STYLE);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'otherSelectedEdgeStyle')) {\n      state.otherSelectedEdgeStyle = normalizeEdgeStyle(options.otherSelectedEdgeStyle, DEFAULT_OTHER_SELECTED_EDGE_STYLE);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'otherSelectedNodeTone')) {\n      state.otherSelectedNodeTone = normalizeAutoBackgroundTone(options.otherSelectedNodeTone, DEFAULT_AUTO_BACKGROUND_TONE_SELECTED);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'otherSelectedEdgeTone')) {\n      state.otherSelectedEdgeTone = normalizeAutoBackgroundTone(options.otherSelectedEdgeTone, DEFAULT_AUTO_BACKGROUND_TONE_SELECTED);\n    }\n    if (this.context) {\n      this.applySelectedConnectedEdges();\n      this.syncPicking();\n      this.applyOtherElementsState();\n    }\n    this.emitChange('options', {\n      storageKeys: selectionOptionStorageKeys(options),\n      trackOverride: true,\n    });\n    return this;\n  }\n\n  serialize() {\n    return {\n      options: {\n        nodeClick: this.state.nodeClick,\n        edgeClick: this.state.edgeClick,\n        selectedConnectedEdges: this.state.selectedConnectedEdges,\n        otherSelectedNodeStyle: { ...this.state.otherSelectedNodeStyle },\n        otherSelectedEdgeStyle: { ...this.state.otherSelectedEdgeStyle },\n        otherSelectedNodeTone: { ...this.state.otherSelectedNodeTone },\n        otherSelectedEdgeTone: { ...this.state.otherSelectedEdgeTone },\n      },\n      selectedNodes: sortedArray(this.state.selectedNodes),\n      selectedEdges: sortedArray(this.state.selectedEdges),\n      savedSelectionAttribute: this.state.savedSelectionAttribute,\n      lastNamedSelectionAttribute: this.state.lastNamedSelectionAttribute,\n      selectorRules: cloneRules(this.state.selectorRules),\n    };\n  }\n\n  stateEntries() {\n    const subscribe = (key) => createEntrySubscribe(this, `selection.${key}`);\n    return {\n      selectedNodes: {\n        description: 'Selected node indices.',\n        default: sortedArray(this.state.selectedNodes),\n        type: 'array',\n        scope: 'session',\n        aliases: ['selection.selectedNodes'],\n        ui: {\n          label: 'Selected Nodes',\n          controller: 'custom',\n        },\n        getter: () => sortedArray(this.state.selectedNodes),\n        setter: (value) => this.applyNodeSelectionSet(value ?? [], 'replace', { preserveBinding: true }),\n        subscribe: subscribe('selectedNodes'),\n      },\n      selectedEdges: {\n        description: 'Selected edge indices.',\n        default: sortedArray(this.state.selectedEdges),\n        type: 'array',\n        scope: 'session',\n        aliases: ['selection.selectedEdges'],\n        ui: {\n          label: 'Selected Edges',\n          controller: 'custom',\n        },\n        getter: () => sortedArray(this.state.selectedEdges),\n        setter: (value) => this.applyEdgeSelectionSet(value ?? [], 'replace', { preserveBinding: true }),\n        subscribe: subscribe('selectedEdges'),\n      },\n      selectedConnectedEdges: {\n        description: 'Highlight edges connected to selected nodes.',\n        default: this.state.selectedConnectedEdges === true,\n        type: 'boolean',\n        scope: 'workspace',\n        aliases: ['selection.selectedConnectedEdges'],\n        ui: {\n          label: 'Connected Edges',\n          controller: 'toggle',\n        },\n        getter: () => this.state.selectedConnectedEdges === true,\n        setter: (value) => this.update({ selectedConnectedEdges: value === true }),\n        subscribe: subscribe('selectedConnectedEdges'),\n      },\n      savedSelectionAttribute: {\n        description: 'Attribute used for saved selection state.',\n        default: this.state.savedSelectionAttribute,\n        type: 'string',\n        scope: 'workspace',\n        aliases: ['selection.savedSelectionAttribute'],\n        ui: {\n          label: 'Saved Selection Attribute',\n          controller: 'text',\n        },\n        getter: () => this.state.savedSelectionAttribute,\n        setter: (value) => this.setSelectionBinding(value),\n        subscribe: subscribe('savedSelectionAttribute'),\n      },\n      nodeClick: {\n        description: 'Whether node clicks update the current selection.',\n        default: this.state.nodeClick === true,\n        type: 'boolean',\n        scope: 'workspace',\n        aliases: ['selection.nodeClick'],\n        ui: { label: 'Node Click Selection', controller: 'toggle' },\n        getter: () => this.state.nodeClick === true,\n        setter: (value) => this.update({ nodeClick: value === true }),\n        subscribe: subscribe('nodeClick'),\n      },\n      edgeClick: {\n        description: 'Whether edge clicks update the current selection.',\n        default: this.state.edgeClick === true,\n        type: 'boolean',\n        scope: 'workspace',\n        aliases: ['selection.edgeClick'],\n        ui: { label: 'Edge Click Selection', controller: 'toggle' },\n        getter: () => this.state.edgeClick === true,\n        setter: (value) => this.update({ edgeClick: value === true }),\n        subscribe: subscribe('edgeClick'),\n      },\n      'selectors.node.rules': {\n        description: 'Node selector rules used by the selection panel.',\n        default: cloneRules(this.state.selectorRules),\n        type: 'array',\n        scope: 'session',\n        aliases: ['selection.selectors.node.rules'],\n        ui: {\n          label: 'Node Selector Rules',\n          controller: 'custom',\n        },\n        getter: () => cloneRules(this.state.selectorRules),\n        setter: (value) => this.setSelectorRules(value, { silent: true }),\n        subscribe: subscribe('selectors.node.rules'),\n      },\n      otherSelectedNodeStyle: {\n        description: 'Style applied to non-selected nodes while nodes are selected.',\n        default: { ...this.state.otherSelectedNodeStyle },\n        type: 'object',\n        scope: 'workspace',\n        aliases: ['selection.otherSelectedNodeStyle'],\n        ui: { label: 'Other Selected Node Style', controller: 'custom' },\n        getter: () => ({ ...this.state.otherSelectedNodeStyle }),\n        setter: (value) => this.update({ otherSelectedNodeStyle: value }),\n        subscribe: subscribe('otherSelectedNodeStyle'),\n      },\n      otherSelectedEdgeStyle: {\n        description: 'Style applied to non-selected edges while nodes or edges are selected.',\n        default: { ...this.state.otherSelectedEdgeStyle },\n        type: 'object',\n        scope: 'workspace',\n        aliases: ['selection.otherSelectedEdgeStyle'],\n        ui: { label: 'Other Selected Edge Style', controller: 'custom' },\n        getter: () => ({ ...this.state.otherSelectedEdgeStyle }),\n        setter: (value) => this.update({ otherSelectedEdgeStyle: value }),\n        subscribe: subscribe('otherSelectedEdgeStyle'),\n      },\n      otherSelectedNodeTone: {\n        description: 'Automatic background tone mix for non-selected nodes.',\n        default: { ...this.state.otherSelectedNodeTone },\n        type: 'object',\n        scope: 'workspace',\n        aliases: ['selection.otherSelectedNodeTone'],\n        ui: { label: 'Other Selected Node Tone', controller: 'custom' },\n        getter: () => ({ ...this.state.otherSelectedNodeTone }),\n        setter: (value) => this.update({ otherSelectedNodeTone: value }),\n        subscribe: subscribe('otherSelectedNodeTone'),\n      },\n      otherSelectedEdgeTone: {\n        description: 'Automatic background tone mix for non-selected edges.',\n        default: { ...this.state.otherSelectedEdgeTone },\n        type: 'object',\n        scope: 'workspace',\n        aliases: ['selection.otherSelectedEdgeTone'],\n        ui: { label: 'Other Selected Edge Tone', controller: 'custom' },\n        getter: () => ({ ...this.state.otherSelectedEdgeTone }),\n        setter: (value) => this.update({ otherSelectedEdgeTone: value }),\n        subscribe: subscribe('otherSelectedEdgeTone'),\n      },\n    };\n  }\n\n  restore(snapshot = {}) {\n    const options = snapshot?.options && typeof snapshot.options === 'object' ? snapshot.options : {};\n    this.update(options);\n    this.clearSelection({ preserveBinding: true, preserveCameraFollow: true, silent: true });\n    this.applyNodeSelectionSet(snapshot?.selectedNodes ?? [], 'replace', { preserveBinding: true, silent: true });\n    this.applyEdgeSelectionSet(snapshot?.selectedEdges ?? [], 'replace', { preserveBinding: true, silent: true });\n    this.state.savedSelectionAttribute = snapshot?.savedSelectionAttribute || CURRENT_SELECTION_VALUE;\n    this.state.lastNamedSelectionAttribute = snapshot?.lastNamedSelectionAttribute || '';\n    this.state.selectorRules = cloneRules(snapshot?.selectorRules ?? []);\n    this.applyOtherElementsState();\n    this.emitChange('restore');\n    return this;\n  }\n\n  emitChange(reason, detail = {}) {\n    this.emit('change', { reason, state: this.getPublicState(), ...detail });\n  }\n\n  getPublicState() {\n    return {\n      ...this.state,\n      selectedNodes: this.state.selectedNodes,\n      selectedEdges: this.state.selectedEdges,\n    };\n  }\n\n  ensureStateStyleDefaults() {\n    ensureInteractionStateStyleDefaults(this.context?.helios ?? null);\n  }\n\n  applyOtherElementsState() {\n    applyOtherElementsState(this.context);\n  }\n\n  applySelectedConnectedEdges() {\n    applySelectedConnectedEdges(this.context);\n  }\n\n  syncPicking() {\n    syncPicking(this.context, this.options);\n  }\n\n  setSelectionBinding(value = CURRENT_SELECTION_VALUE) {\n    this.state.savedSelectionAttribute = value || CURRENT_SELECTION_VALUE;\n    this.emitChange('binding', {\n      storageKeys: ['selection.savedSelectionAttribute'],\n      trackOverride: true,\n    });\n  }\n\n  setSelectorRules(rules = [], options = {}) {\n    this.state.selectorRules = cloneRules(rules);\n    if (options.silent !== true) this.emitChange('selector-rules', {\n      trackOverride: options.trackOverride !== false,\n      storageKeys: ['selection.selectors.node.rules'],\n    });\n    return this;\n  }\n\n  applySelectionLabelDefaults() {\n    if (this.options.enableSelectionLabels === false) return;\n    const labelsBehavior = this.context?.getBehavior?.('labels') ?? null;\n    if (labelsBehavior?.applySelectionDefaults) {\n      labelsBehavior.applySelectionDefaults();\n      return;\n    }\n    const helios = this.context?.helios ?? null;\n    const current = helios?.labels?.() ?? {};\n    helios?.labels?.({\n      enabled: current.enabled === true ? current.enabled : true,\n      selectionMode: current.enabled === true && current.selectionMode === 'ranked' ? 'ranked' : 'selected-only',\n    });\n  }\n\n  setNodeSelected(index, selected, options = {}) {\n    const helios = this.context?.helios ?? null;\n    if (!Number.isInteger(index) || index < 0 || !helios) return;\n    if (selected) {\n      if (this.state.selectedNodes.has(index)) return;\n      this.state.selectedNodes.add(index);\n    } else {\n      if (!this.state.selectedNodes.has(index)) return;\n      this.state.selectedNodes.delete(index);\n    }\n    helios.nodeState?.([index], 'SELECTED', { mode: selected ? 'add' : 'remove' });\n    if (!this.state.selectedNodes.size) {\n      helios.cameraFollowNodes?.([], { frame: false });\n    }\n    this.applyOtherElementsState();\n    if (options.preserveBinding !== true) this.setSelectionBinding(CURRENT_SELECTION_VALUE);\n    if (options.silent !== true) this.emitChange('node-selection', {\n      trackOverride: options.trackOverride !== false,\n      storageKeys: ['selection.selectedNodes'],\n    });\n  }\n\n  setEdgeSelected(index, selected, options = {}) {\n    const helios = this.context?.helios ?? null;\n    if (!Number.isInteger(index) || index < 0 || !helios) return;\n    if (selected) {\n      if (this.state.selectedEdges.has(index)) return;\n      this.state.selectedEdges.add(index);\n    } else {\n      if (!this.state.selectedEdges.has(index)) return;\n      this.state.selectedEdges.delete(index);\n    }\n    helios.edgeState?.([index], 'SELECTED', { mode: selected ? 'add' : 'remove' });\n    this.applyOtherElementsState();\n    if (options.preserveBinding !== true) this.setSelectionBinding(CURRENT_SELECTION_VALUE);\n    if (options.silent !== true) this.emitChange('edge-selection', {\n      trackOverride: options.trackOverride !== false,\n      storageKeys: ['selection.selectedEdges'],\n    });\n  }\n\n  clearSelection(options = {}) {\n    const helios = this.context?.helios ?? null;\n    if (!helios) return;\n    if (this.state.selectedNodes.size) {\n      helios.nodeState?.(Array.from(this.state.selectedNodes), 'SELECTED', { mode: 'remove' });\n      this.state.selectedNodes.clear();\n    }\n    if (this.state.selectedEdges.size) {\n      helios.edgeState?.(Array.from(this.state.selectedEdges), 'SELECTED', { mode: 'remove' });\n      this.state.selectedEdges.clear();\n    }\n    this.applyOtherElementsState();\n    if (options.preserveBinding !== true) this.setSelectionBinding(CURRENT_SELECTION_VALUE);\n    if (options.preserveCameraFollow !== true) {\n      helios.cameraFollowNodes?.([], { frame: false });\n    }\n    if (options.silent !== true) this.emitChange('clear', {\n      trackOverride: options.trackOverride !== false,\n      storageKeys: ['selection.selectedNodes', 'selection.selectedEdges'],\n    });\n  }\n\n  selectOnly(kind, index, options = {}) {\n    const selectedNodes = Array.from(this.state.selectedNodes);\n    const selectedEdges = Array.from(this.state.selectedEdges);\n    for (const nodeIndex of selectedNodes) {\n      if (!(kind === 'node' && nodeIndex === index)) this.setNodeSelected(nodeIndex, false, options);\n    }\n    for (const edgeIndex of selectedEdges) {\n      if (!(kind === 'edge' && edgeIndex === index)) this.setEdgeSelected(edgeIndex, false, options);\n    }\n    if (kind === 'node') this.setNodeSelected(index, true, options);\n    if (kind === 'edge') this.setEdgeSelected(index, true, options);\n  }\n\n  toggleSelection(kind, index, options = {}) {\n    if (kind === 'node') this.setNodeSelected(index, !this.state.selectedNodes.has(index), options);\n    if (kind === 'edge') this.setEdgeSelected(index, !this.state.selectedEdges.has(index), options);\n  }\n\n  applyNodeSelectionSet(indices, mode = 'add', options = {}) {\n    const helios = this.context?.helios ?? null;\n    if (!helios) return { added: 0, removed: 0, total: 0 };\n    const nextIndices = collectUniqueIndices(indices);\n    const nextIndexSet = new Set(nextIndices);\n    const toAdd = [];\n    const toRemove = [];\n    if (mode === 'replace') {\n      for (const index of this.state.selectedNodes) {\n        if (!nextIndexSet.has(index)) toRemove.push(index);\n      }\n    } else if (mode === 'remove') {\n      for (const index of nextIndices) {\n        if (this.state.selectedNodes.has(index)) toRemove.push(index);\n      }\n    }\n    if (mode !== 'remove') {\n      for (const index of nextIndices) {\n        if (!this.state.selectedNodes.has(index)) toAdd.push(index);\n      }\n    }\n    if (toRemove.length) {\n      helios.nodeState?.(toRemove, 'SELECTED', { mode: 'remove' });\n      for (const index of toRemove) this.state.selectedNodes.delete(index);\n    }\n    if (toAdd.length) {\n      helios.nodeState?.(toAdd, 'SELECTED', { mode: 'add' });\n      for (const index of toAdd) this.state.selectedNodes.add(index);\n    }\n    this.applyOtherElementsState();\n    if (options.preserveBinding !== true) this.setSelectionBinding(CURRENT_SELECTION_VALUE);\n    if (options.silent !== true) this.emitChange('node-selection-set', {\n      trackOverride: options.trackOverride !== false,\n      storageKeys: ['selection.selectedNodes'],\n    });\n    return { added: toAdd.length, removed: toRemove.length, total: this.state.selectedNodes.size };\n  }\n\n  applyEdgeSelectionSet(indices, mode = 'add', options = {}) {\n    const helios = this.context?.helios ?? null;\n    if (!helios) return { added: 0, removed: 0, total: 0 };\n    const nextIndices = collectUniqueIndices(indices);\n    const nextIndexSet = new Set(nextIndices);\n    const toAdd = [];\n    const toRemove = [];\n    if (mode === 'replace') {\n      for (const index of this.state.selectedEdges) {\n        if (!nextIndexSet.has(index)) toRemove.push(index);\n      }\n    } else if (mode === 'remove') {\n      for (const index of nextIndices) {\n        if (this.state.selectedEdges.has(index)) toRemove.push(index);\n      }\n    }\n    if (mode !== 'remove') {\n      for (const index of nextIndices) {\n        if (!this.state.selectedEdges.has(index)) toAdd.push(index);\n      }\n    }\n    if (toRemove.length) {\n      helios.edgeState?.(toRemove, 'SELECTED', { mode: 'remove' });\n      for (const index of toRemove) this.state.selectedEdges.delete(index);\n    }\n    if (toAdd.length) {\n      helios.edgeState?.(toAdd, 'SELECTED', { mode: 'add' });\n      for (const index of toAdd) this.state.selectedEdges.add(index);\n    }\n    this.applyOtherElementsState();\n    if (options.preserveBinding !== true) this.setSelectionBinding(CURRENT_SELECTION_VALUE);\n    if (options.silent !== true) this.emitChange('edge-selection-set', {\n      trackOverride: options.trackOverride !== false,\n      storageKeys: ['selection.selectedEdges'],\n    });\n    return { added: toAdd.length, removed: toRemove.length, total: this.state.selectedEdges.size };\n  }\n\n  selectNodes(indices, options = {}) {\n    return this.applyNodeSelectionSet(indices, options.mode ?? 'add', options);\n  }\n\n  selectEdges(indices, options = {}) {\n    return this.applyEdgeSelectionSet(indices, options.mode ?? 'add', options);\n  }\n\n  buildNodeSelectionQuery(rules = []) {\n    this.selectionFilterModel.clear('node');\n    this.selectionFilterModel.clear('edge');\n    for (const rule of rules ?? []) {\n      this.selectionFilterModel.addRule(rule);\n    }\n    return this.selectionFilterModel.compileScopeQuery('node');\n  }\n\n  applyNodeSelectionQuery(rules, mode = 'add') {\n    this.setSelectorRules(rules, { silent: true });\n    const query = this.buildNodeSelectionQuery(rules);\n    if (!query) return { added: 0, removed: 0, total: this.state.selectedNodes.size };\n    const matches = this.context?.network?.selectNodes?.(query) ?? new Uint32Array();\n    return this.applyNodeSelectionSet(matches, mode);\n  }\n\n  expandSelectionToNeighbors() {\n    if (!this.state.selectedNodes.size) return { added: 0, removed: 0, total: 0 };\n    const neighbors = this.context?.network?.getNeighborsForNodes?.(Array.from(this.state.selectedNodes), {\n      direction: 'both',\n      includeEdges: false,\n      includeSourceNodes: false,\n    }) ?? new Uint32Array();\n    return this.applyNodeSelectionSet(neighbors, 'add');\n  }\n\n  centerSelectedNodesOrNetwork(options = {}) {\n    const helios = this.context?.helios ?? null;\n    const selectedNodes = Array.from(this.state.selectedNodes);\n    if (selectedNodes.length) {\n      helios?.cameraFollowNodes?.(selectedNodes, {\n        animate: options.animate ?? true,\n        durationMs: options.durationMs,\n        followUpdateIntervalMs: options.followUpdateIntervalMs ?? 180,\n        zoomScale: options.zoomScale ?? 1.35,\n        maxFocusZoom: options.maxFocusZoom ?? DEFAULT_SELECTION_FOCUS_MAX_ZOOM,\n        minFocusDistance: options.minFocusDistance ?? DEFAULT_SELECTION_FOCUS_MIN_DISTANCE,\n        focusZoomTolerance: options.focusZoomTolerance ?? DEFAULT_SELECTION_FOCUS_ZOOM_TOLERANCE,\n      });\n      return true;\n    }\n    helios?.cameraFollowNodes?.([], {\n      animate: options.animate ?? true,\n      durationMs: options.durationMs,\n      resetOrientation: false,\n    });\n    return false;\n  }\n\n  collectSavedSelectionAttributes() {\n    const network = this.context?.network ?? null;\n    const catalog = new Map();\n    for (const name of resolveBooleanAttributeNames(network, 'node')) {\n      const entry = catalog.get(name) ?? { name, node: false, edge: false };\n      entry.node = true;\n      catalog.set(name, entry);\n    }\n    for (const name of resolveBooleanAttributeNames(network, 'edge')) {\n      const entry = catalog.get(name) ?? { name, node: false, edge: false };\n      entry.edge = true;\n      catalog.set(name, entry);\n    }\n    return Array.from(catalog.values()).sort((a, b) => a.name.localeCompare(b.name));\n  }\n\n  ensureBooleanSelectionAttribute(network, scope, name) {\n    const trimmed = String(name ?? '').trim();\n    if (!trimmed) throw new Error('Selection attribute name is required.');\n    const getInfo = scope === 'edge'\n      ? network.getEdgeAttributeInfo?.bind(network)\n      : network.getNodeAttributeInfo?.bind(network);\n    const defineAttribute = scope === 'edge'\n      ? network.defineEdgeAttribute?.bind(network)\n      : network.defineNodeAttribute?.bind(network);\n    const info = getInfo?.(trimmed) ?? null;\n    if (info) {\n      if (info.type !== AttributeType.Boolean || info.dimension !== 1) {\n        throw new Error(`Attribute \"${trimmed}\" already exists on ${scope}s and is not a boolean scalar.`);\n      }\n      return trimmed;\n    }\n    defineAttribute?.(trimmed, AttributeType.Boolean, 1);\n    return trimmed;\n  }\n\n  saveSelectionToAttribute(name) {\n    const network = this.context?.network ?? null;\n    if (!network) throw new Error('Selection save requires an active network.');\n    const trimmed = this.ensureBooleanSelectionAttribute(network, 'node', name);\n    this.ensureBooleanSelectionAttribute(network, 'edge', trimmed);\n    if (typeof network.withBufferAccess === 'function') {\n      network.withBufferAccess(() => {\n        const nodeView = network.getNodeAttributeBuffer(trimmed).view;\n        const edgeView = network.getEdgeAttributeBuffer(trimmed).view;\n        nodeView.fill(0);\n        edgeView.fill(0);\n        for (const index of this.state.selectedNodes) nodeView[index] = 1;\n        for (const index of this.state.selectedEdges) edgeView[index] = 1;\n      });\n    }\n    network.bumpNodeAttributeVersion?.(trimmed);\n    network.bumpEdgeAttributeVersion?.(trimmed);\n    this.state.savedSelectionAttribute = trimmed;\n    this.state.lastNamedSelectionAttribute = trimmed;\n    this.emitChange('save');\n    return trimmed;\n  }\n\n  collectSelectionAttributeIndices(scope, name) {\n    const network = this.context?.network ?? null;\n    if (!network || typeof network.withBufferAccess !== 'function') return [];\n    const trimmed = String(name ?? '').trim();\n    if (!trimmed) return [];\n    const getInfo = scope === 'edge'\n      ? network.getEdgeAttributeInfo?.bind(network)\n      : network.getNodeAttributeInfo?.bind(network);\n    const info = getInfo?.(trimmed) ?? null;\n    if (!info || info.type !== AttributeType.Boolean || info.dimension !== 1) return [];\n    return network.withBufferAccess(() => {\n      const ids = scope === 'edge' ? (network.edgeIndices ?? []) : (network.nodeIndices ?? []);\n      const view = scope === 'edge'\n        ? network.getEdgeAttributeBuffer(trimmed).view\n        : network.getNodeAttributeBuffer(trimmed).view;\n      const matches = [];\n      for (let index = 0; index < ids.length; index += 1) {\n        const id = Number(ids[index]);\n        if (Number(view[id]) !== 0) matches.push(id);\n      }\n      return matches;\n    }, {\n      nodeIndices: scope !== 'edge',\n      edgeIndices: scope === 'edge',\n    });\n  }\n\n  restoreSelectionFromAttribute(name) {\n    const trimmed = String(name ?? '').trim();\n    if (!trimmed) throw new Error('Select a saved selection before restoring.');\n    const nodeMatches = this.collectSelectionAttributeIndices('node', trimmed);\n    const edgeMatches = this.collectSelectionAttributeIndices('edge', trimmed);\n    this.applyNodeSelectionSet(nodeMatches, 'replace', { preserveBinding: true });\n    this.applyEdgeSelectionSet(edgeMatches, 'replace', { preserveBinding: true });\n    this.setSelectionBinding(trimmed);\n    this.emitChange('restore-attribute');\n  }\n\n  attachNetworkAttributeListeners() {\n    this._networkAttributeUnsub?.();\n    this._networkAttributeUnsub = null;\n    const network = this.context?.network ?? null;\n    if (!network) return;\n    const handler = () => this.emitChange('attributes');\n    const unsubs = [\n      this.context.subscribe(network, 'attribute:defined', handler),\n      this.context.subscribe(network, 'attribute:removed', handler),\n      this.context.subscribe(network, 'attribute:changed', handler),\n    ];\n    this._networkAttributeUnsub = () => {\n      for (const unsubscribe of unsubs) unsubscribe?.();\n    };\n  }\n\n  handleGraphClick(event) {\n    const detail = event?.detail;\n    if (!detail) return;\n    const shiftKey = detail.modifiers?.shiftKey === true;\n    const isNodeHit = detail.kind === 'node' && detail.index >= 0;\n    const isEdgeHit = detail.kind === 'edge' && detail.index >= 0;\n    if (isNodeHit && this.state.nodeClick) {\n      if (shiftKey) this.toggleSelection('node', detail.index);\n      else this.selectOnly('node', detail.index);\n      return;\n    }\n    if (isEdgeHit && this.state.edgeClick) {\n      if (shiftKey) this.toggleSelection('edge', detail.index);\n      else this.selectOnly('edge', detail.index);\n      return;\n    }\n    if (!shiftKey) {\n      this.clearSelection();\n    }\n  }\n\n  handleGraphDoubleClick(event) {\n    const detail = event?.detail;\n    if (!detail) return;\n    const shiftKey = detail.modifiers?.shiftKey === true;\n    const isNodeHit = detail.kind === 'node' && detail.index >= 0;\n    if (isNodeHit && this.state.nodeClick) {\n      if (shiftKey) this.toggleSelection('node', detail.index);\n      else this.selectOnly('node', detail.index);\n      this.centerSelectedNodesOrNetwork();\n      return;\n    }\n    this.clearSelection();\n    this.centerSelectedNodesOrNetwork();\n  }\n\n  handleNetworkReplaced() {\n    this.clearSelection({ preserveBinding: true, silent: true });\n    this.state.savedSelectionAttribute = CURRENT_SELECTION_VALUE;\n    this.state.lastNamedSelectionAttribute = '';\n    this.attachNetworkAttributeListeners();\n    this.ensureStateStyleDefaults();\n    this.applySelectedConnectedEdges();\n    this.applyOtherElementsState();\n    this.applySelectionLabelDefaults();\n    this.syncPicking();\n    this.emitChange('network-replaced');\n  }\n\n  handleUiBindingChange(event) {\n    const bindingName = event?.detail?.name ?? null;\n    if (bindingName !== 'clearColor' && bindingName !== 'background') return;\n    this.applyOtherElementsState();\n    this.emitChange('ui-binding');\n  }\n}\n\nexport default SelectionBehavior;\n","import { Behavior } from './Behavior.js';\nimport { AppearanceBehavior } from './AppearanceBehavior.js';\nimport { BehaviorManager } from './BehaviorManager.js';\nimport { BehaviorRegistry } from './BehaviorRegistry.js';\nimport { ExporterBehavior } from './ExporterBehavior.js';\nimport { FilterBehavior } from './FilterBehavior.js';\nimport { HoverBehavior } from './HoverBehavior.js';\nimport { InterfaceBehavior } from './InterfaceBehavior.js';\nimport { LayoutBehavior } from './LayoutBehavior.js';\nimport { LegendsBehavior } from './LegendsBehavior.js';\nimport { LabelsBehavior } from './LabelsBehavior.js';\nimport { MappersBehavior } from './MappersBehavior.js';\nimport { SelectionBehavior } from './SelectionBehavior.js';\n\n/**\n * Ordered ids for the built-in behavior set.\n *\n * @public\n * @remarks The order matches `createDefaultBehaviorRegistry()` registration and\n * is stable for UI/persistence code that needs to list built-ins.\n */\nexport const BEHAVIOR_IDS = Object.freeze([\n  AppearanceBehavior.id,\n  ExporterBehavior.id,\n  MappersBehavior.id,\n  FilterBehavior.id,\n  InterfaceBehavior.id,\n  LayoutBehavior.id,\n  LegendsBehavior.id,\n  LabelsBehavior.id,\n  HoverBehavior.id,\n  SelectionBehavior.id,\n]);\n\n/**\n * Create a registry containing all built-in Helios Web behaviors.\n *\n * @public\n * @returns {BehaviorRegistry} Registry preloaded with appearance, exporter,\n * mappers, filters, interface, layout, legends, labels, hover, and selection.\n * @example\n * const registry = createDefaultBehaviorRegistry()\n *   .register('custom', CustomBehavior);\n */\nexport function createDefaultBehaviorRegistry() {\n  return new BehaviorRegistry()\n    .register(BEHAVIOR_IDS[0], AppearanceBehavior)\n    .register(BEHAVIOR_IDS[1], ExporterBehavior)\n    .register(BEHAVIOR_IDS[2], MappersBehavior)\n    .register(BEHAVIOR_IDS[3], FilterBehavior)\n    .register(BEHAVIOR_IDS[4], InterfaceBehavior)\n    .register(BEHAVIOR_IDS[5], LayoutBehavior)\n    .register(BEHAVIOR_IDS[6], LegendsBehavior)\n    .register(BEHAVIOR_IDS[7], LabelsBehavior)\n    .register(BEHAVIOR_IDS[8], HoverBehavior)\n    .register(BEHAVIOR_IDS[9], SelectionBehavior);\n}\n\nexport {\n  AppearanceBehavior,\n  Behavior,\n  BehaviorManager,\n  BehaviorRegistry,\n  ExporterBehavior,\n  FilterBehavior,\n  HoverBehavior,\n  InterfaceBehavior,\n  LayoutBehavior,\n  LegendsBehavior,\n  LabelsBehavior,\n  MappersBehavior,\n  SelectionBehavior,\n};\n","const PERSISTENCE_SCHEMA = 'helios-web.persistence';\n/**\n * Current schema version for Helios Web persistence envelopes.\n *\n * @public\n */\nexport const PERSISTENCE_SCHEMA_VERSION = 1;\n/**\n * Supported persistence envelope kinds.\n *\n * @public\n * @remarks Preferences, visualization snapshots, and full sessions share the\n * same envelope shape but validate different payload structures.\n */\nexport const PERSISTENCE_KINDS = Object.freeze({\n  preferences: 'preferences',\n  visualization: 'visualization',\n  session: 'session',\n});\n\nfunction cloneSerializable(value) {\n  if (Array.isArray(value)) return value.map((entry) => cloneSerializable(entry));\n  if (ArrayBuffer.isView(value)) return Array.from(value);\n  if (value && typeof value === 'object') {\n    const next = {};\n    for (const [key, entry] of Object.entries(value)) next[key] = cloneSerializable(entry);\n    return next;\n  }\n  return value;\n}\n\nfunction isPlainObject(value) {\n  return value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction setAtPath(root, segments, value) {\n  let target = root;\n  for (let i = 0; i < segments.length - 1; i += 1) {\n    const key = segments[i];\n    if (!isPlainObject(target[key])) target[key] = {};\n    target = target[key];\n  }\n  target[segments.at(-1)] = cloneSerializable(value);\n}\n\nfunction flattenObject(value, prefix, output) {\n  if (Array.isArray(value) || !isPlainObject(value)) {\n    output[prefix] = cloneSerializable(value);\n    return;\n  }\n  const entries = Object.entries(value);\n  if (!entries.length && prefix) {\n    output[prefix] = {};\n    return;\n  }\n  for (const [key, entry] of entries) {\n    flattenObject(entry, prefix ? `${prefix}.${key}` : key, output);\n  }\n}\n\nconst VOLATILE_OVERRIDE_PATHS = new Set([\n  'appearance.edgeStyle.adaptiveQuality.active',\n  'appearance.edgeStyle.adaptiveQuality.manualFastRendering',\n  'appearance.edgeStyle.adaptiveQuality.reason',\n  'appearance.edgeStyle.adaptiveQuality.lastRenderMs',\n  'appearance.edgeStyle.adaptiveQuality.qualityFrameAverageMs',\n  'appearance.edgeStyle.adaptiveQuality.qualityFrameSampleCount',\n]);\n\nconst VOLATILE_OVERRIDE_PREFIXES = [\n  'camera.viewport',\n];\n\nconst CAMERA_POSE_OVERRIDE_PREFIXES = [\n  'camera.mode',\n  'camera.projection',\n  'camera.distance',\n  'camera.far',\n  'camera.fov',\n  'camera.near',\n  'camera.near2D',\n  'camera.far2D',\n  'camera.pan2D',\n  'camera.pan3D',\n  'camera.rotation',\n  'camera.target',\n  'camera.zoom',\n];\n\nconst CANONICAL_BEHAVIOR_OVERRIDE_IDS = new Set(['layout', 'legends', 'filters', 'selection', 'mappers']);\n\nfunction isPathWithinPrefixes(path, prefixes) {\n  const target = String(path ?? '');\n  return prefixes.some((prefix) => target === prefix || target.startsWith(`${prefix}.`));\n}\n\nfunction isVolatileOverridePath(path) {\n  const target = String(path ?? '');\n  return VOLATILE_OVERRIDE_PATHS.has(target)\n    || VOLATILE_OVERRIDE_PREFIXES.some((prefix) => target === prefix || target.startsWith(`${prefix}.`));\n}\n\nfunction pruneVolatileOverrides(map = {}) {\n  for (const path of Object.keys(map)) {\n    if (isVolatileOverridePath(path)) delete map[path];\n  }\n  return map;\n}\n\nfunction normalizeOverrideMap(map = {}) {\n  const next = pruneVolatileOverrides(map);\n  const hasCameraPoseOverride = Object.keys(next).some((path) => isPathWithinPrefixes(path, CAMERA_POSE_OVERRIDE_PREFIXES));\n  if (hasCameraPoseOverride && !Object.prototype.hasOwnProperty.call(next, 'cameraControls.autoFit')) {\n    next['cameraControls.autoFit'] = false;\n  }\n  return next;\n}\n\nfunction normalizeResponsivePreferences(value = {}) {\n  const source = value && typeof value === 'object' ? value : {};\n  return {\n    compactDockSide: typeof source.compactDockSide === 'string' ? source.compactDockSide : null,\n    preferredMode: typeof source.preferredMode === 'string' ? source.preferredMode : null,\n    lastViewportClass: typeof source.lastViewportClass === 'string' ? source.lastViewportClass : null,\n  };\n}\n\n/**\n * Normalize a preferences payload into the current public preference shape.\n *\n * @public\n * @param {object} [value] - Partial preferences payload.\n * @returns {object} Preferences state with theme, autosave, and responsive\n * preference fields populated.\n */\nexport function createDefaultPreferencesState(value = {}) {\n  const source = value && typeof value === 'object' ? value : {};\n  return {\n    theme: typeof source.theme === 'string' ? source.theme : null,\n    autosave: source.autosave === true,\n    responsive: normalizeResponsivePreferences(source.responsive),\n  };\n}\n\n/**\n * Normalize a UI payload into the current serializable UI state shape.\n *\n * @public\n * @param {object} [value] - Partial UI state from a session or app shell.\n * @returns {object} UI state with panel, dock-order, and interface records.\n */\nexport function createDefaultUIState(value = {}) {\n  const source = value && typeof value === 'object' ? value : {};\n  return {\n    theme: typeof source.theme === 'string' ? source.theme : null,\n    panels: source.panels && typeof source.panels === 'object' ? cloneSerializable(source.panels) : {},\n    dockOrder: source.dockOrder && typeof source.dockOrder === 'object' ? cloneSerializable(source.dockOrder) : {},\n    interface: source.interface && typeof source.interface === 'object' ? cloneSerializable(source.interface) : {},\n  };\n}\n\n/**\n * Normalize source-network metadata stored with visualization state.\n *\n * @public\n * @param {object} [value] - Partial source metadata.\n * @returns {object} Network source metadata including name, format, counts,\n * and whether portable visualization state was attached.\n */\nexport function createDefaultNetworkSource(value = {}) {\n  const source = value && typeof value === 'object' ? value : {};\n  return {\n    name: typeof source.name === 'string' ? source.name : null,\n    baseName: typeof source.baseName === 'string' ? source.baseName : null,\n    format: typeof source.format === 'string' ? source.format : null,\n    nodeCount: Number.isFinite(source.nodeCount) ? Number(source.nodeCount) : null,\n    edgeCount: Number.isFinite(source.edgeCount) ? Number(source.edgeCount) : null,\n    portableVisualizationAttached: source.portableVisualizationAttached === true,\n    loadedAt: Number.isFinite(source.loadedAt) ? Number(source.loadedAt) : null,\n  };\n}\n\n/**\n * Normalize a visualization-state payload into the current persistence shape.\n *\n * @public\n * @param {object} [value] - Partial visualization payload or legacy snapshot.\n * @returns {object} Normalized visualization state.\n */\nexport function normalizeVisualizationPayload(value = {}) {\n  const source = value && typeof value === 'object' ? value : {};\n  const preferences = createDefaultPreferencesState(source.preferences);\n  return {\n    preferences,\n    responsivePreferences: normalizeResponsivePreferences(source.responsivePreferences ?? preferences.responsive),\n    uiState: createDefaultUIState(source.uiState ?? source.ui),\n    behaviorState: source.behaviorState && typeof source.behaviorState === 'object'\n      ? cloneSerializable(source.behaviorState)\n      : (source.behaviors && typeof source.behaviors === 'object' ? cloneSerializable(source.behaviors) : {}),\n    overrides: source.overrides && typeof source.overrides === 'object'\n      ? cloneSerializable(source.overrides)\n      : null,\n    cameraState: source.cameraState && typeof source.cameraState === 'object'\n      ? cloneSerializable(source.cameraState)\n      : (source.camera && typeof source.camera === 'object' ? cloneSerializable(source.camera) : null),\n    cameraControlState: source.cameraControlState && typeof source.cameraControlState === 'object'\n      ? cloneSerializable(source.cameraControlState)\n      : (source.cameraControls && typeof source.cameraControls === 'object' ? cloneSerializable(source.cameraControls) : null),\n    networkSource: createDefaultNetworkSource(source.networkSource ?? source.source),\n    layoutRuntimeState: source.layoutRuntimeState && typeof source.layoutRuntimeState === 'object'\n      ? cloneSerializable(source.layoutRuntimeState)\n      : null,\n    storageState: source.storageState && typeof source.storageState === 'object'\n      ? cloneSerializable(source.storageState)\n      : null,\n  };\n}\n\n/**\n * Normalize a session payload into the current persisted session shape.\n *\n * @public\n * @param {object} [value] - Partial session payload or legacy session record.\n * @returns {object} Normalized session state with network and position records.\n */\nexport function normalizeSessionPayload(value = {}) {\n  const source = value && typeof value === 'object' ? value : {};\n  const preferences = createDefaultPreferencesState(source.preferences);\n  const visualizationState = migratePersistenceEnvelope(\n    source.visualizationState ?? source.visualization ?? {},\n    PERSISTENCE_KINDS.visualization,\n  );\n  return {\n    session: {\n      id: typeof source.session?.id === 'string' ? source.session.id : (typeof source.id === 'string' ? source.id : null),\n      createdAt: Number.isFinite(source.session?.createdAt) ? Number(source.session.createdAt) : (Number.isFinite(source.createdAt) ? Number(source.createdAt) : null),\n      updatedAt: Number.isFinite(source.session?.updatedAt) ? Number(source.session.updatedAt) : (Number.isFinite(source.updatedAt) ? Number(source.updatedAt) : null),\n      workspaceId: typeof source.session?.workspaceId === 'string' ? source.session.workspaceId : (typeof source.workspaceId === 'string' ? source.workspaceId : null),\n      nickname: typeof source.session?.nickname === 'string' ? source.session.nickname : (typeof source.nickname === 'string' ? source.nickname : null),\n      unfinished: source.session?.unfinished !== false && source.unfinished !== false,\n      status: typeof source.session?.status === 'string' ? source.session.status : (typeof source.status === 'string' ? source.status : 'active'),\n      bytes: Number.isFinite(source.session?.bytes) ? Number(source.session.bytes) : (Number.isFinite(source.bytes) ? Number(source.bytes) : undefined),\n    },\n    preferences,\n    responsivePreferences: normalizeResponsivePreferences(source.responsivePreferences ?? preferences.responsive),\n    uiState: createDefaultUIState(source.uiState ?? source.ui),\n    behaviorState: source.behaviorState && typeof source.behaviorState === 'object'\n      ? cloneSerializable(source.behaviorState)\n      : (source.behaviors && typeof source.behaviors === 'object' ? cloneSerializable(source.behaviors) : {}),\n    networkSource: createDefaultNetworkSource(source.networkSource ?? source.source),\n    networkData: source.networkData && typeof source.networkData === 'object'\n      ? {\n        format: typeof source.networkData.format === 'string' ? source.networkData.format : 'bxnet',\n        data: source.networkData.data ?? null,\n        dataRef: typeof source.networkData.dataRef === 'string' ? source.networkData.dataRef : null,\n        byteLength: Number.isFinite(source.networkData.byteLength) ? Number(source.networkData.byteLength) : null,\n      }\n      : {\n        format: typeof source.networkFormat === 'string' ? source.networkFormat : 'bxnet',\n        data: source.networkBytes ?? null,\n        dataRef: null,\n        byteLength: null,\n      },\n    positionData: source.positionData && typeof source.positionData === 'object'\n      ? {\n        schema: typeof source.positionData.schema === 'string' ? source.positionData.schema : 'helios-web.session-position-data',\n        version: Number.isFinite(source.positionData.version) ? Number(source.positionData.version) : 1,\n        encoding: typeof source.positionData.encoding === 'string' ? source.positionData.encoding : 'float32',\n        compression: typeof source.positionData.compression === 'string' ? source.positionData.compression : 'none',\n        data: source.positionData.data ?? null,\n        dataRef: typeof source.positionData.dataRef === 'string' ? source.positionData.dataRef : null,\n        length: Number.isFinite(source.positionData.length) ? Number(source.positionData.length) : null,\n        byteLength: Number.isFinite(source.positionData.byteLength) ? Number(source.positionData.byteLength) : null,\n        storedByteLength: Number.isFinite(source.positionData.storedByteLength) ? Number(source.positionData.storedByteLength) : null,\n        dimension: Number.isFinite(source.positionData.dimension) ? Number(source.positionData.dimension) : 3,\n        nodeCount: Number.isFinite(source.positionData.nodeCount) ? Number(source.positionData.nodeCount) : null,\n        capturedAt: Number.isFinite(source.positionData.capturedAt) ? Number(source.positionData.capturedAt) : null,\n        runtimeState: source.positionData.runtimeState && typeof source.positionData.runtimeState === 'object'\n          ? cloneSerializable(source.positionData.runtimeState)\n          : null,\n      }\n      : null,\n    thumbnail: source.thumbnail && typeof source.thumbnail === 'object'\n      ? cloneSerializable(source.thumbnail)\n      : null,\n    visualizationState,\n  };\n}\n\n/**\n * Create a versioned persistence envelope.\n *\n * @public\n * @param {string} kind - One of `preferences`, `visualization`, or `session`.\n * @param {object} payload - Payload to normalize for the selected kind.\n * @param {object} [metadata] - Caller-owned metadata copied into the envelope.\n * @returns {object} Current-schema persistence envelope.\n * @remarks Envelopes are the boundary used by Helios persistence APIs and by\n * portable network visualization attachments. Unknown payload fields are\n * normalized rather than passed through blindly.\n */\nexport function createPersistenceEnvelope(kind, payload, metadata = {}) {\n  return {\n    schema: PERSISTENCE_SCHEMA,\n    version: PERSISTENCE_SCHEMA_VERSION,\n    kind,\n    metadata: metadata && typeof metadata === 'object' ? cloneSerializable(metadata) : {},\n    payload: kind === PERSISTENCE_KINDS.preferences\n      ? createDefaultPreferencesState(payload)\n      : kind === PERSISTENCE_KINDS.visualization\n        ? normalizeVisualizationPayload(payload)\n        : normalizeSessionPayload(payload),\n  };\n}\n\nfunction migratePreferencesPayloadV0(value) {\n  return createDefaultPreferencesState(value);\n}\n\nfunction migrateVisualizationPayloadV0(value) {\n  return normalizeVisualizationPayload(value);\n}\n\nfunction migrateSessionPayloadV0(value) {\n  return normalizeSessionPayload(value);\n}\n\n/**\n * Normalize a partial persistence object into the current envelope.\n *\n * @public\n * @param {object} input - Existing envelope or partial payload.\n * @param {string|null} [expectedKind] - Kind to enforce during migration.\n * @returns {object} Current-schema envelope.\n */\nexport function migratePersistenceEnvelope(input, expectedKind = null) {\n  const source = input && typeof input === 'object' ? input : {};\n  const kind = expectedKind ?? source.kind ?? PERSISTENCE_KINDS.visualization;\n\n  if (source.schema === PERSISTENCE_SCHEMA && Number(source.version) === PERSISTENCE_SCHEMA_VERSION) {\n    return createPersistenceEnvelope(kind, source.payload, source.metadata);\n  }\n\n  const version = Number.isFinite(source.version) ? Number(source.version) : 0;\n  const payload = source.schema === PERSISTENCE_SCHEMA ? source.payload : source;\n  if (kind === PERSISTENCE_KINDS.preferences) {\n    if (version <= 0) return createPersistenceEnvelope(kind, migratePreferencesPayloadV0(payload), source.metadata);\n  }\n  if (kind === PERSISTENCE_KINDS.visualization) {\n    if (version <= 0) return createPersistenceEnvelope(kind, migrateVisualizationPayloadV0(payload), source.metadata);\n  }\n  if (kind === PERSISTENCE_KINDS.session) {\n    if (version <= 0) return createPersistenceEnvelope(kind, migrateSessionPayloadV0(payload), source.metadata);\n  }\n\n  return createPersistenceEnvelope(kind, payload, source.metadata);\n}\n\n/**\n * Flatten visualization state into sparse dotted override paths.\n *\n * @public\n * @param {object} source - Visualization state to flatten.\n * @returns {object} Dotted-path override map.\n */\nexport function flattenVisualizationOverrides(source) {\n  const envelope = migratePersistenceEnvelope(source, PERSISTENCE_KINDS.visualization);\n  const payload = envelope.payload ?? {};\n  const output = {};\n  const behaviors = payload.behaviorState && typeof payload.behaviorState === 'object'\n    ? payload.behaviorState\n    : {};\n  for (const [id, snapshot] of Object.entries(behaviors)) {\n    if (CANONICAL_BEHAVIOR_OVERRIDE_IDS.has(id) && snapshot && typeof snapshot === 'object') {\n      output[`behaviors.${id}.state`] = cloneSerializable(snapshot);\n    }\n    const options = snapshot?.options && typeof snapshot.options === 'object'\n      ? snapshot.options\n      : {};\n    flattenObject(options, id, output);\n    if (id === 'filters' && snapshot?.filter && typeof snapshot.filter === 'object') {\n      flattenObject(snapshot.filter, 'filters', output);\n    }\n    if (id === 'selection') {\n      if (Object.prototype.hasOwnProperty.call(snapshot ?? {}, 'selectedNodes')) {\n        output['selection.selectedNodes'] = cloneSerializable(snapshot.selectedNodes);\n      }\n      if (Object.prototype.hasOwnProperty.call(snapshot ?? {}, 'selectedEdges')) {\n        output['selection.selectedEdges'] = cloneSerializable(snapshot.selectedEdges);\n      }\n      if (Object.prototype.hasOwnProperty.call(snapshot ?? {}, 'savedSelectionAttribute')) {\n        output['selection.savedSelectionAttribute'] = snapshot.savedSelectionAttribute;\n      }\n      if (Object.prototype.hasOwnProperty.call(snapshot ?? {}, 'lastNamedSelectionAttribute')) {\n        output['selection.lastNamedSelectionAttribute'] = snapshot.lastNamedSelectionAttribute;\n      }\n    }\n  }\n  if (payload.uiState) flattenObject(payload.uiState, 'ui', output);\n  if (payload.cameraState) {\n    flattenObject(payload.cameraState, 'camera', output);\n    if (payload.cameraState.mode === '2d' || payload.cameraState.mode === '3d') {\n      output['scene.dimension'] = payload.cameraState.mode;\n    }\n  }\n  if (payload.cameraControlState) flattenObject(payload.cameraControlState, 'cameraControls', output);\n  return pruneVolatileOverrides(output);\n}\n\n/**\n * Compute sparse override differences between two flattened override maps.\n *\n * @public\n * @param {object} [base] - Baseline dotted-path values.\n * @param {object} [current] - Current dotted-path values.\n * @returns {object} Dotted paths whose values differ from the baseline.\n */\nexport function diffOverrideMaps(base = {}, current = {}) {\n  const paths = new Set([...Object.keys(base), ...Object.keys(current)]);\n  const diff = {};\n  for (const path of paths) {\n    if (JSON.stringify(base[path]) === JSON.stringify(current[path])) continue;\n    if (Object.prototype.hasOwnProperty.call(current, path)) {\n      diff[path] = cloneSerializable(current[path]);\n    }\n  }\n  return diff;\n}\n\n/**\n * Apply sparse dotted-path overrides to a visualization state object.\n *\n * @public\n * @param {object} source - Base visualization state.\n * @param {object} [overrides] - Dotted-path override map.\n * @returns {object} Visualization state with overrides applied.\n */\nexport function applyOverridesToVisualizationState(source, overrides = {}) {\n  const envelope = migratePersistenceEnvelope(source, PERSISTENCE_KINDS.visualization);\n  const payload = cloneSerializable(envelope.payload ?? {});\n  const normalizedOverrides = normalizeOverrideMap(cloneSerializable(overrides ?? {}));\n  for (const [path, value] of Object.entries(normalizedOverrides)) {\n    if (isVolatileOverridePath(path)) continue;\n    const segments = String(path).split('.').filter(Boolean);\n    if (!segments.length) continue;\n    if (segments[0] === 'ui') {\n      if (!payload.uiState) payload.uiState = {};\n      setAtPath(payload.uiState, segments.slice(1), value);\n      continue;\n    }\n    if (segments[0] === 'scene' && segments[1] === 'dimension') {\n      const mode = value === '3d' ? '3d' : (value === '2d' ? '2d' : null);\n      if (mode) {\n        if (!payload.cameraState) payload.cameraState = {};\n        payload.cameraState.mode = mode;\n      }\n      continue;\n    }\n    if (segments[0] === 'camera') {\n      if (!payload.cameraState) payload.cameraState = {};\n      setAtPath(payload.cameraState, segments.slice(1), value);\n      continue;\n    }\n    if (segments[0] === 'cameraControls') {\n      if (!payload.cameraControlState) payload.cameraControlState = {};\n      setAtPath(payload.cameraControlState, segments.slice(1), value);\n      continue;\n    }\n    if (segments[0] === 'behaviors' && segments.length >= 3 && segments[2] === 'state') {\n      if (!payload.behaviorState) payload.behaviorState = {};\n      payload.behaviorState[segments[1]] = cloneSerializable(value);\n      continue;\n    }\n    const behaviorId = segments[0];\n    if (!payload.behaviorState) payload.behaviorState = {};\n    if (!payload.behaviorState[behaviorId]) payload.behaviorState[behaviorId] = { options: {} };\n    if (!payload.behaviorState[behaviorId].options) payload.behaviorState[behaviorId].options = {};\n    setAtPath(payload.behaviorState[behaviorId].options, segments.slice(1), value);\n  }\n  return createPersistenceEnvelope(PERSISTENCE_KINDS.visualization, payload, envelope.metadata);\n}\n\n/**\n * Serialize a persistence envelope to JSON.\n *\n * @public\n * @param {object} envelope - Envelope or partial payload to normalize first.\n * @param {boolean} [pretty=true] - Whether to emit indented JSON.\n * @returns {string} Stable JSON string.\n */\nexport function serializePersistenceEnvelope(envelope, pretty = true) {\n  return JSON.stringify(migratePersistenceEnvelope(envelope, envelope?.kind ?? null), null, pretty ? 2 : 0);\n}\n\n/**\n * Parse and migrate persistence input.\n *\n * @public\n * @param {string|object} source - JSON string, current envelope, or partial\n * payload object.\n * @param {string|null} [expectedKind] - Optional kind to validate/migrate to.\n * @returns {object} Current-schema envelope.\n */\nexport function parsePersistenceEnvelope(source, expectedKind = null) {\n  if (typeof source === 'string') {\n    return migratePersistenceEnvelope(JSON.parse(source), expectedKind);\n  }\n  return migratePersistenceEnvelope(source, expectedKind);\n}\n","function queueTask(callback) {\n  if (typeof queueMicrotask === 'function') {\n    queueMicrotask(callback);\n    return;\n  }\n  Promise.resolve().then(callback);\n}\n\n/**\n * Preference store backed by the browser `localStorage` API.\n *\n * @public\n * @param {object} [options] - Optional storage object, preference key, and\n * unfinished-session key.\n * @returns {LocalStoragePreferenceStore} Async preference store implementation.\n * @remarks Inject `storage` for tests or app shells that need isolated storage.\n */\nexport class LocalStoragePreferenceStore {\n  constructor(options = {}) {\n    this.storage = options.storage ?? globalThis.localStorage ?? null;\n    this.key = options.key ?? 'helios-web:persistence:preferences';\n    this.unfinishedSessionKey = options.unfinishedSessionKey ?? 'helios-web:persistence:unfinished-session';\n  }\n\n  unfinishedSessionKeyFor(workspaceId = null) {\n    if (workspaceId == null || workspaceId === '') return this.unfinishedSessionKey;\n    return `${this.unfinishedSessionKey}:${encodeURIComponent(String(workspaceId))}`;\n  }\n\n  async read() {\n    if (!this.storage) return null;\n    const raw = this.storage.getItem(this.key);\n    return raw ? JSON.parse(raw) : null;\n  }\n\n  async write(value) {\n    if (!this.storage) return null;\n    this.storage.setItem(this.key, JSON.stringify(value));\n    return value;\n  }\n\n  async clear() {\n    this.storage?.removeItem?.(this.key);\n  }\n\n  async getUnfinishedSessionId(workspaceId = null, options = {}) {\n    if (!this.storage) return null;\n    const key = this.unfinishedSessionKeyFor(workspaceId);\n    const value = this.storage.getItem(key);\n    if (value != null) return value;\n    if (options.includeLegacy === true && key !== this.unfinishedSessionKey) {\n      return this.storage.getItem(this.unfinishedSessionKey);\n    }\n    return null;\n  }\n\n  async setUnfinishedSessionId(id, workspaceId = null) {\n    if (!this.storage) return null;\n    const key = this.unfinishedSessionKeyFor(workspaceId);\n    if (id == null || id === '') this.storage.removeItem(key);\n    else this.storage.setItem(key, String(id));\n    return id ?? null;\n  }\n}\n\nfunction requestToPromise(request) {\n  return new Promise((resolve, reject) => {\n    request.onsuccess = () => resolve(request.result);\n    request.onerror = () => reject(request.error ?? new Error('IndexedDB request failed'));\n  });\n}\n\nfunction transactionToPromise(tx) {\n  if (tx?._complete === true) return Promise.resolve(true);\n  return new Promise((resolve, reject) => {\n    tx.oncomplete = () => resolve(true);\n    tx.onerror = () => reject(tx.error ?? new Error('IndexedDB transaction failed'));\n    tx.onabort = () => reject(tx.error ?? new Error('IndexedDB transaction aborted'));\n  });\n}\n\n/**\n * Session store backed by IndexedDB.\n *\n * @public\n * @param {object} [options] - Optional IndexedDB factory, database name, object\n * store name, and schema version.\n * @returns {IndexedDBSessionStore} Async session store implementation.\n * @throws {Error} When IndexedDB is unavailable and a read/write method opens\n * the database.\n */\nexport class IndexedDBSessionStore {\n  constructor(options = {}) {\n    this.indexedDB = options.indexedDB ?? globalThis.indexedDB ?? null;\n    this.dbName = options.dbName ?? 'helios-web';\n    this.storeName = options.storeName ?? 'sessions';\n    this.version = options.version ?? 1;\n    this._dbPromise = null;\n  }\n\n  async _open() {\n    if (!this.indexedDB) {\n      throw new Error('IndexedDB is not available in this environment');\n    }\n    if (this._dbPromise) return this._dbPromise;\n    this._dbPromise = new Promise((resolve, reject) => {\n      const request = this.indexedDB.open(this.dbName, this.version);\n      request.onupgradeneeded = () => {\n        const db = request.result;\n        if (!db.objectStoreNames.contains(this.storeName)) {\n          db.createObjectStore(this.storeName, { keyPath: 'id' });\n        }\n      };\n      request.onsuccess = () => resolve(request.result);\n      request.onerror = () => reject(request.error ?? new Error('Failed to open IndexedDB'));\n    });\n    return this._dbPromise;\n  }\n\n  async put(record) {\n    const db = await this._open();\n    const tx = db.transaction(this.storeName, 'readwrite');\n    const store = tx.objectStore(this.storeName);\n    const request = store.put(record);\n    await requestToPromise(request);\n    await transactionToPromise(tx);\n    return record;\n  }\n\n  async get(id) {\n    const db = await this._open();\n    const tx = db.transaction(this.storeName, 'readonly');\n    const store = tx.objectStore(this.storeName);\n    const result = await requestToPromise(store.get(id));\n    return result ?? null;\n  }\n\n  async getAll() {\n    const db = await this._open();\n    const tx = db.transaction(this.storeName, 'readonly');\n    const store = tx.objectStore(this.storeName);\n    if (typeof store.getAll === 'function') {\n      const result = await requestToPromise(store.getAll());\n      return Array.isArray(result) ? result : [];\n    }\n    return new Promise((resolve, reject) => {\n      const values = [];\n      const request = store.openCursor();\n      request.onsuccess = () => {\n        const cursor = request.result;\n        if (!cursor) {\n          resolve(values);\n          return;\n        }\n        values.push(cursor.value);\n        cursor.continue();\n      };\n      request.onerror = () => reject(request.error ?? new Error('Failed to list sessions'));\n    });\n  }\n\n  async delete(id) {\n    const db = await this._open();\n    const tx = db.transaction(this.storeName, 'readwrite');\n    const store = tx.objectStore(this.storeName);\n    await requestToPromise(store.delete(id));\n    await transactionToPromise(tx);\n    return true;\n  }\n}\n\n/**\n * Create an in-memory Storage-compatible object.\n *\n * @public\n * @returns {Storage} Minimal Storage implementation for tests and non-browser\n * examples.\n */\nexport function createMemoryStorage() {\n  const values = new Map();\n  return {\n    getItem(key) {\n      return values.has(key) ? values.get(key) : null;\n    },\n    setItem(key, value) {\n      values.set(key, String(value));\n    },\n    removeItem(key) {\n      values.delete(key);\n    },\n    clear() {\n      values.clear();\n    },\n  };\n}\n\n/**\n * Create an in-memory IndexedDB-like factory for persistence tests.\n *\n * @public\n * @returns {IDBFactory} Minimal IndexedDB factory compatible with\n * `IndexedDBSessionStore`.\n */\nexport function createMemoryIndexedDBFactory() {\n  class MemoryRequest {\n    constructor() {\n      this.result = undefined;\n      this.error = null;\n      this.onsuccess = null;\n      this.onerror = null;\n      this.onupgradeneeded = null;\n    }\n\n    succeed(result, type = 'success') {\n      this.result = result;\n      queueTask(() => {\n        const handler = type === 'upgradeneeded' ? this.onupgradeneeded : this.onsuccess;\n        handler?.({ target: this });\n      });\n    }\n\n    fail(error) {\n      this.error = error;\n      queueTask(() => this.onerror?.({ target: this }));\n    }\n  }\n\n  class MemoryCursor {\n    constructor(items, request) {\n      this._items = items;\n      this._request = request;\n      this._index = 0;\n      this.value = items[0] ?? null;\n    }\n\n    continue() {\n      this._index += 1;\n      const next = this._items[this._index] ?? null;\n      queueTask(() => {\n        this._request.result = next ? new MemoryCursor(this._items.slice(this._index), this._request) : null;\n        this._request.onsuccess?.({ target: this._request });\n      });\n    }\n  }\n\n  class MemoryObjectStore {\n    constructor(records, keyPath) {\n      this.records = records;\n      this.keyPath = keyPath;\n    }\n\n    put(value) {\n      const request = new MemoryRequest();\n      queueTask(() => {\n        const key = value?.[this.keyPath];\n        this.records.set(key, structuredClone(value));\n        request.result = key;\n        request.onsuccess?.({ target: request });\n      });\n      return request;\n    }\n\n    get(id) {\n      const request = new MemoryRequest();\n      queueTask(() => {\n        request.result = this.records.has(id) ? structuredClone(this.records.get(id)) : undefined;\n        request.onsuccess?.({ target: request });\n      });\n      return request;\n    }\n\n    getAll() {\n      const request = new MemoryRequest();\n      queueTask(() => {\n        request.result = Array.from(this.records.values(), (value) => structuredClone(value));\n        request.onsuccess?.({ target: request });\n      });\n      return request;\n    }\n\n    delete(id) {\n      const request = new MemoryRequest();\n      queueTask(() => {\n        this.records.delete(id);\n        request.result = undefined;\n        request.onsuccess?.({ target: request });\n      });\n      return request;\n    }\n\n    openCursor() {\n      const request = new MemoryRequest();\n      const items = Array.from(this.records.values(), (value) => structuredClone(value));\n      queueTask(() => {\n        request.result = items.length ? new MemoryCursor(items, request) : null;\n        request.onsuccess?.({ target: request });\n      });\n      return request;\n    }\n  }\n\n  class MemoryTransaction {\n    constructor(store) {\n      this._store = store;\n      this.error = null;\n      this.oncomplete = null;\n      this.onerror = null;\n      this.onabort = null;\n      this._complete = false;\n      queueTask(() => {\n        this._complete = true;\n        this.oncomplete?.({ target: this });\n      });\n    }\n\n    objectStore() {\n      return this._store;\n    }\n  }\n\n  class MemoryDatabase {\n    constructor(name, version) {\n      this.name = name;\n      this.version = version;\n      this._stores = new Map();\n      this.objectStoreNames = {\n        contains: (name) => this._stores.has(name),\n      };\n    }\n\n    createObjectStore(name, options = {}) {\n      const store = new MemoryObjectStore(new Map(), options.keyPath ?? 'id');\n      this._stores.set(name, store);\n      return store;\n    }\n\n    transaction(name) {\n      const store = this._stores.get(name);\n      if (!store) throw new Error(`Unknown object store \"${name}\"`);\n      return new MemoryTransaction(store);\n    }\n  }\n\n  const databases = new Map();\n  return {\n    open(name, version = 1) {\n      const request = new MemoryRequest();\n      queueTask(() => {\n        let db = databases.get(name) ?? null;\n        const needsUpgrade = !db || version > db.version;\n        if (!db) {\n          db = new MemoryDatabase(name, version);\n          databases.set(name, db);\n        } else if (version > db.version) {\n          db.version = version;\n        }\n        request.result = db;\n        if (needsUpgrade) {\n          request.onupgradeneeded?.({ target: request });\n        }\n        request.onsuccess?.({ target: request });\n      });\n      return request;\n    },\n  };\n}\n","function createDetailEvent(type, detail) {\n  if (typeof CustomEvent === 'function') return new CustomEvent(type, { detail });\n  if (typeof Event === 'function') {\n    const event = new Event(type);\n    event.detail = detail;\n    return event;\n  }\n  return { type, detail };\n}\n\nexport function cloneStateValue(value) {\n  if (value == null || typeof value !== 'object') return value;\n  if (typeof structuredClone === 'function') {\n    try {\n      return structuredClone(value);\n    } catch (_) {\n      // Fall through to JSON clone for plain serializable values.\n    }\n  }\n  return JSON.parse(JSON.stringify(value));\n}\n\nexport function valuesEqual(a, b) {\n  return valuesEqualInternal(a, b, new WeakMap());\n}\n\nfunction isPlainSerializableObject(value) {\n  if (!value || typeof value !== 'object') return false;\n  const proto = Object.getPrototypeOf(value);\n  return proto === Object.prototype || proto === null;\n}\n\nfunction typedArrayValuesEqual(a, b) {\n  if (!ArrayBuffer.isView(a) || !ArrayBuffer.isView(b)) return false;\n  if (a.constructor !== b.constructor || a.byteLength !== b.byteLength) return false;\n  if (a instanceof DataView || b instanceof DataView) {\n    const bytesA = new Uint8Array(a.buffer, a.byteOffset, a.byteLength);\n    const bytesB = new Uint8Array(b.buffer, b.byteOffset, b.byteLength);\n    for (let i = 0; i < bytesA.length; i += 1) {\n      if (bytesA[i] !== bytesB[i]) return false;\n    }\n    return true;\n  }\n  if (a.length !== b.length) return false;\n  for (let i = 0; i < a.length; i += 1) {\n    if (!Object.is(a[i], b[i])) return false;\n  }\n  return true;\n}\n\nfunction valuesEqualInternal(a, b, seen) {\n  if (Object.is(a, b)) return true;\n  if (a == null || b == null) return false;\n  if (typeof a !== typeof b) return false;\n  if (typeof a !== 'object') return false;\n  if (ArrayBuffer.isView(a) || ArrayBuffer.isView(b)) return typedArrayValuesEqual(a, b);\n\n  const seenForA = seen.get(a);\n  if (seenForA?.has(b)) return true;\n  if (seenForA) seenForA.add(b);\n  else seen.set(a, new WeakSet([b]));\n\n  if (Array.isArray(a) || Array.isArray(b)) {\n    if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n    for (let i = 0; i < a.length; i += 1) {\n      if (!valuesEqualInternal(a[i], b[i], seen)) return false;\n    }\n    return true;\n  }\n\n  if (!isPlainSerializableObject(a) || !isPlainSerializableObject(b)) return false;\n  const keysA = Object.keys(a);\n  const keysB = Object.keys(b);\n  if (keysA.length !== keysB.length) return false;\n  for (const key of keysA) {\n    if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\n    if (!valuesEqualInternal(a[key], b[key], seen)) return false;\n  }\n  return true;\n}\n\nexport function normalizeStateKey(key) {\n  return String(key ?? '').trim().replace(/^\\.+|\\.+$/g, '');\n}\n\nexport function joinStateKey(prefix, key) {\n  const left = normalizeStateKey(prefix);\n  const right = normalizeStateKey(key);\n  if (!left) return right;\n  if (!right) return left;\n  if (right === left || right.startsWith(`${left}.`)) return right;\n  return `${left}.${right}`;\n}\n\nfunction normalizeScope(scope) {\n  const value = String(scope ?? '').trim();\n  return ['user', 'workspace', 'network', 'session'].includes(value) ? value : 'session';\n}\n\nfunction normalizeType(type) {\n  const value = String(type ?? '').trim();\n  return ['number', 'boolean', 'string', 'enum', 'object', 'array'].includes(value) ? value : 'object';\n}\n\nexport function isExplicitStateOverrideSource(source) {\n  const value = String(source ?? '').trim();\n  return value === 'ui' || value === 'program' || value === 'cli' || value === 'state';\n}\n\nexport function normalizeStateChangeOrigin(detail = {}) {\n  const source = String(detail.source ?? '').trim() || 'state';\n  const origin = String(detail.origin ?? source).trim() || source;\n  const reason = String(detail.reason ?? '').trim() || 'set';\n  const defaultLike = source === 'default'\n    || source === 'restore'\n    || source === 'binding'\n    || source === 'refresh'\n    || reason.includes('default')\n    || reason.includes('restore');\n  const explicit = detail.intentional === true\n    || detail.userInitiated === true\n    || isExplicitStateOverrideSource(source)\n    || isExplicitStateOverrideSource(origin);\n  return {\n    source,\n    origin,\n    reason,\n    defaultLike,\n    explicit,\n  };\n}\n\nfunction keyMatchesSubscription(key, target, requestedKey, keyAliases = new Map()) {\n  if (!target) return true;\n  if (key === target || key.startsWith(`${target}.`)) return true;\n  const requested = normalizeStateKey(requestedKey);\n  if (!requested) return false;\n  if (key === requested || key.startsWith(`${requested}.`)) return true;\n  if (key === `behaviors.${requested}` || key.startsWith(`behaviors.${requested}.`)) return true;\n  if (requested === 'camera' && (key === 'cameraControls' || key.startsWith('cameraControls.'))) return true;\n  for (const alias of keyAliases.get(key) ?? []) {\n    if (alias === requested || alias.startsWith(`${requested}.`) || requested.startsWith(`${alias}.`)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction assertStateEntryHasNoPlacement(key, entry) {\n  const ui = entry?.ui && typeof entry.ui === 'object' ? entry.ui : {};\n  if (\n    Object.prototype.hasOwnProperty.call(entry ?? {}, 'panel')\n    || Object.prototype.hasOwnProperty.call(entry ?? {}, 'section')\n    || Object.prototype.hasOwnProperty.call(ui, 'panel')\n    || Object.prototype.hasOwnProperty.call(ui, 'section')\n  ) {\n    throw new Error(`State entry \"${key}\" must not define panel or section placement; use a UI panel schema instead.`);\n  }\n}\n\nfunction normalizeStateEntry(key, entry = {}, owner = null, localName = '') {\n  assertStateEntryHasNoPlacement(key, entry);\n  const hasDefault = Object.prototype.hasOwnProperty.call(entry, 'default');\n  const hasDefaultValue = Object.prototype.hasOwnProperty.call(entry, 'defaultValue');\n  const defaultValue = hasDefault ? entry.default : (hasDefaultValue ? entry.defaultValue : null);\n  const aliases = Array.isArray(entry.aliases)\n    ? entry.aliases.map((alias) => normalizeStateKey(alias)).filter(Boolean)\n    : [];\n  const methodName = normalizeStateKey(entry.method ?? localName).split('.').pop();\n  const inferredGetterSetter = owner && methodName && typeof owner[methodName] === 'function'\n    ? owner[methodName].bind(owner)\n    : null;\n  return {\n    key,\n    aliases,\n    description: typeof entry.description === 'string' ? entry.description : '',\n    default: cloneStateValue(defaultValue),\n    type: normalizeType(entry.type),\n    scope: normalizeScope(entry.scope),\n    persist: entry.persist !== false,\n    ui: entry.ui && typeof entry.ui === 'object' ? { ...entry.ui } : {},\n    getter: typeof entry.getter === 'function'\n      ? entry.getter\n      : (typeof entry.get === 'function' ? entry.get : (inferredGetterSetter ? () => inferredGetterSetter() : null)),\n    setter: typeof entry.setter === 'function'\n      ? entry.setter\n      : (typeof entry.set === 'function' ? entry.set : (inferredGetterSetter ? (value, options) => inferredGetterSetter(value, options) : null)),\n    subscribe: typeof entry.subscribe === 'function' ? entry.subscribe : null,\n    binder: typeof entry.binder === 'function' ? entry.binder : null,\n    bindProperty: entry.bindProperty === true,\n    property: typeof entry.property === 'string' ? entry.property : methodName,\n    serialize: typeof entry.serialize === 'function' ? entry.serialize : null,\n    deserialize: typeof entry.deserialize === 'function' ? entry.deserialize : null,\n    equals: typeof entry.equals === 'function' ? entry.equals : valuesEqual,\n  };\n}\n\nexport function detailTargetsStateKey(detail = {}, target = '', manager = null) {\n  const keys = [];\n  if (typeof detail.storageKey === 'string') keys.push(detail.storageKey);\n  if (typeof detail.stateKey === 'string') keys.push(detail.stateKey);\n  if (Array.isArray(detail.storageKeys)) {\n    for (const key of detail.storageKeys) {\n      if (typeof key === 'string') keys.push(key);\n    }\n  }\n  if (Array.isArray(detail.stateKeys)) {\n    for (const key of detail.stateKeys) {\n      if (typeof key === 'string') keys.push(key);\n    }\n  }\n  if (!keys.length) return false;\n  return keys.some((key) => manager?.resolveKey?.(key) === target);\n}\n\nfunction detailHasStateKeys(detail = {}) {\n  return typeof detail.storageKey === 'string'\n    || typeof detail.stateKey === 'string'\n    || (Array.isArray(detail.storageKeys) && detail.storageKeys.some((key) => typeof key === 'string'))\n    || (Array.isArray(detail.stateKeys) && detail.stateKeys.some((key) => typeof key === 'string'));\n}\n\n/**\n * Central live state graph for Helios defaults, bindings, overrides, and reset status.\n *\n * @public\n * @apiSection Persistence\n */\nexport class HeliosStateManager extends EventTarget {\n  constructor(options = {}) {\n    super();\n    this.entries = new Map();\n    this.values = new Map();\n    this.overrides = new Map();\n    this.aliases = new Map();\n    this.keyAliases = new Map();\n    this.owners = new Map();\n    this.parentKeys = new Set();\n    this.overrideDescendantCounts = new Map();\n    this.now = options.now ?? (() => Date.now());\n    this.nextSeq = 1;\n    this.journal = [];\n    this.recentChanges = [];\n    this.subscriptions = new Set();\n    this.subscriptionsByTarget = new Map();\n    this.bindings = new StateBindingController(this);\n    this._transaction = null;\n    this.overrideTrackingReady = options.overrideTrackingReady !== false;\n  }\n\n  setOverrideTrackingReady(ready = true) {\n    this.overrideTrackingReady = ready !== false;\n    return this.overrideTrackingReady;\n  }\n\n  register(owner, prefix, entries = {}) {\n    let actualOwner = owner;\n    let actualPrefix = prefix;\n    let actualEntries = entries;\n    if (entries == null || typeof entries !== 'object') {\n      actualEntries = prefix;\n      actualPrefix = owner;\n      actualOwner = null;\n    }\n    const cleanups = [];\n    for (const [name, descriptor] of Object.entries(actualEntries ?? {})) {\n      const key = joinStateKey(actualPrefix, name);\n      if (!key) continue;\n      const previousEntry = this.entries.get(key) ?? null;\n      const previousValue = this.values.has(key) ? this.values.get(key) : undefined;\n      const entry = normalizeStateEntry(key, descriptor, actualOwner, name);\n      this.entries.set(key, entry);\n      this._trackKnownStateKey(key);\n      for (const alias of entry.aliases) {\n        if (alias === key) continue;\n        this.aliases.set(alias, key);\n        const keyAliases = this.keyAliases.get(key) ?? new Set();\n        keyAliases.add(alias);\n        this.keyAliases.set(key, keyAliases);\n        if (this.values.has(alias)) {\n          this.values.set(key, cloneStateValue(this.values.get(alias)));\n          this.values.delete(alias);\n        }\n        if (this.overrides.has(alias)) {\n          this.overrides.set(key, cloneStateValue(this.overrides.get(alias)));\n          this.overrides.delete(alias);\n          this._rebuildOverrideDescendantCounts();\n        }\n      }\n      if (actualOwner) {\n        const ownerKeys = this.owners.get(actualOwner) ?? new Set();\n        ownerKeys.add(key);\n        this.owners.set(actualOwner, ownerKeys);\n      }\n      const initial = entry.getter ? entry.getter() : entry.default;\n      const initialValue = cloneStateValue(initial == null ? entry.default : initial);\n      if (!this.values.has(key)) {\n        this.values.set(key, initialValue);\n      } else if (\n        !this.overrides.has(key)\n        && previousEntry\n        && (previousValue == null || previousEntry.equals(previousValue, previousEntry.default))\n      ) {\n        this.values.set(key, initialValue);\n      }\n      const bindingCleanup = this.bindings.bind(key, entry, actualOwner);\n      if (this.overrides.has(key)) {\n        const overrideValue = cloneStateValue(this.overrides.get(key));\n        const restoredValue = entry.deserialize ? entry.deserialize(overrideValue, {\n          source: 'restore',\n          reason: 'register-existing-override',\n        }) : overrideValue;\n        this.values.set(key, cloneStateValue(restoredValue));\n        this.bindings.apply(key, restoredValue, {\n          source: 'restore',\n          reason: 'register-existing-override',\n          applyBinding: true,\n          trackOverride: false,\n        });\n      }\n      cleanups.push(() => {\n        bindingCleanup?.();\n        for (const alias of this.keyAliases.get(key) ?? []) {\n          this.aliases.delete(alias);\n        }\n        this.keyAliases.delete(key);\n        this.entries.delete(key);\n        this.values.delete(key);\n        this._deleteOverride(key);\n      });\n    }\n    return () => {\n      for (const cleanup of cleanups) cleanup();\n      if (actualOwner) this.owners.delete(actualOwner);\n      this._emit('change', { reason: 'unregister', owner: actualOwner ?? null });\n    };\n  }\n\n  entry(key) {\n    const target = this.resolveKey(key);\n    const entry = this.entries.get(target);\n    return entry ? { ...entry, ui: { ...(entry.ui ?? {}) } } : null;\n  }\n\n  entriesFor(prefix = '') {\n    const target = this.resolveKey(prefix);\n    return Array.from(this.entries.entries())\n      .filter(([key]) => !target || key === target || key.startsWith(`${target}.`))\n      .map(([key, entry]) => [key, { ...entry, ui: { ...(entry.ui ?? {}) } }]);\n  }\n\n  get(key, fallback = undefined) {\n    const target = this.resolveKey(key);\n    if (this.values.has(target)) return this.values.get(target);\n    const entry = this.entries.get(target);\n    if (entry) return entry.default;\n    return fallback;\n  }\n\n  set(key, value, options = {}) {\n    return this._setOne(key, value, options);\n  }\n\n  setDefault(key, value, options = {}) {\n    const requestedKey = normalizeStateKey(key);\n    const target = this.resolveKey(requestedKey);\n    if (!target) return null;\n    const previous = this.entries.get(target) ?? normalizeStateEntry(target, {});\n    const entry = { ...previous, default: cloneStateValue(value) };\n    this.entries.set(target, entry);\n    if (!this.overrides.has(target)) {\n      this.values.set(target, cloneStateValue(value));\n      this.bindings.apply(target, value, {\n        source: options.source ?? 'default',\n        reason: options.reason ?? 'set-default',\n        applyBinding: true,\n      });\n    }\n    const detail = {\n      key: target,\n      path: target,\n      requestedKey,\n      value: this.get(target),\n      default: cloneStateValue(value),\n      source: options.source ?? 'default',\n      reason: options.reason ?? 'set-default',\n      trackOverride: false,\n      overrideChanged: false,\n      status: this.status(target),\n    };\n    this._emit('change', detail);\n    return detail;\n  }\n\n  reset(keyOrPrefix, options = {}) {\n    const target = this.resolveKey(keyOrPrefix);\n    if (!target) return { reset: false, entries: [] };\n    const keys = this._matchingKeys(target);\n    const entries = [];\n    for (const key of keys) {\n      const entry = this.entries.get(key);\n      if (!entry) continue;\n      const result = this._setOne(key, cloneStateValue(entry.default), {\n        ...options,\n        source: options.source ?? 'reset',\n        reason: options.reason ?? 'reset',\n        trackOverride: false,\n        clearOverride: true,\n      });\n      if (result?.event) entries.push(result.event);\n    }\n    return { reset: entries.length > 0, entries };\n  }\n\n  resetToDefault(keyOrPrefix, options = {}) {\n    return this.reset(keyOrPrefix, options);\n  }\n\n  status(keyOrPrefix) {\n    const requestedKey = normalizeStateKey(keyOrPrefix);\n    const target = this.resolveKey(requestedKey);\n    const entry = this.entries.get(target) ?? null;\n    const hasOverride = this.overrides.has(target);\n    if (entry || this.values.has(target)) {\n      const changedChildren = this.overrideDescendantCounts.get(target) ?? 0;\n      return {\n        key: requestedKey || target,\n        canonicalKey: target,\n        state: hasOverride ? 'changed' : (changedChildren > 0 ? 'partial' : 'default'),\n        hasOverride: hasOverride || changedChildren > 0,\n        value: this.get(target),\n        default: entry?.default ?? null,\n        defaultValue: entry?.default ?? null,\n      };\n    }\n    const exactOverride = this.overrides.has(target);\n    const changed = (this.overrideDescendantCounts.get(target) ?? 0) + (exactOverride ? 1 : 0);\n    return {\n      key: target,\n      canonicalKey: target,\n      state: exactOverride ? 'changed' : (changed > 0 ? 'partial' : 'default'),\n      hasOverride: changed > 0,\n      value: undefined,\n      default: undefined,\n      defaultValue: undefined,\n    };\n  }\n\n  dirtyState() {\n    const controls = {};\n    const sections = {};\n    const panels = {};\n    for (const key of this.overrides.keys()) {\n      controls[key] = 'changed';\n      for (const alias of this.keyAliases.get(key) ?? []) {\n        controls[alias] = 'changed';\n      }\n      const parts = key.split('.');\n      if (parts[0]) panels[parts[0]] = panels[parts[0]] === 'changed' ? 'changed' : 'partial';\n      if (parts[0] && parts[1]) sections[`${parts[0]}.${parts[1]}`] = 'partial';\n    }\n    return { controls, sections, panels };\n  }\n\n  subscribe(keyOrPrefix, callback, options = {}) {\n    const requestedKey = normalizeStateKey(keyOrPrefix);\n    const target = this.resolveKey(requestedKey);\n    if (typeof callback !== 'function') return () => {};\n    const subscription = { requestedKey, target, callback };\n    this.subscriptions.add(subscription);\n    const targetSubscriptions = this.subscriptionsByTarget.get(target) ?? new Set();\n    targetSubscriptions.add(subscription);\n    this.subscriptionsByTarget.set(target, targetSubscriptions);\n    if (options.immediate === true && target) callback(this.get(target), { key: requestedKey || target, canonicalKey: target, reason: 'subscribe' });\n    return () => {\n      this.subscriptions.delete(subscription);\n      const subscriptions = this.subscriptionsByTarget.get(target);\n      subscriptions?.delete(subscription);\n      if (subscriptions && subscriptions.size <= 0) this.subscriptionsByTarget.delete(target);\n    };\n  }\n\n  transaction(options = {}, callback = null) {\n    if (typeof options === 'function') {\n      callback = options;\n      options = {};\n    }\n    if (typeof callback !== 'function') return null;\n    if (this._transaction) {\n      const tx = new StateTransaction(this, this._transaction.options);\n      callback(tx);\n      return tx.result();\n    }\n    const previous = this._transaction;\n    const transaction = { options, events: [] };\n    this._transaction = transaction;\n    try {\n      const tx = new StateTransaction(this, options);\n      callback(tx);\n      const events = transaction.events.slice();\n      if (events.length) {\n        this._emit('transaction', {\n          source: options.source ?? 'state',\n          reason: options.reason ?? 'transaction',\n          events: events.map((event) => cloneStateValue(event)),\n          keys: Array.from(new Set(events.map((event) => event.key))),\n        });\n      }\n      return tx.result();\n    } finally {\n      this._transaction = previous;\n    }\n  }\n\n  restore(snapshot = {}, options = {}) {\n    const source = snapshot?.overrides && typeof snapshot.overrides === 'object'\n      ? snapshot.overrides\n      : snapshot;\n    const restored = [];\n    this.transaction({\n      source: options.source ?? 'restore',\n      reason: options.reason ?? 'restore',\n    }, (tx) => {\n      for (const [key, value] of Object.entries(source ?? {})) {\n        const result = tx.set(key, value, {\n          source: options.source ?? 'restore',\n          reason: options.reason ?? 'restore',\n          trackOverride: options.trackOverride,\n          applyBinding: options.applyBinding,\n        });\n        if (result?.key) restored.push(result.key);\n      }\n    });\n    return restored;\n  }\n\n  snapshot(options = {}) {\n    const snapshot = {\n      schema: 'helios-web.state',\n      version: 1,\n      overrides: this.getOverrides(options),\n    };\n    if (options.includeValues === true) {\n      snapshot.values = Object.fromEntries(Array.from(this.values.entries(), ([key, value]) => [key, cloneStateValue(value)]));\n    }\n    if (options.includeJournal === true) {\n      snapshot.journal = this.journal.map((entry) => cloneStateValue(entry));\n    }\n    return snapshot;\n  }\n\n  serialize() {\n    return {\n      values: Object.fromEntries(Array.from(this.values.entries(), ([key, value]) => [key, cloneStateValue(value)])),\n      overrides: Object.fromEntries(Array.from(this.overrides.entries(), ([key, value]) => [key, cloneStateValue(value)])),\n      journal: this.journal.map((entry) => cloneStateValue(entry)),\n    };\n  }\n\n  preferredKey(key) {\n    const target = this.resolveKey(key);\n    const aliases = this.keyAliases.get(target);\n    return aliases?.values?.().next?.().value ?? target;\n  }\n\n  overrideKeys() {\n    return Array.from(this.overrides.keys());\n  }\n\n  getOverrides(options = {}) {\n    const aliases = options.aliases ?? 'preferred';\n    const output = {};\n    for (const [key, value] of this.overrides.entries()) {\n      const clonedValue = cloneStateValue(value);\n      const aliasList = Array.from(this.keyAliases.get(key) ?? []);\n      if (aliases === 'all') {\n        output[key] = clonedValue;\n        for (const alias of aliasList) output[alias] = cloneStateValue(value);\n      } else if (aliases === true || aliases === 'preferred') {\n        output[aliasList[0] ?? key] = clonedValue;\n      } else {\n        output[key] = clonedValue;\n      }\n    }\n    return output;\n  }\n\n  resolveKey(key) {\n    const target = normalizeStateKey(key);\n    if (!target) return '';\n    if (this.aliases.has(target)) return this.aliases.get(target);\n    let bestAlias = '';\n    let bestKey = target;\n    for (const [alias, canonical] of this.aliases.entries()) {\n      if (!target.startsWith(`${alias}.`)) continue;\n      if (alias.length <= bestAlias.length) continue;\n      bestAlias = alias;\n      bestKey = `${canonical}${target.slice(alias.length)}`;\n    }\n    return bestKey;\n  }\n\n  _setOne(key, value, options = {}) {\n    const requestedKey = normalizeStateKey(key);\n    const target = this.resolveKey(requestedKey);\n    if (!target) return null;\n    const entry = this.entries.get(target) ?? normalizeStateEntry(target, {});\n    if (!this.entries.has(target)) {\n      this.entries.set(target, entry);\n      this._trackKnownStateKey(target);\n    }\n    const nextValue = entry.deserialize ? entry.deserialize(value, options) : value;\n    const oldValue = this.values.has(target) ? this.values.get(target) : entry.default;\n    const trackOverride = entry.persist !== false && this._shouldTrackOverride(options);\n    const origin = normalizeStateChangeOrigin(options);\n    const hadOverride = this.overrides.has(target);\n    const valueChanged = !entry.equals(oldValue, nextValue);\n    let serializedOverride;\n    let overrideChanged = false;\n    if (trackOverride) {\n      serializedOverride = entry.serialize ? entry.serialize(nextValue, options) : nextValue;\n      overrideChanged = !hadOverride || !entry.equals(this.overrides.get(target), serializedOverride);\n    } else {\n      overrideChanged = options.clearOverride === true && hadOverride;\n    }\n    if (!valueChanged && !overrideChanged) {\n      return { changed: false, key: target, value: nextValue, state: this.status(target).state };\n    }\n    this.values.set(target, nextValue);\n    if (trackOverride) {\n      this._setOverride(target, serializedOverride);\n    } else if (options.clearOverride === true) {\n      this._deleteOverride(target);\n    }\n    const event = {\n      seq: this.nextSeq,\n      timestamp: this.now(),\n      key: target,\n      path: target,\n      requestedKey,\n      oldValue,\n      newValue: nextValue,\n      value: nextValue,\n      source: options.source ?? 'state',\n      origin: options.origin ?? origin.origin,\n      reason: options.reason ?? 'set',\n      defaultLike: origin.defaultLike,\n      explicit: origin.explicit,\n      applyBinding: options.applyBinding !== false,\n      trackOverride,\n      overrideChanged,\n      overrideDelta: overrideChanged\n        ? {\n            key: target,\n            value: trackOverride ? serializedOverride : undefined,\n            deleted: !trackOverride && options.clearOverride === true,\n          }\n        : null,\n      autosave: options.autosave,\n      debounceMs: options.debounceMs ?? options.persistenceDebounceMs,\n      status: null,\n    };\n    event.status = this.status(target);\n    this.nextSeq += 1;\n    if (options.journal !== false) this._recordJournal(event);\n    this._recordRecentChange(event);\n    if (event.applyBinding !== false) this.bindings.apply(target, nextValue, event);\n    this._emit('change', event);\n    if (this._transaction) this._transaction.events.push(event);\n    return { changed: true, key: target, value: nextValue, state: event.status.state, event };\n  }\n\n  _matchingKeys(prefix) {\n    const requested = normalizeStateKey(prefix);\n    const target = this.resolveKey(requested);\n    const keys = new Set([...this.entries.keys(), ...this.values.keys(), ...this.overrides.keys()]);\n    for (const [alias, key] of this.aliases.entries()) {\n      if (alias === requested || alias.startsWith(`${requested}.`)) keys.add(key);\n    }\n    return Array.from(keys).filter((key) => key === target || key.startsWith(`${target}.`) || this._keyMatchesAliasPrefix(key, requested));\n  }\n\n  _trackKnownStateKey(key) {\n    const parts = normalizeStateKey(key).split('.').filter(Boolean);\n    for (let i = 1; i < parts.length; i += 1) {\n      this.parentKeys.add(parts.slice(0, i).join('.'));\n    }\n  }\n\n  _ancestorsForKey(key) {\n    const parts = normalizeStateKey(key).split('.').filter(Boolean);\n    const ancestors = [];\n    for (let i = 1; i < parts.length; i += 1) {\n      ancestors.push(parts.slice(0, i).join('.'));\n    }\n    return ancestors;\n  }\n\n  _setOverride(key, value) {\n    const target = normalizeStateKey(key);\n    const hadOverride = this.overrides.has(target);\n    this.overrides.set(target, value);\n    if (hadOverride) return;\n    for (const ancestor of this._overrideCountAncestors(target)) {\n      this.overrideDescendantCounts.set(ancestor, (this.overrideDescendantCounts.get(ancestor) ?? 0) + 1);\n    }\n  }\n\n  _deleteOverride(key) {\n    const target = normalizeStateKey(key);\n    if (!this.overrides.delete(target)) return;\n    for (const ancestor of this._overrideCountAncestors(target)) {\n      const next = (this.overrideDescendantCounts.get(ancestor) ?? 0) - 1;\n      if (next > 0) this.overrideDescendantCounts.set(ancestor, next);\n      else this.overrideDescendantCounts.delete(ancestor);\n    }\n  }\n\n  _rebuildOverrideDescendantCounts() {\n    this.overrideDescendantCounts.clear();\n    for (const key of this.overrides.keys()) {\n      for (const ancestor of this._overrideCountAncestors(key)) {\n        this.overrideDescendantCounts.set(ancestor, (this.overrideDescendantCounts.get(ancestor) ?? 0) + 1);\n      }\n    }\n  }\n\n  _overrideCountAncestors(key) {\n    const ancestors = new Set(this._ancestorsForKey(key));\n    if (key === 'cameraControls' || key.startsWith('cameraControls.')) {\n      ancestors.add('camera');\n      const suffix = key.slice('cameraControls'.length).replace(/^\\./u, '');\n      if (suffix) {\n        for (const ancestor of this._ancestorsForKey(`camera.controls.${suffix}`)) ancestors.add(ancestor);\n      }\n    }\n    for (const alias of this.keyAliases.get(key) ?? []) {\n      for (const ancestor of this._ancestorsForKey(alias)) ancestors.add(ancestor);\n    }\n    return ancestors;\n  }\n\n  _recordJournal(event) {\n    this.journal.push(event);\n    const max = 1000;\n    if (this.journal.length > max) this.journal.splice(0, this.journal.length - max);\n  }\n\n  _recordRecentChange(event) {\n    this.recentChanges.push({\n      timestamp: event.timestamp,\n      key: event.key,\n      source: event.source,\n      origin: event.origin,\n      reason: event.reason,\n      trackOverride: event.trackOverride,\n      overrideChanged: event.overrideChanged,\n      defaultLike: event.defaultLike,\n    });\n    const cutoff = this.now() - (10 * 60 * 1000);\n    while (this.recentChanges.length > 0 && this.recentChanges[0].timestamp < cutoff) {\n      this.recentChanges.shift();\n    }\n    const max = 2000;\n    if (this.recentChanges.length > max) this.recentChanges.splice(0, this.recentChanges.length - max);\n  }\n\n  debugStats(options = {}) {\n    const windowMs = Number.isFinite(options.windowMs) ? Math.max(0, Number(options.windowMs)) : 5 * 60 * 1000;\n    const cutoff = this.now() - windowMs;\n    const includeRecent = options.includeRecent !== false;\n    const includeKeys = options.includeKeys !== false;\n    let stateChangeCount = 0;\n    let uiChangeCount = 0;\n    const recent = includeRecent ? [] : null;\n    for (const entry of this.recentChanges) {\n      if (entry.timestamp < cutoff) continue;\n      stateChangeCount += 1;\n      if (entry.source === 'ui' || entry.origin === 'ui') uiChangeCount += 1;\n      if (recent) recent.push(entry);\n    }\n    const stats = {\n      windowMs,\n      trackedStateCount: this.overrides.size,\n      trackedKeys: includeKeys ? Array.from(this.overrides.keys()) : [],\n      stateChangeCount,\n      uiChangeCount,\n    };\n    if (includeRecent) stats.recentChanges = recent.map((entry) => cloneStateValue(entry));\n    else stats.recentChanges = [];\n    return stats;\n  }\n\n  _subscriptionTargetsForKey(key) {\n    const targets = new Set();\n    const addPrefixes = (value) => {\n      const parts = normalizeStateKey(value).split('.').filter(Boolean);\n      for (let i = 1; i <= parts.length; i += 1) {\n        targets.add(parts.slice(0, i).join('.'));\n      }\n    };\n    addPrefixes(key);\n    for (const alias of this.keyAliases.get(key) ?? []) addPrefixes(alias);\n    if (key === 'cameraControls' || key.startsWith('cameraControls.')) targets.add('camera');\n    if (key.startsWith('behaviors.')) addPrefixes(key.replace(/^behaviors\\./u, ''));\n    return targets;\n  }\n\n  _shouldTrackOverride(options = {}) {\n    if (Object.prototype.hasOwnProperty.call(options, 'trackOverride')) {\n      return options.trackOverride !== false;\n    }\n    const origin = normalizeStateChangeOrigin(options);\n    if (origin.defaultLike) return false;\n    if (this.overrideTrackingReady === false && !origin.explicit) {\n      return false;\n    }\n    if (\n      this.overrideTrackingReady === false\n      && (origin.source === 'state' || origin.origin === 'state')\n      && options.intentional !== true\n      && options.trackOverride !== true\n    ) {\n      return false;\n    }\n    return origin.explicit;\n  }\n\n  _keyMatchesAliasPrefix(key, prefix) {\n    if (!prefix) return true;\n    if (key === `behaviors.${prefix}` || key.startsWith(`behaviors.${prefix}.`)) return true;\n    if (prefix === 'camera' && (key === 'cameraControls' || key.startsWith('cameraControls.'))) return true;\n    for (const alias of this.keyAliases.get(key) ?? []) {\n      if (alias === prefix || alias.startsWith(`${prefix}.`)) return true;\n    }\n    return false;\n  }\n\n  _emit(type, detail) {\n    this.dispatchEvent(createDetailEvent(type, detail));\n    if (type === 'change') this._notifySubscriptions(detail);\n  }\n\n  _notifySubscriptions(detail = {}) {\n    const key = normalizeStateKey(detail?.key ?? '');\n    const subscriptions = key\n      ? new Set(Array.from(this._subscriptionTargetsForKey(key))\n        .flatMap((target) => Array.from(this.subscriptionsByTarget.get(target) ?? [])))\n      : new Set(this.subscriptions);\n    for (const subscription of subscriptions) {\n      if (key && !keyMatchesSubscription(key, subscription.target, subscription.requestedKey, this.keyAliases)) continue;\n      const value = key && key === subscription.target && Object.prototype.hasOwnProperty.call(detail, 'value')\n        ? detail.value\n        : this.get(subscription.target || key);\n      subscription.callback(value, detail);\n    }\n  }\n}\n\n/**\n * Helper passed to `HeliosStateManager.transaction()` for grouped state writes.\n *\n * @public\n * @apiSection Persistence\n */\nexport class StateTransaction {\n  constructor(manager, options = {}) {\n    this.manager = manager;\n    this.options = options;\n    this.events = [];\n  }\n\n  set(key, value, options = {}) {\n    const result = this.manager._setOne(key, value, { ...this.options, ...options });\n    if (result?.event) this.events.push(result.event);\n    return result;\n  }\n\n  reset(keyOrPrefix, options = {}) {\n    return this.manager.reset(keyOrPrefix, { ...this.options, ...options });\n  }\n\n  result() {\n    return {\n      changed: this.events.length > 0,\n      events: this.events.map((event) => cloneStateValue(event)),\n      keys: Array.from(new Set(this.events.map((event) => event.key))),\n    };\n  }\n}\n\n/**\n * Binding controller that keeps registered state entries synchronized with runtime owners.\n *\n * @public\n * @apiSection Persistence\n */\nexport class StateBindingController {\n  constructor(manager) {\n    this.manager = manager;\n    this.cleanups = new Map();\n    this.applying = new Set();\n    this.bindings = new Map();\n  }\n\n  bind(key, entry, owner = null) {\n    const target = normalizeStateKey(key);\n    if (!target || !entry) return () => {};\n    this.unbind(target);\n    const cleanups = [];\n    const applyValue = (value, options = {}) => this.apply(target, value, options);\n    this.bindings.set(target, { entry, owner, applyValue });\n    const notify = (value, detail = {}) => {\n      if (this.applying.has(target)) return;\n      const nextValue = value === undefined && typeof entry.getter === 'function' ? entry.getter() : value;\n      const origin = normalizeStateChangeOrigin(detail);\n      if (\n        detail.trackOverride !== false\n        && origin.explicit\n        && !origin.defaultLike\n        && !detailHasStateKeys(detail)\n        && typeof console !== 'undefined'\n        && typeof console.warn === 'function'\n      ) {\n        console.warn(`[HeliosState] Ignoring broad explicit binding notification for \"${target}\". State changes must include storageKey/stateKey.`);\n      }\n      const shouldTrackOverride = detail.trackOverride === false\n        ? false\n        : (detail.trackOverride === true || (origin.explicit && !origin.defaultLike))\n        && detailTargetsStateKey(detail, target, this.manager);\n      this.manager.set(target, nextValue, {\n        source: detail.source ?? 'binding',\n        origin: detail.origin ?? origin.origin,\n        reason: detail.reason ?? 'bound-change',\n        trackOverride: shouldTrackOverride,\n        applyBinding: false,\n      });\n    };\n    if (typeof entry.binder === 'function') {\n      const cleanup = entry.binder({\n        key: target,\n        state: this.manager,\n        manager: this.manager,\n        notify,\n        apply: applyValue,\n      });\n      if (typeof cleanup === 'function') cleanups.push(cleanup);\n    } else if (typeof entry.subscribe === 'function') {\n      const cleanup = entry.subscribe((value, detail) => notify(value, detail));\n      if (typeof cleanup === 'function') cleanups.push(cleanup);\n    } else if (owner && typeof owner.bind === 'function') {\n      const cleanup = owner.bind(target.split('.').pop(), (value, detail) => notify(value, detail));\n      if (typeof cleanup === 'function') cleanups.push(cleanup);\n    }\n    const cleanup = () => {\n      for (const fn of cleanups.splice(0)) fn?.();\n      this.bindings.delete(target);\n      this.cleanups.delete(target);\n    };\n    this.cleanups.set(target, cleanup);\n    return cleanup;\n  }\n\n  apply(key, value, options = {}) {\n    const target = normalizeStateKey(key);\n    const binding = this.bindings.get(target);\n    if (!binding || this.applying.has(target)) return;\n    const { entry, owner } = binding;\n    this.applying.add(target);\n    try {\n      if (typeof entry.setter === 'function') {\n        entry.setter(value, options);\n      } else if (entry.bindProperty && owner && entry.property) {\n        owner[entry.property] = value;\n      }\n    } finally {\n      this.applying.delete(target);\n    }\n  }\n\n  unbind(key) {\n    const target = normalizeStateKey(key);\n    const cleanup = this.cleanups.get(target);\n    cleanup?.();\n    return Boolean(cleanup);\n  }\n\n  destroy() {\n    for (const cleanup of Array.from(this.cleanups.values())) cleanup?.();\n    this.cleanups.clear();\n    this.bindings.clear();\n  }\n}\n\nexport default HeliosStateManager;\n","import {\n  IndexedDBSessionStore,\n  createMemoryStorage,\n} from '../persistence/storage.js';\nimport {\n  PERSISTENCE_KINDS,\n  createDefaultPreferencesState,\n  createPersistenceEnvelope,\n  migratePersistenceEnvelope,\n} from '../persistence/schema.js';\nimport {\n  HeliosStateManager,\n} from '../state/index.js';\n\nfunction createDetailEvent(type, detail) {\n  if (typeof CustomEvent === 'function') return new CustomEvent(type, { detail });\n  if (typeof Event === 'function') {\n    const event = new Event(type);\n    event.detail = detail;\n    return event;\n  }\n  return { type, detail };\n}\n\nfunction cloneSerializable(value) {\n  if (value == null || typeof value !== 'object') return value;\n  if (typeof structuredClone === 'function') {\n    try {\n      return structuredClone(value);\n    } catch (_) {\n      // Fall through to JSON clone for plain serializable values.\n    }\n  }\n  return JSON.parse(JSON.stringify(value));\n}\n\nfunction estimateStoredByteLength(value) {\n  if (value == null) return 0;\n  if (typeof Blob !== 'undefined' && value instanceof Blob) return value.size;\n  if (value instanceof ArrayBuffer) return value.byteLength;\n  if (ArrayBuffer.isView(value)) return value.byteLength;\n  if (typeof value === 'string') return value.length * 2;\n  try {\n    return JSON.stringify(value).length * 2;\n  } catch (_) {\n    return 0;\n  }\n}\n\nfunction uint8ArrayToBase64(value) {\n  if (!(value instanceof Uint8Array) || value.length <= 0) return '';\n  if (typeof Buffer !== 'undefined') return Buffer.from(value).toString('base64');\n  let binary = '';\n  const chunkSize = 0x8000;\n  for (let offset = 0; offset < value.length; offset += chunkSize) {\n    const chunk = value.subarray(offset, offset + chunkSize);\n    binary += String.fromCharCode(...chunk);\n  }\n  return btoa(binary);\n}\n\nfunction base64ToUint8Array(value) {\n  if (typeof value !== 'string' || value.length <= 0) return null;\n  if (typeof Buffer !== 'undefined') return Uint8Array.from(Buffer.from(value, 'base64'));\n  const binary = atob(value);\n  const bytes = new Uint8Array(binary.length);\n  for (let i = 0; i < binary.length; i += 1) bytes[i] = binary.charCodeAt(i);\n  return bytes;\n}\n\nfunction decodeFloat32PositionPayload(encoded = {}) {\n  if (encoded?.encoding !== 'float32-base64' || typeof encoded.data !== 'string') return null;\n  const bytes = base64ToUint8Array(encoded.data);\n  if (!bytes || bytes.byteLength <= 0 || bytes.byteLength % Float32Array.BYTES_PER_ELEMENT !== 0) return null;\n  const copy = new Uint8Array(bytes.byteLength);\n  copy.set(bytes);\n  const values = new Float32Array(copy.buffer);\n  if (encoded.length != null && values.length !== Number(encoded.length)) return null;\n  return values;\n}\n\nfunction encodeFloat32PositionPayload(values) {\n  if (!(values instanceof Float32Array) || values.length <= 0) return null;\n  const bytes = new Uint8Array(values.buffer, values.byteOffset, values.byteLength);\n  return {\n    encoding: 'float32-base64',\n    length: values.length,\n    byteLength: values.byteLength,\n    data: uint8ArrayToBase64(bytes),\n  };\n}\n\nconst STALE_POSITION_AUTOSAVE_CODE = 'HELIOS_STALE_POSITION_AUTOSAVE';\nconst DEFAULT_POSITION_COMPRESSION_MIN_BYTES = 256 * 1024;\n\nfunction createStalePositionAutosaveAbort(detail = {}) {\n  const error = new Error('Skipping stale queued Helios position autosave because newer positions are pending.');\n  error.code = STALE_POSITION_AUTOSAVE_CODE;\n  error.detail = detail;\n  return error;\n}\n\nfunction isStalePositionAutosaveAbort(error) {\n  return error?.code === STALE_POSITION_AUTOSAVE_CODE;\n}\n\nasync function compressPositionBytes(bytes, options = {}) {\n  if (!(bytes instanceof Uint8Array) || bytes.byteLength <= 0) return null;\n  const raw = new Uint8Array(bytes.byteLength);\n  raw.set(bytes);\n  const compressionMinBytes = Number.isFinite(Number(options.compressionMinBytes))\n    ? Math.max(0, Math.floor(Number(options.compressionMinBytes)))\n    : DEFAULT_POSITION_COMPRESSION_MIN_BYTES;\n  if (raw.byteLength < compressionMinBytes) {\n    return { data: raw, compression: 'none', skippedCompression: 'below-threshold' };\n  }\n  if (typeof CompressionStream !== 'function' || typeof Response !== 'function' || typeof Blob !== 'function') {\n    return { data: raw, compression: 'none', skippedCompression: 'unavailable' };\n  }\n  try {\n    const compressed = new Uint8Array(await new Response(\n      new Blob([raw]).stream().pipeThrough(new CompressionStream('gzip')),\n    ).arrayBuffer());\n    if (compressed.byteLength > 0 && compressed.byteLength < raw.byteLength) {\n      return { data: compressed, compression: 'gzip' };\n    }\n  } catch (error) {\n    console.warn('Helios: failed to gzip session position payload; storing raw position bytes.', error);\n  }\n  return { data: raw, compression: 'none' };\n}\n\nasync function decompressPositionBytes(data, compression = 'none') {\n  if (!(data instanceof Uint8Array) && !(data instanceof ArrayBuffer) && !ArrayBuffer.isView(data)) return null;\n  const bytes = data instanceof Uint8Array\n    ? data\n    : (data instanceof ArrayBuffer ? new Uint8Array(data) : new Uint8Array(data.buffer, data.byteOffset, data.byteLength));\n  if (compression === 'none' || compression == null || compression === '') {\n    const raw = new Uint8Array(bytes.byteLength);\n    raw.set(bytes);\n    return raw;\n  }\n  if (compression !== 'gzip') throw new Error(`Unsupported Helios position payload compression: ${compression}`);\n  if (typeof DecompressionStream !== 'function' || typeof Response !== 'function' || typeof Blob !== 'function') {\n    throw new Error('Cannot restore gzip-compressed Helios positions because DecompressionStream is unavailable.');\n  }\n  return new Uint8Array(await new Response(\n    new Blob([bytes]).stream().pipeThrough(new DecompressionStream('gzip')),\n  ).arrayBuffer());\n}\n\nfunction normalizeSessionNickname(value) {\n  if (typeof value !== 'string') return null;\n  const trimmed = value.trim();\n  return trimmed || null;\n}\n\nfunction envelopeSessionId(envelope) {\n  return envelope?.payload?.session?.id ?? envelope?.id ?? null;\n}\n\nfunction envelopeUpdatedAt(envelope) {\n  const value = envelope?.payload?.session?.updatedAt ?? envelope?.updatedAt ?? null;\n  return Number.isFinite(value) ? Number(value) : null;\n}\n\nfunction sessionSummaryFromEnvelope(envelope, options = {}) {\n  const entry = migratePersistenceEnvelope(envelope, PERSISTENCE_KINDS.session);\n  const session = entry?.payload?.session ?? {};\n  const networkSource = entry?.payload?.networkSource ?? {};\n  const id = session.id ?? entry.id ?? null;\n  const nickname = normalizeSessionNickname(session.nickname);\n  const byteStats = sessionStoredByteStats(entry);\n  return {\n    id,\n    workspaceId: session.workspaceId ?? null,\n    nickname,\n    label: nickname ?? networkSource.name ?? networkSource.baseName ?? id ?? 'session',\n    createdAt: Number.isFinite(session.createdAt) ? Number(session.createdAt) : null,\n    updatedAt: Number.isFinite(session.updatedAt) ? Number(session.updatedAt) : null,\n    unfinished: session.unfinished !== false,\n    status: session.status ?? 'active',\n    bytes: byteStats.bytes,\n    manifestBytes: byteStats.manifestBytes,\n    networkBytes: byteStats.networkBytes,\n    positionBytes: byteStats.positionBytes,\n    current: options.currentSessionId != null && id != null && String(options.currentSessionId) === String(id),\n    networkSource: cloneSerializable(networkSource),\n    thumbnail: entry?.payload?.thumbnail ? cloneSerializable(entry.payload.thumbnail) : null,\n  };\n}\n\nfunction payloadDataByteLength(data) {\n  if (data == null) return 0;\n  if (data instanceof ArrayBuffer) return data.byteLength;\n  if (ArrayBuffer.isView(data)) return data.byteLength;\n  if (Array.isArray(data) && data.every((value) => Number.isInteger(value) && value >= 0 && value <= 255)) {\n    return data.length;\n  }\n  return estimateStoredByteLength(data);\n}\n\nfunction finiteStoredByteLength(...values) {\n  for (const value of values) {\n    const number = Number(value);\n    if (Number.isFinite(number) && number > 0) return number;\n  }\n  return 0;\n}\n\nfunction sessionStoredByteStats(envelope = {}) {\n  const entry = cloneSerializable(envelope);\n  entry.payload = entry.payload && typeof entry.payload === 'object' ? entry.payload : {};\n  const networkData = entry.payload.networkData && typeof entry.payload.networkData === 'object'\n    ? entry.payload.networkData\n    : null;\n  const positionData = entry.payload.positionData && typeof entry.payload.positionData === 'object'\n    ? entry.payload.positionData\n    : null;\n  const networkBytes = networkData\n    ? finiteStoredByteLength(networkData.byteLength, payloadDataByteLength(networkData.data))\n    : 0;\n  const positionBytes = positionData\n    ? finiteStoredByteLength(positionData.storedByteLength, payloadDataByteLength(positionData.data), positionData.byteLength)\n    : 0;\n  if (networkData) networkData.data = null;\n  if (positionData) positionData.data = null;\n  const manifestBytes = estimateStoredByteLength(entry);\n  return {\n    manifestBytes,\n    networkBytes,\n    positionBytes,\n    bytes: manifestBytes + networkBytes + positionBytes,\n  };\n}\n\nfunction normalizeKey(key) {\n  return String(key ?? '').trim().replace(/^\\.+|\\.+$/g, '');\n}\n\nfunction normalizeUrlSessionRouting(options = {}) {\n  const raw = options.url ?? options.urlRouting ?? options.appendToUrl ?? options.urlSession;\n  if (raw === true || raw === 'url' || raw === 'replace') {\n    return {\n      enabled: true,\n      param: options.urlSessionParam ?? options.sessionParam ?? 'sessionId',\n      replace: true,\n    };\n  }\n  if (!raw || typeof raw !== 'object' || raw.enabled === false) return { enabled: false };\n  return {\n    enabled: true,\n    param: raw.param ?? raw.name ?? options.urlSessionParam ?? 'sessionId',\n    replace: raw.replace !== false,\n  };\n}\n\nfunction ensureSessionIdInUrl(id, routing) {\n  if (!id || routing?.enabled !== true) return;\n  try {\n    const location = globalThis.location;\n    const history = globalThis.history;\n    if (!location || !history?.replaceState) return;\n    const url = new URL(location.href);\n    const param = String(routing.param || 'sessionId');\n    if (url.searchParams.get(param) === id) return;\n    url.searchParams.set(param, id);\n    const mode = routing.replace === false ? 'pushState' : 'replaceState';\n    history[mode]?.call(history, history.state, '', url);\n  } catch (error) {\n    console.warn('[HeliosStorage] Failed to update session id in the URL.', error);\n  }\n}\n\nconst DEFAULT_UI_PERSISTENCE_FORWARD_DEBOUNCE_MS = 180;\nconst DEFAULT_SESSION_SAVE_WARNING_MS = 10000;\nconst DEFAULT_SESSION_THUMBNAIL_MAX_WIDTH = 320;\nconst DEFAULT_SESSION_THUMBNAIL_MAX_HEIGHT = 180;\nconst DEFAULT_SESSION_THUMBNAIL_MAX_BYTES = 256 * 1024;\nconst DEFAULT_SESSION_THUMBNAIL_AUTOSAVE_MIN_INTERVAL_MS = 30000;\nconst DEFAULT_AUTOSYNC_INTERACTION_IDLE_MS = 1000;\nconst DEFAULT_SESSION_AUTOSYNC_MIN_INTERVAL_MS = 1500;\nconst DEFAULT_POSITION_AUTOSAVE_DEBOUNCE_MS = 2000;\nconst DEFAULT_AUTOSYNC_POSITION_MAX_BYTES = 2 * 1024 * 1024;\nconst DEFAULT_MANUAL_POSITION_MAX_BYTES = Number.MAX_SAFE_INTEGER;\nconst DEFAULT_SESSION_SYNC_TIMING_LOG_MS = 25;\nconst SESSION_ID_ALPHABET = 'abcdefghijklmnopqrstuvwxyz0123456789';\nconst DEFAULT_SESSION_ID_LENGTH = 10;\nconst WARNING_KEYS_BY_OWNER = new WeakMap();\n\nfunction warnOnce(owner, key, message, detail = undefined) {\n  if (typeof console === 'undefined' || typeof console.warn !== 'function') return;\n  const target = owner && (typeof owner === 'object' || typeof owner === 'function') ? owner : warnOnce;\n  let keys = WARNING_KEYS_BY_OWNER.get(target);\n  if (!keys) {\n    keys = new Set();\n    WARNING_KEYS_BY_OWNER.set(target, keys);\n  }\n  const normalizedKey = String(key ?? message);\n  if (keys.has(normalizedKey)) return;\n  keys.add(normalizedKey);\n  if (detail === undefined) console.warn(message);\n  else console.warn(message, detail);\n}\n\nfunction createRandomSessionId(length = DEFAULT_SESSION_ID_LENGTH) {\n  const size = Math.max(6, Math.min(32, Math.floor(Number(length) || DEFAULT_SESSION_ID_LENGTH)));\n  const bytes = new Uint8Array(size);\n  const crypto = globalThis.crypto;\n  if (crypto && typeof crypto.getRandomValues === 'function') {\n    crypto.getRandomValues(bytes);\n  } else {\n    for (let i = 0; i < size; i += 1) bytes[i] = Math.floor(Math.random() * 256);\n  }\n  let id = '';\n  for (let i = 0; i < bytes.length; i += 1) {\n    id += SESSION_ID_ALPHABET[bytes[i] % SESSION_ID_ALPHABET.length];\n  }\n  return id;\n}\n\nfunction isExplicitOverrideSource(source) {\n  const value = String(source ?? '').trim();\n  return value === 'program' || value === 'cli' || value === 'restore';\n}\n\nfunction isLegacyImplicitAppearanceOverrideSource(source) {\n  const value = String(source ?? '').trim();\n  return value === '' || value === 'binding' || value === 'refresh' || value === 'config';\n}\n\nfunction isAppearanceOverrideKey(key) {\n  const value = String(key ?? '').trim();\n  return value === 'behaviors.appearance'\n    || value.startsWith('behaviors.appearance.')\n    || value === 'appearance'\n    || value.startsWith('appearance.');\n}\n\nfunction sanitizeLegacyImplicitAppearanceOverrides(overrides = {}, journal = [], resolveKey = null, entryForKey = null) {\n  const canonical = (key) => (typeof resolveKey === 'function' ? (resolveKey(key) || normalizeKey(key)) : normalizeKey(key));\n  const next = cloneSerializable(overrides ?? {});\n  const appearanceKeys = Object.keys(next).filter((key) => isAppearanceOverrideKey(canonical(key)));\n  const pruneDefaultAppearanceClusterValues = () => {\n    if (appearanceKeys.length < 4 || typeof entryForKey !== 'function') return;\n    for (const key of appearanceKeys) {\n      if (!Object.prototype.hasOwnProperty.call(next, key)) continue;\n      const entry = entryForKey(canonical(key));\n      if (!entry?.equals) continue;\n      if (entry.equals(next[key], entry.default)) delete next[key];\n    }\n  };\n  if (!journal || !Array.isArray(journal) || journal.length === 0) {\n    pruneDefaultAppearanceClusterValues();\n    return next;\n  }\n  const lastEventByKey = new Map();\n  for (const event of journal) {\n    const key = canonical(event?.key ?? event?.path ?? event?.requestedKey ?? '');\n    if (!key || !isAppearanceOverrideKey(key)) continue;\n    lastEventByKey.set(key, event);\n  }\n  for (const key of Object.keys(next)) {\n    const target = canonical(key);\n    if (!isAppearanceOverrideKey(target)) continue;\n    const event = lastEventByKey.get(target);\n    if (!event) continue;\n    if (event.trackOverride === true) continue;\n    if (!isLegacyImplicitAppearanceOverrideSource(event.source)) continue;\n    delete next[key];\n  }\n  pruneDefaultAppearanceClusterValues();\n  return next;\n}\n\nfunction mergeDeepObject(base = {}, patch = {}) {\n  const output = { ...(base && typeof base === 'object' ? base : {}) };\n  for (const [key, value] of Object.entries(patch && typeof patch === 'object' ? patch : {})) {\n    if (value && typeof value === 'object' && !Array.isArray(value)) {\n      output[key] = mergeDeepObject(output[key], value);\n    } else {\n      output[key] = value;\n    }\n  }\n  return output;\n}\n\nfunction normalizeSessionThumbnailOptions(value = {}) {\n  if (value === false) return { enabled: false };\n  const source = value && typeof value === 'object' ? value : {};\n  const rawAutosaveMinIntervalMs = source.autosaveMinIntervalMs\n    ?? source.minAutosaveIntervalMs\n    ?? source.autosave?.minIntervalMs;\n  const autosaveEnabled = source.autosaveEnabled !== false\n    && source.autosave !== false\n    && rawAutosaveMinIntervalMs !== false;\n  return {\n    enabled: source.enabled !== false,\n    maxWidth: Number.isFinite(Number(source.maxWidth))\n      ? Math.max(16, Math.floor(Number(source.maxWidth)))\n      : DEFAULT_SESSION_THUMBNAIL_MAX_WIDTH,\n    maxHeight: Number.isFinite(Number(source.maxHeight))\n      ? Math.max(16, Math.floor(Number(source.maxHeight)))\n      : DEFAULT_SESSION_THUMBNAIL_MAX_HEIGHT,\n    maxBytes: Number.isFinite(Number(source.maxBytes))\n      ? Math.max(0, Math.floor(Number(source.maxBytes)))\n      : DEFAULT_SESSION_THUMBNAIL_MAX_BYTES,\n    autosaveEnabled,\n    autosaveMinIntervalMs: rawAutosaveMinIntervalMs === false\n      ? DEFAULT_SESSION_THUMBNAIL_AUTOSAVE_MIN_INTERVAL_MS\n      : normalizeNonNegativeMs(rawAutosaveMinIntervalMs, DEFAULT_SESSION_THUMBNAIL_AUTOSAVE_MIN_INTERVAL_MS),\n    includeLabels: source.includeLabels === true,\n    includeLegends: source.includeLegends === true,\n    includeInterface: source.includeInterface === true,\n  };\n}\n\nasync function blobToDataUrl(blob) {\n  if (!blob) return null;\n  if (typeof FileReader !== 'undefined') {\n    return await new Promise((resolve, reject) => {\n      const reader = new FileReader();\n      reader.onload = () => resolve(typeof reader.result === 'string' ? reader.result : null);\n      reader.onerror = () => reject(reader.error ?? new Error('Failed to read thumbnail blob'));\n      reader.readAsDataURL(blob);\n    });\n  }\n  if (typeof blob.arrayBuffer === 'function') {\n    const buffer = await blob.arrayBuffer();\n    const bytes = new Uint8Array(buffer);\n    let binary = '';\n    for (let i = 0; i < bytes.length; i += 1) binary += String.fromCharCode(bytes[i]);\n    const encoded = typeof btoa === 'function'\n      ? btoa(binary)\n      : Buffer.from(bytes).toString('base64');\n    return `data:${blob.type || 'image/png'};base64,${encoded}`;\n  }\n  return null;\n}\n\nfunction normalizeNonNegativeMs(value, fallback = 0) {\n  if (value === false) return 0;\n  const number = Number(value);\n  return Number.isFinite(number) ? Math.max(0, number) : fallback;\n}\n\nfunction syncTimingNowMs() {\n  const performanceNow = globalThis.performance?.now?.();\n  return Number.isFinite(performanceNow) ? performanceNow : Date.now();\n}\n\nfunction roundTimingMs(value) {\n  if (!Number.isFinite(value)) return 0;\n  return Math.round(value * 10) / 10;\n}\n\nfunction normalizePositiveByteLimit(value, fallback = 0) {\n  if (value === false || value == null) return fallback;\n  const number = Number(value);\n  if (!Number.isFinite(number)) return fallback;\n  return Math.max(0, Math.floor(number));\n}\n\nfunction normalizeAutosyncPayloadLimits(value = {}) {\n  if (value === false) return { enabled: false };\n  const source = value && typeof value === 'object' ? value : {};\n  const positionMaxBytes = normalizePositiveByteLimit(\n    source.positionMaxBytes\n      ?? source.maxPositionBytes\n      ?? source.positions?.maxBytes\n      ?? source.positions?.maxPositionBytes,\n    DEFAULT_AUTOSYNC_POSITION_MAX_BYTES,\n  );\n  const defaultNodeLimit = positionMaxBytes > 0\n    ? Math.max(1, Math.floor(positionMaxBytes / (3 * Float32Array.BYTES_PER_ELEMENT)))\n    : 0;\n  return {\n    enabled: source.enabled !== false,\n    positionMaxBytes,\n    networkMaxNodes: normalizePositiveByteLimit(\n      source.networkMaxNodes\n        ?? source.maxNetworkNodes\n        ?? source.network?.maxNodes,\n      defaultNodeLimit,\n    ),\n  };\n}\n\nfunction isUserInteractionDetail(detail = {}) {\n  const source = String(detail.source ?? '').toLowerCase();\n  const origin = String(detail.origin ?? detail.change?.origin ?? '').toLowerCase();\n  const action = String(detail.action ?? detail.change?.action ?? '').toLowerCase();\n  const reason = String(detail.reason ?? '').toLowerCase();\n  return origin === 'interaction'\n    || source === 'interaction'\n    || reason.includes('interaction')\n    || ['pan', 'zoom', 'dolly', 'rotate', 'wheel', 'pointer', 'touch', 'gesture'].some((token) => action.includes(token));\n}\n\nfunction mergeCaptureThumbnailMode(previous, next) {\n  if (previous === true || next === true) return true;\n  if (previous === 'auto' || next === 'auto') return 'auto';\n  return next === false || previous === false ? false : undefined;\n}\n\nfunction mergeSessionAutosaveOptions(previous = {}, next = {}) {\n  const pending = previous && typeof previous === 'object' ? previous : {};\n  const options = next && typeof next === 'object' ? next : {};\n  const nextPositionDirtyVersion = Number(options.positionDirtyVersion);\n  const pendingPositionDirtyVersion = Number(pending.positionDirtyVersion);\n  return {\n    ...pending,\n    ...options,\n    includeNetwork: pending.includeNetwork === true || options.includeNetwork === true,\n    includePositions: pending.includePositions === true || options.includePositions === true,\n    captureThumbnail: mergeCaptureThumbnailMode(pending.captureThumbnail, options.captureThumbnail),\n    snapshotLayoutRuntime: pending.snapshotLayoutRuntime === true || options.snapshotLayoutRuntime === true,\n    positionDirtyVersion: options.includePositions === true && Number.isFinite(nextPositionDirtyVersion)\n      ? nextPositionDirtyVersion\n      : (Number.isFinite(pendingPositionDirtyVersion) ? pendingPositionDirtyVersion : undefined),\n  };\n}\n\n/**\n * Low-level session record store used by Helios storage managers.\n *\n * @public\n * @apiSection Persistence\n */\nexport class SessionStore {\n  constructor(options = {}) {\n    this.store = options.store ?? null;\n    this.storage = options.storage ?? null;\n    this.prefix = options.prefix ?? 'helios-web:storage-session:';\n    this.indexKey = options.indexKey ?? `${this.prefix}index`;\n    this.unfinishedSessionKey = options.unfinishedSessionKey ?? `${this.prefix}unfinished-session`;\n  }\n\n  key(id) {\n    return `${this.prefix}${encodeURIComponent(String(id))}`;\n  }\n\n  networkDataRecordId(id) {\n    return `${String(id)}::network-data`;\n  }\n\n  positionDataRecordId(id) {\n    return `${String(id)}::position-data`;\n  }\n\n  unfinishedSessionKeyFor(workspaceId = null) {\n    if (workspaceId == null || workspaceId === '') return this.unfinishedSessionKey;\n    return `${this.unfinishedSessionKey}:${encodeURIComponent(String(workspaceId))}`;\n  }\n\n  _readIndex() {\n    if (!this.storage?.getItem) return [];\n    try {\n      const parsed = JSON.parse(this.storage.getItem(this.indexKey) || '[]');\n      return Array.isArray(parsed) ? parsed.map((id) => String(id)).filter(Boolean) : [];\n    } catch (error) {\n      console.warn('[HeliosStorage] Failed to read session index; ignoring corrupt index data.', error);\n      return [];\n    }\n  }\n\n  _writeIndex(ids = []) {\n    if (!this.storage?.setItem) return;\n    const unique = Array.from(new Set(ids.map((id) => String(id)).filter(Boolean)));\n    this.storage.setItem(this.indexKey, JSON.stringify(unique));\n  }\n\n  _addToIndex(id) {\n    if (!id) return;\n    const ids = this._readIndex();\n    if (!ids.includes(String(id))) this._writeIndex([...ids, String(id)]);\n  }\n\n  _removeFromIndex(id) {\n    if (!id) return;\n    const target = String(id);\n    this._writeIndex(this._readIndex().filter((entry) => entry !== target));\n  }\n\n  _splitSessionPayloadData(record) {\n    const id = record?.id ?? envelopeSessionId(record);\n    if (!id) return { record, networkRecord: null, positionRecord: null };\n    let nextRecord = record;\n    let networkRecord = null;\n    let positionRecord = null;\n    const data = record?.payload?.networkData?.data;\n    if (data != null) {\n      const networkRecordId = this.networkDataRecordId(id);\n      const networkData = record.payload.networkData ?? {};\n      networkRecord = {\n        id: networkRecordId,\n        kind: 'session-network-data',\n        sessionId: String(id),\n        format: networkData.format ?? null,\n        data,\n        byteLength: estimateStoredByteLength(data),\n        updatedAt: Date.now(),\n      };\n      nextRecord = {\n        ...nextRecord,\n        payload: {\n          ...(nextRecord.payload ?? {}),\n          networkData: {\n            ...networkData,\n            data: null,\n            dataRef: networkRecordId,\n            byteLength: networkRecord.byteLength,\n          },\n        },\n      };\n    }\n    const positionData = nextRecord?.payload?.positionData ?? null;\n    if (positionData?.data != null) {\n      const positionRecordId = this.positionDataRecordId(id);\n      positionRecord = {\n        id: positionRecordId,\n        kind: 'session-position-data',\n        sessionId: String(id),\n        schema: positionData.schema ?? 'helios-web.session-position-data',\n        version: positionData.version ?? 1,\n        data: positionData.data,\n        byteLength: estimateStoredByteLength(positionData.data),\n        updatedAt: Date.now(),\n      };\n      nextRecord = {\n        ...nextRecord,\n        payload: {\n          ...(nextRecord.payload ?? {}),\n          positionData: {\n            ...positionData,\n            data: null,\n            dataRef: positionRecordId,\n            storedByteLength: positionRecord.byteLength,\n          },\n        },\n      };\n    }\n    return {\n      record: nextRecord,\n      networkRecord,\n      positionRecord,\n    };\n  }\n\n  async _putRaw(record, options = {}) {\n    if (this.store?.put) return this.store.put(record);\n    if (this.storage?.setItem) {\n      this.storage.setItem(this.key(record.id), JSON.stringify(record));\n      if (options.index !== false) this._addToIndex(record.id);\n      return record;\n    }\n    return record;\n  }\n\n  async put(record) {\n    const split = this._splitSessionPayloadData(record);\n    if (split.networkRecord) await this._putRaw(split.networkRecord, { index: false });\n    if (split.positionRecord) await this._putRaw(split.positionRecord, { index: false });\n    return this._putRaw(split.record, { index: true });\n  }\n\n  async _getRaw(id) {\n    if (!id) return null;\n    if (this.store?.get) return this.store.get(id);\n    if (this.storage?.getItem) {\n      const raw = this.storage.getItem(this.key(id));\n      return raw ? JSON.parse(raw) : null;\n    }\n    return null;\n  }\n\n  async get(id, options = {}) {\n    const record = await this._getRaw(id);\n    if (!record || options.hydrateNetworkData === false) return record;\n    let hydrated = record;\n    const networkData = hydrated?.payload?.networkData ?? null;\n    const dataRef = networkData?.dataRef ?? null;\n    if (dataRef && networkData.data == null) {\n      const networkRecord = await this._getRaw(dataRef);\n      if (networkRecord?.data != null) {\n        hydrated = {\n          ...hydrated,\n          payload: {\n            ...(hydrated.payload ?? {}),\n            networkData: {\n              ...networkData,\n              format: networkData.format ?? networkRecord.format ?? null,\n              data: networkRecord.data,\n              byteLength: networkData.byteLength ?? networkRecord.byteLength ?? estimateStoredByteLength(networkRecord.data),\n            },\n          },\n        };\n      }\n    }\n    if (options.hydratePositionData === false) return hydrated;\n    const positionData = hydrated?.payload?.positionData ?? null;\n    const positionDataRef = positionData?.dataRef ?? null;\n    if (positionDataRef && positionData.data == null) {\n      const positionRecord = await this._getRaw(positionDataRef);\n      if (positionRecord?.data != null) {\n        hydrated = {\n          ...hydrated,\n          payload: {\n            ...(hydrated.payload ?? {}),\n            positionData: {\n              ...positionData,\n              data: positionRecord.data,\n              storedByteLength: positionData.storedByteLength ?? positionRecord.byteLength ?? estimateStoredByteLength(positionRecord.data),\n            },\n          },\n        };\n      }\n    }\n    return hydrated;\n  }\n\n  async getAll() {\n    if (this.store?.getAll) return this.store.getAll();\n    const indexedIds = this._readIndex();\n    if (indexedIds.length && this.storage?.getItem) {\n      const records = [];\n      for (const id of indexedIds) {\n        const raw = this.storage.getItem(this.key(id));\n        if (raw) records.push(JSON.parse(raw));\n      }\n      return records;\n    }\n    if (!this.storage?.getItem || !Number.isFinite(this.storage.length)) return [];\n    const records = [];\n    for (let i = 0; i < this.storage.length; i += 1) {\n      const key = this.storage.key?.(i);\n      if (!key || !key.startsWith(this.prefix)) continue;\n      const raw = this.storage.getItem(key);\n      if (raw) records.push(JSON.parse(raw));\n    }\n    return records;\n  }\n\n  async delete(id) {\n    if (this.store?.delete) {\n      await this.store.delete(this.networkDataRecordId(id));\n      await this.store.delete(this.positionDataRecordId(id));\n      return this.store.delete(id);\n    }\n    this.storage?.removeItem?.(this.key(id));\n    this.storage?.removeItem?.(this.key(this.networkDataRecordId(id)));\n    this.storage?.removeItem?.(this.key(this.positionDataRecordId(id)));\n    this._removeFromIndex(id);\n    return true;\n  }\n\n  async getUnfinishedSessionId(workspaceId = null) {\n    if (this.store?.getUnfinishedSessionId) return this.store.getUnfinishedSessionId(workspaceId);\n    if (!this.storage?.getItem) return null;\n    return this.storage.getItem(this.unfinishedSessionKeyFor(workspaceId));\n  }\n\n  async setUnfinishedSessionId(id, workspaceId = null) {\n    if (this.store?.setUnfinishedSessionId) return this.store.setUnfinishedSessionId(id, workspaceId);\n    if (!this.storage) return id ?? null;\n    const key = this.unfinishedSessionKeyFor(workspaceId);\n    if (id == null || id === '') this.storage.removeItem?.(key);\n    else this.storage.setItem?.(key, String(id));\n    return id ?? null;\n  }\n}\n\n/**\n * Base storage facade for Helios state snapshots, sessions, and portable network state.\n *\n * @public\n * @apiSection Persistence\n */\nexport class HeliosStorageManager extends EventTarget {\n  constructor(options = {}) {\n    super();\n    this.helios = options.helios ?? null;\n    this.type = options.type ?? 'custom';\n    this.workspaceId = options.workspaceId ?? 'default';\n    this.sessionId = options.sessionId ? String(options.sessionId) : null;\n    this.requestedSessionId = this.sessionId;\n    this.explicitSessionInvalid = false;\n    this.persistNetwork = options.persistNetwork === true;\n    this.urlRouting = { enabled: false };\n    this.sessionSavedAt = null;\n    this.sessionSaveError = null;\n    this.sessionRestoreError = null;\n    this.sessionSaveWarning = null;\n    this.networkData = {\n      enabled: this.persistNetwork,\n      status: 'idle',\n      dirty: false,\n      networkDirty: false,\n      positionsDirty: false,\n      savedAt: null,\n      dirtyAt: null,\n    };\n    this.capabilities = {\n      persistent: options.persistent === true,\n      sessions: options.sessions === true,\n      network: options.network === true,\n      remote: options.remote === true,\n    };\n    this.overrideTrackingReady = options.overrideTrackingReady !== false;\n    this.states = options.states ?? options.registry ?? new HeliosStateManager(options);\n    this.states?.setOverrideTrackingReady?.(this.overrideTrackingReady);\n    this.sessionStore = options.sessionStore ?? null;\n    this.idFactory = options.idFactory ?? createRandomSessionId;\n    this._now = typeof options.now === 'function' ? options.now : () => Date.now();\n    this.sessionThumbnail = normalizeSessionThumbnailOptions(options.sessionThumbnail ?? options.session?.thumbnail);\n    this.autosyncPayloadLimits = normalizeAutosyncPayloadLimits(\n      options.autosyncPayloadLimits\n        ?? options.session?.autosyncPayloadLimits\n        ?? options.session?.autosyncLimits,\n    );\n    this.autosyncInteractionIdleMs = normalizeNonNegativeMs(\n      options.autosyncInteractionIdleMs ?? options.session?.autosyncInteractionIdleMs,\n      DEFAULT_AUTOSYNC_INTERACTION_IDLE_MS,\n    );\n    this.autosyncMinIntervalMs = normalizeNonNegativeMs(\n      options.autosyncMinIntervalMs ?? options.session?.autosyncMinIntervalMs,\n      DEFAULT_SESSION_AUTOSYNC_MIN_INTERVAL_MS,\n    );\n    this.autosyncDisabled = false;\n    this.autosyncDisabledReason = null;\n    this._lastPersistenceStatus = null;\n    this.ready = Promise.resolve(null);\n    this._registryChange = (event) => {\n      const detail = event.detail ?? {};\n      this._handleStateChangeForStorage(detail);\n      if (!this.capabilities.persistent && !this.capabilities.sessions && !this.capabilities.network) return;\n      this._emit('change', detail);\n    };\n    this.states.addEventListener('change', this._registryChange);\n    this._sessionAutosaveTimer = null;\n    this._sessionAutosaveOptions = null;\n    this._interactionAutosaveTimer = null;\n    this._pendingInteractionAutosaveOptions = null;\n    this._pendingStateOverrideDeltas = new Map();\n    this._sessionSaveInFlight = new Map();\n    this._sessionSaveQueue = Promise.resolve();\n    this._sessionSaveQueuedCount = 0;\n    this._sessionAutosaveAfterSaveQueued = false;\n    this._sessionSaveSequence = 0;\n    this._sessionSyncTimingSequence = 0;\n    this._sessionSaveWarningMs = normalizeNonNegativeMs(\n      options.sessionSaveWarningMs ?? options.session?.saveWarningMs,\n      DEFAULT_SESSION_SAVE_WARNING_MS,\n    );\n    this.sessionSyncTimingLog = options.sessionSyncTimingLog\n      ?? options.session?.syncTimingLog\n      ?? options.session?.timingLog\n      ?? true;\n    this.sessionSyncTimingLogThresholdMs = normalizeNonNegativeMs(\n      options.sessionSyncTimingLogThresholdMs\n        ?? options.session?.syncTimingLogThresholdMs\n        ?? options.session?.timingLogThresholdMs,\n      DEFAULT_SESSION_SYNC_TIMING_LOG_MS,\n    );\n    this._lastLoggedSessionSaveError = null;\n    this._heliosSessionAutosaveCleanups = [];\n    this._sessionThumbnailDirtySinceCapture = false;\n    this._lastSessionThumbnailCapturedAt = null;\n    this._lastAutosaveThumbnailAttemptAt = null;\n    this._lastUserInteractionAt = null;\n    this._lastSessionAutosyncAt = null;\n    this._positionDirtyVersion = 0;\n    this._recentPersistenceChanges = [];\n    this._registerDefaultStateEntries();\n    this.configure({\n      networkPersistence: options.networkPersistence,\n      positionPersistence: options.positionPersistence,\n    });\n    this._installHeliosSessionAutosaveListeners();\n  }\n\n  async getUnfinishedSessionId() {\n    return this.sessionStore?.getUnfinishedSessionId?.(this.workspaceId) ?? null;\n  }\n\n  async setUnfinishedSessionId(id) {\n    return this.sessionStore?.setUnfinishedSessionId?.(id, this.workspaceId) ?? (id ?? null);\n  }\n\n  setOverrideTrackingReady(ready = true) {\n    this.overrideTrackingReady = ready !== false;\n    this.states?.setOverrideTrackingReady?.(this.overrideTrackingReady);\n    return this.overrideTrackingReady;\n  }\n\n  _handleStateChangeForStorage(detail = {}) {\n    if (detail?.overrideChanged !== true) return;\n    if (detail.autosave === false) return;\n    if (detail.trackOverride === false && detail.overrideDelta?.deleted !== true) return;\n    this._queueStateOverrideDelta(detail);\n    const source = String(detail.source ?? detail.origin ?? '').toLowerCase();\n    const pendingPayloadSave = this._sessionAutosaveOptions?.includeNetwork === true\n      || this._sessionAutosaveOptions?.includePositions === true\n      || detail.includeNetwork === true\n      || detail.includePositions === true;\n    if (pendingPayloadSave && source === 'ui') this._lastUserInteractionAt = this._now();\n    this._scheduleSessionAutosave({\n      ...detail,\n      includeNetwork: detail.includeNetwork === true,\n      autosync: true,\n      captureThumbnail: Object.prototype.hasOwnProperty.call(detail, 'captureThumbnail')\n        ? detail.captureThumbnail\n        : 'auto',\n      snapshotLayoutRuntime: false,\n    });\n  }\n\n  _stateOverrideDeltaKeys(detail = {}) {\n    const keys = new Set();\n    const add = (value) => {\n      const key = normalizeKey(value);\n      if (key) keys.add(key);\n    };\n    const canonical = this.states.resolveKey?.(detail.key ?? detail.path ?? detail.requestedKey) ?? normalizeKey(detail.key ?? detail.path);\n    add(canonical);\n    add(detail.key);\n    add(detail.path);\n    add(detail.requestedKey);\n    add(this.states.preferredKey?.(canonical));\n    for (const alias of this.states.keyAliases?.get?.(canonical) ?? []) add(alias);\n    return Array.from(keys);\n  }\n\n  _queueStateOverrideDelta(detail = {}) {\n    const delta = detail.overrideDelta ?? null;\n    if (!delta || !detail.key) return;\n    const keys = this._stateOverrideDeltaKeys(detail);\n    const canonical = this.states.resolveKey?.(detail.key) ?? normalizeKey(detail.key);\n    const preferred = normalizeKey(this.states.preferredKey?.(canonical) ?? canonical);\n    for (const key of keys) {\n      this._pendingStateOverrideDeltas.set(key, { deleted: true });\n    }\n    if (delta.deleted !== true && preferred) {\n      this._pendingStateOverrideDeltas.set(preferred, {\n        deleted: false,\n        value: cloneSerializable(delta.value),\n      });\n    }\n  }\n\n  _registerDefaultStateEntries() {\n    this.states.register(this, '', {\n      'network.persistence.enabled': {\n        default: this.networkData.enabled !== false,\n        type: 'boolean',\n        scope: 'workspace',\n      },\n      'network.persistence.autosave': {\n        default: this.networkData.autosave === true,\n        type: 'boolean',\n        scope: 'workspace',\n      },\n      'positions.persistence.enabled': {\n        default: true,\n        type: 'boolean',\n        scope: 'workspace',\n      },\n      'positions.persistence.autosave': {\n        default: this.networkData.positionPersistence?.autosave === true,\n        type: 'boolean',\n        scope: 'workspace',\n      },\n      'preferences.autosave': {\n        default: false,\n        type: 'boolean',\n        scope: 'user',\n      },\n      'ui.theme': {\n        default: null,\n        type: 'string',\n        scope: 'user',\n      },\n      'ui.responsive.compactDockSide': {\n        default: null,\n        type: 'string',\n        scope: 'user',\n      },\n      'ui.responsive.preferredMode': {\n        default: null,\n        type: 'string',\n        scope: 'user',\n      },\n      'ui.responsive.lastViewportClass': {\n        default: null,\n        type: 'string',\n        scope: 'user',\n      },\n    });\n  }\n\n  configure(options = {}) {\n    const networkPersistence = options.networkPersistence && typeof options.networkPersistence === 'object'\n      ? options.networkPersistence\n      : {};\n    const positionPersistence = options.positionPersistence && typeof options.positionPersistence === 'object'\n      ? options.positionPersistence\n      : {};\n    this.networkData = {\n      ...this.networkData,\n      enabled: networkPersistence.enabled !== false,\n      autosave: Object.prototype.hasOwnProperty.call(networkPersistence, 'autosave')\n        ? networkPersistence.autosave === true\n        : this.networkData?.autosave === true,\n      positionPersistence: {\n        enabled: positionPersistence.enabled !== false,\n        autosave: Object.prototype.hasOwnProperty.call(positionPersistence, 'autosave')\n          ? positionPersistence.autosave === true\n          : this.networkData?.positionPersistence?.autosave === true,\n      },\n      format: typeof networkPersistence.format === 'string'\n        ? networkPersistence.format\n        : (this.networkData?.format ?? null),\n    };\n    if (Object.prototype.hasOwnProperty.call(networkPersistence, 'autosave')) {\n      this._setState('network.persistence.autosave', networkPersistence.autosave === true, {\n        source: 'config',\n        reason: 'network-persistence-config',\n        autosave: false,\n      });\n    }\n    if (Object.prototype.hasOwnProperty.call(networkPersistence, 'enabled')) {\n      this._setState('network.persistence.enabled', networkPersistence.enabled !== false, {\n        source: 'config',\n        reason: 'network-persistence-config',\n        autosave: false,\n      });\n    }\n    if (Object.prototype.hasOwnProperty.call(positionPersistence, 'autosave')) {\n      this._setState('positions.persistence.autosave', positionPersistence.autosave === true, {\n        source: 'config',\n        reason: 'positions-persistence-config',\n        autosave: false,\n      });\n    }\n    if (Object.prototype.hasOwnProperty.call(positionPersistence, 'enabled')) {\n      this._setState('positions.persistence.enabled', positionPersistence.enabled !== false, {\n        source: 'config',\n        reason: 'positions-persistence-config',\n        autosave: false,\n      });\n    }\n    this._emit('config', { reason: 'configure', status: this.persistenceStatus() });\n    return this.persistenceStatus();\n  }\n\n  getPreferences() {\n    return createDefaultPreferencesState({\n      theme: this.states.get('ui.theme', null),\n      autosave: this.states.get('preferences.autosave', false) === true,\n      responsive: {\n        compactDockSide: this.states.get('ui.responsive.compactDockSide', null),\n        preferredMode: this.states.get('ui.responsive.preferredMode', null),\n        lastViewportClass: this.states.get('ui.responsive.lastViewportClass', null),\n      },\n    });\n  }\n\n  async loadPreferences() {\n    return this.getPreferences();\n  }\n\n  async updatePreferences(patch = {}) {\n    const next = createDefaultPreferencesState(mergeDeepObject(this.getPreferences(), patch));\n    const writePreference = (key, value) => this._setState(key, value, {\n      scope: 'user',\n      source: 'preferences',\n      reason: 'preferences-update',\n    });\n    if (Object.prototype.hasOwnProperty.call(patch, 'autosave')) {\n      writePreference('preferences.autosave', next.autosave === true);\n    }\n    if (Object.prototype.hasOwnProperty.call(patch, 'theme')) {\n      writePreference('ui.theme', next.theme ?? null);\n    }\n    const responsivePatch = patch?.responsive && typeof patch.responsive === 'object'\n      ? patch.responsive\n      : {};\n    if (Object.prototype.hasOwnProperty.call(responsivePatch, 'compactDockSide')) {\n      writePreference('ui.responsive.compactDockSide', next.responsive.compactDockSide ?? null);\n    }\n    if (Object.prototype.hasOwnProperty.call(responsivePatch, 'preferredMode')) {\n      writePreference('ui.responsive.preferredMode', next.responsive.preferredMode ?? null);\n    }\n    if (Object.prototype.hasOwnProperty.call(responsivePatch, 'lastViewportClass')) {\n      writePreference('ui.responsive.lastViewportClass', next.responsive.lastViewportClass ?? null);\n    }\n    return next;\n  }\n\n  markNetworkDirty(reason = 'network-change') {\n    const alreadyDirty = this.networkData?.dirty === true\n      && this.networkData?.networkDirty === true\n      && this.networkData?.status === 'dirty';\n    if (alreadyDirty && this.autosyncDisabled === true) {\n      return this._lastPersistenceStatus ?? this.persistenceStatus();\n    }\n    const dirtyAt = this.networkData?.dirty === true && Number.isFinite(Number(this.networkData?.dirtyAt))\n      ? Number(this.networkData.dirtyAt)\n      : this._now();\n    this.networkData = {\n      ...this.networkData,\n      enabled: true,\n      status: 'dirty',\n      dirty: true,\n      networkDirty: true,\n      dirtyAt,\n      reason,\n    };\n    this._emit('change', { reason, status: this.persistenceStatus() });\n    this._scheduleSessionAutosave({\n      reason,\n      source: 'network',\n      includeNetwork: true,\n      autosync: true,\n      captureThumbnail: 'auto',\n      snapshotLayoutRuntime: false,\n    });\n    return this.persistenceStatus();\n  }\n\n  markPositionsDirty(reason = 'positions-change') {\n    this._positionDirtyVersion = (this._positionDirtyVersion + 1) % Number.MAX_SAFE_INTEGER;\n    if (this._positionDirtyVersion <= 0) this._positionDirtyVersion = 1;\n    const positionDirtyVersion = this._positionDirtyVersion;\n    const alreadyDirty = this.networkData?.dirty === true\n      && this.networkData?.positionsDirty === true\n      && this.networkData?.status === 'dirty';\n    if (alreadyDirty && this.autosyncDisabled === true) {\n      return this._lastPersistenceStatus ?? this.persistenceStatus();\n    }\n    const dirtyAt = this.networkData?.dirty === true && Number.isFinite(Number(this.networkData?.dirtyAt))\n      ? Number(this.networkData.dirtyAt)\n      : this._now();\n    this.networkData = {\n      ...this.networkData,\n      enabled: true,\n      status: 'dirty',\n      dirty: true,\n      positionsDirty: true,\n      dirtyAt,\n      reason,\n    };\n    this._emit('change', { reason, status: this.persistenceStatus() });\n    this._scheduleSessionAutosave({\n      reason,\n      source: 'positions',\n      includeNetwork: false,\n      includePositions: true,\n      positionDirtyVersion,\n      autosync: true,\n      captureThumbnail: 'auto',\n      snapshotLayoutRuntime: true,\n      layoutRuntime: {\n        includePositions: false,\n      },\n      debounceMs: DEFAULT_POSITION_AUTOSAVE_DEBOUNCE_MS,\n    });\n    return this.persistenceStatus();\n  }\n\n  async setSessionNickname(nickname, id = this.sessionId) {\n    const normalized = normalizeSessionNickname(nickname);\n    if (!this.capabilities.sessions || !id) return null;\n    const session = await this.getSession(id);\n    if (!session) return null;\n    session.payload.session.nickname = normalized;\n    session.payload.session.updatedAt = Date.now();\n    const envelope = createPersistenceEnvelope(PERSISTENCE_KINDS.session, session.payload);\n    envelope.id = session.payload.session.id;\n    await this.sessionStore?.put?.(envelope);\n    this.sessionSavedAt = envelopeUpdatedAt(envelope) ?? Date.now();\n    this._emit('change', { reason: 'session-nickname', sessionId: id, status: this.persistenceStatus() });\n    return envelope;\n  }\n\n  _setState(key, value, options = {}) {\n    const suppressStartupOverride = this.overrideTrackingReady === false\n      && !Object.prototype.hasOwnProperty.call(options, 'trackOverride')\n      && !isExplicitOverrideSource(options.source);\n    const writeOptions = {\n      ...options,\n      trackOverride: options.trackOverride ?? !suppressStartupOverride,\n    };\n    return this.states.set(key, value, writeOptions);\n  }\n\n  _estimatePositionPayloadByteLength() {\n    const explicitNodeCount = Number(this.helios?.network?.nodeCount);\n    if (Number.isFinite(explicitNodeCount) && explicitNodeCount > 0) {\n      return Math.floor(explicitNodeCount) * 3 * Float32Array.BYTES_PER_ELEMENT;\n    }\n    const renderNodeCount = Number(this.helios?._getRenderNetwork?.()?.nodeCount);\n    if (Number.isFinite(renderNodeCount) && renderNodeCount > 0) {\n      return Math.floor(renderNodeCount) * 3 * Float32Array.BYTES_PER_ELEMENT;\n    }\n    return null;\n  }\n\n  _estimateNetworkNodeCount() {\n    const counts = [\n      Number(this.helios?.network?.nodeCount),\n      Number(this.helios?._getRenderNetwork?.()?.nodeCount),\n    ].filter((value) => Number.isFinite(value) && value > 0);\n    return counts.length ? Math.max(...counts.map((value) => Math.floor(value))) : null;\n  }\n\n  _autosyncSizeLimitSkip(options = {}) {\n    if (options.autosync !== true) return null;\n    if (this.autosyncPayloadLimits?.enabled === false) return null;\n    if (options.includePositions === true) {\n      const limit = Number(this.autosyncPayloadLimits?.positionMaxBytes);\n      const byteLength = this._estimatePositionPayloadByteLength();\n      if (Number.isFinite(limit) && limit > 0 && Number.isFinite(byteLength) && byteLength > limit) {\n        return {\n          reason: 'size-limit',\n          scope: 'positions',\n          byteLength,\n          maxBytes: limit,\n          message: `Position autosync is disabled because the position payload is ${Math.ceil(byteLength / 1024)} KB, above the ${Math.ceil(limit / 1024)} KB autosync limit. Use manual Sync to save it.`,\n        };\n      }\n    }\n    if (options.includeNetwork === true) {\n      const limit = Number(this.autosyncPayloadLimits?.networkMaxNodes);\n      const nodeCount = this._estimateNetworkNodeCount();\n      if (Number.isFinite(limit) && limit > 0 && Number.isFinite(nodeCount) && nodeCount > limit) {\n        return {\n          reason: 'size-limit',\n          scope: 'network',\n          nodeCount,\n          maxNodes: limit,\n          message: `Network autosync is disabled because this network has ${nodeCount.toLocaleString()} nodes, above the ${limit.toLocaleString()} node autosync limit. Use manual Sync to save it.`,\n        };\n      }\n    }\n    return null;\n  }\n\n  _setAutosyncDisabled(skip = {}, options = {}) {\n    const reason = {\n      reason: skip.reason ?? 'disabled',\n      scope: skip.scope ?? 'session',\n      byteLength: Number.isFinite(skip.byteLength) ? Number(skip.byteLength) : null,\n      maxBytes: Number.isFinite(skip.maxBytes) ? Number(skip.maxBytes) : null,\n      nodeCount: Number.isFinite(skip.nodeCount) ? Number(skip.nodeCount) : null,\n      maxNodes: Number.isFinite(skip.maxNodes) ? Number(skip.maxNodes) : null,\n      message: skip.message ?? 'Auto sync is disabled for this session. Use manual Sync to save changes.',\n      disabledAt: this._now(),\n    };\n    this.autosyncDisabled = true;\n    this.autosyncDisabledReason = reason;\n    this.networkData = {\n      ...this.networkData,\n      autosyncDisabled: true,\n      autosyncDisabledReason: reason,\n      status: options.markDirty === true\n        ? 'dirty'\n        : (this.networkData.status ?? 'saved'),\n      dirty: this.networkData.dirty === true || options.markDirty === true,\n      dirtyAt: this.networkData.dirtyAt ?? (options.markDirty === true ? this._now() : null),\n      skipped: null,\n    };\n    this._setState('network.persistence.autosave', false, {\n      source: 'system',\n      reason: 'autosync-size-limit',\n      trackOverride: false,\n      autosave: false,\n      journal: false,\n    });\n    this._setState('positions.persistence.autosave', false, {\n      source: 'system',\n      reason: 'autosync-size-limit',\n      trackOverride: false,\n      autosave: false,\n      journal: false,\n    });\n    this._emit('change', { reason: 'autosync-size-limit', status: this.persistenceStatus(), skip: reason });\n    return reason;\n  }\n\n  _blockAutosyncForInvalidExplicitSession(reason = 'session-autosync-blocked') {\n    if (!this.explicitSessionInvalid) return false;\n    const errorMessage = this.sessionRestoreError\n      ?? (this.requestedSessionId\n        ? `Explicit session id \"${this.requestedSessionId}\" was not found.`\n        : 'Explicit session id was not found.');\n    if (this._sessionAutosaveTimer) {\n      clearTimeout(this._sessionAutosaveTimer);\n      this._sessionAutosaveTimer = null;\n    }\n    this._sessionAutosaveOptions = null;\n    const alreadyBlocked = this.networkData?.status === 'error'\n      && this.networkData?.remoteWarning === errorMessage\n      && this.networkData?.dirty === true;\n    this.networkData = {\n      ...this.networkData,\n      enabled: true,\n      status: 'error',\n      dirty: true,\n      dirtyAt: this.networkData?.dirtyAt ?? this._now(),\n      remoteWarning: errorMessage,\n      restoreError: errorMessage,\n    };\n    if (!alreadyBlocked) {\n      this._emit('change', {\n        reason,\n        sessionId: this.sessionId,\n        error: errorMessage,\n        status: this.persistenceStatus(),\n      });\n    }\n    return true;\n  }\n\n  _scheduleSessionAutosave(options = {}) {\n    if (!this.capabilities.sessions || !this.sessionId || !this.sessionStore) return;\n    if (options.autosync !== false && this._blockAutosyncForInvalidExplicitSession()) return;\n    this._markSessionThumbnailDirty();\n    const pending = this._sessionAutosaveOptions ?? {};\n    const nextOptions = mergeSessionAutosaveOptions(pending, options);\n    this._sessionAutosaveOptions = nextOptions;\n    const baseDelay = normalizeNonNegativeMs(options.sessionDebounceMs ?? options.debounceMs, 750);\n    const interactionAutosave = isUserInteractionDetail(options) && options.interactionAlreadyIdle !== true;\n    if (interactionAutosave) this._lastUserInteractionAt = this._now();\n    const delay = interactionAutosave\n      ? Math.max(baseDelay, this.autosyncInteractionIdleMs)\n      : baseDelay;\n    const keepExistingPayloadTimer = this._sessionAutosaveTimer\n      && (nextOptions.includeNetwork === true || nextOptions.includePositions === true)\n      && (pending.includeNetwork === true || pending.includePositions === true);\n    if (this._sessionAutosaveTimer && !keepExistingPayloadTimer) clearTimeout(this._sessionAutosaveTimer);\n    const dirtyAt = this.networkData?.dirty === true && Number.isFinite(Number(this.networkData?.dirtyAt))\n      ? Number(this.networkData.dirtyAt)\n      : this._now();\n    this.networkData = {\n      ...this.networkData,\n      status: this.networkData.status === 'idle' ? 'dirty' : this.networkData.status,\n      dirty: true,\n      dirtyAt,\n    };\n    const autosyncSkip = this._autosyncSizeLimitSkip(nextOptions);\n    if (autosyncSkip) {\n      this._sessionAutosaveOptions = null;\n      if (this._sessionAutosaveTimer) {\n        clearTimeout(this._sessionAutosaveTimer);\n        this._sessionAutosaveTimer = null;\n      }\n      this._setAutosyncDisabled(autosyncSkip, { markDirty: true });\n      return;\n    }\n    if (this.autosyncDisabled && options.autosync !== false) {\n      const alreadyReported = this.networkData?.autosyncDisabled === true;\n      this.networkData = {\n        ...this.networkData,\n        autosyncDisabled: true,\n        autosyncDisabledReason: this.autosyncDisabledReason,\n      };\n      if (!alreadyReported) {\n        this._emit('change', { reason: 'autosync-disabled', status: this.persistenceStatus() });\n      }\n      return;\n    }\n    if (!keepExistingPayloadTimer) {\n      this._sessionAutosaveTimer = setTimeout(() => this._runScheduledSessionAutosave(nextOptions), delay);\n    }\n  }\n\n  _isSessionSaveBusy() {\n    return this._sessionSaveInFlight.size > 0 || this._sessionSaveQueuedCount > 0;\n  }\n\n  _deferAutosaveUntilSessionSaveIdle(options = {}) {\n    this._sessionAutosaveOptions = mergeSessionAutosaveOptions(this._sessionAutosaveOptions ?? {}, options);\n    if (this._sessionAutosaveAfterSaveQueued) return;\n    this._sessionAutosaveAfterSaveQueued = true;\n    this._sessionSaveQueue.finally(() => {\n      this._sessionAutosaveAfterSaveQueued = false;\n      if (!this._sessionAutosaveOptions || this._sessionAutosaveTimer) return;\n      const flushOptions = this._sessionAutosaveOptions;\n      this._sessionAutosaveTimer = setTimeout(() => this._runScheduledSessionAutosave(flushOptions), 0);\n    });\n  }\n\n  _scheduleInteractionSessionAutosave(event) {\n    if (!this.capabilities.sessions || !this.sessionId || !this.sessionStore) return;\n    const now = this._now();\n    const detail = event?.detail && typeof event.detail === 'object' ? event.detail : {};\n    const userInteraction = isUserInteractionDetail(detail);\n    if (!userInteraction) return;\n    this._lastUserInteractionAt = now;\n    const dirtyAt = this.networkData?.dirty === true && Number.isFinite(Number(this.networkData?.dirtyAt))\n      ? Number(this.networkData.dirtyAt)\n      : now;\n    this.networkData = {\n      ...this.networkData,\n      status: this.networkData.status === 'idle' || this.networkData.status === 'saved'\n        ? 'dirty'\n        : this.networkData.status,\n      dirty: true,\n      dirtyAt,\n      reason: event?.type ?? this.networkData.reason ?? 'helios-change',\n    };\n    this._emit('change', { reason: event?.type ?? 'helios-change', status: this.persistenceStatus() });\n    const pending = this._pendingInteractionAutosaveOptions ?? {};\n    const nextOptions = {\n      ...pending,\n      source: 'helios',\n      reason: event?.type ?? pending.reason ?? 'helios-change',\n      debounceMs: 0,\n      includeNetwork: false,\n      includePositions: false,\n      captureThumbnail: mergeCaptureThumbnailMode(pending.captureThumbnail, 'auto'),\n      snapshotLayoutRuntime: false,\n      interactionAlreadyIdle: true,\n      autosync: true,\n    };\n    this._pendingInteractionAutosaveOptions = nextOptions;\n    if (this._interactionAutosaveTimer) clearTimeout(this._interactionAutosaveTimer);\n    const idleDelay = Math.max(0, this.autosyncInteractionIdleMs ?? DEFAULT_AUTOSYNC_INTERACTION_IDLE_MS);\n    this._interactionAutosaveTimer = setTimeout(() => {\n      this._interactionAutosaveTimer = null;\n      const flushOptions = this._pendingInteractionAutosaveOptions ?? nextOptions;\n      this._pendingInteractionAutosaveOptions = null;\n      this._scheduleSessionAutosave(flushOptions);\n    }, idleDelay);\n  }\n\n  _sessionAutosaveDeferDelay(options = {}) {\n    const now = this._now();\n    const idleMs = this.autosyncInteractionIdleMs ?? 0;\n    const rateDelay = () => {\n      if (options.autosync === false) return 0;\n      const minIntervalMs = this.autosyncMinIntervalMs ?? 0;\n      if (minIntervalMs <= 0 || !Number.isFinite(this._lastSessionAutosyncAt)) return 0;\n      const remaining = minIntervalMs - (now - this._lastSessionAutosyncAt);\n      return remaining > 0 ? remaining : 0;\n    };\n    const payloadPersistence = options.includeNetwork === true || options.includePositions === true;\n    if (payloadPersistence) {\n      if (this._isSessionUserInteractionActive(options)) {\n        this._lastUserInteractionAt = now;\n        return Math.max(idleMs, 250);\n      }\n      if (idleMs > 0 && Number.isFinite(this._lastUserInteractionAt)) {\n        const remaining = idleMs - (now - this._lastUserInteractionAt);\n        if (remaining > 0) return remaining;\n      }\n      return rateDelay();\n    }\n    if (this._isSessionThumbnailInteractionActive(options)) {\n      this._lastUserInteractionAt = now;\n      return Math.max(idleMs, 250);\n    }\n    if (idleMs > 0 && Number.isFinite(this._lastUserInteractionAt)) {\n      const remaining = idleMs - (now - this._lastUserInteractionAt);\n      if (remaining > 0) return remaining;\n    }\n    return rateDelay();\n  }\n\n  _consumePendingStateOverrideDeltas() {\n    const deltas = new Map(this._pendingStateOverrideDeltas);\n    this._pendingStateOverrideDeltas.clear();\n    return deltas;\n  }\n\n  _restorePendingStateOverrideDeltas(deltas) {\n    for (const [key, delta] of deltas ?? []) {\n      this._pendingStateOverrideDeltas.set(key, delta);\n    }\n  }\n\n  _sessionErrorMessage(error) {\n    if (error == null) return 'Unknown storage error';\n    if (typeof error === 'string') return error;\n    return error.message ?? String(error);\n  }\n\n  _recordSessionRestoreFailure(message, detail = {}) {\n    const errorMessage = this._sessionErrorMessage(message);\n    this.sessionRestoreError = errorMessage;\n    this.networkData = {\n      ...this.networkData,\n      status: 'error',\n      remoteWarning: errorMessage,\n      restoreError: errorMessage,\n    };\n    this._emit('change', {\n      reason: detail.reason ?? 'session-restore-error',\n      sessionId: detail.sessionId ?? this.sessionId ?? null,\n      error: errorMessage,\n      status: this.persistenceStatus(),\n    });\n    console.error('[HeliosStorage] Session restore failed', {\n      error: errorMessage,\n      sessionId: detail.sessionId ?? this.sessionId ?? null,\n    });\n    return errorMessage;\n  }\n\n  _isStalePositionAutosave(options = {}) {\n    if (options.autosync !== true || options.includePositions !== true) return false;\n    const requestedVersion = Number(options.positionDirtyVersion);\n    return Number.isFinite(requestedVersion)\n      && requestedVersion > 0\n      && requestedVersion < this._positionDirtyVersion;\n  }\n\n  _skipStalePositionAutosave(options = {}) {\n    const requestedVersion = Number(options.positionDirtyVersion);\n    const currentVersion = this._positionDirtyVersion;\n    this._recordPersistenceChange('session-position-save-coalesced', {\n      id: options.id ?? this.sessionId ?? null,\n      reason: options.reason ?? null,\n      requestedVersion: Number.isFinite(requestedVersion) ? requestedVersion : null,\n      currentVersion,\n    });\n    if (this._sessionSaveQueuedCount <= 0 && !this._sessionAutosaveOptions && !this._sessionAutosaveTimer) {\n      const nextOptions = mergeSessionAutosaveOptions({}, {\n        ...options,\n        reason: 'position-autosave-coalesced',\n        includePositions: true,\n        autosync: true,\n        positionDirtyVersion: currentVersion,\n        captureThumbnail: options.captureThumbnail ?? 'auto',\n      });\n      this._sessionAutosaveOptions = nextOptions;\n      this._sessionAutosaveTimer = setTimeout(() => this._runScheduledSessionAutosave(nextOptions), 0);\n    }\n    return null;\n  }\n\n  _refreshStalePositionAutosave(options = {}) {\n    const requestedVersion = Number(options.positionDirtyVersion);\n    const currentVersion = this._positionDirtyVersion;\n    this._recordPersistenceChange('session-position-save-refreshed', {\n      id: options.id ?? this.sessionId ?? null,\n      reason: options.reason ?? null,\n      requestedVersion: Number.isFinite(requestedVersion) ? requestedVersion : null,\n      currentVersion,\n    });\n    return {\n      ...options,\n      positionDirtyVersion: currentVersion,\n    };\n  }\n\n  _beginSessionSave(options = {}) {\n    const id = ++this._sessionSaveSequence;\n    const startedAt = this._now();\n    const entry = {\n      id,\n      startedAt,\n      reason: options.reason ?? null,\n      autosync: options.autosync === true,\n      includeNetwork: options.includeNetwork === true,\n      includePositions: options.includePositions === true,\n      warningTimer: null,\n    };\n    this._sessionSaveInFlight.set(id, entry);\n    this.sessionSaveWarning = null;\n    this.networkData = {\n      ...this.networkData,\n      enabled: true,\n      status: 'syncing',\n      syncing: true,\n      syncStartedAt: startedAt,\n      remoteWarning: null,\n    };\n    this._emit('change', {\n      reason: 'session-save-start',\n      sessionId: this.sessionId,\n      save: { ...entry, warningTimer: undefined },\n      status: this.persistenceStatus(),\n    });\n    if (this._sessionSaveWarningMs > 0) {\n      entry.warningTimer = setTimeout(() => {\n        if (!this._sessionSaveInFlight.has(id)) return;\n        const elapsedMs = Math.max(0, this._now() - startedAt);\n        this.sessionSaveWarning = `Session sync is still running after ${Math.round(elapsedMs / 1000)}s.`;\n        console.warn('[HeliosStorage] Session sync is taking longer than expected', {\n          sessionId: this.sessionId,\n          reason: entry.reason,\n          autosync: entry.autosync,\n          elapsedMs,\n        });\n        this._emit('change', {\n          reason: 'session-save-warning',\n          sessionId: this.sessionId,\n          warning: this.sessionSaveWarning,\n          elapsedMs,\n          status: this.persistenceStatus(),\n        });\n      }, this._sessionSaveWarningMs);\n    }\n    return id;\n  }\n\n  _finishSessionSave(id, error = null) {\n    const entry = this._sessionSaveInFlight.get(id) ?? null;\n    if (entry?.warningTimer) clearTimeout(entry.warningTimer);\n    this._sessionSaveInFlight.delete(id);\n    const errorMessage = error ? this._sessionErrorMessage(error) : null;\n    if (errorMessage) {\n      this.sessionSaveError = errorMessage;\n      this.sessionSaveWarning = null;\n      this.networkData = {\n        ...this.networkData,\n        status: 'error',\n        syncing: false,\n        remoteWarning: errorMessage,\n      };\n      const logKey = `${this.sessionId ?? ''}:${errorMessage}`;\n      if (this._lastLoggedSessionSaveError !== logKey) {\n        this._lastLoggedSessionSaveError = logKey;\n        console.error('[HeliosStorage] Session sync failed', {\n          error,\n          sessionId: this.sessionId,\n          reason: entry?.reason ?? null,\n          autosync: entry?.autosync === true,\n        });\n      }\n      this._emit('change', {\n        reason: 'session-save-error',\n        sessionId: this.sessionId,\n        error: errorMessage,\n        status: this.persistenceStatus(),\n      });\n      return;\n    }\n    if (this._sessionSaveInFlight.size === 0) {\n      this.sessionSaveWarning = null;\n      this.networkData = {\n        ...this.networkData,\n        syncing: false,\n      };\n      this._emit('change', {\n        reason: 'session-save-finish',\n        sessionId: this.sessionId,\n        status: this.persistenceStatus(),\n      });\n    }\n    if (entry?.autosync === true) this._lastSessionAutosyncAt = this._now();\n  }\n\n  async _withSessionSaveTracking(operation, options = {}) {\n    const id = this._beginSessionSave(options);\n    try {\n      const result = await operation();\n      this._finishSessionSave(id);\n      return result;\n    } catch (error) {\n      this._finishSessionSave(id, error);\n      throw error;\n    }\n  }\n\n  _enqueueSessionSave(operation, options = {}) {\n    this._sessionSaveQueuedCount += 1;\n    if (!Number.isFinite(options._queuedAtMs)) options._queuedAtMs = syncTimingNowMs();\n    const run = async () => {\n      this._sessionSaveQueuedCount = Math.max(0, this._sessionSaveQueuedCount - 1);\n      return this._withSessionSaveTracking(operation, options);\n    };\n    const queued = this._sessionSaveQueue.catch(() => null).then(run);\n    this._sessionSaveQueue = queued.catch(() => null);\n    return queued;\n  }\n\n  pendingStateChangeCount() {\n    return this._pendingStateOverrideDeltas?.size ?? 0;\n  }\n\n  hasPendingStateChanges() {\n    return this.pendingStateChangeCount() > 0;\n  }\n\n  acknowledgeSavedSnapshot(reason = 'save-acknowledged', options = {}) {\n    if (options.state !== false) this._pendingStateOverrideDeltas.clear();\n    const now = this._now();\n    const clearNetwork = options.network !== false;\n    const clearPositions = options.positions !== false;\n    const networkDirty = clearNetwork ? false : this.networkData?.networkDirty === true;\n    const positionsDirty = clearPositions ? false : this.networkData?.positionsDirty === true;\n    const dirty = networkDirty || positionsDirty;\n    this.networkData = {\n      ...this.networkData,\n      status: dirty ? 'dirty' : 'saved',\n      dirty,\n      networkDirty,\n      positionsDirty,\n      savedAt: now,\n      dirtyAt: dirty ? (this.networkData?.dirtyAt ?? now) : null,\n      reason,\n    };\n    this._emit('change', { reason, status: this.persistenceStatus() });\n    return this.persistenceStatus();\n  }\n\n  _snapshotLiveSessionRuntime(options = {}) {\n    const helios = this.helios;\n    if (!helios) return {};\n    const readState = (key, fallback = null) => {\n      const entry = this.states?.entry?.(key);\n      if (!entry) return fallback;\n      const value = typeof entry.getter === 'function'\n        ? entry.getter()\n        : this.states.get(key, fallback);\n      return value == null ? fallback : cloneSerializable(value);\n    };\n    const cameraOptions = options.camera ?? {};\n    let cameraState = readState('camera.pose');\n    if (!cameraState) {\n      if (typeof helios._snapshotCameraState === 'function') {\n        cameraState = helios._snapshotCameraState(cameraOptions);\n      } else if (typeof helios.cameraPose === 'function') {\n        cameraState = helios.cameraPose();\n        if (cameraState && cameraOptions.includeViewport !== true) delete cameraState.viewport;\n      }\n    }\n    let cameraControlState = null;\n    const cameraControlEntries = typeof this.states?.entriesFor === 'function'\n      ? this.states.entriesFor('camera.controls')\n      : [];\n    if (cameraControlEntries.length > 0) {\n      cameraControlState = {};\n      for (const [key] of cameraControlEntries) {\n        const suffix = key.startsWith('camera.controls.')\n          ? key.slice('camera.controls.'.length)\n          : '';\n        if (!suffix) continue;\n        const entry = this.states.entry(key);\n        const value = typeof entry?.getter === 'function'\n          ? entry.getter()\n          : this.states.get(key);\n        cameraControlState[suffix] = cloneSerializable(value);\n      }\n    }\n    if (!cameraControlState) {\n      if (typeof helios._snapshotCameraControlState === 'function') {\n        cameraControlState = helios._snapshotCameraControlState();\n      } else if (typeof helios.cameraControls === 'function') {\n        cameraControlState = helios.cameraControls();\n      }\n    }\n    let layoutRuntimeState = readState('layout.runtime.state');\n    if (options.includeLayoutRuntime !== false && typeof helios.snapshotLayoutRuntimeState === 'function') {\n      layoutRuntimeState = layoutRuntimeState ?? helios.snapshotLayoutRuntimeState({\n        includePositions: false,\n        ...(options.layoutRuntime ?? {}),\n      });\n    }\n    return {\n      cameraState: cameraState ? cloneSerializable(cameraState) : null,\n      cameraControlState: cameraControlState ? cloneSerializable(cameraControlState) : null,\n      layoutRuntimeState: layoutRuntimeState ? cloneSerializable(layoutRuntimeState) : null,\n    };\n  }\n\n  _refreshVisualizationSessionRuntime(visualizationState, options = {}) {\n    if (!visualizationState || typeof visualizationState !== 'object') return visualizationState;\n    visualizationState.payload = visualizationState.payload && typeof visualizationState.payload === 'object'\n      ? visualizationState.payload\n      : {};\n    const runtime = this._snapshotLiveSessionRuntime(options);\n    if (runtime.cameraState) visualizationState.payload.cameraState = runtime.cameraState;\n    if (runtime.cameraControlState) visualizationState.payload.cameraControlState = runtime.cameraControlState;\n    if (runtime.layoutRuntimeState) visualizationState.payload.layoutRuntimeState = runtime.layoutRuntimeState;\n    return visualizationState;\n  }\n\n  async _saveIncrementalSessionState(options = {}, deltas = new Map()) {\n    if (!this.capabilities.sessions || !this.sessionId || !this.sessionStore || deltas.size <= 0) return null;\n    const id = String(options.id ?? this.sessionId);\n    const existingRecord = await this.sessionStore.get?.(id, { hydrateNetworkData: false });\n    if (!existingRecord) {\n      return this._saveSessionOperation({\n        ...options,\n        id,\n        includeNetwork: false,\n        captureThumbnail: options.captureThumbnail === true ? true : false,\n        snapshotLayoutRuntime: false,\n      });\n    }\n    const envelope = this.deserializeSessionSnapshot(existingRecord);\n    const payload = cloneSerializable(envelope?.payload ?? {});\n    const now = Date.now();\n    payload.session = {\n      ...(payload.session ?? {}),\n      id,\n      updatedAt: Number.isFinite(options.updatedAt) ? Number(options.updatedAt) : now,\n      workspaceId: this.workspaceId,\n      unfinished: options.unfinished !== false,\n      status: options.status ?? payload.session?.status ?? 'active',\n    };\n    const visualizationState = payload.visualizationState && typeof payload.visualizationState === 'object'\n      ? payload.visualizationState\n      : createPersistenceEnvelope(PERSISTENCE_KINDS.visualization, {\n          storageState: this.serializeSnapshot(options.storage ?? {}),\n        });\n    visualizationState.payload = visualizationState.payload && typeof visualizationState.payload === 'object'\n      ? visualizationState.payload\n      : {};\n    const storageState = visualizationState.payload.storageState && typeof visualizationState.payload.storageState === 'object'\n      ? visualizationState.payload.storageState\n      : this.serializeSnapshot(options.storage ?? {});\n    storageState.state = storageState.state && typeof storageState.state === 'object'\n      ? storageState.state\n      : { schema: 'helios-web.state', version: 1, overrides: {} };\n    storageState.state.overrides = storageState.state.overrides && typeof storageState.state.overrides === 'object'\n      ? storageState.state.overrides\n      : {};\n    delete storageState.state.values;\n    if (options.includeJournal !== true) delete storageState.state.journal;\n    visualizationState.payload.overrides = visualizationState.payload.overrides && typeof visualizationState.payload.overrides === 'object'\n      ? visualizationState.payload.overrides\n      : {};\n    for (const [key, delta] of deltas) {\n      if (!key) continue;\n      if (delta?.deleted === true) {\n        delete storageState.state.overrides[key];\n        delete visualizationState.payload.overrides[key];\n      } else {\n        const value = cloneSerializable(delta.value);\n        storageState.state.overrides[key] = value;\n        visualizationState.payload.overrides[key] = cloneSerializable(value);\n      }\n    }\n    this._refreshVisualizationSessionRuntime(visualizationState, {\n      ...options,\n      layoutRuntime: {\n        includePositions: false,\n        ...(options.layoutRuntime ?? {}),\n      },\n    });\n    visualizationState.payload.storageState = storageState;\n    payload.visualizationState = visualizationState;\n    payload.thumbnail = await this._resolveSessionSnapshotThumbnail(options, envelope);\n    const next = createPersistenceEnvelope(PERSISTENCE_KINDS.session, payload, {\n      source: 'helios.storage',\n      incremental: true,\n    });\n    next.id = id;\n    next.payload.session.bytes = sessionStoredByteStats(next).bytes;\n    await this.sessionStore.put?.(next);\n    this._recordPersistenceChange('session-incremental-state-save', {\n      id,\n      deltaCount: deltas.size,\n      reason: options.reason ?? null,\n    });\n    this.sessionSavedAt = envelopeUpdatedAt(next) ?? now;\n    this.sessionSaveError = null;\n    this.sessionRestoreError = null;\n    this.sessionSaveWarning = null;\n    const legacyNetworkDirty = this.networkData?.networkDirty == null\n      && this.networkData?.dirty === true\n      && this.networkData?.positionsDirty !== true;\n    const networkStillDirty = this.networkData?.networkDirty === true || legacyNetworkDirty;\n    const positionsStillDirty = this.networkData?.positionsDirty === true;\n    const dirtyAfterSave = networkStillDirty || positionsStillDirty;\n    const previousNetworkSavedAt = this.networkData?.savedAt ?? null;\n    this.networkData = {\n      ...this.networkData,\n      enabled: true,\n      status: dirtyAfterSave ? 'dirty' : 'saved',\n      dirty: dirtyAfterSave,\n      networkDirty: networkStillDirty,\n      positionsDirty: positionsStillDirty,\n      dirtyAt: dirtyAfterSave ? (this.networkData?.dirtyAt ?? now) : null,\n      savedAt: dirtyAfterSave ? previousNetworkSavedAt : this.sessionSavedAt,\n      format: payload.networkData?.format ?? this.networkData.format ?? null,\n      remoteWarning: null,\n      restoreError: null,\n      syncing: false,\n    };\n    await this.setUnfinishedSessionId(next.payload?.session?.unfinished === false ? null : id);\n    this._emit('change', { reason: 'session-state-delta-save', sessionId: id, status: this.persistenceStatus() });\n    return next;\n  }\n\n  _runScheduledSessionAutosave(options = {}) {\n    this._sessionAutosaveTimer = null;\n    const flushOptions = this._sessionAutosaveOptions ?? options;\n    this._sessionAutosaveOptions = null;\n    if (flushOptions.autosync !== false && this._blockAutosyncForInvalidExplicitSession()) return;\n    const deferDelay = this._sessionAutosaveDeferDelay(flushOptions);\n    if (deferDelay > 0) {\n      this._sessionAutosaveOptions = flushOptions;\n      this._sessionAutosaveTimer = setTimeout(() => this._runScheduledSessionAutosave(flushOptions), deferDelay);\n      return;\n    }\n    const autosyncSkip = this._autosyncSizeLimitSkip(flushOptions);\n    if (autosyncSkip) {\n      this._setAutosyncDisabled(autosyncSkip, { markDirty: true });\n      return;\n    }\n    if (this._isSessionSaveBusy()) {\n      this._deferAutosaveUntilSessionSaveIdle(flushOptions);\n      return;\n    }\n    const stateDeltas = this._consumePendingStateOverrideDeltas();\n    const canWriteIncrementalState = stateDeltas.size > 0\n      && flushOptions.includeNetwork !== true\n      && flushOptions.includePositions !== true\n      && flushOptions.snapshotLayoutRuntime !== true;\n    const savePromise = canWriteIncrementalState\n      ? this._enqueueSessionSave(() => this._saveIncrementalSessionState({\n        id: this.sessionId,\n        reason: flushOptions.reason ?? 'storage-autosave',\n        captureThumbnail: flushOptions.captureThumbnail === true\n          ? true\n          : (flushOptions.captureThumbnail === 'auto' ? 'auto' : false),\n      }, stateDeltas), flushOptions)\n      : this.saveSession({\n        id: this.sessionId,\n        reason: flushOptions.reason ?? 'storage-autosave',\n        autosync: flushOptions.autosync === true,\n        includeNetwork: flushOptions.includeNetwork === true,\n        includePositions: flushOptions.includePositions === true,\n        positionDirtyVersion: flushOptions.positionDirtyVersion,\n        captureThumbnail: flushOptions.captureThumbnail === true\n          ? true\n          : (flushOptions.captureThumbnail === 'auto' ? 'auto' : false),\n        snapshotLayoutRuntime: flushOptions.snapshotLayoutRuntime === true,\n        layoutRuntime: flushOptions.layoutRuntime,\n        networkFormat: flushOptions.networkFormat ?? flushOptions.network?.format ?? flushOptions.networkPersistence?.format,\n        fullVisualizationState: flushOptions.fullVisualizationState === true,\n      });\n    savePromise.catch((error) => {\n      if (canWriteIncrementalState) this._restorePendingStateOverrideDeltas(stateDeltas);\n      const errorMessage = this._sessionErrorMessage(error);\n      this._emit('change', { reason: 'session-autosave-error', error: errorMessage, status: this.persistenceStatus() });\n    });\n  }\n\n  _createSessionSyncTiming(options = {}) {\n    if (options.collectTiming === false || options.syncTiming === false) return null;\n    return {\n      id: ++this._sessionSyncTimingSequence,\n      startedAtMs: syncTimingNowMs(),\n      queuedAtMs: Number.isFinite(options._queuedAtMs) ? Number(options._queuedAtMs) : null,\n      reason: options.reason ?? null,\n      autosync: options.autosync === true,\n      includeNetwork: options.includeNetwork !== false,\n      includePositions: options.includePositions === true,\n      positionDirtyVersion: Number.isFinite(Number(options.positionDirtyVersion))\n        ? Number(options.positionDirtyVersion)\n        : null,\n      steps: [],\n      finished: false,\n    };\n  }\n\n  _recordSessionSyncStep(timing, name, startedAtMs, detail = {}) {\n    if (!timing || timing.finished) return null;\n    const step = {\n      name,\n      ms: roundTimingMs(syncTimingNowMs() - startedAtMs),\n      ...cloneSerializable(detail),\n    };\n    timing.steps.push(step);\n    return step;\n  }\n\n  _timeSessionSync(timing, name, detail, operation) {\n    if (typeof operation !== 'function') return operation;\n    if (!timing) return operation();\n    const startedAtMs = syncTimingNowMs();\n    try {\n      const result = operation();\n      this._recordSessionSyncStep(timing, name, startedAtMs, detail);\n      return result;\n    } catch (error) {\n      this._recordSessionSyncStep(timing, name, startedAtMs, {\n        ...detail,\n        error: this._sessionErrorMessage(error),\n      });\n      throw error;\n    }\n  }\n\n  async _timeSessionSyncAsync(timing, name, detail, operation) {\n    if (typeof operation !== 'function') return operation;\n    if (!timing) return await operation();\n    const startedAtMs = syncTimingNowMs();\n    try {\n      const result = await operation();\n      this._recordSessionSyncStep(timing, name, startedAtMs, detail);\n      return result;\n    } catch (error) {\n      this._recordSessionSyncStep(timing, name, startedAtMs, {\n        ...detail,\n        error: this._sessionErrorMessage(error),\n      });\n      throw error;\n    }\n  }\n\n  _finishSessionSyncTiming(timing, options = {}, detail = {}) {\n    if (!timing || timing.finished) return null;\n    timing.finished = true;\n    const totalMs = roundTimingMs(syncTimingNowMs() - timing.startedAtMs);\n    const queueWaitMs = Number.isFinite(timing.queuedAtMs)\n      ? roundTimingMs(timing.startedAtMs - timing.queuedAtMs)\n      : null;\n    const summary = {\n      syncId: timing.id,\n      id: options.id ?? this.sessionId ?? null,\n      reason: options.reason ?? timing.reason,\n      autosync: options.autosync === true,\n      includeNetwork: options.includeNetwork !== false,\n      includePositions: options.includePositions === true,\n      positionDirtyVersion: timing.positionDirtyVersion,\n      currentPositionDirtyVersion: this._positionDirtyVersion,\n      totalMs,\n      queueWaitMs,\n      result: detail.result ?? 'saved',\n      steps: timing.steps.map((step) => cloneSerializable(step)),\n    };\n    if (detail.error) summary.error = this._sessionErrorMessage(detail.error);\n    this._recordPersistenceChange('session-sync-timing', summary);\n    const thresholdMs = normalizeNonNegativeMs(\n      options.syncTimingLogThresholdMs ?? this.sessionSyncTimingLogThresholdMs,\n      DEFAULT_SESSION_SYNC_TIMING_LOG_MS,\n    );\n    const shouldLog = this.sessionSyncTimingLog !== false\n      && options.logTiming !== false\n      && totalMs >= thresholdMs\n      && (\n        options.logTiming === true\n        || summary.includeNetwork\n        || summary.includePositions\n        || summary.result !== 'saved'\n      );\n    if (shouldLog && typeof console !== 'undefined' && typeof console.info === 'function') {\n      console.info('[HeliosStorage] Session sync timing', summary);\n    }\n    return summary;\n  }\n\n  _recordPersistenceChange(type, detail = {}) {\n    const timestamp = this._now();\n    this._recentPersistenceChanges.push({\n      timestamp,\n      type,\n      ...cloneSerializable(detail),\n    });\n    const cutoff = timestamp - (10 * 60 * 1000);\n    while (this._recentPersistenceChanges.length > 0 && this._recentPersistenceChanges[0].timestamp < cutoff) {\n      this._recentPersistenceChanges.shift();\n    }\n    const max = 1000;\n    if (this._recentPersistenceChanges.length > max) {\n      this._recentPersistenceChanges.splice(0, this._recentPersistenceChanges.length - max);\n    }\n  }\n\n  debugStats(options = {}) {\n    const windowMs = Number.isFinite(options.windowMs) ? Math.max(0, Number(options.windowMs)) : 5 * 60 * 1000;\n    const cutoff = this._now() - windowMs;\n    const includeRecent = options.includeRecent !== false;\n    const includeKeys = options.includeKeys !== false;\n    const includeNetworkData = options.includeNetworkData !== false;\n    let persistenceChangeCount = 0;\n    const persistenceChanges = includeRecent ? [] : null;\n    for (const entry of this._recentPersistenceChanges) {\n      if (entry.timestamp < cutoff) continue;\n      persistenceChangeCount += 1;\n      if (persistenceChanges) persistenceChanges.push(entry);\n    }\n    const stateStats = this.states?.debugStats?.({ windowMs, includeRecent, includeKeys }) ?? {\n      windowMs,\n      trackedStateCount: this.states?.overrideKeys?.().length ?? 0,\n      trackedKeys: includeKeys ? (this.states?.overrideKeys?.() ?? []) : [],\n      stateChangeCount: 0,\n      uiChangeCount: 0,\n      recentChanges: [],\n    };\n    const stats = {\n      ...stateStats,\n      windowMs,\n      persistenceChangeCount,\n      recentPersistenceChanges: includeRecent\n        ? persistenceChanges.map((entry) => cloneSerializable(entry))\n        : [],\n      sessionId: this.sessionId ?? null,\n      networkStatus: this.networkData?.status ?? null,\n    };\n    if (includeNetworkData) stats.networkData = cloneSerializable(this.networkData);\n    return stats;\n  }\n\n  _installHeliosSessionAutosaveListeners() {\n    const helios = this.helios;\n    if (!helios) return;\n    const schedule = (event) => {\n      this._scheduleInteractionSessionAutosave(event);\n    };\n    for (const type of ['camera:move', 'camera:control-change']) {\n      if (typeof helios.on === 'function') {\n        try {\n          const unsubscribe = helios.on(type, schedule);\n          if (typeof unsubscribe === 'function') this._heliosSessionAutosaveCleanups.push(unsubscribe);\n          continue;\n        } catch (error) {\n          warnOnce(\n            this,\n            `autosave-listener:on:${type}`,\n            `[HeliosStorage] Failed to subscribe to \"${type}\" through helios.on; trying addEventListener fallback.`,\n            { error },\n          );\n        }\n      }\n      if (typeof helios.addEventListener === 'function') {\n        try {\n          helios.addEventListener(type, schedule);\n          this._heliosSessionAutosaveCleanups.push(() => helios.removeEventListener(type, schedule));\n        } catch (error) {\n          warnOnce(\n            this,\n            `autosave-listener:addEventListener:${type}`,\n            `[HeliosStorage] Failed to subscribe to \"${type}\" autosave events.`,\n            { error },\n          );\n        }\n      }\n    }\n  }\n\n  recordPortableState(path, value, options = {}) {\n    return this._setState(path, value, {\n      scope: options.scope ?? 'network',\n      source: options.source ?? 'storage',\n      reason: options.reason ?? 'portable-state',\n      autosave: options.autosave,\n    });\n  }\n\n  status() {\n    return this.persistenceStatus();\n  }\n\n  persistenceStatus() {\n    const syncing = this._sessionSaveInFlight.size > 0;\n    const oldestSave = syncing\n      ? Array.from(this._sessionSaveInFlight.values()).sort((a, b) => a.startedAt - b.startedAt)[0]\n      : null;\n    const lastError = this.sessionSaveError ?? this.sessionRestoreError ?? null;\n    const status = {\n      type: this.type,\n      capabilities: { ...this.capabilities },\n      workspaceId: this.workspaceId,\n      sessionId: this.sessionId,\n      requestedSessionId: this.requestedSessionId,\n      explicitSessionInvalid: this.explicitSessionInvalid,\n      overrideCount: this.states.overrideKeys().length,\n      dirtyState: this.states.dirtyState(),\n      syncing,\n      lastError,\n      lastWarning: this.sessionSaveWarning,\n      networkData: cloneSerializable({\n        ...this.networkData,\n        status: syncing ? 'syncing' : this.networkData.status,\n        syncing,\n        syncWarning: this.sessionSaveWarning,\n      }),\n      sessionSync: {\n        status: syncing ? 'syncing' : (lastError ? 'error' : (this.sessionSavedAt ? 'saved' : 'idle')),\n        savedAt: this.sessionSavedAt,\n        error: lastError,\n        warning: this.sessionSaveWarning,\n        pending: syncing,\n        startedAt: oldestSave?.startedAt ?? null,\n        reason: oldestSave?.reason ?? null,\n      },\n    };\n    this._lastPersistenceStatus = status;\n    return status;\n  }\n\n  serializeSnapshot(options = {}) {\n    return {\n      schema: 'helios-web.storage',\n      version: 1,\n      type: this.type,\n      workspaceId: this.workspaceId,\n      sessionId: this.sessionId,\n      state: this.states.snapshot({\n        aliases: options.aliases ?? 'preferred',\n        includeJournal: options.includeJournal === true,\n      }),\n      network: options.includeNetwork === true && this.persistNetwork\n        ? this.helios?.serializeNetwork?.(options.network ?? {})\n        : null,\n      metadata: {\n        createdAt: Date.now(),\n        source: 'helios.storage',\n      },\n    };\n  }\n\n  _markSessionThumbnailDirty() {\n    this._sessionThumbnailDirtySinceCapture = true;\n  }\n\n  _recordSessionThumbnailCaptured(thumbnail) {\n    if (!thumbnail) return;\n    const capturedAt = Number.isFinite(Number(thumbnail.capturedAt))\n      ? Number(thumbnail.capturedAt)\n      : this._now();\n    this._lastSessionThumbnailCapturedAt = capturedAt;\n    this._sessionThumbnailDirtySinceCapture = false;\n  }\n\n  _hasAutosaveInteractionIdleElapsed(now = this._now()) {\n    const idleMs = this.autosyncInteractionIdleMs ?? 0;\n    if (idleMs <= 0 || !Number.isFinite(this._lastUserInteractionAt)) return true;\n    return now - this._lastUserInteractionAt >= idleMs;\n  }\n\n  _isSessionThumbnailInteractionActive(options = {}) {\n    if (options.interactionActive != null) return options.interactionActive === true;\n    const helios = this.helios;\n    if (!helios) return false;\n    for (const method of [\n      'isInteractionActive',\n      'isPointerInteractionActive',\n      'isCameraInteractionActive',\n      'isLayoutInteractionActive',\n    ]) {\n      if (typeof helios[method] === 'function') {\n        try {\n          if (helios[method]() === true) return true;\n        } catch (error) {\n          warnOnce(\n            this,\n            `interaction-probe:${method}`,\n            `[HeliosStorage] Interaction probe \"${method}\" failed; treating it as inactive.`,\n            { error },\n          );\n        }\n      }\n    }\n    const picking = helios._picking ?? null;\n    const gesture = picking?.gesture ?? null;\n    if (gesture?.active === true) return true;\n    if (gesture?.pointers?.size > 0) return true;\n    const cameraRuntime = helios._cameraControlRuntime ?? null;\n    if (cameraRuntime?.controlPoseActive === true) return true;\n    if (helios._cameraMoveRaf != null || helios._pendingCameraMoveDetail) return true;\n    const layoutBehavior = helios.behavior?.layout ?? helios.behaviors?.get?.('layout') ?? null;\n    if (layoutBehavior?.state?.running === true) return true;\n    return false;\n  }\n\n  _isSessionUserInteractionActive(options = {}) {\n    if (options.interactionActive != null) return options.interactionActive === true;\n    const helios = this.helios;\n    if (!helios) return false;\n    for (const method of [\n      'isInteractionActive',\n      'isPointerInteractionActive',\n      'isCameraInteractionActive',\n    ]) {\n      if (typeof helios[method] === 'function' && helios[method]() === true) return true;\n    }\n    const picking = helios._picking ?? null;\n    const gesture = picking?.gesture ?? null;\n    if (gesture?.active === true) return true;\n    if (gesture?.pointers?.size > 0) return true;\n    const cameraRuntime = helios._cameraControlRuntime ?? null;\n    return cameraRuntime?.controlPoseActive === true;\n  }\n\n  _shouldCaptureAutosaveThumbnail(options = {}) {\n    const now = this._now();\n    this._lastAutosaveThumbnailAttemptAt = now;\n    const config = normalizeSessionThumbnailOptions(options.thumbnail ?? options.sessionThumbnail ?? this.sessionThumbnail);\n    if (config.enabled === false || config.autosaveEnabled === false) return false;\n    if (!this.capabilities.sessions || !this.sessionId || !this.sessionStore) return false;\n    if (!this.helios || typeof this.helios.exportFigurePreviewBlob !== 'function') return false;\n    if (this.networkData?.dirty !== true) return false;\n    if (this._sessionThumbnailDirtySinceCapture !== true) return false;\n    if (!this._hasAutosaveInteractionIdleElapsed(now)) return false;\n    if (this._isSessionThumbnailInteractionActive(options)) return false;\n    if (Number.isFinite(this._lastSessionThumbnailCapturedAt)) {\n      const elapsed = now - this._lastSessionThumbnailCapturedAt;\n      if (elapsed < config.autosaveMinIntervalMs) return false;\n    }\n    return true;\n  }\n\n  async _resolveSessionSnapshotThumbnail(options = {}, existingEnvelope = null) {\n    if (options.thumbnail && typeof options.thumbnail === 'object' && options.thumbnail.dataUrl) {\n      const thumbnail = cloneSerializable(options.thumbnail);\n      this._recordSessionThumbnailCaptured(thumbnail);\n      return thumbnail;\n    }\n    const invalidateExisting = options.invalidateExistingThumbnail === true;\n    const existingThumbnail = invalidateExisting\n      ? null\n      : cloneSerializable(existingEnvelope?.payload?.thumbnail ?? null);\n    if (options.captureThumbnail === false) return existingThumbnail;\n    if (options.captureThumbnail === 'auto') {\n      if (!this._shouldCaptureAutosaveThumbnail(options)) return existingThumbnail;\n      const thumbnail = await this.captureSessionThumbnail({\n        ...options,\n        captureThumbnail: true,\n      });\n      return thumbnail ?? existingThumbnail;\n    }\n    return await this.captureSessionThumbnail(options);\n  }\n\n  async _serializeSessionPositionData(options = {}) {\n    if (!this.helios?.snapshotLayoutRuntimeStateAsync && !this.helios?.snapshotLayoutRuntimeState) return null;\n    const timing = options._timing ?? null;\n    const explicitMaxPositionBytes = options.maxPositionBytes ?? options.layoutRuntime?.maxPositionBytes;\n    const maxPositionBytes = Number.isFinite(Number(explicitMaxPositionBytes))\n      ? Math.max(0, Number(explicitMaxPositionBytes))\n      : (options.autosync === true\n        ? this.autosyncPayloadLimits?.positionMaxBytes ?? DEFAULT_AUTOSYNC_POSITION_MAX_BYTES\n        : DEFAULT_MANUAL_POSITION_MAX_BYTES);\n    const snapshotStartedAtMs = syncTimingNowMs();\n    const runtimeState = await (this.helios.snapshotLayoutRuntimeStateAsync?.({\n      reason: options.reason ?? 'session-position-save',\n      ...(options.layoutRuntime ?? {}),\n      maxPositionBytes,\n      includePositions: true,\n      preferDelegate: true,\n    }) ?? this.helios.snapshotLayoutRuntimeState?.({\n      reason: options.reason ?? 'session-position-save',\n      ...(options.layoutRuntime ?? {}),\n      maxPositionBytes,\n      includePositions: true,\n      preferDelegate: true,\n    }));\n    this._recordSessionSyncStep(timing, 'position.snapshot-layout-runtime', snapshotStartedAtMs, {\n      nodeCount: Number.isFinite(runtimeState?.nodeCount) ? Number(runtimeState.nodeCount) : null,\n      hasPositions: runtimeState?.positions != null,\n      positionsSkipped: runtimeState?.positionsSkipped === true,\n      positionSource: runtimeState?.positionSource ?? null,\n      maxPositionBytes,\n    });\n    if (this._isStalePositionAutosave(options) && this._sessionSaveQueuedCount > 0) {\n      const requestedVersion = Number(options.positionDirtyVersion);\n      const currentVersion = this._positionDirtyVersion;\n      this._recordSessionSyncStep(timing, 'position.abort-stale-after-snapshot', syncTimingNowMs(), {\n        requestedVersion: Number.isFinite(requestedVersion) ? requestedVersion : null,\n        currentVersion,\n        queuedCount: this._sessionSaveQueuedCount,\n      });\n      throw createStalePositionAutosaveAbort({\n        stage: 'after-snapshot',\n        requestedVersion: Number.isFinite(requestedVersion) ? requestedVersion : null,\n        currentVersion,\n      });\n    }\n    const decodeStartedAtMs = syncTimingNowMs();\n    const positions = decodeFloat32PositionPayload(runtimeState?.positions);\n    this._recordSessionSyncStep(timing, 'position.decode-float32-payload', decodeStartedAtMs, {\n      floatCount: positions instanceof Float32Array ? positions.length : 0,\n      byteLength: positions instanceof Float32Array ? positions.byteLength : 0,\n    });\n    if (!(positions instanceof Float32Array) || positions.length <= 0) return null;\n    const byteViewStartedAtMs = syncTimingNowMs();\n    const positionBytes = new Uint8Array(positions.buffer, positions.byteOffset, positions.byteLength);\n    this._recordSessionSyncStep(timing, 'position.create-byte-view', byteViewStartedAtMs, {\n      byteLength: positionBytes.byteLength,\n    });\n    const compressStartedAtMs = syncTimingNowMs();\n    const compressionMinBytes = options.positionCompressionMinBytes\n      ?? options.layoutRuntime?.positionCompressionMinBytes\n      ?? options.compressionMinBytes;\n    const compressed = await compressPositionBytes(positionBytes, { compressionMinBytes });\n    this._recordSessionSyncStep(timing, 'position.compress-bytes', compressStartedAtMs, {\n      compression: compressed?.compression ?? null,\n      skippedCompression: compressed?.skippedCompression ?? null,\n      inputByteLength: positionBytes.byteLength,\n      storedByteLength: compressed?.data?.byteLength ?? 0,\n    });\n    if (!compressed?.data) return null;\n    const metadataStartedAtMs = syncTimingNowMs();\n    const runtimeMetadata = cloneSerializable(runtimeState ?? {});\n    delete runtimeMetadata.positions;\n    delete runtimeMetadata.positionsSkipped;\n    this._recordSessionSyncStep(timing, 'position.clone-runtime-metadata', metadataStartedAtMs, {\n      nodeCount: Number.isFinite(runtimeState?.nodeCount)\n        ? Number(runtimeState.nodeCount)\n        : Math.floor(positions.length / 3),\n    });\n    return {\n      schema: 'helios-web.session-position-data',\n      version: 1,\n      encoding: 'float32',\n      compression: compressed.compression,\n      data: compressed.data,\n      length: positions.length,\n      byteLength: positions.byteLength,\n      storedByteLength: compressed.data.byteLength,\n      dimension: 3,\n      nodeCount: Number.isFinite(runtimeState?.nodeCount)\n        ? Number(runtimeState.nodeCount)\n        : Math.floor(positions.length / 3),\n      capturedAt: Number.isFinite(runtimeState?.capturedAt) ? Number(runtimeState.capturedAt) : this._now(),\n      runtimeState: runtimeMetadata,\n    };\n  }\n\n  async _positionDataToLayoutRuntimeState(positionData = {}) {\n    if (!positionData || typeof positionData !== 'object' || positionData.data == null) return null;\n    if (positionData.encoding !== 'float32') return null;\n    const bytes = await decompressPositionBytes(positionData.data, positionData.compression ?? 'none');\n    if (!bytes || bytes.byteLength <= 0 || bytes.byteLength % Float32Array.BYTES_PER_ELEMENT !== 0) return null;\n    const copy = new Uint8Array(bytes.byteLength);\n    copy.set(bytes);\n    const positions = new Float32Array(copy.buffer);\n    if (positionData.length != null && positions.length !== Number(positionData.length)) {\n      throw new Error(`Helios session position length mismatch: expected ${positionData.length}, got ${positions.length}`);\n    }\n    return {\n      ...(cloneSerializable(positionData.runtimeState ?? {})),\n      schema: positionData.runtimeState?.schema ?? 'helios-web.layout-runtime-state',\n      version: positionData.runtimeState?.version ?? 1,\n      capturedAt: Number.isFinite(positionData.capturedAt) ? Number(positionData.capturedAt) : Date.now(),\n      nodeCount: Number.isFinite(positionData.nodeCount)\n        ? Number(positionData.nodeCount)\n        : Math.floor(positions.length / 3),\n      positions: encodeFloat32PositionPayload(positions),\n    };\n  }\n\n  async serializeSessionSnapshot(options = {}) {\n    const timing = options._timing ?? null;\n    const id = String(options.id ?? this.idFactory());\n    const existingRecord = options.preserveExisting === false || !this.sessionStore?.get\n      ? null\n      : await this._timeSessionSyncAsync(timing, 'session-store-get-existing', { id }, () => (\n        this.sessionStore.get(id, { hydrateNetworkData: false })\n      ));\n    const existingEnvelope = existingRecord\n      ? this._timeSessionSync(timing, 'deserialize-existing-session', { id }, () => this.deserializeSessionSnapshot(existingRecord))\n      : null;\n    if (this._isStalePositionAutosave(options) && this._sessionSaveQueuedCount > 0) {\n      const requestedVersion = Number(options.positionDirtyVersion);\n      const currentVersion = this._positionDirtyVersion;\n      this._recordSessionSyncStep(timing, 'abort-stale-after-existing-session', syncTimingNowMs(), {\n        requestedVersion: Number.isFinite(requestedVersion) ? requestedVersion : null,\n        currentVersion,\n        queuedCount: this._sessionSaveQueuedCount,\n      });\n      throw createStalePositionAutosaveAbort({\n        stage: 'after-existing-session',\n        requestedVersion: Number.isFinite(requestedVersion) ? requestedVersion : null,\n        currentVersion,\n      });\n    }\n    if (!this.helios) {\n      return createPersistenceEnvelope(PERSISTENCE_KINDS.session, {\n        session: {\n          id,\n          createdAt: Number.isFinite(options.createdAt)\n            ? Number(options.createdAt)\n            : (Number(existingEnvelope?.payload?.session?.createdAt) || Date.now()),\n          updatedAt: Number.isFinite(options.updatedAt) ? Number(options.updatedAt) : Date.now(),\n          workspaceId: this.workspaceId,\n          nickname: normalizeSessionNickname(options.nickname ?? options.name ?? options.label)\n            ?? normalizeSessionNickname(existingEnvelope?.payload?.session?.nickname),\n          unfinished: options.unfinished !== false,\n          status: options.status ?? 'active',\n        },\n        visualizationState: options.visualizationState\n          ?? createPersistenceEnvelope(PERSISTENCE_KINDS.visualization, {\n            storageState: this.serializeSnapshot(options.storage ?? {}),\n          }),\n        networkData: existingEnvelope?.payload?.networkData ?? null,\n        positionData: existingEnvelope?.payload?.positionData ?? null,\n        thumbnail: await this._timeSessionSyncAsync(timing, 'resolve-session-thumbnail', {\n          mode: options.captureThumbnail ?? null,\n        }, () => this._resolveSessionSnapshotThumbnail(options, existingEnvelope)),\n      });\n    }\n    const createdAt = Number.isFinite(options.createdAt)\n      ? Number(options.createdAt)\n      : (Number(existingEnvelope?.payload?.session?.createdAt) || Date.now());\n    const updatedAt = Number.isFinite(options.updatedAt) ? Number(options.updatedAt) : Date.now();\n    const networkFormat = typeof options.networkFormat === 'string'\n      ? options.networkFormat\n      : (typeof options.networkPersistence?.format === 'string'\n        ? options.networkPersistence.format\n        : (existingEnvelope?.payload?.networkData?.format ?? 'zxnet'));\n    const snapshotLayoutRuntime = options.snapshotLayoutRuntime === true;\n    const visualizationOptions = snapshotLayoutRuntime\n      ? {\n          reason: options.reason ?? 'save-session',\n          snapshotLayoutRuntime: true,\n          layoutRuntime: options.layoutRuntime ?? {},\n        }\n      : {\n          reason: options.reason ?? 'save-session',\n          snapshotLayoutRuntime: false,\n          layoutRuntime: {\n            includePositions: false,\n            preferDelegate: false,\n            ...(options.layoutRuntime ?? {}),\n          },\n        };\n    const useTrackedVisualization = options.fullVisualizationState !== true && options.trackedOnly !== false;\n    const visualizationState = options.visualizationState\n      ?? await this._timeSessionSyncAsync(timing, 'serialize-visualization-state', {\n        trackedOnly: useTrackedVisualization,\n        snapshotLayoutRuntime,\n      }, () => (\n        useTrackedVisualization\n        && (this.helios.serializeTrackedVisualizationStateAsync || this.helios.serializeTrackedVisualizationState)\n          ? (this.helios.serializeTrackedVisualizationStateAsync?.(visualizationOptions)\n            ?? this.helios.serializeTrackedVisualizationState?.(visualizationOptions))\n          : (this.helios.serializeVisualizationStateAsync?.(visualizationOptions)\n            ?? this.helios.serializeVisualizationState?.(visualizationOptions))\n      ));\n    const visualizationPayload = visualizationState?.payload ?? {};\n    const networkSource = options.networkSource ?? visualizationPayload.networkSource ?? null;\n    const nickname = normalizeSessionNickname(options.nickname ?? options.name ?? options.label)\n      ?? normalizeSessionNickname(existingEnvelope?.payload?.session?.nickname)\n      ?? normalizeSessionNickname(networkSource?.baseName ?? networkSource?.name)\n      ?? normalizeSessionNickname(this.helios?._lastLoadedNetworkBase ?? this.helios?._lastLoadedNetworkName);\n    const includePositions = options.includePositions === true && options.positionData !== null;\n    const includeNetwork = options.includeNetwork !== false && options.networkData !== null;\n    const networkData = Object.prototype.hasOwnProperty.call(options, 'networkData')\n      ? options.networkData\n      : includeNetwork\n        ? await this._timeSessionSyncAsync(timing, 'save-portable-network', {\n            format: networkFormat,\n            includeCurrentPositions: includePositions ? false : options.includeCurrentPositions !== false,\n          }, () => this.helios.savePortableNetwork?.(networkFormat, {\n              includeVisualization: false,\n              includeCurrentPositions: includePositions ? false : options.includeCurrentPositions !== false,\n              output: 'uint8array',\n            }))\n        : null;\n    const resolvedNetworkData = this._timeSessionSync(timing, 'resolve-network-data', {\n      reusedExisting: networkData == null,\n      byteLength: payloadDataByteLength(networkData),\n    }, () => (networkData != null\n        ? {\n            format: networkFormat,\n            data: networkData,\n          }\n        : cloneSerializable(existingEnvelope?.payload?.networkData ?? {\n            format: networkFormat,\n            data: null,\n          })));\n    const positionData = Object.prototype.hasOwnProperty.call(options, 'positionData')\n      ? options.positionData\n      : includePositions\n        ? await this._timeSessionSyncAsync(timing, 'serialize-session-position-data', {\n            requestedVersion: Number.isFinite(Number(options.positionDirtyVersion))\n              ? Number(options.positionDirtyVersion)\n              : null,\n          }, () => this._serializeSessionPositionData({\n            ...options,\n            _timing: timing,\n            reason: options.reason ?? 'save-session',\n          }))\n        : null;\n    const resolvedPositionData = this._timeSessionSync(timing, 'resolve-position-data', {\n      savedPositionData: positionData != null,\n      storedByteLength: Number(positionData?.storedByteLength ?? 0) || 0,\n    }, () => (positionData != null\n        ? positionData\n        : cloneSerializable(existingEnvelope?.payload?.positionData ?? null)));\n    const thumbnail = await this._timeSessionSyncAsync(timing, 'resolve-session-thumbnail', {\n      mode: options.captureThumbnail ?? null,\n    }, () => this._resolveSessionSnapshotThumbnail({\n      ...options,\n      invalidateExistingThumbnail: options.invalidateExistingThumbnail === true || networkData != null,\n    }, existingEnvelope));\n    const payload = this._timeSessionSync(timing, 'build-session-payload', {\n      includeNetwork,\n      includePositions,\n    }, () => ({\n      session: {\n        id,\n        createdAt,\n        updatedAt,\n        workspaceId: this.workspaceId,\n        nickname,\n        unfinished: options.unfinished !== false,\n        status: options.status ?? 'active',\n      },\n      preferences: options.preferences ?? this.getPreferences(),\n      responsivePreferences: options.responsivePreferences ?? this.getPreferences().responsive,\n      uiState: options.uiState ?? visualizationPayload.uiState,\n      behaviorState: options.behaviorState ?? visualizationPayload.behaviorState,\n      networkSource,\n      networkData: resolvedNetworkData,\n      positionData: resolvedPositionData,\n      thumbnail,\n      visualizationState,\n    }));\n    const envelope = this._timeSessionSync(timing, 'create-session-envelope', {}, () => createPersistenceEnvelope(PERSISTENCE_KINDS.session, payload, {\n      source: 'helios.storage',\n    }));\n    envelope.id = id;\n    envelope.payload.session.bytes = this._timeSessionSync(timing, 'compute-session-byte-stats', {\n      networkBytes: payloadDataByteLength(resolvedNetworkData?.data),\n      positionBytes: payloadDataByteLength(resolvedPositionData?.data),\n    }, () => sessionStoredByteStats(envelope).bytes);\n    Object.defineProperty(envelope, '_heliosSavedNetworkData', {\n      value: networkData != null,\n      enumerable: false,\n      configurable: true,\n    });\n    Object.defineProperty(envelope, '_heliosSavedPositionData', {\n      value: positionData != null,\n      enumerable: false,\n      configurable: true,\n    });\n    return envelope;\n  }\n\n  deserializeSessionSnapshot(snapshot = {}) {\n    return migratePersistenceEnvelope(snapshot, PERSISTENCE_KINDS.session);\n  }\n\n  async captureSessionThumbnail(options = {}) {\n    const config = normalizeSessionThumbnailOptions(options.thumbnail ?? options.sessionThumbnail ?? this.sessionThumbnail);\n    if (config.enabled === false || options.captureThumbnail === false) return null;\n    if (!this.helios) return null;\n    try {\n      const thumbnailOptions = {\n        maxWidth: config.maxWidth,\n        maxHeight: config.maxHeight,\n        width: config.maxWidth,\n        height: config.maxHeight,\n        includeLabels: config.includeLabels,\n        includeLegends: config.includeLegends,\n        includeInterface: config.includeInterface,\n        supersampling: 1,\n      };\n      const blob = await this.helios.captureSessionThumbnailBlob?.(thumbnailOptions)\n        ?? await this.helios.exportFigurePreviewBlob?.({\n          format: 'png',\n          preset: 'custom',\n          width: config.maxWidth,\n          height: config.maxHeight,\n          includeLabels: config.includeLabels,\n          includeLegends: config.includeLegends,\n          includeInterface: config.includeInterface,\n          transparentBackground: false,\n          supersampling: 1,\n        }, {\n          maxWidth: config.maxWidth,\n          maxHeight: config.maxHeight,\n          supersampling: 1,\n        });\n      if (!blob) return null;\n      const bytes = estimateStoredByteLength(blob);\n      if (config.maxBytes > 0 && bytes > config.maxBytes) return null;\n      const dataUrl = await blobToDataUrl(blob);\n      if (!dataUrl) return null;\n      const thumbnail = {\n        type: blob?.type || 'image/png',\n        encoding: 'data-url',\n        width: config.maxWidth,\n        height: config.maxHeight,\n        byteLength: bytes,\n        dataUrl,\n        capturedAt: this._now(),\n      };\n      this._recordSessionThumbnailCaptured(thumbnail);\n      return thumbnail;\n    } catch (error) {\n      console.warn('Helios: failed to capture session thumbnail.', error);\n      return null;\n    }\n  }\n\n  async saveSessionSnapshot(options = {}) {\n    if (!this.capabilities.sessions) return null;\n    const timing = options._timing ?? null;\n    const envelope = await this._timeSessionSyncAsync(timing, 'serialize-session-snapshot', {\n      includeNetwork: options.includeNetwork !== false,\n      includePositions: options.includePositions === true,\n    }, () => this.serializeSessionSnapshot(options));\n    const id = envelopeSessionId(envelope);\n    if (!id) return null;\n    envelope.id = id;\n    await this._timeSessionSyncAsync(timing, 'session-store-put', {\n      id,\n      bytes: envelope.payload?.session?.bytes ?? null,\n      networkBytes: payloadDataByteLength(envelope.payload?.networkData?.data),\n      positionBytes: payloadDataByteLength(envelope.payload?.positionData?.data),\n    }, () => this.sessionStore?.put?.(envelope));\n    this.sessionSavedAt = envelopeUpdatedAt(envelope) ?? Date.now();\n    this.sessionSaveError = null;\n    this.sessionRestoreError = null;\n    this.sessionSaveWarning = null;\n    const savedPositions = envelope._heliosSavedPositionData === true\n      || (Object.prototype.hasOwnProperty.call(options, 'positionData') && options.positionData != null)\n      || (options.includeNetwork !== false && options.includeCurrentPositions !== false);\n    const savedNetwork = envelope._heliosSavedNetworkData === true\n      || (Object.prototype.hasOwnProperty.call(options, 'networkData') && options.networkData != null);\n    const requestedPositionDirtyVersion = Number(options.positionDirtyVersion);\n    const savedCurrentPositionVersion = !savedPositions\n      || !Number.isFinite(requestedPositionDirtyVersion)\n      || requestedPositionDirtyVersion >= this._positionDirtyVersion;\n    const positionsStillDirty = this.networkData?.positionsDirty === true\n      && (!savedPositions || !savedCurrentPositionVersion);\n    const legacyNetworkDirty = this.networkData?.networkDirty == null\n      && this.networkData?.dirty === true\n      && this.networkData?.positionsDirty !== true;\n    const networkWasDirty = this.networkData?.networkDirty === true || legacyNetworkDirty;\n    const networkStillDirty = networkWasDirty && !savedNetwork;\n    const dirtyAfterSave = networkStillDirty || positionsStillDirty;\n    const previousNetworkSavedAt = this.networkData?.savedAt ?? null;\n    this.networkData = {\n      ...this.networkData,\n      enabled: true,\n      status: dirtyAfterSave ? 'dirty' : 'saved',\n      dirty: dirtyAfterSave,\n      networkDirty: networkStillDirty,\n      positionsDirty: positionsStillDirty,\n      dirtyAt: dirtyAfterSave ? (this.networkData?.dirtyAt ?? this._now()) : null,\n      savedAt: dirtyAfterSave ? previousNetworkSavedAt : this.sessionSavedAt,\n      format: envelope.payload?.networkData?.format ?? this.networkData.format ?? null,\n      remoteWarning: null,\n      restoreError: null,\n      syncing: false,\n    };\n    const shouldActivate = options.activate === true || (this.sessionId != null && String(id) === String(this.sessionId));\n    if (shouldActivate) {\n      this.sessionId = String(id);\n      this.explicitSessionInvalid = false;\n    }\n    await this._timeSessionSyncAsync(timing, 'set-unfinished-session-id', {\n      id: envelope.payload?.session?.unfinished === false ? null : String(id),\n    }, () => this.setUnfinishedSessionId(envelope.payload?.session?.unfinished === false ? null : String(id)));\n    this._emit('change', { reason: 'session-save', sessionId: id, status: this.persistenceStatus() });\n    return envelope;\n  }\n\n  async restoreSessionSnapshot(snapshot = {}, options = {}) {\n    const envelope = this.deserializeSessionSnapshot(snapshot);\n    const payload = envelope?.payload ?? null;\n    if (!payload?.session?.id) return null;\n    if (payload.networkData?.data && this.helios?.loadNetwork) {\n      await this.helios.loadNetwork(payload.networkData.data, {\n        format: payload.networkData.format,\n        disposeOld: options.disposeOld !== false,\n        recreateRenderer: options.recreateRenderer !== false,\n        keepCamera: true,\n        frame: false,\n        restoreVisualizationState: false,\n        allowDuringInitialize: true,\n        markNetworkDirty: false,\n      });\n      this.helios._adoptNetworkPositionsAsLayoutBaseline?.({\n        reason: options.reason ?? 'session-network-restore',\n        layoutRuntimeState: payload.visualizationState?.payload?.layoutRuntimeState ?? null,\n      });\n    }\n    let restoredPositionRuntimeState = null;\n    if (payload.positionData?.data) {\n      restoredPositionRuntimeState = await this._positionDataToLayoutRuntimeState(payload.positionData);\n      if (restoredPositionRuntimeState && payload.visualizationState?.payload && options.restoreVisualizationState !== false && this.helios?.importVisualizationState) {\n        payload.visualizationState.payload.layoutRuntimeState = mergeDeepObject(\n          payload.visualizationState.payload.layoutRuntimeState ?? {},\n          restoredPositionRuntimeState,\n        );\n      } else if (restoredPositionRuntimeState && this.helios?.restoreLayoutRuntimeState) {\n        this.helios.restoreLayoutRuntimeState(restoredPositionRuntimeState, {\n          reason: options.reason ?? 'session-position-restore',\n          restoreRunState: options.restoreLayoutRunState !== false,\n        });\n      }\n    }\n    if (options.restoreVisualizationState !== false && payload.visualizationState && this.helios?.importVisualizationState) {\n      await this.helios.importVisualizationState(payload.visualizationState, {\n        ...options,\n        restoreLayoutRunState: options.restoreLayoutRunState !== false,\n        hydratePersistence: false,\n        refreshPersistence: false,\n      });\n    } else if (payload.visualizationState?.payload?.storageState && options.restoreStorage !== false) {\n      this.restoreSnapshot(payload.visualizationState.payload.storageState, {\n        source: 'restore',\n        reason: options.reason ?? 'session-restore',\n      });\n    }\n    this.sessionId = String(payload.session.id);\n    this.explicitSessionInvalid = false;\n    this.sessionSavedAt = Number(payload.session.updatedAt) || Date.now();\n    this.sessionSaveError = null;\n    this.sessionRestoreError = null;\n    this.sessionSaveWarning = null;\n    this.networkData = {\n      ...this.networkData,\n      enabled: true,\n      status: 'saved',\n      dirty: false,\n      networkDirty: false,\n      positionsDirty: false,\n      dirtyAt: null,\n      savedAt: this.sessionSavedAt,\n      format: payload.networkData?.format ?? this.networkData.format ?? null,\n      remoteWarning: null,\n      restoreError: null,\n      syncing: false,\n    };\n    const restoredAutosyncSkip = this._autosyncSizeLimitSkip({\n      autosync: true,\n      includeNetwork: payload.networkData?.data != null || payload.networkData?.dataRef != null,\n      includePositions: payload.positionData?.data != null || payload.positionData?.dataRef != null,\n    });\n    if (restoredAutosyncSkip) {\n      this._setAutosyncDisabled(restoredAutosyncSkip, { markDirty: false });\n    }\n    await this.setUnfinishedSessionId(options.markFinished === true ? null : this.sessionId);\n    if (options.markFinished === true) {\n      payload.session.unfinished = false;\n      payload.session.status = 'restored';\n      const next = createPersistenceEnvelope(PERSISTENCE_KINDS.session, payload);\n      next.id = payload.session.id;\n      await this.sessionStore?.put?.(next);\n      return next;\n    }\n    return envelope;\n  }\n\n  /**\n   * Serialize a visualization envelope suitable for attachment to a portable\n   * network export. The envelope includes the current `storageState` snapshot.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {object} [options] - Snapshot options forwarded to Helios.\n   * @returns {Promise<object>} Visualization-state envelope.\n   */\n  async serializeNetworkSnapshot(options = {}) {\n    if (!this.helios) {\n      return createPersistenceEnvelope(PERSISTENCE_KINDS.visualization, {\n        storageState: this.serializeSnapshot(options.storage ?? {}),\n      }, {\n        source: 'helios.storage',\n      });\n    }\n    const layoutRuntime = {\n      ...(options.layoutRuntime ?? {}),\n      ...(options.includeCurrentPositions === false ? {} : { preferDelegate: true }),\n    };\n    const snapshotOptions = {\n      ...options,\n      layoutRuntime,\n      storage: options.storage ?? {},\n    };\n    const useTrackedVisualization = options.fullVisualizationState !== true && options.trackedOnly !== false;\n    if (useTrackedVisualization && (this.helios.serializeTrackedVisualizationStateAsync || this.helios.serializeTrackedVisualizationState)) {\n      return await (this.helios.serializeTrackedVisualizationStateAsync?.(snapshotOptions)\n        ?? this.helios.serializeTrackedVisualizationState?.(snapshotOptions));\n    }\n    return await (this.helios.serializeVisualizationStateAsync?.(snapshotOptions)\n      ?? this.helios.serializeVisualizationState?.(snapshotOptions));\n  }\n\n  /**\n   * Attach a visualization-state envelope to the active network.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {object|null} [snapshot=null] - Existing visualization envelope, or\n   * `null` to capture one through storage.\n   * @param {object} [options] - Attachment options.\n   * @returns {Promise<unknown>} The underlying Helios attachment result.\n   */\n  async attachVisualizationStateToNetwork(snapshot = null, options = {}) {\n    if (!this.helios?.attachVisualizationStateToNetwork) return null;\n    const visualizationState = snapshot ?? await this.serializeNetworkSnapshot(options);\n    return this.helios.attachVisualizationStateToNetwork(visualizationState, options);\n  }\n\n  /**\n   * Save the active network with visualization state attached.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {string} [format='zxnet'] - Portable network format.\n   * @param {object} [options] - Save options forwarded to Helios.\n   * @returns {Promise<unknown>} Serialized network payload.\n   */\n  async saveNetworkSnapshot(format = 'zxnet', options = {}) {\n    if (!this.helios?.savePortableNetwork) return null;\n    return this.helios.savePortableNetwork(format, {\n      ...options,\n      trackedOnly: options.fullVisualizationState === true ? false : options.trackedOnly !== false,\n      includeVisualization: options.includeVisualization !== false,\n    });\n  }\n\n  /**\n   * Restore a portable network snapshot through Helios network loading.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {unknown} source - Network payload or file-like source.\n   * @param {object} [options] - Restore options forwarded to Helios.\n   * @returns {Promise<unknown>} Loaded network result.\n   */\n  async restoreNetworkSnapshot(source, options = {}) {\n    if (!this.helios?.loadNetwork) return null;\n    return this.helios.loadNetwork(source, {\n      ...options,\n      restoreVisualizationState: options.restoreVisualizationState !== false,\n    });\n  }\n\n  restoreSnapshot(snapshot = {}, options = {}) {\n    const state = snapshot?.state && typeof snapshot.state === 'object' ? snapshot.state : snapshot;\n    const overrides = state?.overrides && typeof state.overrides === 'object' ? state.overrides : {};\n    const restoredOverrides = options.sanitizeLegacyImplicitAppearanceOverrides === false\n      ? overrides\n      : sanitizeLegacyImplicitAppearanceOverrides(\n        overrides,\n        state?.journal,\n        (key) => this.states.resolveKey(key),\n        (key) => this.states.entry(key),\n      );\n    return this.states.restore(restoredOverrides, {\n      source: options.source ?? 'restore',\n      reason: options.reason ?? 'restore-snapshot',\n      trackOverride: options.trackOverride ?? true,\n    });\n  }\n\n  async loadSession(sessionId = this.sessionId, options = {}) {\n    if (!this.capabilities.sessions || !sessionId) return null;\n    const record = await this.sessionStore?.get?.(sessionId);\n    if (!record) {\n      const requested = this.requestedSessionId != null && String(sessionId) === String(this.requestedSessionId);\n      const missingIsError = options.missingIsError !== false;\n      if (requested && missingIsError) {\n        this.explicitSessionInvalid = true;\n        this._recordSessionRestoreFailure(`Explicit session id \"${sessionId}\" was not found.`, {\n          sessionId,\n          reason: 'explicit-session-missing',\n        });\n      } else if (requested) {\n        this.explicitSessionInvalid = false;\n        this.sessionRestoreError = null;\n      }\n      return null;\n    }\n    this.explicitSessionInvalid = false;\n    this.sessionRestoreError = null;\n    this.sessionId = String(sessionId);\n    const restored = await this.restoreSessionSnapshot(record, { replaceUrlSession: true });\n    if (this.requestedSessionId != null && String(sessionId) === String(this.requestedSessionId)) {\n      this.helios?.behavior?.interface?.dismissResumePrompt?.();\n      this.helios?.behaviors?.get?.('interface')?.dismissResumePrompt?.();\n      if (this.helios?._pendingVisualizationUiState?.interface) {\n        this.helios._pendingVisualizationUiState.interface.resumePrompt = null;\n      }\n    }\n    return restored;\n  }\n\n  configureSession(options = {}) {\n    if (\n      Object.prototype.hasOwnProperty.call(options, 'autosyncPayloadLimits')\n      || Object.prototype.hasOwnProperty.call(options, 'autosyncLimits')\n    ) {\n      this.autosyncPayloadLimits = normalizeAutosyncPayloadLimits(\n        options.autosyncPayloadLimits ?? options.autosyncLimits,\n      );\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'autosyncInteractionIdleMs')) {\n      this.autosyncInteractionIdleMs = normalizeNonNegativeMs(\n        options.autosyncInteractionIdleMs,\n        DEFAULT_AUTOSYNC_INTERACTION_IDLE_MS,\n      );\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'autosyncMinIntervalMs')) {\n      this.autosyncMinIntervalMs = normalizeNonNegativeMs(\n        options.autosyncMinIntervalMs,\n        DEFAULT_SESSION_AUTOSYNC_MIN_INTERVAL_MS,\n      );\n    }\n    if (\n      Object.prototype.hasOwnProperty.call(options, 'sessionThumbnail')\n      || Object.prototype.hasOwnProperty.call(options, 'thumbnail')\n    ) {\n      this.sessionThumbnail = normalizeSessionThumbnailOptions(options.sessionThumbnail ?? options.thumbnail);\n    }\n    const explicitId = options.id ?? options.sessionId ?? this.sessionId ?? this.requestedSessionId ?? null;\n    this.urlRouting = normalizeUrlSessionRouting(options);\n    if (explicitId != null && explicitId !== '') {\n      this.sessionId = String(explicitId);\n      this.requestedSessionId = String(explicitId);\n    } else if (!this.sessionId) {\n      this.sessionId = String(this.idFactory());\n      this.requestedSessionId = null;\n    }\n    ensureSessionIdInUrl(this.sessionId, this.urlRouting);\n    return {\n      sessionId: this.sessionId,\n      requestedSessionId: this.requestedSessionId,\n      explicitSessionInvalid: this.explicitSessionInvalid,\n    };\n  }\n\n  async restoreActiveSession(options = {}) {\n    if (!this.capabilities.sessions) return null;\n    if (options.restore === false) {\n      if (options.saveInitialManifest !== false) {\n        await this.saveSession({\n          ...options,\n          id: options.id ?? this.sessionId ?? this.requestedSessionId ?? undefined,\n        });\n      }\n      return null;\n    }\n    if (this.requestedSessionId && this.sessionStore) {\n      const canCreateInitialSession = options.saveInitialManifest !== false;\n      const restored = await this.loadSession(this.requestedSessionId, {\n        missingIsError: !canCreateInitialSession,\n      });\n      if (restored) return restored;\n      if (this.explicitSessionInvalid) return null;\n      if (options.saveInitialManifest !== false) {\n        return this.saveSession({\n          ...options,\n          id: this.requestedSessionId,\n          networkFormat: options.networkFormat ?? options.networkPersistence?.format,\n        });\n      }\n      return null;\n    }\n    if (this.sessionId) {\n      const restored = await this.loadSession(this.sessionId);\n      if (restored) return restored;\n      if (options.saveInitialManifest !== false) {\n        return this.saveSession({\n          ...options,\n          id: this.sessionId,\n          networkFormat: options.networkFormat ?? options.networkPersistence?.format,\n        });\n      }\n    }\n    return null;\n  }\n\n  async startNewSession(options = {}) {\n    if (!this.capabilities.sessions) return null;\n    const previousId = this.sessionId ?? null;\n    if (options.flushPrevious !== false && previousId) {\n      await this.flushPreviousSessionForSwitch({\n        ...options,\n        reason: options.previousFlushReason ?? options.reason ?? 'session-switch',\n      });\n    }\n    const id = typeof options.id === 'string' && options.id.trim() ? options.id.trim() : String(this.idFactory());\n    const nickname = normalizeSessionNickname(options.nickname ?? options.name ?? options.label);\n    this.sessionId = id;\n    this.requestedSessionId = null;\n    this.explicitSessionInvalid = false;\n    ensureSessionIdInUrl(id, {\n      ...this.urlRouting,\n      replace: options.replaceUrlSession !== false,\n    });\n    await this.setUnfinishedSessionId(id);\n    if (options.saveInitialSession !== false) {\n      await this.saveSession({\n        ...options,\n        id,\n        nickname,\n        activate: true,\n        networkFormat: options.networkFormat ?? options.networkPersistence?.format,\n      });\n    }\n    return {\n      id,\n      previousId,\n      nickname,\n      status: { sessionId: this.sessionId },\n    };\n  }\n\n  async flushPreviousSessionForSwitch(options = {}) {\n    if (!this.capabilities.sessions || !this.sessionId) {\n      return { flushed: false, skipped: true, reason: 'no-active-session' };\n    }\n    const previousId = this.sessionId;\n    try {\n      const result = await this.flush({\n        ...options,\n        id: previousId,\n        reason: options.reason ?? 'session-switch',\n        includeNetwork: options.includePreviousNetwork !== false,\n        includePositions: options.includePreviousPositions !== false,\n        snapshotLayoutRuntime: options.snapshotPreviousLayoutRuntime !== false,\n        captureThumbnail: Object.prototype.hasOwnProperty.call(options, 'capturePreviousThumbnail')\n          ? options.capturePreviousThumbnail\n          : 'auto',\n        retention: options.preservePreviousRetention === false ? undefined : { enabled: false },\n        usePendingAutosaveOptions: true,\n      });\n      return { flushed: true, previousId, result };\n    } catch (error) {\n      const detail = {\n        error,\n        previousId,\n        status: this.persistenceStatus(),\n        reason: options.reason ?? 'session-switch',\n      };\n      let confirmed = options.continueOnFlushError === true\n        || options.discardPreviousUnsynced === true\n        || options.confirmedDiscardPrevious === true;\n      if (!confirmed && typeof options.confirmUnsyncedSession === 'function') {\n        confirmed = await options.confirmUnsyncedSession(detail) === true;\n      }\n      if (confirmed) {\n        console.warn('Helios: continuing with new session after previous session failed to sync.', {\n          previousId,\n          error,\n        });\n        return { flushed: false, discarded: true, previousId, error };\n      }\n      const wrapped = new Error(\n        `Cannot start a new Helios session because the current session \"${previousId}\" could not be synced.`,\n        { cause: error },\n      );\n      wrapped.code = 'HELIOS_SESSION_SWITCH_SYNC_FAILED';\n      wrapped.previousSessionId = previousId;\n      throw wrapped;\n    }\n  }\n\n  async _saveSessionOperation(options = {}) {\n    const saveOptions = {\n      ...options,\n      fullVisualizationState: options.fullVisualizationState === true,\n    };\n    if (saveOptions.includePositions === true && !Number.isFinite(Number(saveOptions.positionDirtyVersion))) {\n      saveOptions.positionDirtyVersion = this._positionDirtyVersion;\n    }\n    const timing = saveOptions._timing ?? this._createSessionSyncTiming(saveOptions);\n    saveOptions._timing = timing;\n    try {\n      if (this._isStalePositionAutosave(saveOptions) && this._sessionSaveQueuedCount > 0) {\n        this._recordSessionSyncStep(timing, 'stale-position-coalesce', syncTimingNowMs(), {\n          requestedVersion: Number(saveOptions.positionDirtyVersion) || null,\n          currentVersion: this._positionDirtyVersion,\n          queuedCount: this._sessionSaveQueuedCount,\n        });\n        const result = this._skipStalePositionAutosave(saveOptions);\n        this._finishSessionSyncTiming(timing, saveOptions, { result: 'coalesced' });\n        return result;\n      }\n      if (this._isStalePositionAutosave(saveOptions)) {\n        this._recordSessionSyncStep(timing, 'stale-position-refresh', syncTimingNowMs(), {\n          requestedVersion: Number(saveOptions.positionDirtyVersion) || null,\n          currentVersion: this._positionDirtyVersion,\n        });\n        Object.assign(saveOptions, this._refreshStalePositionAutosave(saveOptions));\n        if (timing) timing.positionDirtyVersion = Number.isFinite(Number(saveOptions.positionDirtyVersion))\n          ? Number(saveOptions.positionDirtyVersion)\n          : timing.positionDirtyVersion;\n      }\n      const saved = await this._timeSessionSyncAsync(timing, 'save-session-snapshot', {\n        includeNetwork: saveOptions.includeNetwork !== false,\n        includePositions: saveOptions.includePositions === true,\n      }, () => this.saveSessionSnapshot(saveOptions));\n      if (saved) {\n        this._recordPersistenceChange('session-save', {\n          id: envelopeSessionId(saved) ?? options.id ?? this.sessionId ?? null,\n          reason: options.reason ?? null,\n          includeNetwork: options.includeNetwork !== false,\n          includePositions: options.includePositions === true,\n        });\n      }\n      this._finishSessionSyncTiming(timing, saveOptions, { result: saved ? 'saved' : 'skipped' });\n      return saved;\n    } catch (error) {\n      if (isStalePositionAutosaveAbort(error)) {\n        this._skipStalePositionAutosave(saveOptions);\n        this._finishSessionSyncTiming(timing, saveOptions, {\n          result: error.detail?.stage ? `coalesced-${error.detail.stage}` : 'coalesced',\n        });\n        return null;\n      }\n      this._finishSessionSyncTiming(timing, saveOptions, { result: 'error', error });\n      throw error;\n    }\n  }\n\n  async saveSession(options = {}) {\n    if (!this.capabilities.sessions) return null;\n    const saveOptions = {\n      ...options,\n      fullVisualizationState: options.fullVisualizationState === true,\n    };\n    return this._enqueueSessionSave(() => this._saveSessionOperation(saveOptions), saveOptions);\n  }\n\n  async getSession(id) {\n    if (!this.capabilities.sessions || !id) return null;\n    const record = await this.sessionStore?.get?.(id);\n    if (record) return this.deserializeSessionSnapshot(record);\n    return null;\n  }\n\n  async listSessions(options = {}) {\n    if (!this.capabilities.sessions) return [];\n    const records = await this.sessionStore?.getAll?.() ?? [];\n    const workspaceId = options.workspaceId ?? this.workspaceId ?? null;\n    const sessions = records\n      .filter((entry) => entry?.kind !== 'session-manifest'\n        && entry?.kind !== 'session-network-data'\n        && entry?.kind !== 'session-position-data'\n        && !String(entry?.id ?? '').startsWith('helios-web:session-manifest-record:'))\n      .map((entry) => this.deserializeSessionSnapshot(entry))\n      .filter((entry) => {\n        if (options.includeAllWorkspaces === true || workspaceId == null) return true;\n        const entryWorkspace = entry?.payload?.session?.workspaceId ?? null;\n        if (entryWorkspace == null) return workspaceId === 'default' || options.includeLegacySessions === true;\n        return String(entryWorkspace) === String(workspaceId);\n      })\n      .filter((entry) => options.includeFinished === true || entry.payload.session.unfinished !== false)\n      .sort((a, b) => (envelopeUpdatedAt(b) ?? 0) - (envelopeUpdatedAt(a) ?? 0));\n    return Number.isFinite(options.limit)\n      ? sessions.slice(0, Math.max(0, Number(options.limit)))\n      : sessions;\n  }\n\n  async listSessionSummaries(options = {}) {\n    if (!this.capabilities.sessions) return [];\n    const currentSessionId = options.currentSessionId ?? this.sessionId ?? null;\n    const sessions = await this.listSessions(options);\n    return sessions.map((record) => sessionSummaryFromEnvelope(record, { currentSessionId }));\n  }\n\n  async getResumeSessions(options = {}) {\n    if (!this.capabilities.sessions) return [];\n    const currentSessionId = options.currentSessionId ?? this.sessionId ?? null;\n    const unfinishedId = await this.getUnfinishedSessionId();\n    const unfinishedRecord = unfinishedId ? await this.getSession(unfinishedId) : null;\n    const summaries = await this.listSessionSummaries({\n      ...options,\n      includeFinished: options.includeFinished === true,\n      limit: undefined,\n      currentSessionId,\n    });\n    const filtered = summaries.filter((entry) => {\n      if (!entry?.id) return false;\n      if (options.excludeCurrent !== false && currentSessionId != null && String(entry.id) === String(currentSessionId)) return false;\n      return entry.unfinished !== false || options.includeFinished === true;\n    });\n    if (\n      unfinishedRecord?.payload?.session?.id\n      && unfinishedRecord.payload.session.unfinished !== false\n      && !filtered.some((entry) => String(entry.id) === String(unfinishedRecord.payload.session.id))\n      && !(options.excludeCurrent !== false && currentSessionId != null && String(unfinishedRecord.payload.session.id) === String(currentSessionId))\n    ) {\n      filtered.unshift(sessionSummaryFromEnvelope(unfinishedRecord, { currentSessionId }));\n    }\n    return Number.isFinite(options.limit)\n      ? filtered.slice(0, Math.max(0, Number(options.limit)))\n      : filtered;\n  }\n\n  async getResumePrompt(options = {}) {\n    if (!this.capabilities.sessions) return null;\n    if (this.requestedSessionId) return null;\n    const sessions = await this.getResumeSessions(options);\n    const first = sessions[0] ?? null;\n    if (!first?.id) return null;\n    return {\n      visible: true,\n      sessionId: first.id,\n      status: 'prompt',\n      updatedAt: first.updatedAt ?? null,\n      networkSource: cloneSerializable(first.networkSource),\n      sessions: cloneSerializable(sessions),\n    };\n  }\n\n  async resumeSession(sessionId, options = {}) {\n    if (!this.capabilities.sessions) return null;\n    return this.loadSession(sessionId ?? this.sessionId);\n  }\n\n  async restoreSession(sessionIdOrRecord, options = {}) {\n    if (!this.capabilities.sessions) return null;\n    if (typeof sessionIdOrRecord === 'string') return this.loadSession(sessionIdOrRecord);\n    if (sessionIdOrRecord) return this.restoreSessionSnapshot(sessionIdOrRecord, options);\n    return null;\n  }\n\n  async deleteSession(id) {\n    if (!this.capabilities.sessions || !id) return false;\n    const nativeRecord = await this.sessionStore?.get?.(id);\n    if (this.sessionStore?.delete) await this.sessionStore.delete(id);\n    const unfinishedId = await this.getUnfinishedSessionId();\n    if (unfinishedId != null && String(unfinishedId) === String(id)) {\n      await this.setUnfinishedSessionId(null);\n    }\n    return Boolean(nativeRecord);\n  }\n\n  async markSessionFinished(id = this.sessionId) {\n    if (!this.capabilities.sessions || !id) return null;\n    const session = await this.getSession(id);\n    if (!session) return null;\n    session.payload.session.unfinished = false;\n    session.payload.session.status = 'finished';\n    const envelope = createPersistenceEnvelope(PERSISTENCE_KINDS.session, session.payload);\n    envelope.id = session.payload.session.id;\n    await this.sessionStore?.put?.(envelope);\n    const unfinishedId = await this.getUnfinishedSessionId();\n    if (unfinishedId != null && String(unfinishedId) === String(id)) await this.setUnfinishedSessionId(null);\n    return envelope;\n  }\n\n  async restorePortableStateFromNetwork(options = {}) {\n    const network = options.network ?? this.helios?.network ?? null;\n    const attached = this.helios?.getAttachedVisualizationState?.(network) ?? null;\n    if (!attached?.payload?.storageState) return null;\n    this.restoreSnapshot(attached.payload.storageState, {\n      source: 'restore',\n      reason: options.reason ?? 'portable-network-restore',\n    });\n    return attached;\n  }\n\n  async flush(options = {}) {\n    if (this._sessionAutosaveTimer) {\n      clearTimeout(this._sessionAutosaveTimer);\n      this._sessionAutosaveTimer = null;\n    }\n    const pending = this._sessionAutosaveOptions ?? {};\n    this._sessionAutosaveOptions = null;\n    const saveOptions = options.usePendingAutosaveOptions === true\n      ? { ...pending, ...options }\n      : { ...options };\n    delete saveOptions.usePendingAutosaveOptions;\n    const stateDeltas = this._consumePendingStateOverrideDeltas();\n    if (\n      saveOptions.incremental !== false\n      && stateDeltas.size > 0\n      && saveOptions.includeNetwork !== true\n      && saveOptions.includePositions !== true\n      && saveOptions.snapshotLayoutRuntime !== true\n    ) {\n      try {\n        return await this._enqueueSessionSave(() => this._saveIncrementalSessionState({\n          ...saveOptions,\n          id: saveOptions.id ?? this.sessionId ?? undefined,\n        }, stateDeltas), saveOptions);\n      } catch (error) {\n        this._restorePendingStateOverrideDeltas(stateDeltas);\n        throw error;\n      }\n    }\n    if (stateDeltas.size > 0) this._restorePendingStateOverrideDeltas(stateDeltas);\n    return this.saveSession({\n      ...saveOptions,\n      id: saveOptions.id ?? this.sessionId ?? undefined,\n      networkFormat: saveOptions.networkFormat ?? saveOptions.network?.format ?? saveOptions.networkPersistence?.format,\n      fullVisualizationState: saveOptions.fullVisualizationState === true,\n    });\n  }\n\n  async sync(options = {}) {\n    const hasIncludeNetwork = Object.prototype.hasOwnProperty.call(options, 'includeNetwork');\n    const hasIncludePositions = Object.prototype.hasOwnProperty.call(options, 'includePositions');\n    const hasCaptureThumbnail = Object.prototype.hasOwnProperty.call(options, 'captureThumbnail');\n    const includeNetwork = hasIncludeNetwork\n      ? options.includeNetwork === true\n      : (this.networkData?.networkDirty === true || this.networkData?.savedAt == null);\n    const includePositions = hasIncludePositions\n      ? options.includePositions === true\n      : this.networkData?.positionsDirty === true;\n    return this.flush({\n      ...options,\n      includeNetwork,\n      includePositions,\n      captureThumbnail: hasCaptureThumbnail\n        ? options.captureThumbnail\n        : (includeNetwork ? 'auto' : false),\n    });\n  }\n\n  async flushAutosync(options = {}) {\n    if (this._interactionAutosaveTimer) {\n      clearTimeout(this._interactionAutosaveTimer);\n      this._interactionAutosaveTimer = null;\n    }\n    this._pendingInteractionAutosaveOptions = null;\n    if (this._sessionAutosaveTimer) {\n      clearTimeout(this._sessionAutosaveTimer);\n      this._sessionAutosaveTimer = null;\n    }\n    if (options.force === false && this.networkData?.dirty !== true) return this.persistenceStatus();\n    const pending = this._sessionAutosaveOptions ?? {};\n    return this.flush({\n      ...options,\n      reason: options.reason ?? 'session-autosync-flush',\n      autosync: true,\n      captureThumbnail: Object.prototype.hasOwnProperty.call(options, 'captureThumbnail')\n        ? options.captureThumbnail\n        : (pending.captureThumbnail ?? 'auto'),\n      usePendingAutosaveOptions: true,\n    });\n  }\n\n  destroy() {\n    if (this._interactionAutosaveTimer) clearTimeout(this._interactionAutosaveTimer);\n    this._pendingInteractionAutosaveOptions = null;\n    if (this._sessionAutosaveTimer) clearTimeout(this._sessionAutosaveTimer);\n    this._sessionAutosaveOptions = null;\n    for (const cleanup of this._heliosSessionAutosaveCleanups.splice(0)) cleanup?.();\n    this.states.removeEventListener('change', this._registryChange);\n  }\n\n  _emit(type, detail) {\n    this.dispatchEvent(createDetailEvent(type, detail));\n  }\n}\n\n/**\n * In-memory storage facade used when durable persistence is disabled.\n *\n * @public\n * @apiSection Persistence\n */\nexport class DummyStorageManager extends HeliosStorageManager {\n  constructor(options = {}) {\n    super({\n      ...options,\n      type: 'dummy',\n      persistent: false,\n      sessions: false,\n      network: false,\n      sessionStore: null,\n    });\n  }\n}\n\n/**\n * Browser storage manager backed by IndexedDB and Web Storage fallbacks.\n *\n * @public\n * @apiSection Persistence\n */\nexport class BrowserStorageManager extends HeliosStorageManager {\n  constructor(options = {}) {\n    const indexedDBFactory = options.sessions?.indexedDB ?? options.indexedDB ?? globalThis.indexedDB ?? null;\n    const store = options.sessionStore ?? new SessionStore({\n      store: options.indexedDB === false || !indexedDBFactory\n        ? null\n        : new IndexedDBSessionStore({ ...(options.sessions ?? {}), indexedDB: indexedDBFactory }),\n      storage: options.storage ?? globalThis.localStorage ?? createMemoryStorage(),\n    });\n    super({\n      ...options,\n      type: 'browser',\n      persistent: true,\n      sessions: true,\n      network: options.persistNetwork === true,\n      sessionStore: store,\n    });\n    if (this.sessionId && options.restore !== false) this.ready = this.loadSession(this.sessionId);\n  }\n}\n\n/**\n * Storage manager that delegates session records to a host-provided client.\n *\n * @public\n * @apiSection Persistence\n */\nexport class RemoteStorageManager extends HeliosStorageManager {\n  constructor(options = {}) {\n    const client = options.client ?? {};\n    super({\n      ...options,\n      type: 'remote',\n      persistent: true,\n      sessions: true,\n      network: options.persistNetwork === true,\n      remote: true,\n      sessionStore: new SessionStore({\n        store: {\n          put: (record) => client.putSession?.(record) ?? client.saveSession?.(record),\n          get: (id) => client.getSession?.(id) ?? client.loadSession?.(id),\n          getAll: () => client.listSessions?.() ?? [],\n          delete: (id) => client.deleteSession?.(id) ?? false,\n          getUnfinishedSessionId: (workspaceId) => client.getUnfinishedSessionId?.(workspaceId) ?? null,\n          setUnfinishedSessionId: (id, workspaceId) => client.setUnfinishedSessionId?.(id, workspaceId) ?? (id ?? null),\n        },\n      }),\n    });\n    this.client = client;\n    if (this.sessionId && options.restore !== false) this.ready = this.loadSession(this.sessionId);\n  }\n}\n\n/**\n * Create the storage manager selected by a Helios `storage` constructor option.\n *\n * @public\n * @apiSection Persistence\n */\nexport function createHeliosStorageManager(config = undefined, context = {}) {\n  if (\n    config\n    && typeof config === 'object'\n    && (\n      typeof config.persistenceStatus === 'function'\n      || typeof config.saveSession === 'function'\n      || typeof config.sync === 'function'\n      || config.capabilities\n    )\n  ) {\n    if (!config.helios && context.helios) config.helios = context.helios;\n    return config;\n  }\n  if (config === false || config == null) return new DummyStorageManager(context);\n  if (config === true) return new BrowserStorageManager(context);\n  const options = config && typeof config === 'object' ? { ...config } : {};\n  const type = String(options.type ?? options.kind ?? '').toLowerCase();\n  const merged = {\n    ...context,\n    ...options,\n    sessionId: options.sessionId ?? options.id ?? context.sessionId ?? null,\n  };\n  if (type === 'remote' || options.client) return new RemoteStorageManager(merged);\n  if (type === 'dummy' || type === 'memory') return new DummyStorageManager(merged);\n  return new BrowserStorageManager(merged);\n}\n\nexport default HeliosStorageManager;\n","/** @typedef {import('helios-network').default} HeliosNetwork */\nimport { AttributeType } from 'helios-network';\nimport { LayerManager } from './layers/LayerManager.js';\nimport { Scheduler } from './scheduler/Scheduler.js';\nimport { StaticLayout, WorkerLayout } from './layouts/Layout.js';\nimport { D3Force3DLayout } from './layouts/d3force3dLayoutWorker.js';\nimport { GpuForceLayout } from './layouts/GpuForceLayout.js';\nimport { createRenderer } from './rendering/createRenderer.js';\nimport { resolveSupersamplingPreset, supersamplingPresetToOption } from './rendering/qualityOptions.js';\nimport {\n  CameraTransitionController,\n  applyCameraPose,\n  captureCameraPose,\n  createYawPitchQuaternion,\n  interpolateCameraPose,\n  mergeCameraPose,\n} from './rendering/CameraTransitionController.js';\nimport { AttributeTracker } from './rendering/AttributeTracker.js';\nimport { PerformanceMonitor } from './utilities/PerformanceMonitor.js';\nimport { bumpCounter } from './utilities/counters.js';\nimport { VisualAttributes } from './pipeline/VisualAttributes.js';\nimport { createDefaultMappers, MapperCollection } from './pipeline/Mapper.js';\nimport { createDebugLogger } from './utilities/DebugLogger.js';\nimport { PositionDelegate } from './delegates/PositionDelegate.js';\nimport { DEFAULT_NODE_OUTLINE_WIDTH, DEFAULT_NODE_SIZE, VISUAL_ATTRIBUTE_NAMES } from './pipeline/constants.js';\nimport { SvgLabelController } from './labels/SvgLabelController.js';\nimport { SvgLegendController } from './legends/SvgLegendController.js';\nimport { HeliosFilter } from './filters/HeliosFilter.js';\nimport { DensityLayer } from './rendering/engine/DensityLayer.js';\nimport { HeliosUI } from './ui/HeliosUI.js';\nimport { BEHAVIOR_IDS, Behavior, BehaviorManager, createDefaultBehaviorRegistry } from './behaviors/index.js';\nimport { serializeMapperCollection as serializeMapperCollectionSnapshot } from './behaviors/mapperBehaviorShared.js';\nimport {\n  PERSISTENCE_KINDS,\n  createDefaultNetworkSource,\n  createDefaultPreferencesState,\n  createPersistenceEnvelope,\n  migratePersistenceEnvelope,\n  parsePersistenceEnvelope,\n  serializePersistenceEnvelope,\n} from './persistence/index.js';\nimport { createHeliosStorageManager } from './storage/index.js';\nimport { HeliosStateManager, valuesEqual } from './state/index.js';\nimport {\n  AMBIENT_OCCLUSION_BIAS_DEFAULT,\n  AMBIENT_OCCLUSION_INTENSITY_SCALE_DEFAULT,\n  AMBIENT_OCCLUSION_INTENSITY_SHIFT_DEFAULT,\n  AMBIENT_OCCLUSION_MODE_DEFAULT,\n  AMBIENT_OCCLUSION_QUALITY_DEFAULT,\n  AMBIENT_OCCLUSION_RADIUS_DEFAULT,\n  AMBIENT_OCCLUSION_STRENGTH_DEFAULT,\n  SHADED_AMBIENT_STRENGTH_DEFAULT,\n  SHADED_LIGHT_DIRECTION_DEFAULT,\n  SHADED_LIGHT_COLOR_DEFAULT,\n  SHADED_AMBIENT_TOP_COLOR_DEFAULT,\n  SHADED_AMBIENT_BOTTOM_COLOR_DEFAULT,\n  SHADED_DIFFUSE_STRENGTH_DEFAULT,\n  SHADED_SPECULAR_COLOR_DEFAULT,\n  SHADED_SPECULAR_STRENGTH_DEFAULT,\n  SHADED_SHININESS_DEFAULT,\n} from './rendering/engine/GraphLayer.js';\nimport { normalizeAmbientOcclusionMode } from './rendering/engine/AmbientOcclusionMode.js';\nimport { normalizeAmbientOcclusionQuality } from './rendering/engine/AmbientOcclusionQuality.js';\nimport {\n  buildFigureExportPresetList,\n  getFigureExportCapability,\n  resolveFigureExportOptions,\n  resolveFigureRelativeOverlayScale,\n  resolveFigurePreviewThumbnailOptions,\n} from './export/figureExport.js';\nimport { classifyGestureForSuppression } from './rendering/touchGestureMath.js';\n\nconst {\n  NODE_POSITION_ATTRIBUTE,\n  NODE_SIZE_ATTRIBUTE,\n  NODE_STATE_ATTRIBUTE,\n  NODE_OUTLINE_WIDTH_ATTRIBUTE,\n  EDGE_STATE_ATTRIBUTE,\n} = VISUAL_ATTRIBUTE_NAMES;\nconst DEFAULT_CAMERA_FIT_NODE_RADIUS_WORLD = 0;\nconst DEFAULT_LAYOUT_RUNTIME_POSITION_LIMIT_BYTES = 2 * 1024 * 1024;\n\nconst UMAP_FORCE_FLAG_ATTRIBUTE = 'umap';\nconst DEFAULT_UMAP_EDGE_WEIGHT_ATTRIBUTE = 'umap_weight';\nconst DEFAULT_UMAP_NODE_MASS_ATTRIBUTE = 'umap_mass';\nconst RANDOM_LAYOUT_POSITION_CHOICE = '$random';\nconst DEFAULT_UMAP_FORCE_OPTIONS = Object.freeze({\n  umapA: 1.5769434601962196,\n  umapB: 0.8950608779914887,\n  umapGamma: 1,\n  umapNegativeSampleRate: 5,\n  umapNeighborCount: 15,\n  umapEpochs: null,\n});\n\nfunction createPickingGestureState() {\n  return {\n    active: false,\n    moved: false,\n    cameraMoved: false,\n    wheelZoomed: false,\n    lastWheelAt: -Infinity,\n    lastCameraMoveAt: -Infinity,\n    lastTouchAt: -Infinity,\n    lastTapAt: -Infinity,\n    lastTapClientX: 0,\n    lastTapClientY: 0,\n    suppressNativeClickUntil: -Infinity,\n    pointers: new Map(),\n  };\n}\n\nfunction isLayoutInstance(candidate) {\n  return candidate && typeof candidate.step === 'function' && typeof candidate.initialize === 'function';\n}\n\nfunction uint8ArrayToBase64(bytes) {\n  if (!(bytes instanceof Uint8Array) || bytes.length <= 0) return '';\n  if (typeof Buffer !== 'undefined') {\n    return Buffer.from(bytes).toString('base64');\n  }\n  let binary = '';\n  const chunkSize = 0x8000;\n  for (let offset = 0; offset < bytes.length; offset += chunkSize) {\n    const chunk = bytes.subarray(offset, offset + chunkSize);\n    binary += String.fromCharCode(...chunk);\n  }\n  return btoa(binary);\n}\n\nfunction base64ToUint8Array(value) {\n  if (typeof value !== 'string' || value.length <= 0) return null;\n  if (typeof Buffer !== 'undefined') {\n    return Uint8Array.from(Buffer.from(value, 'base64'));\n  }\n  const binary = atob(value);\n  const bytes = new Uint8Array(binary.length);\n  for (let i = 0; i < binary.length; i += 1) bytes[i] = binary.charCodeAt(i);\n  return bytes;\n}\n\nfunction encodeFloat32ArrayBase64(values) {\n  if (!(values instanceof Float32Array) || values.length <= 0) return null;\n  const bytes = new Uint8Array(values.buffer, values.byteOffset, values.byteLength);\n  return uint8ArrayToBase64(bytes);\n}\n\nfunction decodeFloat32ArrayBase64(value, expectedLength = null) {\n  const bytes = base64ToUint8Array(value);\n  if (!bytes || bytes.byteLength <= 0 || bytes.byteLength % Float32Array.BYTES_PER_ELEMENT !== 0) return null;\n  const copy = new Uint8Array(bytes.byteLength);\n  copy.set(bytes);\n  const view = new Float32Array(copy.buffer);\n  if (expectedLength != null && view.length !== Number(expectedLength)) return null;\n  return view;\n}\n\nfunction forEachIndex(indices, visitor) {\n  if (indices == null) return;\n  if (typeof indices === 'number') {\n    visitor(indices);\n    return;\n  }\n  if (Array.isArray(indices) || ArrayBuffer.isView(indices)) {\n    for (let i = 0; i < indices.length; i += 1) visitor(indices[i]);\n    return;\n  }\n  if (typeof indices[Symbol.iterator] === 'function') {\n    for (const index of indices) visitor(index);\n  }\n}\n\nfunction parseNamespacedEventType(type) {\n  if (typeof type !== 'string') {\n    throw new TypeError('Event type must be a string');\n  }\n  const trimmed = type.trim();\n  if (!trimmed) {\n    throw new Error('Event type cannot be empty');\n  }\n  if (/\\s/.test(trimmed)) {\n    throw new Error('Namespaced event types cannot contain whitespace');\n  }\n  const dot = trimmed.indexOf('.');\n  if (dot === -1) return { type: trimmed, namespace: '' };\n  const base = trimmed.slice(0, dot);\n  const namespace = trimmed.slice(dot + 1);\n  if (!base) {\n    throw new Error('Namespaced event types must include a base type before the \".\"');\n  }\n  return { type: base, namespace };\n}\n\nfunction resolveStateMask(mask, states) {\n  if (typeof mask === 'string' && mask === 'HOVER') return 0;\n  if (typeof mask === 'string') {\n    const value = states?.[mask];\n    if (value == null) {\n      throw new Error(`Unknown state name \"${mask}\"`);\n    }\n    return value;\n  }\n  if (Array.isArray(mask)) {\n    let combined = 0;\n    for (const entry of mask) {\n      combined |= (Number(resolveStateMask(entry, states)) >>> 0);\n    }\n    return combined >>> 0;\n  }\n  return mask;\n}\n\nfunction resolveStateSlot(slot, states) {\n  if (typeof slot !== 'string') return slot;\n  const mask = Number(resolveStateMask(slot, states)) >>> 0;\n  if (!mask || (mask & (mask - 1)) !== 0) {\n    throw new Error(`State \"${slot}\" must map to a single-bit mask to be used as a style slot`);\n  }\n  return 31 - Math.clz32(mask);\n}\n\nfunction normalizeColorInput(color) {\n  if (color == null) return null;\n  if (Array.isArray(color) || ArrayBuffer.isView(color)) {\n    const r = Number(color[0]);\n    const g = Number(color[1]);\n    const b = Number(color[2]);\n    const a = color.length >= 4 ? Number(color[3]) : 1;\n    if (![r, g, b, a].every(Number.isFinite)) return null;\n    const max = Math.max(r, g, b, a);\n    if (max > 1.0) {\n      return [r / 255, g / 255, b / 255, a / 255];\n    }\n    return [r, g, b, a];\n  }\n  if (typeof color === 'string') {\n    const hex = color.trim();\n    if (!hex.startsWith('#')) return null;\n    const raw = hex.slice(1);\n    const expand = (c) => `${c}${c}`;\n    let r = 0; let g = 0; let b = 0; let a = 255;\n    if (raw.length === 3 || raw.length === 4) {\n      r = parseInt(expand(raw[0]), 16);\n      g = parseInt(expand(raw[1]), 16);\n      b = parseInt(expand(raw[2]), 16);\n      if (raw.length === 4) a = parseInt(expand(raw[3]), 16);\n    } else if (raw.length === 6 || raw.length === 8) {\n      r = parseInt(raw.slice(0, 2), 16);\n      g = parseInt(raw.slice(2, 4), 16);\n      b = parseInt(raw.slice(4, 6), 16);\n      if (raw.length === 8) a = parseInt(raw.slice(6, 8), 16);\n    } else {\n      return null;\n    }\n    if (![r, g, b, a].every(Number.isFinite)) return null;\n    return [r / 255, g / 255, b / 255, a / 255];\n  }\n  return null;\n}\n\nfunction normalizeDirectionInput(direction, fallback = SHADED_LIGHT_DIRECTION_DEFAULT) {\n  if (!(Array.isArray(direction) || ArrayBuffer.isView(direction))) return [...fallback];\n  const x = Number(direction[0]);\n  const y = Number(direction[1]);\n  const z = Number(direction[2]);\n  if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) return [...fallback];\n  const length = Math.hypot(x, y, z);\n  if (!(length > 1e-6)) return [...fallback];\n  return [x / length, y / length, z / length];\n}\n\nfunction cloneColorInput(value, fallback) {\n  const normalized = normalizeColorInput(value);\n  return normalized ? [...normalized] : [...fallback];\n}\n\nfunction cloneSerializable(value) {\n  if (Array.isArray(value)) return value.map((entry) => cloneSerializable(entry));\n  if (ArrayBuffer.isView(value)) return Array.from(value, (entry) => cloneSerializable(entry));\n  if (value && typeof value === 'object') {\n    const next = {};\n    for (const [key, entry] of Object.entries(value)) next[key] = cloneSerializable(entry);\n    return next;\n  }\n  return value;\n}\n\nfunction arrayLikeValuesEqual(a, b) {\n  if (Object.is(a, b)) return true;\n  if (!(Array.isArray(a) || ArrayBuffer.isView(a)) || !(Array.isArray(b) || ArrayBuffer.isView(b))) return false;\n  if (a.length !== b.length) return false;\n  for (let i = 0; i < a.length; i += 1) {\n    if (!Object.is(Number(a[i]), Number(b[i]))) return false;\n  }\n  return true;\n}\n\nfunction cameraPoseValuesEqual(a, b) {\n  if (Object.is(a, b)) return true;\n  if (!a || !b || typeof a !== 'object' || typeof b !== 'object') return false;\n  const arrayFields = new Set(['target', 'pan2D', 'pan3D', 'rotation', 'viewport']);\n  const scalarFields = new Set(['mode', 'projection', 'zoom', 'distance']);\n  for (const field of scalarFields) {\n    if (!Object.is(a[field], b[field])) return false;\n  }\n  for (const field of arrayFields) {\n    if (!arrayLikeValuesEqual(a[field] ?? [], b[field] ?? [])) return false;\n  }\n  const knownFields = new Set([...scalarFields, ...arrayFields]);\n  const extraA = Object.keys(a).filter((key) => !knownFields.has(key));\n  const extraB = Object.keys(b).filter((key) => !knownFields.has(key));\n  if (extraA.length !== extraB.length) return false;\n  for (const key of extraA) {\n    if (!Object.prototype.hasOwnProperty.call(b, key) || !valuesEqual(a[key], b[key])) return false;\n  }\n  return true;\n}\n\nfunction normalizeInsets(insets) {\n  if (!insets || typeof insets !== 'object') {\n    return { top: 0, right: 0, bottom: 0, left: 0 };\n  }\n  const coerce = (value) => {\n    const numeric = Number(value);\n    return Number.isFinite(numeric) ? Math.max(0, numeric) : 0;\n  };\n  return {\n    top: coerce(insets.top),\n    right: coerce(insets.right),\n    bottom: coerce(insets.bottom),\n    left: coerce(insets.left),\n  };\n}\n\nfunction mergeOverlayInsets(...entries) {\n  const next = { top: 0, right: 0, bottom: 0, left: 0 };\n  for (const entry of entries) {\n    const insets = normalizeInsets(entry);\n    next.top = Math.max(next.top, insets.top);\n    next.right = Math.max(next.right, insets.right);\n    next.bottom = Math.max(next.bottom, insets.bottom);\n    next.left = Math.max(next.left, insets.left);\n  }\n  return next;\n}\n\nfunction createDetailEvent(type, detail) {\n  if (typeof CustomEvent === 'function') return new CustomEvent(type, { detail });\n  if (typeof Event === 'function') {\n    const event = new Event(type);\n    event.detail = detail;\n    return event;\n  }\n  return { type, detail };\n}\n\nfunction cloneMapperCollection(previous, network, onChange, debug) {\n  const collection = new MapperCollection(previous?.mode ?? 'node', network, onChange, debug);\n  if (!previous?.mappers || previous.mappers.size === 0) {\n    return collection;\n  }\n  collection.mappers.clear();\n  collection.defaultMapper = null;\n  for (const [key, mapper] of previous.mappers.entries()) {\n    const cloned = collection.createMapper(key);\n    for (const [channelName, config] of mapper?.channels?.entries?.() ?? []) {\n      if (!channelName || !config) continue;\n      cloned.setChannel(channelName, { ...config, attributes: config.attributes ?? config.from });\n    }\n    if (!collection.defaultMapper && (key === 'default' || mapper === previous.defaultMapper)) {\n      collection.defaultMapper = cloned;\n    }\n  }\n  if (!collection.defaultMapper) {\n    collection.defaultMapper = collection.mappers.get('default') ?? collection.mappers.values().next().value ?? null;\n  }\n  return collection;\n}\n\nfunction serializeMapperCollectionState(collection) {\n  return serializeMapperCollectionSnapshot(collection);\n}\n\nfunction inferNetworkFormatFromName(name) {\n  if (typeof name !== 'string') return null;\n  const lower = name.trim().toLowerCase();\n  if (lower.endsWith('.bxnet')) return 'bxnet';\n  if (lower.endsWith('.zxnet')) return 'zxnet';\n  if (lower.endsWith('.xnet')) return 'xnet';\n  if (lower.endsWith('.gml')) return 'gml';\n  if (lower.endsWith('.gt.zst')) return 'gt';\n  if (lower.endsWith('.gt')) return 'gt';\n  return null;\n}\n\nfunction normalizeNetworkFileDropOptions(value) {\n  if (value === true) {\n    return {\n      enabled: true,\n      target: 'root',\n      supportedFormats: ['bxnet', 'zxnet', 'xnet', 'gml', 'gt'],\n      replaceOptions: { disposeOld: true, recreateRenderer: true, keepCamera: false },\n    };\n  }\n  if (!value || typeof value !== 'object' || value.enabled === false) return { enabled: false };\n  const formats = Array.isArray(value.supportedFormats)\n    ? value.supportedFormats.map((entry) => String(entry).trim().toLowerCase()).filter(Boolean)\n    : ['bxnet', 'zxnet', 'xnet', 'gml', 'gt'];\n  return {\n    enabled: true,\n    target: value.target ?? 'root',\n    supportedFormats: formats,\n    replaceOptions: {\n      disposeOld: true,\n      recreateRenderer: true,\n      keepCamera: false,\n      ...(value.replaceOptions && typeof value.replaceOptions === 'object' ? value.replaceOptions : {}),\n    },\n    overlayTitle: typeof value.overlayTitle === 'string' ? value.overlayTitle : 'Drop a network file here',\n    overlaySubtitle: typeof value.overlaySubtitle === 'string'\n      ? value.overlaySubtitle\n      : `Supported formats: ${formats.map((fmt) => `.${fmt}`).join(', ')}`,\n  };\n}\n\nfunction hasOwnOption(options, key) {\n  return Object.prototype.hasOwnProperty.call(options ?? {}, key);\n}\n\nfunction hasOwnStringOption(options, key) {\n  return hasOwnOption(options, key) && typeof options?.[key] === 'string' && options[key].trim().length > 0;\n}\n\nconst DEFAULT_DARK_CLEAR_COLOR = Object.freeze([0.01, 0.01, 0.02, 1]);\nconst DEFAULT_LIGHT_CLEAR_COLOR = Object.freeze([1, 1, 1, 1]);\n\nfunction normalizeThemeName(value) {\n  if (typeof value !== 'string') return null;\n  const theme = value.trim().toLowerCase();\n  if (!theme) return null;\n  if (theme === 'light' || theme === 'default') return 'light';\n  if (theme === 'dark' || theme === 'slate') return 'dark';\n  return null;\n}\n\nfunction resolveThemeValueFromElement(element) {\n  if (!element || typeof element.closest !== 'function') return null;\n  const source = element.closest('[data-helios-theme], [data-theme], [data-md-color-scheme]');\n  if (!source || typeof source.getAttribute !== 'function') return null;\n  return normalizeThemeName(\n    source.getAttribute('data-helios-theme')\n    ?? source.getAttribute('data-theme')\n    ?? source.getAttribute('data-md-color-scheme'),\n  );\n}\n\nfunction resolveThemeValueFromDocument() {\n  if (typeof document === 'undefined') return null;\n  const roots = [document.documentElement, document.body].filter(Boolean);\n  for (const root of roots) {\n    const theme = normalizeThemeName(\n      root.getAttribute?.('data-helios-theme')\n      ?? root.getAttribute?.('data-theme')\n      ?? root.getAttribute?.('data-md-color-scheme'),\n    );\n    if (theme) return theme;\n  }\n  return null;\n}\n\nfunction resolveContainerElement(container) {\n  if (typeof document === 'undefined') return null;\n  if (typeof container === 'string') {\n    try {\n      return document.querySelector(container);\n    } catch (_) {\n      return null;\n    }\n  }\n  return container && typeof container === 'object' && container.nodeType === 1 ? container : null;\n}\n\nfunction resolveBrowserTheme() {\n  if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return null;\n  try {\n    if (window.matchMedia('(prefers-color-scheme: light)').matches) return 'light';\n    if (window.matchMedia('(prefers-color-scheme: dark)').matches) return 'dark';\n  } catch (_) {\n    return null;\n  }\n  return null;\n}\n\nfunction resolveInitialTheme(options = {}, container = null) {\n  const uiOptions = options.ui && typeof options.ui === 'object' ? options.ui : {};\n  const quickOptions = options.quickControls && typeof options.quickControls === 'object'\n    ? options.quickControls\n    : {};\n  const explicitTheme = normalizeThemeName(options.theme)\n    ?? normalizeThemeName(uiOptions.theme)\n    ?? normalizeThemeName(quickOptions.theme);\n  if (explicitTheme) return explicitTheme;\n  const containerElement = resolveContainerElement(container);\n  return resolveThemeValueFromElement(containerElement)\n    ?? resolveThemeValueFromDocument()\n    ?? resolveBrowserTheme()\n    ?? 'dark';\n}\n\nfunction hasExplicitThemeOption(options = {}) {\n  const uiOptions = options.ui && typeof options.ui === 'object' ? options.ui : {};\n  const quickOptions = options.quickControls && typeof options.quickControls === 'object'\n    ? options.quickControls\n    : {};\n  return hasOwnStringOption(options, 'theme')\n    || hasOwnStringOption(uiOptions, 'theme')\n    || hasOwnStringOption(quickOptions, 'theme');\n}\n\nfunction copyDefaultClearColorForTheme(theme) {\n  return [...(theme === 'light' ? DEFAULT_LIGHT_CLEAR_COLOR : DEFAULT_DARK_CLEAR_COLOR)];\n}\n\nfunction normalizeInitialClearColorOptions(options = {}, theme = 'dark') {\n  const hasClearColor = hasOwnOption(options, 'clearColor');\n  const hasBackground = hasOwnOption(options, 'background');\n  if (hasClearColor || hasBackground) {\n    const color = hasClearColor ? options.clearColor : options.background;\n    const normalized = normalizeColorInput(color);\n    if (!normalized) {\n      throw new Error('Helios options.clearColor/background expects #rgb/#rgba/#rrggbb/#rrggbbaa or [r,g,b(,a)]');\n    }\n    options.clearColor = normalized;\n    return normalized;\n  }\n  options.clearColor = copyDefaultClearColorForTheme(theme);\n  return options.clearColor;\n}\n\nfunction shouldDisableAutoThemeDefault(detail = {}) {\n  const source = String(detail.source ?? '').trim();\n  const reason = String(detail.reason ?? '').trim();\n  if (source === 'default' || source === 'binding' || source === 'refresh') return false;\n  if (reason === 'auto-theme' || reason.startsWith('auto-theme:')) return false;\n  return source === 'restore'\n    || source === 'ui'\n    || source === 'program'\n    || source === 'cli'\n    || source === 'state'\n    || detail.explicit === true\n    || detail.trackOverride === true\n    || detail.overrideChanged === true;\n}\n\nfunction shouldEnablePersistence(options = {}) {\n  if (options.storage === true) return true;\n  if (options.storage && typeof options.storage === 'object') {\n    const type = String(options.storage.type ?? options.storage.kind ?? '').toLowerCase();\n    if (type !== 'dummy' && type !== 'memory') return true;\n  }\n  return [\n    'workspaceId',\n    'networkPersistence',\n    'positionPersistence',\n    'session',\n    'sessionId',\n  ].some((key) => hasOwnOption(options, key) && options[key] !== false && options[key] != null);\n}\n\nfunction normalizeSessionPersistenceOptions(options = {}) {\n  if (options.session === false) return false;\n  const topLevelSessionId = options.sessionId != null && String(options.sessionId).trim()\n    ? { sessionId: String(options.sessionId).trim() }\n    : {};\n  if (typeof options.session === 'string' && options.session.trim()) return { sessionId: options.session.trim() };\n  if (options.session === true) return { ...topLevelSessionId };\n  if (options.session && typeof options.session === 'object') {\n    return {\n      ...options.session,\n      ...topLevelSessionId,\n    };\n  }\n  if (topLevelSessionId.sessionId) return { ...topLevelSessionId };\n  return false;\n}\n\nfunction normalizeStorageSessionId(options = {}) {\n  const storage = options.storage;\n  if (!storage || typeof storage !== 'object') return null;\n  const value = storage.sessionId ?? storage.id ?? null;\n  return value != null && String(value).trim() ? String(value).trim() : null;\n}\n\nconst CAMERA_CONTROL_STATE_KEYS = Object.freeze([\n  'autoFit',\n  'autoFitCoverage',\n  'autoFitPaddingRatio',\n  'autoFitMaxSamples',\n  'autoFitIntervalMs',\n  'autoFitMinIntervalMs',\n  'autoFitMaxIntervalMs',\n  'autoFitLargeNetworkScale',\n  'autoFitIntervalNodeCountRef',\n  'largeNetworkStartupFit',\n  'largeNetworkStartupNodeThreshold',\n  'largeNetworkStartupEdgeThreshold',\n  'largeNetworkStartupScale',\n  'largeNetworkStartupDurationMs',\n  'animation',\n  'animationDurationMs',\n  'orbit',\n  'orbitSpeed',\n  'orbitDirection',\n  'orbitAxis',\n  'orbitAngle',\n  'followTarget',\n  'followUpdateIntervalMs',\n  'targetNodeIndices',\n]);\n\nfunction isExplicitCameraStateSource(source, options = {}) {\n  const value = String(source ?? '').trim();\n  return value === 'ui' || value === 'interaction' || value === 'cli' || value === 'program' || options.manual === true;\n}\n\nfunction isBehaviorLike(candidate) {\n  return candidate instanceof Behavior || Boolean(candidate && typeof candidate.attach === 'function');\n}\n\nfunction createBehaviorNamespace(helios) {\n  const behaviorAccessor = function behavior(name) {\n    return helios.getBehavior(name);\n  };\n  return new Proxy(behaviorAccessor, {\n    apply(_target, _thisArg, args) {\n      return helios.getBehavior(args[0]);\n    },\n    get(target, prop, receiver) {\n      if (typeof prop !== 'string' || Reflect.has(target, prop)) {\n        return Reflect.get(target, prop, receiver);\n      }\n      return helios.getBehavior(prop);\n    },\n  });\n}\n\nfunction elementToMarkup(element) {\n  if (!element) return '';\n  return new XMLSerializer().serializeToString(element);\n}\n\nfunction normalizeExportPixels(pixels, width, height, options = {}) {\n  const source = pixels instanceof Uint8Array ? pixels : new Uint8Array(pixels);\n  const normalized = new Uint8ClampedArray(width * height * 4);\n  const flipY = options.flipY === true;\n  const swizzleBGRA = options.swizzleBGRA === true;\n  const alphaMode = String(options.alphaMode ?? 'straight').trim().toLowerCase();\n  for (let row = 0; row < height; row += 1) {\n    const srcRow = flipY ? (height - 1 - row) : row;\n    for (let col = 0; col < width; col += 1) {\n      const srcOffset = (srcRow * width + col) * 4;\n      const dstOffset = (row * width + col) * 4;\n      let red;\n      let green;\n      let blue;\n      const alpha = source[srcOffset + 3];\n      if (swizzleBGRA) {\n        red = source[srcOffset + 2];\n        green = source[srcOffset + 1];\n        blue = source[srcOffset];\n      } else {\n        red = source[srcOffset];\n        green = source[srcOffset + 1];\n        blue = source[srcOffset + 2];\n      }\n      if (alphaMode === 'straight') {\n        if (alpha <= 0) {\n          red = 0;\n          green = 0;\n          blue = 0;\n        } else if (alpha < 255) {\n          const scale = 255 / alpha;\n          red = Math.min(255, Math.round(red * scale));\n          green = Math.min(255, Math.round(green * scale));\n          blue = Math.min(255, Math.round(blue * scale));\n        }\n      }\n      normalized[dstOffset] = red;\n      normalized[dstOffset + 1] = green;\n      normalized[dstOffset + 2] = blue;\n      normalized[dstOffset + 3] = alpha;\n    }\n  }\n  return normalized;\n}\n\nfunction pixelsToCanvas(pixels, width, height, outputWidth, outputHeight, options = {}) {\n  const normalizedPixels = normalizeExportPixels(pixels, width, height, options);\n  const fullCanvas = document.createElement('canvas');\n  fullCanvas.width = Math.max(1, width);\n  fullCanvas.height = Math.max(1, height);\n  const fullCtx = fullCanvas.getContext('2d', { willReadFrequently: true });\n  if (!fullCtx) throw new Error('Unable to create a 2D canvas context for figure export');\n  fullCtx.putImageData(new ImageData(normalizedPixels, width, height), 0, 0);\n\n  if (width === outputWidth && height === outputHeight) {\n    return fullCanvas;\n  }\n\n  const outputCanvas = document.createElement('canvas');\n  outputCanvas.width = Math.max(1, outputWidth);\n  outputCanvas.height = Math.max(1, outputHeight);\n  const outputCtx = outputCanvas.getContext('2d');\n  if (!outputCtx) throw new Error('Unable to create an output canvas for figure export');\n  outputCtx.imageSmoothingEnabled = true;\n  if (typeof outputCtx.imageSmoothingQuality !== 'undefined') outputCtx.imageSmoothingQuality = 'high';\n  outputCtx.drawImage(fullCanvas, 0, 0, outputCanvas.width, outputCanvas.height);\n  return outputCanvas;\n}\n\nfunction canvasToBlob(canvas, type) {\n  return new Promise((resolve, reject) => {\n    canvas.toBlob((blob) => {\n      if (blob) resolve(blob);\n      else reject(new Error(`Failed to encode figure as ${type}`));\n    }, type);\n  });\n}\n\nfunction scaledCanvasThumbnailBlob(sourceCanvas, options = {}) {\n  if (!sourceCanvas || typeof document === 'undefined') return null;\n  const sourceWidth = Math.floor(Number(sourceCanvas.width) || 0);\n  const sourceHeight = Math.floor(Number(sourceCanvas.height) || 0);\n  if (sourceWidth <= 0 || sourceHeight <= 0) return null;\n  const maxWidth = Math.max(1, Math.floor(Number(options.maxWidth ?? options.width) || 320));\n  const maxHeight = Math.max(1, Math.floor(Number(options.maxHeight ?? options.height) || 180));\n  const scale = Math.min(maxWidth / sourceWidth, maxHeight / sourceHeight);\n  const width = Math.max(1, Math.round(sourceWidth * scale));\n  const height = Math.max(1, Math.round(sourceHeight * scale));\n  const outputCanvas = document.createElement('canvas');\n  outputCanvas.width = width;\n  outputCanvas.height = height;\n  const ctx = outputCanvas.getContext('2d');\n  if (!ctx) return null;\n  ctx.imageSmoothingEnabled = true;\n  if (typeof ctx.imageSmoothingQuality !== 'undefined') ctx.imageSmoothingQuality = 'medium';\n  ctx.drawImage(sourceCanvas, 0, 0, width, height);\n  return canvasToBlob(outputCanvas, 'image/png');\n}\n\nfunction loadSvgImage(svgText) {\n  return new Promise((resolve, reject) => {\n    const blob = new Blob([svgText], { type: 'image/svg+xml' });\n    const url = URL.createObjectURL(blob);\n    const image = new Image();\n    image.onload = () => {\n      URL.revokeObjectURL(url);\n      resolve(image);\n    };\n    image.onerror = (error) => {\n      URL.revokeObjectURL(url);\n      reject(error instanceof Error ? error : new Error('Failed to rasterize SVG overlay'));\n    };\n    image.src = url;\n  });\n}\n\nconst ILLUSTRATOR_EXPORT_FONT_FAMILY = '\"Helvetica Neue\", Helvetica, Arial, sans-serif';\n\nfunction resolveExportBackgroundColor(backgroundColor) {\n  const source = Array.isArray(backgroundColor) ? backgroundColor : [1, 1, 1, 1];\n  const red = Math.max(0, Math.min(255, Math.round(Number(source[0] ?? 0) * 255)));\n  const green = Math.max(0, Math.min(255, Math.round(Number(source[1] ?? 0) * 255)));\n  const blue = Math.max(0, Math.min(255, Math.round(Number(source[2] ?? 0) * 255)));\n  return {\n    red,\n    green,\n    blue,\n    css: `rgb(${red} ${green} ${blue})`,\n  };\n}\n\nfunction buildExportLogicalViewport(options = {}) {\n  const width = Math.max(\n    1,\n    Number(options.logicalWidth ?? options.width ?? options.bitmapWidth ?? options.previewRect?.width ?? 1),\n  );\n  const height = Math.max(\n    1,\n    Number(options.logicalHeight ?? options.height ?? options.bitmapHeight ?? options.previewRect?.height ?? 1),\n  );\n  const bitmapWidth = Math.max(1, Number(options.bitmapWidth ?? width));\n  const bitmapHeight = Math.max(1, Number(options.bitmapHeight ?? height));\n  const devicePixelRatio = Math.max(\n    1,\n    Number(options.devicePixelRatio ?? Math.max(bitmapWidth / width, bitmapHeight / height, 1)),\n  );\n  return { width, height, devicePixelRatio };\n}\n\nfunction createMat4Identity() {\n  const out = new Float32Array(16);\n  out[0] = 1;\n  out[5] = 1;\n  out[10] = 1;\n  out[15] = 1;\n  return out;\n}\n\nfunction safeSignedDivisor(value, epsilon = 1e-12) {\n  if (!Number.isFinite(value)) return epsilon;\n  if (Math.abs(value) >= epsilon) return value;\n  return value < 0 ? -epsilon : epsilon;\n}\n\nfunction mat4Multiply(out, a, b) {\n  const a00 = a[0];\n  const a01 = a[1];\n  const a02 = a[2];\n  const a03 = a[3];\n  const a10 = a[4];\n  const a11 = a[5];\n  const a12 = a[6];\n  const a13 = a[7];\n  const a20 = a[8];\n  const a21 = a[9];\n  const a22 = a[10];\n  const a23 = a[11];\n  const a30 = a[12];\n  const a31 = a[13];\n  const a32 = a[14];\n  const a33 = a[15];\n\n  const b00 = b[0];\n  const b01 = b[1];\n  const b02 = b[2];\n  const b03 = b[3];\n  const b10 = b[4];\n  const b11 = b[5];\n  const b12 = b[6];\n  const b13 = b[7];\n  const b20 = b[8];\n  const b21 = b[9];\n  const b22 = b[10];\n  const b23 = b[11];\n  const b30 = b[12];\n  const b31 = b[13];\n  const b32 = b[14];\n  const b33 = b[15];\n\n  out[0] = a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03;\n  out[1] = a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03;\n  out[2] = a02 * b00 + a12 * b01 + a22 * b02 + a32 * b03;\n  out[3] = a03 * b00 + a13 * b01 + a23 * b02 + a33 * b03;\n  out[4] = a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13;\n  out[5] = a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13;\n  out[6] = a02 * b10 + a12 * b11 + a22 * b12 + a32 * b13;\n  out[7] = a03 * b10 + a13 * b11 + a23 * b12 + a33 * b13;\n  out[8] = a00 * b20 + a10 * b21 + a20 * b22 + a30 * b23;\n  out[9] = a01 * b20 + a11 * b21 + a21 * b22 + a31 * b23;\n  out[10] = a02 * b20 + a12 * b21 + a22 * b22 + a32 * b23;\n  out[11] = a03 * b20 + a13 * b21 + a23 * b22 + a33 * b23;\n  out[12] = a00 * b30 + a10 * b31 + a20 * b32 + a30 * b33;\n  out[13] = a01 * b30 + a11 * b31 + a21 * b32 + a31 * b33;\n  out[14] = a02 * b30 + a12 * b31 + a22 * b32 + a32 * b33;\n  out[15] = a03 * b30 + a13 * b31 + a23 * b32 + a33 * b33;\n  return out;\n}\n\nfunction mat4Frustum(out, left, right, bottom, top, near, far) {\n  const rl = 1 / safeSignedDivisor(right - left);\n  const tb = 1 / safeSignedDivisor(top - bottom);\n  const nf = 1 / safeSignedDivisor(near - far);\n  out[0] = (2 * near) * rl;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = (2 * near) * tb;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = (right + left) * rl;\n  out[9] = (top + bottom) * tb;\n  out[10] = (far + near) * nf;\n  out[11] = -1;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = (2 * far * near) * nf;\n  out[15] = 0;\n  return out;\n}\n\nfunction mat4Ortho(out, left, right, bottom, top, near, far) {\n  const lr = 1 / safeSignedDivisor(left - right);\n  const bt = 1 / safeSignedDivisor(bottom - top);\n  const nf = 1 / safeSignedDivisor(near - far);\n  out[0] = -2 * lr;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = -2 * bt;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = 2 * nf;\n  out[11] = 0;\n  out[12] = (left + right) * lr;\n  out[13] = (top + bottom) * bt;\n  out[14] = (far + near) * nf;\n  out[15] = 1;\n  return out;\n}\n\nfunction interpolateFrameBounds(bounds, previewRect, liveViewport) {\n  const liveWidth = Math.max(1, Number(liveViewport?.width ?? 1));\n  const liveHeight = Math.max(1, Number(liveViewport?.height ?? 1));\n  const x = Math.min(Math.max(0, Number(previewRect?.x ?? 0)), liveWidth);\n  const y = Math.min(Math.max(0, Number(previewRect?.y ?? 0)), liveHeight);\n  const width = Math.min(\n    Math.max(1e-6, Number(previewRect?.width ?? liveWidth)),\n    Math.max(1e-6, liveWidth - x),\n  );\n  const height = Math.min(\n    Math.max(1e-6, Number(previewRect?.height ?? liveHeight)),\n    Math.max(1e-6, liveHeight - y),\n  );\n\n  const u0 = x / liveWidth;\n  const u1 = (x + width) / liveWidth;\n  const v0 = y / liveHeight;\n  const v1 = (y + height) / liveHeight;\n\n  return {\n    left: bounds.left + ((bounds.right - bounds.left) * u0),\n    right: bounds.left + ((bounds.right - bounds.left) * u1),\n    top: bounds.top + ((bounds.bottom - bounds.top) * v0),\n    bottom: bounds.top + ((bounds.bottom - bounds.top) * v1),\n  };\n}\n\nfunction derivePerspectiveBounds(projectionMatrix, near) {\n  const m00 = Number(projectionMatrix?.[0] ?? 0);\n  const m11 = Number(projectionMatrix?.[5] ?? 0);\n  const m20 = Number(projectionMatrix?.[8] ?? 0);\n  const m21 = Number(projectionMatrix?.[9] ?? 0);\n  if (!Number.isFinite(m00) || !Number.isFinite(m11) || Math.abs(m00) < 1e-12 || Math.abs(m11) < 1e-12) {\n    return null;\n  }\n  return {\n    left: near * ((m20 - 1) / m00),\n    right: near * ((m20 + 1) / m00),\n    bottom: near * ((m21 - 1) / m11),\n    top: near * ((m21 + 1) / m11),\n  };\n}\n\nfunction deriveOrthographicBounds(projectionMatrix) {\n  const m00 = Number(projectionMatrix?.[0] ?? 0);\n  const m11 = Number(projectionMatrix?.[5] ?? 0);\n  const m30 = Number(projectionMatrix?.[12] ?? 0);\n  const m31 = Number(projectionMatrix?.[13] ?? 0);\n  if (!Number.isFinite(m00) || !Number.isFinite(m11) || Math.abs(m00) < 1e-12 || Math.abs(m11) < 1e-12) {\n    return null;\n  }\n  return {\n    left: (-1 - m30) / m00,\n    right: (1 - m30) / m00,\n    bottom: (-1 - m31) / m11,\n    top: (1 - m31) / m11,\n  };\n}\n\nfunction normalizeTruthyNetworkFlag(value) {\n  if (typeof value === 'boolean') return value;\n  if (typeof value === 'number' || typeof value === 'bigint') {\n    return Number(value) !== 0;\n  }\n  if (typeof value === 'string') {\n    const normalized = value.trim().toLowerCase();\n    if (!normalized) return false;\n    if (['1', 'true', 'yes', 'y', 'on', 'enabled', 'umap'].includes(normalized)) return true;\n    if (['0', 'false', 'no', 'n', 'off', 'disabled'].includes(normalized)) return false;\n  }\n  return false;\n}\n\nfunction normalizeForceModel(value) {\n  const normalized = String(value ?? '').trim().toLowerCase();\n  if (normalized === 'umap') return 'umap';\n  if (normalized === 'linear' || normalized === 'force' || normalized === 'gpu-force') return 'linear';\n  return null;\n}\n\nfunction readNetworkAttributeValue(network, name) {\n  if (!network || typeof name !== 'string' || !name.trim()) return undefined;\n  const info = network.getNetworkAttributeInfo?.(name) ?? null;\n  if (!info || Number(info.dimension ?? 1) !== 1) return undefined;\n  if (Number(info.type) === AttributeType.String || Number(info.type) === AttributeType.Category) {\n    return network.getNetworkStringAttribute?.(name);\n  }\n  let value;\n  const read = () => {\n    const buffer = network.getNetworkAttributeBuffer?.(name) ?? null;\n    value = buffer?.view?.[0];\n  };\n  try {\n    if (typeof network.withBufferAccess === 'function') network.withBufferAccess(read);\n    else read();\n  } catch (error) {\n    console.warn(`Helios: failed to read network attribute \"${name}\".`, error);\n    return undefined;\n  }\n  return value;\n}\n\nfunction readNetworkStringAttributeValue(network, name) {\n  const value = readNetworkAttributeValue(network, name);\n  if (value == null) return null;\n  return String(value).trim() || null;\n}\n\nfunction readNetworkNumberAttribute(network, name, fallback) {\n  const value = Number(readNetworkAttributeValue(network, name));\n  return Number.isFinite(value) ? value : fallback;\n}\n\nfunction resolveGpuForceLayoutOptionsFromNetwork(network, requestedOptions = {}) {\n  const explicitModel = normalizeForceModel(requestedOptions.forceModel);\n  const enabledByGraph = normalizeTruthyNetworkFlag(readNetworkAttributeValue(network, UMAP_FORCE_FLAG_ATTRIBUTE));\n  const skipTuningModelForEmbeddedGraph = requestedOptions.skipTuningModel ?? (enabledByGraph ? true : undefined);\n  if (explicitModel === 'linear') {\n    return { ...requestedOptions, forceModel: 'linear', skipTuningModel: skipTuningModelForEmbeddedGraph };\n  }\n  if (!enabledByGraph && explicitModel !== 'umap') {\n    return { ...requestedOptions, forceModel: 'linear' };\n  }\n  if (!enabledByGraph) {\n    console.warn('Helios: ignoring gpu-force UMAP mode because the graph-level \"umap\" attribute is not enabled.');\n    return { ...requestedOptions, forceModel: 'linear' };\n  }\n\n  const edgeWeightAttribute = String(\n    requestedOptions.edgeWeightAttribute\n      ?? readNetworkStringAttributeValue(network, 'umap_edge_weight_attr')\n      ?? DEFAULT_UMAP_EDGE_WEIGHT_ATTRIBUTE,\n  ).trim();\n  if (!edgeWeightAttribute || !network?.hasEdgeAttribute?.(edgeWeightAttribute)) {\n    console.warn(\n      `Helios: ignoring gpu-force UMAP mode because edge attribute \"${edgeWeightAttribute || DEFAULT_UMAP_EDGE_WEIGHT_ATTRIBUTE}\" is unavailable.`,\n    );\n    return { ...requestedOptions, forceModel: 'linear', skipTuningModel: skipTuningModelForEmbeddedGraph };\n  }\n\n  const requestedMassAttribute = requestedOptions.nodeMassAttribute ?? readNetworkStringAttributeValue(network, 'umap_node_mass_attr');\n  const normalizedMassAttribute = typeof requestedMassAttribute === 'string' && requestedMassAttribute.trim()\n    ? requestedMassAttribute.trim()\n    : DEFAULT_UMAP_NODE_MASS_ATTRIBUTE;\n  const nodeMassAttribute = network?.hasNodeAttribute?.(normalizedMassAttribute)\n    ? normalizedMassAttribute\n    : null;\n  const requestedPositionAttribute = requestedOptions.umapPositionAttribute\n    ?? readNetworkStringAttributeValue(network, 'umap_position_attr');\n  const normalizedPositionAttribute = typeof requestedPositionAttribute === 'string' && requestedPositionAttribute.trim()\n    ? requestedPositionAttribute.trim()\n    : null;\n  const umapHasInitialPositions = Boolean(\n    normalizedPositionAttribute\n    && network?.hasNodeAttribute?.(normalizedPositionAttribute),\n  );\n\n  return {\n    ...requestedOptions,\n    forceModel: 'umap',\n    skipTuningModel: skipTuningModelForEmbeddedGraph,\n    edgeWeightAttribute,\n    nodeMassAttribute,\n    umapPositionAttribute: umapHasInitialPositions ? normalizedPositionAttribute : null,\n    umapHasInitialPositions,\n    umapA: readNetworkNumberAttribute(network, 'umap_a', requestedOptions.umapA ?? DEFAULT_UMAP_FORCE_OPTIONS.umapA),\n    umapB: readNetworkNumberAttribute(network, 'umap_b', requestedOptions.umapB ?? DEFAULT_UMAP_FORCE_OPTIONS.umapB),\n    umapGamma: readNetworkNumberAttribute(network, 'umap_gamma', requestedOptions.umapGamma ?? DEFAULT_UMAP_FORCE_OPTIONS.umapGamma),\n    umapNeighborCount: readNetworkNumberAttribute(\n      network,\n      'umap_n_neighbors',\n      requestedOptions.umapNeighborCount ?? DEFAULT_UMAP_FORCE_OPTIONS.umapNeighborCount,\n    ),\n    umapNegativeSampleRate: readNetworkNumberAttribute(\n      network,\n      'umap_negative_sample_rate',\n      requestedOptions.umapNegativeSampleRate ?? DEFAULT_UMAP_FORCE_OPTIONS.umapNegativeSampleRate,\n    ),\n    umapEpochs: readNetworkNumberAttribute(\n      network,\n      'umap_n_epochs',\n      requestedOptions.umapEpochs ?? DEFAULT_UMAP_FORCE_OPTIONS.umapEpochs,\n    ),\n    kAttraction: Number.isFinite(Number(requestedOptions.kAttraction)) ? requestedOptions.kAttraction : 1,\n    kRepulsion: Number.isFinite(Number(requestedOptions.kRepulsion)) ? requestedOptions.kRepulsion : 1,\n    kGravity: Number.isFinite(Number(requestedOptions.kGravity)) ? requestedOptions.kGravity : 0,\n  };\n}\n\nfunction computeGpuForceModeSwitchDepthJitter(layout) {\n  const depth = Math.max(0, Number(layout?.options?.depth ?? 0) || 0);\n  const radius = Math.max(0, Number(layout?.options?.radius ?? 0) || 0);\n  const jitterBase = depth > 1e-6 ? depth : Math.max(1, radius * 0.25);\n  return Math.max(1e-4, jitterBase * 0.005);\n}\n\nfunction hash32(value) {\n  let x = value >>> 0;\n  x ^= x >>> 16;\n  x = Math.imul(x, 0x7feb352d) >>> 0;\n  x ^= x >>> 15;\n  x = Math.imul(x, 0x846ca68b) >>> 0;\n  x ^= x >>> 16;\n  return x >>> 0;\n}\n\nfunction hasMeaningfulDepth(snapshot, amplitude = 0) {\n  if (!(snapshot instanceof Float32Array) || snapshot.length < 3) return false;\n  let minZ = Infinity;\n  let maxZ = -Infinity;\n  for (let i = 2; i < snapshot.length; i += 3) {\n    const z = Number(snapshot[i]);\n    if (!Number.isFinite(z)) continue;\n    if (z < minZ) minZ = z;\n    if (z > maxZ) maxZ = z;\n  }\n  if (!Number.isFinite(minZ) || !Number.isFinite(maxZ)) return false;\n  const tolerance = Math.max(1e-6, Math.abs(Number(amplitude) || 0) * 0.05);\n  return (maxZ - minZ) > tolerance;\n}\n\nfunction applyPlanarDepthJitter(snapshot, amplitude = 0) {\n  if (!(snapshot instanceof Float32Array) || snapshot.length < 3) return false;\n  const safeAmplitude = Math.max(1e-4, Number(amplitude) || 0);\n  const count = Math.floor(snapshot.length / 3);\n  if (count <= 0 || hasMeaningfulDepth(snapshot, safeAmplitude)) return false;\n  let mean = 0;\n  for (let nodeId = 0; nodeId < count; nodeId += 1) {\n    mean += ((((hash32(nodeId + 1) + 0.5) / 4294967296) - 0.5) * safeAmplitude);\n  }\n  mean /= Math.max(1, count);\n  for (let nodeId = 0; nodeId < count; nodeId += 1) {\n    const offset = (nodeId * 3) + 2;\n    const currentZ = Number(snapshot[offset]);\n    const baseZ = Number.isFinite(currentZ) ? currentZ : 0;\n    const noise = ((((hash32(nodeId + 1) + 0.5) / 4294967296) - 0.5) * safeAmplitude) - mean;\n    snapshot[offset] = baseZ + noise;\n  }\n  return true;\n}\n\nfunction resolveSeedBoundsForLayout(layoutOption, size, mode) {\n  const safeMode = mode === '2d' ? '2d' : '3d';\n  const width = Math.max(1, size?.width ?? 1)*0.01;\n  const height = Math.max(1, size?.height ?? 1)*0.01;\n  const minSide = Math.max(1, Math.min(width, height));\n  const base = {\n    width: minSide,\n    height: minSide,\n    depth: safeMode === '3d' ? minSide : 0,\n    mode: safeMode,\n    center: [0, 0, 0],\n  };\n\n  if (!layoutOption || isLayoutInstance(layoutOption)) return base;\n  if (layoutOption?.type === 'worker') {\n    const opts = layoutOption.options ?? {};\n    const radius = Number.isFinite(opts.radius) ? Math.max(1, opts.radius) : 150;\n    const depth = Number.isFinite(opts.depth) ? Math.max(0, opts.depth) : radius;\n    const center = Array.isArray(opts.center) ? opts.center : [0, 0, 0];\n    const side = safeMode === '3d' ? Math.max(radius, depth, 1) : radius;\n    return {\n      width: side,\n      height: side,\n      depth: safeMode === '3d' ? side : 0,\n      mode: safeMode,\n      center,\n    };\n  }\n  if (layoutOption?.type === 'gpu-force' || layoutOption?.type === 'gpuforce') {\n    const opts = layoutOption.options ?? {};\n    const radius = Number.isFinite(opts.radius) ? Math.max(1, opts.radius) : 150;\n    const depth = Number.isFinite(opts.depth) ? Math.max(0, opts.depth) : radius;\n    const center = Array.isArray(opts.center) ? opts.center : [0, 0, 0];\n    const side = safeMode === '3d' ? Math.max(radius, depth, 1) : radius;\n    return {\n      width: side,\n      height: side,\n      depth: safeMode === '3d' ? side : 0,\n      mode: safeMode,\n      center,\n    };\n  }\n\n  if (layoutOption?.type === 'd3force3d' || layoutOption?.type === 'd3-force-3d') {\n    const bounds = layoutOption?.options?.bounds ?? null;\n    if (Array.isArray(bounds) && bounds.length >= 4) {\n      const minX = Number(bounds[0]);\n      const minY = Number(bounds[1]);\n      const maxX = Number(bounds[2]);\n      const maxY = Number(bounds[3]);\n      if ([minX, minY, maxX, maxY].every(Number.isFinite)) {\n        return {\n          width: Math.max(1, maxX - minX),\n          height: Math.max(1, maxY - minY),\n          depth: 0,\n          mode: safeMode,\n          center: [(minX + maxX) * 0.5, (minY + maxY) * 0.5, 0],\n        };\n      }\n    }\n  }\n\n  const bounds = layoutOption?.options?.bounds ?? null;\n  if (Array.isArray(bounds) && bounds.length >= 4) {\n    const minX = Number(bounds[0]);\n    const minY = Number(bounds[1]);\n    const maxX = Number(bounds[2]);\n    const maxY = Number(bounds[3]);\n    if ([minX, minY, maxX, maxY].every(Number.isFinite)) {\n      return {\n        width: Math.max(1, maxX - minX),\n        height: Math.max(1, maxY - minY),\n        depth: 0,\n        mode: safeMode,\n        center: [(minX + maxX) * 0.5, (minY + maxY) * 0.5, 0],\n      };\n    }\n  }\n\n  return base;\n}\n\nfunction isNumericLayoutPositionAttributeType(type) {\n  return type === AttributeType.Float\n    || type === AttributeType.Double\n    || type === AttributeType.Integer\n    || type === AttributeType.UnsignedInteger\n    || type === AttributeType.BigInteger\n    || type === AttributeType.UnsignedBigInteger;\n}\n\nfunction getBaseFilename(name) {\n  if (typeof name !== 'string') return 'network';\n  const trimmed = name.trim();\n  if (!trimmed) return 'network';\n  const withoutGtZst = trimmed.replace(/\\.gt\\.zst$/i, '');\n  if (withoutGtZst !== trimmed) return withoutGtZst;\n  const withoutKnown = trimmed.replace(/\\.(bxnet|zxnet|xnet|gml|gt)$/i, '');\n  if (withoutKnown !== trimmed) return withoutKnown;\n  return trimmed.replace(/\\.[^/.]+$/, '') || trimmed;\n}\n\nfunction clamp(value, min, max) {\n  return Math.max(min, Math.min(max, value));\n}\n\nfunction copyVec3(value, fallback = 0) {\n  return [\n    Number.isFinite(value?.[0]) ? value[0] : fallback,\n    Number.isFinite(value?.[1]) ? value[1] : fallback,\n    Number.isFinite(value?.[2]) ? value[2] : fallback,\n  ];\n}\n\nfunction resolve2DCenterFromPose(pose, fallbackZ = 0) {\n  const zoom = Math.max(1e-6, Number.isFinite(pose?.zoom) ? pose.zoom : 1);\n  const pan = pose?.pan2D ?? [0, 0, 0];\n  return [\n    -(Number(pan[0]) || 0) / zoom,\n    -(Number(pan[1]) || 0) / zoom,\n    Number.isFinite(fallbackZ) ? fallbackZ : 0,\n  ];\n}\n\nfunction resolve3DCenterFromPose(pose) {\n  const target = pose?.target ?? [0, 0, 0];\n  const pan = pose?.pan3D ?? [0, 0, 0];\n  return [\n    (Number(target[0]) || 0) + (Number(pan[0]) || 0),\n    (Number(target[1]) || 0) + (Number(pan[1]) || 0),\n    (Number(target[2]) || 0) + (Number(pan[2]) || 0),\n  ];\n}\n\nfunction estimate3DDistanceFrom2DZoom(pose) {\n  const viewportHeight = Math.max(1, Number(pose?.viewport?.height) || 1);\n  const zoom = Math.max(1e-6, Number.isFinite(pose?.zoom) ? pose.zoom : 1);\n  const fovRad = ((Number.isFinite(pose?.fov) ? pose.fov : 60) * Math.PI) / 180;\n  const tanHalfFov = Math.max(1e-6, Math.tan(fovRad * 0.5));\n  return viewportHeight / (2 * zoom * tanHalfFov);\n}\n\nfunction estimate2DZoomFrom3DDistance(pose) {\n  const viewportHeight = Math.max(1, Number(pose?.viewport?.height) || 1);\n  const distance = Math.max(1e-6, Number.isFinite(pose?.distance) ? pose.distance : 800);\n  const fovRad = ((Number.isFinite(pose?.fov) ? pose.fov : 60) * Math.PI) / 180;\n  const worldHeight = Math.max(1e-6, 2 * distance * Math.tan(fovRad * 0.5));\n  return viewportHeight / worldHeight;\n}\n\nconst DEFAULT_MODE_SWITCH_DURATION_MS = 360;\nconst DEFAULT_MODE_SWITCH_3D_ROTATION = createYawPitchQuaternion(-0.55, 0.42);\nconst CAMERA_FIT_DEFAULT_MAX_SAMPLES = 50000;\nconst CAMERA_FIT_DEFAULT_2D_ZOOM_MARGIN = 1.35;\nconst DEFAULT_CAMERA_ANIMATION_DURATION_MS = 520;\nconst LARGE_NETWORK_STARTUP_NODE_THRESHOLD = 1000000;\nconst LARGE_NETWORK_STARTUP_EDGE_THRESHOLD = 1000000;\nconst LARGE_NETWORK_STARTUP_SCALE = 4;\nconst LARGE_NETWORK_STARTUP_DURATION_MS = 2200;\nconst LARGE_NETWORK_STARTUP_LAYOUT_DURATION_MS = 5000;\nconst STARTUP_DEFAULTS = Object.freeze({\n  loadingOverlay: true,\n  hideCanvasUntilFirstFrame: true,\n  layoutIterations: 100,\n  layoutDurationMs: 1000,\n  initialCameraFit: true,\n});\nconst QUICK_CONTROL_DEFAULTS = Object.freeze({\n  enabled: true,\n  autoFit: true,\n  layout: true,\n  zoom: true,\n  reserveLegendSpace: true,\n  theme: 'dark',\n  buttonSize: 34,\n  gap: 6,\n  margin: 12,\n  legendOffset: 64,\n  zoomFactor: 1.25,\n});\nconst QUICK_CONTROL_HELIOS_URL = 'https://heliosweb.io/';\nconst QUICK_CONTROL_ISSUE_URL = 'https://github.com/filipinascimento/helios-web/issues/new';\nconst BASELINE_REFRESH_IGNORED_OVERRIDES = new Set(['exporter.baseName', 'exporter.preset']);\nconst WARNING_KEYS_BY_OWNER = new WeakMap();\n\nfunction warnOnce(owner, key, message, detail = undefined) {\n  if (typeof console === 'undefined' || typeof console.warn !== 'function') return;\n  const target = owner && (typeof owner === 'object' || typeof owner === 'function') ? owner : warnOnce;\n  let keys = WARNING_KEYS_BY_OWNER.get(target);\n  if (!keys) {\n    keys = new Set();\n    WARNING_KEYS_BY_OWNER.set(target, keys);\n  }\n  const normalizedKey = String(key ?? message);\n  if (keys.has(normalizedKey)) return;\n  keys.add(normalizedKey);\n  if (detail === undefined) console.warn(message);\n  else console.warn(message, detail);\n}\n\nconst CAMERA_CONTROL_DEFAULTS = Object.freeze({\n  autoFit: true,\n  autoFitCoverage: 0.95,\n  autoFitPaddingRatio: 0.05,\n  autoFitIntervalMs: 900,\n  autoFitMinIntervalMs: 250,\n  autoFitMaxIntervalMs: 6000,\n  autoFitLargeNetworkScale: 1,\n  autoFitIntervalNodeCountRef: 5000,\n  autoFitMaxSamples: CAMERA_FIT_DEFAULT_MAX_SAMPLES,\n  largeNetworkStartupFit: true,\n  largeNetworkStartupNodeThreshold: LARGE_NETWORK_STARTUP_NODE_THRESHOLD,\n  largeNetworkStartupEdgeThreshold: LARGE_NETWORK_STARTUP_EDGE_THRESHOLD,\n  largeNetworkStartupScale: LARGE_NETWORK_STARTUP_SCALE,\n  largeNetworkStartupDurationMs: LARGE_NETWORK_STARTUP_DURATION_MS,\n  animation: true,\n  animationDurationMs: DEFAULT_CAMERA_ANIMATION_DURATION_MS,\n  orbit: false,\n  orbitAngle: 0,\n  orbitAxis: Object.freeze([0, 1, 0]),\n  orbitSpeed: 0.08,\n  orbitDirection: 1,\n  followTarget: false,\n  followUpdateIntervalMs: 180,\n  targetNodeIndices: null,\n});\n\nfunction toFiniteNumber(value, fallback = 0) {\n  const numeric = Number(value);\n  return Number.isFinite(numeric) ? numeric : fallback;\n}\n\nconst POSITION_INTERPOLATION_DEFAULTS = Object.freeze({\n  enabled: false,\n  mode: 'gpu',\n  durationMode: 'fixed',\n  durationMs: 140,\n  adaptiveDuration: false,\n  adaptiveDurationSamples: 5,\n  adaptiveDurationWindowMs: 5000,\n  adaptiveDurationScale: 1,\n  adaptiveDurationMinMs: 16,\n  adaptiveDurationMaxMs: 5000,\n  easing: 'linear',\n  smoothing: 6,\n  minDisplacementRatio: 0.0005,\n});\n\nconst DENSITY_DEFAULTS = Object.freeze({\n  enabled: false,\n  qualityScale: 0.1,\n  topographic: false,\n  scaleWithZoom: false,\n  bandwidth: 28.1,\n  weightScale: 398.1071705534973,\n  property: 'Uniform',\n  compareProperty: 'None',\n  comparisonMode: 'difference',\n  normalizeVs: false,\n  epsilon: 1e-6,\n  logRatioRange: 3,\n  maskThreshold: 0,\n  logRatioZScore: false,\n  logRatioSupportCorrection: true,\n  colormap: 'interpolateOrRd',\n  logRatioColormap: 'cmasher:prinsenvlag',\n  divergingColormap: 'cmasher:prinsenvlag',\n  interactionFilter: 'auto',\n});\n\nconst NETWORK_VISUALIZATION_STATE_ATTRIBUTE = '_helios_visualization_state';\n\nfunction hasDensityComparisonTarget(compareProperty) {\n  return typeof compareProperty === 'string'\n    && compareProperty.trim().length > 0\n    && compareProperty.trim() !== 'None';\n}\n\nfunction resolveDensityCompareProperty(property, compareProperty) {\n  const propertyKey = typeof property === 'string' ? property.trim() : '';\n  const compareKey = typeof compareProperty === 'string' ? compareProperty.trim() : '';\n  if (!compareKey || compareKey === 'None') return 'None';\n  if (propertyKey && compareKey === propertyKey) return 'None';\n  return compareKey;\n}\n\nfunction resolveDensityComparisonMode(compareProperty, requestedMode) {\n  return hasDensityComparisonTarget(compareProperty) && requestedMode === 'logRatio'\n    ? 'logRatio'\n    : 'difference';\n}\n\nfunction usesLogRatioDensityColormap(config) {\n  return resolveDensityComparisonMode(config?.compareProperty, config?.comparisonMode) === 'logRatio';\n}\n\nfunction resolveDensityActiveColormap(config, runtime) {\n  if (usesLogRatioDensityColormap(config)) {\n    return config?.logRatioColormap ?? config?.divergingColormap ?? config?.colormap;\n  }\n  if (runtime?.diverging === true) {\n    return config?.divergingColormap ?? config?.colormap;\n  }\n  return config?.colormap;\n}\n\nconst EDGE_ADAPTIVE_QUALITY_DEFAULTS = Object.freeze({\n  enabled: false,\n  slowFrameThresholdMs: 66,\n  averageWindowFrames: 12,\n  probeIntervalMs: 900,\n  interactionHoldMs: 180,\n  fastDuringCamera: true,\n  fastDuringLayout: true,\n});\n\nconst EDGE_ADAPTIVE_LAYOUT_HYSTERESIS = Object.freeze({\n  exitThresholdFactor: 0.75,\n  alphaProbeFactor: 0.5,\n  alphaMinMultiplier: 4,\n  backoffFactor: 2,\n  maxBackoffMs: 12000,\n});\n\nfunction normalizeNodeIndexList(value) {\n  if (value == null) return null;\n  if (typeof value === 'number') {\n    const numeric = Math.floor(value);\n    return Number.isFinite(numeric) && numeric >= 0 ? [numeric] : [];\n  }\n  const next = [];\n  const seen = new Set();\n  forEachIndex(value, (entry) => {\n    const numeric = Math.floor(Number(entry));\n    if (!Number.isFinite(numeric) || numeric < 0 || seen.has(numeric)) return;\n    seen.add(numeric);\n    next.push(numeric);\n  });\n  return next;\n}\n\nfunction normalizeReadbackNodeIndexList(value) {\n  if (value == null) return [];\n  if (typeof value === 'number') {\n    const numeric = Math.floor(value);\n    return Number.isFinite(numeric) && numeric >= 0 ? [numeric] : [];\n  }\n  const next = [];\n  forEachIndex(value, (entry) => {\n    const numeric = Math.floor(Number(entry));\n    if (!Number.isFinite(numeric) || numeric < 0) return;\n    next.push(numeric);\n  });\n  return next;\n}\n\nfunction resolveFloat32Out(out, length) {\n  if (out instanceof Float32Array && out.length >= length) return out;\n  return new Float32Array(Math.max(0, length));\n}\n\nfunction copyReadbackPositionsFromView(view, ids, out = null) {\n  const count = ids?.length ?? 0;\n  const positions = resolveFloat32Out(out, count * 3);\n  positions.fill(0, 0, count * 3);\n  if (!view || !Number.isFinite(view.length)) return positions;\n  for (let i = 0; i < count; i += 1) {\n    const id = ids[i];\n    const src = id * 3;\n    const dst = i * 3;\n    if (src + 2 >= view.length) continue;\n    positions[dst] = Number.isFinite(view[src]) ? view[src] : 0;\n    positions[dst + 1] = Number.isFinite(view[src + 1]) ? view[src + 1] : 0;\n    positions[dst + 2] = Number.isFinite(view[src + 2]) ? view[src + 2] : 0;\n  }\n  return positions;\n}\n\nfunction centroidFromPackedReadback(positions, count, out = null) {\n  const centroid = resolveFloat32Out(out, 3);\n  centroid[0] = 0;\n  centroid[1] = 0;\n  centroid[2] = 0;\n  const safeCount = Math.max(0, Math.min(Math.floor(Number(count) || 0), Math.floor((positions?.length ?? 0) / 3)));\n  if (safeCount <= 0) return { centroid, count: 0 };\n  let sumX = 0;\n  let sumY = 0;\n  let sumZ = 0;\n  let found = 0;\n  for (let i = 0; i < safeCount; i += 1) {\n    const offset = i * 3;\n    const x = positions[offset];\n    const y = positions[offset + 1];\n    const z = positions[offset + 2];\n    if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) continue;\n    sumX += x;\n    sumY += y;\n    sumZ += z;\n    found += 1;\n  }\n  if (found > 0) {\n    centroid[0] = sumX / found;\n    centroid[1] = sumY / found;\n    centroid[2] = sumZ / found;\n  }\n  return { centroid, count: found };\n}\n\nfunction normalizeOrbitAngleDegrees(value, fallback = 0) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return fallback;\n  return clamp(numeric, -89, 89);\n}\n\nfunction normalizeCameraControlConfig(base = {}, patch = {}) {\n  const next = { ...base };\n  if (Object.prototype.hasOwnProperty.call(patch, 'autoFit')) {\n    next.autoFit = patch.autoFit === true;\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'autoFitCoverage')) {\n    next.autoFitCoverage = clamp(\n      normalizeNonNegativeNumber(patch.autoFitCoverage, next.autoFitCoverage ?? CAMERA_CONTROL_DEFAULTS.autoFitCoverage, 0.5, 1),\n      0.5,\n      1,\n    );\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'autoFitPaddingRatio')) {\n    next.autoFitPaddingRatio = normalizeNonNegativeNumber(patch.autoFitPaddingRatio, next.autoFitPaddingRatio ?? 0, 0, 1);\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'autoFitIntervalMs')) {\n    next.autoFitIntervalMs = normalizeNonNegativeNumber(patch.autoFitIntervalMs, next.autoFitIntervalMs ?? 0, 0, 60000);\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'autoFitMinIntervalMs')) {\n    next.autoFitMinIntervalMs = normalizeNonNegativeNumber(patch.autoFitMinIntervalMs, next.autoFitMinIntervalMs ?? 0, 0, 60000);\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'autoFitMaxIntervalMs')) {\n    next.autoFitMaxIntervalMs = normalizeNonNegativeNumber(patch.autoFitMaxIntervalMs, next.autoFitMaxIntervalMs ?? 0, 0, 60000);\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'autoFitLargeNetworkScale')) {\n    next.autoFitLargeNetworkScale = normalizeNonNegativeNumber(patch.autoFitLargeNetworkScale, next.autoFitLargeNetworkScale ?? 1, 0, 32);\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'autoFitIntervalNodeCountRef')) {\n    next.autoFitIntervalNodeCountRef = normalizePositiveInteger(\n      patch.autoFitIntervalNodeCountRef,\n      next.autoFitIntervalNodeCountRef ?? 1,\n      1,\n      Number.MAX_SAFE_INTEGER,\n    );\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'autoFitMaxSamples')) {\n    next.autoFitMaxSamples = normalizePositiveInteger(\n      patch.autoFitMaxSamples,\n      next.autoFitMaxSamples ?? CAMERA_FIT_DEFAULT_MAX_SAMPLES,\n      32,\n      1000000,\n    );\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'largeNetworkStartupFit')) {\n    next.largeNetworkStartupFit = patch.largeNetworkStartupFit !== false;\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'largeNetworkStartupNodeThreshold')) {\n    next.largeNetworkStartupNodeThreshold = normalizePositiveInteger(\n      patch.largeNetworkStartupNodeThreshold,\n      next.largeNetworkStartupNodeThreshold ?? LARGE_NETWORK_STARTUP_NODE_THRESHOLD,\n      1,\n      Number.MAX_SAFE_INTEGER,\n    );\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'largeNetworkStartupEdgeThreshold')) {\n    next.largeNetworkStartupEdgeThreshold = normalizePositiveInteger(\n      patch.largeNetworkStartupEdgeThreshold,\n      next.largeNetworkStartupEdgeThreshold ?? LARGE_NETWORK_STARTUP_EDGE_THRESHOLD,\n      1,\n      Number.MAX_SAFE_INTEGER,\n    );\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'largeNetworkStartupScale')) {\n    next.largeNetworkStartupScale = normalizeNonNegativeNumber(\n      patch.largeNetworkStartupScale,\n      next.largeNetworkStartupScale ?? LARGE_NETWORK_STARTUP_SCALE,\n      1,\n      64,\n    );\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'largeNetworkStartupDurationMs')) {\n    next.largeNetworkStartupDurationMs = normalizeNonNegativeNumber(\n      patch.largeNetworkStartupDurationMs,\n      next.largeNetworkStartupDurationMs ?? LARGE_NETWORK_STARTUP_DURATION_MS,\n      0,\n      60000,\n    );\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'animation')) {\n    next.animation = patch.animation === true;\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'animationDurationMs')) {\n    next.animationDurationMs = normalizeNonNegativeNumber(patch.animationDurationMs, next.animationDurationMs ?? 0, 0, 60000);\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'orbit')) {\n    next.orbit = patch.orbit === true;\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'orbitAngle')) {\n    next.orbitAngle = normalizeOrbitAngleDegrees(\n      patch.orbitAngle,\n      next.orbitAngle ?? CAMERA_CONTROL_DEFAULTS.orbitAngle,\n    );\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'orbitAxis')) {\n    next.orbitAxis = normalizeDirectionInput(\n      patch.orbitAxis,\n      next.orbitAxis ?? CAMERA_CONTROL_DEFAULTS.orbitAxis,\n    );\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'orbitSpeed')) {\n    next.orbitSpeed = normalizeNonNegativeNumber(patch.orbitSpeed, next.orbitSpeed ?? 0, 0, 10);\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'orbitDirection')) {\n    next.orbitDirection = Number(patch.orbitDirection) < 0 ? -1 : 1;\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'followTarget')) {\n    next.followTarget = patch.followTarget === true;\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'followUpdateIntervalMs')) {\n    next.followUpdateIntervalMs = normalizeNonNegativeNumber(\n      patch.followUpdateIntervalMs,\n      next.followUpdateIntervalMs ?? 0,\n      0,\n      60000,\n    );\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'targetNodeIndices')) {\n    next.targetNodeIndices = normalizeNodeIndexList(patch.targetNodeIndices);\n  }\n\n  next.autoFitMinIntervalMs = Math.min(next.autoFitMinIntervalMs ?? 0, next.autoFitMaxIntervalMs ?? 0);\n  next.autoFitMaxIntervalMs = Math.max(next.autoFitMaxIntervalMs ?? 0, next.autoFitMinIntervalMs ?? 0);\n  return next;\n}\n\nfunction normalizeStartupConfig(value = {}, options = {}) {\n  if (value === false || options.startupLoading === false) {\n    return {\n      ...STARTUP_DEFAULTS,\n      loadingOverlay: false,\n      hideCanvasUntilFirstFrame: false,\n      layoutIterations: 0,\n      layoutDurationMs: 0,\n      initialCameraFit: STARTUP_DEFAULTS.initialCameraFit,\n    };\n  }\n  const patch = value && typeof value === 'object' ? value : {};\n  const read = (key, fallback) => (\n    Object.prototype.hasOwnProperty.call(patch, key)\n      ? patch[key]\n      : (Object.prototype.hasOwnProperty.call(options, key) ? options[key] : fallback)\n  );\n  const has = (key) => (\n    Object.prototype.hasOwnProperty.call(patch, key)\n    || Object.prototype.hasOwnProperty.call(options, key)\n  );\n  return {\n    loadingOverlay: read('loadingOverlay', STARTUP_DEFAULTS.loadingOverlay) !== false,\n    hideCanvasUntilFirstFrame: read(\n      'hideCanvasUntilFirstFrame',\n      STARTUP_DEFAULTS.hideCanvasUntilFirstFrame,\n    ) !== false,\n    layoutIterations: normalizePositiveInteger(\n      read('layoutIterations', read('startupLayoutIterations', STARTUP_DEFAULTS.layoutIterations)),\n      STARTUP_DEFAULTS.layoutIterations,\n      0,\n      Number.MAX_SAFE_INTEGER,\n    ),\n    layoutDurationMs: normalizeNonNegativeNumber(\n      read('layoutDurationMs', read('startupLayoutDurationMs', STARTUP_DEFAULTS.layoutDurationMs)),\n      STARTUP_DEFAULTS.layoutDurationMs,\n      0,\n      60000,\n    ),\n    initialCameraFit: read('initialCameraFit', STARTUP_DEFAULTS.initialCameraFit) !== false,\n    _layoutIterationsExplicit: has('layoutIterations') || has('startupLayoutIterations'),\n    _layoutDurationMsExplicit: has('layoutDurationMs') || has('startupLayoutDurationMs'),\n  };\n}\n\nfunction normalizeQuickControlsConfig(value, options = {}) {\n  if (value === false || value == null && options.defaultEnabled === false) {\n    return {\n      ...QUICK_CONTROL_DEFAULTS,\n      theme: normalizeThemeName(options.defaultTheme) ?? QUICK_CONTROL_DEFAULTS.theme,\n      enabled: false,\n    };\n  }\n  const patch = value && typeof value === 'object' ? value : {};\n  const uiOptions = options.ui && typeof options.ui === 'object' ? options.ui : {};\n  const fallbackTheme = normalizeThemeName(options.defaultTheme) ?? QUICK_CONTROL_DEFAULTS.theme;\n  const theme = typeof patch.theme === 'string' && patch.theme\n    ? patch.theme\n    : (typeof uiOptions.theme === 'string' && uiOptions.theme ? uiOptions.theme : fallbackTheme);\n  const config = {\n    ...QUICK_CONTROL_DEFAULTS,\n    ...patch,\n    theme,\n    enabled: patch.enabled !== false,\n    autoFit: patch.autoFit !== false && patch.fit !== false,\n    layout: patch.layout !== false,\n    zoom: patch.zoom !== false,\n    reserveLegendSpace: patch.reserveLegendSpace !== false,\n    buttonSize: normalizePositiveInteger(patch.buttonSize, QUICK_CONTROL_DEFAULTS.buttonSize, 28, 96),\n    gap: normalizeNonNegativeNumber(patch.gap, QUICK_CONTROL_DEFAULTS.gap, 0, 32),\n    margin: normalizeNonNegativeNumber(patch.margin, QUICK_CONTROL_DEFAULTS.margin, 0, 96),\n    legendOffset: normalizeNonNegativeNumber(patch.legendOffset, QUICK_CONTROL_DEFAULTS.legendOffset, 0, 160),\n    zoomFactor: normalizeNonNegativeNumber(patch.zoomFactor, QUICK_CONTROL_DEFAULTS.zoomFactor, 1.01, 8),\n  };\n  if (!config.autoFit && !config.layout && !config.zoom) config.enabled = false;\n  return config;\n}\n\nfunction copyCameraControlConfig(config = {}) {\n  return {\n    ...config,\n    orbitAxis: normalizeDirectionInput(config.orbitAxis, CAMERA_CONTROL_DEFAULTS.orbitAxis),\n    targetNodeIndices: Array.isArray(config.targetNodeIndices) ? [...config.targetNodeIndices] : null,\n  };\n}\n\nfunction swapNumericValue(values, a, b) {\n  if (a === b) return;\n  const tmp = values[a];\n  values[a] = values[b];\n  values[b] = tmp;\n}\n\nfunction medianIndexOfThree(values, a, b, c) {\n  const av = values[a];\n  const bv = values[b];\n  const cv = values[c];\n  if (av < bv) {\n    if (bv < cv) return b;\n    return av < cv ? c : a;\n  }\n  if (av < cv) return a;\n  return bv < cv ? c : b;\n}\n\nfunction selectKthNumericValue(values, length, k) {\n  const count = Math.max(0, Math.min(Math.floor(Number(length) || 0), values?.length ?? 0));\n  if (count <= 0) return NaN;\n  const target = Math.max(0, Math.min(count - 1, Math.floor(Number(k) || 0)));\n  let left = 0;\n  let right = count - 1;\n  while (left < right) {\n    const mid = left + ((right - left) >> 1);\n    const pivotIndex = medianIndexOfThree(values, left, mid, right);\n    const pivotValue = values[pivotIndex];\n    let lt = left;\n    let i = left;\n    let gt = right;\n    while (i <= gt) {\n      const value = values[i];\n      if (value < pivotValue) {\n        swapNumericValue(values, lt, i);\n        lt += 1;\n        i += 1;\n      } else if (value > pivotValue) {\n        swapNumericValue(values, i, gt);\n        gt -= 1;\n      } else {\n        i += 1;\n      }\n    }\n    if (target < lt) right = lt - 1;\n    else if (target > gt) left = gt + 1;\n    else return values[target];\n  }\n  return values[left];\n}\n\nfunction quantileFromValues(values, length, t) {\n  const count = Math.max(0, Math.min(Math.floor(Number(length) || 0), values?.length ?? 0));\n  if (count === 0) return NaN;\n  if (count === 1) return values[0];\n  const clamped = clamp(Number(t), 0, 1);\n  const index = clamped * (count - 1);\n  const lo = Math.floor(index);\n  const hi = Math.ceil(index);\n  const loValue = selectKthNumericValue(values, count, lo);\n  if (lo === hi) return loValue;\n  const hiValue = selectKthNumericValue(values, count, hi);\n  const factor = index - lo;\n  return loValue + ((hiValue - loValue) * factor);\n}\n\nfunction quatNormalizeInto(out, q) {\n  const len = Math.hypot(q[0], q[1], q[2], q[3]);\n  if (len > 0) {\n    const inv = 1 / len;\n    out[0] = q[0] * inv;\n    out[1] = q[1] * inv;\n    out[2] = q[2] * inv;\n    out[3] = q[3] * inv;\n  } else {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n  }\n  return out;\n}\n\nfunction quatMultiplyInto(out, a, b) {\n  const ax = a[0];\n  const ay = a[1];\n  const az = a[2];\n  const aw = a[3];\n  const bx = b[0];\n  const by = b[1];\n  const bz = b[2];\n  const bw = b[3];\n  out[0] = aw * bx + ax * bw + ay * bz - az * by;\n  out[1] = aw * by - ax * bz + ay * bw + az * bx;\n  out[2] = aw * bz + ax * by - ay * bx + az * bw;\n  out[3] = aw * bw - ax * bx - ay * by - az * bz;\n  return out;\n}\n\nfunction quatFromAxisAngle(axis, radians) {\n  const out = new Float32Array(4);\n  const ax = Number(axis?.[0]) || 0;\n  const ay = Number(axis?.[1]) || 0;\n  const az = Number(axis?.[2]) || 0;\n  const len = Math.hypot(ax, ay, az);\n  if (len <= 1e-12) {\n    out[3] = 1;\n    return out;\n  }\n  const half = radians * 0.5;\n  const scale = Math.sin(half) / len;\n  out[0] = ax * scale;\n  out[1] = ay * scale;\n  out[2] = az * scale;\n  out[3] = Math.cos(half);\n  return out;\n}\n\nfunction transformDirectionByQuat(q, x, y, z) {\n  const qx = q?.[0] ?? 0;\n  const qy = q?.[1] ?? 0;\n  const qz = q?.[2] ?? 0;\n  const qw = q?.[3] ?? 1;\n  const ix = (qw * x) + (qy * z) - (qz * y);\n  const iy = (qw * y) + (qz * x) - (qx * z);\n  const iz = (qw * z) + (qx * y) - (qy * x);\n  const iw = (-qx * x) - (qy * y) - (qz * z);\n  return [\n    (ix * qw) + (iw * -qx) + (iy * -qz) - (iz * -qy),\n    (iy * qw) + (iw * -qy) + (iz * -qx) - (ix * -qz),\n    (iz * qw) + (iw * -qz) + (ix * -qy) - (iy * -qx),\n  ];\n}\n\nfunction normalizeVec3Array(v, fallback) {\n  const len = Math.hypot(v?.[0] ?? 0, v?.[1] ?? 0, v?.[2] ?? 0);\n  if (!Number.isFinite(len) || len <= 1e-9) return [...fallback];\n  return [v[0] / len, v[1] / len, v[2] / len];\n}\n\nfunction crossVec3Array(a, b) {\n  return [\n    (a[1] * b[2]) - (a[2] * b[1]),\n    (a[2] * b[0]) - (a[0] * b[2]),\n    (a[0] * b[1]) - (a[1] * b[0]),\n  ];\n}\n\nfunction dotVec3Array(a, b) {\n  return (a[0] * b[0]) + (a[1] * b[1]) + (a[2] * b[2]);\n}\n\nfunction resolveCameraBasisForRotation(rotation) {\n  const forward = normalizeVec3Array(transformDirectionByQuat(rotation, 0, 0, -1), [0, 0, -1]);\n  let up = normalizeVec3Array(transformDirectionByQuat(rotation, 0, 1, 0), [0, 1, 0]);\n  let right = normalizeVec3Array(crossVec3Array(forward, up), [1, 0, 0]);\n  up = normalizeVec3Array(crossVec3Array(right, forward), [0, 1, 0]);\n  right = normalizeVec3Array(right, [1, 0, 0]);\n  return { right, up, forward };\n}\n\nfunction normalizeInterpolationMode(value, fallback = POSITION_INTERPOLATION_DEFAULTS.mode) {\n  const raw = String(value ?? fallback).trim().toLowerCase();\n  if (!raw) return 'gpu';\n  if (raw === 'javascript' || raw === 'js' || raw === 'cpu') return 'gpu';\n  if (raw === 'network' || raw === 'wasm' || raw === 'native') return 'gpu';\n  if (raw === 'gpu' || raw === 'shader') return 'gpu';\n  return 'gpu';\n}\n\nfunction normalizeInterpolationDurationMode(value, fallback = POSITION_INTERPOLATION_DEFAULTS.durationMode) {\n  if (typeof value === 'boolean') {\n    return value ? 'adaptive' : 'fixed';\n  }\n  const raw = String(value ?? fallback).trim().toLowerCase();\n  if (!raw) return fallback;\n  if (raw === 'adaptive' || raw === 'auto' || raw === 'dynamic') return 'adaptive';\n  if (raw === 'fixed' || raw === 'manual' || raw === 'constant') return 'fixed';\n  return fallback;\n}\n\nfunction normalizeInterpolationEasing(value, fallback = POSITION_INTERPOLATION_DEFAULTS.easing) {\n  const raw = String(value ?? fallback).trim().toLowerCase();\n  if (!raw) return 'linear';\n  // Smoothstep looked unstable for frequent layout updates; keep a single interpolation curve for now.\n  return 'linear';\n}\n\nfunction clamp01(value, fallback = 0) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return fallback;\n  if (numeric <= 0) return 0;\n  if (numeric >= 1) return 1;\n  return numeric;\n}\n\nfunction normalizeNonNegativeNumber(value, fallback, min = 0, max = Number.POSITIVE_INFINITY) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return fallback;\n  const clampedMin = Math.max(min, numeric);\n  return Math.min(max, clampedMin);\n}\n\nfunction normalizePositiveInteger(value, fallback, min = 1, max = Number.POSITIVE_INFINITY) {\n  const numeric = Number(value);\n  if (!Number.isFinite(numeric)) return fallback;\n  const rounded = Math.floor(numeric);\n  if (rounded < min) return min;\n  if (rounded > max) return max;\n  return rounded;\n}\n\nfunction normalizeEdgeAdaptiveQualityConfig(base = {}, patch = {}) {\n  if (patch === true || patch === false) {\n    return {\n      ...base,\n      enabled: patch === true,\n    };\n  }\n  if (!patch || typeof patch !== 'object') {\n    return { ...base };\n  }\n  const next = { ...base };\n  if (Object.prototype.hasOwnProperty.call(patch, 'enabled') && patch.enabled !== undefined) {\n    next.enabled = patch.enabled !== false;\n  }\n  if (\n    Object.prototype.hasOwnProperty.call(patch, 'slowFrameThresholdMs')\n    || Object.prototype.hasOwnProperty.call(patch, 'thresholdMs')\n  ) {\n    next.slowFrameThresholdMs = normalizeNonNegativeNumber(\n      patch.slowFrameThresholdMs ?? patch.thresholdMs,\n      next.slowFrameThresholdMs ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS.slowFrameThresholdMs,\n      0,\n      10000,\n    );\n  }\n  if (\n    Object.prototype.hasOwnProperty.call(patch, 'probeIntervalMs')\n    || Object.prototype.hasOwnProperty.call(patch, 'retryDelayMs')\n  ) {\n    next.probeIntervalMs = normalizeNonNegativeNumber(\n      patch.probeIntervalMs ?? patch.retryDelayMs,\n      next.probeIntervalMs ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS.probeIntervalMs,\n      0,\n      60000,\n    );\n  }\n  if (\n    Object.prototype.hasOwnProperty.call(patch, 'averageWindowFrames')\n    || Object.prototype.hasOwnProperty.call(patch, 'slowFrameConsecutiveFrames')\n  ) {\n    next.averageWindowFrames = normalizePositiveInteger(\n      patch.averageWindowFrames ?? patch.slowFrameConsecutiveFrames,\n      next.averageWindowFrames ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS.averageWindowFrames,\n      1,\n      240,\n    );\n  }\n  if (\n    Object.prototype.hasOwnProperty.call(patch, 'interactionHoldMs')\n    || Object.prototype.hasOwnProperty.call(patch, 'cameraIdleMs')\n  ) {\n    next.interactionHoldMs = normalizeNonNegativeNumber(\n      patch.interactionHoldMs ?? patch.cameraIdleMs,\n      next.interactionHoldMs ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS.interactionHoldMs,\n      0,\n      5000,\n    );\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'fastDuringCamera')) {\n    next.fastDuringCamera = patch.fastDuringCamera !== false;\n  }\n  if (Object.prototype.hasOwnProperty.call(patch, 'fastDuringLayout')) {\n    next.fastDuringLayout = patch.fastDuringLayout !== false;\n  }\n  return next;\n}\n\nfunction resolveInterpolationDurationMode(config) {\n  const fallback = config?.adaptiveDuration === true ? 'adaptive' : POSITION_INTERPOLATION_DEFAULTS.durationMode;\n  return normalizeInterpolationDurationMode(config?.durationMode, fallback);\n}\n\nfunction applyInterpolationEasing(mode, t) {\n  const clamped = clamp01(t, 0);\n  if (mode !== 'linear') return clamped;\n  return clamped;\n}\n\nfunction arePositionArraysEqual(a, b, epsilon = 1e-6) {\n  if (!a || !b) return false;\n  if (a.length !== b.length) return false;\n  for (let i = 0; i < a.length; i += 1) {\n    if (Math.abs((a[i] ?? 0) - (b[i] ?? 0)) > epsilon) return false;\n  }\n  return true;\n}\n\nfunction mixPositionsArray(from, to, out, t) {\n  if (!from || !to || !out) return out;\n  const factor = clamp01(t, 1);\n  const count = Math.min(from.length, to.length, out.length);\n  for (let i = 0; i < count; i += 1) {\n    out[i] = from[i] + (to[i] - from[i]) * factor;\n  }\n  return out;\n}\n\nfunction computePositionDisplacementRatio(from, to) {\n  if (!from || !to || from.length !== to.length || from.length === 0) return 0;\n  let maxDelta = 0;\n  let maxMagnitude = 0;\n  for (let i = 0; i < from.length; i += 1) {\n    const a = Number(from[i] ?? 0);\n    const b = Number(to[i] ?? 0);\n    const delta = Math.abs(b - a);\n    if (delta > maxDelta) maxDelta = delta;\n    const magnitude = Math.max(Math.abs(a), Math.abs(b));\n    if (magnitude > maxMagnitude) maxMagnitude = magnitude;\n  }\n  if (maxDelta <= 0) return 0;\n  return maxDelta / Math.max(1, maxMagnitude);\n}\n\nconst GRAPH_FILTER_SCOPE_RENDER = 'render';\nconst GRAPH_FILTER_SCOPE_RENDER_LAYOUT = 'render+layout';\nconst GRAPH_FILTER_ALLOWED_OPTION_KEYS = Object.freeze([\n  'nodeQuery',\n  'edgeQuery',\n  'nodeSelector',\n  'edgeSelector',\n  'nodeSelection',\n  'edgeSelection',\n  'orderNodesBy',\n  'orderEdgesBy',\n  'minComponentSize',\n]);\n\nfunction normalizeGraphFilterScope(value, fallback = GRAPH_FILTER_SCOPE_RENDER) {\n  const raw = String(value ?? fallback).trim().toLowerCase();\n  if (raw === GRAPH_FILTER_SCOPE_RENDER_LAYOUT || raw === 'layout' || raw === 'render_layout') {\n    return GRAPH_FILTER_SCOPE_RENDER_LAYOUT;\n  }\n  return GRAPH_FILTER_SCOPE_RENDER;\n}\n\nfunction normalizeGraphFilterOptions(options = {}) {\n  const out = {};\n  for (const key of GRAPH_FILTER_ALLOWED_OPTION_KEYS) {\n    if (Object.prototype.hasOwnProperty.call(options, key)) {\n      out[key] = options[key];\n    }\n  }\n  if (Object.prototype.hasOwnProperty.call(out, 'minComponentSize')) {\n    const minComponentSize = Math.floor(Number(out.minComponentSize));\n    if (Number.isFinite(minComponentSize) && minComponentSize > 1) {\n      out.minComponentSize = minComponentSize;\n    } else {\n      delete out.minComponentSize;\n    }\n  }\n  return out;\n}\n\nfunction hasGraphFilterCriteria(options = {}) {\n  for (const key of GRAPH_FILTER_ALLOWED_OPTION_KEYS) {\n    if (Object.prototype.hasOwnProperty.call(options, key)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction safeNumber(value, fallback = 0) {\n  const numeric = Number(value);\n  return Number.isFinite(numeric) ? numeric : fallback;\n}\n\nfunction safeLength(value) {\n  const length = Number(value?.length);\n  return Number.isFinite(length) && length >= 0 ? Math.floor(length) : 0;\n}\n\nfunction computeFilterTopologyVersion(baseVersion, filterVersion) {\n  const base = safeNumber(baseVersion, 0);\n  const delta = safeNumber(filterVersion, 0);\n  const sum = base + delta;\n  if (sum >= Number.MAX_SAFE_INTEGER) {\n    return sum % Number.MAX_SAFE_INTEGER;\n  }\n  if (sum < 0) return 0;\n  return sum;\n}\n\nfunction bumpVersionCounter(value) {\n  const current = safeNumber(value, 0);\n  if (current >= Number.MAX_SAFE_INTEGER - 1) return 0;\n  return current + 1;\n}\n\n/**\n * Stable event names emitted by `Helios` instances.\n *\n * @public\n * @remarks Event payloads are delivered through `CustomEvent.detail` where the\n * browser supports `CustomEvent`. Use these constants instead of string\n * literals when wiring app behavior to render, layout, camera, picking, mapper,\n * filter, or network replacement changes.\n * @example\n * helios.on(EVENTS.NODE_HOVER, (event) => {\n *   console.log(event.detail?.index);\n * });\n */\nexport const EVENTS = Object.freeze({\n  LAYOUT_START: 'layout:start',\n  LAYOUT_STOP: 'layout:stop',\n  LAYOUT_CHANGED: 'layout:changed',\n  MODE_CHANGED: 'mode:changed',\n\n  NODE_HOVER: 'node:hover',\n  EDGE_HOVER: 'edge:hover',\n\n  GRAPH_CLICK: 'graph:click',\n  GRAPH_DBLCLICK: 'graph:dblclick',\n\n  NODE_CLICK: 'node:click',\n  EDGE_CLICK: 'edge:click',\n\n  NODE_DBLCLICK: 'node:dblclick',\n  EDGE_DBLCLICK: 'edge:dblclick',\n\n  BEFORE_RENDER: 'render:before',\n  AFTER_RENDER: 'render:after',\n\n  RESIZE: 'resize',\n  CAMERA_MOVE: 'camera:move',\n  CAMERA_CONTROL_CHANGE: 'camera:control-change',\n  NETWORK_REPLACED: 'network:replaced',\n  MAPPERS_CHANGED: 'mappers:changed',\n  GRAPH_FILTER_CHANGED: 'graph:filter-changed',\n});\n\n/**\n * Main Helios Web visualization controller for one `helios-network` graph.\n *\n * @public\n * @param {import('helios-network').default} network - WASM-backed graph store\n * that supplies topology, attributes, and serialization.\n * @param {object} [options] - Renderer, layout, behavior, mapper, interface,\n * persistence, touch, camera, and quality options.\n * @param {Element|string} [options.container=document.body] - Element or selector\n * that receives the Helios canvas, SVG overlays, and interaction layers.\n * @param {'auto'|'webgpu'|'webgl'} [options.renderer='auto'] - Preferred\n * renderer backend. `auto` chooses WebGPU when available and falls back to WebGL2.\n * @param {'2d'|'3d'} [options.mode='2d'] - Initial dimensional mode.\n * @param {'perspective'|'orthographic'} [options.projection='perspective'] - Initial\n * 3D camera projection.\n * @param {object|Layout} [options.layout] - Layout configuration or a layout\n * instance to use for graph positions.\n * @param {string} [options.layout.type='gpu-force'] - Built-in layout key used\n * when `options.layout` is a configuration object.\n * @param {object} [options.layout.options] - Layout-specific options passed to\n * the selected layout implementation.\n * @param {object|false} [options.startup] - First-frame startup behavior, or\n * `false` to disable the loading overlay, canvas hiding, and layout warmup.\n * @param {boolean} [options.startup.loadingOverlay=true] - Show a centered\n * loading spinner while Helios is preparing the first visible frame.\n * @param {boolean} [options.startup.hideCanvasUntilFirstFrame=true] - Keep the\n * canvas hidden until the first intended graph frame is rendered.\n * @param {number} [options.startup.layoutIterations=100] - Optional number of\n * layout updates to wait before the first visible graph frame.\n * @param {number} [options.startup.layoutDurationMs=1000] - Optional layout warmup\n * time to wait before the first visible graph frame. When both layout warmup\n * limits are set, the first one reached releases the frame. Large initial\n * networks use a 5000 ms default duration unless this option is set.\n * @param {boolean} [options.startup.initialCameraFit=true] - Queue the default\n * initial camera fit after initialization. Set to `false` when applying an\n * explicit startup camera pose.\n * @param {object|false} [options.behaviors] - Built-in behavior options, custom\n * behavior instances, or `false` to disable default behaviors.\n * @param {object|null} [options.mappers] - Initial node and edge mapper\n * configuration. Pass `null` to skip default mapper setup.\n * @param {object|false} [options.interpolation] - Position interpolation\n * controls used when switching layouts or applying saved positions.\n * @param {object} [options.labels] - Initial label overlay options handled by\n * `LabelsBehavior`.\n * @param {object} [options.legends] - Initial legend overlay options handled by\n * `LegendsBehavior`.\n * @param {boolean|object} [options.density=false] - Density layer enablement or\n * density layer options.\n * @param {string} [options.transparencyModeEdges='weighted'] - Edge\n * transparency mode. The default weighted mode accumulates overlapping edges\n * without forcing every edge through the same alpha curve.\n * @param {object} [options.camera] - Camera framing, controls, and target\n * tracking options.\n * @param {boolean} [options.camera.largeNetworkStartupFit=true] - Start large\n * initial networks from a wider fit and settle toward the normal fit while\n * automatic fitting remains enabled.\n * @param {number} [options.camera.largeNetworkStartupNodeThreshold=1000000] -\n * Node count threshold for wide startup fitting.\n * @param {number} [options.camera.largeNetworkStartupEdgeThreshold=1000000] -\n * Edge count threshold for wide startup fitting.\n * @param {number} [options.camera.largeNetworkStartupScale=4] - Multiplier used\n * to move the startup fit farther from the graph before settling.\n * @param {number} [options.camera.largeNetworkStartupDurationMs=2200] -\n * Duration of the automatic startup settle animation.\n * @param {boolean|object} [options.quickControls=true] - Compact top-right\n * auto-fit, layout pause/run, and zoom controls. Pass `false` to disable all\n * controls, or disable individual groups with `autoFit`, `layout`, or `zoom`.\n * @param {boolean|object} [options.ui=false] - Optional HeliosUI creation.\n * Pass `true` to create the standard panel set, or an object with HeliosUI\n * options and `panels` set to a panel name, array of names, `true`, or `false`.\n * @param {object} [options.networkSource] - Metadata for the active network,\n * such as `name`, `baseName`, `format`, and provenance fields used by\n * persistence and file actions.\n * @param {boolean|object} [options.fileDrop=true] - File-drop behavior for\n * loading supported network files into the active view.\n * @param {boolean|object} [options.storage] - Storage backend configuration.\n * Pass `false` to disable persistent sessions, `true` for browser storage, or\n * an object accepted by `createHeliosStorageManager`.\n * @param {boolean|object|string} [options.session] - Session persistence\n * controls or explicit session id used by browser/native storage backends.\n * @param {string} [options.workspaceId='default'] - Workspace namespace for\n * persisted preferences and sessions.\n * @param {boolean} [options.persistNetwork=false] - Persist the network payload\n * as part of browser/native session saves.\n * @param {object} [options.networkPersistence] - Network payload persistence\n * policy, size limits, and backend-specific options.\n * @param {object} [options.positionPersistence] - Separate layout-position\n * persistence policy for storage backends that support split payloads.\n * @param {boolean|object} [options.sessionThumbnail] - Thumbnail capture policy\n * for saved sessions.\n * @param {boolean} [options.suppressBrowserGestures=true] - Prevent native\n * browser pan, zoom, and selection gestures over the visualization.\n * @param {boolean} [options.autoCleanup=true] - Destroy this Helios instance when\n * its root or container is removed from the DOM.\n * @param {boolean} [options.disposeNetworkOnDestroy=true] - Dispose the active\n * network when `destroy()` runs.\n * @param {boolean} [options.manualRendering=false] - Disable automatic scheduler\n * rendering so the host application can request frames explicitly.\n * @param {number} [options.maxFps] - Optional scheduler FPS cap.\n * @param {'high-performance'|'low-power'} [options.powerPreference='high-performance'] -\n * Preferred GPU class for WebGL and WebGPU initialization.\n * @param {WebGLContextAttributes} [options.webglContextAttributes] - Extra\n * WebGL2 context attributes merged over Helios defaults.\n * @param {GPURequestAdapterOptions} [options.webgpuAdapterOptions] - Extra\n * WebGPU adapter options merged over Helios defaults.\n * @param {GPUDeviceDescriptor} [options.webgpuDeviceDescriptor] - Extra\n * WebGPU device descriptor options. Explicit `requiredLimits` are merged with\n * Helios' graph-oriented limit requests.\n * @param {Partial<GPUCanvasConfiguration>} [options.webgpuCanvasConfiguration] -\n * Extra WebGPU canvas configuration values merged over Helios defaults.\n * @param {boolean|string|number} [options.supersampling] - Canvas\n * supersampling mode or scale factor.\n * @param {'dark'|'light'|string} [options.theme] - Initial renderer/UI theme.\n * When omitted, Helios follows `data-helios-theme`, `data-theme`,\n * `data-md-color-scheme`, or the browser color-scheme preference.\n * @param {string|Array<number>} [options.background] - Renderer background\n * color. Takes precedence over theme-derived defaults.\n * @param {string|Array<number>} [options.clearColor] - Renderer clear color.\n * Takes precedence over theme-derived defaults.\n * @returns {Helios} Visualization controller with a `ready` promise that\n * resolves after renderer, scheduler, layers, behaviors, and initial geometry\n * are initialized.\n * @remarks `options.container` should be an element or selector that already\n * has stable dimensions. `options.renderer` can prefer `webgpu` or `webgl`;\n * Helios falls back according to renderer availability. Built-in behaviors are\n * attached by default; `options.behaviors` accepts behavior options or custom\n * behavior instances when an app needs to tune or extend them. Set\n * `suppressBrowserGestures: true` for touch-first embedded canvases. Helios\n * automatically destroys itself when its root or container is removed from the\n * DOM unless `options.autoCleanup` is `false`. Destroying Helios disposes the\n * current network by default; pass `disposeNetworkOnDestroy: false` when the\n * application will keep using the same network after unmount.\n * @example\n * const helios = new Helios(network, {\n *   container: document.querySelector('#app'),\n *   layout: { type: 'gpu-force', options: { mode: '3d' } },\n *   behaviors: { labels: { enabled: true, source: 'label' } },\n * });\n * await helios.ready;\n */\nexport class Helios extends EventTarget {\n  /**\n   * Built-in bit flags used by node and edge interaction state.\n   *\n   * @public\n   * @apiSection Static Properties\n   * @returns {object} State bit constants for filtered, selected, and highlighted items.\n   */\n  static STATES = Object.freeze({\n    FILTERED: 1 << 0,\n    SELECTED: 1 << 1,\n    HIGHLIGHTED: 1 << 2,\n  });\n\n  /**\n   * Alias for `STATES` kept for compatibility with earlier public APIs.\n   *\n   * @public\n   * @apiSection Static Properties\n   * @returns {object} State bit constants.\n   */\n  static STATE_BITS = Helios.STATES;\n\n  /**\n   * Metadata describing settings that can be bound to controls in the UI.\n   *\n   * @public\n   * @apiSection Static Properties\n   * @returns {object} UI binding descriptors keyed by Helios setting name.\n   */\n  static UI_BINDINGS = Object.freeze({\n    edgeWidthScale: {\n      type: 'number',\n      label: 'Edge Width Scale',\n      description: 'Scales mapped edge widths',\n      defaultValue: 1,\n      domain: { min: 0, max: 10 },\n      recommendedRange: { min: 0.0, max: 10.0 },\n      step: 0.01,\n    },\n    edgeWidthBase: {\n      type: 'number',\n      label: 'Edge Width Base',\n      description: 'Adds a constant to mapped edge widths',\n      defaultValue: 0,\n      domain: { min: 0, max: 20 },\n      recommendedRange: { min: 0.0, max: 6.0 },\n      step: 0.01,\n    },\n    edgeOpacityScale: {\n      type: 'number',\n      label: 'Edge Opacity Scale',\n      description: 'Scales mapped edge opacity',\n      defaultValue: 0.5,\n      domain: { min: 0, max: 4 },\n      recommendedRange: { min: 0.0, max: 1.0 },\n      step: 0.01,\n      meta: { inputMin: 0, inputMax: null },\n    },\n    edgeOpacityBase: {\n      type: 'number',\n      label: 'Edge Opacity Base',\n      description: 'Adds a constant to mapped edge opacity',\n      defaultValue: 0,\n      domain: { min: 0, max: 1 },\n      recommendedRange: { min: 0.0, max: 1.0 },\n      step: 0.01,\n    },\n    nodeOpacityScale: {\n      type: 'number',\n      label: 'Node Opacity Scale',\n      description: 'Scales mapped node opacity',\n      defaultValue: 1,\n      domain: { min: 0, max: 4 },\n      recommendedRange: { min: 0.0, max: 1.0 },\n      step: 0.01,\n      meta: { inputMin: 0, inputMax: null },\n    },\n    nodeOpacityBase: {\n      type: 'number',\n      label: 'Node Opacity Base',\n      description: 'Adds a constant to mapped node opacity',\n      defaultValue: 0,\n      domain: { min: 0, max: 1 },\n      recommendedRange: { min: 0.0, max: 1.0 },\n      step: 0.01,\n    },\n    nodeSizeScale: {\n      type: 'number',\n      label: 'Node Size Scale',\n      description: 'Scales mapped node sizes',\n      defaultValue: 1,\n      domain: { min: 0, max: 100 },\n      recommendedRange: { min: 0.0, max: 10.0 },\n      step: 0.01,\n    },\n    nodeSizeBase: {\n      type: 'number',\n      label: 'Node Size Base',\n      description: 'Adds a constant to mapped node sizes',\n      defaultValue: 0,\n      domain: { min: 0, max: 50 },\n      recommendedRange: { min: 0.0, max: 10.0 },\n      step: 0.01,\n    },\n    semanticZoomExponent: {\n      type: 'number',\n      label: 'Semantic Zoom Exp.',\n      description: 'Compensates node and edge sizes as camera zoom changes (0 = geometric zoom only)',\n      defaultValue: 0,\n      domain: { min: 0, max: 2 },\n      recommendedRange: { min: 0.0, max: 1.0 },\n      step: 0.01,\n    },\n    nodeOutlineWidthScale: {\n      type: 'number',\n      label: 'Outline Width Scale',\n      description: 'Scales mapped outline widths',\n      defaultValue: 0,\n      domain: { min: 0, max: 20 },\n      recommendedRange: { min: 0.0, max: 20.0 },\n      step: 0.01,\n    },\n    nodeOutlineWidthBase: {\n      type: 'number',\n      label: 'Outline Width Base',\n      description: 'Adds a constant to mapped outline widths',\n      defaultValue: 0,\n      domain: { min: 0, max: 20 },\n      recommendedRange: { min: 0.0, max: 4.0 },\n      step: 0.01,\n    },\n    edgeEndpointTrim: {\n      type: 'number',\n      label: 'Edge Endpoint Trim',\n      description: 'Trims edge endpoints so edges don’t overlap nodes',\n      defaultValue: 0.8,\n      domain: { min: 0, max: 3 },\n      recommendedRange: { min: 0.0, max: 1.5 },\n      step: 0.01,\n    },\n    edgeWidthClampToNodeDiameter: {\n      type: 'boolean',\n      label: 'Clamp Edge Widths',\n      description: 'Limit rendered edge width to the endpoint node diameters after width mapping and state styles',\n      defaultValue: true,\n    },\n    nodeBlendWithEdges: {\n      type: 'boolean',\n      label: 'Blend Nodes',\n      description: 'Blend nodes using the edge transparency mode (weighted modes still use alpha; disables node depth testing)',\n      defaultValue: false,\n    },\n    edgeDepthWrite: {\n      type: 'boolean',\n      label: 'Edge Depth Write',\n      description: 'Enable depth testing and depth writes for edges (best for solid edges)',\n      defaultValue: false,\n    },\n    edgeFastRendering: {\n      type: 'boolean',\n      label: 'Fast Edge Lines',\n      description: 'Use a reduced-cost edge path for large interactive graphs. Forces thin line rendering and disables expensive edge effects.',\n      defaultValue: false,\n    },\n    shadedEnabled: {\n      type: 'boolean',\n      label: 'Shaded',\n      description: 'Enable shader-specialized lighting for the configured node and edge paths.',\n      defaultValue: false,\n    },\n    shadedNodes: {\n      type: 'boolean',\n      label: 'Nodes',\n      description: 'Apply shaded sphere lighting to nodes.',\n      defaultValue: true,\n    },\n    shadedEdges: {\n      type: 'boolean',\n      label: 'Edges',\n      description: 'Apply shaded cylindrical lighting across edge widths when the quad edge path is active.',\n      defaultValue: false,\n    },\n    shadedLightDirectionX: {\n      type: 'number',\n      label: 'Light X',\n      description: 'Shaded-light direction along the horizontal screen axis.',\n      defaultValue: SHADED_LIGHT_DIRECTION_DEFAULT[0],\n      domain: { min: -1, max: 1 },\n      recommendedRange: { min: -1, max: 1 },\n      step: 0.01,\n    },\n    shadedLightDirectionY: {\n      type: 'number',\n      label: 'Light Y',\n      description: 'Shaded-light direction along the vertical screen axis.',\n      defaultValue: SHADED_LIGHT_DIRECTION_DEFAULT[1],\n      domain: { min: -1, max: 1 },\n      recommendedRange: { min: -1, max: 1 },\n      step: 0.01,\n    },\n    shadedLightDirectionZ: {\n      type: 'number',\n      label: 'Light Z',\n      description: 'Shaded-light direction toward the camera.',\n      defaultValue: SHADED_LIGHT_DIRECTION_DEFAULT[2],\n      domain: { min: -1, max: 1 },\n      recommendedRange: { min: -1, max: 1 },\n      step: 0.01,\n    },\n    shadedDiffuseStrength: {\n      type: 'number',\n      label: 'Diffuse',\n      description: 'Strength of the directional diffuse contribution from the shaded light color.',\n      defaultValue: SHADED_DIFFUSE_STRENGTH_DEFAULT,\n      domain: { min: 0, max: 4 },\n      recommendedRange: { min: 0, max: 2 },\n      step: 0.01,\n    },\n    shadedAmbientStrength: {\n      type: 'number',\n      label: 'Ambient',\n      description: 'Strength of the ambient top and bottom hemisphere lighting.',\n      defaultValue: SHADED_AMBIENT_STRENGTH_DEFAULT,\n      domain: { min: 0, max: 4 },\n      recommendedRange: { min: 0, max: 2 },\n      step: 0.01,\n    },\n    shadedSpecularStrength: {\n      type: 'number',\n      label: 'Specular',\n      description: 'Strength of the specular highlight added on top of ambient and diffuse lighting.',\n      defaultValue: SHADED_SPECULAR_STRENGTH_DEFAULT,\n      domain: { min: 0, max: 4 },\n      recommendedRange: { min: 0, max: 1.5 },\n      step: 0.01,\n    },\n    shadedShininess: {\n      type: 'number',\n      label: 'Shininess',\n      description: 'Exponent used for shaded specular highlights.',\n      defaultValue: SHADED_SHININESS_DEFAULT,\n      domain: { min: 1, max: 256 },\n      recommendedRange: { min: 8, max: 128 },\n      step: 1,\n    },\n    ambientOcclusionEnabled: {\n      type: 'boolean',\n      label: 'Ambient Occlusion',\n      description: 'Enable a fast screen-space ambient occlusion post pass.',\n      defaultValue: false,\n    },\n    ambientOcclusionNodes: {\n      type: 'boolean',\n      label: 'Nodes',\n      description: 'Include node surfaces in the AO depth prepass and darkening pass.',\n      defaultValue: true,\n    },\n    ambientOcclusionEdges: {\n      type: 'boolean',\n      label: 'Edges',\n      description: 'Include edge surfaces in the AO depth prepass and darkening pass.',\n      defaultValue: false,\n    },\n    ambientOcclusionStrength: {\n      type: 'number',\n      label: 'Strength',\n      description: 'How strongly the AO pass darkens occluded pixels.',\n      defaultValue: AMBIENT_OCCLUSION_STRENGTH_DEFAULT,\n      domain: { min: 0, max: 3 },\n      recommendedRange: { min: 0.2, max: 3.0 },\n      step: 0.01,\n    },\n    ambientOcclusionRadius: {\n      type: 'number',\n      label: 'Radius',\n      description: 'Screen-space AO sample radius in pixels.',\n      defaultValue: AMBIENT_OCCLUSION_RADIUS_DEFAULT,\n      domain: { min: 1, max: 100 },\n      recommendedRange: { min: 4, max: 100 },\n      step: 1,\n    },\n    ambientOcclusionBias: {\n      type: 'number',\n      label: 'Bias',\n      description: 'Small positive bias that suppresses self-occlusion noise.',\n      defaultValue: AMBIENT_OCCLUSION_BIAS_DEFAULT,\n      domain: { min: 0, max: 0.1 },\n      recommendedRange: { min: 0.001, max: 0.04 },\n      step: 0.001,\n    },\n    ambientOcclusionMode: {\n      type: 'string',\n      label: 'Mode',\n      description: 'Choose between Fast SSAO and Smooth SSAO.',\n      defaultValue: AMBIENT_OCCLUSION_MODE_DEFAULT,\n    },\n    ambientOcclusionIntensityScale: {\n      type: 'number',\n      label: 'Fast Scale',\n      description: 'Internal occlusion contrast scale used by Fast SSAO before final compositing.',\n      defaultValue: AMBIENT_OCCLUSION_INTENSITY_SCALE_DEFAULT,\n      domain: { min: 0, max: 4 },\n      recommendedRange: { min: 0.5, max: 2.5 },\n      step: 0.01,\n    },\n    ambientOcclusionIntensityShift: {\n      type: 'number',\n      label: 'Fast Shift',\n      description: 'Internal occlusion offset used by Fast SSAO to keep mid-tones from over-darkening.',\n      defaultValue: AMBIENT_OCCLUSION_INTENSITY_SHIFT_DEFAULT,\n      domain: { min: 0, max: 1 },\n      recommendedRange: { min: 0, max: 0.2 },\n      step: 0.01,\n    },\n    ambientOcclusionQuality: {\n      type: 'string',\n      label: 'Quality',\n      description: 'Trade AO sharpness and stability against GPU cost.',\n      defaultValue: AMBIENT_OCCLUSION_QUALITY_DEFAULT,\n    },\n    edgeAdaptiveQualityEnabled: {\n      type: 'boolean',\n      label: 'Adaptive Edges',\n      description: 'Automatically switch to fast edge lines only after repeated slow high-quality frames.',\n      defaultValue: EDGE_ADAPTIVE_QUALITY_DEFAULTS.enabled,\n    },\n    edgeAdaptiveQualitySlowFrameThresholdMs: {\n      type: 'number',\n      label: 'Slow Frame',\n      description: 'A high-quality edge frame slower than this counts toward adaptive fallback.',\n      defaultValue: EDGE_ADAPTIVE_QUALITY_DEFAULTS.slowFrameThresholdMs,\n      domain: { min: 0, max: 200 },\n      recommendedRange: { min: 8, max: 60 },\n      step: 1,\n    },\n    edgeAdaptiveQualitySlowFrameConsecutiveFrames: {\n      type: 'number',\n      label: 'Avg Frames',\n      description: 'How many recent high-quality edge frames are averaged before deciding to switch to fast edges.',\n      defaultValue: EDGE_ADAPTIVE_QUALITY_DEFAULTS.averageWindowFrames,\n      domain: { min: 1, max: 60 },\n      recommendedRange: { min: 4, max: 24 },\n      step: 1,\n    },\n    edgeAdaptiveQualityProbeIntervalMs: {\n      type: 'number',\n      label: 'Hold Time',\n      description: 'How long to stay in fast-edge mode before probing high-quality edges again.',\n      defaultValue: EDGE_ADAPTIVE_QUALITY_DEFAULTS.probeIntervalMs,\n      domain: { min: 0, max: 5000 },\n      recommendedRange: { min: 100, max: 2000 },\n      step: 10,\n    },\n    edgeAdaptiveQualityInteractionHoldMs: {\n      type: 'number',\n      label: 'Interaction Hold',\n      description: 'Debounce after camera movement before trying high-quality edges again.',\n      defaultValue: EDGE_ADAPTIVE_QUALITY_DEFAULTS.interactionHoldMs,\n      domain: { min: 0, max: 2000 },\n      recommendedRange: { min: 0, max: 500 },\n      step: 10,\n    },\n    edgeAdaptiveQualityFastDuringCamera: {\n      type: 'boolean',\n      label: 'Camera',\n      description: 'Keep fast edges active during panning, zooming, rotating, and nearby interaction bursts.',\n      defaultValue: true,\n    },\n    edgeAdaptiveQualityFastDuringLayout: {\n      type: 'boolean',\n      label: 'Layout',\n      description: 'Keep fast edges active while the active layout is still updating positions.',\n      defaultValue: EDGE_ADAPTIVE_QUALITY_DEFAULTS.fastDuringLayout,\n    },\n    labelsMode: {\n      type: 'string',\n      label: 'Labels',\n      description: 'Choose whether labels are off, automatically ranked, or limited to selected nodes.',\n      defaultValue: 'off',\n    },\n    labelsSelectedOnlySpaceAware: {\n      type: 'boolean',\n      label: 'Space Aware',\n      description: 'When Selected Only is active, use the regular label culling and collision strategy instead of always forcing selected labels through.',\n      defaultValue: true,\n    },\n    labelsEnabled: {\n      type: 'boolean',\n      label: 'Show Labels',\n      description: 'Enable SVG node labels',\n      defaultValue: false,\n    },\n    labelsMaxVisible: {\n      type: 'number',\n      label: 'Max Labels',\n      description: 'Maximum number of labels rendered at once',\n      defaultValue: 120,\n      domain: { min: 0, max: 5000 },\n      recommendedRange: { min: 20, max: 400 },\n      step: 1,\n    },\n    labelsFontSizeScale: {\n      type: 'number',\n      label: 'Label Size Scale',\n      description: 'Global multiplier for label font size',\n      defaultValue: 1,\n      domain: { min: 0.25, max: 8 },\n      recommendedRange: { min: 0.5, max: 2.5 },\n      step: 0.05,\n    },\n    labelsMinScreenRadius: {\n      type: 'number',\n      label: 'Min Node Radius',\n      description: 'Minimum apparent node radius (px) required before labels are considered',\n      defaultValue: 0,\n      domain: { min: 0, max: 200 },\n      recommendedRange: { min: 0, max: 24 },\n      step: 0.5,\n    },\n    labelsOutlineWidth: {\n      type: 'number',\n      label: 'Label Outline Width',\n      description: 'Label stroke/halo width',\n      defaultValue: 2,\n      domain: { min: 0, max: 16 },\n      recommendedRange: { min: 0, max: 6 },\n      step: 0.25,\n    },\n    labelsOffsetRadiusFactor: {\n      type: 'number',\n      label: 'Label Radius Factor',\n      description: 'Scales the node-radius-based vertical anchor used for labels',\n      defaultValue: 1,\n      domain: { min: -8, max: 8 },\n      recommendedRange: { min: -1, max: 1 },\n      step: 0.05,\n    },\n    labelsOffsetPx: {\n      type: 'number',\n      label: 'Label Pixel Offset',\n      description: 'Additional vertical label offset in screen pixels',\n      defaultValue: 4,\n      domain: { min: -256, max: 256 },\n      recommendedRange: { min: -48, max: 48 },\n      step: 1,\n    },\n    labelsMaxChars: {\n      type: 'number',\n      label: 'Label Max Chars',\n      description: 'Maximum characters per row before truncation (0 = unlimited)',\n      defaultValue: 45,\n      domain: { min: 0, max: 512 },\n      recommendedRange: { min: 0, max: 64 },\n      step: 1,\n    },\n    labelsMaxRows: {\n      type: 'number',\n      label: 'Label Max Rows',\n      description: 'Maximum wrapped label rows (uses ellipsis when clipped)',\n      defaultValue: 2,\n      domain: { min: 1, max: 8 },\n      recommendedRange: { min: 1, max: 4 },\n      step: 1,\n    },\n    legendsEnabled: {\n      type: 'boolean',\n      label: 'Show Legends',\n      description: 'Enable SVG overlay legends',\n      defaultValue: true,\n    },\n    background: {\n      type: 'color',\n      label: 'Background',\n      description: 'Renderer clear/background color',\n      eventName: 'clearColor',\n    },\n    clearColor: {\n      type: 'color',\n      label: 'Background',\n      description: 'Renderer clear/background color',\n    },\n    supersampling: {\n      type: 'string',\n      label: 'Supersampling',\n      description: 'Canvas resolution scaling: Off, Auto, or 2x.',\n    },\n  });\n\n  /**\n   * Return the UI control metadata registered for one Helios setting.\n   *\n   * @public\n   * @apiSection Configuration\n   * @param {string} name - UI binding name such as `nodeSizeScale` or `labelsEnabled`.\n   * @returns {object|null} Binding descriptor, or `null` when the name is unknown.\n   */\n  uiBindingInfo(name) {\n    return this.constructor.UI_BINDINGS?.[name] ?? null;\n  }\n\n  _emitUIBindingChange(name, value, detail = {}) {\n    if (this._suppressStateBindingUiEvent > 0) return;\n    if (typeof this.dispatchEvent !== 'function') return;\n    try {\n      const payload = {\n        source: detail.source ?? 'program',\n        trackOverride: detail.trackOverride !== false,\n        ...detail,\n        id: `helios.${name}`,\n        name,\n        value,\n      };\n      this._handleAutoThemeBindingChange(name, payload);\n      this.dispatchEvent(createDetailEvent('ui:binding-change', payload));\n    } catch (error) {\n      if (\n        this.dispatchEvent === EventTarget.prototype.dispatchEvent\n        && error instanceof TypeError\n        && /undefined \\(reading 'get'\\)/.test(String(error.message ?? ''))\n      ) {\n        return;\n      }\n      console.warn(`Helios: failed to emit UI binding change for \"${name}\".`, error);\n    }\n  }\n\n  _emitLayoutChanged(layout = this._layout) {\n    const descriptor = typeof layout?.getParameterBindings === 'function'\n      ? (layout.getParameterBindings() ?? null)\n      : null;\n    this.emit(EVENTS.LAYOUT_CHANGED, {\n      layout,\n      key: descriptor?.key ?? null,\n      label: descriptor?.label ?? layout?.constructor?.name ?? null,\n    });\n  }\n\n  _bindLayoutToHelios(layout) {\n    if (layout && typeof layout === 'object') {\n      layout.helios = this;\n    }\n    return layout;\n  }\n\n  _wakeLayoutIfIdle(reason = 'layout') {\n    const scheduler = this.scheduler ?? null;\n    if (!scheduler || typeof scheduler.setLayoutEnabled !== 'function') return false;\n    const state = typeof scheduler.getLayoutState === 'function'\n      ? scheduler.getLayoutState()\n      : (scheduler.layoutEnabled !== false ? 'running' : 'stopped');\n    if (state !== 'idle') return false;\n    scheduler.setLayoutEnabled(true, reason);\n    scheduler.requestLayout?.(reason);\n    return true;\n  }\n\n  _requestLayoutReheat(reason = 'layout') {\n    const layout = this._layout ?? null;\n    if (!layout || typeof layout !== 'object') return false;\n    if (typeof layout.reheat === 'function') {\n      layout.reheat(reason);\n      return true;\n    }\n    layout.requestUpdate?.();\n    return false;\n  }\n\n  _resumeDynamicLayoutAfterNetworkReplace(previousState, reason = 'network-replaced') {\n    if (previousState !== 'idle') return false;\n    if (this._layout instanceof StaticLayout) return false;\n    const woke = this._wakeLayoutIfIdle(reason);\n    const reheated = this._requestLayoutReheat(reason);\n    return woke || reheated;\n  }\n\n  _activateLayoutAfterNetworkReplace(previousLayoutState, reason = 'network-replaced') {\n    this._enforcePositionSourcePolicy(this._layout, { resetInterpolation: false });\n    this.scheduler.setLayout(this._layout);\n    this._resumeDynamicLayoutAfterNetworkReplace(previousLayoutState, reason);\n    this._emitLayoutChanged(this._layout);\n  }\n\n  constructor(network, options = {}) {\n    if (!network) {\n      throw new Error('Helios requires a helios-network instance');\n    }\n    super();\n    this._destroyed = false;\n    this._autoCleanupObserver = null;\n    if (!Object.prototype.hasOwnProperty.call(options, 'transparencyModeEdges')) {\n      options.transparencyModeEdges = 'weighted';\n    }\n    options.mode = options.mode === '2d' ? '2d' : '3d';\n    if (!Object.prototype.hasOwnProperty.call(options, 'layout')) {\n      const mode = options.mode;\n      options.layout = {\n        type: 'gpu-force',\n        options: {\n          mode,\n        },\n      };\n    }\n    const container = options.container ?? document.getElementById('app') ?? document.body;\n    const hasExplicitTheme = hasExplicitThemeOption(options);\n    const hasExplicitBackground = hasOwnOption(options, 'clearColor') || hasOwnOption(options, 'background');\n    this._initialTheme = resolveInitialTheme(options, container);\n    this._hasExplicitThemeOption = hasExplicitTheme;\n    this._autoThemeDefaults = {\n      background: !hasExplicitBackground && !hasExplicitTheme,\n      controls: !hasExplicitTheme,\n      currentTheme: this._initialTheme,\n      cleanup: null,\n      stateCleanup: null,\n    };\n    normalizeInitialClearColorOptions(options, this._initialTheme);\n    this.network = network;\n    const initialNetworkSource = options.networkSource && typeof options.networkSource === 'object'\n      ? options.networkSource\n      : {};\n    const initialNetworkName = typeof initialNetworkSource.name === 'string' && initialNetworkSource.name.trim()\n      ? initialNetworkSource.name.trim()\n      : (typeof options.networkName === 'string' && options.networkName.trim() ? options.networkName.trim() : null);\n    const initialNetworkBase = typeof initialNetworkSource.baseName === 'string' && initialNetworkSource.baseName.trim()\n      ? initialNetworkSource.baseName.trim()\n      : (initialNetworkName ? getBaseFilename(initialNetworkName) : null);\n    this._lastLoadedNetworkName = initialNetworkName;\n    this._lastLoadedNetworkBase = initialNetworkBase;\n    this._lastLoadedNetworkFormat = typeof initialNetworkSource.format === 'string'\n      ? initialNetworkSource.format\n      : inferNetworkFormatFromName(initialNetworkName);\n    this.options = options;\n    this._initialMode = options.mode === '2d' ? '2d' : '3d';\n    this.debugEnabled = options.debug === false\n      ? false\n      : !(options.debug && typeof options.debug === 'object' && options.debug.enabled === false);\n    this.debug = createDebugLogger(options.debug);\n    if (this.debugEnabled && typeof window !== 'undefined') {\n      window.__helios = this;\n    }\n    this.debug.log('helios', 'Constructing Helios instance', { mode: this._initialMode });\n    this.prewarmPromise = null;\n    this.mappersDirty = false;\n    this._legendContentVersion = 0;\n    this.markMappersDirty = () => {\n      this.mappersDirty = true;\n      this._legendContentVersion += 1;\n      this.prewarmPromise = null;\n      this.scheduler?.requestGeometry?.();\n      this.emit?.(EVENTS.MAPPERS_CHANGED, {\n        node: serializeMapperCollectionState(this.nodeMapper),\n        edge: serializeMapperCollectionState(this.edgeMapper),\n      });\n    };\n    this.layers = new LayerManager(container, {\n      suppressBrowserGestures: options.suppressBrowserGestures !== false,\n      supersampling: options.supersampling,\n      forceSupersample: options.forceSupersample,\n      supersamplingAutoFactor: options.supersamplingAutoFactor,\n      supersamplingAutoThreshold: options.supersamplingAutoThreshold,\n    });\n    this._networkFileDropOptions = normalizeNetworkFileDropOptions(\n      options.fileDrop ?? options.networkFileDrop ?? options.dragAndDropNetwork,\n    );\n    this._networkFileDropCleanup = null;\n    this._networkFileDropOverlay = null;\n    this._networkFileDropDepth = 0;\n    this._setupAutoCleanup();\n    this._setupNetworkFileDrop();\n    this.visuals = new VisualAttributes(network, this.debug);\n    this.nodeMapper = new MapperCollection('node', network, this.markMappersDirty, this.debug);\n    this.edgeMapper = new MapperCollection('edge', network, this.markMappersDirty, this.debug);\n    const optionMappers = options.mappers;\n    if (optionMappers !== null) {\n      const initialMappers = optionMappers ?? createDefaultMappers(network);\n      if (initialMappers?.nodeMapper) {\n        this.nodeMapper.setDefault(initialMappers.nodeMapper);\n      }\n      if (initialMappers?.edgeMapper) {\n        this.edgeMapper.setDefault(initialMappers.edgeMapper);\n      }\n    }\n    this.mappersDirty = true;\n    this.visuals.seedMissingPositions(resolveSeedBoundsForLayout(options.layout, this.layers.size, options.mode));\n    const debugPerformance = options.debugPerformance?? false;\n    const performanceWindow = options.performanceWindow ?? 60;\n    const performanceLogEvery = options.performanceLogEvery ?? performanceWindow;\n    this.performanceMonitor = new PerformanceMonitor({\n      enabled: debugPerformance,\n      windowSize: performanceWindow,\n      logEvery: performanceLogEvery,\n    });\n    this.attributeUpdateOptions = {\n      autoUpdate: options.attributeAutoUpdate === true,\n      maxFps: options.attributeAutoUpdateMaxFps ?? null,\n      frameSkip: options.attributeAutoUpdateFrameSkip ?? null,\n    };\n    this.manualRendering = options.manualRendering === true;\n    this.scheduler = new Scheduler({\n      performanceMonitor: this.performanceMonitor,\n      maxFps: options.maxFps,\n      debug: this.debug,\n      attributeAutoUpdate: this.attributeUpdateOptions.autoUpdate,\n      attributeMaxFps: this.attributeUpdateOptions.maxFps,\n      attributeFrameSkip: this.attributeUpdateOptions.frameSkip,\n    });\n    const requestedPositionDelegate = options.positions?.delegate ?? null;\n    const initialPositionDelegate = requestedPositionDelegate\n      ? this._validatePositionDelegate(requestedPositionDelegate)\n      : null;\n    const initialPositionSource = options.positions?.source === 'delegate' && initialPositionDelegate\n      ? 'delegate'\n      : 'network';\n    this._positionsConfig = {\n      source: initialPositionSource,\n      delegate: initialPositionDelegate,\n    };\n    this._activePositionDelegate = null;\n    const interpolationOptions = options.interpolation ?? null;\n    const interpolationDurationMode = normalizeInterpolationDurationMode(\n      interpolationOptions?.durationMode ?? interpolationOptions?.durationStrategy,\n      interpolationOptions?.fixedDurationMs != null\n        ? 'fixed'\n        : interpolationOptions?.adaptiveDuration === true\n          ? 'adaptive'\n          : POSITION_INTERPOLATION_DEFAULTS.durationMode,\n    );\n    this._interpolationConfig = {\n      ...POSITION_INTERPOLATION_DEFAULTS,\n      ...(interpolationOptions && typeof interpolationOptions === 'object' ? interpolationOptions : {}),\n      mode: normalizeInterpolationMode(interpolationOptions?.mode ?? interpolationOptions?.type),\n      easing: normalizeInterpolationEasing(interpolationOptions?.easing),\n      enabled: interpolationOptions?.enabled === true,\n      durationMode: interpolationDurationMode,\n      durationMs: normalizeNonNegativeNumber(\n        interpolationOptions?.fixedDurationMs ?? interpolationOptions?.durationMs ?? interpolationOptions?.duration,\n        POSITION_INTERPOLATION_DEFAULTS.durationMs,\n      ),\n      adaptiveDuration: interpolationDurationMode === 'adaptive',\n      adaptiveDurationSamples: normalizePositiveInteger(\n        interpolationOptions?.adaptiveDurationSamples,\n        POSITION_INTERPOLATION_DEFAULTS.adaptiveDurationSamples,\n        1,\n        120,\n      ),\n      adaptiveDurationWindowMs: normalizeNonNegativeNumber(\n        interpolationOptions?.adaptiveDurationWindowMs,\n        POSITION_INTERPOLATION_DEFAULTS.adaptiveDurationWindowMs,\n        100,\n        60000,\n      ),\n      adaptiveDurationScale: normalizeNonNegativeNumber(\n        interpolationOptions?.adaptiveDurationScale,\n        POSITION_INTERPOLATION_DEFAULTS.adaptiveDurationScale,\n        0,\n        16,\n      ),\n      adaptiveDurationMinMs: normalizeNonNegativeNumber(\n        interpolationOptions?.adaptiveDurationMinMs,\n        POSITION_INTERPOLATION_DEFAULTS.adaptiveDurationMinMs,\n        0,\n        60000,\n      ),\n      adaptiveDurationMaxMs: normalizeNonNegativeNumber(\n        interpolationOptions?.adaptiveDurationMaxMs,\n        POSITION_INTERPOLATION_DEFAULTS.adaptiveDurationMaxMs,\n        0,\n        60000,\n      ),\n      smoothing: normalizeNonNegativeNumber(\n        interpolationOptions?.smoothing,\n        POSITION_INTERPOLATION_DEFAULTS.smoothing,\n      ),\n      minDisplacementRatio: normalizeNonNegativeNumber(\n        interpolationOptions?.minDisplacementRatio,\n        POSITION_INTERPOLATION_DEFAULTS.minDisplacementRatio,\n      ),\n    };\n    this._interpolationRuntime = {\n      active: false,\n      startedAt: 0,\n      lastFrameAt: 0,\n      lastTargetUpdateAt: 0,\n      layoutElapsedMs: 16,\n      sourcePositions: null,\n      targetPositions: null,\n      mixedPositions: null,\n      sourceVersion: 0,\n      targetVersion: 0,\n      sourceCount: 0,\n      factor: 1,\n      delegateVersion: null,\n      sourceWebGPUBuffer: null,\n      sourceWebGLTexture: null,\n      sourceTextureMeta: null,\n      lastRenderedPositions: null,\n      effectiveDurationMs: this._interpolationConfig.durationMs,\n      layoutIntervalsMs: [],\n    };\n    this.scheduler.setRenderPump(({ timestamp }) => this._runInterpolationRenderPump(timestamp));\n    if (options.prewarm === true) {\n      this.prewarm();\n    }\n    this._layout = this._bindLayoutToHelios(this.createLayout(options.layout));\n    this._enforcePositionSourcePolicy(this._layout, {\n      resetInterpolation: false,\n      requestRender: false,\n      requestGeometry: false,\n      requestLabels: false,\n    });\n    this.renderer = null;\n    this.attributeTracker = null;\n    this.indexPickingTracker = null;\n    this._anyListeners = new Set();\n    this._listenHandlers = new Map();\n    this._pendingGraphLayerProps = new Map();\n    this._pendingRendererProps = new Map();\n    this._frameId = 0;\n    this._lastRenderTime = performance.now();\n    this.counters = {\n      geometryFrames: 0,\n      renderFrames: 0,\n      attributeUpdateTicks: 0,\n    };\n    this._cameraMoveRaf = null;\n    this._cameraTransitionController = null;\n    const cameraControlOptions = options.camera ?? options.cameraControls ?? null;\n    this._cameraControlConfig = normalizeCameraControlConfig(\n      CAMERA_CONTROL_DEFAULTS,\n      cameraControlOptions && typeof cameraControlOptions === 'object'\n        ? cameraControlOptions\n        : {},\n    );\n    this._cameraControlRuntime = {\n      lastAutoFitAt: Number.NEGATIVE_INFINITY,\n      lastOrbitAt: 0,\n      lastFitSignature: '',\n      lastEffectiveIntervalMs: this._cameraControlConfig.autoFitIntervalMs,\n      autoFitDirty: false,\n      delegateSnapshot: null,\n      delegateSnapshotAt: Number.NEGATIVE_INFINITY,\n      delegateSnapshotPending: false,\n      delegateSnapshotDelegate: null,\n      delegateSnapshotRequestId: 0,\n      delegateTargetBounds: null,\n      delegateTargetBoundsAt: Number.NEGATIVE_INFINITY,\n      delegateTargetBoundsPending: false,\n      delegateTargetBoundsDelegate: null,\n      delegateTargetBoundsSignature: '',\n      delegateTargetBoundsRequestId: 0,\n      cameraBoundsSnapshot: null,\n      cameraBoundsSignature: '',\n      cameraBoundsKind: '',\n      cameraBoundsDirty: false,\n      cameraBoundsPending: false,\n      cameraBoundsPreparedAt: Number.NEGATIVE_INFINITY,\n      orbitBaseRotation: null,\n      appliedOrbitAngle: this._cameraControlConfig.orbitAngle ?? 0,\n      suspended: false,\n      controlPoseActive: false,\n      controlPoseFrom: null,\n      controlPoseTo: null,\n      controlPoseStartedAt: 0,\n      controlPoseDurationMs: 0,\n      controlPoseSignature: '',\n      largeNetworkStartupActive: false,\n      pendingLargeNetworkStartupSettle: null,\n      largeNetworkStartupRefreshIteration: -1,\n      lastFollowUpdateAt: Number.NEGATIVE_INFINITY,\n    };\n    this._picking = {\n      node: { enabled: false, hoverEnabled: true },\n      edge: { enabled: false, hoverEnabled: true },\n      options: {\n        resolutionScale: 0.5,\n        trackDepth: false,\n        maxFps: 30,\n        clickRequiresStationary: true,\n        clickMoveTolerancePx: 4,\n        suppressClickAfterWheelMs: 200,\n      },\n      hover: { kind: null, index: -1, depth: null },\n      pointer: { x: 0, y: 0, clientX: 0, clientY: 0, inside: false },\n      suppressHover: false,\n      cameraIdleTimer: null,\n      hoverThrottleTimer: null,\n      gesture: createPickingGestureState(),\n      _raf: null,\n      _inFlight: false,\n      _rerun: false,\n      _lastPickTime: -Infinity,\n    };\n    this._pickingListenersAttached = false;\n    this._boundPickingHandlers = {\n      down: (event) => this._handlePointerDown(event),\n      move: (event) => this._handlePointerMove(event),\n      up: (event) => this._handlePointerUp(event),\n      cancel: (event) => this._handlePointerUp(event),\n      leave: () => this._handlePointerLeave(),\n      wheel: (event) => this._handleWheel(event),\n      click: (event) => this._handlePointerClick(event, false, { synthetic: false }),\n      dblclick: (event) => this._handlePointerClick(event, true, { synthetic: false }),\n    };\n    this._pendingFrameNetwork = null;\n    this._graphFilterState = this._graphFilterState ?? {\n      enabled: false,\n      scope: GRAPH_FILTER_SCOPE_RENDER,\n      options: null,\n      signature: null,\n      nodeIndices: null,\n      edgeIndices: null,\n      nodeSelector: null,\n      edgeSelector: null,\n      filteredNetwork: null,\n      renderNetwork: network,\n      layoutNetwork: network,\n      version: 0,\n      stats: null,\n      lastError: null,\n    };\n    this._activeHeliosFilter = null;\n    this._stateStyleCache = {\n      nodeSlots: new Map(),\n      edgeSlots: new Map(),\n      nodeNoState: null,\n      edgeNoState: null,\n      nodeHover: null,\n      edgeHover: null,\n    };\n    this._hoverStyleFromHighlight = options.hoverStyleFromHighlight === true;\n    this._highlightConnectedEdges = options.highlightConnectedEdges === true;\n    this._interactionRenderOrder = {\n      enabled: options.interactionRenderOrder !== false && options.renderOrderInteractions !== false,\n      promoteHoverConnectedEdges: options.interactionRenderOrderHoverConnectedEdges !== false,\n      promoteSelectedConnectedEdges: options.interactionRenderOrderSelectedConnectedEdges !== false,\n      promoteHighlightedConnectedEdges: options.interactionRenderOrderHighlightedConnectedEdges !== false,\n    };\n    this._highlightSources = new Map();\n    this._highlightUnion = { nodes: new Set(), edges: new Set() };\n    const densityEnabled = options.density === true || options.densityEnabled === true;\n    const densityScale = options.densityScale ?? options.densityQualityScale ?? DENSITY_DEFAULTS.qualityScale;\n    const densityTopographic = options.topographic === true || options.densityTopographic === true;\n    const densityScaleWithZoom = options.densityScaleWithZoom === true\n      || options.densityScaleByZoom === true\n      || options.scaleDensityWithZoom === true;\n    const densityNormalizeVs = options.shallNormalizeVsDensity === true\n      || options.vsDensityNormalize === true\n      || options.densityNormalizeVs === true;\n    const densityComparisonMode = typeof options.densityComparisonMode === 'string' && options.densityComparisonMode.trim()\n      ? options.densityComparisonMode.trim()\n      : DENSITY_DEFAULTS.comparisonMode;\n    const initialCompareProperty = typeof options.vsDensityProperty === 'string' && options.vsDensityProperty.trim()\n      ? options.vsDensityProperty.trim()\n      : DENSITY_DEFAULTS.compareProperty;\n    const initialProperty = typeof options.densityProperty === 'string' && options.densityProperty.trim()\n      ? options.densityProperty.trim()\n      : DENSITY_DEFAULTS.property;\n    const sanitizedInitialCompareProperty = resolveDensityCompareProperty(initialProperty, initialCompareProperty);\n    this._densityConfig = {\n      ...DENSITY_DEFAULTS,\n      enabled: densityEnabled,\n      qualityScale: clamp(toFiniteNumber(densityScale, DENSITY_DEFAULTS.qualityScale), 0.03, 1.0),\n      topographic: densityTopographic,\n      scaleWithZoom: densityScaleWithZoom,\n      property: initialProperty,\n      compareProperty: sanitizedInitialCompareProperty,\n      comparisonMode: resolveDensityComparisonMode(sanitizedInitialCompareProperty, densityComparisonMode),\n      normalizeVs: densityNormalizeVs,\n      epsilon: clamp(\n        toFiniteNumber(options.densityEpsilon ?? options.densityLogRatioEpsilon, DENSITY_DEFAULTS.epsilon),\n        1e-12,\n        1,\n      ),\n      logRatioRange: clamp(\n        toFiniteNumber(options.densityLogRatioRange, DENSITY_DEFAULTS.logRatioRange),\n        1e-3,\n        1e3,\n      ),\n      maskThreshold: clamp(\n        toFiniteNumber(options.densityMaskThreshold, DENSITY_DEFAULTS.maskThreshold),\n        0,\n        1,\n      ),\n      logRatioZScore: options.densityLogRatioZScore === true\n        || options.logRatioZScore === true,\n      logRatioSupportCorrection: options.densityLogRatioSupportCorrection !== false\n        && options.logRatioSupportCorrection !== false,\n      bandwidth: clamp(\n        toFiniteNumber(options.densityBandwidth, DENSITY_DEFAULTS.bandwidth),\n        0.05,\n        1000,\n      ),\n      weightScale: clamp(\n        toFiniteNumber(options.densityWeight, DENSITY_DEFAULTS.weightScale),\n        0,\n        1e8,\n      ),\n      colormap: typeof options.densityColormap === 'string' && options.densityColormap.trim()\n        ? options.densityColormap.trim()\n        : DENSITY_DEFAULTS.colormap,\n      logRatioColormap: typeof options.densityLogRatioColormap === 'string' && options.densityLogRatioColormap.trim()\n        ? options.densityLogRatioColormap.trim()\n        : DENSITY_DEFAULTS.logRatioColormap,\n      divergingColormap: typeof options.densityDivergingColormap === 'string' && options.densityDivergingColormap.trim()\n        ? options.densityDivergingColormap.trim()\n        : DENSITY_DEFAULTS.divergingColormap,\n      interactionFilter: typeof options.densityInteractionFilter === 'string'\n        ? options.densityInteractionFilter\n        : DENSITY_DEFAULTS.interactionFilter,\n    };\n    this._densityRuntime = { diverging: false, valueDomain: null };\n    this._densityLayer = null;\n    this.behaviors = new BehaviorManager(this, createDefaultBehaviorRegistry());\n    this._initializeBehaviorNamespace();\n    this._edgeAdaptiveQualityConfig = normalizeEdgeAdaptiveQualityConfig(\n      EDGE_ADAPTIVE_QUALITY_DEFAULTS,\n      options.edgeAdaptiveQuality ?? { enabled: options.edgeAdaptiveQualityEnabled },\n    );\n    this._edgeAdaptiveRuntime = {\n      nextProbeAt: Number.NEGATIVE_INFINITY,\n      lastRenderMs: null,\n      qualityFrameSamples: [],\n      qualityFrameAverageMs: null,\n      fastFrameSamples: [],\n      fastFrameAverageMs: null,\n      activityActive: false,\n      skipNextQualitySample: false,\n      reason: this._edgeAdaptiveQualityConfig.enabled ? 'quality' : 'disabled',\n      cameraMovingUntil: Number.NEGATIVE_INFINITY,\n      cameraIdleTimer: null,\n      probeTimer: null,\n      failedProbeCount: 0,\n      performanceFallbackAt: Number.NEGATIVE_INFINITY,\n      performanceFallbackAlpha: NaN,\n      forceHighQuality: false,\n    };\n    this._baseOverlayInsets = { top: 0, right: 0, bottom: 0, left: 0 };\n    this._quickControlsOverlayInsets = { top: 0, right: 0, bottom: 0, left: 0 };\n    this._overlayInsets = { top: 0, right: 0, bottom: 0, left: 0 };\n    this._quickControlsConfig = normalizeQuickControlsConfig(options.quickControls, {\n      ui: options.ui,\n      defaultTheme: this._initialTheme,\n    });\n    this._quickControls = null;\n    this._quickControlCleanups = [];\n    this._setupQuickControls();\n    this.densityMap = {\n      setBandwidth: (value) => {\n        this.densityBandwidth(value);\n        return this.densityMap;\n      },\n      setKernelWeightScale: (value) => {\n        this.densityWeight(value);\n        return this.densityMap;\n      },\n      setColormap: (value) => {\n        this.densityColormap(value);\n        return this.densityMap;\n      },\n      divergingColormap: (enabled) => {\n        if (enabled === undefined) return this.density().diverging;\n        this._densityRuntime = { ...this._densityRuntime, diverging: enabled === true };\n        this.requestRender();\n        return this.densityMap;\n      },\n    };\n    this._labels = new SvgLabelController(this, options.labels ?? {});\n    this._legends = new SvgLegendController(this, options.legends ?? {});\n    this.size = { ...this.layers.size };\n    this.removeResizeListener = null;\n    this.firstGeometryUpdateComplete = false;\n    this._startupConfig = normalizeStartupConfig(options.startup, options);\n    this._startupGate = this._createStartupGate(this._startupConfig);\n    this._startupOverlay = this._createStartupOverlay(this._startupConfig);\n    this._startupCanvasPreviousVisibility = null;\n    this._applyStartupCanvasVisibility();\n    const storageEnabled = shouldEnablePersistence(options);\n    const storageConfig = hasOwnOption(options, 'storage')\n      ? options.storage\n      : (storageEnabled ? { type: 'browser' } : false);\n    const storageSessionId = normalizeStorageSessionId(options);\n    this.states = new HeliosStateManager({\n      now: options.now,\n    });\n    this._autoThemeDefaults.stateCleanup = this._installAutoThemeStateTracking();\n    this.storage = createHeliosStorageManager(storageConfig, {\n      helios: this,\n      states: this.states,\n      workspaceId: options.workspaceId ?? 'default',\n      sessionId: storageSessionId,\n      persistNetwork: options.persistNetwork === true,\n      networkPersistence: options.networkPersistence,\n      positionPersistence: options.positionPersistence,\n      sessionThumbnail: options.sessionThumbnail,\n      overrideTrackingReady: false,\n    });\n    this._beforeUnloadUnsavedChangesCleanup = null;\n    this._installUnsavedSessionBeforeUnloadWarning(options);\n    this._registerCoreStateEntries();\n    const sessionOptions = storageEnabled ? normalizeSessionPersistenceOptions(options) : false;\n    this._sessionPersistenceOptions = sessionOptions || (storageSessionId ? { sessionId: storageSessionId } : false);\n    this._initializeDefaultBehaviors(options.behaviors);\n    this._initializeBehaviors(options.behaviors);\n    this._setupAutoThemeDefaults();\n    this.ui = null;\n    this.ready = this.initialize();\n  }\n\n  _createStartupGate(config = STARTUP_DEFAULTS) {\n    let layoutIterations = normalizePositiveInteger(\n      config.layoutIterations,\n      STARTUP_DEFAULTS.layoutIterations,\n      0,\n      Number.MAX_SAFE_INTEGER,\n    );\n    let layoutDurationMs = normalizeNonNegativeNumber(\n      config.layoutDurationMs,\n      STARTUP_DEFAULTS.layoutDurationMs,\n      0,\n      60000,\n    );\n    if (this._isLargeNetworkStartupGraph()) {\n      if (config._layoutIterationsExplicit !== true) {\n        layoutIterations = STARTUP_DEFAULTS.layoutIterations;\n      }\n      if (config._layoutDurationMsExplicit !== true) {\n        layoutDurationMs = LARGE_NETWORK_STARTUP_LAYOUT_DURATION_MS;\n      }\n    }\n    return {\n      active: config.blockRendering === true || config.hideCanvasUntilFirstFrame !== false || config.loadingOverlay !== false || layoutIterations > 0 || layoutDurationMs > 0,\n      firstVisibleFrameDrawn: false,\n      startedAt: 0,\n      layoutIterations: 0,\n      targetLayoutIterations: layoutIterations,\n      targetLayoutDurationMs: layoutDurationMs,\n      blockRendering: config.blockRendering === true,\n      hideCanvasUntilFirstFrame: config.hideCanvasUntilFirstFrame !== false,\n      loadingOverlay: config.loadingOverlay !== false,\n      config,\n    };\n  }\n\n  _isLargeNetworkStartupGraph() {\n    const config = this._cameraControlConfig ?? CAMERA_CONTROL_DEFAULTS;\n    const { nodeCount, edgeCount } = this._getLargeNetworkStartupCounts?.() ?? {\n      nodeCount: Math.max(0, Math.floor(Number(this.network?.nodeCount) || 0)),\n      edgeCount: Math.max(0, Math.floor(Number(this.network?.edgeCount) || 0)),\n    };\n    const nodeThreshold = normalizePositiveInteger(\n      config.largeNetworkStartupNodeThreshold,\n      LARGE_NETWORK_STARTUP_NODE_THRESHOLD,\n      1,\n      Number.MAX_SAFE_INTEGER,\n    );\n    const edgeThreshold = normalizePositiveInteger(\n      config.largeNetworkStartupEdgeThreshold,\n      LARGE_NETWORK_STARTUP_EDGE_THRESHOLD,\n      1,\n      Number.MAX_SAFE_INTEGER,\n    );\n    return nodeCount >= nodeThreshold || edgeCount >= edgeThreshold;\n  }\n\n  _createStartupOverlay(config = STARTUP_DEFAULTS) {\n    if (config.loadingOverlay === false || typeof document === 'undefined') return null;\n    const parent = this.layers?.overlay ?? this.layers?.root ?? null;\n    if (!parent) return null;\n    const overlay = document.createElement('div');\n    overlay.className = 'helios-startup-overlay';\n    Object.assign(overlay.style, {\n      position: 'absolute',\n      inset: '0',\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n      pointerEvents: 'none',\n      zIndex: '20',\n    });\n    const spinner = document.createElement('div');\n    spinner.className = 'helios-startup-spinner';\n    spinner.setAttribute('aria-hidden', 'true');\n    Object.assign(spinner.style, {\n      width: '38px',\n      height: '38px',\n      borderRadius: '50%',\n      boxSizing: 'border-box',\n      background: 'transparent',\n      border: '3px solid var(--helios-startup-spinner-track, rgba(94, 124, 185, 0.24))',\n      borderTopColor: 'var(--helios-startup-spinner-accent, #5e7cb9)',\n      boxShadow: '0 0 14px var(--helios-startup-spinner-shadow, rgba(31, 35, 40, 0.12))',\n      animation: 'helios-startup-spin 0.82s linear infinite',\n    });\n    overlay.appendChild(spinner);\n    parent.appendChild(overlay);\n    this._ensureStartupSpinnerStyles();\n    return overlay;\n  }\n\n  _ensureStartupSpinnerStyles() {\n    if (typeof document === 'undefined') return;\n    if (document.getElementById('helios-startup-spinner-style')) return;\n    const style = document.createElement('style');\n    style.id = 'helios-startup-spinner-style';\n    style.textContent = '@keyframes helios-startup-spin { to { transform: rotate(360deg); } }';\n    document.head?.appendChild(style);\n  }\n\n  _applyStartupCanvasVisibility() {\n    const canvas = this.layers?.canvas ?? null;\n    const gate = this._startupGate ?? null;\n    if (!canvas || !gate?.active || gate.hideCanvasUntilFirstFrame === false) return;\n    if (canvas.style.visibility !== 'hidden') {\n      this._startupCanvasPreviousVisibility = canvas.style.visibility;\n    }\n    canvas.style.visibility = 'hidden';\n  }\n\n  _beginNetworkLoadStartupGate(options = {}) {\n    const base = this._startupConfig ?? STARTUP_DEFAULTS;\n    const config = {\n      ...base,\n      loadingOverlay: options.loadingOverlay !== false,\n      hideCanvasUntilFirstFrame: options.hideCanvasUntilFirstFrame !== false,\n      blockRendering: true,\n    };\n    if (Object.prototype.hasOwnProperty.call(options, 'layoutIterations')) {\n      config.layoutIterations = options.layoutIterations;\n      config._layoutIterationsExplicit = true;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'layoutDurationMs')) {\n      config.layoutDurationMs = options.layoutDurationMs;\n      config._layoutDurationMsExplicit = true;\n    }\n    this._startupOverlay?.remove?.();\n    this._startupOverlay = null;\n    this._startupGate = this._createStartupGate(config);\n    this._startupOverlay = this._createStartupOverlay(config);\n    this._applyStartupCanvasVisibility();\n    this.scheduler?.requestRender?.();\n    return this._startupGate;\n  }\n\n  _releaseNetworkLoadStartupGate(gate) {\n    if (!gate || this._startupGate !== gate) return;\n    const config = {\n      ...(gate.config ?? this._startupConfig ?? STARTUP_DEFAULTS),\n      blockRendering: false,\n    };\n    const previousVisibility = this._startupCanvasPreviousVisibility;\n    this._startupGate = this._createStartupGate(config);\n    this._startupGate.startedAt = performance.now();\n    this._startupCanvasPreviousVisibility = previousVisibility;\n    if (this._startupGate.active === true) {\n      if (!this._startupOverlay && this._startupGate.loadingOverlay !== false) {\n        this._startupOverlay = this._createStartupOverlay(config);\n      }\n      this._applyStartupCanvasVisibility();\n    } else {\n      this._startupOverlay?.remove?.();\n      this._startupOverlay = null;\n      const canvas = this.layers?.canvas ?? null;\n      if (canvas && this._startupGate.hideCanvasUntilFirstFrame !== false) {\n        canvas.style.visibility = previousVisibility ?? '';\n      }\n    }\n    this.scheduler?.requestGeometry?.();\n    this.scheduler?.requestRender?.();\n  }\n\n  _cancelNetworkLoadStartupGate(gate) {\n    if (!gate || this._startupGate !== gate) return;\n    gate.blockRendering = false;\n    this._finishStartupFirstVisibleFrame();\n  }\n\n  _recordStartupLayoutUpdate() {\n    const gate = this._startupGate ?? null;\n    if (!gate || gate.firstVisibleFrameDrawn === true) return;\n    gate.layoutIterations += 1;\n  }\n\n  _shouldSuppressStartupRender(now = performance.now()) {\n    const gate = this._startupGate ?? null;\n    if (!gate || gate.active !== true || gate.firstVisibleFrameDrawn === true) return false;\n    const timestamp = Number.isFinite(now) ? now : performance.now();\n    if (!Number.isFinite(gate.startedAt) || gate.startedAt <= 0) {\n      gate.startedAt = timestamp;\n    }\n    if (gate.blockRendering === true) {\n      return true;\n    }\n    const hasIterationTarget = gate.targetLayoutIterations > 0;\n    const hasTimeTarget = gate.targetLayoutDurationMs > 0;\n    if (!hasIterationTarget && !hasTimeTarget) {\n      return false;\n    }\n    if (!this._shouldRunStartupLayoutWarmup()) {\n      return false;\n    }\n    const iterationsReached = hasIterationTarget && gate.layoutIterations >= gate.targetLayoutIterations;\n    const timeReached = hasTimeTarget && (timestamp - gate.startedAt) >= gate.targetLayoutDurationMs;\n    return !(iterationsReached || timeReached);\n  }\n\n  _shouldRunStartupLayoutWarmup() {\n    const layout = this._layout ?? null;\n    if (!layout || layout instanceof StaticLayout) return false;\n    if (this.scheduler?.layoutEnabled === false) return false;\n    return true;\n  }\n\n  _isStartupLayoutWarmupActive() {\n    const gate = this._startupGate ?? null;\n    if (!gate || gate.active !== true || gate.firstVisibleFrameDrawn === true) return false;\n    const hasIterationTarget = gate.targetLayoutIterations > 0;\n    const hasTimeTarget = gate.targetLayoutDurationMs > 0;\n    if (!hasIterationTarget && !hasTimeTarget) return false;\n    return this._shouldRunStartupLayoutWarmup();\n  }\n\n  _finishStartupFirstVisibleFrame() {\n    const gate = this._startupGate ?? null;\n    if (!gate || gate.firstVisibleFrameDrawn === true) return;\n    gate.firstVisibleFrameDrawn = true;\n    gate.active = false;\n    gate.blockRendering = false;\n    const canvas = this.layers?.canvas ?? null;\n    if (canvas && gate.hideCanvasUntilFirstFrame !== false) {\n      canvas.style.visibility = this._startupCanvasPreviousVisibility ?? '';\n    }\n    this._startupOverlay?.remove?.();\n    this._startupOverlay = null;\n    this._queuePendingLargeNetworkStartupSettle();\n  }\n\n  _installAutoThemeStateTracking() {\n    const states = this.states ?? null;\n    if (!states || typeof states.addEventListener !== 'function') return null;\n    const handler = (event) => {\n      const detail = event?.detail ?? {};\n      const key = this.states?.resolveKey?.(detail.key ?? detail.path ?? '') ?? String(detail.key ?? detail.path ?? '');\n      const backgroundKey = this.states?.resolveKey?.('appearance.background') ?? 'appearance.background';\n      const themeKey = this.states?.resolveKey?.('ui.theme') ?? 'ui.theme';\n      if (key === backgroundKey && shouldDisableAutoThemeDefault(detail)) {\n        this._autoThemeDefaults.background = false;\n      }\n      if (key === themeKey && shouldDisableAutoThemeDefault(detail)) {\n        this._autoThemeDefaults.controls = false;\n      }\n    };\n    states.addEventListener('change', handler);\n    return () => states.removeEventListener?.('change', handler);\n  }\n\n  _resolveCurrentAutoTheme() {\n    return resolveInitialTheme(this.options ?? {}, this.layers?.root ?? this.layers?.container ?? this.options?.container ?? null);\n  }\n\n  _setupAutoThemeDefaults() {\n    const state = this._autoThemeDefaults ?? null;\n    if (!state || (!state.background && !state.controls)) return null;\n    this._applyAutoThemeDefaults(state.currentTheme ?? this._resolveCurrentAutoTheme(), { reason: 'auto-theme:init' });\n    if (state.cleanup) return state.cleanup;\n    if (typeof document === 'undefined' || typeof window === 'undefined') return null;\n\n    const scheduleUpdate = () => {\n      if (this._destroyed) return;\n      if (!state.background && !state.controls) return;\n      const nextTheme = this._resolveCurrentAutoTheme();\n      if (nextTheme === state.currentTheme) return;\n      this._applyAutoThemeDefaults(nextTheme);\n    };\n    const cleanups = [];\n    const observerTarget = document.documentElement ?? document.body ?? null;\n    if (typeof MutationObserver === 'function' && observerTarget) {\n      const observer = new MutationObserver((records) => {\n        if (!records.some((record) => ['data-helios-theme', 'data-theme', 'data-md-color-scheme', 'class'].includes(record.attributeName))) {\n          return;\n        }\n        scheduleUpdate();\n      });\n      observer.observe(observerTarget, {\n        subtree: true,\n        attributes: true,\n        attributeFilter: ['data-helios-theme', 'data-theme', 'data-md-color-scheme', 'class'],\n      });\n      cleanups.push(() => observer.disconnect());\n    }\n    const addMediaListener = (query) => {\n      if (!query) return;\n      if (typeof query.addEventListener === 'function') {\n        query.addEventListener('change', scheduleUpdate);\n        cleanups.push(() => query.removeEventListener?.('change', scheduleUpdate));\n      } else if (typeof query.addListener === 'function') {\n        query.addListener(scheduleUpdate);\n        cleanups.push(() => query.removeListener?.(scheduleUpdate));\n      }\n    };\n    try {\n      addMediaListener(window.matchMedia?.('(prefers-color-scheme: dark)'));\n      addMediaListener(window.matchMedia?.('(prefers-color-scheme: light)'));\n    } catch (_) {\n      // Ignore environments with partial matchMedia support.\n    }\n    state.cleanup = () => {\n      for (const cleanup of cleanups.splice(0)) cleanup?.();\n      state.cleanup = null;\n    };\n    return state.cleanup;\n  }\n\n  _applyAutoThemeDefaults(theme = 'dark', options = {}) {\n    const state = this._autoThemeDefaults ?? null;\n    if (!state) return this;\n    const nextTheme = theme === 'light' ? 'light' : 'dark';\n    state.currentTheme = nextTheme;\n    if (state.background) {\n      const background = copyDefaultClearColorForTheme(nextTheme);\n      const backgroundKey = this.states?.resolveKey?.('appearance.background') ?? 'appearance.background';\n      if (typeof this.states?.entry === 'function' && this.states.entry(backgroundKey)) {\n        this.states.setDefault?.(backgroundKey, background, {\n          source: 'default',\n          reason: options.reason ?? 'auto-theme',\n          applyBinding: true,\n        });\n      } else {\n        this._setRendererProp('clearColor', background, {\n          source: 'default',\n          reason: options.reason ?? 'auto-theme',\n          trackOverride: false,\n        });\n      }\n    }\n    if (state.controls) {\n      if (this._quickControlsConfig) this._quickControlsConfig.theme = nextTheme;\n      const uiStatus = this.states?.status?.('ui.theme') ?? null;\n      const uiHasOverride = uiStatus?.hasOverride === true;\n      const themeKey = this.states?.resolveKey?.('ui.theme') ?? 'ui.theme';\n      if (typeof this.states?.entry === 'function' && this.states.entry(themeKey)) {\n        this.states.setDefault?.(themeKey, nextTheme, {\n          source: 'default',\n          reason: options.reason ?? 'auto-theme',\n          applyBinding: false,\n        });\n      }\n      if (this.ui && !uiHasOverride) {\n        this.ui.setTheme?.(nextTheme, {\n          source: 'default',\n          reason: options.reason ?? 'auto-theme',\n          trackOverride: false,\n        });\n      }\n      if (!this.ui || !uiHasOverride) this._syncQuickControlsTheme(nextTheme);\n    }\n    return this;\n  }\n\n  _handleAutoThemeBindingChange(name, detail = {}) {\n    const state = this._autoThemeDefaults ?? null;\n    if (!state) return;\n    const key = name === 'background' || name === 'clearColor'\n      ? 'background'\n      : (name === 'theme' || name === 'ui.theme' ? 'controls' : null);\n    if (!key || !shouldDisableAutoThemeDefault(detail)) return;\n    state[key] = false;\n  }\n\n  _setupAutoCleanup() {\n    if (this.options?.autoCleanup === false) return;\n    if (typeof MutationObserver !== 'function') return;\n    const root = this.layers?.root ?? null;\n    const container = this.layers?.container ?? null;\n    if (!root || !container) return;\n\n    const isObservedRemoval = (node) => (\n      node === root\n      || node === container\n      || (typeof node?.contains === 'function' && (node.contains(root) || node.contains(container)))\n    );\n\n    const observer = new MutationObserver((records) => {\n      if (this._destroyed) {\n        observer.disconnect();\n        return;\n      }\n      for (const record of records) {\n        for (const node of record.removedNodes ?? []) {\n          if (!isObservedRemoval(node)) continue;\n          observer.disconnect();\n          this.destroy();\n          return;\n        }\n      }\n    });\n\n    observer.observe(container, { childList: true });\n    if (container.parentNode) {\n      observer.observe(container.parentNode, { childList: true });\n    }\n    this._autoCleanupObserver = observer;\n  }\n\n  _installUnsavedSessionBeforeUnloadWarning(options = {}) {\n    if (options.warnOnUnsavedSessionChanges === false || options.session?.warnOnUnsavedChanges === false) return;\n    if (typeof window === 'undefined' || typeof window.addEventListener !== 'function') return;\n    const handler = (event) => {\n      if (window.__HELIOS_DESKTOP_ALLOW_UNLOAD__ === true) return undefined;\n      const status = this.storage?.persistenceStatus?.() ?? null;\n      const networkData = status?.networkData ?? {};\n      const hasUnsavedChanges = networkData.dirty === true\n        || networkData.positionsDirty === true\n        || status?.sessionSync?.pending === true;\n      if (!hasUnsavedChanges) return undefined;\n      const message = 'This Helios session has unsaved changes. Use Sync or Save Session before closing.';\n      event.preventDefault?.();\n      event.returnValue = message;\n      return message;\n    };\n    window.addEventListener('beforeunload', handler);\n    this._beforeUnloadUnsavedChangesCleanup = () => {\n      window.removeEventListener('beforeunload', handler);\n    };\n  }\n\n  _resolveNetworkFileDropTarget() {\n    const configured = this._networkFileDropOptions?.target;\n    if (configured && typeof configured === 'object' && typeof configured.addEventListener === 'function') {\n      return configured;\n    }\n    if (typeof configured === 'string' && configured && configured !== 'root') {\n      const found = document.querySelector(configured);\n      if (found) return found;\n    }\n    return this.layers?.root ?? null;\n  }\n\n  _dragEventHasFiles(event) {\n    const types = Array.from(event?.dataTransfer?.types ?? []);\n    return types.includes('Files');\n  }\n\n  _ensureNetworkFileDropOverlay() {\n    if (this._networkFileDropOverlay) return this._networkFileDropOverlay;\n    const doc = this.layers?.root?.ownerDocument ?? document;\n    const overlay = doc.createElement('div');\n    overlay.className = 'helios-network-drop-overlay';\n    overlay.setAttribute('aria-hidden', 'true');\n    overlay.style.position = 'absolute';\n    overlay.style.inset = '8%';\n    overlay.style.zIndex = '1500';\n    overlay.style.display = 'none';\n    overlay.style.alignItems = 'center';\n    overlay.style.justifyContent = 'center';\n    overlay.style.flexDirection = 'column';\n    overlay.style.gap = '8px';\n    overlay.style.pointerEvents = 'none';\n    overlay.style.border = '2px dashed currentColor';\n    overlay.style.borderRadius = '14px';\n    overlay.style.background = 'rgba(0, 0, 0, 0.62)';\n    overlay.style.color = '#fff';\n    overlay.style.textAlign = 'center';\n    overlay.style.font = '600 14px/1.35 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif';\n    overlay.style.padding = '18px';\n\n    const title = doc.createElement('div');\n    title.className = 'helios-network-drop-overlay__title';\n    title.textContent = this._networkFileDropOptions?.overlayTitle ?? 'Drop a network file here';\n    const subtitle = doc.createElement('div');\n    subtitle.className = 'helios-network-drop-overlay__subtitle';\n    subtitle.textContent = this._networkFileDropOptions?.overlaySubtitle ?? 'Supported formats: .bxnet, .zxnet, .xnet, .gml, .gt, .gt.zst';\n    overlay.appendChild(title);\n    overlay.appendChild(subtitle);\n    this.layers?.root?.appendChild(overlay);\n    this._networkFileDropOverlay = overlay;\n    return overlay;\n  }\n\n  _setNetworkFileDropActive(active) {\n    const overlay = this._ensureNetworkFileDropOverlay();\n    overlay.style.display = active ? 'flex' : 'none';\n    this.layers?.root?.classList.toggle('helios-network-drop-active', active);\n  }\n\n  async _handleNetworkFileDrop(file) {\n    if (!file) return null;\n    const format = inferNetworkFormatFromName(file.name);\n    const supported = this._networkFileDropOptions?.supportedFormats ?? [];\n    if (!format || !supported.includes(format)) {\n      console.warn('Helios: dropped file ignored because its format is unsupported.', { name: file.name, format });\n      return null;\n    }\n    const replaceOptions = this._networkFileDropOptions?.replaceOptions ?? {};\n    const confirmNetworkLoad = replaceOptions.confirmNetworkLoad ?? this._confirmNetworkLoadFromUi;\n    if (typeof confirmNetworkLoad === 'function') {\n      const confirmed = await confirmNetworkLoad({\n        source: file,\n        sourceName: file.name,\n        format,\n        trigger: 'drop',\n      });\n      if (confirmed !== true) return null;\n    }\n    const existingUnsyncedConfirmation = replaceOptions.confirmUnsyncedSession;\n    const confirmUnsyncedSession = typeof existingUnsyncedConfirmation === 'function'\n      ? existingUnsyncedConfirmation\n      : (typeof this._confirmUnsyncedSessionFromUi === 'function'\n        ? (detail) => this._confirmUnsyncedSessionFromUi({\n            ...detail,\n            sourceName: file.name,\n            trigger: 'drop',\n          })\n        : undefined);\n    return this.loadNetwork(file, {\n      ...replaceOptions,\n      format,\n      showLoadingOverlay: replaceOptions.showLoadingOverlay !== false,\n      confirmUnsyncedSession,\n    });\n  }\n\n  _setupNetworkFileDrop() {\n    if (this._networkFileDropOptions?.enabled !== true) return;\n    const target = this._resolveNetworkFileDropTarget();\n    if (!target) return;\n\n    const prevent = (event) => {\n      if (!this._dragEventHasFiles(event)) return false;\n      event.preventDefault?.();\n      event.stopPropagation?.();\n      if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy';\n      return true;\n    };\n    const onDragEnter = (event) => {\n      if (!prevent(event)) return;\n      this._networkFileDropDepth += 1;\n      this._setNetworkFileDropActive(true);\n    };\n    const onDragOver = (event) => {\n      prevent(event);\n    };\n    const onDragLeave = (event) => {\n      if (!prevent(event)) return;\n      this._networkFileDropDepth = Math.max(0, this._networkFileDropDepth - 1);\n      if (this._networkFileDropDepth === 0) this._setNetworkFileDropActive(false);\n    };\n    const onDrop = (event) => {\n      if (!prevent(event)) return;\n      this._networkFileDropDepth = 0;\n      this._setNetworkFileDropActive(false);\n      const file = event.dataTransfer?.files?.[0] ?? null;\n      this._handleNetworkFileDrop(file).catch((error) => {\n        console.error('Helios: failed to load dropped network file.', error);\n      });\n    };\n\n    target.addEventListener('dragenter', onDragEnter);\n    target.addEventListener('dragover', onDragOver);\n    target.addEventListener('dragleave', onDragLeave);\n    target.addEventListener('drop', onDrop);\n    this._networkFileDropCleanup = () => {\n      target.removeEventListener('dragenter', onDragEnter);\n      target.removeEventListener('dragover', onDragOver);\n      target.removeEventListener('dragleave', onDragLeave);\n      target.removeEventListener('drop', onDrop);\n      this._networkFileDropOverlay?.remove?.();\n      this._networkFileDropOverlay = null;\n      this._networkFileDropDepth = 0;\n    };\n  }\n\n  _disconnectAutoCleanup() {\n    this._autoCleanupObserver?.disconnect?.();\n    this._autoCleanupObserver = null;\n  }\n\n  _resolveBehavior(name) {\n    const id = String(name ?? '').trim();\n    if (!id) return null;\n    const existing = this.behaviors?.get?.(id) ?? null;\n    if (existing) return existing;\n    if (this.behaviors?.registry?.has?.(id)) {\n      return this.useBehavior(id);\n    }\n    return null;\n  }\n\n  /**\n   * Check whether a behavior is active or registered.\n   *\n   * @public\n   * @apiSection Behaviors\n   * @param {string} name - Behavior id.\n   * @returns {boolean} True when the behavior is active or available in the registry.\n   */\n  hasBehavior(name) {\n    const id = String(name ?? '').trim();\n    if (!id) return false;\n    return this.behaviors?.has?.(id) === true || this.behaviors?.registry?.has?.(id) === true;\n  }\n\n  /**\n   * Return an active behavior, lazily creating registered built-ins when needed.\n   *\n   * @public\n   * @apiSection Behaviors\n   * @param {string} name - Behavior id.\n   * @returns {Behavior|null} Active behavior instance, or `null` when unavailable.\n   */\n  getBehavior(name) {\n    return this._resolveBehavior(name);\n  }\n\n  _initializeBehaviorNamespace() {\n    this.behavior = createBehaviorNamespace(this);\n    return this.behavior;\n  }\n\n  /**\n   * Register a behavior constructor or factory for later activation.\n   *\n   * @public\n   * @apiSection Behaviors\n   * @param {string} name - Behavior id.\n   * @param {Function} behaviorCtor - Constructor or factory that creates a behavior.\n   * @returns {Helios} This Helios instance.\n   */\n  registerBehavior(name, behaviorCtor) {\n    this.behaviors?.registry?.register?.(name, behaviorCtor);\n    return this;\n  }\n\n  /**\n   * Activate a behavior, update an existing behavior, or return the active one.\n   *\n   * @public\n   * @apiSection Behaviors\n   * @param {string} name - Behavior id.\n   * @param {Behavior|object|boolean} [behaviorOrOptions] - Behavior instance,\n   * behavior options, or `true` to activate with defaults.\n   * @returns {Behavior} Active behavior instance.\n   * @example\n   * const selection = helios.useBehavior('selection', { multiple: true });\n   */\n  useBehavior(name, behaviorOrOptions) {\n    const id = String(name ?? '').trim();\n    if (!id) throw new Error('useBehavior(name, behaviorOrOptions) requires a non-empty behavior name');\n\n    if (isBehaviorLike(behaviorOrOptions)) {\n      behaviorOrOptions.id = id;\n      return this.behaviors.use(behaviorOrOptions);\n    }\n\n    const existing = this.behaviors?.get?.(id) ?? null;\n    if (existing && behaviorOrOptions && typeof behaviorOrOptions === 'object') {\n      existing.update?.(behaviorOrOptions);\n      return existing;\n    }\n    if (existing && (behaviorOrOptions === undefined || behaviorOrOptions === true)) {\n      return existing;\n    }\n    if (!this.behaviors?.registry?.has?.(id)) {\n      throw new Error(`Unknown behavior \"${id}\"`);\n    }\n    if (behaviorOrOptions === undefined || behaviorOrOptions === true) {\n      return this.behaviors.use(id);\n    }\n    return this.behaviors.use(id, behaviorOrOptions);\n  }\n\n  _initializeBehaviors(config) {\n    if (!config || config === false) return;\n    if (Array.isArray(config)) {\n      for (const entry of config) {\n        if (typeof entry === 'string') this.useBehavior(entry);\n        else if (isBehaviorLike(entry)) this.useBehavior(entry.id ?? entry.constructor?.id, entry);\n      }\n      return;\n    }\n    if (typeof config === 'string') {\n      this.useBehavior(config);\n      return;\n    }\n    if (typeof config !== 'object') return;\n\n    const reservedKeys = new Set(['use', 'options']);\n    for (const [name, value] of Object.entries(config)) {\n      if (reservedKeys.has(name) || value === false) continue;\n      if (value === true || isBehaviorLike(value)) {\n        this.useBehavior(name, value === true ? undefined : value);\n        continue;\n      }\n      this.useBehavior(name, value);\n    }\n\n    const useEntries = [];\n    if (Array.isArray(config.use)) useEntries.push(...config.use);\n    else if (config.use) useEntries.push(config.use);\n    if (!useEntries.length && config.selection === true) {\n      useEntries.push('selection');\n    }\n    for (const entry of useEntries) {\n      if (typeof entry === 'string') {\n        const behaviorOptions = config.options?.[entry];\n        this.useBehavior(entry, behaviorOptions);\n      } else if (isBehaviorLike(entry)) {\n        this.useBehavior(entry.id ?? entry.constructor?.id, entry);\n      }\n    }\n  }\n\n  _initializeDefaultBehaviors(config) {\n    if (config === false) return;\n    const disabled = new Set();\n    const optionOverrides = {};\n    if (config && typeof config === 'object' && !Array.isArray(config) && !isBehaviorLike(config)) {\n      for (const [name, value] of Object.entries(config)) {\n        if (value === false) disabled.add(name);\n        else if (value && typeof value === 'object' && !isBehaviorLike(value)) {\n          optionOverrides[name] = value;\n        }\n      }\n      if (config.options && typeof config.options === 'object') {\n        Object.assign(optionOverrides, config.options);\n      }\n    }\n    if (this.options?.labels && !optionOverrides.labels) optionOverrides.labels = this.options.labels;\n    if (this.options?.legends && !optionOverrides.legends) optionOverrides.legends = this.options.legends;\n\n    for (const id of BEHAVIOR_IDS) {\n      if (disabled.has(id)) continue;\n      this.useBehavior(id, optionOverrides[id]);\n    }\n  }\n\n  _reapplyBehaviorRendererBindings() {\n    const behaviors = this.behaviors?.values?.() ?? [];\n    for (const behavior of behaviors) {\n      behavior.ensureStateStyleDefaults?.();\n      behavior.applyHoverStylePolicy?.();\n      behavior.applyHoverLabelConfig?.();\n      behavior.applyHoverConnectedEdges?.();\n      behavior.applyHighlightConnectedEdges?.();\n      behavior.applySelectedConnectedEdges?.();\n      behavior.syncPicking?.();\n    }\n    for (const behavior of behaviors) {\n      behavior.applyOtherElementsState?.();\n    }\n    return this;\n  }\n\n  _registerCoreStateEntries() {\n    const states = this.states ?? null;\n    if (typeof states?.register !== 'function') return;\n    states.register(this, 'scene', {\n      dimension: {\n        description: 'Scene dimensionality.',\n        default: this._initialMode === '3d' ? '3d' : '2d',\n        type: 'enum',\n        scope: 'network',\n        ui: {\n          label: 'Dimension',\n          controller: 'segmented',\n          options: ['2d', '3d'],\n        },\n        getter: () => this.mode(),\n        setter: (value, detail = {}) => this.setMode(value === '3d' ? '3d' : '2d', {\n          animate: false,\n          syncDelegate: false,\n          source: detail.source ?? 'state',\n          applyState: false,\n        }),\n        subscribe: (notify) => this.on(EVENTS.MODE_CHANGED, (event) => {\n          const detail = event?.detail ?? event ?? {};\n          notify(detail.mode === '3d' ? '3d' : '2d', {\n            source: 'binding',\n            reason: 'mode-changed',\n            trackOverride: false,\n          });\n        }),\n      },\n    });\n    const cameraControlEntries = {};\n    const initialControls = this._snapshotCameraControlState();\n    const cameraControlSubscribe = (notify) => this.on(EVENTS.CAMERA_CONTROL_CHANGE, () => {\n      notify(undefined, {\n        source: 'binding',\n        reason: 'camera-control-change',\n        trackOverride: false,\n      });\n    });\n    for (const key of CAMERA_CONTROL_STATE_KEYS) {\n      const value = initialControls?.[key];\n      const isArrayValue = Array.isArray(value) || ArrayBuffer.isView(value);\n      const type = typeof value === 'boolean'\n        ? 'boolean'\n        : (typeof value === 'number' ? 'number' : (isArrayValue ? 'array' : 'object'));\n      cameraControlEntries[key] = {\n        description: `Camera control value: ${key}.`,\n        default: cloneSerializable(value),\n        type,\n        scope: 'session',\n        aliases: [`cameraControls.${key}`],\n        ui: {\n          label: key.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/^./, (letter) => letter.toUpperCase()),\n          controller: type === 'boolean' ? 'toggle' : (type === 'number' ? 'number' : 'custom'),\n        },\n        getter: () => cloneSerializable(this._snapshotCameraControlState()?.[key]),\n        setter: (nextValue, detail = {}) => {\n          this.cameraControls({ [key]: nextValue }, {\n            source: detail.source ?? 'state',\n            reason: detail.reason ?? 'state-restore',\n            applyState: false,\n          });\n        },\n        subscribe: cameraControlSubscribe,\n      };\n    }\n    states.register(this, 'camera.controls', cameraControlEntries);\n    states.register(this, 'camera', {\n      pose: {\n        description: 'Current camera pose.',\n        default: this._snapshotCameraState({ includeViewport: false }),\n        type: 'object',\n        scope: 'session',\n        ui: {\n          label: 'Camera Pose',\n          controller: 'custom',\n          debounceMs: 240,\n        },\n        getter: () => this._snapshotCameraState({ includeViewport: false }),\n        equals: cameraPoseValuesEqual,\n        setter: (pose, detail = {}) => this._restoreCameraState(pose, {\n          source: detail.source ?? 'state',\n          restoreViewport: detail.restoreViewport === true,\n        }),\n        subscribe: (notify) => {\n          let timer = null;\n          let pendingPose = null;\n          let pendingDetail = null;\n          const flush = () => {\n            timer = null;\n            if (!pendingPose) return;\n            const pose = pendingPose;\n            const detail = pendingDetail ?? {};\n            pendingPose = null;\n            pendingDetail = null;\n            notify(pose, {\n              source: isExplicitCameraStateSource(detail.origin, detail) ? (detail.origin ?? 'interaction') : 'binding',\n              reason: 'camera-pose',\n              stateKey: 'camera.pose',\n              storageKey: 'camera.pose',\n              trackOverride: isExplicitCameraStateSource(detail.origin, detail),\n              debounceMs: 500,\n            });\n          };\n          const unsubscribe = this.on(EVENTS.CAMERA_MOVE, (event) => {\n            const detail = event?.detail ?? event ?? {};\n            const pose = this._snapshotCameraState({ includeViewport: false });\n            if (!pose) return;\n            pendingPose = pose;\n            pendingDetail = detail;\n            if (timer != null) clearTimeout(timer);\n            timer = setTimeout(flush, 120);\n          });\n          return () => {\n            if (timer != null) clearTimeout(timer);\n            unsubscribe?.();\n          };\n        },\n      },\n    });\n    states.register(this, 'layout.runtime', {\n      state: {\n        description: 'Lightweight layout runtime metadata. Position buffers are not stored in state.',\n        default: this.snapshotLayoutRuntimeState({ includePositions: false }),\n        type: 'object',\n        scope: 'session',\n        persist: true,\n        getter: () => this.snapshotLayoutRuntimeState({ includePositions: false }),\n        setter: (value) => this.restoreLayoutRuntimeState(value, {\n          restoreRunState: true,\n          reason: 'state-restore',\n        }),\n        subscribe: (notify) => {\n          const handler = (event) => notify(undefined, {\n            ...(event?.detail ?? {}),\n            source: 'binding',\n            reason: 'layout-runtime-change',\n            trackOverride: false,\n          });\n          const cleanups = [\n            this.on(EVENTS.LAYOUT_CHANGED, handler),\n            this.on(EVENTS.MODE_CHANGED, handler),\n          ];\n          return () => cleanups.forEach((cleanup) => cleanup?.());\n        },\n      },\n    });\n  }\n\n  _snapshotCameraState(options = {}) {\n    const camera = this.renderer?.camera ?? null;\n    const pose = captureCameraPose(camera);\n    if (pose && options.includeViewport !== true) delete pose.viewport;\n    return pose;\n  }\n\n  _restoreCameraState(state, options = {}) {\n    const camera = this.renderer?.camera ?? null;\n    const pose = state && options.restoreViewport !== true ? { ...state } : state;\n    if (pose && options.restoreViewport !== true) delete pose.viewport;\n    this._cameraTransitionController?.stop?.();\n    this._stopCameraControlPoseInterpolation();\n    applyCameraPose(camera, pose);\n    this.scheduler?.requestRender?.();\n  }\n\n  _snapshotCameraControlState() {\n    return copyCameraControlConfig(this._cameraControlConfig ?? CAMERA_CONTROL_DEFAULTS);\n  }\n\n  _restoreCameraControlState(state) {\n    if (!state || typeof state !== 'object') return;\n    if (!this._cameraControlRuntime) {\n      this._cameraControlConfig = normalizeCameraControlConfig(this._cameraControlConfig ?? CAMERA_CONTROL_DEFAULTS, state);\n      return;\n    }\n    this.cameraControls?.(state);\n  }\n\n\n  _ensureCameraTransitionController() {\n    if (!this._cameraTransitionController) {\n      this._cameraTransitionController = new CameraTransitionController({\n        requestRender: () => this.scheduler?.requestRender?.(),\n      });\n    }\n    return this._cameraTransitionController;\n  }\n\n  _cameraControlsSnapshot() {\n    const config = copyCameraControlConfig(this._cameraControlConfig ?? CAMERA_CONTROL_DEFAULTS);\n    const activeTargetNodeIndices = this._resolveActiveCameraTargetNodeIndices();\n    return {\n      ...config,\n      activeTargetNodeIndices,\n      effectiveAutoFitIntervalMs: this._resolveCameraAutoFitIntervalMs(activeTargetNodeIndices?.length ?? null),\n    };\n  }\n\n  _emitCameraControlChange() {\n    this.emit(EVENTS.CAMERA_CONTROL_CHANGE, this._cameraControlsSnapshot());\n  }\n\n  _resolveActiveCameraTargetNodeIndices() {\n    const targetNodeIndices = normalizeNodeIndexList(this._cameraControlConfig?.targetNodeIndices);\n    return targetNodeIndices?.length ? targetNodeIndices : null;\n  }\n\n  _markAutoFitDirty(requestRender = false) {\n    if (!this._cameraControlRuntime) return;\n    this._cameraControlRuntime.autoFitDirty = true;\n    this._cameraControlRuntime.lastAutoFitAt = Number.NEGATIVE_INFINITY;\n    this._invalidateCameraBoundsSnapshot();\n    const network = this._getRenderNetwork?.() ?? null;\n    if (this._renderNetworkBufferAccessActive(network)) {\n      const config = this._cameraControlConfig ?? CAMERA_CONTROL_DEFAULTS;\n      const request = config.followTarget === true\n        ? this._buildCameraFollowBoundsRequest(this._resolveActiveCameraTargetNodeIndices(), config)\n        : this._buildCameraAutoFitBoundsRequest(this._resolveActiveCameraTargetNodeIndices(), config);\n      if (request) this._scheduleCameraBoundsPreparation(request, { force: true, reason: 'dirty' });\n    } else {\n      this._prepareCameraControlBoundsSnapshot({ force: true, reason: 'dirty' });\n    }\n    if (requestRender !== false) {\n      this.scheduler?.requestRender?.();\n    }\n  }\n\n  _invalidateCameraBoundsSnapshot() {\n    const runtime = this._cameraControlRuntime ?? null;\n    if (!runtime) return;\n    runtime.cameraBoundsSnapshot = null;\n    runtime.cameraBoundsSignature = '';\n    runtime.cameraBoundsKind = '';\n    runtime.cameraBoundsDirty = true;\n  }\n\n  _handleResizeAutoFit() {\n    const config = this._cameraControlConfig ?? null;\n    if (config?.autoFit !== true) return;\n    const cameraMode = this.renderer?.camera?.mode ?? null;\n    if (cameraMode === '3d') return;\n    this._markAutoFitDirty(false);\n  }\n\n  _resetCameraDelegateSnapshot() {\n    const runtime = this._cameraControlRuntime ?? null;\n    if (!runtime) return;\n    runtime.delegateSnapshot = null;\n    runtime.delegateSnapshotAt = Number.NEGATIVE_INFINITY;\n    runtime.delegateSnapshotPending = false;\n    runtime.delegateSnapshotDelegate = null;\n    runtime.delegateSnapshotRequestId = (runtime.delegateSnapshotRequestId ?? 0) + 1;\n    runtime.delegateTargetBounds = null;\n    runtime.delegateTargetBoundsAt = Number.NEGATIVE_INFINITY;\n    runtime.delegateTargetBoundsPending = false;\n    runtime.delegateTargetBoundsDelegate = null;\n    runtime.delegateTargetBoundsSignature = '';\n    runtime.delegateTargetBoundsRequestId = (runtime.delegateTargetBoundsRequestId ?? 0) + 1;\n  }\n\n  _markRestoredPositionsForCamera() {\n    const runtime = this._cameraControlRuntime ?? null;\n    if (!runtime) return;\n    this._resetCameraDelegateSnapshot();\n    const config = this._cameraControlConfig ?? CAMERA_CONTROL_DEFAULTS;\n    if (config.autoFit === true || config.followTarget === true) {\n      this._markAutoFitDirty(false);\n    } else {\n      this._invalidateCameraBoundsSnapshot();\n    }\n  }\n\n  _invalidateCameraOrbitReference() {\n    const runtime = this._cameraControlRuntime ?? null;\n    if (!runtime) return;\n    runtime.orbitBaseRotation = null;\n  }\n\n  _composeOrbitRotation(baseRotation, options = {}) {\n    const source = ArrayBuffer.isView(baseRotation) && baseRotation.length >= 4\n      ? baseRotation\n      : DEFAULT_MODE_SWITCH_3D_ROTATION;\n    let nextRotation = new Float32Array(source);\n    const yawRadians = Number.isFinite(options.yawRadians) ? Number(options.yawRadians) : 0;\n    const pitchRadians = Number.isFinite(options.pitchRadians) ? Number(options.pitchRadians) : 0;\n    const orbitAxis = normalizeDirectionInput(options.axis, CAMERA_CONTROL_DEFAULTS.orbitAxis);\n\n    if (Math.abs(yawRadians) > 1e-12) {\n      const yaw = quatFromAxisAngle(orbitAxis, yawRadians);\n      const rotated = new Float32Array(4);\n      quatMultiplyInto(rotated, yaw, nextRotation);\n      nextRotation = rotated;\n    }\n    if (Math.abs(pitchRadians) > 1e-12) {\n      const pitch = quatFromAxisAngle([1, 0, 0], pitchRadians);\n      const rotated = new Float32Array(4);\n      quatMultiplyInto(rotated, nextRotation, pitch);\n      nextRotation = rotated;\n    }\n    quatNormalizeInto(nextRotation, nextRotation);\n    return nextRotation;\n  }\n\n  _resolveCameraPositionView(options = {}) {\n    const runtime = this._cameraControlRuntime ?? null;\n    const positionSource = this._positionsConfig ?? { source: 'network', delegate: null };\n    if (positionSource.source !== 'delegate') {\n      return { source: 'network', view: null };\n    }\n\n    const delegate = positionSource.delegate ?? this._activePositionDelegate ?? null;\n    if (!delegate) return { source: 'delegate', view: null };\n\n    const context = this._buildPositionDelegateContext(options);\n    let view = null;\n    try {\n      if (typeof delegate.getNodePositionView === 'function') {\n        view = delegate.getNodePositionView(context);\n      } else if (typeof delegate.getPositionView === 'function') {\n        view = delegate.getPositionView(context);\n      }\n    } catch (error) {\n      warnOnce(\n        this,\n        'delegate-position-view',\n        'Helios: failed to read delegate position view; falling back to network positions.',\n        { error, delegate },\n      );\n      view = null;\n    }\n    if (view && Number.isFinite(view.length) && view.length > 0) {\n      return { source: 'delegate-view', view };\n    }\n\n    if (options.skipDelegateSnapshot === true) {\n      return { source: 'delegate', view: null };\n    }\n    this._scheduleCameraDelegateSnapshot(delegate, options);\n    if (runtime?.delegateSnapshotDelegate === delegate && runtime.delegateSnapshot && runtime.delegateSnapshot.length > 0) {\n      return { source: 'delegate-snapshot', view: runtime.delegateSnapshot };\n    }\n    return { source: 'delegate', view: null };\n  }\n\n  _scheduleCameraDelegateSnapshot(delegate, options = {}) {\n    const runtime = this._cameraControlRuntime ?? null;\n    if (!runtime || !delegate || typeof this.snapshotDelegatePositions !== 'function') return;\n    if (runtime.delegateSnapshotPending && runtime.delegateSnapshotDelegate === delegate) return;\n\n    const now = performance.now();\n    const nodeCount = this._resolveActiveCameraTargetNodeIndices()?.length ?? this._getRenderNetwork()?.nodeCount ?? 0;\n    const minIntervalMs = clamp(this._resolveCameraAutoFitIntervalMs(nodeCount) * 0.5, 120, 2000);\n    if (\n      runtime.delegateSnapshotDelegate === delegate\n      && Number.isFinite(runtime.delegateSnapshotAt)\n      && (now - runtime.delegateSnapshotAt) < minIntervalMs\n    ) {\n      return;\n    }\n\n    runtime.delegateSnapshotPending = true;\n    runtime.delegateSnapshotDelegate = delegate;\n    const requestId = (runtime.delegateSnapshotRequestId ?? 0) + 1;\n    runtime.delegateSnapshotRequestId = requestId;\n\n    Promise.resolve()\n      .then(() => this.snapshotDelegatePositions({ ...options, delegate }))\n      .then((snapshot) => {\n        if (runtime.delegateSnapshotRequestId !== requestId || runtime.delegateSnapshotDelegate !== delegate) return;\n        if (snapshot && Number.isFinite(snapshot.length) && snapshot.length > 0) {\n          runtime.delegateSnapshot = snapshot;\n          runtime.delegateSnapshotAt = performance.now();\n          this._markAutoFitDirty(false);\n          this.scheduler?.requestRender?.();\n          this._tryPendingFrameNetwork?.();\n        }\n      })\n      .catch((error) => {\n        warnOnce(\n          this,\n          'camera-delegate-snapshot',\n          'Helios: failed to snapshot delegate positions for camera controls.',\n          { error, delegate },\n        );\n      })\n      .finally(() => {\n        if (runtime.delegateSnapshotRequestId === requestId && runtime.delegateSnapshotDelegate === delegate) {\n          runtime.delegateSnapshotPending = false;\n        }\n      });\n  }\n\n  _shouldDeferDelegateReadbacks(options = {}) {\n    if (options.exactReadback === true || options.applyFocusOnResolve === true || options.deferReadback === false) return false;\n    if (options.deferReadback === true) return true;\n    const now = performance.now();\n    const gesture = this._picking?.gesture ?? null;\n    if (gesture?.active === true || this._picking?.suppressHover === true) return true;\n    if (Number.isFinite(gesture?.lastCameraMoveAt) && now - gesture.lastCameraMoveAt < 250) return true;\n    if (Number.isFinite(gesture?.lastWheelAt) && now - gesture.lastWheelAt < 250) return true;\n    const edgeAdaptiveRuntime = this._edgeAdaptiveRuntime ?? null;\n    if (Number.isFinite(edgeAdaptiveRuntime?.cameraMovingUntil) && now < edgeAdaptiveRuntime.cameraMovingUntil) return true;\n    return this._cameraControlRuntime?.controlPoseActive === true;\n  }\n\n  _cameraNodeIndexSignature(nodeIndices) {\n    if (!nodeIndices?.length) return '';\n    return Array.from(nodeIndices, (id) => Math.max(0, Math.floor(Number(id) || 0))).join(',');\n  }\n\n  _boundsFromCentroid(centroid, sourceCount = 0, options = {}) {\n    if (!Number.isFinite(sourceCount) || sourceCount <= 0) {\n      return null;\n    }\n    if (!centroid || !Number.isFinite(centroid[0]) || !Number.isFinite(centroid[1]) || !Number.isFinite(centroid[2])) {\n      return null;\n    }\n    const paddingRatio = normalizeNonNegativeNumber(options.paddingRatio, 0, 0, 1);\n    const viewportWidth = Math.max(1, Number(this.renderer?.camera?.viewport?.width ?? this.size?.width ?? 1));\n    const viewportHeight = Math.max(1, Number(this.renderer?.camera?.viewport?.height ?? this.size?.height ?? 1));\n    const ratioPaddingPx = Math.min(viewportWidth, viewportHeight) * paddingRatio;\n    const paddingPx = Number.isFinite(options.paddingPx)\n      ? Math.max(0, Number(options.paddingPx))\n      : Math.max(24, ratioPaddingPx);\n    const x = centroid[0];\n    const y = centroid[1];\n    const z = centroid[2];\n    return {\n      paddingPx,\n      coverage: 1,\n      sourceCount,\n      sampledCount: sourceCount,\n      minX: x,\n      minY: y,\n      minZ: z,\n      maxX: x,\n      maxY: y,\n      maxZ: z,\n      fitMinX: x,\n      fitMinY: y,\n      fitMinZ: z,\n      fitMaxX: x,\n      fitMaxY: y,\n      fitMaxZ: z,\n      sumX: x * sourceCount,\n      sumY: y * sourceCount,\n      sumZ: z * sourceCount,\n      count: sourceCount,\n      bboxCenter: [x, y, z],\n      centroid: [x, y, z],\n    };\n  }\n\n  _scheduleCameraDelegateTargetBounds(delegate, nodeIndices, options = {}) {\n    const runtime = this._cameraControlRuntime ?? null;\n    if (!runtime || !delegate || !nodeIndices?.length || typeof this.snapshotNodeCentroid !== 'function') return;\n    const signature = this._cameraNodeIndexSignature(nodeIndices);\n    if (!signature) return;\n    const exactReadback = options.exactReadback === true;\n    if (\n      runtime.delegateTargetBoundsPending\n      && runtime.delegateTargetBoundsDelegate === delegate\n      && runtime.delegateTargetBoundsSignature === signature\n      && exactReadback !== true\n    ) {\n      return;\n    }\n\n    const now = performance.now();\n    const minIntervalMs = clamp(\n      normalizeNonNegativeNumber(\n        this._cameraControlConfig?.followUpdateIntervalMs,\n        CAMERA_CONTROL_DEFAULTS.followUpdateIntervalMs,\n        0,\n        60000,\n      ) * 0.5,\n      60,\n      1000,\n    );\n    if (\n      runtime.delegateTargetBoundsDelegate === delegate\n      && runtime.delegateTargetBoundsSignature === signature\n      && Number.isFinite(runtime.delegateTargetBoundsAt)\n      && (now - runtime.delegateTargetBoundsAt) < minIntervalMs\n      && exactReadback !== true\n    ) {\n      return;\n    }\n\n    runtime.delegateTargetBoundsPending = true;\n    runtime.delegateTargetBoundsDelegate = delegate;\n    runtime.delegateTargetBoundsSignature = signature;\n    const requestId = (runtime.delegateTargetBoundsRequestId ?? 0) + 1;\n    runtime.delegateTargetBoundsRequestId = requestId;\n\n    Promise.resolve()\n      .then(() => this.snapshotNodeCentroid(nodeIndices, {\n        ...options,\n        delegate,\n        preferCached: options.preferCached ?? !exactReadback,\n        allowStaleVersion: options.allowStaleVersion ?? !exactReadback,\n        deferReadback: options.deferReadback ?? (exactReadback ? false : this._shouldDeferDelegateReadbacks(options)),\n      }))\n      .then((result) => {\n        if (\n          runtime.delegateTargetBoundsRequestId !== requestId\n          || runtime.delegateTargetBoundsDelegate !== delegate\n          || runtime.delegateTargetBoundsSignature !== signature\n        ) {\n          return;\n        }\n        const bounds = this._boundsFromCentroid(result?.centroid, result?.count ?? nodeIndices.length, options);\n        if (!bounds) return;\n        runtime.delegateTargetBounds = bounds;\n        runtime.delegateTargetBoundsAt = performance.now();\n        if (options.applyFocusOnResolve === true) {\n          const nextPose = this._resolveCameraFocusPose(bounds, {\n            focusMode: 'centroid',\n            zoomScale: Number.isFinite(options.zoomScale)\n              ? Number(options.zoomScale)\n              : Number.isFinite(options.zoomFactor)\n                ? Number(options.zoomFactor)\n                : 1,\n            maxFocusZoom: options.maxFocusZoom,\n            minFocusDistance: options.minFocusDistance,\n            focusZoomTolerance: options.focusZoomTolerance,\n          });\n          const animate = options.animate ?? this._cameraControlConfig?.animation === true;\n          const durationMs = options.durationMs ?? this._cameraControlConfig?.animationDurationMs;\n          if (this._cameraControlConfig?.followTarget === true) {\n            this._queueCameraControlPose(nextPose, { animate, durationMs });\n          } else {\n            this._applyCameraPoseWithOptionalAnimation(nextPose, { animate, durationMs });\n          }\n        }\n        this._markAutoFitDirty(false);\n        this.scheduler?.requestRender?.();\n      })\n      .catch((error) => {\n        warnOnce(\n          this,\n          'camera-delegate-target-bounds',\n          'Helios: failed to resolve delegate target bounds for camera controls.',\n          { error, delegate, signature },\n        );\n      })\n      .finally(() => {\n        if (\n          runtime.delegateTargetBoundsRequestId === requestId\n          && runtime.delegateTargetBoundsDelegate === delegate\n          && runtime.delegateTargetBoundsSignature === signature\n        ) {\n          runtime.delegateTargetBoundsPending = false;\n        }\n      });\n  }\n\n  _prepareRenderBoundsNodeAttributeAccess(network) {\n    const readable = new Map();\n    if (this._renderNetworkBufferAccessActive(network)) {\n      for (const name of [NODE_SIZE_ATTRIBUTE, NODE_OUTLINE_WIDTH_ATTRIBUTE]) readable.set(name, false);\n      return readable;\n    }\n    for (const name of [NODE_SIZE_ATTRIBUTE, NODE_OUTLINE_WIDTH_ATTRIBUTE]) {\n      if (!network || typeof name !== 'string' || !name) {\n        readable.set(name, false);\n        continue;\n      }\n      if (network._nodeAttributes?.has?.(name)) {\n        if (typeof network.getNodeAttributeInfo === 'function') {\n          try {\n            readable.set(name, Boolean(network.getNodeAttributeInfo(name)));\n          } catch {\n            readable.set(name, false);\n          }\n        } else {\n          readable.set(name, true);\n        }\n        continue;\n      }\n      if (typeof network.getNodeAttributeInfo === 'function') {\n        try {\n          readable.set(name, Boolean(network.getNodeAttributeInfo(name)));\n        } catch {\n          readable.set(name, false);\n        }\n        continue;\n      }\n      if (typeof network.hasNodeAttribute === 'function') {\n        try {\n          readable.set(name, Boolean(network.hasNodeAttribute(name)));\n        } catch {\n          readable.set(name, false);\n        }\n        continue;\n      }\n      readable.set(name, true);\n    }\n    return readable;\n  }\n\n  _renderNetworkBufferAccessActive(network = this._getRenderNetwork?.() ?? null) {\n    return Math.max(0, Number(network?._bufferSessionDepth ?? 0) || 0) > 0;\n  }\n\n  _sampleRenderBoundsFromPositions(positions, nodeIndices, options = {}) {\n    if (!positions || !Number.isFinite(positions.length) || positions.length <= 0) return null;\n    const coverage = clamp(Number.isFinite(options.coverage) ? Number(options.coverage) : 1, 0.5, 1);\n    const paddingRatio = normalizeNonNegativeNumber(options.paddingRatio, 0, 0, 1);\n    const viewportWidth = Math.max(1, Number(this.renderer?.camera?.viewport?.width ?? this.size?.width ?? 1));\n    const viewportHeight = Math.max(1, Number(this.renderer?.camera?.viewport?.height ?? this.size?.height ?? 1));\n    const ratioPaddingPx = Math.min(viewportWidth, viewportHeight) * paddingRatio;\n    const paddingPx = Number.isFinite(options.paddingPx)\n      ? Math.max(0, Number(options.paddingPx))\n      : Math.max(24, ratioPaddingPx);\n    const maxSamples = normalizePositiveInteger(options.maxSamples, CAMERA_FIT_DEFAULT_MAX_SAMPLES, 32, 1000000);\n    const stride = 3;\n    const step = Math.max(1, Math.ceil(nodeIndices.length / Math.max(1, maxSamples)));\n    const sampledPointCapacity = Math.ceil(nodeIndices.length / step);\n    const sampledPoints = new Float32Array(Math.max(1, sampledPointCapacity) * 3);\n\n    let minX = Infinity; let minY = Infinity; let minZ = Infinity;\n    let maxX = -Infinity; let maxY = -Infinity; let maxZ = -Infinity;\n    let sumX = 0; let sumY = 0; let sumZ = 0;\n    let count = 0;\n    let nodeRadiusWorld = 0;\n    let found = false;\n    const sampleX = coverage < 0.999999 ? new Float32Array(Math.max(1, sampledPointCapacity)) : null;\n    const sampleY = coverage < 0.999999 ? new Float32Array(Math.max(1, sampledPointCapacity)) : null;\n    const sampleZ = coverage < 0.999999 ? new Float32Array(Math.max(1, sampledPointCapacity)) : null;\n    const graphLayer = this.renderer?.graphLayer ?? null;\n    const network = this._getRenderNetwork?.() ?? null;\n    const nodeAttributeAccess = options.nodeAttributeAccess instanceof Map ? options.nodeAttributeAccess : null;\n    const readNodeAttributeView = (name) => {\n      if (nodeAttributeAccess?.get(name) === false) return null;\n      return network?.getNodeAttributeBuffer?.(name)?.view ?? null;\n    };\n    const nodeSizeBase = Math.max(0, Number(graphLayer?.nodeSizeBase ?? 0) || 0);\n    const nodeSizeScale = Math.max(0, Number(graphLayer?.nodeSizeScale ?? 1) || 0);\n    const nodeOutlineBase = Math.max(0, Number(graphLayer?.nodeOutlineWidthBase ?? 0) || 0);\n    const nodeOutlineScale = Math.max(0, Number(graphLayer?.nodeOutlineWidthScale ?? 0) || 0);\n    const sizeView = readNodeAttributeView(NODE_SIZE_ATTRIBUTE);\n    const outlineView = readNodeAttributeView(NODE_OUTLINE_WIDTH_ATTRIBUTE);\n\n    for (let i = 0; i < nodeIndices.length; i += step) {\n      const id = nodeIndices[i];\n      const o = id * stride;\n      if ((o + 2) >= positions.length) continue;\n      const x = positions[o];\n      const y = positions[o + 1];\n      const z = positions[o + 2];\n      if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) continue;\n      const rawSize = Number.isFinite(sizeView?.[id]) ? Number(sizeView[id]) : DEFAULT_NODE_SIZE;\n      const rawOutline = Number.isFinite(outlineView?.[id]) ? Number(outlineView[id]) : DEFAULT_NODE_OUTLINE_WIDTH;\n      const fullDiameter = Math.max(1, (nodeSizeBase + nodeSizeScale * rawSize) + Math.max(0, nodeOutlineBase + nodeOutlineScale * rawOutline));\n      nodeRadiusWorld = Math.max(nodeRadiusWorld, fullDiameter * 0.5);\n      found = true;\n      const pointOffset = count * 3;\n      sampledPoints[pointOffset] = x;\n      sampledPoints[pointOffset + 1] = y;\n      sampledPoints[pointOffset + 2] = z;\n      sumX += x; sumY += y; sumZ += z;\n      count += 1;\n      if (x < minX) minX = x; if (x > maxX) maxX = x;\n      if (y < minY) minY = y; if (y > maxY) maxY = y;\n      if (z < minZ) minZ = z; if (z > maxZ) maxZ = z;\n      if (sampleX) {\n        sampleX[count - 1] = x;\n        sampleY[count - 1] = y;\n        sampleZ[count - 1] = z;\n      }\n    }\n    if (!found) return null;\n\n    let fitMinX = minX; let fitMinY = minY; let fitMinZ = minZ;\n    let fitMaxX = maxX; let fitMaxY = maxY; let fitMaxZ = maxZ;\n    if (sampleX && count >= 4) {\n      const trim = (1 - coverage) * 0.5;\n      fitMinX = quantileFromValues(sampleX, count, trim);\n      fitMaxX = quantileFromValues(sampleX, count, 1 - trim);\n      fitMinY = quantileFromValues(sampleY, count, trim);\n      fitMaxY = quantileFromValues(sampleY, count, 1 - trim);\n      fitMinZ = quantileFromValues(sampleZ, count, trim);\n      fitMaxZ = quantileFromValues(sampleZ, count, 1 - trim);\n    }\n\n    const bboxCx = (fitMinX + fitMaxX) * 0.5;\n    const bboxCy = (fitMinY + fitMaxY) * 0.5;\n    const bboxCz = (fitMinZ + fitMaxZ) * 0.5;\n    const centroid = [\n      count > 0 ? (sumX / count) : bboxCx,\n      count > 0 ? (sumY / count) : bboxCy,\n      count > 0 ? (sumZ / count) : bboxCz,\n    ];\n    return {\n      paddingPx,\n      coverage,\n      nodeRadiusWorld: Number.isFinite(options.nodeRadiusWorld)\n        ? Math.max(0, Number(options.nodeRadiusWorld))\n        : Math.max(DEFAULT_CAMERA_FIT_NODE_RADIUS_WORLD, nodeRadiusWorld),\n      sourceCount: nodeIndices.length,\n      sampledCount: count,\n      minX,\n      minY,\n      minZ,\n      maxX,\n      maxY,\n      maxZ,\n      fitMinX,\n      fitMinY,\n      fitMinZ,\n      fitMaxX,\n      fitMaxY,\n      fitMaxZ,\n      fitPoints: sampledPoints.subarray(0, count * 3),\n      sumX,\n      sumY,\n      sumZ,\n      count,\n      bboxCenter: [bboxCx, bboxCy, bboxCz],\n      centroid,\n    };\n  }\n\n  _resolveCameraAutoFitIntervalMs(nodeCount = null) {\n    const config = this._cameraControlConfig ?? CAMERA_CONTROL_DEFAULTS;\n    const baseInterval = normalizeNonNegativeNumber(\n      config.autoFitIntervalMs,\n      CAMERA_CONTROL_DEFAULTS.autoFitIntervalMs,\n      0,\n      60000,\n    );\n    const minInterval = normalizeNonNegativeNumber(\n      config.autoFitMinIntervalMs,\n      CAMERA_CONTROL_DEFAULTS.autoFitMinIntervalMs,\n      0,\n      60000,\n    );\n    const maxInterval = normalizeNonNegativeNumber(\n      config.autoFitMaxIntervalMs,\n      CAMERA_CONTROL_DEFAULTS.autoFitMaxIntervalMs,\n      minInterval,\n      60000,\n    );\n    const scaleStrength = normalizeNonNegativeNumber(\n      config.autoFitLargeNetworkScale,\n      CAMERA_CONTROL_DEFAULTS.autoFitLargeNetworkScale,\n      0,\n      32,\n    );\n    const countRef = normalizePositiveInteger(\n      config.autoFitIntervalNodeCountRef,\n      CAMERA_CONTROL_DEFAULTS.autoFitIntervalNodeCountRef,\n      1,\n      Number.MAX_SAFE_INTEGER,\n    );\n    const resolvedNodeCount = Math.max(1, Number.isFinite(nodeCount) ? Math.floor(nodeCount) : Math.floor(this._getRenderNetwork()?.nodeCount ?? 1));\n    const intervalScale = scaleStrength <= 0\n      ? 1\n      : Math.max(1, Math.pow(resolvedNodeCount / countRef, 0.5) * scaleStrength);\n    const interval = clamp(baseInterval * intervalScale, minInterval, maxInterval);\n    if (this._cameraControlRuntime) {\n      this._cameraControlRuntime.lastEffectiveIntervalMs = interval;\n    }\n    return interval;\n  }\n\n  _disableAutomaticCameraControlFromInteraction(detail = null) {\n    const config = this._cameraControlConfig ?? null;\n    if (!config) return false;\n    this._invalidateCameraOrbitReference();\n    const before = copyCameraControlConfig(config);\n    let changed = false;\n    const action = detail?.action ?? null;\n    const actionTokens = new Set(String(action ?? '').split(/[^a-z0-9]+/i).filter(Boolean));\n    const isPan = actionTokens.has('pan') || actionTokens.has('translate');\n    const isRotate = actionTokens.has('rotate');\n    const isZoom = actionTokens.has('zoom');\n    const isDolly = actionTokens.has('dolly');\n    const is2DMovementWithoutAction = detail?.mode === '2d'\n      && (detail?.type === 'pointer' || detail?.type === 'touch' || detail?.type === 'wheel')\n      && !action;\n    if (isPan || isRotate || isZoom || isDolly || is2DMovementWithoutAction) {\n      this._stopCameraControlPoseInterpolation();\n    }\n    if (config.autoFit === true && (isPan || isRotate || isZoom || isDolly || is2DMovementWithoutAction)) {\n      config.autoFit = false;\n      changed = true;\n    }\n    if (config.orbit === true && !isZoom && !isDolly) {\n      config.orbit = false;\n      changed = true;\n    }\n    if (config.followTarget === true && (isPan || isZoom || isDolly || is2DMovementWithoutAction)) {\n      config.followTarget = false;\n      config.targetNodeIndices = null;\n      changed = true;\n    }\n    if (changed) {\n      this._markAutoFitDirty(false);\n      this._emitCameraControlChange();\n      if (typeof this.states?.set === 'function') {\n        const detailSource = isExplicitCameraStateSource(detail?.origin, detail) ? (detail.origin ?? 'interaction') : 'interaction';\n        for (const key of ['autoFit', 'orbit', 'followTarget', 'targetNodeIndices']) {\n          if (JSON.stringify(before?.[key]) === JSON.stringify(this._snapshotCameraControlState()?.[key])) continue;\n          this.states.set(`camera.controls.${key}`, cloneSerializable(this._snapshotCameraControlState()?.[key]), {\n            source: detailSource === 'test' ? 'program' : detailSource,\n            reason: 'camera-interaction',\n            trackOverride: true,\n            applyBinding: false,\n            debounceMs: 500,\n            journal: false,\n          });\n        }\n      }\n      this.scheduler?.requestRender?.();\n    }\n    return changed;\n  }\n\n  _sampleRenderBounds(options = {}) {\n    const network = this._getRenderNetwork();\n    const requestedNodeIndices = normalizeNodeIndexList(options.nodeIndices);\n    const nodeAttributeAccess = this._prepareRenderBoundsNodeAttributeAccess(network);\n    const sampleOptions = { ...options, nodeAttributeAccess };\n    if (requestedNodeIndices?.length) {\n      const resolved = this._resolveCameraPositionView({ ...sampleOptions, skipDelegateSnapshot: true });\n      if (resolved?.source === 'network') {\n        return this._withRenderNetworkBufferAccess(network, () => {\n          const positions = this._readNodePositionViewUnsafe();\n          return this._sampleRenderBoundsFromPositions(positions, requestedNodeIndices, sampleOptions);\n        });\n      }\n      if (!resolved?.view) {\n        const delegate = this._positionsConfig?.delegate ?? this._activePositionDelegate ?? null;\n        this._scheduleCameraDelegateTargetBounds(delegate, requestedNodeIndices, sampleOptions);\n        if (sampleOptions.exactReadback === true) {\n          return null;\n        }\n        const runtime = this._cameraControlRuntime ?? null;\n        const signature = this._cameraNodeIndexSignature(requestedNodeIndices);\n        if (\n          runtime?.delegateTargetBoundsDelegate === delegate\n          && runtime.delegateTargetBoundsSignature === signature\n          && runtime.delegateTargetBounds\n        ) {\n          return runtime.delegateTargetBounds;\n        }\n        return null;\n      }\n      return this._withRenderNetworkBufferAccess(network, () => (\n        this._sampleRenderBoundsFromPositions(resolved.view, requestedNodeIndices, sampleOptions)\n      ));\n    }\n\n    const resolved = this._resolveCameraPositionView(sampleOptions);\n    if (resolved?.source === 'network') {\n      return this._withRenderNetworkBufferAccess(network, () => {\n        const positions = this._readNodePositionViewUnsafe();\n        const nodeIndices = network?.nodeIndices ?? null;\n        return this._sampleRenderBoundsFromPositions(positions, nodeIndices, sampleOptions);\n      });\n    }\n    let nodeIndices = null;\n    this._withPositionBufferAccess(() => {\n      const active = network?.nodeIndices ?? null;\n      if (!active?.length) return;\n      nodeIndices = ArrayBuffer.isView(active)\n        ? new Uint32Array(active)\n        : Array.from(active);\n    });\n    if (!nodeIndices?.length || !resolved?.view) return null;\n    return this._withRenderNetworkBufferAccess(network, () => (\n      this._sampleRenderBoundsFromPositions(resolved.view, nodeIndices, sampleOptions)\n    ));\n  }\n\n  _cameraBoundsRequestSignature(request = {}) {\n    const options = request.options ?? {};\n    const nodeIndices = normalizeNodeIndexList(request.nodeIndices);\n    const graphLayer = this.renderer?.graphLayer ?? null;\n    const viewport = this.renderer?.camera?.viewport ?? this.size ?? {};\n    return JSON.stringify({\n      kind: request.kind ?? 'bounds',\n      nodeIndices: nodeIndices?.length ? this._cameraNodeIndexSignature(nodeIndices) : '',\n      coverage: Number.isFinite(options.coverage) ? Number(options.coverage) : null,\n      paddingRatio: Number.isFinite(options.paddingRatio) ? Number(options.paddingRatio) : null,\n      paddingPx: Number.isFinite(options.paddingPx) ? Number(options.paddingPx) : null,\n      maxSamples: Number.isFinite(options.maxSamples) ? Math.floor(Number(options.maxSamples)) : null,\n      nodeRadiusWorld: Number.isFinite(options.nodeRadiusWorld) ? Number(options.nodeRadiusWorld) : null,\n      viewportWidth: Number(viewport.width ?? this.size?.width ?? 0) || 0,\n      viewportHeight: Number(viewport.height ?? this.size?.height ?? 0) || 0,\n      nodeSizeBase: Number(graphLayer?.nodeSizeBase ?? 0) || 0,\n      nodeSizeScale: Number(graphLayer?.nodeSizeScale ?? 1) || 0,\n      nodeOutlineWidthBase: Number(graphLayer?.nodeOutlineWidthBase ?? 0) || 0,\n      nodeOutlineWidthScale: Number(graphLayer?.nodeOutlineWidthScale ?? 0) || 0,\n    });\n  }\n\n  _prepareCameraBoundsSnapshot(request, options = {}) {\n    const runtime = this._cameraControlRuntime ?? null;\n    if (!runtime || !request) return null;\n    const signature = this._cameraBoundsRequestSignature(request);\n    if (\n      options.force !== true\n      && runtime.cameraBoundsDirty !== true\n      && runtime.cameraBoundsSignature === signature\n      && runtime.cameraBoundsSnapshot\n    ) {\n      return runtime.cameraBoundsSnapshot;\n    }\n    if (this._renderNetworkBufferAccessActive()) {\n      this._scheduleCameraBoundsPreparation(request, { ...options, force: true });\n      return runtime.cameraBoundsSnapshot ?? null;\n    }\n    const bounds = this._sampleRenderBounds({\n      ...(request.options ?? {}),\n      nodeIndices: request.nodeIndices ?? undefined,\n    });\n    runtime.cameraBoundsPreparedAt = Number.isFinite(options.now) ? Number(options.now) : performance.now();\n    runtime.cameraBoundsPending = false;\n    runtime.cameraBoundsKind = request.kind ?? 'bounds';\n    runtime.cameraBoundsSignature = signature;\n    runtime.cameraBoundsSnapshot = bounds ?? null;\n    runtime.cameraBoundsDirty = bounds ? false : true;\n    return bounds ?? null;\n  }\n\n  _scheduleCameraBoundsPreparation(request, options = {}) {\n    const runtime = this._cameraControlRuntime ?? null;\n    if (!runtime || !request || runtime.cameraBoundsPending === true) return false;\n    runtime.cameraBoundsPending = true;\n    const run = () => {\n      const current = this._cameraControlRuntime ?? null;\n      if (!current) return;\n      try {\n        this._prepareCameraBoundsSnapshot(request, { ...options, force: true });\n      } finally {\n        current.cameraBoundsPending = false;\n      }\n      this.scheduler?.requestRender?.();\n    };\n    if (typeof queueMicrotask === 'function') queueMicrotask(run);\n    else Promise.resolve().then(run);\n    return true;\n  }\n\n  _getPreparedCameraBoundsSnapshot(request) {\n    const runtime = this._cameraControlRuntime ?? null;\n    if (!runtime || !request) return null;\n    const signature = this._cameraBoundsRequestSignature(request);\n    if (runtime.cameraBoundsSignature !== signature) return null;\n    return runtime.cameraBoundsSnapshot ?? null;\n  }\n\n  _buildCameraFollowBoundsRequest(nodeIndices, config = this._cameraControlConfig ?? CAMERA_CONTROL_DEFAULTS) {\n    const normalized = normalizeNodeIndexList(nodeIndices);\n    if (!normalized?.length) return null;\n    return {\n      kind: 'follow',\n      nodeIndices: normalized,\n      options: {\n        coverage: 1,\n        paddingRatio: 0,\n        maxSamples: config.autoFitMaxSamples,\n      },\n    };\n  }\n\n  _buildCameraAutoFitBoundsRequest(nodeIndices = null, config = this._cameraControlConfig ?? CAMERA_CONTROL_DEFAULTS) {\n    const normalized = normalizeNodeIndexList(nodeIndices);\n    return {\n      kind: 'autoFit',\n      nodeIndices: normalized?.length ? normalized : null,\n      options: {\n        coverage: config.autoFitCoverage,\n        paddingRatio: config.autoFitPaddingRatio,\n        maxSamples: config.autoFitMaxSamples,\n      },\n    };\n  }\n\n  _prepareCameraControlBoundsSnapshot(options = {}) {\n    const runtime = this._cameraControlRuntime ?? null;\n    const config = this._cameraControlConfig ?? CAMERA_CONTROL_DEFAULTS;\n    if (!runtime || runtime.suspended === true) return null;\n    if (config.followTarget === true) {\n      const targetNodeIndices = this._resolveActiveCameraTargetNodeIndices();\n      const request = this._buildCameraFollowBoundsRequest(targetNodeIndices, config);\n      return request ? this._prepareCameraBoundsSnapshot(request, options) : null;\n    }\n    if (config.autoFit !== true || runtime.autoFitDirty !== true || runtime.largeNetworkStartupActive === true) {\n      return null;\n    }\n    const targetNodeIndices = this._resolveActiveCameraTargetNodeIndices();\n    const request = this._buildCameraAutoFitBoundsRequest(targetNodeIndices, config);\n    return this._prepareCameraBoundsSnapshot(request, options);\n  }\n\n  _resolveCameraFocusPose(bounds, options = {}) {\n    const camera = this.renderer?.camera ?? null;\n    const captured = captureCameraPose(camera);\n    const current = options.basePose ? mergeCameraPose(captured, options.basePose) : captured;\n    if (!camera || !current || !bounds) return null;\n    const focusMode = options.focusMode === 'centroid' ? 'centroid' : 'bbox';\n    const center = focusMode === 'centroid'\n      ? copyVec3(bounds.centroid ?? bounds.bboxCenter ?? [0, 0, 0], 0)\n      : copyVec3(bounds.bboxCenter ?? bounds.centroid ?? [0, 0, 0], 0);\n    const zoomScale = Math.max(1e-6, Number.isFinite(options.zoomScale) ? Number(options.zoomScale) : 1);\n    const focusZoomTolerance = normalizeNonNegativeNumber(options.focusZoomTolerance, 0, 0, 1);\n    if (camera.mode === '2d') {\n      let desiredZoom = current.zoom * zoomScale;\n      if (zoomScale > 1 && Number.isFinite(options.maxFocusZoom)) {\n        const maxFocusZoom = Math.max(camera.minZoom ?? 1e-6, Number(options.maxFocusZoom));\n        const closeEnoughZoom = current.zoom >= (maxFocusZoom / (1 + focusZoomTolerance));\n        desiredZoom = closeEnoughZoom ? current.zoom : Math.min(desiredZoom, maxFocusZoom);\n      }\n      const nextZoom = Math.min(camera.maxZoom ?? desiredZoom, Math.max(camera.minZoom ?? desiredZoom, desiredZoom));\n      return mergeCameraPose(current, {\n        mode: '2d',\n        projection: 'orthographic',\n        target: new Float32Array(center),\n        pan3D: new Float32Array([0, 0, 0]),\n        pan2D: new Float32Array([\n          -center[0] * nextZoom,\n          -center[1] * nextZoom,\n          0,\n        ]),\n        zoom: nextZoom,\n      });\n    }\n    let desiredDistance = current.distance / zoomScale;\n    if (zoomScale > 1 && Number.isFinite(options.minFocusDistance)) {\n      const minFocusDistance = Math.max(camera.minDistance ?? 1e-6, Number(options.minFocusDistance));\n      const closeEnoughDistance = current.distance <= (minFocusDistance * (1 + focusZoomTolerance));\n      desiredDistance = closeEnoughDistance ? current.distance : Math.max(desiredDistance, minFocusDistance);\n    }\n    const nextDistance = Math.min(camera.maxDistance ?? desiredDistance, Math.max(camera.minDistance ?? desiredDistance, desiredDistance));\n    return mergeCameraPose(current, {\n      mode: '3d',\n      target: new Float32Array(center),\n      pan3D: new Float32Array([0, 0, 0]),\n      distance: nextDistance,\n    });\n  }\n\n  _resolveCameraFitPose(bounds, options = {}) {\n    const camera = this.renderer?.camera ?? null;\n    const current = captureCameraPose(camera);\n    if (!camera || !current || !bounds) return null;\n\n    const focusMode = options.focusMode === 'centroid' ? 'centroid' : 'bbox';\n    const center = focusMode === 'centroid'\n      ? copyVec3(bounds.centroid ?? bounds.bboxCenter ?? [0, 0, 0], 0)\n      : copyVec3(bounds.bboxCenter ?? bounds.centroid ?? [0, 0, 0], 0);\n    const fitWidth = Math.max(1e-6, bounds.fitMaxX - bounds.fitMinX);\n    const fitHeight = Math.max(1e-6, bounds.fitMaxY - bounds.fitMinY);\n    const fitDepth = Math.max(1e-6, bounds.fitMaxZ - bounds.fitMinZ);\n    const nodeRadiusWorld = Math.max(0, Number(bounds.nodeRadiusWorld ?? 0) || 0);\n\n    if (camera.mode === '2d') {\n      const fitZoomMargin = Math.max(\n        1,\n        Number.isFinite(options.zoomMargin)\n          ? Number(options.zoomMargin)\n          : CAMERA_FIT_DEFAULT_2D_ZOOM_MARGIN,\n      );\n      const viewportW = Math.max(1, camera.viewport?.width ?? this.size?.width ?? 1);\n      const viewportH = Math.max(1, camera.viewport?.height ?? this.size?.height ?? 1);\n      const availW = Math.max(1, viewportW - bounds.paddingPx * 2);\n      const availH = Math.max(1, viewportH - bounds.paddingPx * 2);\n      const zoomX = availW / Math.max(1e-6, fitWidth + nodeRadiusWorld * 2);\n      const zoomY = availH / Math.max(1e-6, fitHeight + nodeRadiusWorld * 2);\n      const nextZoom = Math.min(zoomX, zoomY) / fitZoomMargin;\n      const clampedZoom = Math.min(camera.maxZoom ?? nextZoom, Math.max(camera.minZoom ?? nextZoom, nextZoom));\n      return mergeCameraPose(current, {\n        mode: '2d',\n        projection: 'orthographic',\n        target: new Float32Array(center),\n        pan3D: new Float32Array([0, 0, 0]),\n        pan2D: new Float32Array([\n          -center[0] * clampedZoom,\n          -center[1] * clampedZoom,\n          0,\n        ]),\n        zoom: clampedZoom,\n      });\n    }\n\n    const viewportW = Math.max(1, camera.viewport?.width ?? this.size?.width ?? 1);\n    const viewportH = Math.max(1, camera.viewport?.height ?? this.size?.height ?? 1);\n    const availW = Math.max(1, viewportW - bounds.paddingPx * 2);\n    const availH = Math.max(1, viewportH - bounds.paddingPx * 2);\n    const aspect = Math.max(1e-3, viewportW / viewportH);\n    const fitRotation = options.resetOrientation === true\n      ? DEFAULT_MODE_SWITCH_3D_ROTATION\n      : current.rotation;\n    const basis = resolveCameraBasisForRotation(fitRotation);\n    let maxAbsX = 0;\n    let maxAbsY = 0;\n    let requiredPerspectiveDistance = 0;\n    const fovRad = (Number.isFinite(camera.fov) ? camera.fov : 60) * (Math.PI / 180);\n    const tanHalfY = Math.max(1e-3, Math.tan(fovRad * 0.5));\n    const tanHalfX = Math.max(1e-3, tanHalfY * aspect);\n    const effectiveTanX = Math.max(1e-3, tanHalfX * (availW / viewportW));\n    const effectiveTanY = Math.max(1e-3, tanHalfY * (availH / viewportH));\n    const includeFitPoint = (x, y, z) => {\n      const delta = [x - center[0], y - center[1], z - center[2]];\n      const viewX = dotVec3Array(delta, basis.right);\n      const viewY = dotVec3Array(delta, basis.up);\n      const viewForward = dotVec3Array(delta, basis.forward);\n      maxAbsX = Math.max(maxAbsX, Math.abs(viewX) + nodeRadiusWorld);\n      maxAbsY = Math.max(maxAbsY, Math.abs(viewY) + nodeRadiusWorld);\n      requiredPerspectiveDistance = Math.max(\n        requiredPerspectiveDistance,\n        ((Math.abs(viewX) + nodeRadiusWorld) / effectiveTanX) - viewForward,\n        ((Math.abs(viewY) + nodeRadiusWorld) / effectiveTanY) - viewForward,\n      );\n    };\n    let includedFitPoints = 0;\n    const fitPoints = bounds.fitPoints;\n    if (fitPoints && Number.isFinite(fitPoints.length) && fitPoints.length >= 3) {\n      const epsilon = 1e-6;\n      for (let i = 0; (i + 2) < fitPoints.length; i += 3) {\n        const x = fitPoints[i];\n        const y = fitPoints[i + 1];\n        const z = fitPoints[i + 2];\n        if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) continue;\n        if (\n          x < (bounds.fitMinX - epsilon) || x > (bounds.fitMaxX + epsilon)\n          || y < (bounds.fitMinY - epsilon) || y > (bounds.fitMaxY + epsilon)\n          || z < (bounds.fitMinZ - epsilon) || z > (bounds.fitMaxZ + epsilon)\n        ) {\n          continue;\n        }\n        includeFitPoint(x, y, z);\n        includedFitPoints += 1;\n      }\n    }\n    if (includedFitPoints <= 0) {\n      for (const x of [bounds.fitMinX, bounds.fitMaxX]) {\n        for (const y of [bounds.fitMinY, bounds.fitMaxY]) {\n          for (const z of [bounds.fitMinZ, bounds.fitMaxZ]) {\n            includeFitPoint(x, y, z);\n          }\n        }\n      }\n    }\n    const desired = camera.projection === 'orthographic'\n      ? Math.max(\n          (maxAbsY * viewportH) / availH,\n          (maxAbsX * viewportW) / (availW * aspect),\n        )\n      : requiredPerspectiveDistance;\n    const distance = Math.min(camera.maxDistance ?? desired, Math.max(camera.minDistance ?? desired, desired));\n    return mergeCameraPose(current, {\n      mode: '3d',\n      target: new Float32Array(center),\n      pan3D: new Float32Array([0, 0, 0]),\n      pan2D: options.resetOrientation === true ? new Float32Array([0, 0, 0]) : current.pan2D,\n      distance,\n      rotation: options.resetOrientation === true\n        ? new Float32Array(fitRotation)\n        : current.rotation,\n    });\n  }\n\n  _applyCameraPoseWithOptionalAnimation(nextPose, options = {}) {\n    const camera = this.renderer?.camera ?? null;\n    const current = captureCameraPose(camera);\n    if (!camera || !current || !nextPose) return false;\n    const animate = options.animate === true;\n    const durationMs = normalizeNonNegativeNumber(\n      options.durationMs,\n      this._cameraControlConfig?.animationDurationMs ?? CAMERA_CONTROL_DEFAULTS.animationDurationMs,\n      0,\n      60000,\n    );\n    if (animate && durationMs > 0) {\n      this._ensureCameraTransitionController().transition(camera, {\n        fromPose: current,\n        toPose: nextPose,\n        durationMs,\n      });\n    } else {\n      applyCameraPose(camera, nextPose);\n      this.scheduler?.requestRender?.();\n    }\n    return true;\n  }\n\n  _getLargeNetworkStartupCounts(targetNodeIndices = null) {\n    const network = this._getRenderNetwork?.() ?? this.network ?? null;\n    const nodeCount = targetNodeIndices?.length ?? Math.max(0, Math.floor(Number(network?.nodeCount) || 0));\n    const edgeCount = targetNodeIndices?.length ? 0 : Math.max(0, Math.floor(Number(network?.edgeCount) || 0));\n    return { nodeCount, edgeCount };\n  }\n\n  _shouldUseLargeNetworkStartupFit(options = {}, targetNodeIndices = null) {\n    if (targetNodeIndices?.length) return false;\n    const config = this._cameraControlConfig ?? CAMERA_CONTROL_DEFAULTS;\n    if (options.largeNetworkStartupFit !== true || config.largeNetworkStartupFit === false) return false;\n    if (config.autoFit !== true) return false;\n    const { nodeCount, edgeCount } = this._getLargeNetworkStartupCounts(targetNodeIndices);\n    const nodeThreshold = normalizePositiveInteger(\n      config.largeNetworkStartupNodeThreshold,\n      LARGE_NETWORK_STARTUP_NODE_THRESHOLD,\n      1,\n      Number.MAX_SAFE_INTEGER,\n    );\n    const edgeThreshold = normalizePositiveInteger(\n      config.largeNetworkStartupEdgeThreshold,\n      LARGE_NETWORK_STARTUP_EDGE_THRESHOLD,\n      1,\n      Number.MAX_SAFE_INTEGER,\n    );\n    return nodeCount >= nodeThreshold || edgeCount >= edgeThreshold;\n  }\n\n  _resolveLargeNetworkStartupPose(fitPose, options = {}) {\n    const camera = this.renderer?.camera ?? null;\n    if (!camera || !fitPose) return null;\n    const config = this._cameraControlConfig ?? CAMERA_CONTROL_DEFAULTS;\n    const scale = normalizeNonNegativeNumber(\n      options.largeNetworkStartupScale ?? config.largeNetworkStartupScale,\n      LARGE_NETWORK_STARTUP_SCALE,\n      1,\n      64,\n    );\n    if (scale <= 1) return null;\n    if (fitPose.mode === '2d') {\n      const zoom = Math.max(camera.minZoom ?? 1e-6, Number(fitPose.zoom ?? camera.zoom ?? 1) / scale);\n      const sourceZoom = Math.max(1e-6, Number(fitPose.zoom ?? 1) || 1);\n      const panScale = zoom / sourceZoom;\n      return mergeCameraPose(fitPose, {\n        zoom,\n        pan2D: new Float32Array([\n          (Number(fitPose.pan2D?.[0]) || 0) * panScale,\n          (Number(fitPose.pan2D?.[1]) || 0) * panScale,\n          (Number(fitPose.pan2D?.[2]) || 0) * panScale,\n        ]),\n      });\n    }\n    const distance = Math.min(\n      camera.maxDistance ?? Number.POSITIVE_INFINITY,\n      Math.max(camera.minDistance ?? 1e-6, Number(fitPose.distance ?? camera.distance ?? 800) * scale),\n    );\n    return mergeCameraPose(fitPose, { distance });\n  }\n\n  _applyLargeNetworkStartupFit(fitPose, options = {}) {\n    const camera = this.renderer?.camera ?? null;\n    const runtime = this._cameraControlRuntime ?? null;\n    if (!camera || !fitPose) return false;\n    const startPose = this._resolveLargeNetworkStartupPose(fitPose, options);\n    if (!startPose) return false;\n    const durationMs = normalizeNonNegativeNumber(\n      options.largeNetworkStartupDurationMs ?? this._cameraControlConfig?.largeNetworkStartupDurationMs,\n      LARGE_NETWORK_STARTUP_DURATION_MS,\n      0,\n      60000,\n    );\n    this._stopCameraControlPoseInterpolation();\n    applyCameraPose(camera, startPose);\n    const gate = this._startupGate ?? null;\n    const delaySettleUntilFirstVisibleFrame = gate?.active === true && gate.firstVisibleFrameDrawn !== true;\n    if (delaySettleUntilFirstVisibleFrame && runtime) {\n      runtime.pendingLargeNetworkStartupSettle = { pose: fitPose, durationMs };\n    } else {\n      this._queueCameraControlPose(fitPose, {\n        animate: durationMs > 0,\n        durationMs,\n      });\n    }\n    if (runtime) {\n      runtime.largeNetworkStartupActive = durationMs > 0\n        && (runtime.controlPoseActive === true || runtime.pendingLargeNetworkStartupSettle != null);\n      runtime.autoFitDirty = false;\n      runtime.lastAutoFitAt = performance.now();\n      runtime.lastFitSignature = this._cameraFitSignature(fitPose);\n    }\n    this.scheduler?.requestRender?.();\n    return true;\n  }\n\n  _refreshLargeNetworkStartupFit(options = {}) {\n    const gate = this._startupGate ?? null;\n    const runtime = this._cameraControlRuntime ?? null;\n    const config = this._cameraControlConfig ?? CAMERA_CONTROL_DEFAULTS;\n    const camera = this.renderer?.camera ?? null;\n    if (!gate || gate.active !== true || gate.firstVisibleFrameDrawn === true) return false;\n    if (!runtime || !camera || config.largeNetworkStartupFit === false || config.autoFit !== true) return false;\n    if (!this._shouldUseLargeNetworkStartupFit({ largeNetworkStartupFit: true }, null)) return false;\n    const layoutIteration = Math.max(0, Math.floor(Number(gate.layoutIterations) || 0));\n    if (\n      options.force !== true\n      && runtime.largeNetworkStartupRefreshIteration === layoutIteration\n      && runtime.pendingLargeNetworkStartupSettle\n    ) {\n      return false;\n    }\n    const sampledBounds = this._sampleRenderBounds({\n      coverage: config.autoFitCoverage,\n      paddingRatio: config.autoFitPaddingRatio,\n      maxSamples: config.autoFitMaxSamples,\n    });\n    if (!sampledBounds) return false;\n    const fitPose = this._resolveCameraFitPose(sampledBounds, {\n      resetOrientation: false,\n      focusMode: 'bbox',\n    });\n    if (!fitPose) return false;\n    const refreshed = this._applyLargeNetworkStartupFit(fitPose, {\n      largeNetworkStartupFit: true,\n      largeNetworkStartupScale: config.largeNetworkStartupScale,\n      largeNetworkStartupDurationMs: config.largeNetworkStartupDurationMs,\n    });\n    if (refreshed) {\n      runtime.largeNetworkStartupRefreshIteration = layoutIteration;\n    }\n    return refreshed;\n  }\n\n  _queuePendingLargeNetworkStartupSettle() {\n    const runtime = this._cameraControlRuntime ?? null;\n    const pending = runtime?.pendingLargeNetworkStartupSettle ?? null;\n    if (!runtime || !pending?.pose) return false;\n    runtime.pendingLargeNetworkStartupSettle = null;\n    const queued = this._queueCameraControlPose(pending.pose, {\n      animate: pending.durationMs > 0,\n      durationMs: pending.durationMs,\n    });\n    runtime.largeNetworkStartupActive = queued && pending.durationMs > 0 && runtime.controlPoseActive === true;\n    return queued;\n  }\n\n  _cameraPoseSignature(pose) {\n    if (!pose) return '';\n    return JSON.stringify([\n      pose.mode,\n      pose.projection,\n      Number(pose.zoom ?? 0).toFixed(6),\n      Number(pose.distance ?? 0).toFixed(6),\n      ...(Array.from(pose.target ?? []).map((value) => Number(value).toFixed(6))),\n      ...(Array.from(pose.pan2D ?? []).map((value) => Number(value).toFixed(6))),\n      ...(Array.from(pose.pan3D ?? []).map((value) => Number(value).toFixed(6))),\n      ...(Array.from(pose.rotation ?? []).map((value) => Number(value).toFixed(6))),\n    ]);\n  }\n\n  _cameraFitSignature(pose) {\n    if (!pose) return '';\n    return JSON.stringify([\n      pose.mode,\n      pose.projection,\n      Number(pose.zoom ?? 0).toFixed(6),\n      Number(pose.distance ?? 0).toFixed(6),\n      ...(Array.from(pose.target ?? []).map((value) => Number(value).toFixed(6))),\n      ...(Array.from(pose.pan2D ?? []).map((value) => Number(value).toFixed(6))),\n      ...(Array.from(pose.pan3D ?? []).map((value) => Number(value).toFixed(6))),\n    ]);\n  }\n\n  _stopCameraControlPoseInterpolation() {\n    const runtime = this._cameraControlRuntime ?? null;\n    if (!runtime) return;\n    runtime.controlPoseActive = false;\n    runtime.controlPoseFrom = null;\n    runtime.controlPoseTo = null;\n    runtime.controlPoseStartedAt = 0;\n    runtime.controlPoseDurationMs = 0;\n    runtime.controlPoseSignature = '';\n    runtime.controlPosePreserveRotation = false;\n    runtime.largeNetworkStartupActive = false;\n    runtime.pendingLargeNetworkStartupSettle = null;\n    runtime.largeNetworkStartupRefreshIteration = -1;\n  }\n\n  _preserveCurrentCameraRotation(pose) {\n    const camera = this.renderer?.camera ?? null;\n    if (!pose || camera?.mode !== '3d') return pose;\n    const current = captureCameraPose(camera);\n    if (!current?.rotation) return pose;\n    return mergeCameraPose(pose, { rotation: current.rotation });\n  }\n\n  _resolveCameraControlPoseInterpolation(timestamp = performance.now()) {\n    const runtime = this._cameraControlRuntime ?? null;\n    if (!runtime || runtime.controlPoseActive !== true || !runtime.controlPoseFrom || !runtime.controlPoseTo) {\n      return { pose: null, active: false, changed: false };\n    }\n    const durationMs = Math.max(0, Number(runtime.controlPoseDurationMs) || 0);\n    if (durationMs <= 0) {\n      const pose = runtime.controlPosePreserveRotation === true\n        ? this._preserveCurrentCameraRotation(runtime.controlPoseTo)\n        : runtime.controlPoseTo;\n      runtime.controlPoseActive = false;\n      runtime.controlPoseFrom = null;\n      runtime.controlPoseTo = null;\n      runtime.controlPosePreserveRotation = false;\n      runtime.largeNetworkStartupActive = false;\n      return { pose, active: false, changed: true };\n    }\n    const now = Number.isFinite(timestamp) ? timestamp : performance.now();\n    const t = clamp((now - runtime.controlPoseStartedAt) / durationMs, 0, 1);\n    let pose = interpolateCameraPose(runtime.controlPoseFrom, runtime.controlPoseTo, t);\n    if (runtime.controlPosePreserveRotation === true) {\n      pose = this._preserveCurrentCameraRotation(pose);\n    }\n    if (t >= 1) {\n      const completedPose = runtime.controlPosePreserveRotation === true\n        ? this._preserveCurrentCameraRotation(runtime.controlPoseTo)\n        : runtime.controlPoseTo;\n      runtime.controlPoseActive = false;\n      runtime.controlPoseFrom = null;\n      runtime.controlPoseTo = null;\n      runtime.controlPosePreserveRotation = false;\n      runtime.largeNetworkStartupActive = false;\n      return { pose: completedPose ?? pose, active: false, changed: true };\n    }\n    return { pose, active: true, changed: true };\n  }\n\n  _queueCameraControlPose(nextPose, options = {}) {\n    const camera = this.renderer?.camera ?? null;\n    const runtime = this._cameraControlRuntime ?? null;\n    if (!camera || !runtime || !nextPose) return false;\n    const preserveRotation = options.preserveRotation === true && camera.mode === '3d';\n    const signature = preserveRotation\n      ? `${this._cameraFitSignature(nextPose)}|preserve-rotation`\n      : this._cameraPoseSignature(nextPose);\n    const animate = options.animate === true;\n    const durationMs = normalizeNonNegativeNumber(\n      options.durationMs,\n      this._cameraControlConfig?.animationDurationMs ?? CAMERA_CONTROL_DEFAULTS.animationDurationMs,\n      0,\n      60000,\n    );\n    if (signature === runtime.controlPoseSignature && runtime.controlPoseActive === (animate && durationMs > 0)) {\n      return false;\n    }\n    if (!(animate && durationMs > 0)) {\n      this._stopCameraControlPoseInterpolation();\n      runtime.controlPoseSignature = signature;\n      applyCameraPose(camera, preserveRotation ? this._preserveCurrentCameraRotation(nextPose) : nextPose);\n      this.scheduler?.requestRender?.();\n      return true;\n    }\n    const now = performance.now();\n    const currentPose = runtime.controlPoseActive === true\n      ? (this._resolveCameraControlPoseInterpolation(now).pose ?? captureCameraPose(camera))\n      : captureCameraPose(camera);\n    runtime.controlPoseActive = true;\n    runtime.controlPoseFrom = currentPose;\n    runtime.controlPoseTo = nextPose;\n    runtime.controlPoseStartedAt = now;\n    runtime.controlPoseDurationMs = durationMs;\n    runtime.controlPoseSignature = signature;\n    runtime.controlPosePreserveRotation = preserveRotation;\n    this.scheduler?.requestRender?.();\n    return true;\n  }\n\n  _stepCameraControlPoseInterpolation(timestamp = performance.now()) {\n    const camera = this.renderer?.camera ?? null;\n    if (!camera) return false;\n    const resolved = this._resolveCameraControlPoseInterpolation(timestamp);\n    if (!resolved.pose) return false;\n    applyCameraPose(camera, resolved.pose);\n    return resolved.active === true;\n  }\n\n  _stepCameraControlRenderPump(timestamp = performance.now()) {\n    const now = Number.isFinite(timestamp) ? timestamp : performance.now();\n    const camera = this.renderer?.camera ?? null;\n    const config = this._cameraControlConfig ?? CAMERA_CONTROL_DEFAULTS;\n    const runtime = this._cameraControlRuntime ?? null;\n    if (!camera || !runtime) return false;\n    if (runtime.suspended === true) return false;\n    let wantsRender = false;\n\n    if (config.followTarget === true) {\n      const activeTargetNodeIndices = this._resolveActiveCameraTargetNodeIndices();\n      if (activeTargetNodeIndices?.length) {\n        const followIntervalMs = normalizeNonNegativeNumber(\n          config.followUpdateIntervalMs,\n          CAMERA_CONTROL_DEFAULTS.followUpdateIntervalMs,\n          0,\n          60000,\n        );\n        if (\n          !Number.isFinite(runtime.lastFollowUpdateAt)\n          || followIntervalMs <= 0\n          || (now - runtime.lastFollowUpdateAt) >= followIntervalMs\n        ) {\n          runtime.lastFollowUpdateAt = now;\n          const boundsRequest = this._buildCameraFollowBoundsRequest(activeTargetNodeIndices, config);\n          const sampledBounds = this._getPreparedCameraBoundsSnapshot(boundsRequest);\n          if (!sampledBounds) {\n            this._scheduleCameraBoundsPreparation(boundsRequest, { now, reason: 'follow' });\n          }\n          const followPose = this._resolveCameraFocusPose(sampledBounds, {\n            focusMode: 'centroid',\n            basePose: runtime.controlPoseTo ?? null,\n          });\n          if (followPose) {\n            const currentSignature = this._cameraPoseSignature(captureCameraPose(camera));\n            const followSignature = this._cameraPoseSignature(followPose);\n            if (followSignature && followSignature !== currentSignature) {\n              const queued = this._queueCameraControlPose(followPose, {\n                animate: config.animation,\n                durationMs: config.animationDurationMs,\n                preserveRotation: camera.mode === '3d',\n              });\n              wantsRender ||= queued;\n            }\n          }\n        }\n      }\n    } else if (\n      config.autoFit === true\n      && runtime.autoFitDirty === true\n      && runtime.largeNetworkStartupActive !== true\n    ) {\n      const activeTargetNodeIndices = this._resolveActiveCameraTargetNodeIndices();\n      const nodeCount = activeTargetNodeIndices?.length ?? this._getRenderNetwork()?.nodeCount ?? 0;\n      const effectiveIntervalMs = this._resolveCameraAutoFitIntervalMs(nodeCount);\n      if (!Number.isFinite(runtime.lastAutoFitAt) || (now - runtime.lastAutoFitAt) >= effectiveIntervalMs) {\n        runtime.lastAutoFitAt = now;\n        const boundsRequest = this._buildCameraAutoFitBoundsRequest(activeTargetNodeIndices, config);\n        const sampledBounds = this._getPreparedCameraBoundsSnapshot(boundsRequest);\n        if (!sampledBounds) {\n          runtime.autoFitDirty = nodeCount > 0;\n          this._scheduleCameraBoundsPreparation(boundsRequest, { now, reason: 'auto-fit' });\n        } else {\n          const fitPose = this._resolveCameraFitPose(sampledBounds, {\n            resetOrientation: false,\n            focusMode: activeTargetNodeIndices?.length ? 'centroid' : 'bbox',\n          });\n          const fitSignature = this._cameraFitSignature(fitPose);\n          const currentFitSignature = this._cameraFitSignature(captureCameraPose(camera));\n          if (fitSignature) {\n            runtime.lastFitSignature = fitSignature;\n          }\n          runtime.autoFitDirty = false;\n          if (fitSignature && fitPose && fitSignature !== currentFitSignature) {\n            this._queueCameraControlPose(fitPose, {\n              animate: config.animation,\n              durationMs: config.animationDurationMs,\n              preserveRotation: camera.mode === '3d',\n            });\n          }\n        }\n      }\n    }\n\n    const interpolated = this._resolveCameraControlPoseInterpolation(now);\n    let finalPose = interpolated.pose ?? captureCameraPose(camera);\n    wantsRender ||= interpolated.active === true;\n    if (!finalPose) return wantsRender;\n\n    if (camera.mode === '3d') {\n      const lastOrbitAt = Number.isFinite(runtime.lastOrbitAt) && runtime.lastOrbitAt > 0 ? runtime.lastOrbitAt : now;\n      const deltaMs = Math.max(0, now - lastOrbitAt);\n      const deltaSeconds = Math.max(0, Math.min(0.1, deltaMs / 1000));\n      runtime.lastOrbitAt = now;\n\n      const previousOrbitAngle = clamp(\n        toFiniteNumber(runtime.appliedOrbitAngle, config.orbitAngle ?? 0),\n        -89,\n        89,\n      );\n      const targetOrbitAngle = clamp(toFiniteNumber(config.orbitAngle, previousOrbitAngle), -89, 89);\n      let nextOrbitAngle = targetOrbitAngle;\n      if (config.animation === true) {\n        const durationMs = normalizeNonNegativeNumber(\n          config.animationDurationMs,\n          CAMERA_CONTROL_DEFAULTS.animationDurationMs,\n          0,\n          60000,\n        );\n        if (durationMs > 0 && deltaMs > 0) {\n          const tauMs = Math.max(1, durationMs / 4);\n          const alpha = 1 - Math.exp(-deltaMs / tauMs);\n          nextOrbitAngle = previousOrbitAngle + ((targetOrbitAngle - previousOrbitAngle) * clamp(alpha, 0, 1));\n        }\n      }\n      runtime.appliedOrbitAngle = nextOrbitAngle;\n\n      const pitchRadians = (nextOrbitAngle - previousOrbitAngle) * (Math.PI / 180);\n      const yawRadians = config.orbit === true && deltaSeconds > 0 && config.orbitSpeed > 0\n        ? (Math.PI * 2) * config.orbitSpeed * config.orbitDirection * deltaSeconds\n        : 0;\n      if (Math.abs(yawRadians) > 1e-12 || Math.abs(pitchRadians) > 1e-12) {\n        finalPose = mergeCameraPose(finalPose, {\n          rotation: this._composeOrbitRotation(finalPose.rotation, {\n            yawRadians,\n            pitchRadians,\n            axis: config.orbitAxis ?? CAMERA_CONTROL_DEFAULTS.orbitAxis,\n          }),\n        });\n        wantsRender = true;\n      }\n    } else {\n      runtime.lastOrbitAt = now;\n      runtime.appliedOrbitAngle = clamp(toFiniteNumber(config.orbitAngle, 0), -89, 89);\n    }\n\n    if (interpolated.changed === true || wantsRender) {\n      applyCameraPose(camera, finalPose);\n    }\n\n    return wantsRender;\n  }\n\n  _collapseNodeDepthTo2DPlane(zValue = 0) {\n    const targetZ = Number.isFinite(zValue) ? zValue : 0;\n    let changed = false;\n    this._withPositionBufferAccess(() => {\n      const positions = this._readNodePositionViewUnsafe();\n      if (!positions?.length) return;\n      for (let offset = 0; offset < positions.length; offset += 3) {\n        if (!Number.isFinite(positions[offset + 2])) continue;\n        if (Math.abs(positions[offset + 2] - targetZ) <= 1e-9) continue;\n        positions[offset + 2] = targetZ;\n        changed = true;\n      }\n    });\n\n    if (changed) {\n      this.visuals?.markPositionsDirty?.();\n    }\n    return changed;\n  }\n\n  async _collapseDelegateDepthTo2DPlane(delegate, zValue = 0) {\n    if (!delegate || typeof delegate.flattenNodeDepthToPlane !== 'function') return false;\n    try {\n      return (await delegate.flattenNodeDepthToPlane(\n        this._buildPositionDelegateContext({ reason: 'mode-switch' }),\n        zValue,\n      )) === true;\n    } catch (error) {\n      console.warn('Helios.setMode(): failed to collapse delegate depth while switching to 2D.', error);\n      return false;\n    }\n  }\n\n  async _collapseActivePositionDepthTo2DPlane(zValue = 0, delegate = null) {\n    const collapsedNetwork = this._collapseNodeDepthTo2DPlane(zValue);\n    const collapsedDelegate = await this._collapseDelegateDepthTo2DPlane(delegate, zValue);\n    if (collapsedDelegate) {\n      this.visuals?.markPositionsDirty?.();\n    }\n    if (collapsedNetwork || collapsedDelegate) {\n      this.scheduler?.requestGeometry?.();\n      this.scheduler?.requestRender?.();\n    }\n    return collapsedNetwork || collapsedDelegate;\n  }\n\n  _build3DModeTransitionPoses(bounds, projection = 'perspective') {\n    const camera = this.renderer?.camera ?? null;\n    const current = captureCameraPose(camera);\n    if (!camera || !current) return null;\n\n    const centerZ = Number.isFinite(bounds?.sumZ) && Number.isFinite(bounds?.count) && bounds.count > 0\n      ? (bounds.sumZ / bounds.count)\n      : 0;\n    const startCenter = current.mode === '3d'\n      ? resolve3DCenterFromPose(current)\n      : resolve2DCenterFromPose(current, centerZ);\n    const startDistance = current.mode === '3d'\n      ? Math.max(camera.minDistance ?? (10 / 3), current.distance)\n      : clamp(\n        estimate3DDistanceFrom2DZoom(current),\n        camera.minDistance ?? (10 / 3),\n        camera.maxDistance ?? 75000,\n      );\n\n    const startPose = {\n      ...current,\n      mode: '3d',\n      projection,\n      target: new Float32Array(startCenter),\n      pan3D: new Float32Array([0, 0, 0]),\n      pan2D: copyVec3(current.pan2D),\n      distance: startDistance,\n      rotation: current.mode === '3d'\n        ? current.rotation\n        : new Float32Array([0, 0, 0, 1]),\n    };\n\n    const targetDistance = bounds\n      ? (() => {\n        const w = Math.max(1e-6, bounds.maxX - bounds.minX);\n        const h = Math.max(1e-6, bounds.maxY - bounds.minY);\n        const dz = Math.max(1e-6, bounds.maxZ - bounds.minZ);\n        const radius = 0.5 * Math.hypot(w, h, dz);\n        const fovRad = (Number.isFinite(current.fov) ? current.fov : 60) * (Math.PI / 180);\n        const distPerspective = radius / Math.max(1e-3, Math.tan(fovRad * 0.5));\n        const desired = projection === 'orthographic' ? radius * 1.2 : distPerspective * 1.25;\n        return clamp(\n          desired,\n          camera.minDistance ?? desired,\n          camera.maxDistance ?? desired,\n        );\n      })()\n      : startDistance;\n    const targetCenter = bounds\n      ? [\n        Number.isFinite(bounds.sumX) && bounds.count > 0 ? (bounds.sumX / bounds.count) : startCenter[0],\n        Number.isFinite(bounds.sumY) && bounds.count > 0 ? (bounds.sumY / bounds.count) : startCenter[1],\n        centerZ,\n      ]\n      : startCenter;\n\n    return {\n      startPose,\n      endPose: {\n        ...startPose,\n        target: new Float32Array(targetCenter),\n        pan3D: new Float32Array([0, 0, 0]),\n        distance: targetDistance,\n        rotation: new Float32Array(DEFAULT_MODE_SWITCH_3D_ROTATION),\n        pan2D: new Float32Array([0, 0, 0]),\n      },\n    };\n  }\n\n  _build2DModeTransitionPoses(bounds) {\n    const camera = this.renderer?.camera ?? null;\n    const current = captureCameraPose(camera);\n    if (!camera || !current) return null;\n\n    const source3D = current.mode === '3d'\n      ? current\n      : this._build3DModeTransitionPoses(bounds, 'perspective')?.endPose ?? null;\n    if (!source3D) return null;\n\n    const center = bounds\n      ? [\n        Number.isFinite(bounds.sumX) && bounds.count > 0 ? (bounds.sumX / bounds.count) : resolve3DCenterFromPose(source3D)[0],\n        Number.isFinite(bounds.sumY) && bounds.count > 0 ? (bounds.sumY / bounds.count) : resolve3DCenterFromPose(source3D)[1],\n        Number.isFinite(bounds.sumZ) && bounds.count > 0 ? (bounds.sumZ / bounds.count) : resolve3DCenterFromPose(source3D)[2],\n      ]\n      : resolve3DCenterFromPose(source3D);\n\n    const zoom = bounds\n      ? (() => {\n        const w = Math.max(1e-6, bounds.maxX - bounds.minX);\n        const h = Math.max(1e-6, bounds.maxY - bounds.minY);\n        const viewportW = Math.max(1, current.viewport?.width ?? this.size?.width ?? 1);\n        const viewportH = Math.max(1, current.viewport?.height ?? this.size?.height ?? 1);\n        const availW = Math.max(1, viewportW - 48);\n        const availH = Math.max(1, viewportH - 48);\n        return clamp(\n          Math.min(availW / w, availH / h) / CAMERA_FIT_DEFAULT_2D_ZOOM_MARGIN,\n          camera.minZoom ?? (0.001 / 3),\n          camera.maxZoom ?? 30,\n        );\n      })()\n      : clamp(\n        estimate2DZoomFrom3DDistance(source3D),\n        camera.minZoom ?? (0.001 / 3),\n        camera.maxZoom ?? 30,\n      );\n\n    const matchedPerspectiveDistance = clamp(\n      estimate3DDistanceFrom2DZoom({\n        ...current,\n        zoom,\n      }),\n      camera.minDistance ?? (10 / 3),\n      camera.maxDistance ?? 75000,\n    );\n\n    const pre2D3D = {\n      ...source3D,\n      mode: '3d',\n      projection: 'perspective',\n      target: new Float32Array(center),\n      pan3D: new Float32Array([0, 0, 0]),\n      distance: matchedPerspectiveDistance,\n      rotation: new Float32Array([0, 0, 0, 1]),\n    };\n\n    return {\n      startPose: source3D,\n      pre2D3D,\n      start2DPose: {\n        ...pre2D3D,\n        mode: '2d',\n        projection: 'orthographic',\n        target: new Float32Array(center),\n        pan3D: new Float32Array([0, 0, 0]),\n        pan2D: new Float32Array([\n          -center[0] * zoom,\n          -center[1] * zoom,\n          0,\n        ]),\n        zoom,\n        rotation: new Float32Array([0, 0, 0, 1]),\n      },\n      endPose: {\n        ...current,\n        mode: '2d',\n        projection: 'orthographic',\n        target: new Float32Array(center),\n        pan3D: new Float32Array([0, 0, 0]),\n        pan2D: new Float32Array([\n          -center[0] * zoom,\n          -center[1] * zoom,\n          0,\n        ]),\n        zoom,\n        rotation: new Float32Array([0, 0, 0, 1]),\n      },\n    };\n  }\n\n  _applyModeToLayoutOptions(mode) {\n    const layoutOption = this.options?.layout ?? null;\n    if (!layoutOption || isLayoutInstance(layoutOption) || typeof layoutOption !== 'object') return;\n    const nextMode = mode === '3d' ? '3d' : '2d';\n    layoutOption.options = { ...(layoutOption.options ?? {}) };\n    if (\n      layoutOption.type === 'gpu-force'\n      || layoutOption.type === 'gpuforce'\n      || layoutOption.type === 'worker'\n      || layoutOption.type === 'd3force3d'\n      || layoutOption.type === 'd3-force-3d'\n    ) {\n      layoutOption.options.mode = nextMode;\n    }\n    if (layoutOption.type === 'd3force3d' || layoutOption.type === 'd3-force-3d') {\n      layoutOption.options.settings = {\n        ...(layoutOption.options.settings ?? {}),\n        use2D: nextMode !== '3d',\n      };\n    }\n  }\n\n  _applyModeToActiveLayout(mode) {\n    const layout = this._layout ?? null;\n    const nextMode = mode === '3d' ? '3d' : '2d';\n    if (!layout || typeof layout !== 'object') return false;\n    if (layout instanceof D3Force3DLayout) {\n      layout.setSettings?.({ mode: nextMode, use2D: nextMode !== '3d' });\n      return true;\n    }\n    if (layout instanceof GpuForceLayout || layout instanceof WorkerLayout) {\n      layout.setSettings?.({ mode: nextMode });\n      return true;\n    }\n    if (typeof layout.setSettings === 'function') {\n      layout.setSettings({ mode: nextMode });\n      return true;\n    }\n    return false;\n  }\n\n  async _createRendererAndTrackers(options = {}) {\n    const extraStateSlotsRaw = this.options.extraStateSlots ?? 1;\n    const extraStateSlots = Number.isFinite(extraStateSlotsRaw) ? Math.max(0, Math.floor(extraStateSlotsRaw)) : 1;\n    const stateSlots = Math.min(32, 3 + extraStateSlots);\n    const renderer = await createRenderer(this.layers.canvas, {\n      clearColor: this.options.clearColor,\n      forceWebGL: this.options.renderer === 'webgl',\n      forceWebGPU: this.options.renderer === 'webgpu',\n      mode: this.options.mode ?? '3d',\n      projection: this.options.projection ?? 'perspective',\n      suppressBrowserGestures: this.options.suppressBrowserGestures !== false,\n      antialias: this.options.antialias,\n      powerPreference: this.options.powerPreference,\n      webglContextAttributes: this.options.webglContextAttributes,\n      webgpuAdapterOptions: this.options.webgpuAdapterOptions,\n      webgpuDeviceDescriptor: this.options.webgpuDeviceDescriptor,\n      webgpuCanvasConfiguration: this.options.webgpuCanvasConfiguration,\n      supersampling: this.options.supersampling,\n      forceSupersample: this.options.forceSupersample,\n      supersamplingAutoFactor: this.options.supersamplingAutoFactor,\n      supersamplingAutoThreshold: this.options.supersamplingAutoThreshold,\n      edgeRendering: this.options.edgeRendering,\n      transparencyModeEdges: this.options.transparencyModeEdges,\n      edgeEndpointTrim: this.options.edgeEndpointTrim,\n      edgeWidthClampToNodeDiameter: this.options.edgeWidthClampToNodeDiameter,\n      nodeBlendWithEdges: this.options.nodeBlendWithEdges,\n      edgeDepthWrite: this.options.edgeDepthWrite,\n      edgeFastRendering: this.options.edgeFastRendering,\n      ambientOcclusionEnabled: this.options.ambientOcclusionEnabled,\n      ambientOcclusionNodes: this.options.ambientOcclusionNodes,\n      ambientOcclusionEdges: this.options.ambientOcclusionEdges,\n      ambientOcclusionStrength: this.options.ambientOcclusionStrength,\n      ambientOcclusionRadius: this.options.ambientOcclusionRadius,\n      ambientOcclusionBias: this.options.ambientOcclusionBias,\n      ambientOcclusionMode: this.options.ambientOcclusionMode,\n      ambientOcclusionIntensityScale: this.options.ambientOcclusionIntensityScale,\n      ambientOcclusionIntensityShift: this.options.ambientOcclusionIntensityShift,\n      ambientOcclusionQuality: this.options.ambientOcclusionQuality,\n      stateSlots,\n      ...options,\n    });\n    this.renderer = renderer;\n    this._applyPendingRendererProps();\n    this._applyPositionPipelineToRenderer();\n    this._attachDensityLayer();\n    this._refreshUIBindings();\n    this._applyCachedStateStyles();\n    if (this._hoverStyleFromHighlight === true) this._copyHighlightStyleToHover();\n    this.attributeTracker?.destroy?.();\n    this.attributeTracker = new AttributeTracker(this.renderer);\n    this.attributeTracker.resize(this.layers.size);\n    if (typeof this.renderer.resize === 'function') {\n      this.renderer.resize(this.layers.size);\n    }\n    this._reapplyBehaviorRendererBindings();\n    if (this.mappersDirty) {\n      this._applyMappersSafely();\n    }\n    if (this.renderer?.camera?.setChangeListener) {\n      this.renderer.camera.setChangeListener((detail) => {\n        this.scheduler.requestRender();\n        if (detail?.origin === 'interaction') {\n          this._disableAutomaticCameraControlFromInteraction(detail);\n        }\n        this._scheduleCameraMove(detail);\n        this.debug.log('helios', 'Camera change requested render');\n      });\n    }\n    this._applyPickingConfig();\n    this._labels?.requestFullReselect?.('renderer-created');\n  }\n\n  _resetMappersToDefault(network = this.network) {\n    const defaults = createDefaultMappers(network);\n    this.nodeMapper = new MapperCollection('node', network, this.markMappersDirty, this.debug);\n    this.edgeMapper = new MapperCollection('edge', network, this.markMappersDirty, this.debug);\n    if (defaults?.nodeMapper) this.nodeMapper.setDefault(defaults.nodeMapper);\n    if (defaults?.edgeMapper) this.edgeMapper.setDefault(defaults.edgeMapper);\n    this.mappersDirty = true;\n  }\n\n  _applyMappersSafely() {\n    if (!this.mappersDirty) return true;\n    if (!this.visuals) return false;\n    try {\n      const nodeMapper = this.nodeMapper.toCombinedMapper();\n      const edgeMapper = this.edgeMapper.toCombinedMapper({ nodeMapper });\n      this.visuals.applyMappers({ nodeMapper, edgeMapper });\n      this.mappersDirty = false;\n      return true;\n    } catch (error) {\n      this.debug?.log?.('mapper', 'Failed to apply mappers; falling back to defaults', {\n        error,\n        nodeCount: this.network?.nodeCount ?? 0,\n        edgeCount: this.network?.edgeCount ?? 0,\n      });\n      console.warn('Helios: failed to apply active mappers; falling back to default mappers.', error);\n      try {\n        this._resetMappersToDefault(this.network);\n        const nodeMapper = this.nodeMapper.toCombinedMapper();\n        const edgeMapper = this.edgeMapper.toCombinedMapper({ nodeMapper });\n        this.visuals.applyMappers({ nodeMapper, edgeMapper });\n        this.mappersDirty = false;\n        return true;\n      } catch (fallbackError) {\n        // Last resort: avoid crashing the scheduler loop.\n        this.mappersDirty = false;\n        console.warn('Helios: failed to apply default mappers after fallback.', fallbackError);\n        // eslint-disable-next-line no-console\n        console.error('Failed to apply default mappers after fallback', fallbackError);\n        return false;\n      }\n    }\n  }\n\n  _ensureGraphFilterState() {\n    if (this._graphFilterState) return this._graphFilterState;\n    const baseNetwork = this.network ?? null;\n    this._graphFilterState = {\n      enabled: false,\n      scope: GRAPH_FILTER_SCOPE_RENDER,\n      options: null,\n      signature: null,\n      nodeIndices: null,\n      edgeIndices: null,\n      nodeSelector: null,\n      edgeSelector: null,\n      filteredNetwork: null,\n      renderNetwork: baseNetwork,\n      layoutNetwork: baseNetwork,\n      version: 0,\n      stats: null,\n      lastError: null,\n    };\n    return this._graphFilterState;\n  }\n\n  _disposeSelector(selector) {\n    if (!selector || typeof selector !== 'object') return;\n    try {\n      selector.dispose?.();\n    } catch (error) {\n      warnOnce(\n        this,\n        'graph-filter-selector-dispose',\n        'Helios: failed to dispose graph filter selector.',\n        { error },\n      );\n    }\n  }\n\n  _disposeGraphFilterSelectors(state) {\n    if (!state || typeof state !== 'object') return;\n    this._disposeSelector(state.nodeSelector);\n    this._disposeSelector(state.edgeSelector);\n    state.nodeSelector = null;\n    state.edgeSelector = null;\n  }\n\n  _captureGraphFilterSignature(state) {\n    const network = this.network ?? null;\n    let topologyNode = 0;\n    let topologyEdge = 0;\n    if (typeof network?.getTopologyVersions === 'function') {\n      try {\n        const versions = network.getTopologyVersions() ?? {};\n        topologyNode = safeNumber(versions.node, 0);\n        topologyEdge = safeNumber(versions.edge, 0);\n      } catch (error) {\n        warnOnce(\n          this,\n          'graph-filter-topology-versions',\n          'Helios: failed to read graph-filter topology versions; using zero versions.',\n          { error },\n        );\n        topologyNode = 0;\n        topologyEdge = 0;\n      }\n    } else {\n      topologyNode = safeNumber(network?.nodeCount, 0);\n      topologyEdge = safeNumber(network?.edgeCount, 0);\n    }\n    const options = state?.options ?? {};\n    const nodeSelector = options?.nodeSelector ?? null;\n    const edgeSelector = options?.edgeSelector ?? null;\n    const nodeSelection = options?.nodeSelection ?? null;\n    const edgeSelection = options?.edgeSelection ?? null;\n    const minComponentSize = Math.max(0, Math.floor(Number(options?.minComponentSize) || 0));\n    return {\n      topologyNode,\n      topologyEdge,\n      minComponentSize,\n      nodeSelectorRef: nodeSelector,\n      edgeSelectorRef: edgeSelector,\n      nodeSelectorVersion: safeNumber(nodeSelector?.version, 0),\n      edgeSelectorVersion: safeNumber(edgeSelector?.version, 0),\n      nodeSelectionRef: nodeSelection,\n      edgeSelectionRef: edgeSelection,\n      nodeSelectionVersion: safeNumber(nodeSelection?.version, 0),\n      edgeSelectionVersion: safeNumber(edgeSelection?.version, 0),\n      nodeSelectionLength: safeLength(nodeSelection),\n      edgeSelectionLength: safeLength(edgeSelection),\n    };\n  }\n\n  _isSameGraphFilterSignature(a, b) {\n    if (!a || !b) return false;\n    return (\n      a.topologyNode === b.topologyNode\n      && a.topologyEdge === b.topologyEdge\n      && a.minComponentSize === b.minComponentSize\n      && a.nodeSelectorRef === b.nodeSelectorRef\n      && a.edgeSelectorRef === b.edgeSelectorRef\n      && a.nodeSelectorVersion === b.nodeSelectorVersion\n      && a.edgeSelectorVersion === b.edgeSelectorVersion\n      && a.nodeSelectionRef === b.nodeSelectionRef\n      && a.edgeSelectionRef === b.edgeSelectionRef\n      && a.nodeSelectionVersion === b.nodeSelectionVersion\n      && a.edgeSelectionVersion === b.edgeSelectionVersion\n      && a.nodeSelectionLength === b.nodeSelectionLength\n      && a.edgeSelectionLength === b.edgeSelectionLength\n    );\n  }\n\n  _createFilteredNetworkProxy({\n    baseNetwork,\n    nodeIndices = null,\n    edgeIndices = null,\n    nodeSelector = null,\n    edgeSelector = null,\n    version,\n  }) {\n    const fallbackNodeIndices = nodeIndices instanceof Uint32Array ? nodeIndices : new Uint32Array(0);\n    const fallbackEdgeIndices = edgeIndices instanceof Uint32Array ? edgeIndices : new Uint32Array(0);\n    const selectorNode = nodeSelector && typeof nodeSelector === 'object' ? nodeSelector : null;\n    const selectorEdge = edgeSelector && typeof edgeSelector === 'object' ? edgeSelector : null;\n    const emptyIndices = new Uint32Array(0);\n    const orderVersions = { node: 0, edge: 0 };\n    const dirtyRanges = { node: null, edge: null };\n    const currentVersion = (scope) => `${safeNumber(version, 0)}:${orderVersions[scope] ?? 0}`;\n    const mergeDirtyRange = (scope, start, count) => {\n      if (!(count > 0)) return null;\n      const current = dirtyRanges[scope] ?? null;\n      const nextStart = Math.max(0, Math.floor(Number(start) || 0));\n      const nextEnd = nextStart + Math.max(0, Math.floor(Number(count) || 0));\n      const mergedStart = current ? Math.min(current.start, nextStart) : nextStart;\n      const mergedEnd = current ? Math.max(current.start + current.count, nextEnd) : nextEnd;\n      const merged = {\n        start: mergedStart,\n        count: mergedEnd - mergedStart,\n        version: currentVersion(scope),\n      };\n      dirtyRanges[scope] = merged;\n      return merged;\n    };\n    const buildSelectorView = (selector, fallback) => {\n      if (!selector) {\n        try {\n          fallback.version = currentVersion(fallback === fallbackNodeIndices ? 'node' : 'edge');\n        } catch (_) {\n          // ignore non-extensible typed arrays\n        }\n        return fallback;\n      }\n      if ((baseNetwork?._bufferSessionDepth ?? 0) <= 0) {\n        throw new Error('Cannot access filtered active indices outside buffer access');\n      }\n      const count = Math.max(0, Math.floor(Number(selector.count) || 0));\n      const dataPointer = Math.max(0, Math.floor(Number(selector.dataPointer) || 0));\n      const heap = selector.module?.HEAPU32?.buffer ?? null;\n      if (!count || !dataPointer || !heap) return fallback;\n      const view = new Uint32Array(heap, dataPointer, count);\n      try {\n        view.version = currentVersion(selector === selectorNode ? 'node' : 'edge');\n      } catch (_) {\n        // ignore non-extensible typed arrays\n      }\n      return view;\n    };\n    const copySelection = (scope, target) => {\n      if (!(target instanceof Uint32Array)) {\n        throw new Error(`${scope} buffer must be a Uint32Array`);\n      }\n      const wasmHeap = baseNetwork?.module?.HEAPU32?.buffer ?? null;\n      if (wasmHeap && target.buffer !== wasmHeap) {\n        throw new Error(`${scope} buffer must live in the WASM heap (module.HEAPU32.buffer)`);\n      }\n      const selector = scope === 'node' ? selectorNode : selectorEdge;\n      const fallback = scope === 'node' ? fallbackNodeIndices : fallbackEdgeIndices;\n      const countFromSelector = safeNumber(selector?.count, NaN);\n      const count = Number.isFinite(countFromSelector) ? Math.max(0, Math.floor(countFromSelector)) : fallback.length;\n      if (count > target.length) return count;\n      if (!count) return 0;\n\n      const dataPointer = safeNumber(selector?.dataPointer, 0);\n      const sourceHeap = selector?.module?.HEAPU32?.buffer ?? null;\n      if (dataPointer > 0 && sourceHeap) {\n        const view = new Uint32Array(sourceHeap, dataPointer, count);\n        target.set(view);\n        return count;\n      }\n      target.set(fallback.subarray(0, count));\n      return count;\n    };\n    const materializeSelection = (scope) => {\n      const selector = scope === 'node' ? selectorNode : selectorEdge;\n      const fallback = scope === 'node' ? fallbackNodeIndices : fallbackEdgeIndices;\n      if (typeof selector?.toTypedArray === 'function') {\n        return selector.toTypedArray();\n      }\n      return fallback.slice();\n    };\n    const fillSelection = (scope, indices) => {\n      const selector = scope === 'node' ? selectorNode : selectorEdge;\n      if (!selector || typeof selector.fillFromArray !== 'function') return false;\n      selector.fillFromArray(baseNetwork, indices);\n      return true;\n    };\n    const promoteSelectionToEnd = (scope, indices) => {\n      const requested = new Set(Array.from(indices || [])\n        .map((value) => Number(value))\n        .filter((value) => Number.isInteger(value) && value >= 0));\n      const current = materializeSelection(scope);\n      if (!requested.size || !current.length) {\n        return { changed: false, start: 0, count: 0, version: currentVersion(scope) };\n      }\n      const kept = [];\n      const promoted = [];\n      for (let i = 0; i < current.length; i += 1) {\n        const value = current[i] >>> 0;\n        if (requested.has(value)) promoted.push(value);\n        else kept.push(value);\n      }\n      if (!promoted.length) {\n        return { changed: false, start: 0, count: 0, version: currentVersion(scope) };\n      }\n      const next = Uint32Array.from([...kept, ...promoted]);\n      let first = -1;\n      let last = -1;\n      for (let i = 0; i < next.length; i += 1) {\n        if (next[i] !== current[i]) {\n          if (first < 0) first = i;\n          last = i;\n        }\n      }\n      if (first < 0 || !fillSelection(scope, next)) {\n        return { changed: false, start: 0, count: 0, version: currentVersion(scope) };\n      }\n      orderVersions[scope] += 1;\n      const changed = mergeDirtyRange(scope, first, last - first + 1);\n      return { changed: true, ...changed };\n    };\n    const normalizeDirection = (value) => {\n      if (typeof value === 'number' && Number.isFinite(value)) {\n        if (value === 0) return 'out';\n        if (value === 1) return 'in';\n        return 'both';\n      }\n      const normalized = String(value ?? 'both').trim().toLowerCase();\n      if (normalized === 'out' || normalized === 'outgoing') return 'out';\n      if (normalized === 'in' || normalized === 'incoming') return 'in';\n      return 'both';\n    };\n    const resolveIncidentEdges = (nodeIds, direction) => {\n      const nodes = new Set(Array.from(nodeIds || [])\n        .map((value) => Number(value))\n        .filter((value) => Number.isInteger(value) && value >= 0));\n      if (!nodes.size) return emptyIndices;\n      const activeEdges = materializeSelection('edge');\n      if (!activeEdges.length) return emptyIndices;\n      const mode = normalizeDirection(direction);\n      const result = [];\n      baseNetwork.withBufferAccess(() => {\n        const endpoints = baseNetwork.edgesView ?? null;\n        if (!endpoints) return;\n        for (let i = 0; i < activeEdges.length; i += 1) {\n          const edge = activeEdges[i] >>> 0;\n          const source = endpoints[edge * 2] >>> 0;\n          const target = endpoints[(edge * 2) + 1] >>> 0;\n          if (\n            (mode !== 'in' && nodes.has(source))\n            || (mode !== 'out' && nodes.has(target))\n          ) {\n            result.push(edge);\n          }\n        }\n      }, { edgesView: true });\n      return result.length ? Uint32Array.from(result) : emptyIndices;\n    };\n    return new Proxy(baseNetwork, {\n      get(target, property) {\n        if (property === 'nodeIndices') return buildSelectorView(selectorNode, fallbackNodeIndices);\n        if (property === 'edgeIndices') return buildSelectorView(selectorEdge, fallbackEdgeIndices);\n        if (property === 'nodeCount') {\n          return selectorNode\n            ? Math.max(0, Math.floor(Number(selectorNode?.count) || 0))\n            : fallbackNodeIndices.length;\n        }\n        if (property === 'edgeCount') {\n          return selectorEdge\n            ? Math.max(0, Math.floor(Number(selectorEdge?.count) || 0))\n            : fallbackEdgeIndices.length;\n        }\n        if (property === '__heliosFilteredNodeSelector') return selectorNode;\n        if (property === '__heliosFilteredEdgeSelector') return selectorEdge;\n        if (property === '__heliosFilterVersion') return safeNumber(version, 0);\n        if (property === '__heliosBaseNetwork') return target;\n        if (property === 'writeActiveNodes') {\n          return (buffer) => copySelection('node', buffer);\n        }\n        if (property === 'writeActiveEdges') {\n          return (buffer) => copySelection('edge', buffer);\n        }\n        if (property === 'promoteActiveNodesToRenderEnd') {\n          return (indices) => promoteSelectionToEnd('node', indices);\n        }\n        if (property === 'promoteActiveEdgesToRenderEnd') {\n          return (indices) => promoteSelectionToEnd('edge', indices);\n        }\n        if (property === 'promoteActiveEdgesForNodesToRenderEnd') {\n          return (indices, options = {}) => promoteSelectionToEnd('edge', resolveIncidentEdges(indices, options.direction ?? 'both'));\n        }\n        if (property === 'getActiveIndexDirtyRange') {\n          return (scope) => {\n            if (scope === 'node' || scope === 'edge') {\n              return dirtyRanges[scope] ? { ...dirtyRanges[scope] } : null;\n            }\n            return null;\n          };\n        }\n        if (property === 'getTopologyVersions') {\n          return () => {\n            let raw = { node: 0, edge: 0 };\n            if (typeof target.getTopologyVersions === 'function') {\n              try {\n                raw = target.getTopologyVersions() ?? raw;\n              } catch (error) {\n                warnOnce(\n                  this,\n                  'filtered-network-topology-versions',\n                  'Helios: filtered network proxy failed to read topology versions; using zero versions.',\n                  { error },\n                );\n                raw = { node: 0, edge: 0 };\n              }\n            }\n            return {\n              node: computeFilterTopologyVersion(raw.node, version),\n              edge: computeFilterTopologyVersion(raw.edge, version),\n            };\n          };\n        }\n        const value = Reflect.get(target, property, target);\n        if (typeof value === 'function') {\n          return value.bind(target);\n        }\n        return value;\n      },\n      set(target, property, value) {\n        return Reflect.set(target, property, value, target);\n      },\n    });\n  }\n\n  _refreshGraphFilterNetworks({ force = false, throwOnError = false } = {}) {\n    const state = this._ensureGraphFilterState();\n    const baseNetwork = this.network ?? null;\n    if (!baseNetwork || state.enabled !== true || !state.options) {\n      this._disposeGraphFilterSelectors(state);\n      state.signature = null;\n      state.nodeIndices = null;\n      state.edgeIndices = null;\n      state.filteredNetwork = null;\n      state.renderNetwork = baseNetwork;\n      state.layoutNetwork = baseNetwork;\n      state.stats = null;\n      state.lastError = null;\n      if (this._syncLayoutNetworkFromFilter()) {\n        this._requestLayoutReheat('filter-sync');\n        this.scheduler?.requestLayout?.('filter-sync');\n      }\n      return state;\n    }\n\n    const nextSignature = this._captureGraphFilterSignature(state);\n    const unchanged = !force && this._isSameGraphFilterSignature(nextSignature, state.signature);\n    if (unchanged) {\n      state.renderNetwork = state.filteredNetwork ?? baseNetwork;\n      state.layoutNetwork = state.scope === GRAPH_FILTER_SCOPE_RENDER_LAYOUT\n        ? (state.renderNetwork ?? baseNetwork)\n        : baseNetwork;\n      if (this._syncLayoutNetworkFromFilter()) {\n        this._requestLayoutReheat('filter-sync');\n        this.scheduler?.requestLayout?.('filter-sync');\n      }\n      return state;\n    }\n\n    let pendingNodeSelector = null;\n    let pendingEdgeSelector = null;\n    try {\n      if (typeof baseNetwork.filterSubgraph !== 'function') {\n        throw new Error('Current helios-network build does not support filterSubgraph(options)');\n      }\n      const previousNodeSelector = state.nodeSelector ?? null;\n      const previousEdgeSelector = state.edgeSelector ?? null;\n      const result = baseNetwork.filterSubgraph({ ...state.options, asSelector: true });\n      const hasSelectorResult = Boolean(\n        result\n        && typeof result === 'object'\n        && result.nodes\n        && typeof result.nodes.count === 'number'\n        && result.edges\n        && typeof result.edges.count === 'number',\n      );\n      const nextNodeSelector = hasSelectorResult ? result.nodes : null;\n      const nextEdgeSelector = hasSelectorResult ? result.edges : null;\n      pendingNodeSelector = nextNodeSelector;\n      pendingEdgeSelector = nextEdgeSelector;\n      const nodeIndices = hasSelectorResult\n        ? null\n        : (result?.nodeIndices instanceof Uint32Array ? result.nodeIndices : new Uint32Array(0));\n      const edgeIndices = hasSelectorResult\n        ? null\n        : (result?.edgeIndices instanceof Uint32Array ? result.edgeIndices : new Uint32Array(0));\n      state.version = bumpVersionCounter(state.version);\n      state.nodeIndices = nodeIndices;\n      state.edgeIndices = edgeIndices;\n      state.nodeSelector = nextNodeSelector;\n      state.edgeSelector = nextEdgeSelector;\n      state.filteredNetwork = this._createFilteredNetworkProxy({\n        baseNetwork,\n        nodeIndices,\n        edgeIndices,\n        nodeSelector: nextNodeSelector,\n        edgeSelector: nextEdgeSelector,\n        version: state.version,\n      });\n      state.renderNetwork = state.filteredNetwork;\n      state.layoutNetwork = state.scope === GRAPH_FILTER_SCOPE_RENDER_LAYOUT\n        ? state.filteredNetwork\n        : baseNetwork;\n      state.signature = nextSignature;\n      state.lastError = null;\n      state.stats = {\n        nodeCount: nextNodeSelector\n          ? Math.max(0, Math.floor(Number(nextNodeSelector?.count) || 0))\n          : nodeIndices.length,\n        edgeCount: nextEdgeSelector\n          ? Math.max(0, Math.floor(Number(nextEdgeSelector?.count) || 0))\n          : edgeIndices.length,\n        baseNodeCount: Math.max(0, Math.floor(Number(baseNetwork?.nodeCount) || 0)),\n        baseEdgeCount: Math.max(0, Math.floor(Number(baseNetwork?.edgeCount) || 0)),\n      };\n      if (previousNodeSelector && previousNodeSelector !== nextNodeSelector) {\n        this._disposeSelector(previousNodeSelector);\n      }\n      if (previousEdgeSelector && previousEdgeSelector !== nextEdgeSelector) {\n        this._disposeSelector(previousEdgeSelector);\n      }\n      pendingNodeSelector = null;\n      pendingEdgeSelector = null;\n      if (this._syncLayoutNetworkFromFilter()) {\n        this._requestLayoutReheat('filter-sync');\n        this.scheduler?.requestLayout?.('filter-sync');\n      }\n      return state;\n    } catch (error) {\n      if (throwOnError) {\n        if (pendingNodeSelector && pendingNodeSelector !== state.nodeSelector) {\n          this._disposeSelector(pendingNodeSelector);\n        }\n        if (pendingEdgeSelector && pendingEdgeSelector !== state.edgeSelector) {\n          this._disposeSelector(pendingEdgeSelector);\n        }\n        throw error;\n      }\n      this._disposeGraphFilterSelectors(state);\n      state.lastError = error;\n      state.signature = nextSignature;\n      state.nodeIndices = null;\n      state.edgeIndices = null;\n      state.nodeSelector = null;\n      state.edgeSelector = null;\n      state.filteredNetwork = null;\n      state.renderNetwork = baseNetwork;\n      state.layoutNetwork = baseNetwork;\n      state.stats = null;\n      if (this._syncLayoutNetworkFromFilter()) {\n        this._requestLayoutReheat('filter-sync');\n        this.scheduler?.requestLayout?.('filter-sync');\n      }\n      warnOnce(\n        this,\n        'graph-filter-refresh',\n        'Helios: graph filter refresh failed; falling back to the base network.',\n        { error },\n      );\n      this.debug?.log?.('helios', 'Graph filter refresh failed; falling back to base network', { error });\n      return state;\n    }\n  }\n\n  _syncLayoutNetworkFromFilter() {\n    const layout = this._layout ?? null;\n    if (!layout || typeof layout !== 'object') return false;\n    const nextLayoutNetwork = this._ensureGraphFilterState().layoutNetwork ?? this.network ?? null;\n    if (!nextLayoutNetwork || layout.network === nextLayoutNetwork) return false;\n    layout.network = nextLayoutNetwork;\n    layout.syncAutoSettingsForNetwork?.(nextLayoutNetwork);\n    this._enforcePositionSourcePolicy(layout, { resetInterpolation: false });\n    return true;\n  }\n\n  _afterGraphFilterMutation(reason = 'filter') {\n    this._refreshGraphFilterNetworks({ force: false, throwOnError: false });\n    const layoutNetworkChanged = this._syncLayoutNetworkFromFilter();\n    const filterScope = this._ensureGraphFilterState().scope;\n    this._markAutoFitDirty(false);\n    if (layoutNetworkChanged || filterScope === GRAPH_FILTER_SCOPE_RENDER_LAYOUT) {\n      this._requestLayoutReheat('filter');\n    }\n    this.scheduler?.requestGeometry?.();\n    if (layoutNetworkChanged) {\n      this.scheduler?.requestLayout?.('filter');\n    } else if (filterScope === GRAPH_FILTER_SCOPE_RENDER_LAYOUT) {\n      this.scheduler?.requestLayout?.('filter');\n    }\n    this.scheduler?.requestRender?.();\n    this._labels?.requestFullReselect?.(`graph-filter:${reason}`);\n    this.emit(EVENTS.GRAPH_FILTER_CHANGED, this.getGraphFilter());\n  }\n\n  _getRenderNetwork() {\n    return this._refreshGraphFilterNetworks().renderNetwork ?? this.network ?? null;\n  }\n\n  _getLayoutNetwork() {\n    return this._refreshGraphFilterNetworks().layoutNetwork ?? this.network ?? null;\n  }\n\n  /**\n   * Return the active graph filter state and filtered graph sizes.\n   *\n   * @public\n   * @apiSection Filtering And State\n   * @returns {object} Filter state with `enabled`, `scope`, normalized\n   * `options`, filtered/base node and edge counts, and the last filter error.\n   * @example\n   * const state = helios.getGraphFilter();\n   * if (state.enabled) console.log(state.nodeCount, state.edgeCount);\n   */\n  getGraphFilter() {\n    const state = this._refreshGraphFilterNetworks();\n    const options = state.options ? { ...state.options } : null;\n    if (options) {\n      options.scope = state.scope;\n    }\n    return {\n      enabled: state.enabled === true,\n      scope: state.scope ?? GRAPH_FILTER_SCOPE_RENDER,\n      options,\n      nodeCount: Math.max(0, Math.floor(Number(state.stats?.nodeCount ?? state.renderNetwork?.nodeCount) || 0)),\n      edgeCount: Math.max(0, Math.floor(Number(state.stats?.edgeCount ?? state.renderNetwork?.edgeCount) || 0)),\n      baseNodeCount: Math.max(0, Math.floor(Number(state.stats?.baseNodeCount ?? this.network?.nodeCount) || 0)),\n      baseEdgeCount: Math.max(0, Math.floor(Number(state.stats?.baseEdgeCount ?? this.network?.edgeCount) || 0)),\n      error: state.lastError ? (state.lastError.message ?? String(state.lastError)) : null,\n    };\n  }\n\n  /**\n   * Read or replace the active graph filter.\n   *\n   * @public\n   * @apiSection Filtering And State\n   * @param {object|false|null} [options] - Filter options, `false`, or `null`.\n   * Omit the argument to read the current state.\n   * @returns {object|Helios} Current filter state when called without\n   * arguments, otherwise this Helios instance for chaining.\n   * @example\n   * helios.graphFilter({\n   *   nodeRules: [{ attribute: 'degree', operator: '>=', value: 3 }],\n   *   scope: 'render',\n   * });\n   */\n  graphFilter(options) {\n    if (arguments.length === 0) {\n      return this.getGraphFilter();\n    }\n    if (options == null || options === false || options?.enabled === false) {\n      return this.clearGraphFilter();\n    }\n    return this.setGraphFilter(options);\n  }\n\n  /**\n   * Apply a render or render-and-layout graph filter.\n   *\n   * @public\n   * @apiSection Filtering And State\n   * @param {object|HeliosFilter} options - Filter rule set or reusable\n   * `HeliosFilter` instance.\n   * @param {Array<object>} [options.nodeRules] - Node rules to apply.\n   * @param {Array<object>} [options.edgeRules] - Edge rules to apply.\n   * @param {'render'|'render+layout'} [options.scope] - Filter scope.\n   * @returns {Helios} This Helios instance.\n   * @remarks `render` hides filtered items without changing dynamic layout\n   * forces. `render+layout` also feeds the filtered graph to the active layout.\n   * @example\n   * helios.setGraphFilter({\n   *   nodeRules: [{ attribute: 'group', operator: '==', value: 'core' }],\n   *   scope: 'render+layout',\n   * });\n   */\n  setGraphFilter(options = {}) {\n    if (options == null || options === false) {\n      return this.clearGraphFilter();\n    }\n    let preserveActiveFilterRef = false;\n    if (options instanceof HeliosFilter) {\n      this._activeHeliosFilter = options;\n      options = options.toGraphFilterOptions();\n      preserveActiveFilterRef = true;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('setGraphFilter(options) expects an object or null');\n    }\n    if (!preserveActiveFilterRef) {\n      this._activeHeliosFilter = null;\n    }\n    const scope = normalizeGraphFilterScope(options.scope, this._ensureGraphFilterState().scope);\n    const filterOptions = normalizeGraphFilterOptions(options);\n    if (!hasGraphFilterCriteria(filterOptions)) {\n      return this.clearGraphFilter();\n    }\n\n    const state = this._ensureGraphFilterState();\n    const previous = { ...state };\n    state.enabled = true;\n    state.scope = scope;\n    state.options = filterOptions;\n    state.signature = null;\n    state.lastError = null;\n\n    try {\n      this._refreshGraphFilterNetworks({ force: true, throwOnError: true });\n    } catch (error) {\n      Object.assign(state, previous);\n      throw error;\n    }\n    this._afterGraphFilterMutation('set');\n    return this;\n  }\n\n  /**\n   * Activate a reusable `HeliosFilter` instance.\n   *\n   * @public\n   * @apiSection Filtering And State\n   * @param {HeliosFilter|null|false} filter - Filter instance to activate, or\n   * `null`/`false` to clear filtering.\n   * @returns {Helios} This Helios instance.\n   * @example\n   * const filter = new HeliosFilter({ nodeRules: [{ attribute: 'kind', value: 'paper' }] });\n   * helios.activateHeliosFilter(filter);\n   */\n  activateHeliosFilter(filter) {\n    if (filter == null || filter === false) {\n      this._activeHeliosFilter = null;\n      return this.clearGraphFilter();\n    }\n    if (!(filter instanceof HeliosFilter)) {\n      throw new TypeError('activateHeliosFilter(filter) expects a HeliosFilter instance or null');\n    }\n    return this.setGraphFilter(filter);\n  }\n\n  /**\n   * Return the reusable filter currently attached to this view.\n   *\n   * @public\n   * @apiSection Filtering And State\n   * @returns {HeliosFilter|null} Active reusable filter, if one was supplied.\n   */\n  getActiveHeliosFilter() {\n    return this._activeHeliosFilter ?? null;\n  }\n\n  /**\n   * Re-run the active reusable filter after its rules or source data changed.\n   *\n   * @public\n   * @apiSection Filtering And State\n   * @returns {Helios} This Helios instance.\n   */\n  reapplyActiveHeliosFilter() {\n    if (!this._activeHeliosFilter) return this;\n    return this.activateHeliosFilter(this._activeHeliosFilter);\n  }\n\n  /**\n   * Remove the active graph filter and restore the base graph view.\n   *\n   * @public\n   * @apiSection Filtering And State\n   * @returns {Helios} This Helios instance.\n   * @example\n   * helios.clearGraphFilter();\n   */\n  clearGraphFilter() {\n    const state = this._ensureGraphFilterState();\n    const hadFilter = state.enabled === true || state.filteredNetwork != null || state.options != null;\n    this._disposeGraphFilterSelectors(state);\n    state.enabled = false;\n    state.scope = GRAPH_FILTER_SCOPE_RENDER;\n    state.options = null;\n    state.signature = null;\n    state.nodeIndices = null;\n    state.edgeIndices = null;\n    state.nodeSelector = null;\n    state.edgeSelector = null;\n    state.filteredNetwork = null;\n    state.renderNetwork = this.network ?? null;\n    state.layoutNetwork = this.network ?? null;\n    state.stats = null;\n    state.lastError = null;\n    if (hadFilter) {\n      this._afterGraphFilterMutation('clear');\n    }\n    return this;\n  }\n\n  /**\n   * Replace the graph store while preserving visualization state by default.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {import('helios-network').default} nextNetwork - Replacement graph.\n   * @param {object} [options] - Replacement behavior options.\n   * @param {boolean} [options.disposeOld=true] - Dispose the previous network.\n   * @param {boolean} [options.keepCamera=true] - Preserve the current camera.\n   * @param {boolean} [options.keepMappers=true] - Preserve mapper settings.\n   * @param {boolean} [options.markNetworkDirty=true] - Mark persistence network data dirty after replacement.\n   * @returns {Promise<Helios>} This Helios instance after the renderer and\n   * layout are rebound to the new graph.\n   * @example\n   * await helios.replaceNetwork(nextNetwork, { keepCamera: false });\n   */\n  async replaceNetwork(nextNetwork, options = {}) {\n    if (!nextNetwork) {\n      throw new Error('replaceNetwork requires a helios-network instance');\n    }\n    if (options.allowDuringInitialize !== true) {\n      await this.ready;\n    }\n\n    const disposeOld = options.disposeOld !== false;\n    const keepCamera = options.keepCamera !== false;\n    const keepMappers = options.keepMappers !== false;\n    const recreateRenderer = options.recreateRenderer !== false;\n    const frameNetwork = options.frame ?? (!keepCamera);\n    const layoutOption = options.layout ?? this.options.layout;\n    if (isLayoutInstance(layoutOption)) {\n      throw new Error('replaceNetwork requires options.layout when Helios was constructed with a layout instance');\n    }\n    const activePositionDelegate =\n      this._positionsConfig?.source === 'delegate' ? this._positionsConfig.delegate : null;\n\n    const wasRunning = !this.manualRendering && this.scheduler?.running === true;\n    const previousLayoutState = typeof this.scheduler?.getLayoutState === 'function'\n      ? this.scheduler.getLayoutState()\n      : (this.scheduler?.layoutEnabled !== false ? 'running' : 'stopped');\n    const cameraState = keepCamera ? this._snapshotCameraState() : null;\n    const attributeConfig = this.attributeTracker\n      ? { node: this.attributeTracker.nodeAttribute, edge: this.attributeTracker.edgeAttribute, options: { ...this.attributeTracker.options } }\n      : null;\n    const pickingConfig = {\n      node: this._picking?.node?.enabled === true,\n      edge: this._picking?.edge?.enabled === true,\n      options: { ...(this._picking?.options ?? {}) },\n    };\n\n    this._detachPositionDelegate(activePositionDelegate);\n\n    this.scheduler?.stop?.();\n    this._detachPickingListeners();\n    this.indexPickingTracker?.destroy?.();\n    this.indexPickingTracker = null;\n    this.attributeTracker?.destroy?.();\n    this.attributeTracker = null;\n    this._resetHover?.('network-replaced');\n\n    if (recreateRenderer) {\n      this.renderer?.destroy?.();\n      this.renderer = null;\n    }\n\n    this._layout?.dispose?.();\n\n    const prevNetwork = this.network;\n    this.network = nextNetwork;\n    this._ensureGraphFilterState().renderNetwork = nextNetwork;\n    this._ensureGraphFilterState().layoutNetwork = nextNetwork;\n    this._refreshGraphFilterNetworks({ force: true, throwOnError: false });\n    this.visuals = new VisualAttributes(nextNetwork, this.debug);\n    this.visuals.seedMissingPositions(resolveSeedBoundsForLayout(layoutOption, this.layers.size, this.options.mode));\n    this._resetInterpolationRuntime({ keepIntervalHistory: false });\n    this._labels?.requestFullReselect?.('network-replaced');\n\n    if (options.mappers === null) {\n      this.nodeMapper = new MapperCollection('node', nextNetwork, this.markMappersDirty, this.debug);\n      this.edgeMapper = new MapperCollection('edge', nextNetwork, this.markMappersDirty, this.debug);\n      this.mappersDirty = false;\n    } else if (options.mappers) {\n      this.nodeMapper = new MapperCollection('node', nextNetwork, this.markMappersDirty, this.debug);\n      this.edgeMapper = new MapperCollection('edge', nextNetwork, this.markMappersDirty, this.debug);\n      if (options.mappers?.nodeMapper) this.nodeMapper.setDefault(options.mappers.nodeMapper);\n      if (options.mappers?.edgeMapper) this.edgeMapper.setDefault(options.mappers.edgeMapper);\n      this.mappersDirty = true;\n    } else if (keepMappers) {\n      this.nodeMapper = cloneMapperCollection(this.nodeMapper, nextNetwork, this.markMappersDirty, this.debug);\n      this.edgeMapper = cloneMapperCollection(this.edgeMapper, nextNetwork, this.markMappersDirty, this.debug);\n      this.mappersDirty = true;\n    } else {\n      this._resetMappersToDefault(nextNetwork);\n    }\n\n    this.firstGeometryUpdateComplete = false;\n\n    this._layout = this._bindLayoutToHelios(this.createLayout(layoutOption));\n    this._syncLayoutNetworkFromFilter();\n    if (this._layout?.setUpdateListener) {\n      this._layout.setUpdateListener((payload) => this._handleLayoutUpdate(payload));\n    }\n    await this._layout?.initialize?.();\n    this._layout?.resize?.(this.layers.size);\n    this._activateLayoutAfterNetworkReplace(previousLayoutState, 'network-replaced');\n\n    if (recreateRenderer) {\n      await this._createRendererAndTrackers();\n      this._applyPositionPipelineToRenderer();\n      this._refreshUIBindings();\n      if (frameNetwork) {\n        this.requestFrameNetwork({ paddingPx: options.framePaddingPx ?? 24 });\n      } else {\n        this._restoreCameraState(cameraState);\n      }\n    } else if (this.renderer) {\n      this.attributeTracker = new AttributeTracker(this.renderer);\n      this.attributeTracker.resize(this.layers.size);\n      this._applyPickingConfig();\n      this._applyPositionPipelineToRenderer();\n      this._refreshUIBindings();\n      this._reapplyBehaviorRendererBindings();\n      if (frameNetwork) {\n        this.requestFrameNetwork({ paddingPx: options.framePaddingPx ?? 24 });\n      } else {\n        this._restoreCameraState(cameraState);\n      }\n    }\n\n    // Apply visuals immediately so first render and exports are non-empty even if the scheduler\n    // hasn't ticked yet; also catches incompatible mappers early.\n    this._applyMappersSafely();\n\n    if (attributeConfig && this.attributeTracker) {\n      this.enableAttributeTracking(attributeConfig.node, attributeConfig.edge, attributeConfig.options);\n    }\n    if (pickingConfig.node) this.enableNodePicking(pickingConfig.options);\n    if (pickingConfig.edge) this.enableEdgePicking(pickingConfig.options);\n\n    if (wasRunning) {\n      this.scheduler.start();\n    }\n    this.scheduler.requestGeometry();\n    this.scheduler.requestRender();\n    this._resetCameraDelegateSnapshot();\n    this._invalidateCameraOrbitReference();\n    this._markAutoFitDirty(false);\n\n    this.emit(EVENTS.NETWORK_REPLACED, {\n      oldNetwork: prevNetwork ?? null,\n      network: nextNetwork,\n      oldNodeCount: prevNetwork?.nodeCount ?? null,\n      oldEdgeCount: prevNetwork?.edgeCount ?? null,\n      nodeCount: nextNetwork?.nodeCount ?? null,\n      edgeCount: nextNetwork?.edgeCount ?? null,\n    });\n    if (options.markNetworkDirty !== false) {\n      this.storage?.markNetworkDirty?.('network-replaced');\n    }\n    this._labels?.requestFullReselect?.('network-replaced-emitted');\n\n    if (disposeOld && prevNetwork && typeof prevNetwork.dispose === 'function') {\n      try {\n        prevNetwork.dispose();\n      } catch (error) {\n        warnOnce(\n          this,\n          'previous-network-dispose',\n          'Helios: previous network disposal failed after network replacement.',\n          { error },\n        );\n      }\n    }\n  }\n\n  _tryPendingFrameNetwork() {\n    const pending = this._pendingFrameNetwork;\n    if (!pending) return false;\n    if (!this.renderer?.camera) return false;\n    const size = this.size ?? this.layers?.size ?? null;\n    if (!size || size.width <= 2 || size.height <= 2) return false;\n\n    pending.attempts += 1;\n    const ok = this.frameNetwork(pending.options);\n    if (ok) {\n      this._pendingFrameNetwork = null;\n      return true;\n    }\n    if (pending.attempts >= pending.maxAttempts) {\n      this._pendingFrameNetwork = null;\n    }\n    return false;\n  }\n\n  /**\n   * Queue a camera fit once the renderer and graph bounds are ready.\n   *\n   * @public\n   * @apiSection Camera And View\n   * @param {object} [options] - Camera fit options.\n   * @param {number} [options.maxAttempts=25] - Maximum geometry ticks to retry.\n   * @returns {Helios} This Helios instance.\n   */\n  requestFrameNetwork(options = {}) {\n    const maxAttempts = Number.isFinite(options.maxAttempts) ? Math.max(1, Math.floor(options.maxAttempts)) : 25;\n    const { maxAttempts: _ignored, ...frameOptions } = options ?? {};\n    this._pendingFrameNetwork = { options: frameOptions, attempts: 0, maxAttempts };\n    const ok = this._tryPendingFrameNetwork();\n    if (!ok) {\n      this.scheduler?.requestGeometry?.();\n      this.scheduler?.requestRender?.();\n    }\n    return this;\n  }\n\n  _requestInitialCameraFit() {\n    this.requestFrameNetwork({\n      animate: false,\n      resetOrientation: this.mode() === '3d',\n      largeNetworkStartupFit: true,\n      maxAttempts: 60,\n    });\n  }\n\n  _requestStartupInitialCameraFit() {\n    if (this._sessionRestoreResult || this._startupConfig?.initialCameraFit === false) return;\n    this._requestInitialCameraFit();\n  }\n\n  /**\n   * Fit the camera to the current visible graph or selected node set.\n   *\n   * @public\n   * @apiSection Camera And View\n   * @param {object} [options] - Camera fit options.\n   * @param {Array<number>|TypedArray} [options.nodeIndices] - Node indices to frame.\n   * @param {boolean} [options.animate=false] - Animate the transition.\n   * @param {number} [options.paddingRatio] - Extra viewport padding ratio.\n   * @returns {boolean} True when a camera pose was applied.\n   * @example\n   * helios.frameNetwork({ animate: true, paddingRatio: 0.08 });\n   */\n  frameNetwork(options = {}) {\n    const camera = this.renderer?.camera ?? null;\n    if (!camera) return false;\n    const targetNodeIndices = options.nodeIndices != null\n      ? normalizeNodeIndexList(options.nodeIndices)\n      : this._resolveActiveCameraTargetNodeIndices();\n    const sampledBounds = this._sampleRenderBounds({\n      ...options,\n      nodeIndices: targetNodeIndices ?? undefined,\n      coverage: Number.isFinite(options.coverage)\n        ? Number(options.coverage)\n        : (this._cameraControlConfig?.autoFitCoverage ?? CAMERA_CONTROL_DEFAULTS.autoFitCoverage),\n      paddingRatio: Number.isFinite(options.paddingRatio)\n        ? Number(options.paddingRatio)\n        : (this._cameraControlConfig?.autoFitPaddingRatio ?? CAMERA_CONTROL_DEFAULTS.autoFitPaddingRatio),\n      maxSamples: options.maxSamples ?? this._cameraControlConfig?.autoFitMaxSamples ?? CAMERA_FIT_DEFAULT_MAX_SAMPLES,\n    });\n    if (!sampledBounds) return false;\n    const nextPose = this._resolveCameraFitPose(sampledBounds, {\n      resetOrientation: options.resetOrientation ?? (camera.mode === '3d'),\n      focusMode: options.focusMode ?? (targetNodeIndices?.length ? 'centroid' : 'bbox'),\n    });\n    if (this._shouldUseLargeNetworkStartupFit(options, targetNodeIndices)) {\n      const applied = this._applyLargeNetworkStartupFit(nextPose, options);\n      if (applied) return true;\n    }\n    return this._applyCameraPoseWithOptionalAnimation(nextPose, {\n      animate: options.animate === true,\n      durationMs: options.durationMs,\n    });\n  }\n\n  /**\n   * Load a serialized network and replace the active graph.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {Blob|ArrayBuffer|string|File} source - Network payload or file-like object.\n   * @param {object} [options] - Load and replacement options.\n   * @param {'xnet'|'zxnet'|'bxnet'|'gml'|'gt'} [options.format] - Input format when it\n   * cannot be inferred from `source.name`.\n   * @param {boolean} [options.showLoadingOverlay=false] - Hide the canvas,\n   * show the startup spinner, and suppress rendering until the loaded network\n   * has replaced the active graph and state restoration has finished.\n   * @returns {Promise<HeliosNetwork>} Loaded network instance.\n   * @example\n   * const network = await helios.loadNetwork(file, { format: 'bxnet' });\n   */\n  async loadNetwork(source, options = {}) {\n    const requestedFormat = options.format ?? null;\n    const sourceNameOption = typeof options.name === 'string'\n      ? options.name\n      : (typeof options.filename === 'string' ? options.filename : null);\n    const sourceNameForMetadata = source && typeof source === 'object' && typeof source.name === 'string'\n      ? source.name\n      : sourceNameOption;\n    const formatFromName = typeof sourceNameForMetadata === 'string'\n      ? inferNetworkFormatFromName(sourceNameForMetadata)\n      : null;\n    const format = requestedFormat ?? formatFromName;\n    if (!format) {\n      throw new Error('loadNetwork requires a format (\"xnet\", \"zxnet\", \"bxnet\", \"gml\", \"gt\") or a filename with a supported extension such as \".gt.zst\"');\n    }\n    const loadStartupGate = options.showLoadingOverlay === true || options.blockRenderingDuringLoad === true\n      ? this._beginNetworkLoadStartupGate(options.loadingOverlayOptions)\n      : null;\n    try {\n      const { default: HeliosNetwork } = await import('helios-network');\n      const normalized = format.toLowerCase();\n      let next = null;\n      if (normalized === 'bxnet') next = await HeliosNetwork.fromBXNet(source);\n      else if (normalized === 'zxnet') next = await HeliosNetwork.fromZXNet(source);\n      else if (normalized === 'xnet') next = await HeliosNetwork.fromXNet(source);\n      else if (normalized === 'gml') next = await HeliosNetwork.fromGML(source);\n      else if (normalized === 'gt') next = await HeliosNetwork.fromGT(source);\n      else throw new Error(`Unsupported network format: ${format}`);\n      const sourceName = sourceNameForMetadata;\n      const sourceBase = sourceName ? getBaseFilename(sourceName) : null;\n      const sessionNickname = options.sessionNickname ?? sourceBase ?? sourceName ?? `${normalized.toUpperCase()} network`;\n      const shouldCreateSession = options.allowDuringInitialize !== true\n        && options.preserveSession !== true\n        && options.createSession !== false\n        && options.newSession !== false;\n      if (shouldCreateSession && typeof this.storage?.startNewSession === 'function') {\n        await this.storage.startNewSession({\n          nickname: sessionNickname,\n          name: sourceName,\n          flushPrevious: options.flushPreviousSession !== false,\n          saveInitialSession: false,\n          replaceUrlSession: options.replaceUrlSession !== false,\n          confirmUnsyncedSession: options.confirmUnsyncedSession,\n          continueOnFlushError: options.continueOnFlushError,\n          discardPreviousUnsynced: options.discardPreviousUnsynced,\n          confirmedDiscardPrevious: options.confirmedDiscardPrevious,\n          previousFlushReason: options.previousFlushReason ?? 'network-load-session-switch',\n        });\n      }\n      if (sourceName) {\n        this._lastLoadedNetworkName = sourceName;\n        this._lastLoadedNetworkBase = sourceBase;\n        this._lastLoadedNetworkFormat = inferNetworkFormatFromName(sourceName);\n      } else {\n        this._lastLoadedNetworkName = null;\n        this._lastLoadedNetworkBase = null;\n        this._lastLoadedNetworkFormat = normalized;\n      }\n      await this.replaceNetwork(next, options);\n      if (options.restoreVisualizationState !== false) {\n        const attachedState = this.getAttachedVisualizationState(next);\n        if (attachedState) {\n          await this.importVisualizationState(attachedState, { reason: 'network-load' });\n        }\n        await this.storage?.restorePortableStateFromNetwork?.({ network: next });\n      }\n      if (shouldCreateSession) {\n        await this.storage?.setSessionNickname?.(sessionNickname);\n      }\n      this._releaseNetworkLoadStartupGate(loadStartupGate);\n      return next;\n    } catch (error) {\n      this._cancelNetworkLoadStartupGate(loadStartupGate);\n      throw error;\n    }\n  }\n\n  /**\n   * Serialize the active graph in a Helios Network format.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {'xnet'|'zxnet'|'bxnet'|'gml'|'gt'} [format='bxnet'] - Output format.\n   * @param {object} [options] - Save options forwarded to the network serializer.\n   * @returns {Promise<Blob|string|ArrayBuffer>} Serialized network payload.\n   */\n  async saveNetwork(format = 'bxnet', options = {}) {\n    const normalized = String(format).toLowerCase();\n    if (!this.network) throw new Error('saveNetwork requires an active network');\n    // Ensure visuals exist and mappers have been applied before serializing.\n    this.visuals?.seedMissingPositions?.(this.layers?.size);\n    this._applyMappersSafely();\n    const output = options.output ?? 'blob';\n    const saveOptions = { ...(options.saveOptions ?? {}), format: output };\n    if (normalized === 'bxnet') {\n      if (typeof this.network.saveBXNet !== 'function') throw new Error('Network does not support saveBXNet()');\n      return this.network.saveBXNet(saveOptions);\n    }\n    if (normalized === 'zxnet') {\n      if (typeof this.network.saveZXNet !== 'function') throw new Error('Network does not support saveZXNet()');\n      return this.network.saveZXNet(saveOptions);\n    }\n    if (normalized === 'xnet') {\n      if (typeof this.network.saveXNet !== 'function') throw new Error('Network does not support saveXNet()');\n      return this.network.saveXNet(saveOptions);\n    }\n    if (normalized === 'gml') {\n      if (typeof this.network.saveGML !== 'function') throw new Error('Network does not support saveGML()');\n      return this.network.saveGML(saveOptions);\n    }\n    if (normalized === 'gt') {\n      if (typeof this.network.saveGT !== 'function') throw new Error('Network does not support saveGT()');\n      return this.network.saveGT(saveOptions);\n    }\n    throw new Error(`Unsupported network format: ${format}`);\n  }\n\n  /**\n   * Serialize state held by active behaviors.\n   *\n   * @public\n   * @apiSection Behaviors\n   * @returns {object} Behavior state keyed by behavior id.\n   */\n  serializeBehaviorState() {\n    return this.behaviors?.serialize?.() ?? {};\n  }\n\n  /**\n   * Restore state for active behaviors.\n   *\n   * @public\n   * @apiSection Behaviors\n   * @param {object} [snapshot] - Behavior state keyed by behavior id.\n   * @returns {Helios} This Helios instance.\n   */\n  restoreBehaviorState(snapshot = {}) {\n    this.behaviors?.restore?.(snapshot);\n    return this;\n  }\n\n  _capturePersistenceNetworkSource(extra = {}) {\n    return createDefaultNetworkSource({\n      name: this._lastLoadedNetworkName ?? null,\n      baseName: this._lastLoadedNetworkBase ?? null,\n      format: this._lastLoadedNetworkFormat ?? null,\n      nodeCount: this.network?.nodeCount ?? null,\n      edgeCount: this.network?.edgeCount ?? null,\n      portableVisualizationAttached: this.network?.hasNetworkAttribute?.(NETWORK_VISUALIZATION_STATE_ATTRIBUTE) === true,\n      ...extra,\n    });\n  }\n\n  _snapshotStorageState(options = {}) {\n    if (typeof this.storage?.serializeSnapshot !== 'function') return null;\n    const snapshot = this.storage.serializeSnapshot({\n      includeNetwork: false,\n      ...(options ?? {}),\n    });\n    return snapshot ? cloneSerializable(snapshot) : null;\n  }\n\n  _trackedVisualizationOverrides() {\n    const storageOverrides = this.states?.getOverrides?.({ aliases: 'preferred' }) ?? {};\n    const overrides = {\n      ...cloneSerializable(storageOverrides),\n    };\n    const hasCameraControlOverride = this.states?.status?.('camera.controls')?.hasOverride === true\n      || this.states?.status?.('cameraControls')?.hasOverride === true;\n    if (hasCameraControlOverride && !Object.prototype.hasOwnProperty.call(overrides, 'camera.pose')) {\n      const pose = this._snapshotCameraState({ includeViewport: false });\n      if (pose) overrides['camera.pose'] = cloneSerializable(pose);\n    }\n    return overrides;\n  }\n\n  /**\n   * Build a portable visualization-state envelope.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {object} [options] - Serialization options.\n   * @returns {object} Visualization-state envelope containing UI, behavior,\n   * camera, and network-source state.\n   */\n  serializeVisualizationState(options = {}) {\n    const preferences = options.preferences ?? this.storage?.getPreferences?.() ?? createDefaultPreferencesState();\n    const envelope = createPersistenceEnvelope(PERSISTENCE_KINDS.visualization, {\n      preferences,\n      responsivePreferences: preferences?.responsive ?? null,\n      uiState: this.ui?.serializeState?.() ?? this.behaviors?.ui?.serializeState?.() ?? {},\n      behaviorState: this.serializeBehaviorState(),\n      cameraState: this._snapshotCameraState(options.camera ?? {}),\n      cameraControlState: this._snapshotCameraControlState(),\n      networkSource: this._capturePersistenceNetworkSource(),\n      layoutRuntimeState: this.snapshotLayoutRuntimeState(options.layoutRuntime ?? {}),\n      storageState: this._snapshotStorageState(options.storage ?? {}),\n    }, {\n      source: 'helios',\n    });\n    return envelope;\n  }\n\n  /**\n   * Build a portable visualization-state envelope and await async layout snapshots.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {object} [options] - Serialization options.\n   * @returns {Promise<object>} Visualization-state envelope containing UI,\n   * behavior, camera, network-source, storage, and async layout runtime state.\n   */\n  async serializeVisualizationStateAsync(options = {}) {\n    const preferences = options.preferences ?? this.storage?.getPreferences?.() ?? createDefaultPreferencesState();\n    return createPersistenceEnvelope(PERSISTENCE_KINDS.visualization, {\n      preferences,\n      responsivePreferences: preferences?.responsive ?? null,\n      uiState: this.ui?.serializeState?.() ?? this.behaviors?.ui?.serializeState?.() ?? {},\n      behaviorState: this.serializeBehaviorState(),\n      cameraState: this._snapshotCameraState(options.camera ?? {}),\n      cameraControlState: this._snapshotCameraControlState(),\n      networkSource: this._capturePersistenceNetworkSource(),\n      layoutRuntimeState: await this.snapshotLayoutRuntimeStateAsync(options.layoutRuntime ?? {}),\n      storageState: this._snapshotStorageState(options.storage ?? {}),\n    }, {\n      source: 'helios',\n    });\n  }\n\n  /**\n   * Import a visualization-state envelope and apply it to this view.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {object|string|Blob} source - Visualization-state envelope or JSON payload.\n   * @param {object} [options] - Restore options forwarded to behaviors.\n   * @returns {Promise<object>} Parsed persistence envelope.\n   */\n  async importVisualizationState(source, options = {}) {\n    const envelope = parsePersistenceEnvelope(source, PERSISTENCE_KINDS.visualization);\n    const payload = envelope.payload;\n    const sparseOverrides = payload?.storageState?.state?.overrides && typeof payload.storageState.state.overrides === 'object'\n      ? payload.storageState.state.overrides\n      : (payload?.overrides && typeof payload.overrides === 'object' ? payload.overrides : null);\n    const applyVisualizationState = async () => {\n      const restoredMode = payload.cameraState?.mode;\n      if (\n        options.restoreMode !== false\n        && (restoredMode === '2d' || restoredMode === '3d')\n        && restoredMode !== this.mode()\n        && typeof this.setMode === 'function'\n      ) {\n        await this.setMode(restoredMode, {\n          animate: false,\n          syncDelegate: false,\n          ...(options.modeOptions ?? {}),\n        });\n      }\n      let restoredStorageState = false;\n      if (sparseOverrides && options.restoreStorage !== false) {\n        if (payload.storageState && typeof this.storage?.restoreSnapshot === 'function') {\n          this.storage.restoreSnapshot(payload.storageState, {\n            source: options.source ?? 'restore',\n            reason: options.reason ?? 'visualization-state-restore',\n            trackOverride: options.trackOverride,\n          });\n          restoredStorageState = true;\n        } else if (typeof this.states?.restore === 'function') {\n          this.states.restore(sparseOverrides, {\n            source: options.source ?? 'restore',\n            reason: options.reason ?? 'visualization-state-restore',\n            trackOverride: options.trackOverride,\n          });\n        }\n      }\n      if (payload.behaviorState && typeof payload.behaviorState === 'object') {\n        this.restoreBehaviorState(payload.behaviorState);\n      }\n      if (typeof this.behaviors?.ui?.restoreState === 'function') {\n        this.behaviors.ui.restoreState(payload.uiState, options);\n      } else if (payload.uiState && typeof payload.uiState === 'object') {\n        this._pendingVisualizationUiState = cloneSerializable(payload.uiState);\n        if (options.hydratePersistence === false) this._pendingPersistenceBaselineRefresh = true;\n      }\n      if (payload.cameraControlState) this._restoreCameraControlState(payload.cameraControlState);\n      if (payload.cameraState) this._restoreCameraState(payload.cameraState, { restoreViewport: options.restoreCameraViewport === true });\n      if (payload.layoutRuntimeState && options.restoreLayoutRuntime !== false) {\n        await this.restoreLayoutRuntimeState(payload.layoutRuntimeState, {\n          reason: options.reason ?? 'visualization-state-restore',\n          ...(Object.prototype.hasOwnProperty.call(options, 'restoreLayoutRunState')\n            ? { restoreRunState: options.restoreLayoutRunState === true }\n            : {}),\n        });\n      }\n      if (!restoredStorageState && !sparseOverrides && payload.storageState && options.restoreStorage !== false && typeof this.storage?.restoreSnapshot === 'function') {\n        this.storage.restoreSnapshot(payload.storageState, {\n          source: 'restore',\n          reason: options.reason ?? 'visualization-state-restore',\n          trackOverride: options.trackOverride,\n        });\n      }\n    };\n    await applyVisualizationState();\n    return envelope;\n  }\n\n  /**\n   * Alias for `importVisualizationState`.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {object|string|Blob} source - Visualization-state envelope or JSON payload.\n   * @param {object} [options] - Restore options.\n   * @returns {Promise<object>} Parsed persistence envelope.\n   */\n  async restoreVisualizationState(source, options = {}) {\n    return this.importVisualizationState(source, options);\n  }\n\n  /**\n   * Export visualization state as an object, JSON string, or Blob.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {object} [options] - Export options.\n   * @param {'object'|'string'|'blob'} [options.format='object'] - Output shape.\n   * @returns {object|string|Blob} Visualization-state payload.\n   */\n  exportVisualizationState(options = {}) {\n    const envelope = this.serializeVisualizationState(options);\n    const format = options.format ?? 'object';\n    if (format === 'string') return serializePersistenceEnvelope(envelope, options.pretty !== false);\n    if (format === 'blob') {\n      return new Blob([serializePersistenceEnvelope(envelope, options.pretty !== false)], { type: 'application/json' });\n    }\n    return envelope;\n  }\n\n  /**\n   * Build a sparse visualization-state envelope from tracked state overrides.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {object} [options] - Serialization options.\n   * @param {boolean} [options.includeLayoutRuntime=true] - Include layout runtime state.\n   * @returns {object} Sparse visualization-state envelope suitable for portable state attachment.\n   */\n  serializeTrackedVisualizationState(options = {}) {\n    const preferences = options.preferences ?? this.storage?.getPreferences?.() ?? createDefaultPreferencesState();\n    const includeLayoutRuntime = options.includeLayoutRuntime !== false;\n    return createPersistenceEnvelope(PERSISTENCE_KINDS.visualization, {\n      preferences,\n      responsivePreferences: preferences?.responsive ?? null,\n      uiState: {},\n      behaviorState: {},\n      cameraState: this._snapshotCameraState(options.camera ?? {}),\n      cameraControlState: this._snapshotCameraControlState(),\n      networkSource: this._capturePersistenceNetworkSource(),\n      overrides: this._trackedVisualizationOverrides(),\n      layoutRuntimeState: includeLayoutRuntime ? this.snapshotLayoutRuntimeState(options.layoutRuntime ?? {}) : null,\n      storageState: this._snapshotStorageState(options.storage ?? {}),\n    }, {\n      source: 'helios',\n      sparse: true,\n    });\n  }\n\n  /**\n   * Build a sparse visualization-state envelope and await async layout snapshots.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {object} [options] - Serialization options.\n   * @param {boolean} [options.includeLayoutRuntime=true] - Include layout runtime state.\n   * @returns {Promise<object>} Sparse visualization-state envelope suitable for portable state attachment.\n   */\n  async serializeTrackedVisualizationStateAsync(options = {}) {\n    const preferences = options.preferences ?? this.storage?.getPreferences?.() ?? createDefaultPreferencesState();\n    const includeLayoutRuntime = options.includeLayoutRuntime !== false;\n    return createPersistenceEnvelope(PERSISTENCE_KINDS.visualization, {\n      preferences,\n      responsivePreferences: preferences?.responsive ?? null,\n      uiState: {},\n      behaviorState: {},\n      cameraState: this._snapshotCameraState(options.camera ?? {}),\n      cameraControlState: this._snapshotCameraControlState(),\n      networkSource: this._capturePersistenceNetworkSource(),\n      overrides: this._trackedVisualizationOverrides(),\n      layoutRuntimeState: includeLayoutRuntime ? await this.snapshotLayoutRuntimeStateAsync(options.layoutRuntime ?? {}) : null,\n      storageState: this._snapshotStorageState(options.storage ?? {}),\n    }, {\n      source: 'helios',\n      sparse: true,\n    });\n  }\n\n  /**\n   * Read a visualization-state envelope stored on a network attribute.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {HeliosNetwork} [network=this.network] - Network to inspect.\n   * @param {object} [options] - Attribute lookup options.\n   * @returns {object|null} Parsed envelope, or `null` when no valid state is attached.\n   */\n  getAttachedVisualizationState(network = this.network, options = {}) {\n    if (!network?.hasNetworkAttribute?.(options.attributeName ?? NETWORK_VISUALIZATION_STATE_ATTRIBUTE)) return null;\n    const raw = network.getNetworkStringAttribute(options.attributeName ?? NETWORK_VISUALIZATION_STATE_ATTRIBUTE);\n    if (!raw) return null;\n    try {\n      return parsePersistenceEnvelope(raw, PERSISTENCE_KINDS.visualization);\n    } catch (error) {\n      console.warn('Failed to parse attached visualization state', error);\n      return null;\n    }\n  }\n\n  /**\n   * Store visualization state on a network string attribute.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {object|null} [snapshot=null] - Existing envelope, or `null` to capture current state.\n   * @param {object} [options] - Attachment options.\n   * @returns {Helios} This Helios instance.\n   */\n  attachVisualizationStateToNetwork(snapshot = null, options = {}) {\n    const network = options.network ?? this.network;\n    if (!network) throw new Error('attachVisualizationStateToNetwork requires an active network');\n    const attributeName = options.attributeName ?? NETWORK_VISUALIZATION_STATE_ATTRIBUTE;\n    if (!network.hasNetworkAttribute?.(attributeName)) {\n      network.defineNetworkAttribute(attributeName, AttributeType.String, 1);\n    }\n    const state = snapshot ?? this.serializeVisualizationState(options);\n    network.setNetworkStringAttribute(attributeName, serializePersistenceEnvelope(state, options.pretty !== false));\n    return this;\n  }\n\n  /**\n   * Remove visualization state attached to the active network.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {object} [options] - Attribute removal options.\n   * @returns {Helios} This Helios instance.\n   */\n  clearAttachedVisualizationState(options = {}) {\n    const network = options.network ?? this.network;\n    const attributeName = options.attributeName ?? NETWORK_VISUALIZATION_STATE_ATTRIBUTE;\n    if (!network?.hasNetworkAttribute?.(attributeName)) return this;\n    network.removeNetworkAttribute(attributeName);\n    return this;\n  }\n\n  /**\n   * Save the graph with optional embedded visualization state.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {'xnet'|'zxnet'|'bxnet'|'gml'|'gt'} [format='bxnet'] - Output network format.\n   * @param {object} [options] - Portable save options.\n   * @param {boolean} [options.includeVisualization=false] - Attach current\n   * visualization state before saving.\n   * @returns {Promise<Blob|string|ArrayBuffer>} Serialized network payload.\n   */\n  async savePortableNetwork(format = 'bxnet', options = {}) {\n    if (!this.network) throw new Error('savePortableNetwork requires an active network');\n    const normalizedFormat = String(format ?? 'bxnet').toLowerCase();\n    const attributeName = options.attributeName ?? NETWORK_VISUALIZATION_STATE_ATTRIBUTE;\n    const saveOptions = { ...(options.saveOptions ?? {}) };\n    const ignoreAttributes = {\n      ...(saveOptions.ignoreAttributes ?? {}),\n      network: Array.isArray(saveOptions.ignoreAttributes?.network)\n        ? [...saveOptions.ignoreAttributes.network]\n        : [],\n    };\n    const output = options.output ?? 'blob';\n    if ((normalizedFormat === 'gml' || normalizedFormat === 'gt') && options.includeVisualization === true) {\n      console.warn(`Helios: ${normalizedFormat.toUpperCase()} export is lossy and cannot preserve full Helios visualization state.`);\n      return this.saveNetwork(format, { output, saveOptions });\n    }\n    if (options.includeVisualization !== true) {\n      if (!ignoreAttributes.network.includes(attributeName)) ignoreAttributes.network.push(attributeName);\n      let previousPositions = null;\n      let wroteCurrentPositionsForSave = false;\n      try {\n        if (options.includeCurrentPositions === true) {\n          const currentPositionOptions = {\n            ...options,\n            layoutRuntime: {\n              ...(options.layoutRuntime ?? {}),\n              preferDelegate: true,\n            },\n          };\n          const useTrackedVisualization = options.fullVisualizationState !== true && options.trackedOnly !== false;\n          const visualizationState = options.visualizationState\n            ?? await (useTrackedVisualization\n              ? this.serializeTrackedVisualizationStateAsync(currentPositionOptions)\n              : this.serializeVisualizationStateAsync(currentPositionOptions));\n          const layoutPositions = visualizationState?.payload?.layoutRuntimeState?.positions ?? null;\n          if (layoutPositions?.encoding === 'float32-base64' && typeof layoutPositions.data === 'string') {\n            const stateWriter = this.storage;\n            (stateWriter?.recordPortableState ?? stateWriter?.set)?.call(stateWriter, 'positions.current', layoutPositions, {\n              scope: 'network',\n              source: 'system',\n              reason: 'portable-network-save',\n              autosave: false,\n            });\n            const currentPositions = decodeFloat32ArrayBase64(layoutPositions.data, layoutPositions.length);\n            if (currentPositions instanceof Float32Array && currentPositions.length > 0) {\n              this.visuals?.seedMissingPositions?.(this.layers?.size);\n              previousPositions = this._snapshotNodePositions();\n              if (previousPositions instanceof Float32Array && previousPositions.length === currentPositions.length) {\n                wroteCurrentPositionsForSave = this._writeNodePositions(currentPositions);\n              }\n            }\n          }\n        }\n        return await this.saveNetwork(format, {\n          output,\n          saveOptions: {\n            ...saveOptions,\n            ignoreAttributes,\n          },\n        });\n      } finally {\n        if (wroteCurrentPositionsForSave && previousPositions instanceof Float32Array) {\n          try {\n            this._writeNodePositions(previousPositions);\n          } catch (error) {\n            warnOnce(\n              this,\n              'portable-save-position-restore',\n              'Helios: failed to restore node positions after portable network save.',\n              { error },\n            );\n          }\n        }\n      }\n    }\n\n    const saveWithVisualizationAttribute = async () => {\n      const hadExisting = this.network.hasNetworkAttribute?.(attributeName) === true;\n      const previousValue = hadExisting ? this.network.getNetworkStringAttribute(attributeName) : null;\n      let previousPositions = null;\n      let wroteCurrentPositionsForSave = false;\n      try {\n        const useTrackedVisualization = options.fullVisualizationState !== true && options.trackedOnly !== false;\n        const visualizationState = options.visualizationState\n          ?? await (useTrackedVisualization\n            ? this.serializeTrackedVisualizationStateAsync({\n              ...options,\n              layoutRuntime: {\n                ...(options.layoutRuntime ?? {}),\n                preferDelegate: true,\n              },\n            })\n            : this.serializeVisualizationStateAsync({\n              ...options,\n              layoutRuntime: {\n                ...(options.layoutRuntime ?? {}),\n                preferDelegate: true,\n              },\n            }));\n        const layoutPositions = visualizationState?.payload?.layoutRuntimeState?.positions ?? null;\n        if (\n          options.includeCurrentPositions !== false\n          && layoutPositions?.encoding === 'float32-base64'\n          && typeof layoutPositions.data === 'string'\n        ) {\n          const stateWriter = this.storage;\n          (stateWriter?.recordPortableState ?? stateWriter?.set)?.call(stateWriter, 'positions.current', layoutPositions, {\n            scope: 'network',\n            source: 'system',\n            reason: 'portable-network-save',\n            autosave: false,\n          });\n          const currentPositions = decodeFloat32ArrayBase64(layoutPositions.data, layoutPositions.length);\n          if (currentPositions instanceof Float32Array && currentPositions.length > 0) {\n            this.visuals?.seedMissingPositions?.(this.layers?.size);\n            previousPositions = this._snapshotNodePositions();\n            if (previousPositions instanceof Float32Array && previousPositions.length === currentPositions.length) {\n              wroteCurrentPositionsForSave = this._writeNodePositions(currentPositions);\n            }\n          }\n        }\n        const portableVisualizationState = await (this.storage?.serializeNetworkSnapshot?.({\n          ...options,\n          includeNetwork: true,\n          includeCurrentPositions: options.includeCurrentPositions !== false,\n        }) ?? visualizationState);\n        await (this.storage?.attachVisualizationStateToNetwork?.(portableVisualizationState, {\n          attributeName,\n          pretty: options.pretty,\n        }) ?? this.attachVisualizationStateToNetwork(portableVisualizationState, {\n          attributeName,\n          pretty: options.pretty,\n        }));\n        return await this.saveNetwork(format, { output, saveOptions });\n      } finally {\n        if (wroteCurrentPositionsForSave && previousPositions instanceof Float32Array) {\n          try {\n            this._writeNodePositions(previousPositions);\n          } catch (error) {\n            warnOnce(\n              this,\n              'portable-save-visualization-position-restore',\n              'Helios: failed to restore node positions after visualization network save.',\n              { error },\n            );\n          }\n        }\n        if (hadExisting) {\n          try {\n            this.network.setNetworkStringAttribute(attributeName, previousValue);\n          } catch (error) {\n            warnOnce(\n              this,\n              'portable-save-visualization-attribute-restore',\n              'Helios: failed to restore previous attached visualization state after network save.',\n              { error, attributeName },\n            );\n          }\n        } else if (this.network.hasNetworkAttribute?.(attributeName)) {\n          try {\n            this.network.removeNetworkAttribute(attributeName);\n          } catch (error) {\n            warnOnce(\n              this,\n              'portable-save-visualization-attribute-remove',\n              'Helios: failed to remove temporary attached visualization state after network save.',\n              { error, attributeName },\n            );\n          }\n        }\n      }\n    };\n    return await saveWithVisualizationAttribute();\n  }\n\n  /**\n   * Return renderer-aware figure export limits and preset availability.\n   *\n   * @public\n   * @apiSection Figure Export\n   * @param {{supersampling?: number|string}} [options] - Supersampling request\n   * used when computing max safe output dimensions.\n   * @returns {{maxBitmapDimension:number,maxFigureDimension:number,defaultPreset:string,presets:Array<object>}}\n   * Export capability record for the current renderer and viewport.\n   * @remarks WebGL and WebGPU expose different maximum texture dimensions, so\n   * this method should be called after `await helios.ready` and whenever\n   * supersampling changes.\n   */\n  getFigureExportCapabilities(options = {}) {\n    const supersampling = Number(options.supersampling ?? 1);\n    const capability = getFigureExportCapability(this.renderer, supersampling);\n    return {\n      ...capability,\n      windowDevicePixelRatio: globalThis.window?.devicePixelRatio ?? 1,\n      defaultPreset: resolveFigureExportOptions({}, {\n        renderer: this.renderer,\n        capability: {\n          ...capability,\n          windowDevicePixelRatio: globalThis.window?.devicePixelRatio ?? 1,\n        },\n        windowSize: this.layers?.size ?? this.size ?? {},\n        windowDevicePixelRatio: globalThis.window?.devicePixelRatio ?? 1,\n      }).preset,\n      presets: buildFigureExportPresetList(\n        this.layers?.size ?? this.size ?? {},\n        {\n          ...capability,\n          windowDevicePixelRatio: globalThis.window?.devicePixelRatio ?? 1,\n        },\n        supersampling,\n      ),\n    };\n  }\n\n  _resolveFigureExportOptions(options = {}) {\n    const supersampling = Number(options.supersampling ?? 1);\n    const capability = getFigureExportCapability(this.renderer, supersampling);\n    return resolveFigureExportOptions(options, {\n      renderer: this.renderer,\n      capability,\n      windowSize: this.layers?.size ?? this.size ?? { width: 1, height: 1 },\n      windowDevicePixelRatio: globalThis.window?.devicePixelRatio ?? 1,\n    });\n  }\n\n  async _prepareFigureExportFrame() {\n    if (typeof document === 'undefined') {\n      throw new Error('Figure export requires a browser environment');\n    }\n    if (!this.renderer || !this.scheduler) {\n      throw new Error('Figure export requires an initialized renderer');\n    }\n    if (!this.network) {\n      throw new Error('Figure export requires an active network');\n    }\n    this.visuals?.seedMissingPositions?.(this.layers?.size ?? this.size);\n    this._applyMappersSafely();\n    const frame = this.scheduler.geometryCallback?.() ?? this.scheduler.currentFrame ?? null;\n    if (!frame) {\n      throw new Error('Figure export requires an available render frame');\n    }\n    return frame;\n  }\n\n  _buildFigureExportCamera(sourceCamera, options = {}) {\n    const exportViewport = options.exportFigureLogicalViewport ?? buildExportLogicalViewport(options);\n    if (!sourceCamera?.getUniforms) return sourceCamera;\n\n    const sourceUniforms = sourceCamera.getUniforms();\n    if (!sourceUniforms?.viewProjection || !sourceUniforms?.view || !sourceUniforms?.projection) {\n      return sourceCamera;\n    }\n    if (sourceCamera.mode !== '3d') {\n      return sourceCamera;\n    }\n\n    const liveViewport = sourceCamera.viewport ?? sourceUniforms.viewport ?? null;\n    const previewRect = options.previewRect ?? null;\n    if (!liveViewport || !previewRect) {\n      return sourceCamera;\n    }\n\n    const projectionMatrix = new Float32Array(sourceUniforms.projection);\n    const viewMatrix = new Float32Array(sourceUniforms.view);\n    const nextProjection = createMat4Identity();\n\n    if (sourceCamera.projection === 'orthographic') {\n      const liveBounds = deriveOrthographicBounds(projectionMatrix);\n      if (!liveBounds) return sourceCamera;\n      const exportBounds = interpolateFrameBounds(liveBounds, previewRect, liveViewport);\n      mat4Ortho(\n        nextProjection,\n        exportBounds.left,\n        exportBounds.right,\n        exportBounds.bottom,\n        exportBounds.top,\n        Number(sourceCamera.near ?? 0.1),\n        Number(sourceCamera.far ?? 100000),\n      );\n    } else {\n      const near = Math.max(1e-6, Number(sourceCamera.near ?? 0.1));\n      const liveBounds = derivePerspectiveBounds(projectionMatrix, near);\n      if (!liveBounds) return sourceCamera;\n      const exportBounds = interpolateFrameBounds(liveBounds, previewRect, liveViewport);\n      mat4Frustum(\n        nextProjection,\n        exportBounds.left,\n        exportBounds.right,\n        exportBounds.bottom,\n        exportBounds.top,\n        near,\n        Math.max(near + 1e-6, Number(sourceCamera.far ?? 100000)),\n      );\n    }\n\n    const nextViewProjection = createMat4Identity();\n    mat4Multiply(nextViewProjection, nextProjection, viewMatrix);\n\n    const exportUniforms = {\n      ...sourceUniforms,\n      view: viewMatrix,\n      projection: nextProjection,\n      viewProjection: nextViewProjection,\n      position: new Float32Array(sourceUniforms.position),\n      right: new Float32Array(sourceUniforms.right),\n      up: new Float32Array(sourceUniforms.up),\n      viewport: {\n        ...(sourceUniforms.viewport ?? {}),\n        ...exportViewport,\n      },\n    };\n\n    return {\n      mode: sourceCamera.mode,\n      projection: sourceCamera.projection,\n      viewport: { ...exportUniforms.viewport },\n      near: sourceCamera.near,\n      far: sourceCamera.far,\n      setViewport(size) {\n        if (!size) return;\n        this.viewport = { ...this.viewport, ...size };\n        exportUniforms.viewport = { ...exportUniforms.viewport, ...size };\n      },\n      getUniforms() {\n        return {\n          ...exportUniforms,\n          viewport: { ...exportUniforms.viewport },\n        };\n      },\n    };\n  }\n\n  async _captureFigureBitmap(options, frame) {\n    const renderer = this.renderer ?? null;\n    if (!renderer?.camera) throw new Error('Figure export requires an initialized camera');\n\n    const framebuffer = renderer.createFramebuffer(options.framebufferWidth, options.framebufferHeight);\n    const previousClearColor = Array.isArray(renderer.clearColor) ? [...renderer.clearColor] : null;\n    const exportFigureLogicalViewport = options.exportFigureLogicalViewport ?? null;\n    const sourceCamera = frame?.camera ?? renderer.camera;\n    const exportCamera = this._buildFigureExportCamera(sourceCamera, options);\n    const exportFrame = exportCamera === sourceCamera ? frame : { ...frame, camera: exportCamera };\n    const previousCameraViewport = sourceCamera?.viewport ? { ...sourceCamera.viewport } : null;\n    const graphLayer = renderer.graphLayer ?? null;\n    const previousManualFastEdges = graphLayer?.edgeFastRendering === true;\n    const previousAdaptiveFastEdges = graphLayer?.edgeAdaptiveFastRendering === true;\n    const previousForceHighQuality = this._edgeAdaptiveRuntime?.forceHighQuality === true;\n    try {\n      if (this._edgeAdaptiveRuntime) {\n        this._edgeAdaptiveRuntime.forceHighQuality = true;\n      }\n      if (graphLayer) {\n        graphLayer.setEdgeFastRendering?.(false);\n        graphLayer.setAdaptiveEdgeFastRendering?.(false);\n      }\n      if (options.transparentBackground === true) {\n        renderer.clearColor = [0, 0, 0, 0];\n      }\n      if (framebuffer && typeof framebuffer === 'object') {\n        framebuffer.exportFigureLogicalViewport = exportFigureLogicalViewport\n          ? {\n              width: Math.max(1, Number(exportFigureLogicalViewport.width ?? 1)),\n              height: Math.max(1, Number(exportFigureLogicalViewport.height ?? 1)),\n              devicePixelRatio: Math.max(1, Number(exportFigureLogicalViewport.devicePixelRatio ?? 1)),\n            }\n          : null;\n      }\n      if (exportFigureLogicalViewport && typeof exportCamera?.setViewport === 'function') {\n        exportCamera.setViewport(exportFigureLogicalViewport);\n      }\n      renderer.setRenderTarget(framebuffer);\n      renderer.render(exportFrame);\n      const pixels = await renderer.readPixels(framebuffer, {\n        x: options.cropRect.x,\n        y: options.cropRect.y,\n        width: options.cropRect.width,\n        height: options.cropRect.height,\n      });\n      return pixelsToCanvas(\n        pixels,\n        options.cropRect.width,\n        options.cropRect.height,\n        options.width,\n        options.height,\n        {\n          flipY: renderer.device?.type === 'webgl2',\n          swizzleBGRA: renderer.device?.type === 'webgpu' && String(renderer.device?.format ?? '').startsWith('bgra'),\n          alphaMode: options.transparentBackground === true ? options.alphaMode : 'straight',\n        },\n      );\n    } finally {\n      const cleanup = (key, message, fn) => {\n        try {\n          fn();\n        } catch (error) {\n          warnOnce(this, key, message, { error });\n        }\n      };\n      cleanup('figure-export-edge-quality-restore', 'Helios: failed to restore edge quality settings after figure export.', () => {\n        if (graphLayer) {\n          graphLayer.setEdgeFastRendering?.(previousManualFastEdges);\n          graphLayer.setAdaptiveEdgeFastRendering?.(previousAdaptiveFastEdges);\n        }\n        if (this._edgeAdaptiveRuntime) {\n          this._edgeAdaptiveRuntime.forceHighQuality = previousForceHighQuality;\n        }\n      });\n      if (previousClearColor) {\n        cleanup('figure-export-clear-color-restore', 'Helios: failed to restore renderer clear color after figure export.', () => {\n          renderer.clearColor = previousClearColor;\n        });\n      }\n      if (exportCamera === sourceCamera && previousCameraViewport && typeof sourceCamera?.setViewport === 'function') {\n        cleanup('figure-export-camera-viewport-restore', 'Helios: failed to restore camera viewport after figure export.', () => {\n          sourceCamera.setViewport(previousCameraViewport);\n        });\n      }\n      cleanup('figure-export-render-target-reset', 'Helios: failed to reset render target after figure export.', () => {\n        renderer.setRenderTarget(null);\n      });\n      cleanup('figure-export-framebuffer-destroy', 'Helios: failed to destroy figure export framebuffer resources.', () => {\n        const device = renderer.device ?? null;\n        if (framebuffer?.type === 'webgl2') {\n          const gl = device?.gl ?? null;\n          if (gl) {\n            if (framebuffer.handle) gl.deleteFramebuffer?.(framebuffer.handle);\n            if (framebuffer.texture) gl.deleteTexture?.(framebuffer.texture);\n            if (framebuffer.depth) gl.deleteRenderbuffer?.(framebuffer.depth);\n          }\n        } else if (framebuffer?.type === 'webgpu') {\n          framebuffer.texture?.destroy?.();\n          framebuffer.depthTexture?.destroy?.();\n        }\n      });\n    }\n  }\n\n  _captureFigureOverlay(options) {\n    if (typeof document === 'undefined') return null;\n    const renderer = this.renderer ?? null;\n    if (!renderer?.camera) return null;\n    const labelBaseConfig = this._labels?.getConfig?.() ?? {};\n    const legendBaseConfig = this._legends?.getConfig?.() ?? { scale: 1 };\n    const exportReferenceSize = {\n      width: options.width,\n      height: options.height,\n    };\n    const viewReferenceSize = renderer.camera?.viewport ?? this.layers?.size ?? this.size ?? exportReferenceSize;\n    const exportRelativeScale = resolveFigureRelativeOverlayScale(exportReferenceSize, viewReferenceSize, 1);\n    const legendScale = Math.max(\n      0.25,\n      Number(legendBaseConfig.scale ?? 1)\n        * exportRelativeScale\n        * Number(options.legendScale ?? 1),\n    );\n    const targetSize = {\n      width: options.width,\n      height: options.height,\n      devicePixelRatio: 1,\n    };\n    const exportFigureLogicalViewport = options.exportFigureLogicalViewport ?? buildExportLogicalViewport(options);\n    const previousCameraViewport = renderer.camera?.viewport ? { ...renderer.camera.viewport } : null;\n    const exportCamera = this._buildFigureExportCamera(renderer.camera, options);\n    let exportUniforms = null;\n\n    const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n    svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n    svg.setAttribute('width', `${options.width}`);\n    svg.setAttribute('height', `${options.height}`);\n    svg.setAttribute('viewBox', `0 0 ${options.width} ${options.height}`);\n\n    if (options.includeLabels) {\n      try {\n        if (exportCamera !== renderer.camera) {\n          exportCamera.setViewport?.(exportFigureLogicalViewport);\n          exportUniforms = exportCamera.getUniforms?.() ?? null;\n        } else if (exportFigureLogicalViewport && typeof renderer.camera?.setViewport === 'function') {\n          renderer.camera.setViewport(exportFigureLogicalViewport);\n          exportUniforms = renderer.camera.getUniforms?.() ?? null;\n        }\n        const labelGroup = this._labels?.createSnapshot?.({\n          timestamp: performance.now(),\n          uniforms: exportUniforms,\n          config: {\n            fontFamily: options.format === 'svg'\n              ? ILLUSTRATOR_EXPORT_FONT_FAMILY\n              : labelBaseConfig.fontFamily,\n            illustratorCompatible: options.format === 'svg',\n          },\n        });\n        if (labelGroup) svg.appendChild(labelGroup);\n      } finally {\n        if (previousCameraViewport && typeof renderer.camera?.setViewport === 'function') {\n          try {\n            renderer.camera.setViewport(previousCameraViewport);\n          } catch (error) {\n            warnOnce(\n              this,\n              'figure-overlay-camera-viewport-restore',\n              'Helios: failed to restore camera viewport after overlay capture.',\n              { error },\n            );\n          }\n        }\n      }\n    }\n    if (options.includeLegends) {\n      const exportInsets = options.includeInterface === true\n        ? {\n            top: Math.max(0, Number(this._overlayInsets?.top ?? 0)),\n            right: Math.max(0, Number(this._overlayInsets?.right ?? 0)),\n            bottom: Math.max(0, Number(this._overlayInsets?.bottom ?? 0)),\n            left: Math.max(0, Number(this._overlayInsets?.left ?? 0)),\n          }\n        : { top: 0, right: 0, bottom: 0, left: 0 };\n      const legendGroup = this._legends?.createSnapshot?.({\n        size: targetSize,\n        insets: exportInsets,\n        viewportHeight: options.height * Number(options.legendScale ?? 1),\n        config: {\n          enabled: true,\n          respectDockInsets: options.includeInterface === true,\n          margin: Number(legendBaseConfig.margin ?? 12) * exportRelativeScale,\n          gap: Number(legendBaseConfig.gap ?? 12) * exportRelativeScale,\n          scale: legendScale,\n          maxScale: 64,\n          scalePreviewLegends: true,\n          illustratorCompatible: options.format === 'svg',\n          fontFamily: options.format === 'svg' ? ILLUSTRATOR_EXPORT_FONT_FAMILY : legendBaseConfig.fontFamily,\n        },\n      });\n      if (legendGroup) {\n        legendGroup.dataset.exportLegendScale = `${legendScale}`;\n      }\n      if (legendGroup) svg.appendChild(legendGroup);\n    }\n    if (!svg.childNodes.length) return null;\n    return svg;\n  }\n\n  async _composeFigurePng(canvas, overlaySvg, options = {}) {\n    if (!overlaySvg) {\n      if (options.transparentBackground === true) {\n        return canvasToBlob(canvas, 'image/png');\n      }\n      const outputCanvas = document.createElement('canvas');\n      outputCanvas.width = canvas.width;\n      outputCanvas.height = canvas.height;\n      const ctx = outputCanvas.getContext('2d');\n      if (!ctx) throw new Error('Unable to create a 2D canvas context for PNG export');\n      ctx.fillStyle = resolveExportBackgroundColor(options.backgroundColor).css;\n      ctx.fillRect(0, 0, outputCanvas.width, outputCanvas.height);\n      ctx.drawImage(canvas, 0, 0);\n      return canvasToBlob(outputCanvas, 'image/png');\n    }\n    const outputCanvas = document.createElement('canvas');\n    outputCanvas.width = canvas.width;\n    outputCanvas.height = canvas.height;\n    const ctx = outputCanvas.getContext('2d');\n    if (!ctx) throw new Error('Unable to create a 2D canvas context for PNG export');\n    if (options.transparentBackground !== true) {\n      ctx.fillStyle = resolveExportBackgroundColor(options.backgroundColor).css;\n      ctx.fillRect(0, 0, outputCanvas.width, outputCanvas.height);\n    }\n    ctx.drawImage(canvas, 0, 0);\n    const overlayImage = await loadSvgImage(elementToMarkup(overlaySvg));\n    ctx.drawImage(overlayImage, 0, 0, outputCanvas.width, outputCanvas.height);\n    return canvasToBlob(outputCanvas, 'image/png');\n  }\n\n  _composeFigureSvg(canvas, overlaySvg, options) {\n    const bitmapHref = canvas.toDataURL('image/png');\n    const overlays = overlaySvg\n      ? Array.from(overlaySvg.childNodes).map((node) => elementToMarkup(node)).join('')\n      : '';\n    const backgroundRect = options.transparentBackground === true\n      ? ''\n      : `<rect width=\"${options.width}\" height=\"${options.height}\" fill=\"${resolveExportBackgroundColor(options.backgroundColor).css}\" />`;\n    const svgText = [\n      `<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"${options.width}\" height=\"${options.height}\" viewBox=\"0 0 ${options.width} ${options.height}\">`,\n      backgroundRect,\n      `<image width=\"${options.width}\" height=\"${options.height}\" href=\"${bitmapHref}\" xlink:href=\"${bitmapHref}\" />`,\n      overlays,\n      '</svg>',\n    ].join('');\n    return new Blob([svgText], { type: 'image/svg+xml' });\n  }\n\n  /**\n   * Capture the current visualization as a PNG or SVG `Blob`.\n   *\n   * @public\n   * @apiSection Figure Export\n   * @param {object} [options] - Figure export options including `format`,\n   * `preset`, `width`, `height`, `supersampling`, `includeLabels`,\n   * `includeLegends`, `includeInterface`, `transparentBackground`, and\n   * `legendScale`.\n   * @returns {Promise<Blob>} Image blob for the requested figure.\n   * @throws {Error} When the browser, renderer, network, camera, or requested\n   * dimensions cannot support the export.\n   * @example\n   * const blob = await helios.exportFigureBlob({\n   *   format: 'png',\n   *   width: 1920,\n   *   height: 1080,\n   *   includeLabels: true,\n   *   includeLegends: true,\n   * });\n   */\n  async exportFigureBlob(options = {}) {\n    const resolved = this._resolveFigureExportOptions(options);\n    const exportOptions = {\n      ...resolved,\n      backgroundColor: Array.isArray(this.renderer?.clearColor) ? [...this.renderer.clearColor] : [1, 1, 1, 1],\n      exportFigureLogicalViewport: buildExportLogicalViewport({\n        ...resolved,\n        devicePixelRatio: 1,\n      }),\n    };\n    if (!exportOptions.fitsCapability) {\n      throw new Error(\n        `Requested export requires ${exportOptions.bitmapWidth}x${exportOptions.bitmapHeight} raster pixels, `\n        + `but the current renderer is capped at ${exportOptions.capability.maxBitmapDimension}px per dimension.`,\n      );\n    }\n    try {\n      const frame = await this._prepareFigureExportFrame();\n      const bitmapCanvas = await this._captureFigureBitmap(exportOptions, frame);\n      const overlaySvg = this._captureFigureOverlay(exportOptions);\n      return exportOptions.format === 'svg'\n        ? this._composeFigureSvg(bitmapCanvas, overlaySvg, exportOptions)\n        : await this._composeFigurePng(bitmapCanvas, overlaySvg, exportOptions);\n    } finally {\n      this.scheduler?.requestRender?.();\n    }\n  }\n\n  /**\n   * Capture a scaled PNG preview for a full-size figure export request.\n   *\n   * @public\n   * @apiSection Figure Export\n   * @param {object} [options] - Full export options that should be previewed.\n   * @param {{maxWidth?:number,maxHeight?:number,supersampling?:number|string}} [previewOptions]\n   * Preview output constraints.\n   * @returns {Promise<Blob>} PNG preview blob.\n   * @remarks Preview capture keeps the full export's framing and overlay intent\n   * while using smaller raster dimensions for UI previews.\n   */\n  async exportFigurePreviewBlob(options = {}, previewOptions = {}) {\n    const resolved = this._resolveFigureExportOptions(options);\n    const fullExportOptions = {\n      ...resolved,\n      format: 'png',\n      backgroundColor: Array.isArray(this.renderer?.clearColor) ? [...this.renderer.clearColor] : [1, 1, 1, 1],\n      exportFigureLogicalViewport: buildExportLogicalViewport({\n        ...resolved,\n        devicePixelRatio: 1,\n      }),\n    };\n    const previewRequest = resolveFigurePreviewThumbnailOptions(fullExportOptions, previewOptions);\n    const previewResolved = this._resolveFigureExportOptions(previewRequest);\n    const previewExportOptions = {\n      ...previewResolved,\n      format: 'png',\n      includeLabels: fullExportOptions.includeLabels,\n      includeLegends: fullExportOptions.includeLegends,\n      legendScale: fullExportOptions.legendScale,\n      transparentBackground: fullExportOptions.transparentBackground,\n      alphaMode: fullExportOptions.alphaMode,\n      backgroundColor: fullExportOptions.backgroundColor,\n      exportFigureLogicalViewport: buildExportLogicalViewport({\n        width: fullExportOptions.width ?? previewResolved.width,\n        height: fullExportOptions.height ?? previewResolved.height,\n        bitmapWidth: previewResolved.bitmapWidth,\n        bitmapHeight: previewResolved.bitmapHeight,\n        logicalWidth: fullExportOptions.exportFigureLogicalViewport?.width,\n        logicalHeight: fullExportOptions.exportFigureLogicalViewport?.height,\n        devicePixelRatio: 1,\n      }),\n    };\n\n    const frame = await this._prepareFigureExportFrame();\n    const bitmapCanvas = await this._captureFigureBitmap(previewExportOptions, frame);\n    const overlaySvg = this._captureFigureOverlay(fullExportOptions);\n    return await this._composeFigurePng(bitmapCanvas, overlaySvg, previewExportOptions);\n  }\n\n  async captureSessionThumbnailBlob(options = {}) {\n    try {\n      const blob = await scaledCanvasThumbnailBlob(this._getInteractionCanvas?.(), options);\n      return blob ?? null;\n    } catch (_) {\n      return null;\n    }\n  }\n\n  /**\n   * Capture and download the current visualization.\n   *\n   * @public\n   * @apiSection Figure Export\n   * @param {string|object} [filenameOrOptions] - Download filename or figure\n   * export options.\n   * @param {object} [maybeOptions] - Figure export options when the first\n   * argument is a filename.\n   * @returns {Promise<object>} Download metadata containing `blob`, `filename`,\n   * `format`, logical dimensions, bitmap dimensions, and supersampling.\n   * @remarks In non-browser runtimes the method still creates the figure blob\n   * and returns metadata, but no download link is clicked.\n   */\n  async exportFigure(filenameOrOptions, maybeOptions = {}) {\n    const options = typeof filenameOrOptions === 'string'\n      ? { ...maybeOptions, filename: filenameOrOptions }\n      : { ...(filenameOrOptions ?? {}) };\n    const resolved = this._resolveFigureExportOptions(options);\n    const blob = await this.exportFigureBlob(options);\n    if (typeof document !== 'undefined') {\n      const url = URL.createObjectURL(blob);\n      const link = document.createElement('a');\n      link.href = url;\n      link.download = resolved.filename;\n      link.style.display = 'none';\n      document.body.appendChild(link);\n      link.click();\n      link.remove();\n      setTimeout(() => URL.revokeObjectURL(url), 250);\n    }\n    return {\n      blob,\n      filename: resolved.filename,\n      format: resolved.format,\n      width: resolved.width,\n      height: resolved.height,\n      bitmapWidth: resolved.bitmapWidth,\n      bitmapHeight: resolved.bitmapHeight,\n      supersampling: resolved.supersampling,\n    };\n  }\n\n  /**\n   * Add an event listener and receive an unsubscribe function.\n   *\n   * @public\n   * @apiSection Events\n   * @param {string} type - Event type, usually one of the `EVENTS` constants.\n   * @param {Function} handler - Listener function.\n   * @param {object|boolean} [options] - DOM `addEventListener` options.\n   * @returns {Function} Function that removes the listener.\n   * @example\n   * const unsubscribe = helios.on(EVENTS.NODE_CLICK, (event) => {\n   *   console.log(event.detail.index);\n   * });\n   */\n  on(type, handler, options) {\n    this.addEventListener(type, handler, options);\n    if (options?.signal && typeof options.signal.addEventListener === 'function') {\n      const signal = options.signal;\n      if (signal.aborted) {\n        this.removeEventListener(type, handler, options);\n      } else {\n        signal.addEventListener('abort', () => this.removeEventListener(type, handler, options), { once: true });\n      }\n    }\n    return () => this.off(type, handler, options);\n  }\n\n  /**\n   * Add or replace a namespaced event listener.\n   *\n   * @public\n   * @apiSection Events\n   * @param {string} typeWithNamespace - Event type, optionally followed by\n   * `.namespace` for replacement/removal.\n   * @param {Function|null} handler - Listener function, or `null` to remove.\n   * @param {object|boolean} [options] - DOM listener options.\n   * @returns {Helios} This Helios instance.\n   * @example\n   * helios.listen(`${EVENTS.NODE_HOVER}.tooltip`, ({ detail }) => {\n   *   updateTooltip(detail);\n   * });\n   */\n  listen(typeWithNamespace, handler, options) {\n    const parsed = parseNamespacedEventType(typeWithNamespace);\n    const namespace = parsed.namespace ?? '';\n    const key = `${parsed.type}\\u0000${namespace}`;\n    const capture = options === true ? true : Boolean(options?.capture);\n\n    const existing = this._listenHandlers.get(key);\n    if (existing) {\n      this.removeEventListener(parsed.type, existing.listener, existing.capture);\n      existing.unsubscribeSignal?.();\n      this._listenHandlers.delete(key);\n    }\n\n    if (handler == null) {\n      return this;\n    }\n    if (typeof handler !== 'function') {\n      throw new TypeError('listen() handler must be a function or null');\n    }\n\n    const listener = (event) => handler(event);\n    const listenerOptions = options === true || options === false\n      ? options\n      : { ...options, signal: undefined };\n    this.addEventListener(parsed.type, listener, listenerOptions);\n\n    let unsubscribeSignal = null;\n    const signal = options?.signal;\n    if (signal && typeof signal.addEventListener === 'function') {\n      if (signal.aborted) {\n        this.removeEventListener(parsed.type, listener, capture);\n      } else {\n        const onAbort = () => this.listen(typeWithNamespace, null);\n        signal.addEventListener('abort', onAbort, { once: true });\n        unsubscribeSignal = () => signal.removeEventListener?.('abort', onAbort);\n      }\n    }\n\n    this._listenHandlers.set(key, {\n      type: parsed.type,\n      namespace,\n      listener,\n      capture,\n      unsubscribeSignal,\n    });\n\n    return this;\n  }\n\n  /**\n   * Remove an event listener.\n   *\n   * @public\n   * @apiSection Events\n   * @param {string} type - Event type.\n   * @param {Function} handler - Listener function originally registered.\n   * @param {object|boolean} [options] - DOM listener options.\n   */\n  off(type, handler, options) {\n    this.removeEventListener(type, handler, options);\n  }\n\n  /**\n   * Observe every event emitted through Helios.\n   *\n   * @public\n   * @apiSection Events\n   * @param {Function} handler - Listener receiving `{ type, detail, event, target }`.\n   * @param {object} [options] - Listener options, including `signal`.\n   * @returns {Function} Function that removes the listener.\n   */\n  onAny(handler, options) {\n    if (typeof handler !== 'function') return () => {};\n    this._anyListeners.add(handler);\n    const unsubscribe = () => this._anyListeners.delete(handler);\n    if (options?.signal && typeof options.signal.addEventListener === 'function') {\n      const signal = options.signal;\n      if (signal.aborted) {\n        unsubscribe();\n      } else {\n        signal.addEventListener('abort', unsubscribe, { once: true });\n      }\n    }\n    return unsubscribe;\n  }\n\n  /**\n   * Dispatch a Helios event.\n   *\n   * @public\n   * @apiSection Events\n   * @param {string} type - Event type.\n   * @param {object} [detail] - Event detail payload.\n   * @returns {CustomEvent} Dispatched event object.\n   */\n  emit(type, detail) {\n    const event = new CustomEvent(type, { detail });\n    this.dispatchEvent(event);\n    if (this._anyListeners?.size) {\n      for (const handler of this._anyListeners) {\n        try {\n          handler({ type, detail, event, target: this });\n        } catch (error) {\n          // eslint-disable-next-line no-console\n          console.error('Helios onAny handler failed', error);\n        }\n      }\n    }\n    return event;\n  }\n\n  /**\n   * Initialize layout, renderer, picking, attribute tracking, and scheduler state.\n   *\n   * @public\n   * @apiSection Lifecycle\n   * @returns {Promise<void>} Resolves when the first renderer and layout setup is complete.\n   * @remarks The constructor calls this automatically and exposes the promise as\n   * `helios.ready`; applications usually await `ready` instead of calling this directly.\n   */\n  async initialize() {\n    this.debug.log('helios', 'Initializing layout');\n    this._enforcePositionSourcePolicy(this._layout, { resetInterpolation: false });\n    if (this._layout?.setUpdateListener) {\n      this._layout.setUpdateListener((payload) => this._handleLayoutUpdate(payload));\n    }\n    await this._layout?.initialize?.();\n    this._enforcePositionSourcePolicy(this._layout, { resetInterpolation: false });\n    this.debug.log('helios', 'Layout initialized', { layout: this._layout?.constructor?.name });\n    this._layout?.resize?.(this.layers.size);\n    this.debug.log('layout', 'Layout resized to initial viewport', this.layers.size);\n\n    this.debug.log('helios', 'Creating renderer', {\n      mode: this.options.mode ?? '3d',\n      projection: this.options.projection ?? 'perspective',\n      renderer: this.options.renderer ?? 'auto',\n    });\n    const extraStateSlotsRaw = this.options.extraStateSlots ?? 1;\n    const extraStateSlots = Number.isFinite(extraStateSlotsRaw) ? Math.max(0, Math.floor(extraStateSlotsRaw)) : 1;\n    const stateSlots = Math.min(32, 3 + extraStateSlots);\n    this.renderer = await createRenderer(this.layers.canvas, {\n      clearColor: this.options.clearColor,\n      forceWebGL: this.options.renderer === 'webgl',\n      forceWebGPU: this.options.renderer === 'webgpu',\n      mode: this.options.mode ?? '3d',\n      projection: this.options.projection ?? 'perspective',\n      suppressBrowserGestures: this.options.suppressBrowserGestures !== false,\n      antialias: this.options.antialias,\n      powerPreference: this.options.powerPreference,\n      webglContextAttributes: this.options.webglContextAttributes,\n      webgpuAdapterOptions: this.options.webgpuAdapterOptions,\n      webgpuDeviceDescriptor: this.options.webgpuDeviceDescriptor,\n      webgpuCanvasConfiguration: this.options.webgpuCanvasConfiguration,\n      supersampling: this.options.supersampling,\n      forceSupersample: this.options.forceSupersample,\n      supersamplingAutoFactor: this.options.supersamplingAutoFactor,\n      supersamplingAutoThreshold: this.options.supersamplingAutoThreshold,\n      edgeRendering: this.options.edgeRendering,\n      transparencyModeEdges: this.options.transparencyModeEdges,\n      edgeEndpointTrim: this.options.edgeEndpointTrim,\n      edgeWidthClampToNodeDiameter: this.options.edgeWidthClampToNodeDiameter,\n      edgeFastRendering: this.options.edgeFastRendering,\n      stateSlots,\n    });\n    this.debug.log('helios', 'Renderer created', { renderer: this.renderer?.constructor?.name });\n    this._applyPendingRendererProps();\n    this._applyPositionPipelineToRenderer();\n    this._attachDensityLayer();\n    this._applyCachedStateStyles();\n    this.attributeTracker = new AttributeTracker(this.renderer);\n    this.attributeTracker.resize(this.layers.size);\n    if (typeof this.renderer.resize === 'function') {\n      this.renderer.resize(this.layers.size);\n    }\n    this._reapplyBehaviorRendererBindings();\n    if (this.mappersDirty) {\n      this._applyMappersSafely();\n    }\n    this.scheduler.setAttributeCallback(\n      (frame) => {\n        if (!frame) return;\n        this.counters.attributeUpdateTicks = bumpCounter(this.counters.attributeUpdateTicks);\n        this.attributeTracker?.render(frame, false);\n        this.indexPickingTracker?.render(frame, false);\n      },\n      {\n        autoUpdate: this.attributeUpdateOptions.autoUpdate,\n        maxFps: this.attributeUpdateOptions.maxFps,\n        frameSkip: this.attributeUpdateOptions.frameSkip,\n      },\n    );\n    this.scheduler.setLayoutEventHandlers({\n      start: (payload) => {\n        this.emit(EVENTS.LAYOUT_START, { ...payload, algo: this._layout?.constructor?.name ?? null });\n      },\n      stop: (payload) => {\n        this.emit(EVENTS.LAYOUT_STOP, { ...payload, algo: this._layout?.constructor?.name ?? null });\n        this.scheduler?.requestRender?.();\n      },\n    });\n    if (this.renderer?.camera?.setChangeListener) {\n      this.renderer.camera.setChangeListener((detail) => {\n        this.scheduler.requestRender();\n        this._markEdgeAdaptiveCameraInteraction(detail);\n        if (detail?.origin === 'interaction') {\n          this._disableAutomaticCameraControlFromInteraction(detail);\n        }\n        this._scheduleCameraMove(detail);\n        this.debug.log('helios', 'Camera change requested render');\n      });\n    }\n\n    this.removeResizeListener = this.layers.onResize((size) => {\n      this.size = size;\n      if (this.renderer?.resize) {\n        this.renderer.resize(size);\n      }\n      this.attributeTracker?.resize(size);\n      this.indexPickingTracker?.resize(size);\n      this._layout?.resize?.(size);\n      this._labels?.requestFullReselect?.('resize');\n      this._tryPendingFrameNetwork();\n      this._handleResizeAutoFit();\n      if (!this.manualRendering) {\n        this.scheduler.requestGeometry();\n        this.scheduler.requestRender();\n        this.debug.log('helios', 'Resize requested geometry/render', size);\n      }\n      this.emit(EVENTS.RESIZE, { size: { ...size } });\n    });\n\n    this.debug.log('scheduler', 'Setting scheduler callbacks');\n    this.scheduler.setLayout(this._layout);\n    this.scheduler.setGeometryCallback(() => {\n      this.counters.geometryFrames = bumpCounter(this.counters.geometryFrames);\n      if (this.mappersDirty) {\n        this.debug.log('mapper', 'Applying mappers to visuals');\n        this._applyMappersSafely();\n      }\n      const renderNetwork = this._getRenderNetwork();\n      const frame = {\n        network: renderNetwork,\n        timestamp: performance.now(),\n        camera: this.renderer?.camera,\n      };\n      if (!this.firstGeometryUpdateComplete) {\n        this.firstGeometryUpdateComplete = true;\n        this.debug.log('scheduler', 'First geometry frame ready', {\n          nodes: renderNetwork?.nodeCount ?? this.network?.nodeCount,\n          edges: renderNetwork?.edgeCount ?? this.network?.edgeCount,\n        });\n      } else {\n        this.debug.log('scheduler', 'Geometry frame prepared', {\n          nodes: renderNetwork?.nodeCount ?? this.network?.nodeCount,\n          edges: renderNetwork?.edgeCount ?? this.network?.edgeCount,\n        });\n      }\n      this._tryPendingFrameNetwork();\n      return frame;\n    });\n    this.scheduler.setRenderCallback((frame) => {\n      const now = performance.now();\n      if (this._shouldSuppressStartupRender(now)) {\n        this._refreshLargeNetworkStartupFit();\n        return false;\n      }\n      this._refreshLargeNetworkStartupFit({ force: true });\n      this._finishStartupFirstVisibleFrame();\n      this.debug.log('scheduler', 'Rendering frame', {\n        renderer: this.renderer?.constructor?.name,\n        size: this.size,\n      });\n      if (this.firstGeometryUpdateComplete && this.renderer && typeof this.renderer.render === 'function') {\n        this.counters.renderFrames = bumpCounter(this.counters.renderFrames);\n        const dt = now - this._lastRenderTime;\n        this._lastRenderTime = now;\n        this._frameId += 1;\n        this._updateEdgeAdaptiveQualityBeforeRender(now);\n        this.emit(EVENTS.BEFORE_RENDER, { frameId: this._frameId, dt, frame, size: { ...this.size } });\n        const renderStart = performance.now();\n        this.renderer.render(frame, this.size);\n        const renderEnd = performance.now();\n        this._updateEdgeAdaptiveQualityAfterRender(\n          this._resolveEdgeAdaptiveFrameCostMs(renderEnd - renderStart, dt),\n          renderEnd,\n        );\n        this._labels?.update?.({ timestamp: now });\n        this._legends?.update?.({ timestamp: now });\n        this.emit(EVENTS.AFTER_RENDER, { frameId: this._frameId, dt, frame, size: { ...this.size } });\n      }\n    });\n    let storageSessionsActive = false;\n    if (this.storage?.ready && typeof this.storage.ready.then === 'function') {\n      await this.storage.ready.catch((error) => {\n        console.warn('[HeliosStorage] Initial storage restore failed', error);\n        return null;\n      });\n    }\n    const sessionOptions = this._sessionPersistenceOptions && typeof this._sessionPersistenceOptions === 'object'\n      ? this._sessionPersistenceOptions\n      : {};\n    if (this._sessionPersistenceOptions !== false) {\n      const configured = this.storage?.configureSession?.({\n        ...sessionOptions,\n        deferRestore: true,\n      });\n      storageSessionsActive = configured != null && this.storage?.capabilities?.sessions === true;\n    }\n    await this._initializeOptionalUI();\n    if (storageSessionsActive) {\n      if (sessionOptions.restore !== false) {\n        this._sessionRestoreResult = await this.storage?.restoreActiveSession?.({\n          ...sessionOptions,\n          restoreNetwork: sessionOptions.restoreNetwork === true,\n        });\n      } else if (sessionOptions.saveInitialManifest !== false) {\n        await this.storage?.saveSession?.({\n          ...sessionOptions,\n          id: sessionOptions.id ?? sessionOptions.sessionId ?? this.storage?.sessionId ?? undefined,\n          networkFormat: sessionOptions.networkFormat ?? sessionOptions.networkPersistence?.format,\n        });\n      }\n      const sessionStatus = this.storage?.persistenceStatus?.() ?? {};\n      const networkData = sessionStatus.networkData ?? {};\n      const shouldAutosaveInitialNetwork = sessionOptions.saveInitialNetwork !== false\n        && this.storage?.get?.('network.persistence.autosave', true) === true\n        && sessionStatus.explicitSessionInvalid !== true\n        && networkData.status !== 'saved'\n        && networkData.status !== 'skipped'\n        && networkData.status !== 'error';\n      if (shouldAutosaveInitialNetwork) {\n        this.storage?.markNetworkDirty?.(networkData.reason ?? 'session-initial-network');\n      }\n    }\n    this._requestStartupInitialCameraFit();\n    if (!this.manualRendering) {\n      this.scheduler.start();\n      this.scheduler.requestGeometry();\n      this.debug.log('scheduler', 'Scheduler started (auto rendering)');\n    } else {\n      // In manual mode, run initial geometry setup but don't start scheduler\n      if (this.mappersDirty) {\n        const nodeMapper = this.nodeMapper.toCombinedMapper();\n        const edgeMapper = this.edgeMapper.toCombinedMapper({ nodeMapper });\n        this.visuals.applyMappers({ nodeMapper, edgeMapper });\n        this.mappersDirty = false;\n      }\n      this.firstGeometryUpdateComplete = true;\n      this.debug.log('helios', 'Manual rendering enabled, initial geometry applied');\n    }\n    this._applyPickingConfig();\n    this._scheduleStorageOverrideTrackingReady();\n    this.debug.log('helios', 'Initialization complete');\n    return this;\n  }\n\n  _applyCachedStateStyles() {\n    const layer = this.renderer?.graphLayer ?? null;\n    if (!layer) return false;\n    const cached = this._stateStyleCache;\n    if (!cached) return false;\n    if (!cached.nodeSlots.size && !cached.edgeSlots.size && !cached.nodeNoState && !cached.edgeNoState && !cached.nodeHover && !cached.edgeHover) {\n      return false;\n    }\n    layer.resetStateStyles?.();\n    if (cached.nodeNoState) {\n      layer.setNodeNoStateStyle?.(cached.nodeNoState);\n    }\n    if (cached.edgeNoState) {\n      layer.setEdgeNoStateStyle?.(cached.edgeNoState);\n    }\n    if (cached.nodeHover) {\n      layer.setNodeHoverStyle?.(cached.nodeHover);\n    }\n    if (cached.edgeHover) {\n      layer.setEdgeHoverStyle?.(cached.edgeHover);\n    }\n    for (const [slot, style] of cached.nodeSlots.entries()) {\n      layer.setNodeStateStyle?.(slot, style);\n    }\n    for (const [slot, style] of cached.edgeSlots.entries()) {\n      layer.setEdgeStateStyle?.(slot, style);\n    }\n    return true;\n  }\n\n  _withPositionBufferAccess(fn) {\n    if (typeof this.visuals?.withBufferAccess === 'function') {\n      return this.visuals.withBufferAccess(fn);\n    }\n    if (typeof this.network?.withBufferAccess === 'function') {\n      return this.network.withBufferAccess(fn);\n    }\n    return fn();\n  }\n\n  _withRenderNetworkBufferAccess(network, fn) {\n    if (typeof network?.withBufferAccess === 'function') {\n      return network.withBufferAccess(fn);\n    }\n    return this._withPositionBufferAccess(fn);\n  }\n\n  _readNodePositionViewUnsafe() {\n    try {\n      return this.network?.getNodeAttributeBuffer?.(NODE_POSITION_ATTRIBUTE)?.view ?? null;\n    } catch (error) {\n      warnOnce(\n        this,\n        'node-position-view',\n        'Helios: failed to read node position view.',\n        { error },\n      );\n      return null;\n    }\n  }\n\n  _snapshotNodePositions(reuseBuffer = null) {\n    let snapshot = null;\n    this._withPositionBufferAccess(() => {\n      const view = this._readNodePositionViewUnsafe();\n      if (!view || !Number.isFinite(view.length) || view.length <= 0) {\n        snapshot = null;\n        return;\n      }\n      const out = reuseBuffer && reuseBuffer.length === view.length\n        ? reuseBuffer\n        : new Float32Array(view.length);\n      out.set(view);\n      snapshot = out;\n    });\n    return snapshot;\n  }\n\n  _buildLayoutRuntimeState(snapshot, options = {}) {\n    const layout = this._layout ?? null;\n    const scheduler = this.scheduler ?? null;\n    const layoutState = typeof scheduler?.getLayoutState === 'function'\n      ? scheduler.getLayoutState()\n      : (scheduler?.layoutEnabled !== false ? 'running' : 'stopped');\n    const maxPositionBytes = Number.isFinite(options.maxPositionBytes)\n      ? Math.max(0, Number(options.maxPositionBytes))\n      : DEFAULT_LAYOUT_RUNTIME_POSITION_LIMIT_BYTES;\n    const alpha = this._readLayoutAlpha(layout);\n    const center = this._computePositionSnapshotCenter(snapshot, this.network);\n    const layoutBehavior = this.behaviors?.get?.('layout') ?? this.behaviors?.layout ?? null;\n    const explicitPositionSource = options.positionSource === 'delegate'\n      ? 'delegate'\n      : (options.positionSource === 'network' ? 'network' : null);\n    const positionSource = explicitPositionSource ?? (this._positionsConfig?.source === 'delegate' ? 'delegate' : 'network');\n    const delegate = positionSource === 'delegate'\n      ? (options.delegate ?? this._positionsConfig?.delegate ?? this._activePositionDelegate ?? layout?.getPositionDelegate?.() ?? layout?.positionDelegate ?? null)\n      : null;\n    const state = {\n      schema: 'helios-web.layout-runtime-state',\n      version: 1,\n      capturedAt: Date.now(),\n      layoutType: layoutBehavior?.type?.() ?? layout?.constructor?.name ?? null,\n      positionSource,\n      delegateType: delegate?.constructor?.name ?? null,\n      mode: this.mode?.() === '3d' ? '3d' : '2d',\n      layoutState,\n      layoutEnabled: scheduler?.layoutEnabled !== false,\n      running: layoutState === 'running',\n      nodeCount: Number.isFinite(this.network?.nodeCount) ? Number(this.network.nodeCount) : null,\n      alpha: Number.isFinite(alpha) ? alpha : null,\n      center,\n      positions: null,\n    };\n    if (snapshot instanceof Float32Array && snapshot.length > 0) {\n      if (snapshot.byteLength <= maxPositionBytes) {\n        state.positions = {\n          encoding: 'float32-base64',\n          length: snapshot.length,\n          byteLength: snapshot.byteLength,\n          data: encodeFloat32ArrayBase64(snapshot),\n        };\n      } else {\n        state.positionsSkipped = {\n          reason: 'size-limit',\n          byteLength: snapshot.byteLength,\n          maxBytes: maxPositionBytes,\n        };\n      }\n    }\n    return state;\n  }\n\n  /**\n   * Capture scheduler, layout, and optional node-position runtime state for persistence.\n   *\n   * @public\n   * @apiSection State And Persistence\n   * @param {object} [options] - Snapshot controls.\n   * @param {boolean} [options.includePositions=true] - Include packed node positions when they fit within `maxPositionBytes`.\n   * @param {number} [options.maxPositionBytes] - Maximum encoded position payload size.\n   * @returns {object} Serializable layout runtime snapshot.\n   */\n  snapshotLayoutRuntimeState(options = {}) {\n    const snapshot = options.includePositions === false ? null : this._snapshotNodePositions();\n    return this._buildLayoutRuntimeState(snapshot, options);\n  }\n\n  /**\n   * Capture layout runtime state, preferring async delegate readback when active.\n   *\n   * @public\n   * @apiSection State And Persistence\n   * @param {object} [options] - Snapshot controls and optional delegate override.\n   * @param {boolean} [options.preferDelegate] - Read positions from the active delegate even when network positions are available.\n   * @param {Float32Array} [options.positions] - Pre-captured packed `x,y,z` positions to encode.\n   * @returns {Promise<object>} Serializable layout runtime snapshot.\n   */\n  async snapshotLayoutRuntimeStateAsync(options = {}) {\n    if (options.includePositions === false) return this._buildLayoutRuntimeState(null, options);\n    let snapshot = null;\n    let positionSource = 'network';\n    let snapshotDelegate = null;\n    if (options.positions instanceof Float32Array) {\n      snapshot = new Float32Array(options.positions);\n      positionSource = options.positionSource === 'delegate' ? 'delegate' : 'network';\n      snapshotDelegate = options.delegate ?? null;\n    } else {\n      const source = this._positionsConfig ?? { source: 'network', delegate: null };\n      const layout = this._layout ?? null;\n      const delegate = options.delegate\n        ?? source.delegate\n        ?? this._activePositionDelegate\n        ?? layout?.getPositionDelegate?.()\n        ?? layout?.positionDelegate\n        ?? null;\n      const shouldUseDelegate = delegate && (\n        source.source === 'delegate'\n        || options.preferDelegate === true\n        || this.mode?.() === '3d'\n      );\n      if (shouldUseDelegate) {\n        try {\n          snapshot = await this.snapshotDelegatePositions({\n            ...options,\n            delegate,\n            scope: options.scope ?? 'layout-runtime',\n            reason: options.reason ?? 'layout-runtime-snapshot',\n          });\n          if (snapshot instanceof Float32Array && snapshot.length > 0) {\n            positionSource = 'delegate';\n            snapshotDelegate = delegate;\n          }\n        } catch (error) {\n          console.warn('Helios: failed to snapshot delegate positions for persistence; falling back to network positions.', error);\n        }\n      }\n      if (!(snapshot instanceof Float32Array) || snapshot.length <= 0) {\n        snapshot = this._snapshotNodePositions();\n        positionSource = 'network';\n        snapshotDelegate = null;\n      }\n    }\n    return this._buildLayoutRuntimeState(snapshot, {\n      ...options,\n      positionSource,\n      delegate: snapshotDelegate,\n    });\n  }\n\n  /**\n   * Restore scheduler, layout, and encoded position state from a previous snapshot.\n   *\n   * @public\n   * @apiSection State And Persistence\n   * @param {object} [state={}] - Snapshot returned by `snapshotLayoutRuntimeState*`.\n   * @param {object} [options] - Restore controls.\n   * @param {string} [options.reason] - Diagnostic reason passed to position delegates.\n   * @returns {boolean} `true` when any runtime state or positions were restored.\n   */\n  restoreLayoutRuntimeState(state = {}, options = {}) {\n    if (!state || typeof state !== 'object') return false;\n    const layout = this._layout ?? null;\n    const scheduler = this.scheduler ?? null;\n    let restoredPositions = false;\n    const encoded = state.positions && typeof state.positions === 'object' ? state.positions : null;\n    if (encoded?.encoding === 'float32-base64' && typeof encoded.data === 'string') {\n      const snapshot = decodeFloat32ArrayBase64(encoded.data, encoded.length);\n      const current = this._snapshotNodePositions();\n      if (\n        snapshot instanceof Float32Array\n        && current instanceof Float32Array\n        && snapshot.length === current.length\n      ) {\n        const currentMode = this.mode?.() === '3d' ? '3d' : '2d';\n        if (currentMode === '3d') {\n          applyPlanarDepthJitter(snapshot, computeGpuForceModeSwitchDepthJitter(layout));\n        }\n        const delegate = this._positionsConfig?.source === 'delegate'\n          ? (this._positionsConfig?.delegate ?? layout?.getPositionDelegate?.() ?? layout?.positionDelegate ?? null)\n          : (layout?.getPositionDelegate?.() ?? layout?.positionDelegate ?? null);\n        if (delegate && typeof delegate.writePositionSnapshot === 'function') {\n          const beforeDelegateVersion = Number(delegate.version);\n          restoredPositions = delegate.writePositionSnapshot(snapshot, {\n            ...this._buildPositionDelegateContext({\n              scope: 'layout-runtime-restore',\n              reason: options.reason ?? 'layout-runtime-restore',\n            }),\n            center: Array.isArray(state.center) ? state.center : undefined,\n            outputScale: layout?.options?.outputScale ?? delegate?.options?.outputScale,\n          }) === true;\n          if (\n            restoredPositions\n            && typeof delegate.bumpVersion === 'function'\n            && Number(delegate.version) === beforeDelegateVersion\n          ) {\n            delegate.bumpVersion();\n          }\n        }\n        const wroteLayout = layout?.seedFromPositionSnapshot?.(snapshot, {\n          emitUpdate: false,\n          requestUpdate: false,\n        }) === true;\n        const wroteNetwork = this._writeNodePositions(snapshot);\n        restoredPositions = restoredPositions || wroteLayout || wroteNetwork;\n        if (restoredPositions) {\n          const runtime = this._resetInterpolationRuntime({ keepLastRendered: false, keepIntervalHistory: true });\n          runtime.lastRenderedPositions = new Float32Array(snapshot);\n          this._interpolationRuntime = runtime;\n          this.visuals?.markPositionsDirty?.();\n          this.visuals?.bumpNodeAttributes?.(NODE_POSITION_ATTRIBUTE);\n          this._applyPositionPipelineToRenderer();\n          this._markRestoredPositionsForCamera();\n          this.scheduler?.requestGeometry?.();\n          this.scheduler?.requestRender?.();\n          this._labels?.requestFullReselect?.(options.reason ?? 'layout-runtime-restore');\n        }\n      }\n    }\n\n    const alpha = Number(state.alpha);\n    if (Number.isFinite(alpha)) {\n      const center = Array.isArray(state.center) ? state.center : undefined;\n      if (typeof layout?.adoptHandoffState === 'function') {\n        layout.adoptHandoffState({ alpha, center });\n      }\n      const delegate = layout?.getPositionDelegate?.() ?? layout?.positionDelegate ?? null;\n      delegate?.updateOptions?.({ alpha });\n    }\n\n    if (scheduler && options.restoreRunState !== false) {\n      if (state.layoutState === 'running' || state.running === true) {\n        scheduler.setLayoutEnabled?.(true, options.reason ?? 'layout-runtime-restore');\n        scheduler.requestLayout?.(options.reason ?? 'layout-runtime-restore');\n      } else if (state.layoutState === 'idle') {\n        scheduler.setLayoutEnabled?.(false, 'idle');\n      } else {\n        scheduler.setLayoutEnabled?.(false, options.reason ?? 'layout-runtime-restore');\n      }\n    }\n    return restoredPositions;\n  }\n\n  _adoptNetworkPositionsAsLayoutBaseline(options = {}) {\n    const snapshot = this._snapshotNodePositions();\n    if (!(snapshot instanceof Float32Array) || snapshot.length <= 0) return false;\n    const layout = this._layout ?? null;\n    const runtimeState = options.layoutRuntimeState && typeof options.layoutRuntimeState === 'object'\n      ? options.layoutRuntimeState\n      : {};\n    let adopted = false;\n    const delegate = layout?.getPositionDelegate?.() ?? layout?.positionDelegate ?? null;\n    if (delegate && typeof delegate.writePositionSnapshot === 'function') {\n      adopted = delegate.writePositionSnapshot(snapshot, {\n        ...this._buildPositionDelegateContext({\n          scope: 'session-restore',\n          reason: options.reason ?? 'session-network-restore',\n        }),\n        center: Array.isArray(runtimeState.center) ? runtimeState.center : undefined,\n        outputScale: layout?.options?.outputScale ?? delegate?.options?.outputScale,\n      }) === true || adopted;\n    }\n    adopted = layout?.seedFromPositionSnapshot?.(snapshot, {\n      emitUpdate: false,\n      requestUpdate: false,\n    }) === true || adopted;\n    if (!adopted) return false;\n    const runtime = this._resetInterpolationRuntime({ keepLastRendered: false, keepIntervalHistory: true });\n    runtime.lastRenderedPositions = new Float32Array(snapshot);\n    this._interpolationRuntime = runtime;\n    this._applyPositionPipelineToRenderer();\n    this._markRestoredPositionsForCamera();\n    this.scheduler?.requestGeometry?.();\n    this.scheduler?.requestRender?.();\n    this._labels?.requestFullReselect?.(options.reason ?? 'session-network-restore');\n    return true;\n  }\n\n  _writeNodePositions(values) {\n    if (!values || !Number.isFinite(values.length) || values.length <= 0) return false;\n    let wrote = false;\n    this._withPositionBufferAccess(() => {\n      const view = this._readNodePositionViewUnsafe();\n      if (!view || !Number.isFinite(view.length) || view.length <= 0) return;\n      const count = Math.min(view.length, values.length);\n      if (count <= 0) return;\n      view.set(values.subarray(0, count), 0);\n      wrote = true;\n    });\n    return wrote;\n  }\n\n  _recordLayoutIntervalSample(intervalMs, now = performance.now()) {\n    const runtime = this._interpolationRuntime ?? {};\n    const config = this._interpolationConfig ?? POSITION_INTERPOLATION_DEFAULTS;\n    const dt = Number(intervalMs);\n    if (!Number.isFinite(dt) || dt <= 0) return;\n    const maxSamples = normalizePositiveInteger(\n      config.adaptiveDurationSamples,\n      POSITION_INTERPOLATION_DEFAULTS.adaptiveDurationSamples,\n      1,\n      120,\n    );\n    const windowMs = normalizeNonNegativeNumber(\n      config.adaptiveDurationWindowMs,\n      POSITION_INTERPOLATION_DEFAULTS.adaptiveDurationWindowMs,\n      100,\n      60000,\n    );\n    const samples = Array.isArray(runtime.layoutIntervalsMs) ? runtime.layoutIntervalsMs : [];\n    samples.push({ dt, ts: now });\n    const cutoff = now - windowMs;\n    const recent = samples.filter((entry) => entry && Number.isFinite(entry.ts) && entry.ts >= cutoff);\n    if (recent.length > maxSamples) {\n      recent.splice(0, recent.length - maxSamples);\n    }\n    runtime.layoutIntervalsMs = recent;\n    this._interpolationRuntime = runtime;\n  }\n\n  _resolveInterpolationDurationMs(now = performance.now()) {\n    const runtime = this._interpolationRuntime ?? {};\n    const config = this._interpolationConfig ?? POSITION_INTERPOLATION_DEFAULTS;\n    const durationMode = resolveInterpolationDurationMode(config);\n    const fixedDuration = normalizeNonNegativeNumber(\n      config.durationMs,\n      POSITION_INTERPOLATION_DEFAULTS.durationMs,\n      0,\n      60000,\n    );\n    if (durationMode !== 'adaptive') {\n      return fixedDuration;\n    }\n    const samples = Array.isArray(runtime.layoutIntervalsMs) ? runtime.layoutIntervalsMs : [];\n    if (samples.length === 0) {\n      return fixedDuration;\n    }\n    const maxSamples = normalizePositiveInteger(\n      config.adaptiveDurationSamples,\n      POSITION_INTERPOLATION_DEFAULTS.adaptiveDurationSamples,\n      1,\n      120,\n    );\n    const windowMs = normalizeNonNegativeNumber(\n      config.adaptiveDurationWindowMs,\n      POSITION_INTERPOLATION_DEFAULTS.adaptiveDurationWindowMs,\n      100,\n      60000,\n    );\n    const cutoff = now - windowMs;\n    const recent = samples.filter((entry) => entry && Number.isFinite(entry.ts) && entry.ts >= cutoff);\n    if (recent.length === 0) {\n      return fixedDuration;\n    }\n    const windowed = recent.length > maxSamples ? recent.slice(recent.length - maxSamples) : recent;\n    const sum = windowed.reduce((acc, entry) => acc + entry.dt, 0);\n    const average = sum / windowed.length;\n    const scale = normalizeNonNegativeNumber(\n      config.adaptiveDurationScale,\n      POSITION_INTERPOLATION_DEFAULTS.adaptiveDurationScale,\n      0,\n      16,\n    );\n    const minDuration = normalizeNonNegativeNumber(\n      config.adaptiveDurationMinMs,\n      POSITION_INTERPOLATION_DEFAULTS.adaptiveDurationMinMs,\n      0,\n      60000,\n    );\n    const maxDuration = normalizeNonNegativeNumber(\n      config.adaptiveDurationMaxMs,\n      POSITION_INTERPOLATION_DEFAULTS.adaptiveDurationMaxMs,\n      minDuration,\n      60000,\n    );\n    const adaptive = average * scale;\n    if (!Number.isFinite(adaptive)) return fixedDuration;\n    return Math.max(minDuration, Math.min(maxDuration, adaptive));\n  }\n\n  _computeInterpolationFactor(now = performance.now()) {\n    const runtime = this._interpolationRuntime ?? null;\n    const config = this._interpolationConfig ?? POSITION_INTERPOLATION_DEFAULTS;\n    if (!runtime) return 1;\n    const durationMs = Number.isFinite(runtime.effectiveDurationMs)\n      ? Math.max(0, Number(runtime.effectiveDurationMs))\n      : this._resolveInterpolationDurationMs(now);\n    runtime.effectiveDurationMs = durationMs;\n    if (durationMs <= 0) return 1;\n    const startedAt = Number.isFinite(runtime.startedAt) ? runtime.startedAt : now;\n    const elapsed = Math.max(0, now - startedAt);\n    const linear = clamp01(elapsed / durationMs, 1);\n    return applyInterpolationEasing(config.easing, linear);\n  }\n\n  _resolveInterpolationSourceSnapshot(now, targetPositions) {\n    if (!targetPositions || !targetPositions.length) return null;\n    const runtime = this._interpolationRuntime ?? null;\n    if (!runtime) return new Float32Array(targetPositions);\n    const count = targetPositions.length;\n    const source = runtime.sourcePositions;\n    const target = runtime.targetPositions;\n    if (\n      runtime.active === true\n      && source && target\n      && source.length === count\n      && target.length === count\n    ) {\n      const factor = this._computeInterpolationFactor(now);\n      const mixed = new Float32Array(count);\n      mixPositionsArray(source, target, mixed, factor);\n      return mixed;\n    }\n    if (runtime.lastRenderedPositions && runtime.lastRenderedPositions.length === count) {\n      return new Float32Array(runtime.lastRenderedPositions);\n    }\n    return new Float32Array(targetPositions);\n  }\n\n  _prepareInterpolationRuntimeForTarget(targetPositions, now, layoutElapsedMs) {\n    const runtime = this._interpolationRuntime ?? {};\n    const config = this._interpolationConfig ?? POSITION_INTERPOLATION_DEFAULTS;\n    const sourcePositions = this._resolveInterpolationSourceSnapshot(now, targetPositions);\n    const sourceCount = Math.floor((targetPositions?.length ?? 0) / 3);\n    const displacementRatio = computePositionDisplacementRatio(sourcePositions, targetPositions);\n    const minDisplacement = Number.isFinite(config.minDisplacementRatio)\n      ? Math.max(0, Number(config.minDisplacementRatio))\n      : POSITION_INTERPOLATION_DEFAULTS.minDisplacementRatio;\n    const durationMs = this._resolveInterpolationDurationMs(now);\n    const shouldInterpolate = Boolean(\n      config.enabled === true\n      && sourcePositions\n      && targetPositions\n      && sourcePositions.length === targetPositions.length\n      && durationMs > 0\n      && displacementRatio >= minDisplacement\n      && !arePositionArraysEqual(sourcePositions, targetPositions),\n    );\n\n    runtime.active = shouldInterpolate;\n    runtime.startedAt = now;\n    runtime.lastFrameAt = now;\n    runtime.lastTargetUpdateAt = now;\n    runtime.layoutElapsedMs = Number.isFinite(layoutElapsedMs) ? Math.max(1, layoutElapsedMs) : 16;\n    runtime.sourcePositions = sourcePositions;\n    runtime.targetPositions = targetPositions;\n    runtime.mixedPositions = runtime.mixedPositions && runtime.mixedPositions.length === targetPositions.length\n      ? runtime.mixedPositions\n      : new Float32Array(targetPositions.length);\n    runtime.sourceVersion = ((runtime.sourceVersion ?? 0) + 1) % Number.MAX_SAFE_INTEGER;\n    runtime.targetVersion = ((runtime.targetVersion ?? 0) + 1) % Number.MAX_SAFE_INTEGER;\n    runtime.sourceCount = sourceCount;\n    runtime.factor = shouldInterpolate ? 0 : 1;\n    runtime.sourceWebGPUBuffer = null;\n    runtime.sourceWebGLTexture = null;\n    runtime.sourceTextureMeta = null;\n    runtime.delegateVersion = null;\n    runtime.effectiveDurationMs = durationMs;\n    runtime.lastRenderedPositions = sourcePositions\n      ? new Float32Array(shouldInterpolate ? sourcePositions : targetPositions)\n      : null;\n    this._interpolationRuntime = runtime;\n\n    return { shouldInterpolate, mode: 'gpu', displacementRatio, durationMs };\n  }\n\n  _stepGpuInterpolation(now) {\n    const runtime = this._interpolationRuntime ?? null;\n    if (!runtime?.sourcePositions || !runtime?.targetPositions) return false;\n    const factor = this._computeInterpolationFactor(now);\n    runtime.factor = factor;\n    runtime.lastFrameAt = now;\n    if (\n      runtime.lastRenderedPositions\n      && runtime.lastRenderedPositions.length === runtime.targetPositions.length\n    ) {\n      mixPositionsArray(\n        runtime.sourcePositions,\n        runtime.targetPositions,\n        runtime.lastRenderedPositions,\n        factor,\n      );\n    } else {\n      runtime.lastRenderedPositions = new Float32Array(runtime.targetPositions);\n      mixPositionsArray(\n        runtime.sourcePositions,\n        runtime.targetPositions,\n        runtime.lastRenderedPositions,\n        factor,\n      );\n    }\n    return factor < 1;\n  }\n\n  _runInterpolationRenderPump(timestamp = performance.now()) {\n    const now = Number.isFinite(timestamp) ? timestamp : performance.now();\n    const runtime = this._interpolationRuntime ?? null;\n    const config = this._interpolationConfig ?? POSITION_INTERPOLATION_DEFAULTS;\n    const cameraKeepRunning = this._stepCameraControlRenderPump(now);\n    if (!runtime || config.enabled !== true || runtime.active !== true) {\n      this._applyPositionPipelineToRenderer();\n      return cameraKeepRunning;\n    }\n    const mode = normalizeInterpolationMode(config.mode);\n    const keepRunning = this._stepGpuInterpolation(now);\n    runtime.active = keepRunning;\n    if (!keepRunning) {\n      runtime.factor = 1;\n      if (runtime.targetPositions) {\n        runtime.lastRenderedPositions = new Float32Array(runtime.targetPositions);\n      }\n      runtime.sourcePositions = null;\n      runtime.targetPositions = null;\n      runtime.mixedPositions = null;\n      runtime.sourceCount = 0;\n      runtime.sourceWebGPUBuffer = null;\n      runtime.sourceWebGLTexture = null;\n      runtime.sourceTextureMeta = null;\n    }\n    this._applyPositionPipelineToRenderer();\n    return keepRunning || cameraKeepRunning;\n  }\n\n  _handleLayoutUpdate(payload = {}) {\n    const pendingHandoff = this._pendingLayoutHandoff ?? null;\n    if (pendingHandoff && pendingHandoff.nextLayout === this._layout) {\n      return;\n    }\n    this._recordStartupLayoutUpdate();\n    this._enforcePositionSourcePolicy(this._layout, { resetInterpolation: true });\n    const now = Number.isFinite(payload?.timestamp) ? Number(payload.timestamp) : performance.now();\n    const previousTargetAt = Number.isFinite(this._interpolationRuntime?.lastTargetUpdateAt)\n      ? this._interpolationRuntime.lastTargetUpdateAt\n      : now;\n    const layoutElapsedMs = Number.isFinite(payload?.layoutElapsedMs)\n      ? Math.max(1, Number(payload.layoutElapsedMs))\n      : Math.max(1, now - previousTargetAt);\n    this._recordLayoutIntervalSample(layoutElapsedMs, now);\n    this._markAutoFitDirty(false);\n    const delegateSourceActive = this._positionsConfig?.source === 'delegate'\n      && Boolean(this._positionsConfig?.delegate);\n    const targetPositions = delegateSourceActive ? null : this._snapshotNodePositions();\n    const handoffAdopted = payload?.handoffAdopted === true;\n    if (targetPositions && handoffAdopted) {\n      const runtime = this._interpolationRuntime ?? {};\n      runtime.active = false;\n      runtime.factor = 1;\n      runtime.lastTargetUpdateAt = now;\n      runtime.layoutElapsedMs = layoutElapsedMs;\n      runtime.effectiveDurationMs = this._resolveInterpolationDurationMs(now);\n      runtime.lastRenderedPositions = new Float32Array(targetPositions);\n      runtime.sourcePositions = null;\n      runtime.targetPositions = null;\n      runtime.mixedPositions = null;\n      runtime.sourceCount = Math.floor(targetPositions.length / 3);\n      runtime.sourceVersion = ((runtime.sourceVersion ?? 0) + 1) % Number.MAX_SAFE_INTEGER;\n      runtime.sourceWebGPUBuffer = null;\n      runtime.sourceWebGLTexture = null;\n      runtime.sourceTextureMeta = null;\n      this._interpolationRuntime = runtime;\n      this._applyPositionPipelineToRenderer();\n      this.visuals.markPositionsDirty();\n      this.storage?.markPositionsDirty?.('layout-update');\n      this.scheduler.requestGeometry();\n      this._labels?.requestFullReselect?.('layout-update');\n      this.debug.log('layout', 'Layout update adopted handoff baseline without interpolation');\n      return;\n    }\n    if (targetPositions && this._interpolationConfig?.enabled === true) {\n      const { shouldInterpolate, mode, displacementRatio, durationMs } = this._prepareInterpolationRuntimeForTarget(\n        targetPositions,\n        now,\n        layoutElapsedMs,\n      );\n      if (shouldInterpolate) {\n        this.scheduler.requestRender();\n      }\n      this.debug.log('layout', 'Layout update prepared interpolation', {\n        mode,\n        enabled: shouldInterpolate,\n        displacementRatio,\n        durationMs,\n        durationMode: resolveInterpolationDurationMode(this._interpolationConfig),\n        adaptiveDuration: this._interpolationConfig?.adaptiveDuration === true,\n      });\n    } else if (targetPositions || delegateSourceActive) {\n      const runtime = this._interpolationRuntime ?? {};\n      runtime.active = false;\n      runtime.factor = 1;\n      runtime.lastTargetUpdateAt = now;\n      runtime.layoutElapsedMs = layoutElapsedMs;\n      runtime.effectiveDurationMs = this._resolveInterpolationDurationMs(now);\n      runtime.lastRenderedPositions = targetPositions ? new Float32Array(targetPositions) : null;\n      runtime.sourcePositions = null;\n      runtime.targetPositions = null;\n      runtime.mixedPositions = null;\n      if (delegateSourceActive) {\n        runtime.sourceVersion = ((runtime.sourceVersion ?? 0) + 1) % Number.MAX_SAFE_INTEGER;\n      }\n      runtime.sourceCount = targetPositions\n        ? Math.floor(targetPositions.length / 3)\n        : Math.max(0, Math.floor(Number(this._getRenderNetwork()?.nodeCount ?? 0)));\n      runtime.sourceWebGPUBuffer = null;\n      runtime.sourceWebGLTexture = null;\n      runtime.sourceTextureMeta = null;\n      this._interpolationRuntime = runtime;\n    }\n    this._applyPositionPipelineToRenderer();\n    if (!delegateSourceActive) {\n      this.visuals.markPositionsDirty();\n    }\n    this.storage?.markPositionsDirty?.('layout-update');\n    this.scheduler.requestGeometry();\n    this._labels?.requestFullReselect?.('layout-update');\n    this.debug.log('layout', 'Layout requested geometry update');\n  }\n\n  _applyPendingRendererProps() {\n    const renderer = this.renderer;\n    const graphLayer = renderer?.graphLayer;\n    if (renderer && this._pendingRendererProps.size) {\n      for (const [key, value] of this._pendingRendererProps.entries()) {\n        renderer[key] = value;\n      }\n      this._pendingRendererProps.clear();\n    }\n    if (graphLayer && this._pendingGraphLayerProps.size) {\n      for (const [key, value] of this._pendingGraphLayerProps.entries()) {\n        graphLayer[key] = value;\n      }\n      this._pendingGraphLayerProps.clear();\n    }\n  }\n\n  _invokePositionDelegateHook(delegate, hookNames) {\n    if (!delegate || !hookNames?.length) return;\n    const context = this._buildPositionDelegateContext();\n    for (const hookName of hookNames) {\n      if (typeof delegate?.[hookName] !== 'function') continue;\n      try {\n        delegate[hookName](context);\n      } catch (error) {\n        warnOnce(\n          this,\n          `position-delegate-hook:${hookName}`,\n          `Helios: position delegate hook \"${hookName}\" failed.`,\n          { error },\n        );\n        this.debug.log('layout', `Position delegate ${hookName} failed`, { error });\n      }\n      return;\n    }\n  }\n\n  _buildPositionDelegateContext(extra = {}) {\n    const renderer = this.renderer ?? null;\n    const rendererDevice = renderer?.device ?? null;\n    const scope = extra?.scope ?? null;\n    const activeLayoutDelegate = this._layout && typeof this._layout.getPositionDelegate === 'function'\n      ? (this._layout.getPositionDelegate() ?? null)\n      : null;\n    const usesLayoutDelegate = activeLayoutDelegate\n      && activeLayoutDelegate === (this._positionsConfig?.delegate ?? null);\n    const defaultNetwork = scope === 'layout' || usesLayoutDelegate\n      ? this._getLayoutNetwork()\n      : this._getRenderNetwork();\n    return {\n      helios: this,\n      network: extra.network ?? defaultNetwork,\n      visuals: this.visuals,\n      renderer,\n      scheduler: this.scheduler ?? null,\n      backend: rendererDevice?.type ?? null,\n      device: rendererDevice?.device ?? null,\n      gl: rendererDevice?.gl ?? null,\n      ...extra,\n    };\n  }\n\n  _validatePositionDelegate(delegate) {\n    if (!delegate) return null;\n    if (!(delegate instanceof PositionDelegate)) {\n      throw new TypeError(\n        'positions({ source: \"delegate\" }) expects delegate to be an instance of PositionDelegate',\n      );\n    }\n    const hasProvider = (\n      typeof delegate.getNodePositionView === 'function'\n      || typeof delegate.getPositionView === 'function'\n      || typeof delegate.getWebGPUPositionBuffer === 'function'\n      || typeof delegate.getWebGLPositionTexture === 'function'\n      || typeof delegate.getGpuPositionResource === 'function'\n      || typeof delegate.getPositionResource === 'function'\n    );\n    if (!hasProvider) {\n      throw new Error(\n        'PositionDelegate must expose at least one position provider (CPU view, WebGL texture, or WebGPU buffer)',\n      );\n    }\n    return delegate;\n  }\n\n  _resolveLayoutPositionPolicy(layout = this._layout) {\n    if (!layout || typeof layout !== 'object') {\n      return { source: 'network', delegate: null };\n    }\n    if (typeof layout.getPositionDelegate !== 'function') {\n      return { source: 'network', delegate: null };\n    }\n    const delegate = layout.getPositionDelegate() ?? null;\n    if (!delegate) {\n      return { source: 'network', delegate: null };\n    }\n    return {\n      source: 'delegate',\n      delegate: this._validatePositionDelegate(delegate),\n    };\n  }\n\n  _enforcePositionSourcePolicy(layout = this._layout, options = {}) {\n    const current = this._positionsConfig ?? { source: 'network', delegate: null };\n    const policy = this._resolveLayoutPositionPolicy(layout);\n    const prevActiveDelegate = current.source === 'delegate' ? (current.delegate ?? null) : null;\n    const nextActiveDelegate = policy.source === 'delegate' ? (policy.delegate ?? null) : null;\n    const changed = current.source !== policy.source || current.delegate !== policy.delegate;\n    if (!changed) {\n      this._applyPositionPipelineToRenderer();\n      return false;\n    }\n    if (prevActiveDelegate && prevActiveDelegate !== nextActiveDelegate) {\n      this._detachPositionDelegate(prevActiveDelegate);\n    }\n    this._positionsConfig = {\n      source: policy.source,\n      delegate: policy.delegate ?? null,\n    };\n    this._resetCameraDelegateSnapshot();\n    if (nextActiveDelegate && nextActiveDelegate !== prevActiveDelegate) {\n      this._attachPositionDelegate(nextActiveDelegate);\n    }\n    if (options.resetInterpolation !== false) {\n      this._resetInterpolationRuntime({ keepLastRendered: false });\n    } else {\n      this._applyPositionPipelineToRenderer();\n    }\n    if (options.requestGeometry !== false) {\n      this.scheduler?.requestGeometry?.();\n    }\n    if (options.requestRender !== false) {\n      this.scheduler?.requestRender?.();\n    }\n    if (options.requestLabels !== false) {\n      this._labels?.requestFullReselect?.('positions-policy');\n    }\n    return true;\n  }\n\n  _attachPositionDelegate(delegate) {\n    const next = delegate ?? null;\n    if (!next || this._activePositionDelegate === next) return;\n    this._activePositionDelegate = next;\n    this._invokePositionDelegateHook(next, ['onAttach', 'attach']);\n  }\n\n  _detachPositionDelegate(delegate) {\n    const active = delegate ?? this._activePositionDelegate ?? null;\n    if (!active) return;\n    this._invokePositionDelegateHook(active, ['onDetach', 'detach']);\n    if (this._activePositionDelegate === active) {\n      this._activePositionDelegate = null;\n    }\n  }\n\n  _resolveLayoutHandoffContext() {\n    const pending = this._pendingLayoutHandoff ?? null;\n    const currentPositions = this._positionsConfig ?? { source: 'network', delegate: null };\n    const outgoingDelegate = currentPositions.source === 'delegate'\n      ? (currentPositions.delegate ?? null)\n      : null;\n    const retainedLayout = pending?.retainedDelegate && pending.retainedDelegate === outgoingDelegate\n      ? (pending.retainedLayout ?? null)\n      : null;\n    return {\n      pending,\n      outgoingDelegate,\n      outgoingLayout: retainedLayout ?? this._layout ?? null,\n      staleLayout: retainedLayout && retainedLayout !== this._layout\n        ? this._layout ?? null\n        : null,\n    };\n  }\n\n  _disposePendingLayoutHandoff(options = {}) {\n    const pending = this._pendingLayoutHandoff ?? null;\n    this._pendingLayoutHandoff = null;\n    if (pending?.retainedLayout && options.disposeRetained !== false) {\n      pending.retainedLayout.dispose?.();\n    }\n    if (pending?.staleLayout && pending.staleLayout !== pending.retainedLayout) {\n      pending.staleLayout.dispose?.();\n    }\n    return pending;\n  }\n\n  _startLayoutPositionHandoff({ previousLayout = null, previousDelegate = null, nextLayout = null } = {}) {\n    if (!previousDelegate || !nextLayout || typeof this.snapshotDelegatePositions !== 'function') {\n      return false;\n    }\n\n    this._disposePendingLayoutHandoff();\n    const token = ((this._layoutHandoffToken ?? 0) + 1) >>> 0;\n    this._layoutHandoffToken = token;\n    nextLayout.beginPositionHandoff?.();\n    nextLayout.adoptHandoffState?.({\n      alpha: this._readLayoutAlpha(previousLayout),\n    });\n    this._pendingLayoutHandoff = {\n      token,\n      retainedLayout: previousLayout,\n      retainedDelegate: previousDelegate,\n      staleLayout: null,\n      nextLayout,\n    };\n\n    Promise.resolve()\n      .then(() => this.snapshotDelegatePositions({\n        delegate: previousDelegate,\n        network: previousLayout?.network ?? previousDelegate?._context?.network ?? this._getLayoutNetwork(),\n        scope: 'layout',\n      }))\n      .catch((error) => {\n        console.warn('Helios.layout(): failed to snapshot delegate positions during layout handoff.', error);\n        return null;\n      })\n      .then((snapshot) => {\n        this._finishLayoutPositionHandoff(token, snapshot);\n      })\n      .catch((error) => {\n        warnOnce(this, 'layout-position-handoff-finish', 'Helios.layout(): failed to finish delegate position handoff.', { error });\n      });\n\n    return true;\n  }\n\n  _readLayoutAlpha(layout = null) {\n    const direct = Number(layout?.alpha);\n    if (Number.isFinite(direct)) return direct;\n    const settings = Number(layout?.settings?.alpha);\n    if (Number.isFinite(settings)) return settings;\n    const delegate = layout?.getPositionDelegate?.() ?? layout?.positionDelegate ?? null;\n    const delegateAlpha = Number(delegate?.alpha);\n    if (Number.isFinite(delegateAlpha)) return delegateAlpha;\n    const options = Number(layout?.options?.alpha);\n    if (Number.isFinite(options)) return options;\n    return NaN;\n  }\n\n  _computePositionSnapshotCenter(snapshot = null, network = null) {\n    if (!(snapshot instanceof Float32Array) || snapshot.length < 3) return null;\n    const readNodeIndices = () => network?.nodeIndices instanceof Uint32Array ? network.nodeIndices : null;\n    let nodeIndices = null;\n    if (typeof network?.withBufferAccess === 'function') {\n      network.withBufferAccess(() => {\n        nodeIndices = readNodeIndices();\n      });\n    } else {\n      nodeIndices = readNodeIndices();\n    }\n\n    let sumX = 0;\n    let sumY = 0;\n    let sumZ = 0;\n    let count = 0;\n    const visitNode = (nodeId) => {\n      const base = (nodeId >>> 0) * 3;\n      if ((base + 2) >= snapshot.length) return;\n      const x = Number(snapshot[base]);\n      const y = Number(snapshot[base + 1]);\n      const z = Number(snapshot[base + 2]);\n      if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) return;\n      sumX += x;\n      sumY += y;\n      sumZ += z;\n      count += 1;\n    };\n\n    if (nodeIndices?.length) {\n      for (let i = 0; i < nodeIndices.length; i += 1) {\n        visitNode(nodeIndices[i]);\n      }\n    } else {\n      const nodeCount = Math.floor(snapshot.length / 3);\n      for (let nodeId = 0; nodeId < nodeCount; nodeId += 1) {\n        visitNode(nodeId);\n      }\n    }\n\n    if (count <= 0) return null;\n    return [sumX / count, sumY / count, sumZ / count];\n  }\n\n  _finishLayoutPositionHandoff(token, snapshot = null) {\n    const pending = this._pendingLayoutHandoff ?? null;\n    if (!pending || pending.token !== token) return false;\n    this._pendingLayoutHandoff = null;\n\n    const nextLayout = pending.nextLayout ?? null;\n    if (nextLayout && this._layout === nextLayout) {\n      const snapshotCenter = this._computePositionSnapshotCenter(snapshot, nextLayout?.network ?? null);\n      if (snapshotCenter) {\n        nextLayout.adoptHandoffState?.({ center: snapshotCenter });\n      }\n      nextLayout.completePositionHandoff?.(snapshot, { emitUpdate: false });\n      this._enforcePositionSourcePolicy(this._layout, { resetInterpolation: false });\n      const runtime = this._resetInterpolationRuntime({ keepLastRendered: false, keepIntervalHistory: true });\n      if (snapshot instanceof Float32Array && snapshot.length > 0) {\n        runtime.lastRenderedPositions = new Float32Array(snapshot);\n      }\n      this._interpolationRuntime = runtime;\n      this._applyPositionPipelineToRenderer();\n      this.scheduler?.requestLayout?.('layout-handoff');\n      this.scheduler?.requestGeometry?.();\n      this.scheduler?.requestRender?.();\n      this._labels?.requestFullReselect?.('layout-handoff');\n    }\n\n    pending.retainedLayout?.dispose?.();\n    if (pending.staleLayout && pending.staleLayout !== pending.retainedLayout) {\n      pending.staleLayout.dispose?.();\n    }\n    return true;\n  }\n\n  _resetInterpolationRuntime({ keepLastRendered = false, keepIntervalHistory = true } = {}) {\n    const runtime = this._interpolationRuntime ?? {};\n    const previousIntervals = Array.isArray(runtime.layoutIntervalsMs) ? runtime.layoutIntervalsMs : [];\n    runtime.active = false;\n    runtime.startedAt = 0;\n    runtime.lastFrameAt = 0;\n    runtime.lastTargetUpdateAt = 0;\n    runtime.layoutElapsedMs = 16;\n    runtime.sourcePositions = null;\n    runtime.targetPositions = null;\n    runtime.mixedPositions = null;\n    runtime.sourceVersion = 0;\n    runtime.targetVersion = 0;\n    runtime.sourceCount = 0;\n    runtime.factor = 1;\n    runtime.delegateVersion = null;\n    runtime.sourceWebGPUBuffer = null;\n    runtime.sourceWebGLTexture = null;\n    runtime.sourceTextureMeta = null;\n    runtime.effectiveDurationMs = this._resolveInterpolationDurationMs(performance.now());\n    runtime.layoutIntervalsMs = keepIntervalHistory ? previousIntervals : [];\n    if (!keepLastRendered) {\n      runtime.lastRenderedPositions = null;\n    }\n    this._interpolationRuntime = runtime;\n    this._applyPositionPipelineToRenderer();\n    return runtime;\n  }\n\n  _applyPositionPipelineToRenderer() {\n    const graphLayer = this.renderer?.graphLayer ?? null;\n    if (!graphLayer) return false;\n    const activeDelegate = this._positionsConfig?.source === 'delegate'\n      ? (this._positionsConfig?.delegate ?? null)\n      : null;\n    if (typeof graphLayer.setPositionDelegate === 'function') {\n      graphLayer.setPositionDelegate(activeDelegate);\n    } else {\n      graphLayer.positionDelegate = activeDelegate;\n    }\n\n    const config = this._interpolationConfig ?? POSITION_INTERPOLATION_DEFAULTS;\n    const runtime = this._interpolationRuntime ?? {};\n    const useGpuInterpolation = config.enabled === true\n      && normalizeInterpolationMode(config.mode) === 'gpu'\n      && runtime.active === true;\n    const interpolationState = {\n      enabled: useGpuInterpolation,\n      factor: useGpuInterpolation ? clamp01(runtime.factor, 1) : 1,\n      sourceVersion: Number.isFinite(runtime.sourceVersion) ? runtime.sourceVersion : 0,\n      sourceCount: Number.isFinite(runtime.sourceCount) ? runtime.sourceCount : 0,\n      sourceView: useGpuInterpolation ? (runtime.sourcePositions ?? null) : null,\n      sourceWebGPUBuffer: useGpuInterpolation ? (runtime.sourceWebGPUBuffer ?? null) : null,\n      sourceWebGLTexture: useGpuInterpolation ? (runtime.sourceWebGLTexture ?? null) : null,\n      sourceTextureMeta: useGpuInterpolation ? (runtime.sourceTextureMeta ?? null) : null,\n    };\n    if (typeof graphLayer.setPositionInterpolationState === 'function') {\n      graphLayer.setPositionInterpolationState(interpolationState);\n    } else {\n      graphLayer.positionInterpolation = interpolationState;\n    }\n    return true;\n  }\n\n  _refreshUIBindings() {\n    const bindings = this.constructor.UI_BINDINGS ?? null;\n    if (!bindings) return;\n    for (const name of Object.keys(bindings)) {\n      if (typeof this[name] !== 'function') continue;\n      const value = this[name]();\n      this._emitUIBindingChange(name, value, { source: 'refresh', trackOverride: false });\n    }\n  }\n\n  _attachDensityLayer() {\n    const renderer = this.renderer ?? null;\n    if (!renderer || typeof renderer.addLayer !== 'function') return false;\n    const existing = this._densityLayer ?? null;\n    if (existing && existing.device === renderer.device) {\n      this._applyDensityConfigToLayer();\n      return true;\n    }\n    if (existing) {\n      try {\n        renderer.removeLayer(existing);\n      } catch (error) {\n        warnOnce(\n          this,\n          'density-layer-remove',\n          'Helios: failed to remove the previous density layer before attaching a new one.',\n          { error },\n        );\n      }\n      this._densityLayer = null;\n    }\n    const densityLayer = new DensityLayer({\n      initialConfig: this._densityConfig,\n      getGraphLayer: () => this.renderer?.graphLayer ?? null,\n      withBufferAccess: (fn) => this._withPositionBufferAccess(fn),\n      getNodePositionView: (network) => {\n        if (!network) return null;\n        try {\n          return network.getNodeAttributeBuffer?.(NODE_POSITION_ATTRIBUTE)?.view ?? null;\n        } catch (error) {\n          warnOnce(\n            this,\n            'density-node-position-view',\n            'Helios density layer: failed to read node position view.',\n            { error },\n          );\n          return null;\n        }\n      },\n      getNodePositionInfo: (network) => {\n        if (!network) return { view: null, version: null, count: 0 };\n        try {\n          const buffer = network.getNodeAttributeBuffer?.(NODE_POSITION_ATTRIBUTE) ?? null;\n          const view = buffer?.view ?? null;\n          const count = view && Number.isFinite(view.length) ? Math.floor(view.length / 3) : 0;\n          const version = Number.isFinite(buffer?.version) ? Number(buffer.version) : null;\n          return { view, version, count };\n        } catch (error) {\n          warnOnce(\n            this,\n            'density-node-position-info',\n            'Helios density layer: failed to read node position metadata.',\n            { error },\n          );\n          return { view: null, version: null, count: 0 };\n        }\n      },\n      onRuntimeState: (state) => {\n        if (!state || typeof state !== 'object') return;\n        const previousDiverging = this._densityRuntime?.diverging === true;\n        const previousDomain = Array.isArray(this._densityRuntime?.valueDomain)\n          ? this._densityRuntime.valueDomain\n          : null;\n        this._densityRuntime = { ...this._densityRuntime, ...state };\n        const nextDomain = Array.isArray(this._densityRuntime?.valueDomain)\n          ? this._densityRuntime.valueDomain\n          : null;\n        const domainChanged = previousDomain?.length !== nextDomain?.length\n          || (previousDomain ?? []).some((value, index) => value !== nextDomain?.[index]);\n        if ((this._densityRuntime?.diverging === true) !== previousDiverging || domainChanged) {\n          this._legendContentVersion += 1;\n        }\n      },\n    });\n    renderer.addLayer(densityLayer, { before: renderer.graphLayer ?? 'graph-layer' });\n    this._densityLayer = densityLayer;\n    this._applyDensityConfigToLayer();\n    return true;\n  }\n\n  _applyDensityConfigToLayer() {\n    this._densityLayer?.setConfig?.(this._densityConfig);\n  }\n\n  _queueRenderRequest() {\n    if (!this.scheduler?.requestRender) return;\n    if (typeof queueMicrotask === 'function') {\n      queueMicrotask(() => this.scheduler?.requestRender?.());\n      return;\n    }\n    Promise.resolve().then(() => this.scheduler?.requestRender?.());\n  }\n\n  _clearEdgeAdaptiveTimer(name) {\n    const runtime = this._edgeAdaptiveRuntime ?? null;\n    const timer = runtime?.[name] ?? null;\n    if (timer != null) {\n      clearTimeout(timer);\n      runtime[name] = null;\n    }\n  }\n\n  _scheduleEdgeAdaptiveCameraIdleRender() {\n    const runtime = this._edgeAdaptiveRuntime ?? null;\n    const config = this._edgeAdaptiveQualityConfig ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS;\n    if (!runtime || !config.enabled || config.fastDuringCamera !== true) return;\n    this._clearEdgeAdaptiveTimer('cameraIdleTimer');\n    const delay = Math.max(0, Number(config.interactionHoldMs ?? 0));\n    runtime.cameraIdleTimer = setTimeout(() => {\n      runtime.cameraIdleTimer = null;\n      this.scheduler?.requestRender?.();\n    }, delay);\n  }\n\n  _scheduleEdgeAdaptiveProbe() {\n    const runtime = this._edgeAdaptiveRuntime ?? null;\n    if (!runtime) return;\n    this._clearEdgeAdaptiveTimer('probeTimer');\n    if (!Number.isFinite(runtime.nextProbeAt)) return;\n    const delay = Math.max(0, runtime.nextProbeAt - performance.now());\n    runtime.probeTimer = setTimeout(() => {\n      runtime.probeTimer = null;\n      this.scheduler?.requestRender?.();\n    }, delay);\n  }\n\n  _markEdgeAdaptiveCameraInteraction(detail = null, now = performance.now()) {\n    const runtime = this._edgeAdaptiveRuntime ?? null;\n    const config = this._edgeAdaptiveQualityConfig ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS;\n    if (!runtime || config.enabled !== true || config.fastDuringCamera !== true) return false;\n    if (detail?.origin !== 'interaction') return false;\n    const holdMs = Number(config.interactionHoldMs ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS.interactionHoldMs);\n    runtime.cameraMovingUntil = now + Math.max(0, Number.isFinite(holdMs) ? holdMs : 0);\n    this._scheduleEdgeAdaptiveCameraIdleRender();\n    return true;\n  }\n\n  _edgeAdaptiveEdgesVisible() {\n    const graphLayer = this.renderer?.graphLayer ?? null;\n    if (!graphLayer || typeof graphLayer.shouldRenderEdges !== 'function') return false;\n    try {\n      return graphLayer.shouldRenderEdges() === true;\n    } catch (error) {\n      warnOnce(\n        this,\n        'edge-visibility-probe',\n        'Helios: failed to evaluate edge visibility; treating edges as hidden.',\n        { error },\n      );\n      return false;\n    }\n  }\n\n  _clearEdgeAdaptiveQualitySamples() {\n    const runtime = this._edgeAdaptiveRuntime ?? null;\n    if (!runtime) return;\n    runtime.qualityFrameSamples = [];\n    runtime.qualityFrameAverageMs = null;\n    runtime.fastFrameSamples = [];\n    runtime.fastFrameAverageMs = null;\n  }\n\n  _resolveEdgeAdaptiveActivity(now = performance.now()) {\n    const config = this._edgeAdaptiveQualityConfig ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS;\n    const runtime = this._edgeAdaptiveRuntime ?? null;\n    const layoutState = typeof this.scheduler?.getLayoutState === 'function'\n      ? this.scheduler.getLayoutState()\n      : (this.scheduler?.layoutEnabled !== false ? 'running' : 'stopped');\n    const layoutActive = config.fastDuringLayout === true && layoutState === 'running';\n    const cameraActive = config.fastDuringCamera === true\n      && Number.isFinite(runtime?.cameraMovingUntil)\n      && now < runtime.cameraMovingUntil;\n    return {\n      layoutActive,\n      cameraActive,\n      active: layoutActive || cameraActive,\n    };\n  }\n\n  _pushEdgeAdaptiveQualitySample(renderMs) {\n    const runtime = this._edgeAdaptiveRuntime ?? null;\n    const config = this._edgeAdaptiveQualityConfig ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS;\n    if (!runtime || !Number.isFinite(renderMs)) {\n      return { averageMs: null, sampleCount: 0, targetCount: 0 };\n    }\n    const targetCount = normalizePositiveInteger(\n      config.averageWindowFrames ?? config.slowFrameConsecutiveFrames,\n      EDGE_ADAPTIVE_QUALITY_DEFAULTS.averageWindowFrames,\n      1,\n      240,\n    );\n    const samples = Array.isArray(runtime.qualityFrameSamples) ? runtime.qualityFrameSamples : [];\n    samples.push(Number(renderMs));\n    if (samples.length > targetCount) {\n      samples.splice(0, samples.length - targetCount);\n    }\n    runtime.qualityFrameSamples = samples;\n    runtime.qualityFrameAverageMs = samples.length > 0\n      ? (samples.reduce((sum, value) => sum + value, 0) / samples.length)\n      : null;\n    return {\n      averageMs: runtime.qualityFrameAverageMs,\n      sampleCount: samples.length,\n      targetCount,\n    };\n  }\n\n  _pushEdgeAdaptiveFastSample(renderMs) {\n    const runtime = this._edgeAdaptiveRuntime ?? null;\n    const config = this._edgeAdaptiveQualityConfig ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS;\n    if (!runtime || !Number.isFinite(renderMs)) {\n      return { averageMs: null, sampleCount: 0, targetCount: 0 };\n    }\n    const targetCount = normalizePositiveInteger(\n      config.averageWindowFrames ?? config.slowFrameConsecutiveFrames,\n      EDGE_ADAPTIVE_QUALITY_DEFAULTS.averageWindowFrames,\n      1,\n      240,\n    );\n    const samples = Array.isArray(runtime.fastFrameSamples) ? runtime.fastFrameSamples : [];\n    samples.push(Number(renderMs));\n    if (samples.length > targetCount) {\n      samples.splice(0, samples.length - targetCount);\n    }\n    runtime.fastFrameSamples = samples;\n    runtime.fastFrameAverageMs = samples.length > 0\n      ? (samples.reduce((sum, value) => sum + value, 0) / samples.length)\n      : null;\n    return {\n      averageMs: runtime.fastFrameAverageMs,\n      sampleCount: samples.length,\n      targetCount,\n    };\n  }\n\n  _resolveEdgeAdaptiveFrameCostMs(renderMs, frameIntervalMs) {\n    const renderDuration = Number(renderMs);\n    const frameInterval = Number(frameIntervalMs);\n    const hasRenderDuration = Number.isFinite(renderDuration) && renderDuration >= 0;\n    const hasFrameInterval = Number.isFinite(frameInterval) && frameInterval >= 0;\n    if (hasRenderDuration && hasFrameInterval) return Math.max(renderDuration, frameInterval);\n    if (hasRenderDuration) return renderDuration;\n    if (hasFrameInterval) return frameInterval;\n    return null;\n  }\n\n  _readLayoutAlphaMin(layout = null) {\n    const settings = Number(layout?.settings?.alphaMin);\n    if (Number.isFinite(settings)) return settings;\n    const options = Number(layout?.options?.alphaMin);\n    if (Number.isFinite(options)) return options;\n    const delegate = layout?.getPositionDelegate?.() ?? layout?.positionDelegate ?? null;\n    const delegateAlphaMin = Number(delegate?.alphaMin);\n    if (Number.isFinite(delegateAlphaMin)) return delegateAlphaMin;\n    return NaN;\n  }\n\n  _computeEdgeAdaptiveProbeDelay(failedProbeCount = 0) {\n    const config = this._edgeAdaptiveQualityConfig ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS;\n    const base = Math.max(0, Number(config.probeIntervalMs ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS.probeIntervalMs));\n    if (!(base > 0)) return 0;\n    const failures = Math.max(0, Math.floor(Number(failedProbeCount) || 0));\n    const scaled = base * (EDGE_ADAPTIVE_LAYOUT_HYSTERESIS.backoffFactor ** failures);\n    return Math.min(\n      Math.max(base, scaled),\n      EDGE_ADAPTIVE_LAYOUT_HYSTERESIS.maxBackoffMs,\n    );\n  }\n\n  _shouldAttemptEdgeAdaptiveLayoutProbe(now = performance.now()) {\n    const runtime = this._edgeAdaptiveRuntime ?? null;\n    if (!runtime) return false;\n    if (!(Number.isFinite(runtime.nextProbeAt) && now >= runtime.nextProbeAt)) return false;\n    const config = this._edgeAdaptiveQualityConfig ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS;\n    const targetFastAverage = Number(config.slowFrameThresholdMs ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS.slowFrameThresholdMs)\n      * EDGE_ADAPTIVE_LAYOUT_HYSTERESIS.exitThresholdFactor;\n    const fastAverage = Number(runtime.fastFrameAverageMs);\n    if (Number.isFinite(fastAverage) && fastAverage > targetFastAverage) return false;\n    const currentAlpha = this._readLayoutAlpha(this._layout ?? null);\n    if (Number.isFinite(currentAlpha)) {\n      const fallbackAlpha = Number.isFinite(runtime.performanceFallbackAlpha)\n        ? runtime.performanceFallbackAlpha\n        : currentAlpha;\n      const alphaMin = this._readLayoutAlphaMin(this._layout ?? null);\n      const alphaThreshold = Math.max(\n        fallbackAlpha * EDGE_ADAPTIVE_LAYOUT_HYSTERESIS.alphaProbeFactor,\n        Number.isFinite(alphaMin)\n          ? alphaMin * EDGE_ADAPTIVE_LAYOUT_HYSTERESIS.alphaMinMultiplier\n          : Number.NEGATIVE_INFINITY,\n      );\n      if (currentAlpha > alphaThreshold) return false;\n    }\n    return true;\n  }\n\n  _emitEdgeAdaptiveQualityChange() {\n    this._emitUIBindingChange('edgeAdaptiveQuality', this.edgeAdaptiveQuality(), {\n      source: 'runtime',\n      trackOverride: false,\n    });\n  }\n\n  _emitEdgeAdaptiveQualityConfigBindings() {\n    const value = this.edgeAdaptiveQuality();\n    this._emitUIBindingChange('edgeAdaptiveQuality', value);\n    this._emitUIBindingChange('edgeAdaptiveQualityEnabled', value.enabled);\n    this._emitUIBindingChange('edgeAdaptiveQualitySlowFrameThresholdMs', value.slowFrameThresholdMs);\n    this._emitUIBindingChange('edgeAdaptiveQualitySlowFrameConsecutiveFrames', value.slowFrameConsecutiveFrames);\n    this._emitUIBindingChange('edgeAdaptiveQualityProbeIntervalMs', value.probeIntervalMs);\n    this._emitUIBindingChange('edgeAdaptiveQualityInteractionHoldMs', value.interactionHoldMs);\n    this._emitUIBindingChange('edgeAdaptiveQualityFastDuringCamera', value.fastDuringCamera);\n    this._emitUIBindingChange('edgeAdaptiveQualityFastDuringLayout', value.fastDuringLayout);\n  }\n\n  _setAdaptiveEdgeFastRendering(enabled, reason = null, options = {}) {\n    const runtime = this._edgeAdaptiveRuntime ?? null;\n    const graphLayer = this.renderer?.graphLayer ?? null;\n    const next = enabled === true;\n    const previous = graphLayer?.edgeAdaptiveFastRendering === true;\n    const previousReason = runtime?.reason ?? null;\n    if (graphLayer) {\n      graphLayer.setAdaptiveEdgeFastRendering?.(next);\n    } else {\n      this._pendingGraphLayerProps.set('edgeAdaptiveFastRendering', next);\n    }\n    if (runtime) {\n      runtime.reason = reason ?? (next ? 'performance' : 'quality');\n    }\n    const changed = previous !== next || previousReason !== (runtime?.reason ?? null);\n    if (changed) {\n      this._emitEdgeAdaptiveQualityChange();\n      if (options.requestRender === true) {\n        this._queueRenderRequest();\n      }\n    }\n    return changed;\n  }\n\n  _resolveEdgeAdaptiveFastState(now = performance.now()) {\n    const graphLayer = this.renderer?.graphLayer ?? null;\n    const runtime = this._edgeAdaptiveRuntime ?? null;\n    const manualFast = graphLayer?.edgeFastRendering === true;\n    const adaptiveFast = graphLayer?.edgeAdaptiveFastRendering === true;\n    if (runtime?.forceHighQuality === true) {\n      return { fast: false, reason: 'export' };\n    }\n    if (!this._edgeAdaptiveEdgesVisible()) {\n      return { fast: false, reason: 'hidden' };\n    }\n    if (manualFast) {\n      return { fast: false, reason: 'manual' };\n    }\n    if (!(this._edgeAdaptiveQualityConfig ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS).enabled) {\n      return { fast: false, reason: 'disabled' };\n    }\n    const activity = this._resolveEdgeAdaptiveActivity(now);\n    if (!activity.active) {\n      return { fast: false, reason: 'quality' };\n    }\n    if (adaptiveFast && runtime?.reason === 'performance') {\n      if (\n        activity.layoutActive\n        && !activity.cameraActive\n        && this._shouldAttemptEdgeAdaptiveLayoutProbe(now)\n      ) {\n        return { fast: false, reason: 'probe' };\n      }\n      return { fast: true, reason: 'performance' };\n    }\n    return { fast: false, reason: 'quality' };\n  }\n\n  _updateEdgeAdaptiveQualityBeforeRender(now = performance.now()) {\n    const graphLayer = this.renderer?.graphLayer ?? null;\n    const wasAdaptiveFast = graphLayer?.edgeAdaptiveFastRendering === true;\n    const previousReason = this._edgeAdaptiveRuntime?.reason ?? null;\n    const activity = this._resolveEdgeAdaptiveActivity(now);\n    if (this._edgeAdaptiveRuntime) {\n      if (activity.active !== (this._edgeAdaptiveRuntime.activityActive === true)) {\n        this._edgeAdaptiveRuntime.activityActive = activity.active;\n        this._edgeAdaptiveRuntime.skipNextQualitySample = activity.active === true;\n        this._clearEdgeAdaptiveQualitySamples();\n      }\n    }\n    const decision = this._resolveEdgeAdaptiveFastState(now);\n    if (\n      this._edgeAdaptiveRuntime\n      && wasAdaptiveFast\n      && decision.fast !== true\n      && this._edgeAdaptiveRuntime.reason === 'performance'\n    ) {\n      this._edgeAdaptiveRuntime.nextProbeAt = Number.NEGATIVE_INFINITY;\n      this._clearEdgeAdaptiveTimer('probeTimer');\n      this._clearEdgeAdaptiveQualitySamples();\n    }\n    if (\n      this._edgeAdaptiveRuntime\n      && wasAdaptiveFast\n      && decision.fast !== true\n      && decision.reason === 'probe'\n      && previousReason === 'performance'\n    ) {\n      this._edgeAdaptiveRuntime.skipNextQualitySample = true;\n      this._clearEdgeAdaptiveQualitySamples();\n    }\n    this._setAdaptiveEdgeFastRendering(decision.fast, decision.reason, { requestRender: false });\n    return decision;\n  }\n\n  _updateEdgeAdaptiveQualityAfterRender(renderMs, now = performance.now()) {\n    const runtime = this._edgeAdaptiveRuntime ?? null;\n    const config = this._edgeAdaptiveQualityConfig ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS;\n    const graphLayer = this.renderer?.graphLayer ?? null;\n    if (!runtime || !graphLayer) return;\n    runtime.lastRenderMs = Number.isFinite(renderMs) ? renderMs : null;\n    const edgesVisible = this._edgeAdaptiveEdgesVisible();\n    const manualFast = graphLayer.edgeFastRendering === true;\n    const adaptiveFast = graphLayer.edgeAdaptiveFastRendering === true;\n    const activity = this._resolveEdgeAdaptiveActivity(now);\n    if (runtime.forceHighQuality === true || !config.enabled || manualFast || !edgesVisible) {\n      runtime.nextProbeAt = Number.NEGATIVE_INFINITY;\n      this._clearEdgeAdaptiveTimer('probeTimer');\n      this._clearEdgeAdaptiveQualitySamples();\n      runtime.failedProbeCount = 0;\n      runtime.performanceFallbackAt = Number.NEGATIVE_INFINITY;\n      runtime.performanceFallbackAlpha = NaN;\n      return;\n    }\n    if (!activity.active) {\n      runtime.nextProbeAt = Number.NEGATIVE_INFINITY;\n      this._clearEdgeAdaptiveTimer('probeTimer');\n      this._clearEdgeAdaptiveQualitySamples();\n      runtime.failedProbeCount = 0;\n      runtime.performanceFallbackAt = Number.NEGATIVE_INFINITY;\n      runtime.performanceFallbackAlpha = NaN;\n      return;\n    }\n    if (adaptiveFast) {\n      if (runtime.reason === 'performance') {\n        this._pushEdgeAdaptiveFastSample(renderMs);\n      }\n      return;\n    }\n    if (runtime.skipNextQualitySample === true) {\n      runtime.skipNextQualitySample = false;\n      runtime.lastRenderMs = Number.isFinite(renderMs) ? renderMs : null;\n      return;\n    }\n    const { averageMs, sampleCount, targetCount } = this._pushEdgeAdaptiveQualitySample(renderMs);\n    if (sampleCount < targetCount || !Number.isFinite(averageMs)) {\n      return;\n    }\n    const slowThreshold = Number(config.slowFrameThresholdMs ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS.slowFrameThresholdMs);\n    const exitThreshold = slowThreshold * EDGE_ADAPTIVE_LAYOUT_HYSTERESIS.exitThresholdFactor;\n    if (runtime.reason === 'probe') {\n      if (averageMs <= exitThreshold) {\n        runtime.reason = 'quality';\n        runtime.failedProbeCount = 0;\n        runtime.nextProbeAt = Number.NEGATIVE_INFINITY;\n        runtime.performanceFallbackAt = Number.NEGATIVE_INFINITY;\n        runtime.performanceFallbackAlpha = NaN;\n        runtime.fastFrameSamples = [];\n        runtime.fastFrameAverageMs = null;\n        this._clearEdgeAdaptiveTimer('probeTimer');\n        return;\n      }\n      runtime.reason = 'performance';\n      runtime.failedProbeCount = Math.max(0, Math.floor(Number(runtime.failedProbeCount) || 0)) + 1;\n      runtime.nextProbeAt = now + this._computeEdgeAdaptiveProbeDelay(runtime.failedProbeCount);\n      runtime.performanceFallbackAt = now;\n      runtime.performanceFallbackAlpha = this._readLayoutAlpha(this._layout ?? null);\n      runtime.fastFrameSamples = [];\n      runtime.fastFrameAverageMs = null;\n      this._clearEdgeAdaptiveQualitySamples();\n      this._setAdaptiveEdgeFastRendering(true, 'performance', { requestRender: true });\n      return;\n    }\n    if (averageMs > slowThreshold) {\n      runtime.failedProbeCount = 0;\n      runtime.performanceFallbackAt = now;\n      runtime.performanceFallbackAlpha = this._readLayoutAlpha(this._layout ?? null);\n      runtime.nextProbeAt = now + this._computeEdgeAdaptiveProbeDelay(0);\n      runtime.fastFrameSamples = [];\n      runtime.fastFrameAverageMs = null;\n      this._clearEdgeAdaptiveQualitySamples();\n      this._setAdaptiveEdgeFastRendering(true, 'performance', { requestRender: true });\n      return;\n    }\n  }\n\n  _getGraphLayerProp(name) {\n    if (this.renderer?.graphLayer && name in this.renderer.graphLayer) {\n      return this.renderer.graphLayer[name];\n    }\n    return this._pendingGraphLayerProps.get(name);\n  }\n\n  _requestGraphPropLabelReselect(reason) {\n    if (this._suppressStateBindingUiEvent > 0) {\n      this._pendingStateBindingLabelReselectReason = reason;\n      if (this._pendingStateBindingLabelReselect) return;\n      this._pendingStateBindingLabelReselect = true;\n      const schedule = typeof requestAnimationFrame === 'function'\n        ? requestAnimationFrame\n        : (callback) => setTimeout(callback, 16);\n      schedule(() => {\n        this._pendingStateBindingLabelReselect = false;\n        const nextReason = this._pendingStateBindingLabelReselectReason ?? reason;\n        this._pendingStateBindingLabelReselectReason = null;\n        this._labels?.requestFullReselect?.(nextReason);\n      });\n      return;\n    }\n    this._labels?.requestFullReselect?.(reason);\n  }\n\n  _setGraphLayerProp(name, value) {\n    if (this.renderer?.graphLayer && name in this.renderer.graphLayer) {\n      this.renderer.graphLayer[name] = value;\n      this.scheduler.requestRender();\n      this._requestGraphPropLabelReselect(`graph-prop:${name}`);\n      this._emitUIBindingChange(name, value);\n      return this;\n    }\n    this._pendingGraphLayerProps.set(name, value);\n    this._requestGraphPropLabelReselect(`graph-prop-pending:${name}`);\n    this._emitUIBindingChange(name, value);\n    return this;\n  }\n\n  _getRendererProp(name) {\n    if (this.renderer && name in this.renderer) {\n      return this.renderer[name];\n    }\n    return this._pendingRendererProps.get(name);\n  }\n\n  _setRendererProp(name, value, detail = {}) {\n    if (this.renderer && name in this.renderer) {\n      this.renderer[name] = value;\n      this.scheduler.requestRender();\n      this._emitUIBindingChange(name, value, detail);\n      return this;\n    }\n    this._pendingRendererProps.set(name, value);\n    this._emitUIBindingChange(name, value, detail);\n    return this;\n  }\n\n  /**\n   * Read or set the multiplier applied to edge width attributes.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Edge width scale multiplier.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  edgeWidthScale(value) {\n    if (arguments.length === 0) return this._getGraphLayerProp('edgeWidthScale');\n    return this._setGraphLayerProp('edgeWidthScale', Number(value));\n  }\n\n  /**\n   * Read or set the constant edge width added before scaling.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Base edge width in render units.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  edgeWidthBase(value) {\n    if (arguments.length === 0) return this._getGraphLayerProp('edgeWidthBase');\n    return this._setGraphLayerProp('edgeWidthBase', Number(value));\n  }\n\n  /**\n   * Read or set the multiplier applied to edge opacity attributes.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Edge opacity scale multiplier.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  edgeOpacityScale(value) {\n    if (arguments.length === 0) return this._getGraphLayerProp('edgeOpacityScale');\n    return this._setGraphLayerProp('edgeOpacityScale', Number(value));\n  }\n\n  /**\n   * Read or set the constant edge opacity added before scaling.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Base edge opacity.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  edgeOpacityBase(value) {\n    if (arguments.length === 0) return this._getGraphLayerProp('edgeOpacityBase');\n    return this._setGraphLayerProp('edgeOpacityBase', Number(value));\n  }\n\n  /**\n   * Read or set the multiplier applied to node opacity attributes.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Node opacity scale multiplier.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  nodeOpacityScale(value) {\n    if (arguments.length === 0) return this._getGraphLayerProp('nodeOpacityScale');\n    return this._setGraphLayerProp('nodeOpacityScale', Number(value));\n  }\n\n  /**\n   * Read or set the constant node opacity added before scaling.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Base node opacity.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  nodeOpacityBase(value) {\n    if (arguments.length === 0) return this._getGraphLayerProp('nodeOpacityBase');\n    return this._setGraphLayerProp('nodeOpacityBase', Number(value));\n  }\n\n  /**\n   * Read or set the multiplier applied to node size attributes.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Node size scale multiplier.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  nodeSizeScale(value) {\n    if (arguments.length === 0) return this._getGraphLayerProp('nodeSizeScale');\n    return this._setGraphLayerProp('nodeSizeScale', Number(value));\n  }\n\n  /**\n   * Read or set the constant node radius added before scaling.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Base node radius in render units.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  nodeSizeBase(value) {\n    if (arguments.length === 0) return this._getGraphLayerProp('nodeSizeBase');\n    return this._setGraphLayerProp('nodeSizeBase', Number(value));\n  }\n\n  /**\n   * Read or set semantic zoom compensation for node and label sizing.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Exponent controlling how strongly zoom affects apparent size.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  semanticZoomExponent(value) {\n    if (arguments.length === 0) return this._getGraphLayerProp('semanticZoomExponent');\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this._setGraphLayerProp('semanticZoomExponent', numeric);\n  }\n\n  /**\n   * Read or set the multiplier applied to node outline width attributes.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Node outline width scale multiplier.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  nodeOutlineWidthScale(value) {\n    if (arguments.length === 0) return this._getGraphLayerProp('nodeOutlineWidthScale');\n    return this._setGraphLayerProp('nodeOutlineWidthScale', Number(value));\n  }\n\n  /**\n   * Read or set the constant node outline width added before scaling.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Base node outline width in render units.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  nodeOutlineWidthBase(value) {\n    if (arguments.length === 0) return this._getGraphLayerProp('nodeOutlineWidthBase');\n    return this._setGraphLayerProp('nodeOutlineWidthBase', Number(value));\n  }\n\n  /**\n   * Read or set the default node outline color.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {string|Array<number>} [color] - CSS hex color or normalized RGBA tuple.\n   * @returns {Array<number>|Helios} Current RGBA color when omitted; otherwise this Helios instance.\n   */\n  nodeOutlineColor(color) {\n    if (arguments.length === 0) return this._getGraphLayerProp('nodeOutlineColor');\n    const normalized = normalizeColorInput(color);\n    if (!normalized) {\n      throw new Error('nodeOutlineColor(color) expects #rgb/#rgba/#rrggbb/#rrggbbaa or [r,g,b(,a)]');\n    }\n    return this._setGraphLayerProp('nodeOutlineColor', normalized);\n  }\n\n  /**\n   * Read or set whether outline attributes participate in node styling.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {boolean} [value] - Enable outline attribute mapping.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  nodeOutlineUseAttributes(value) {\n    if (arguments.length === 0) return this._getGraphLayerProp('nodeOutlineUseAttributes');\n    return this._setGraphLayerProp('nodeOutlineUseAttributes', Boolean(value));\n  }\n\n  /**\n   * Read or set how far edge geometry is trimmed away from node centers.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Trim amount in node-radius units.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  edgeEndpointTrim(value) {\n    if (arguments.length === 0) return this._getGraphLayerProp('edgeEndpointTrim');\n    return this._setGraphLayerProp('edgeEndpointTrim', Number(value));\n  }\n\n  /**\n   * Read or set whether rendered edge width is clamped by endpoint node diameter.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {boolean} [value] - Clamp thick edges to avoid overpowering small nodes.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  edgeWidthClampToNodeDiameter(value) {\n    if (arguments.length === 0) {\n      const current = this._getGraphLayerProp('edgeWidthClampToNodeDiameter');\n      return current == null ? true : current !== false;\n    }\n    return this._setGraphLayerProp('edgeWidthClampToNodeDiameter', value !== false);\n  }\n\n  /**\n   * Read or set whether node rendering blends visually with adjacent edges.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {boolean} [value] - Enable node/edge blending.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  nodeBlendWithEdges(value) {\n    if (arguments.length === 0) return this._getGraphLayerProp('nodeBlendWithEdges');\n    return this._setGraphLayerProp('nodeBlendWithEdges', Boolean(value));\n  }\n\n  /**\n   * Read or set whether edge fragments write to the depth buffer.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {boolean} [value] - Enable depth writes for edges.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  edgeDepthWrite(value) {\n    if (arguments.length === 0) return this._getGraphLayerProp('edgeDepthWrite');\n    return this._setGraphLayerProp('edgeDepthWrite', Boolean(value));\n  }\n\n  /**\n   * Read or set the manual fast edge-rendering override.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {boolean} [value] - Enable the fast edge rendering path.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  edgeFastRendering(value) {\n    if (arguments.length === 0) return this._getGraphLayerProp('edgeFastRendering');\n    return this._setGraphLayerProp('edgeFastRendering', Boolean(value));\n  }\n\n  /**\n   * Read or set whether shaded rendering is enabled.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {boolean} [value] - Enable lighting-based shading.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  shadedEnabled(value) {\n    if (arguments.length === 0) {\n      const current = this._getGraphLayerProp('shadedEnabled');\n      return current == null ? false : current === true;\n    }\n    return this._setGraphLayerProp('shadedEnabled', Boolean(value));\n  }\n\n  /**\n   * Read or set whether node geometry receives shaded lighting.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {boolean} [value] - Enable shading for nodes.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  shadedNodes(value) {\n    if (arguments.length === 0) {\n      const current = this._getGraphLayerProp('shadedNodes');\n      return current == null ? true : current !== false;\n    }\n    return this._setGraphLayerProp('shadedNodes', value !== false);\n  }\n\n  /**\n   * Read or set whether edge geometry receives shaded lighting.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {boolean} [value] - Enable shading for edges.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  shadedEdges(value) {\n    if (arguments.length === 0) {\n      const current = this._getGraphLayerProp('shadedEdges');\n      return current === true;\n    }\n    return this._setGraphLayerProp('shadedEdges', value === true);\n  }\n\n  /**\n   * Read or set the directional light vector used by shaded rendering.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {Array<number>|object} [value] - Light direction as `[x,y,z]` or direction-like object.\n   * @returns {Array<number>|Helios} Current direction when omitted; otherwise this Helios instance.\n   */\n  shadedLightDirection(value) {\n    if (arguments.length === 0) {\n      return normalizeDirectionInput(this._getGraphLayerProp('shadedLightDirection'), SHADED_LIGHT_DIRECTION_DEFAULT);\n    }\n    return this._setGraphLayerProp('shadedLightDirection', normalizeDirectionInput(value, SHADED_LIGHT_DIRECTION_DEFAULT));\n  }\n\n  /**\n   * Read or set the x component of the shaded light direction.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - X component.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  shadedLightDirectionX(value) {\n    if (arguments.length === 0) return this.shadedLightDirection()[0];\n    const next = this.shadedLightDirection();\n    next[0] = Number(value);\n    return this.shadedLightDirection(next);\n  }\n\n  /**\n   * Read or set the y component of the shaded light direction.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Y component.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  shadedLightDirectionY(value) {\n    if (arguments.length === 0) return this.shadedLightDirection()[1];\n    const next = this.shadedLightDirection();\n    next[1] = Number(value);\n    return this.shadedLightDirection(next);\n  }\n\n  /**\n   * Read or set the z component of the shaded light direction.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Z component.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  shadedLightDirectionZ(value) {\n    if (arguments.length === 0) return this.shadedLightDirection()[2];\n    const next = this.shadedLightDirection();\n    next[2] = Number(value);\n    return this.shadedLightDirection(next);\n  }\n\n  /**\n   * Read or set the direct light color used by shaded rendering.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {string|Array<number>} [color] - CSS hex color or normalized RGBA tuple.\n   * @returns {Array<number>|Helios} Current RGBA color when omitted; otherwise this Helios instance.\n   */\n  shadedLightColor(color) {\n    if (arguments.length === 0) {\n      return cloneColorInput(this._getGraphLayerProp('shadedLightColor'), SHADED_LIGHT_COLOR_DEFAULT);\n    }\n    const normalized = normalizeColorInput(color);\n    if (!normalized) {\n      throw new Error('shadedLightColor(color) expects #rgb/#rgba/#rrggbb/#rrggbbaa or [r,g,b(,a)]');\n    }\n    return this._setGraphLayerProp('shadedLightColor', normalized);\n  }\n\n  /**\n   * Read or set the upper hemisphere ambient color for shaded rendering.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {string|Array<number>} [color] - CSS hex color or normalized RGBA tuple.\n   * @returns {Array<number>|Helios} Current RGBA color when omitted; otherwise this Helios instance.\n   */\n  shadedAmbientTopColor(color) {\n    if (arguments.length === 0) {\n      return cloneColorInput(this._getGraphLayerProp('shadedAmbientTopColor'), SHADED_AMBIENT_TOP_COLOR_DEFAULT);\n    }\n    const normalized = normalizeColorInput(color);\n    if (!normalized) {\n      throw new Error('shadedAmbientTopColor(color) expects #rgb/#rgba/#rrggbb/#rrggbbaa or [r,g,b(,a)]');\n    }\n    return this._setGraphLayerProp('shadedAmbientTopColor', normalized);\n  }\n\n  /**\n   * Read or set the lower hemisphere ambient color for shaded rendering.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {string|Array<number>} [color] - CSS hex color or normalized RGBA tuple.\n   * @returns {Array<number>|Helios} Current RGBA color when omitted; otherwise this Helios instance.\n   */\n  shadedAmbientBottomColor(color) {\n    if (arguments.length === 0) {\n      return cloneColorInput(this._getGraphLayerProp('shadedAmbientBottomColor'), SHADED_AMBIENT_BOTTOM_COLOR_DEFAULT);\n    }\n    const normalized = normalizeColorInput(color);\n    if (!normalized) {\n      throw new Error('shadedAmbientBottomColor(color) expects #rgb/#rgba/#rrggbb/#rrggbbaa or [r,g,b(,a)]');\n    }\n    return this._setGraphLayerProp('shadedAmbientBottomColor', normalized);\n  }\n\n  /**\n   * Read or set diffuse lighting strength for shaded rendering.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Non-negative diffuse strength.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  shadedDiffuseStrength(value) {\n    if (arguments.length === 0) {\n      const current = Number(this._getGraphLayerProp('shadedDiffuseStrength'));\n      return Number.isFinite(current) ? current : SHADED_DIFFUSE_STRENGTH_DEFAULT;\n    }\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this._setGraphLayerProp('shadedDiffuseStrength', Math.max(0, numeric));\n  }\n\n  /**\n   * Read or set ambient lighting strength for shaded rendering.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Non-negative ambient strength.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  shadedAmbientStrength(value) {\n    if (arguments.length === 0) {\n      const current = Number(this._getGraphLayerProp('shadedAmbientStrength'));\n      return Number.isFinite(current) ? current : SHADED_AMBIENT_STRENGTH_DEFAULT;\n    }\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this._setGraphLayerProp('shadedAmbientStrength', Math.max(0, numeric));\n  }\n\n  /**\n   * Read or set the specular highlight color for shaded rendering.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {string|Array<number>} [color] - CSS hex color or normalized RGBA tuple.\n   * @returns {Array<number>|Helios} Current RGBA color when omitted; otherwise this Helios instance.\n   */\n  shadedSpecularColor(color) {\n    if (arguments.length === 0) {\n      return cloneColorInput(this._getGraphLayerProp('shadedSpecularColor'), SHADED_SPECULAR_COLOR_DEFAULT);\n    }\n    const normalized = normalizeColorInput(color);\n    if (!normalized) {\n      throw new Error('shadedSpecularColor(color) expects #rgb/#rgba/#rrggbb/#rrggbbaa or [r,g,b(,a)]');\n    }\n    return this._setGraphLayerProp('shadedSpecularColor', normalized);\n  }\n\n  /**\n   * Read or set specular highlight strength for shaded rendering.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Non-negative specular strength.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  shadedSpecularStrength(value) {\n    if (arguments.length === 0) {\n      const current = Number(this._getGraphLayerProp('shadedSpecularStrength'));\n      return Number.isFinite(current) ? current : SHADED_SPECULAR_STRENGTH_DEFAULT;\n    }\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this._setGraphLayerProp('shadedSpecularStrength', Math.max(0, numeric));\n  }\n\n  /**\n   * Read or set specular shininess for shaded rendering.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Shininess exponent.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  shadedShininess(value) {\n    if (arguments.length === 0) {\n      const current = Number(this._getGraphLayerProp('shadedShininess'));\n      return Number.isFinite(current) ? current : SHADED_SHININESS_DEFAULT;\n    }\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this._setGraphLayerProp('shadedShininess', Math.max(1, numeric));\n  }\n\n  /**\n   * Read or set whether screen-space ambient occlusion is enabled.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {boolean} [value] - Enable ambient occlusion when the renderer supports it.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  ambientOcclusionEnabled(value) {\n    if (arguments.length === 0) {\n      const current = this._getGraphLayerProp('ambientOcclusionEnabled');\n      return current === true;\n    }\n    return this._setGraphLayerProp('ambientOcclusionEnabled', Boolean(value));\n  }\n\n  /**\n   * Read or set whether ambient occlusion is applied to nodes.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {boolean} [value] - Enable node occlusion.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  ambientOcclusionNodes(value) {\n    if (arguments.length === 0) {\n      const current = this._getGraphLayerProp('ambientOcclusionNodes');\n      return current == null ? true : current !== false;\n    }\n    return this._setGraphLayerProp('ambientOcclusionNodes', value !== false);\n  }\n\n  /**\n   * Read or set whether ambient occlusion is applied to edges.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {boolean} [value] - Enable edge occlusion.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  ambientOcclusionEdges(value) {\n    if (arguments.length === 0) {\n      const current = this._getGraphLayerProp('ambientOcclusionEdges');\n      return current === true;\n    }\n    return this._setGraphLayerProp('ambientOcclusionEdges', value === true);\n  }\n\n  /**\n   * Read or set ambient occlusion strength.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Non-negative occlusion strength.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  ambientOcclusionStrength(value) {\n    if (arguments.length === 0) {\n      const current = Number(this._getGraphLayerProp('ambientOcclusionStrength'));\n      return Number.isFinite(current) ? current : AMBIENT_OCCLUSION_STRENGTH_DEFAULT;\n    }\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this._setGraphLayerProp('ambientOcclusionStrength', Math.max(0, numeric));\n  }\n\n  /**\n   * Read or set ambient occlusion sampling radius.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Radius in screen-space sample units.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  ambientOcclusionRadius(value) {\n    if (arguments.length === 0) {\n      const current = Number(this._getGraphLayerProp('ambientOcclusionRadius'));\n      return Number.isFinite(current) ? current : AMBIENT_OCCLUSION_RADIUS_DEFAULT;\n    }\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this._setGraphLayerProp('ambientOcclusionRadius', Math.max(1, numeric));\n  }\n\n  /**\n   * Read or set ambient occlusion depth bias.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Non-negative depth bias.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  ambientOcclusionBias(value) {\n    if (arguments.length === 0) {\n      const current = Number(this._getGraphLayerProp('ambientOcclusionBias'));\n      return Number.isFinite(current) ? current : AMBIENT_OCCLUSION_BIAS_DEFAULT;\n    }\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this._setGraphLayerProp('ambientOcclusionBias', Math.max(0, numeric));\n  }\n\n  /**\n   * Read or set ambient occlusion compositing mode.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {string} [value] - Ambient occlusion mode identifier.\n   * @returns {string|Helios} Current mode when omitted; otherwise this Helios instance.\n   */\n  ambientOcclusionMode(value) {\n    if (arguments.length === 0) {\n      return normalizeAmbientOcclusionMode(\n        this._getGraphLayerProp('ambientOcclusionMode'),\n        AMBIENT_OCCLUSION_MODE_DEFAULT,\n      );\n    }\n    const normalized = normalizeAmbientOcclusionMode(value, null);\n    if (!normalized) return this;\n    return this._setGraphLayerProp('ambientOcclusionMode', normalized);\n  }\n\n  /**\n   * Read or set ambient occlusion intensity scaling.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Non-negative intensity multiplier.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  ambientOcclusionIntensityScale(value) {\n    if (arguments.length === 0) {\n      const current = Number(this._getGraphLayerProp('ambientOcclusionIntensityScale'));\n      return Number.isFinite(current) ? current : AMBIENT_OCCLUSION_INTENSITY_SCALE_DEFAULT;\n    }\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this._setGraphLayerProp('ambientOcclusionIntensityScale', Math.max(0, numeric));\n  }\n\n  /**\n   * Read or set ambient occlusion intensity offset.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Non-negative intensity offset.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  ambientOcclusionIntensityShift(value) {\n    if (arguments.length === 0) {\n      const current = Number(this._getGraphLayerProp('ambientOcclusionIntensityShift'));\n      return Number.isFinite(current) ? current : AMBIENT_OCCLUSION_INTENSITY_SHIFT_DEFAULT;\n    }\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this._setGraphLayerProp('ambientOcclusionIntensityShift', Math.max(0, numeric));\n  }\n\n  /**\n   * Read or set ambient occlusion quality preset.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {string} [value] - Ambient occlusion quality preset.\n   * @returns {string|Helios} Current quality when omitted; otherwise this Helios instance.\n   */\n  ambientOcclusionQuality(value) {\n    if (arguments.length === 0) {\n      return normalizeAmbientOcclusionQuality(\n        this._getGraphLayerProp('ambientOcclusionQuality'),\n        AMBIENT_OCCLUSION_QUALITY_DEFAULT,\n      );\n    }\n    const normalized = normalizeAmbientOcclusionQuality(value, null);\n    if (!normalized) return this;\n    return this._setGraphLayerProp('ambientOcclusionQuality', normalized);\n  }\n\n  /**\n   * Read or update the adaptive edge-quality policy used to switch fast edge rendering on slow frames.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {object} [options] - Adaptive quality configuration. Omit to read the current configuration and runtime status.\n   * @returns {object|Helios} Current policy snapshot when omitted; otherwise this Helios instance.\n   */\n  edgeAdaptiveQuality(options) {\n    if (arguments.length === 0) {\n      const config = { ...(this._edgeAdaptiveQualityConfig ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS) };\n      const runtime = this._edgeAdaptiveRuntime ?? null;\n      return {\n        ...config,\n        slowFrameConsecutiveFrames: config.averageWindowFrames,\n        cameraIdleMs: config.interactionHoldMs,\n        active: this.renderer?.graphLayer?.edgeAdaptiveFastRendering === true,\n        manualFastRendering: this.renderer?.graphLayer?.edgeFastRendering === true,\n        reason: runtime?.reason ?? null,\n        lastRenderMs: Number.isFinite(runtime?.lastRenderMs) ? runtime.lastRenderMs : null,\n        qualityFrameAverageMs: Number.isFinite(runtime?.qualityFrameAverageMs) ? runtime.qualityFrameAverageMs : null,\n        qualityFrameSampleCount: Array.isArray(runtime?.qualityFrameSamples) ? runtime.qualityFrameSamples.length : 0,\n      };\n    }\n    const current = this._edgeAdaptiveQualityConfig ?? EDGE_ADAPTIVE_QUALITY_DEFAULTS;\n    const next = normalizeEdgeAdaptiveQualityConfig(current, options);\n    this._edgeAdaptiveQualityConfig = next;\n    this.options ??= {};\n    this.options.edgeAdaptiveQuality = { ...next };\n    if (this._edgeAdaptiveRuntime) {\n      if (next.enabled !== true) {\n        this._edgeAdaptiveRuntime.nextProbeAt = Number.NEGATIVE_INFINITY;\n        this._clearEdgeAdaptiveTimer('probeTimer');\n        this._clearEdgeAdaptiveQualitySamples();\n        this._setAdaptiveEdgeFastRendering(false, 'disabled', { requestRender: false });\n      }\n      this._edgeAdaptiveRuntime.reason = next.enabled ? this._edgeAdaptiveRuntime.reason ?? 'quality' : 'disabled';\n    }\n    this._emitEdgeAdaptiveQualityConfigBindings();\n    this.scheduler?.requestRender?.();\n    return this;\n  }\n\n  /**\n   * Read or set whether adaptive edge quality is enabled.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {boolean} [value] - Enable adaptive edge quality.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  edgeAdaptiveQualityEnabled(value) {\n    if (arguments.length === 0) return this.edgeAdaptiveQuality().enabled;\n    this.edgeAdaptiveQuality({ enabled: Boolean(value) });\n    return this;\n  }\n\n  /**\n   * Read or set the frame-time threshold that counts as slow for adaptive edge quality.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Slow-frame threshold in milliseconds.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  edgeAdaptiveQualitySlowFrameThresholdMs(value) {\n    if (arguments.length === 0) return this.edgeAdaptiveQuality().slowFrameThresholdMs;\n    this.edgeAdaptiveQuality({ slowFrameThresholdMs: Number(value) });\n    return this;\n  }\n\n  /**\n   * Read or set how many recent frames are averaged before adaptive quality changes.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Frame sample window size.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  edgeAdaptiveQualitySlowFrameConsecutiveFrames(value) {\n    if (arguments.length === 0) return this.edgeAdaptiveQuality().averageWindowFrames;\n    this.edgeAdaptiveQuality({ averageWindowFrames: Number(value) });\n    return this;\n  }\n\n  /**\n   * Read or set how often adaptive quality probes full-quality edge rendering.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Probe interval in milliseconds.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  edgeAdaptiveQualityProbeIntervalMs(value) {\n    if (arguments.length === 0) return this.edgeAdaptiveQuality().probeIntervalMs;\n    this.edgeAdaptiveQuality({ probeIntervalMs: Number(value) });\n    return this;\n  }\n\n  /**\n   * Read or set how long adaptive quality stays fast after interaction.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {number} [value] - Hold duration in milliseconds.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  edgeAdaptiveQualityInteractionHoldMs(value) {\n    if (arguments.length === 0) return this.edgeAdaptiveQuality().interactionHoldMs;\n    this.edgeAdaptiveQuality({ interactionHoldMs: Number(value) });\n    return this;\n  }\n\n  /**\n   * Read or set whether camera interaction forces fast edge rendering.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {boolean} [value] - Use fast edges while the camera is moving.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  edgeAdaptiveQualityFastDuringCamera(value) {\n    if (arguments.length === 0) return this.edgeAdaptiveQuality().fastDuringCamera;\n    this.edgeAdaptiveQuality({ fastDuringCamera: Boolean(value) });\n    return this;\n  }\n\n  /**\n   * Read or set whether active layout ticks force fast edge rendering.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {boolean} [value] - Use fast edges while layout is running.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  edgeAdaptiveQualityFastDuringLayout(value) {\n    if (arguments.length === 0) return this.edgeAdaptiveQuality().fastDuringLayout;\n    this.edgeAdaptiveQuality({ fastDuringLayout: Boolean(value) });\n    return this;\n  }\n\n  /**\n   * Read or set the renderer background color.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {string|Array<number>} [color] - CSS hex color or normalized RGBA tuple.\n   * @returns {Array<number>|Helios} Current RGBA color when omitted; otherwise this Helios instance.\n   */\n  background(color) {\n    if (arguments.length === 0) return this._getRendererProp('clearColor');\n    const normalized = normalizeColorInput(color);\n    if (!normalized) {\n      throw new Error('background(color) expects #rgb/#rgba/#rrggbb/#rrggbbaa or [r,g,b(,a)]');\n    }\n    return this._setRendererProp('clearColor', normalized);\n  }\n\n  /**\n   * Alias for `background(color)`.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {string|Array<number>} [color] - CSS hex color or normalized RGBA tuple.\n   * @returns {Array<number>|Helios} Current RGBA color when omitted; otherwise this Helios instance.\n   */\n  clearColor(color) {\n    if (arguments.length === 0) return this.background();\n    return this.background(color);\n  }\n\n  /**\n   * Read or set the renderer supersampling preset.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {'auto'|'on'|'off'|boolean} [value] - Supersampling preset or legacy boolean.\n   * @returns {string|Helios} Current preset when omitted; otherwise this Helios instance.\n   */\n  supersampling(value) {\n    if (arguments.length === 0) {\n      return resolveSupersamplingPreset(this.options?.supersampling, {\n        forceSupersample: this.options?.forceSupersample === true,\n      });\n    }\n    const preset = resolveSupersamplingPreset(value, {\n      forceSupersample: this.options?.forceSupersample === true,\n    });\n    this.options.supersampling = supersamplingPresetToOption(preset, {\n      forceSupersample: this.options?.forceSupersample === true,\n    });\n    this.options.forceSupersample = false;\n    this.layers?.setSupersampling?.(this.options.supersampling);\n    this._emitUIBindingChange('supersampling', preset);\n    return this;\n  }\n\n  /**\n   * Capture the current camera pose.\n   *\n   * @public\n   * @apiSection Camera And View\n   * @returns {object|null} Serializable camera pose, or `null` before a renderer is available.\n   */\n  cameraPose() {\n    return captureCameraPose(this.renderer?.camera ?? null);\n  }\n\n  /**\n   * Read or update automatic camera-control policy.\n   *\n   * @public\n   * @apiSection Camera And View\n   * @param {object} [options] - Camera-control fields to update. Omit to read the current snapshot.\n   * @param {object} [stateOptions] - State tracking options for persistence-aware writes.\n   * @returns {object|Helios} Current camera-control snapshot when called without arguments; otherwise this Helios instance.\n   */\n  cameraControls(options, stateOptions = {}) {\n    if (arguments.length === 0) {\n      return this._cameraControlsSnapshot();\n    }\n    if (!options || typeof options !== 'object') return this;\n    const previousSnapshot = this._cameraControlsSnapshot();\n    const previous = JSON.stringify(previousSnapshot);\n    this._cameraControlConfig = normalizeCameraControlConfig(this._cameraControlConfig ?? CAMERA_CONTROL_DEFAULTS, options);\n    const orbitAngleChanged = (this._cameraControlConfig.orbitAngle ?? 0) !== (previousSnapshot.orbitAngle ?? 0);\n    const followChanged = this._cameraControlConfig.followTarget !== previousSnapshot.followTarget\n      || JSON.stringify(this._cameraControlConfig.targetNodeIndices ?? null) !== JSON.stringify(previousSnapshot.targetNodeIndices ?? null);\n    if (this._cameraControlConfig.orbit !== true) {\n      this._cameraControlRuntime.lastOrbitAt = 0;\n    }\n    if (followChanged) {\n      this._cameraControlRuntime.lastFollowUpdateAt = Number.NEGATIVE_INFINITY;\n    }\n    if (orbitAngleChanged && this.renderer?.camera?.mode === '3d') {\n      this.scheduler?.requestRender?.();\n    }\n    this._markAutoFitDirty(false);\n    const next = this._cameraControlsSnapshot();\n    if (JSON.stringify(next) !== previous) {\n      this._emitCameraControlChange();\n      if (stateOptions.applyState !== false && typeof this.states?.set === 'function') {\n        const source = stateOptions.source ?? 'program';\n        const trackOverride = stateOptions.trackOverride ?? isExplicitCameraStateSource(source, stateOptions);\n        for (const key of CAMERA_CONTROL_STATE_KEYS) {\n          if (!Object.prototype.hasOwnProperty.call(options, key)) continue;\n          if (JSON.stringify(previousSnapshot?.[key]) === JSON.stringify(next?.[key])) continue;\n          this.states.set(`camera.controls.${key}`, cloneSerializable(next[key]), {\n            source,\n            reason: stateOptions.reason ?? 'camera-controls',\n            trackOverride,\n            applyBinding: false,\n            debounceMs: stateOptions.debounceMs ?? 500,\n            journal: stateOptions.journal ?? false,\n          });\n        }\n      }\n    }\n    if (this._cameraControlConfig.autoFit === true) {\n      this.scheduler?.requestRender?.();\n    }\n    if (this._cameraControlConfig.followTarget === true) {\n      this.scheduler?.requestRender?.();\n    }\n    if (this._cameraControlConfig.orbit === true && this.renderer?.camera?.mode === '3d') {\n      this.scheduler?.requestRender?.();\n    }\n    return this;\n  }\n\n  /**\n   * Focus the camera on a set of node indices.\n   *\n   * @public\n   * @apiSection Camera And View\n   * @param {Array<number>|TypedArray} [nodeIndices] - Node indices to target. Omit to read the current target list.\n   * @param {object} [options] - Focus, zoom, animation, and follow options.\n   * @returns {Array<number>|Helios} Current target list when called without arguments; otherwise this Helios instance.\n   */\n  cameraTargetNodes(nodeIndices, options = {}) {\n    if (arguments.length === 0) {\n      return [...(this._cameraControlConfig?.targetNodeIndices ?? [])];\n    }\n    const normalized = normalizeNodeIndexList(nodeIndices);\n    const followTarget = (options.follow === true || options.followTarget === true) && normalized?.length > 0;\n    this.cameraControls({\n      targetNodeIndices: normalized,\n      followTarget,\n      ...(followTarget && Number.isFinite(options.followUpdateIntervalMs) ? { followUpdateIntervalMs: options.followUpdateIntervalMs } : {}),\n      ...(followTarget ? { autoFit: false } : {}),\n    });\n    const zoomScale = Number.isFinite(options.zoomScale)\n      ? Number(options.zoomScale)\n      : Number.isFinite(options.zoomFactor)\n        ? Number(options.zoomFactor)\n        : 1;\n    const exactReadback = normalized?.length > 0 && options.exactReadback !== false;\n    const animate = options.animate ?? this._cameraControlConfig?.animation === true;\n    const durationMs = options.durationMs ?? this._cameraControlConfig?.animationDurationMs;\n    const bounds = this._sampleRenderBounds({\n      nodeIndices: normalized?.length ? normalized : undefined,\n      coverage: 1,\n      maxSamples: this._cameraControlConfig?.autoFitMaxSamples ?? CAMERA_FIT_DEFAULT_MAX_SAMPLES,\n      applyFocusOnResolve: normalized?.length > 0,\n      exactReadback,\n      preferCached: options.preferCached ?? !exactReadback,\n      allowStaleVersion: options.allowStaleVersion ?? !exactReadback,\n      deferReadback: options.deferReadback ?? (exactReadback ? false : undefined),\n      zoomScale,\n      maxFocusZoom: options.maxFocusZoom,\n      minFocusDistance: options.minFocusDistance,\n      focusZoomTolerance: options.focusZoomTolerance,\n      animate,\n      durationMs,\n    });\n    const nextPose = this._resolveCameraFocusPose(bounds, {\n      focusMode: normalized?.length ? 'centroid' : 'bbox',\n      zoomScale,\n      maxFocusZoom: options.maxFocusZoom,\n      minFocusDistance: options.minFocusDistance,\n      focusZoomTolerance: options.focusZoomTolerance,\n    });\n    if (followTarget) {\n      this._queueCameraControlPose(nextPose, { animate, durationMs });\n    } else {\n      this._applyCameraPoseWithOptionalAnimation(nextPose, { animate, durationMs });\n    }\n    return this;\n  }\n\n  /**\n   * Keep the camera centered on moving node indices.\n   *\n   * @public\n   * @apiSection Camera And View\n   * @param {Array<number>|TypedArray} [nodeIndices] - Node indices to follow. Pass an empty list to disable following.\n   * @param {object} [options] - Follow interval, framing, zoom, and animation options.\n   * @returns {Array<number>|Helios} Current followed node list when called without arguments; otherwise this Helios instance.\n   */\n  cameraFollowNodes(nodeIndices, options = {}) {\n    if (arguments.length === 0) {\n      return this._cameraControlConfig?.followTarget === true\n        ? [...(this._cameraControlConfig?.targetNodeIndices ?? [])]\n        : [];\n    }\n    const normalized = normalizeNodeIndexList(nodeIndices);\n    if (!normalized?.length) {\n      this.cameraControls({ targetNodeIndices: null, followTarget: false });\n      this._stopCameraControlPoseInterpolation();\n      if (options.frame !== false) {\n        this.frameNetwork({\n          animate: options.animate ?? this._cameraControlConfig?.animation === true,\n          durationMs: options.durationMs ?? this._cameraControlConfig?.animationDurationMs,\n          resetOrientation: options.resetOrientation ?? false,\n        });\n      }\n      return this;\n    }\n    return this.cameraTargetNodes(normalized, {\n      ...options,\n      follow: true,\n      followUpdateIntervalMs: Number.isFinite(options.followUpdateIntervalMs)\n        ? Number(options.followUpdateIntervalMs)\n        : (this._cameraControlConfig?.followUpdateIntervalMs ?? CAMERA_CONTROL_DEFAULTS.followUpdateIntervalMs),\n      zoomScale: Number.isFinite(options.zoomScale)\n        ? Number(options.zoomScale)\n        : Number.isFinite(options.zoomFactor)\n          ? Number(options.zoomFactor)\n          : 1.35,\n    });\n  }\n\n  /**\n   * Apply a camera pose immediately.\n   *\n   * @public\n   * @apiSection Camera And View\n   * @param {object} pose - Camera pose fields to merge into the current pose.\n   * @param {object} [options] - Render, state tracking, and manual-interaction options.\n   * @returns {Helios} This Helios instance.\n   */\n  setCameraPose(pose, options = {}) {\n    const camera = this.renderer?.camera ?? null;\n    if (!camera || !pose || typeof pose !== 'object') return this;\n    if (\n      options.source === 'ui'\n      || options.source === 'interaction'\n      || options.source === 'cli'\n      || options.manual === true\n      || Object.prototype.hasOwnProperty.call(pose, 'rotation')\n    ) {\n      this._invalidateCameraOrbitReference();\n      this._stopCameraControlPoseInterpolation();\n    }\n    const nextPose = mergeCameraPose(captureCameraPose(camera), pose);\n    if ('_pendingChangeDetail' in camera && (options.source || options.manual === true)) {\n      camera._pendingChangeDetail = {\n        origin: options.source ?? 'interaction',\n        type: 'api',\n        action: Object.prototype.hasOwnProperty.call(pose, 'zoom')\n          ? 'zoom'\n          : Object.prototype.hasOwnProperty.call(pose, 'distance')\n            ? 'dolly'\n            : 'pan',\n        mode: nextPose.mode ?? camera.mode,\n      };\n    }\n    applyCameraPose(camera, nextPose, { update: options.update !== false });\n    if (\n      options.applyState !== false\n      && typeof this.states?.set === 'function'\n      && isExplicitCameraStateSource(options.source, options)\n    ) {\n      this.states.set('camera.pose', this._snapshotCameraState({ includeViewport: false }), {\n        source: options.source === 'test' ? 'program' : (options.source ?? 'program'),\n        reason: options.reason ?? 'camera-pose',\n        trackOverride: true,\n        applyBinding: false,\n        debounceMs: options.debounceMs ?? 500,\n        journal: options.journal ?? false,\n      });\n    }\n    if (options.source === 'ui' || options.source === 'interaction' || options.source === 'cli' || options.manual === true) {\n      this._disableAutomaticCameraControlFromInteraction({\n        origin: options.source ?? 'interaction',\n        action: Object.prototype.hasOwnProperty.call(pose, 'zoom') ? 'zoom' : Object.prototype.hasOwnProperty.call(pose, 'distance') ? 'dolly' : 'pan',\n      });\n    }\n    if (options.requestRender !== false) {\n      this.scheduler?.requestRender?.();\n    }\n    return this;\n  }\n\n  /**\n   * Animate the camera from its current pose to a target pose.\n   *\n   * @public\n   * @apiSection Camera And View\n   * @param {object} pose - Target camera pose fields.\n   * @param {object} [options] - Transition duration, starting pose, render, and interaction options.\n   * @returns {Promise<Helios>} This Helios instance after the transition completes.\n   */\n  async transitionCamera(pose, options = {}) {\n    const camera = this.renderer?.camera ?? null;\n    if (!camera || !pose || typeof pose !== 'object') return this;\n    this._stopCameraControlPoseInterpolation();\n    const fromPose = mergeCameraPose(captureCameraPose(camera), options.fromPose ?? {});\n    const toPose = mergeCameraPose(fromPose, pose);\n    await this._ensureCameraTransitionController().transition(camera, {\n      fromPose,\n      toPose,\n      durationMs: options.durationMs ?? DEFAULT_MODE_SWITCH_DURATION_MS,\n    });\n    if (options.source === 'ui' || options.source === 'interaction' || options.source === 'cli' || options.manual === true) {\n      this._disableAutomaticCameraControlFromInteraction({\n        origin: options.source ?? 'interaction',\n        action: Object.prototype.hasOwnProperty.call(pose, 'zoom') ? 'zoom' : Object.prototype.hasOwnProperty.call(pose, 'distance') ? 'dolly' : 'pan',\n      });\n    }\n    if (options.requestRender !== false) {\n      this.scheduler?.requestRender?.();\n    }\n    return this;\n  }\n\n  /**\n   * Stop any active camera transition.\n   *\n   * @public\n   * @apiSection Camera And View\n   * @returns {Helios} This Helios instance.\n   */\n  stopCameraTransition() {\n    this._cameraTransitionController?.stop?.();\n    return this;\n  }\n\n  /**\n   * Return the active dimensional rendering mode.\n   *\n   * @public\n   * @apiSection Camera And View\n   * @returns {'2d'|'3d'} Current camera/rendering mode.\n   */\n  mode() {\n    return this.options?.mode === '2d' ? '2d' : '3d';\n  }\n\n  /**\n   * Switch between 2D and 3D rendering modes.\n   *\n   * @public\n   * @apiSection Camera And View\n   * @param {'2d'|'3d'} mode - Target dimensional mode.\n   * @param {object} [options] - Animation, delegate-sync, and camera framing options.\n   * @returns {Promise<Helios>} This Helios instance after the mode switch completes.\n   */\n  async setMode(mode, options = {}) {\n    const nextMode = mode === '3d' ? '3d' : '2d';\n    const previousMode = this.mode();\n    if (nextMode === previousMode) return this;\n    if (this._cameraControlRuntime) {\n      this._cameraControlRuntime.suspended = true;\n      this._stopCameraControlPoseInterpolation();\n    }\n\n    try {\n      const positionSource = this.positions?.() ?? { source: 'network', delegate: null };\n      const activeDelegate = positionSource.source === 'delegate' ? (positionSource.delegate ?? null) : null;\n      if (positionSource.source === 'delegate' && options.syncDelegate !== false) {\n        try {\n          await this.syncDelegatePositionsToNetwork();\n        } catch (error) {\n          console.warn('Helios.setMode(): failed to sync delegate positions back to the network before switching modes.', error);\n        }\n      }\n\n      this.options.mode = nextMode;\n      const nextProjection = options.projection ?? (nextMode === '3d' ? 'perspective' : 'orthographic');\n      this.options.projection = nextProjection;\n      let cameraControlChanged = false;\n      if (nextMode !== '3d' && this._cameraControlConfig?.orbit === true) {\n        this._cameraControlConfig.orbit = false;\n        cameraControlChanged = true;\n      }\n      if (nextMode !== '3d') {\n        this._invalidateCameraOrbitReference();\n      }\n      this._markAutoFitDirty(false);\n      this._applyModeToLayoutOptions(nextMode);\n      this.visuals?.seedMissingPositions?.(\n        resolveSeedBoundsForLayout(this.options.layout, this.layers?.size, nextMode),\n      );\n\n      const layoutChanged = this._applyModeToActiveLayout(nextMode);\n      if (\n        previousMode === '2d'\n        && nextMode === '3d'\n        && this._layout instanceof GpuForceLayout\n      ) {\n        const jitterAmplitude = computeGpuForceModeSwitchDepthJitter(this._layout);\n        const delegate = this._layout?.getPositionDelegate?.() ?? this._layout?.positionDelegate ?? null;\n        await delegate?.injectPlanarDepthJitter?.(this._buildPositionDelegateContext({ scope: 'layout' }), jitterAmplitude);\n      }\n      if (layoutChanged && options.reheat !== false) {\n        this._requestLayoutReheat('mode');\n      }\n      this._layout?.requestUpdate?.();\n      this._enforcePositionSourcePolicy(this._layout, { resetInterpolation: false });\n      this.scheduler?.requestGeometry?.();\n      this.scheduler?.requestLayout?.('mode');\n      this.scheduler?.requestRender?.();\n      this._labels?.requestFullReselect?.('mode');\n      this._refreshUIBindings?.();\n\n      const camera = this.renderer?.camera ?? null;\n      const animateCamera = options.animate !== false;\n      if (camera) {\n        const bounds = this._sampleRenderBounds(options.frame ?? {}) ?? null;\n        if (nextMode === '3d') {\n          const plan = this._build3DModeTransitionPoses(bounds, nextProjection);\n          if (plan) {\n            if (animateCamera) {\n              await this._ensureCameraTransitionController().transition(camera, {\n                fromPose: plan.startPose,\n                toPose: plan.endPose,\n                durationMs: options.cameraDurationMs ?? DEFAULT_MODE_SWITCH_DURATION_MS,\n              });\n            } else {\n              applyCameraPose(camera, plan.endPose);\n            }\n          } else {\n            applyCameraPose(camera, {\n              ...captureCameraPose(camera),\n              mode: '3d',\n              projection: nextProjection,\n            });\n          }\n        } else {\n          const plan = this._build2DModeTransitionPoses(bounds);\n          if (plan) {\n            if (animateCamera) {\n              const durationMs = options.cameraDurationMs ?? DEFAULT_MODE_SWITCH_DURATION_MS;\n              const controller = this._ensureCameraTransitionController();\n              await controller.transition(camera, {\n                fromPose: plan.startPose,\n                toPose: plan.pre2D3D,\n                durationMs: durationMs * 0.7,\n              });\n            }\n            if (options.flattenDepth !== false) {\n              await this._collapseActivePositionDepthTo2DPlane(0, activeDelegate);\n            }\n            if (animateCamera) {\n              await this._ensureCameraTransitionController().transition(camera, {\n                fromPose: plan.start2DPose,\n                toPose: plan.endPose,\n                durationMs: (options.cameraDurationMs ?? DEFAULT_MODE_SWITCH_DURATION_MS) * 0.3,\n              });\n            } else {\n              applyCameraPose(camera, plan.endPose);\n            }\n          } else {\n            if (options.flattenDepth !== false) {\n              await this._collapseActivePositionDepthTo2DPlane(0, activeDelegate);\n            }\n            applyCameraPose(camera, {\n              ...captureCameraPose(camera),\n              mode: '2d',\n              projection: nextProjection,\n            });\n          }\n        }\n      }\n\n      if (layoutChanged) {\n        this._emitLayoutChanged(this._layout);\n      }\n      if (cameraControlChanged) {\n        this._emitCameraControlChange();\n      }\n      this.emit(EVENTS.MODE_CHANGED, {\n        mode: nextMode,\n        previousMode,\n        projection: nextProjection,\n      });\n      if (options.applyState !== false && typeof this.states?.set === 'function') {\n        this.states.set('scene.dimension', nextMode, {\n          source: options.source === 'test' ? 'program' : (options.source ?? 'program'),\n          reason: options.reason ?? 'mode',\n          trackOverride: options.trackOverride ?? true,\n          applyBinding: false,\n          debounceMs: options.debounceMs ?? 0,\n          journal: options.journal ?? false,\n        });\n      }\n      return this;\n    } finally {\n      if (this._cameraControlRuntime) {\n        this._cameraControlRuntime.suspended = false;\n      }\n      this._markAutoFitDirty(false);\n      this.scheduler?.requestRender?.();\n    }\n  }\n\n  /**\n   * Read or update the screen-space density overlay configuration.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {object|false|null} [options] - Density configuration, or `false`/`null` to disable the overlay.\n   * @param {boolean} [options.enabled] - Enable density rendering.\n   * @param {number} [options.qualityScale] - Density texture scale relative to the viewport.\n   * @param {string} [options.property] - Node attribute used as the primary density weight.\n   * @param {string} [options.compareProperty] - Optional comparison attribute for diverging/log-ratio density.\n   * @param {string} [options.colormap] - Sequential colormap name.\n   * @param {string} [options.divergingColormap] - Diverging colormap name.\n   * @returns {object|Helios} Current density snapshot when omitted; otherwise this Helios instance.\n   */\n  density(options) {\n    if (arguments.length === 0) {\n      const config = this._densityConfig ?? DENSITY_DEFAULTS;\n      const compareProperty = resolveDensityCompareProperty(config.property, config.compareProperty);\n      const comparisonMode = resolveDensityComparisonMode(compareProperty, config.comparisonMode);\n      const usesLogRatioColormap = usesLogRatioDensityColormap({ ...config, compareProperty, comparisonMode });\n      const diverging = this._densityRuntime?.diverging === true || comparisonMode === 'logRatio';\n      return {\n        ...config,\n        compareProperty,\n        comparisonMode,\n        diverging,\n        valueDomain: Array.isArray(this._densityRuntime?.valueDomain) ? [...this._densityRuntime.valueDomain] : null,\n        activeColormap: resolveDensityActiveColormap({ ...config, compareProperty, comparisonMode }, this._densityRuntime),\n      };\n    }\n\n    if (options == null || options === false) {\n      this._densityConfig = { ...this._densityConfig, enabled: false };\n      this._densityRuntime = { ...this._densityRuntime, valueDomain: null };\n      this._legendContentVersion += 1;\n      this._applyDensityConfigToLayer();\n      this.scheduler?.requestRender?.();\n      return this;\n    }\n\n    if (typeof options !== 'object') {\n      throw new TypeError('density(options) expects an object, null, or false');\n    }\n\n    const current = this._densityConfig ?? DENSITY_DEFAULTS;\n    const next = { ...current };\n\n    if (Object.prototype.hasOwnProperty.call(options, 'enabled')) next.enabled = options.enabled === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'density')) next.enabled = options.density === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'qualityScale')) {\n      next.qualityScale = clamp(toFiniteNumber(options.qualityScale, next.qualityScale), 0.03, 1.0);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'densityScale')) {\n      next.qualityScale = clamp(toFiniteNumber(options.densityScale, next.qualityScale), 0.03, 1.0);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'topographic')) next.topographic = options.topographic === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'scaleWithZoom')) next.scaleWithZoom = options.scaleWithZoom === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'densityScaleWithZoom')) {\n      next.scaleWithZoom = options.densityScaleWithZoom === true;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'densityScaleByZoom')) {\n      next.scaleWithZoom = options.densityScaleByZoom === true;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'bandwidth')) {\n      next.bandwidth = clamp(toFiniteNumber(options.bandwidth, next.bandwidth), 0.05, 1000);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'weightScale')) {\n      next.weightScale = clamp(toFiniteNumber(options.weightScale, next.weightScale), 0, 1e8);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'densityWeight')) {\n      next.weightScale = clamp(toFiniteNumber(options.densityWeight, next.weightScale), 0, 1e8);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'property') && typeof options.property === 'string') {\n      const trimmed = options.property.trim();\n      if (trimmed) next.property = trimmed;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'densityProperty') && typeof options.densityProperty === 'string') {\n      const trimmed = options.densityProperty.trim();\n      if (trimmed) next.property = trimmed;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'compareProperty') && typeof options.compareProperty === 'string') {\n      const trimmed = options.compareProperty.trim();\n      if (trimmed) next.compareProperty = trimmed;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'vsDensityProperty') && typeof options.vsDensityProperty === 'string') {\n      const trimmed = options.vsDensityProperty.trim();\n      if (trimmed) next.compareProperty = trimmed;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'normalizeVs')) next.normalizeVs = options.normalizeVs === true;\n    if (Object.prototype.hasOwnProperty.call(options, 'shallNormalizeVsDensity')) {\n      next.normalizeVs = options.shallNormalizeVsDensity === true;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'comparisonMode')) {\n      next.comparisonMode = options.comparisonMode === 'logRatio' ? 'logRatio' : 'difference';\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'epsilon')) {\n      next.epsilon = clamp(toFiniteNumber(options.epsilon, next.epsilon), 1e-12, 1);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'densityEpsilon')) {\n      next.epsilon = clamp(toFiniteNumber(options.densityEpsilon, next.epsilon), 1e-12, 1);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'logRatioRange')) {\n      next.logRatioRange = clamp(toFiniteNumber(options.logRatioRange, next.logRatioRange), 1e-3, 1e3);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'densityLogRatioRange')) {\n      next.logRatioRange = clamp(toFiniteNumber(options.densityLogRatioRange, next.logRatioRange), 1e-3, 1e3);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'maskThreshold')) {\n      next.maskThreshold = clamp(toFiniteNumber(options.maskThreshold, next.maskThreshold), 0, 1);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'densityMaskThreshold')) {\n      next.maskThreshold = clamp(toFiniteNumber(options.densityMaskThreshold, next.maskThreshold), 0, 1);\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'logRatioZScore')) {\n      next.logRatioZScore = options.logRatioZScore === true;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'densityLogRatioZScore')) {\n      next.logRatioZScore = options.densityLogRatioZScore === true;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'logRatioSupportCorrection')) {\n      next.logRatioSupportCorrection = options.logRatioSupportCorrection !== false;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'densityLogRatioSupportCorrection')) {\n      next.logRatioSupportCorrection = options.densityLogRatioSupportCorrection !== false;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'colormap') && typeof options.colormap === 'string') {\n      const trimmed = options.colormap.trim();\n      if (trimmed) next.colormap = trimmed;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'densityColormap') && typeof options.densityColormap === 'string') {\n      const trimmed = options.densityColormap.trim();\n      if (trimmed) next.colormap = trimmed;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'divergingColormap') && typeof options.divergingColormap === 'string') {\n      const trimmed = options.divergingColormap.trim();\n      if (trimmed) next.divergingColormap = trimmed;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'densityDivergingColormap') && typeof options.densityDivergingColormap === 'string') {\n      const trimmed = options.densityDivergingColormap.trim();\n      if (trimmed) next.divergingColormap = trimmed;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'logRatioColormap') && typeof options.logRatioColormap === 'string') {\n      const trimmed = options.logRatioColormap.trim();\n      if (trimmed) next.logRatioColormap = trimmed;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'densityLogRatioColormap') && typeof options.densityLogRatioColormap === 'string') {\n      const trimmed = options.densityLogRatioColormap.trim();\n      if (trimmed) next.logRatioColormap = trimmed;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'interactionFilter') && typeof options.interactionFilter === 'string') {\n      next.interactionFilter = options.interactionFilter;\n    }\n    if (Object.prototype.hasOwnProperty.call(options, 'densityInteractionFilter') && typeof options.densityInteractionFilter === 'string') {\n      next.interactionFilter = options.densityInteractionFilter;\n    }\n\n    next.compareProperty = resolveDensityCompareProperty(next.property, next.compareProperty);\n    next.comparisonMode = resolveDensityComparisonMode(next.compareProperty, next.comparisonMode);\n\n    this._densityConfig = next;\n    if (next.comparisonMode !== 'logRatio') {\n      this._densityRuntime = { ...this._densityRuntime, diverging: false, valueDomain: null };\n    }\n    this._legendContentVersion += 1;\n    this._applyDensityConfigToLayer();\n    this.scheduler?.requestRender?.();\n    return this;\n  }\n\n  /**\n   * Read or set whether the density overlay is enabled.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {boolean} [value] - Enable density rendering.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  densityEnabled(value) {\n    if (arguments.length === 0) return this.density().enabled === true;\n    return this.density({ enabled: value === true });\n  }\n\n  /**\n   * Read or set the density overlay quality scale.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {number} [value] - Texture scale relative to the viewport.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  densityScale(value) {\n    if (arguments.length === 0) return this.density().qualityScale;\n    return this.density({ qualityScale: value });\n  }\n\n  /**\n   * Read or set whether density is rendered with topographic contours.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {boolean} [value] - Enable contour-style rendering.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  densityTopographic(value) {\n    if (arguments.length === 0) return this.density().topographic === true;\n    return this.density({ topographic: value === true });\n  }\n\n  /**\n   * Read or set whether density bandwidth scales with camera zoom.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {boolean} [value] - Scale density evaluation with zoom.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  densityScaleWithZoom(value) {\n    if (arguments.length === 0) return this.density().scaleWithZoom === true;\n    return this.density({ scaleWithZoom: value === true });\n  }\n\n  /**\n   * Read or set the density kernel bandwidth.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {number} [value] - Positive kernel bandwidth.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  densityBandwidth(value) {\n    if (arguments.length === 0) return this.density().bandwidth;\n    return this.density({ bandwidth: value });\n  }\n\n  /**\n   * Read or set the scalar multiplier applied to density weights.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {number} [value] - Density weight multiplier.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  densityWeight(value) {\n    if (arguments.length === 0) return this.density().weightScale;\n    return this.density({ weightScale: value });\n  }\n\n  /**\n   * Read or set the node attribute used as the primary density property.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {string} [value] - Node attribute name.\n   * @returns {string|Helios} Current attribute name when omitted; otherwise this Helios instance.\n   */\n  densityProperty(value) {\n    if (arguments.length === 0) return this.density().property;\n    return this.density({ property: value });\n  }\n\n  /**\n   * Read or set the comparison property used for diverging density views.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {string} [value] - Node attribute name to compare against the primary property.\n   * @returns {string|Helios} Current comparison attribute when omitted; otherwise this Helios instance.\n   */\n  densityVsProperty(value) {\n    if (arguments.length === 0) return this.density().compareProperty;\n    return this.density({ compareProperty: value });\n  }\n\n  /**\n   * Read or set whether comparison density values are normalized before differencing.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {boolean} [value] - Normalize comparison density.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  densityNormalizeVs(value) {\n    if (arguments.length === 0) return this.density().normalizeVs === true;\n    return this.density({ normalizeVs: value === true });\n  }\n\n  /**\n   * Read or set the sequential colormap used by the density overlay.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {string} [value] - Colormap name.\n   * @returns {string|Helios} Current colormap when omitted; otherwise this Helios instance.\n   */\n  densityColormap(value) {\n    if (arguments.length === 0) return this.density().colormap;\n    return this.density({ colormap: value });\n  }\n\n  /**\n   * Read or set the diverging colormap used by comparison density overlays.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {string} [value] - Diverging colormap name.\n   * @returns {string|Helios} Current colormap when omitted; otherwise this Helios instance.\n   */\n  densityDivergingColormap(value) {\n    if (arguments.length === 0) return this.density().divergingColormap;\n    return this.density({ divergingColormap: value });\n  }\n\n  /**\n   * Request a density overlay update on the next render frame.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @returns {Helios} This Helios instance.\n   */\n  updateDensityMap() {\n    this.scheduler?.requestRender?.();\n    return this;\n  }\n\n  /**\n   * Alias for `updateDensityMap()`.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @returns {Helios} This Helios instance.\n   */\n  redrawDensityMap() {\n    this.scheduler?.requestRender?.();\n    return this;\n  }\n\n  /**\n   * Read or set the edge transparency compositing mode.\n   *\n   * @public\n   * @apiSection Appearance\n   * @param {string} [mode] - Transparency mode supported by the active renderer.\n   * @returns {string|Helios} Current mode when omitted; otherwise this Helios instance.\n   */\n  edgeTransparencyMode(mode) {\n    if (arguments.length === 0) return this._getGraphLayerProp('edgeTransparencyMode');\n    const next = String(mode ?? '');\n    const graphLayer = this.renderer?.graphLayer ?? null;\n    if (graphLayer?.isSupportedTransparencyMode && !graphLayer.isSupportedTransparencyMode(next)) {\n      return this;\n    }\n    return this._setGraphLayerProp('edgeTransparencyMode', next);\n  }\n\n  /**\n   * Read or update label rendering options.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {object|null} [options] - Label options, or `null` to disable labels.\n   * @param {boolean} [options.enabled] - Enable ranked or selected labels.\n   * @param {'ranked'|'selected-only'} [options.selectionMode] - Label selection policy.\n   * @param {number} [options.maxVisible] - Maximum number of labels to render.\n   * @param {string|Function} [options.source] - Attribute name or callback used for label text.\n   * @returns {object|Helios} Current label configuration when omitted; otherwise this Helios instance.\n   */\n  labels(options) {\n    const labelsBehavior = this.behavior?.labels ?? null;\n    if (arguments.length === 0) {\n      return labelsBehavior?.labels?.() ?? this._getLabelsControllerConfig();\n    }\n    if (labelsBehavior) {\n      labelsBehavior.labels(options);\n      return this;\n    }\n    return this._applyLabelsControllerConfig(options == null ? { enabled: false, hoveredNodeEnabled: false } : options);\n  }\n\n  _getLabelsControllerConfig() {\n    return this._labels?.getConfig?.() ?? { enabled: false };\n  }\n\n  _applyLabelsControllerConfig(options, { silent = false } = {}) {\n    if (options == null) {\n      this._labels?.setConfig?.({ enabled: false, hoveredNodeEnabled: false });\n    } else if (typeof options === 'object') {\n      this._labels?.setConfig?.(options);\n    } else {\n      throw new TypeError('labels(options) expects an object or null');\n    }\n    this._labels?.requestFullReselect?.('api');\n    this.scheduler?.requestRender?.();\n    if (!silent) this._refreshUIBindings();\n    return this;\n  }\n\n  _getLegendsControllerConfig() {\n    return this._legends?.getConfig?.() ?? { enabled: true };\n  }\n\n  _applyLegendsControllerConfig(options, { silent = false } = {}) {\n    if (options === false || options == null) {\n      this._legends?.setConfig?.({ enabled: false });\n    } else if (typeof options === 'object') {\n      this._legends?.setConfig?.(options);\n    } else {\n      throw new TypeError('legends(options) expects an object, false, or null');\n    }\n    this.scheduler?.requestRender?.();\n    if (!silent) this._refreshUIBindings();\n    return this;\n  }\n\n  _getLegendItems(options = {}) {\n    return this._legends?.deriveItems?.(options) ?? [];\n  }\n\n  /**\n   * Read or update legend rendering options.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {object|false|null} [options] - Legend configuration, or `false`/`null` to disable legends.\n   * @param {boolean} [options.enabled] - Enable legend rendering.\n   * @returns {object|Helios} Current legend configuration when omitted; otherwise this Helios instance.\n   */\n  legends(options) {\n    const legendsBehavior = this.behavior?.legends ?? null;\n    if (arguments.length === 0) {\n      return legendsBehavior?.legends?.() ?? this._getLegendsControllerConfig();\n    }\n    if (legendsBehavior) {\n      legendsBehavior.legends(options);\n      return this;\n    }\n    return this._applyLegendsControllerConfig(options);\n  }\n\n  /**\n   * Read or set whether legends are enabled.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {boolean} [value] - Enable legends.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  legendsEnabled(value) {\n    if (arguments.length === 0) return this.legends()?.enabled === true;\n    return this.legends({ enabled: value === true });\n  }\n\n  _quickControlsStyleText() {\n    return `\n.helios-quick-controls {\n  --helios-quick-bg: rgba(12, 14, 18, 0.72);\n  --helios-quick-bg-solid: rgba(12, 14, 18, 0.94);\n  --helios-quick-fg: rgba(244, 246, 250, 0.92);\n  --helios-quick-border: color-mix(in srgb, var(--helios-quick-fg) 12%, transparent);\n  --helios-quick-accent: #38bdf8;\n  --helios-quick-shadow: 0 12px 30px rgba(0, 0, 0, 0.25);\n  --helios-quick-blur: 14px;\n  position: absolute;\n  z-index: 40;\n  display: grid;\n  gap: var(--helios-quick-gap, 8px);\n  pointer-events: none;\n  font: 700 15px/1 var(--helios-ui-font, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif);\n}\n.helios-quick-controls[data-theme=\"light\"] {\n  --helios-quick-bg: rgba(247, 247, 249, 0.78);\n  --helios-quick-bg-solid: rgba(247, 247, 249, 0.97);\n  --helios-quick-fg: #1f2328;\n  --helios-quick-border: #e6e6ea;\n  --helios-quick-accent: #5e7cb9;\n  --helios-quick-shadow: 0 12px 30px rgba(31, 35, 40, 0.12);\n}\n.helios-quick-controls__button {\n  width: var(--helios-quick-size, 44px);\n  height: var(--helios-quick-size, 44px);\n  display: grid;\n  place-items: center;\n  padding: 0;\n  border: 1px solid color-mix(in srgb, var(--helios-quick-accent) 38%, var(--helios-quick-border));\n  border-radius: 10px;\n  background: color-mix(in srgb, var(--helios-quick-accent) 16%, var(--helios-quick-bg-solid));\n  color: var(--helios-quick-fg);\n  box-shadow: var(--helios-quick-shadow);\n  backdrop-filter: blur(var(--helios-quick-blur));\n  -webkit-backdrop-filter: blur(var(--helios-quick-blur));\n  cursor: pointer;\n  pointer-events: auto;\n  touch-action: manipulation;\n  user-select: none;\n  -webkit-user-select: none;\n}\n.helios-quick-controls__button:hover,\n.helios-quick-controls__button:focus-visible,\n.helios-quick-controls__button.is-active {\n  border-color: color-mix(in srgb, var(--helios-quick-accent) 55%, var(--helios-quick-border));\n  background: color-mix(in srgb, var(--helios-quick-accent) 22%, var(--helios-quick-bg-solid));\n  color: var(--helios-quick-fg);\n  outline: none;\n}\n.helios-quick-controls__button:focus-visible {\n  box-shadow: 0 0 0 4px color-mix(in srgb, var(--helios-quick-accent) 22%, transparent), var(--helios-quick-shadow);\n}\n.helios-quick-controls__button.is-active {\n  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--helios-quick-accent) 28%, transparent), var(--helios-quick-shadow);\n}\n.helios-quick-controls__button svg {\n  width: 18px;\n  height: 18px;\n  fill: none;\n  stroke: currentColor;\n  stroke-linecap: round;\n  stroke-linejoin: round;\n  stroke-width: 2.25;\n}\n.helios-quick-controls__button--layout svg {\n  fill: currentColor;\n  stroke: none;\n}\n.helios-quick-controls__button--zoom {\n  font-size: 21px;\n  font-weight: 700;\n}\n.helios-quick-controls__button--helios svg {\n  width: 20px;\n  height: 20px;\n  fill: currentColor;\n  stroke: currentColor;\n}\n.helios-quick-controls__menu {\n  position: absolute;\n  top: 0;\n  right: calc(var(--helios-quick-size, 44px) + var(--helios-quick-gap, 8px) + 4px);\n  min-width: 172px;\n  display: grid;\n  gap: 4px;\n  padding: 6px;\n  border: 1px solid color-mix(in srgb, var(--helios-quick-accent) 32%, var(--helios-quick-border));\n  border-radius: 10px;\n  background: var(--helios-quick-bg-solid);\n  box-shadow: var(--helios-quick-shadow);\n  backdrop-filter: blur(var(--helios-quick-blur));\n  -webkit-backdrop-filter: blur(var(--helios-quick-blur));\n  pointer-events: auto;\n}\n.helios-quick-controls__menu[hidden] {\n  display: none;\n}\n.helios-quick-controls__menu-button {\n  display: flex;\n  align-items: center;\n  width: 100%;\n  min-height: 28px;\n  padding: 0 9px;\n  border: 0;\n  border-radius: 6px;\n  background: transparent;\n  color: var(--helios-quick-fg);\n  font: 600 12px/1.1 var(--helios-ui-font, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif);\n  text-align: left;\n  cursor: pointer;\n}\n.helios-quick-controls__menu-button:hover,\n.helios-quick-controls__menu-button:focus-visible {\n  background: color-mix(in srgb, var(--helios-quick-accent) 18%, transparent);\n  outline: none;\n}\n`;\n  }\n\n  _quickControlButton(doc, { name, label, className = '', html = '', text = '' }) {\n    const button = doc.createElement('button');\n    button.type = 'button';\n    button.className = `helios-quick-controls__button ${className}`.trim();\n    button.dataset.heliosQuickControl = name;\n    button.setAttribute('aria-label', label);\n    button.title = label;\n    if (html) button.innerHTML = html;\n    else button.textContent = text;\n    return button;\n  }\n\n  _quickControlsHeliosIconMarkup() {\n    return `\n<svg viewBox=\"0 0 600 600\" aria-hidden=\"true\">\n  <path d=\"M245 331 124 103\" fill=\"none\" stroke-width=\"32\" />\n  <path d=\"M245 331 62 482\" fill=\"none\" stroke-width=\"22\" />\n  <path d=\"M279 358 482 495\" fill=\"none\" stroke-width=\"30\" />\n  <circle cx=\"245\" cy=\"331\" r=\"104\" stroke=\"none\" />\n  <circle cx=\"124\" cy=\"103\" r=\"58\" stroke=\"none\" />\n  <circle cx=\"480\" cy=\"493\" r=\"58\" stroke=\"none\" />\n  <circle cx=\"62\" cy=\"478\" r=\"27\" stroke=\"none\" />\n  <path d=\"M367 331a122 122 0 1 1-122-122v-34a156 156 0 1 0 156 156h-34Z\" stroke=\"none\" />\n  <path d=\"M533 54h36v278h-36zM281 175h287v34H281zM367 54h34v241h-34z\" stroke=\"none\" />\n</svg>`;\n  }\n\n  _quickControlsMenuButton(doc, { label, url }) {\n    const button = doc.createElement('button');\n    button.type = 'button';\n    button.className = 'helios-quick-controls__menu-button';\n    button.dataset.url = url;\n    button.setAttribute('role', 'menuitem');\n    button.textContent = label;\n    return button;\n  }\n\n  _openQuickControlUrl(url) {\n    const win = this.layers?.root?.ownerDocument?.defaultView ?? globalThis.window ?? globalThis;\n    const opened = typeof win?.open === 'function'\n      ? win.open(url, '_blank', 'noopener,noreferrer')\n      : null;\n    if (opened && typeof opened === 'object') opened.opener = null;\n    return opened;\n  }\n\n  _setupQuickControls() {\n    const config = this._quickControlsConfig ?? QUICK_CONTROL_DEFAULTS;\n    if (config.enabled !== true || !this.layers?.root) {\n      this._setQuickControlsOverlayInsets({ top: 0, right: 0, bottom: 0, left: 0 });\n      return null;\n    }\n    const doc = this.layers.root.ownerDocument ?? (typeof document !== 'undefined' ? document : null);\n    if (!doc || typeof doc.createElement !== 'function') return null;\n\n    this._destroyQuickControls();\n\n    const root = doc.createElement('div');\n    root.className = 'helios-quick-controls';\n    root.dataset.theme = this._resolveQuickControlsTheme();\n    root.style.setProperty('--helios-quick-size', `${config.buttonSize}px`);\n    root.style.setProperty('--helios-quick-gap', `${config.gap}px`);\n\n    const style = doc.createElement('style');\n    style.textContent = this._quickControlsStyleText();\n    root.appendChild(style);\n\n    const buttons = {};\n    let heliosMenu = null;\n    buttons.helios = this._quickControlButton(doc, {\n      name: 'helios',\n      label: 'Helios links',\n      className: 'helios-quick-controls__button--helios',\n      html: this._quickControlsHeliosIconMarkup(),\n    });\n    buttons.helios.setAttribute('aria-haspopup', 'menu');\n    buttons.helios.setAttribute('aria-expanded', 'false');\n    root.appendChild(buttons.helios);\n    heliosMenu = doc.createElement('div');\n    heliosMenu.className = 'helios-quick-controls__menu';\n    heliosMenu.setAttribute('role', 'menu');\n    heliosMenu.hidden = true;\n    const websiteButton = this._quickControlsMenuButton(doc, {\n      label: 'Go to heliosweb.io',\n      url: QUICK_CONTROL_HELIOS_URL,\n    });\n    const issueButton = this._quickControlsMenuButton(doc, {\n      label: 'Report a problem',\n      url: QUICK_CONTROL_ISSUE_URL,\n    });\n    heliosMenu.appendChild(websiteButton);\n    heliosMenu.appendChild(issueButton);\n    root.appendChild(heliosMenu);\n    if (config.autoFit) {\n      buttons.autoFit = this._quickControlButton(doc, {\n        name: 'auto-fit',\n        label: 'Toggle automatic fit',\n        className: 'helios-quick-controls__button--fit',\n        html: `\n<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n  <path d=\"M8 4H4v4\" />\n  <path d=\"M16 4h4v4\" />\n  <path d=\"M20 16v4h-4\" />\n  <path d=\"M4 16v4h4\" />\n</svg>`,\n      });\n      root.appendChild(buttons.autoFit);\n    }\n    if (config.layout) {\n      buttons.layout = this._quickControlButton(doc, {\n        name: 'layout',\n        label: 'Pause layout',\n        className: 'helios-quick-controls__button--layout',\n      });\n      root.appendChild(buttons.layout);\n    }\n    if (config.zoom) {\n      buttons.zoomIn = this._quickControlButton(doc, {\n        name: 'zoom-in',\n        label: 'Zoom in',\n        className: 'helios-quick-controls__button--zoom',\n        text: '+',\n      });\n      buttons.zoomOut = this._quickControlButton(doc, {\n        name: 'zoom-out',\n        label: 'Zoom out',\n        className: 'helios-quick-controls__button--zoom',\n        text: '-',\n      });\n      root.appendChild(buttons.zoomIn);\n      root.appendChild(buttons.zoomOut);\n    }\n\n    const addCleanup = (cleanup) => {\n      if (typeof cleanup === 'function') this._quickControlCleanups.push(cleanup);\n    };\n    const listenButton = (button, type, handler) => {\n      if (!button || typeof button.addEventListener !== 'function') return;\n      button.addEventListener(type, handler);\n      addCleanup(() => button.removeEventListener?.(type, handler));\n    };\n\n    const setHeliosMenuOpen = (open) => {\n      if (!heliosMenu || !buttons.helios) return;\n      heliosMenu.hidden = open !== true;\n      buttons.helios.setAttribute('aria-expanded', open === true ? 'true' : 'false');\n      buttons.helios.classList?.toggle?.('is-active', open === true);\n    };\n    const openMenuUrl = (url) => {\n      setHeliosMenuOpen(false);\n      this._openQuickControlUrl(url);\n    };\n\n    listenButton(buttons.helios, 'click', (event) => {\n      event?.preventDefault?.();\n      event?.stopPropagation?.();\n      setHeliosMenuOpen(heliosMenu?.hidden === true);\n    });\n    listenButton(websiteButton, 'click', () => openMenuUrl(QUICK_CONTROL_HELIOS_URL));\n    listenButton(issueButton, 'click', () => openMenuUrl(QUICK_CONTROL_ISSUE_URL));\n    listenButton(buttons.autoFit, 'click', () => {\n      const next = this.cameraControls?.().autoFit !== true;\n      this.cameraControls?.({ autoFit: next, followTarget: false, targetNodeIndices: null });\n      this._syncQuickControls();\n      if (next) {\n        this.requestFrameNetwork?.({\n          animate: this._cameraControlConfig?.animation === true,\n          resetOrientation: this.mode?.() === '3d',\n        });\n      }\n    });\n    listenButton(buttons.layout, 'click', () => {\n      const running = this._quickControlsLayoutRunning();\n      if (running) this.stopLayout?.('quick-controls');\n      else this.startLayout?.();\n      this._syncQuickControls();\n    });\n    listenButton(buttons.zoomIn, 'click', () => this._applyQuickZoom(1));\n    listenButton(buttons.zoomOut, 'click', () => this._applyQuickZoom(-1));\n\n    addCleanup(this.on?.(EVENTS.CAMERA_CONTROL_CHANGE, () => this._syncQuickControls()));\n    addCleanup(this.on?.(EVENTS.LAYOUT_START, () => this._syncQuickControls()));\n    addCleanup(this.on?.(EVENTS.LAYOUT_STOP, () => this._syncQuickControls()));\n    addCleanup(this.on?.(EVENTS.LAYOUT_CHANGED, () => this._syncQuickControls()));\n    if (typeof doc.addEventListener === 'function') {\n      const closeHeliosMenu = (event) => {\n        if (heliosMenu?.hidden === true) return;\n        const target = event?.target ?? null;\n        if (target && typeof root.contains === 'function' && root.contains(target)) return;\n        setHeliosMenuOpen(false);\n      };\n      doc.addEventListener('pointerdown', closeHeliosMenu);\n      addCleanup(() => doc.removeEventListener?.('pointerdown', closeHeliosMenu));\n    }\n\n    if (typeof this.layers.addLayer === 'function') this.layers.addLayer('quick-controls', root);\n    else this.layers.root.appendChild(root);\n    this._quickControls = { root, buttons };\n    this._updateQuickControlsPlacement();\n    this._updateQuickControlsOverlayInsets();\n    this._syncQuickControls();\n    return root;\n  }\n\n  _resolveQuickControlsTheme() {\n    const uiTheme = typeof this.ui?.theme === 'string' && this.ui.theme ? this.ui.theme : null;\n    return uiTheme ?? this._quickControlsConfig?.theme ?? QUICK_CONTROL_DEFAULTS.theme;\n  }\n\n  _syncQuickControlsTheme(theme = null) {\n    const root = this._quickControls?.root ?? null;\n    if (!root) return this;\n    root.dataset.theme = (typeof theme === 'string' && theme) ? theme : this._resolveQuickControlsTheme();\n    return this;\n  }\n\n  _destroyQuickControls() {\n    for (const cleanup of this._quickControlCleanups ?? []) cleanup?.();\n    this._quickControlCleanups = [];\n    if (this._quickControls?.root) {\n      if (typeof this.layers?.removeLayer === 'function') this.layers.removeLayer('quick-controls');\n      else this._quickControls.root.remove?.();\n    }\n    this._quickControls = null;\n    this._setQuickControlsOverlayInsets({ top: 0, right: 0, bottom: 0, left: 0 });\n  }\n\n  _quickControlsLayoutRunning() {\n    const scheduler = this.scheduler ?? null;\n    const state = typeof scheduler?.getLayoutState === 'function'\n      ? scheduler.getLayoutState()\n      : (scheduler?.layoutEnabled !== false ? 'running' : 'stopped');\n    return state !== 'stopped';\n  }\n\n  _syncQuickControls() {\n    const buttons = this._quickControls?.buttons ?? {};\n    if (buttons.autoFit) {\n      const active = this.cameraControls?.().autoFit === true;\n      buttons.autoFit.classList?.toggle?.('is-active', active);\n      buttons.autoFit.setAttribute?.('aria-pressed', String(active));\n      const label = active ? 'Auto fit is on' : 'Auto fit is off';\n      buttons.autoFit.title = label;\n      buttons.autoFit.setAttribute?.('aria-label', label);\n    }\n    if (buttons.layout) {\n      const running = this._quickControlsLayoutRunning();\n      buttons.layout.classList?.toggle?.('is-active', running);\n      buttons.layout.setAttribute?.('aria-pressed', String(running));\n      const label = running ? 'Pause layout' : 'Run layout';\n      buttons.layout.title = label;\n      buttons.layout.setAttribute?.('aria-label', label);\n      buttons.layout.innerHTML = running\n        ? `\n<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n  <rect x=\"7\" y=\"5\" width=\"3.6\" height=\"14\" rx=\"0.9\" />\n  <rect x=\"13.4\" y=\"5\" width=\"3.6\" height=\"14\" rx=\"0.9\" />\n</svg>`\n        : `\n<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n  <path d=\"M8 5.5v13l10-6.5Z\" />\n</svg>`;\n    }\n    this._syncQuickControlsTheme();\n  }\n\n  _applyQuickZoom(direction) {\n    const camera = this.renderer?.camera ?? null;\n    if (!camera) return false;\n    const factor = this._quickControlsConfig?.zoomFactor ?? QUICK_CONTROL_DEFAULTS.zoomFactor;\n    const scale = direction >= 0 ? factor : (1 / factor);\n    const pose = this.cameraPose?.() ?? captureCameraPose(camera);\n    if (pose?.mode === '3d') {\n      const current = Number.isFinite(pose.distance) ? pose.distance : Number(camera.distance);\n      if (!Number.isFinite(current)) return false;\n      const min = Math.max(1e-6, Number(camera.minDistance ?? 1e-6));\n      const max = Math.max(min, Number(camera.maxDistance ?? Number.POSITIVE_INFINITY));\n      const nextDistance = clamp(current / scale, min, max);\n      if (Math.abs(nextDistance - current) <= 1e-9) return false;\n      this.setCameraPose?.({ distance: nextDistance }, { source: 'ui' });\n    } else {\n      const current = Number.isFinite(pose?.zoom) ? pose.zoom : Number(camera.zoom);\n      if (!Number.isFinite(current)) return false;\n      const min = Math.max(1e-6, Number(camera.minZoom ?? 1e-6));\n      const max = Math.max(min, Number(camera.maxZoom ?? Number.POSITIVE_INFINITY));\n      const nextZoom = clamp(current * scale, min, max);\n      if (Math.abs(nextZoom - current) <= 1e-9) return false;\n      this.setCameraPose?.({ zoom: nextZoom }, { source: 'ui' });\n    }\n    this._syncQuickControls();\n    return true;\n  }\n\n  _updateQuickControlsPlacement() {\n    const root = this._quickControls?.root ?? null;\n    if (!root?.style) return;\n    const config = this._quickControlsConfig ?? QUICK_CONTROL_DEFAULTS;\n    const overlay = normalizeInsets(this._baseOverlayInsets);\n    const viewport = normalizeInsets(this.layers?.viewportInsets);\n    const placement = {\n      top: Math.max(overlay.top, viewport.top),\n      right: Math.max(overlay.right, viewport.right),\n      bottom: Math.max(overlay.bottom, viewport.bottom),\n      left: Math.max(overlay.left, viewport.left),\n    };\n    root.style.top = `${placement.top + config.margin}px`;\n    root.style.right = `${placement.right + config.margin}px`;\n  }\n\n  _updateQuickControlsOverlayInsets() {\n    const config = this._quickControlsConfig ?? QUICK_CONTROL_DEFAULTS;\n    if (config.enabled !== true || config.reserveLegendSpace !== true || !this._quickControls?.root) {\n      this._setQuickControlsOverlayInsets({ top: 0, right: 0, bottom: 0, left: 0 });\n      return;\n    }\n    this._setQuickControlsOverlayInsets({\n      top: 0,\n      right: config.margin + config.buttonSize + config.gap + config.legendOffset,\n      bottom: 0,\n      left: 0,\n    });\n  }\n\n  _setQuickControlsOverlayInsets(insets) {\n    this._quickControlsOverlayInsets = normalizeInsets(insets);\n    this._applyOverlayInsets();\n  }\n\n  _applyOverlayInsets() {\n    const next = mergeOverlayInsets(this._baseOverlayInsets, this._quickControlsOverlayInsets);\n    const prev = this._overlayInsets ?? { top: 0, right: 0, bottom: 0, left: 0 };\n    if (\n      prev.top === next.top\n      && prev.right === next.right\n      && prev.bottom === next.bottom\n      && prev.left === next.left\n    ) {\n      this._updateQuickControlsPlacement();\n      return this;\n    }\n    this._overlayInsets = next;\n    this._updateQuickControlsPlacement();\n    this.scheduler?.requestRender?.();\n    return this;\n  }\n\n  /**\n   * Read or set reserved viewport insets for overlays such as labels and legends.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {object} [insets] - Insets in CSS pixels.\n   * @param {number} [insets.top] - Top inset.\n   * @param {number} [insets.right] - Right inset.\n   * @param {number} [insets.bottom] - Bottom inset.\n   * @param {number} [insets.left] - Left inset.\n   * @returns {object|Helios} Current inset object when omitted; otherwise this Helios instance.\n   */\n  overlayInsets(insets) {\n    if (arguments.length === 0) return { ...this._overlayInsets };\n    const next = normalizeInsets(insets);\n    const prev = this._baseOverlayInsets ?? { top: 0, right: 0, bottom: 0, left: 0 };\n    if (\n      prev.top === next.top\n      && prev.right === next.right\n      && prev.bottom === next.bottom\n      && prev.left === next.left\n    ) {\n      return this;\n    }\n    this._baseOverlayInsets = next;\n    return this._applyOverlayInsets();\n  }\n\n  /**\n   * Read or set whether labels are enabled.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {boolean} [value] - Enable labels.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  labelsEnabled(value) {\n    const labelsBehavior = this.behavior?.labels ?? null;\n    if (arguments.length === 0) return labelsBehavior?.enabled?.() ?? (this.labelsMode() !== 'off');\n    labelsBehavior?.enabled?.(value);\n    if (labelsBehavior) return this;\n    return this.labelsMode(value === true ? 'auto' : 'off');\n  }\n\n  /**\n   * Read or set the label selection mode.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {'auto'|'selected-only'|'off'} [value] - Label mode.\n   * @returns {string|Helios} Current mode when omitted; otherwise this Helios instance.\n   */\n  labelsMode(value) {\n    const labelsBehavior = this.behavior?.labels ?? null;\n    if (arguments.length === 0) {\n      if (labelsBehavior) return labelsBehavior.mode();\n      const labels = this.labels?.() ?? { enabled: false };\n      if (labels.enabled !== true) return 'off';\n      return labels.selectionMode === 'selected-only' ? 'selected-only' : 'auto';\n    }\n    if (labelsBehavior) {\n      labelsBehavior.mode(value);\n      return this;\n    }\n    const raw = String(value ?? '').trim().toLowerCase();\n    if (raw === 'selected' || raw === 'selected-only' || raw === 'selected_only') {\n      return this.labels({ enabled: true, selectionMode: 'selected-only' });\n    }\n    if (raw === 'off' || raw === 'none' || raw === 'disabled' || raw === 'false') {\n      return this.labels({ enabled: false });\n    }\n    return this.labels({ enabled: true, selectionMode: 'ranked' });\n  }\n\n  /**\n   * Read or set the maximum number of visible labels.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {number} [value] - Maximum label count.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  labelsMaxVisible(value) {\n    if (arguments.length === 0) return Number(this.labels()?.maxVisible ?? 0);\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this.labels({ maxVisible: Math.max(0, Math.floor(numeric)) });\n  }\n\n  /**\n   * Read or set whether selected-only labels still avoid spatial collisions.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {boolean} [value] - Enable collision-aware selected labels.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  labelsSelectedOnlySpaceAware(value) {\n    if (arguments.length === 0) return this.labels()?.selectedOnlySpaceAware === true;\n    return this.labels({ selectedOnlySpaceAware: value === true });\n  }\n\n  /**\n   * Read or set the label font-size multiplier.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {number} [value] - Font-size scale.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  labelsFontSizeScale(value) {\n    if (arguments.length === 0) return Number(this.labels()?.fontSizeScale ?? 1);\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this.labels({ fontSizeScale: Math.max(0.25, numeric) });\n  }\n\n  /**\n   * Read or set the minimum on-screen node radius required for label candidates.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {number} [value] - Minimum radius in CSS pixels.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  labelsMinScreenRadius(value) {\n    if (arguments.length === 0) return Number(this.labels()?.minScreenRadiusPx ?? 0);\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this.labels({ minScreenRadiusPx: Math.max(0, numeric) });\n  }\n\n  /**\n   * Read or set label outline width.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {number} [value] - Outline width in CSS pixels.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  labelsOutlineWidth(value) {\n    if (arguments.length === 0) return Number(this.labels()?.outlineWidth ?? 0);\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this.labels({ outlineWidth: Math.max(0, numeric) });\n  }\n\n  /**\n   * Read or set the radial node-size multiplier used to offset labels.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {number} [value] - Offset radius multiplier.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  labelsOffsetRadiusFactor(value) {\n    if (arguments.length === 0) return Number(this.labels()?.offsetRadiusFactor ?? 1);\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this.labels({ offsetRadiusFactor: numeric });\n  }\n\n  /**\n   * Read or set the fixed pixel offset added to label placement.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {number} [value] - Offset in CSS pixels.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  labelsOffsetPx(value) {\n    if (arguments.length === 0) return Number(this.labels()?.offsetPx ?? 4);\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this.labels({ offsetPx: numeric });\n  }\n\n  /**\n   * Read or set the maximum number of characters per label row.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {number} [value] - Maximum characters, or zero for no truncation.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  labelsMaxChars(value) {\n    if (arguments.length === 0) return Number(this.labels()?.maxChars ?? 0);\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this.labels({ maxChars: Math.max(0, Math.floor(numeric)) });\n  }\n\n  /**\n   * Read or set the maximum number of rows per wrapped label.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {number} [value] - Maximum rows.\n   * @returns {number|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  labelsMaxRows(value) {\n    if (arguments.length === 0) return Number(this.labels()?.maxRows ?? 1);\n    const numeric = Number(value);\n    if (!Number.isFinite(numeric)) return this;\n    return this.labels({ maxRows: Math.max(1, Math.floor(numeric)) });\n  }\n\n  /**\n   * Read or set label fill color.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {string|Array<number>} [color] - CSS color string or normalized RGBA tuple.\n   * @returns {string|Array<number>|Helios|null} Current color when omitted; otherwise this Helios instance.\n   */\n  labelFill(color) {\n    if (arguments.length === 0) return this.labels()?.fill ?? null;\n    if (typeof color === 'string' && color.trim()) return this.labels({ fill: color.trim() });\n    const normalized = normalizeColorInput(color);\n    if (normalized) return this.labels({ fill: normalized });\n    throw new Error('labelFill(color) expects a CSS color string or [r,g,b(,a)]');\n  }\n\n  /**\n   * Read or set label outline color.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {string|Array<number>} [color] - CSS color string or normalized RGBA tuple.\n   * @returns {string|Array<number>|Helios|null} Current color when omitted; otherwise this Helios instance.\n   */\n  labelOutlineColor(color) {\n    if (arguments.length === 0) return this.labels()?.outlineColor ?? null;\n    if (typeof color === 'string' && color.trim()) return this.labels({ outlineColor: color.trim() });\n    const normalized = normalizeColorInput(color);\n    if (normalized) return this.labels({ outlineColor: normalized });\n    throw new Error('labelOutlineColor(color) expects a CSS color string or [r,g,b(,a)]');\n  }\n\n  /**\n   * Read or set the CSS font-family used by labels.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {string} [value] - Font family string.\n   * @returns {string|Helios} Current font family when omitted; otherwise this Helios instance.\n   */\n  labelFontFamily(value) {\n    if (arguments.length === 0) return this.labels()?.fontFamily ?? '';\n    const next = String(value ?? '').trim();\n    return this.labels({ fontFamily: next });\n  }\n\n  /**\n   * Read or set the label text source.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {string|Function|null} [value] - Attribute name, callback, or `null` for default labels.\n   * @returns {string|Function|null|Helios} Current source when omitted; otherwise this Helios instance.\n   */\n  labelSource(value) {\n    if (arguments.length === 0) return this.labels()?.source ?? null;\n    if (typeof value === 'function') return this.labels({ source: value });\n    const next = value == null ? null : String(value).trim();\n    return this.labels({ source: next || null });\n  }\n\n  /**\n   * Pre-runs mapper application before first render. Useful for large graphs\n   * where the first geometry pass is expensive.\n   * Can be awaited before `helios.ready` to shorten time to first render.\n   *\n   * @public\n   * @apiSection Lifecycle\n   * @param {object} [options] - Reserved for future prewarm controls.\n   * @returns {Promise<void>} Resolves when mapper prewarm work has completed.\n   */\n  async prewarm(options = {}) {\n    if (this.prewarmPromise) return this.prewarmPromise;\n    this.debug.log('helios', 'Prewarming visuals before ready', {\n      updateLegacyBuffers: false,\n    });\n    this.prewarmPromise = (async () => {\n      if (this.mappersDirty) {\n        const nodeMapper = this.nodeMapper.toCombinedMapper();\n        const edgeMapper = this.edgeMapper.toCombinedMapper({ nodeMapper });\n        this.visuals.applyMappers({ nodeMapper, edgeMapper });\n        this.mappersDirty = false;\n      }\n      this.scheduler?.requestGeometry?.();\n    })();\n    try {\n      await this.prewarmPromise;\n    } catch (error) {\n      this.prewarmPromise = null;\n      this.debug.log('helios', 'Prewarm failed', { error });\n      throw error;\n    }\n    return this.prewarmPromise;\n  }\n\n  /**\n   * Create a layout instance from a layout option object or return an existing layout.\n   *\n   * @public\n   * @apiSection Layout And Positions\n   * @param {object|Layout} layoutOption - Layout instance or descriptor such as `{ type: 'gpu-force' }`.\n   * @returns {Layout} Layout instance bound to the current render network.\n   */\n  createLayout(layoutOption) {\n    const layoutNetwork = this._getLayoutNetwork();\n    if (isLayoutInstance(layoutOption)) {\n      if (layoutNetwork && layoutOption.network !== layoutNetwork) {\n        layoutOption.network = layoutNetwork;\n      }\n      return layoutOption;\n    }\n    if (layoutOption?.type === 'gpu-force' || layoutOption?.type === 'gpuforce') {\n      const requestedOptions = {\n        ...(layoutOption.options ?? {}),\n        mode: this.options.mode ?? '3d',\n        helios: this,\n      };\n      const gpuOptions = resolveGpuForceLayoutOptionsFromNetwork(layoutNetwork, requestedOptions);\n      this.debug.log('layout', 'Using GPU force layout', { ...gpuOptions, helios: undefined });\n      return new GpuForceLayout(layoutNetwork, this.visuals, gpuOptions);\n    }\n    if (layoutOption?.type === 'worker') {\n      const workerOptions = { ...(layoutOption.options ?? {}), mode: this.options.mode ?? '3d' };\n      this.debug.log('layout', 'Using worker layout', workerOptions);\n      return new WorkerLayout(layoutNetwork, this.visuals, workerOptions);\n    }\n    if (layoutOption?.type === 'd3force3d' || layoutOption?.type === 'd3-force-3d') {\n      const workerOptions = { ...(layoutOption.options ?? {}), mode: this.options.mode ?? '3d', helios: this };\n      this.debug.log('layout', 'Using d3-force-3d layout', workerOptions);\n      return new D3Force3DLayout(layoutNetwork, this.visuals, workerOptions);\n    }\n    const w = this.layers.size.width;\n    const h = this.layers.size.height;\n    this.debug.log('layout', 'Using static layout', { width: w, height: h });\n    return new StaticLayout(layoutNetwork, this.visuals, {\n      bounds: [-w * 0.5, -h * 0.5, w * 0.5, h * 0.5],\n    });\n  }\n\n  /**\n   * Add nodes to the backing network and initialize their visual state.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {number} count - Number of nodes to add.\n   * @param {Function} [initializer] - Optional callback receiving created node ids and the visual attribute manager.\n   * @returns {Uint32Array} Created node indices.\n   */\n  addNodes(count, initializer) {\n    const nodes = this.network.addNodes(count);\n    this.debug.log('helios', 'Adding nodes', { count });\n    this.visuals.applyNodeDefaults(nodes);\n    this.visuals.seedMissingPositions(resolveSeedBoundsForLayout(this.options.layout, this.layers.size, this.options.mode));\n    if (initializer) {\n      initializer(nodes, this.visuals);\n    }\n    this.visuals.markPositionsDirty();\n    this.storage?.markNetworkDirty?.('add-nodes');\n    this._markAutoFitDirty(false);\n    this._layout?.syncAutoSettingsForNetwork?.();\n    this.mappersDirty = true;\n    this._requestLayoutReheat('data');\n    this.scheduler.requestLayout('data');\n    this.scheduler.requestGeometry();\n    this._labels?.requestFullReselect?.('add-nodes');\n    return nodes;\n  }\n\n  /**\n   * Add edges to the backing network and initialize their visual state.\n   *\n   * @public\n   * @apiSection Network And Persistence\n   * @param {Array<Array<number>>|TypedArray} edges - Edge pairs to insert.\n   * @param {Function} [initializer] - Optional callback receiving created edge ids and the visual attribute manager.\n   * @returns {Uint32Array} Created edge indices.\n   */\n  addEdges(edges, initializer) {\n    const edgeIndices = this.network.addEdges(edges);\n    this.debug.log('helios', 'Adding edges', { count: edgeIndices?.length ?? 0 });\n    this.visuals.applyEdgeDefaults(edgeIndices);\n    if (initializer) {\n      initializer(edgeIndices, this.visuals);\n    }\n    this.visuals.markPositionsDirty();\n    this.storage?.markNetworkDirty?.('add-edges');\n    this._markAutoFitDirty(false);\n    this.mappersDirty = true;\n    this._requestLayoutReheat('data');\n    this.scheduler.requestLayout('data');\n    this.scheduler.requestGeometry();\n    this._labels?.requestFullReselect?.('add-edges');\n    return edgeIndices;\n  }\n\n  notifyNetworkChanged({\n    nodes,\n    edges,\n    topology = false,\n    attributes = false,\n    categories = false,\n    reason = 'network-changed',\n  } = {}) {\n    const hasNodeChange = nodes != null && nodes !== false;\n    const hasEdgeChange = edges != null && edges !== false;\n    const nodeDefaults = hasNodeChange && nodes !== true ? nodes : null;\n    const edgeDefaults = hasEdgeChange && edges !== true ? edges : null;\n    const oldNodeCount = null;\n    const oldEdgeCount = null;\n\n    if (hasNodeChange) {\n      this.debug.log('helios', 'Network nodes changed', { count: nodes.length ?? nodes.size ?? nodes });\n      if (nodeDefaults) this.visuals.applyNodeDefaults(nodeDefaults);\n      this.visuals.seedMissingPositions(resolveSeedBoundsForLayout(this.options.layout, this.layers.size, this.options.mode));\n    }\n    if (hasEdgeChange) {\n      this.debug.log('helios', 'Network edges changed', { count: edges.length ?? edges.size ?? edges });\n      if (edgeDefaults) this.visuals.applyEdgeDefaults(edgeDefaults);\n    }\n    this.visuals.markPositionsDirty();\n    if (hasNodeChange || hasEdgeChange || topology || attributes || categories) {\n      this.storage?.markNetworkDirty?.(reason);\n    }\n    this._markAutoFitDirty(false);\n    if (hasNodeChange || topology) {\n      this._layout?.syncAutoSettingsForNetwork?.();\n    }\n    if (topology || attributes || categories) {\n      this._refreshGraphFilterNetworks?.({ force: true, throwOnError: false });\n      this._syncLayoutNetworkFromFilter?.();\n    }\n    this.mappersDirty = true;\n    this._requestLayoutReheat('data');\n    this.scheduler.requestLayout('data');\n    this.scheduler.requestGeometry();\n    this.scheduler.requestRender();\n    this._labels?.requestFullReselect?.('network-changed');\n    this.emit(EVENTS.NETWORK_REPLACED, {\n      oldNetwork: this.network ?? null,\n      network: this.network ?? null,\n      oldNodeCount,\n      oldEdgeCount,\n      nodeCount: this.network?.nodeCount ?? null,\n      edgeCount: this.network?.edgeCount ?? null,\n      live: true,\n      reason,\n    });\n  }\n\n  /**\n   * Read or set whether selected and highlighted items are promoted later in render order.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {boolean} [value] - Enable interaction-aware render-order promotion.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  interactionRenderOrder(value) {\n    if (arguments.length === 0) return this._interactionRenderOrder?.enabled === true;\n    this._interactionRenderOrder ??= {};\n    this._interactionRenderOrder.enabled = value === true;\n    this.options ??= {};\n    this.options.interactionRenderOrder = this._interactionRenderOrder.enabled;\n    this._emitUIBindingChange?.('interactionRenderOrder', this._interactionRenderOrder.enabled);\n    if (this._interactionRenderOrder.enabled) this._reprioritizePersistentInteractionRenderOrder?.();\n    this.scheduler?.requestRender?.();\n    return this;\n  }\n\n  _shouldPromoteInteractionRenderOrder() {\n    return this._interactionRenderOrder?.enabled === true;\n  }\n\n  _promoteInteractionNodes(indices, options = {}) {\n    if (!this._shouldPromoteInteractionRenderOrder() || !indices) return null;\n    const network = this._getRenderNetwork?.() ?? this.network ?? null;\n    if (typeof network?.promoteActiveNodesToRenderEnd !== 'function') return null;\n    const result = network.promoteActiveNodesToRenderEnd(indices);\n    if (result?.changed) this.scheduler?.requestRender?.();\n    if (\n      options.connectedEdges === true\n      && typeof network.promoteActiveEdgesForNodesToRenderEnd === 'function'\n    ) {\n      const edgeResult = network.promoteActiveEdgesForNodesToRenderEnd(indices, { direction: options.direction ?? 'both' });\n      if (edgeResult?.changed) this.scheduler?.requestRender?.();\n    }\n    return result;\n  }\n\n  _promoteInteractionEdges(indices) {\n    if (!this._shouldPromoteInteractionRenderOrder() || !indices) return null;\n    const network = this._getRenderNetwork?.() ?? this.network ?? null;\n    if (typeof network?.promoteActiveEdgesToRenderEnd !== 'function') return null;\n    const result = network.promoteActiveEdgesToRenderEnd(indices);\n    if (result?.changed) this.scheduler?.requestRender?.();\n    return result;\n  }\n\n  _reprioritizePersistentInteractionRenderOrder() {\n    if (!this._shouldPromoteInteractionRenderOrder()) return;\n    const highlighted = this._highlightUnion ?? null;\n    if (highlighted?.nodes?.size) {\n      this._promoteInteractionNodes(Array.from(highlighted.nodes), {\n        connectedEdges: this._interactionRenderOrder?.promoteHighlightedConnectedEdges === true && this._highlightConnectedEdges === true,\n      });\n    }\n    if (highlighted?.edges?.size) this._promoteInteractionEdges(Array.from(highlighted.edges));\n    const selection = this.behaviors?.get?.('selection')?.state ?? null;\n    if (selection?.selectedNodes?.size) {\n      this._promoteInteractionNodes(Array.from(selection.selectedNodes), {\n        connectedEdges: this._interactionRenderOrder?.promoteSelectedConnectedEdges !== false\n          && this.renderer?.graphLayer?.propagateSelectedNodesToEdges === true,\n      });\n    }\n    if (selection?.selectedEdges?.size) this._promoteInteractionEdges(Array.from(selection.selectedEdges));\n  }\n\n  /**\n   * Apply a state bitmask to node indices.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {Array<number>|TypedArray|number} indices - Node indices to update.\n   * @param {number|string|Array<string>} mask - State bitmask or named state such as `SELECTED` or `HIGHLIGHTED`.\n   * @param {object} [options] - State update options.\n   * @param {'replace'|'add'|'remove'|'toggle'} [options.mode='replace'] - How to combine the mask with the existing state.\n   * @returns {Helios} This Helios instance.\n   */\n  nodeState(indices, mask, options = {}) {\n    const mode = options.mode ?? 'replace';\n    const value = (Number(resolveStateMask(mask, this.constructor.STATES)) >>> 0);\n    this.network.withBufferAccess(() => {\n      const view = this.network.getNodeAttributeBuffer(NODE_STATE_ATTRIBUTE)?.view;\n      if (!view) return;\n      const usesBigInt = typeof view[0] === 'bigint';\n      const valueBig = usesBigInt ? BigInt(value) : null;\n      forEachIndex(indices, (index) => {\n        const id = Number(index);\n        if (!Number.isFinite(id) || id < 0) return;\n        const current = view[id] ?? (usesBigInt ? 0n : 0);\n        switch (mode) {\n          case 'add':\n            view[id] = usesBigInt ? (current | valueBig) : ((current | value) >>> 0);\n            break;\n          case 'remove':\n            view[id] = usesBigInt ? (current & (~valueBig)) : ((current & (~value)) >>> 0);\n            break;\n          case 'toggle':\n            view[id] = usesBigInt ? (current ^ valueBig) : ((current ^ value) >>> 0);\n            break;\n          default:\n            view[id] = usesBigInt ? valueBig : value;\n            break;\n        }\n      });\n      this.visuals.bumpNodeAttributes(NODE_STATE_ATTRIBUTE);\n    });\n    if (mode !== 'remove' && (value & this.constructor.STATES.HIGHLIGHTED) !== 0) {\n      this._promoteInteractionNodes?.(indices, {\n        connectedEdges: this._interactionRenderOrder?.promoteHighlightedConnectedEdges === true && this._highlightConnectedEdges === true,\n      });\n      this._reprioritizePersistentInteractionRenderOrder?.();\n    }\n    if (mode !== 'remove' && (value & this.constructor.STATES.SELECTED) !== 0) {\n      this._promoteInteractionNodes?.(indices, {\n        connectedEdges: this._interactionRenderOrder?.promoteSelectedConnectedEdges !== false\n          && this.renderer?.graphLayer?.propagateSelectedNodesToEdges === true,\n      });\n    }\n    this.scheduler.requestGeometry();\n    this._labels?.requestFullReselect?.('node-state');\n    return this;\n  }\n\n  /**\n   * Apply a state bitmask to edge indices.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {Array<number>|TypedArray|number} indices - Edge indices to update.\n   * @param {number|string|Array<string>} mask - State bitmask or named state such as `SELECTED` or `HIGHLIGHTED`.\n   * @param {object} [options] - State update options.\n   * @param {'replace'|'add'|'remove'|'toggle'} [options.mode='replace'] - How to combine the mask with the existing state.\n   * @returns {Helios} This Helios instance.\n   */\n  edgeState(indices, mask, options = {}) {\n    const mode = options.mode ?? 'replace';\n    const value = (Number(resolveStateMask(mask, this.constructor.STATES)) >>> 0);\n    this.network.withBufferAccess(() => {\n      const view = this.network.getEdgeAttributeBuffer(EDGE_STATE_ATTRIBUTE)?.view;\n      if (!view) return;\n      const usesBigInt = typeof view[0] === 'bigint';\n      const valueBig = usesBigInt ? BigInt(value) : null;\n      forEachIndex(indices, (index) => {\n        const id = Number(index);\n        if (!Number.isFinite(id) || id < 0) return;\n        const current = view[id] ?? (usesBigInt ? 0n : 0);\n        switch (mode) {\n          case 'add':\n            view[id] = usesBigInt ? (current | valueBig) : ((current | value) >>> 0);\n            break;\n          case 'remove':\n            view[id] = usesBigInt ? (current & (~valueBig)) : ((current & (~value)) >>> 0);\n            break;\n          case 'toggle':\n            view[id] = usesBigInt ? (current ^ valueBig) : ((current ^ value) >>> 0);\n            break;\n          default:\n            view[id] = usesBigInt ? valueBig : value;\n            break;\n        }\n      });\n      this.visuals.bumpEdgeAttributes(EDGE_STATE_ATTRIBUTE);\n    });\n    if (mode !== 'remove' && (value & (this.constructor.STATES.HIGHLIGHTED | this.constructor.STATES.SELECTED)) !== 0) {\n      this._promoteInteractionEdges?.(indices);\n      if ((value & this.constructor.STATES.HIGHLIGHTED) !== 0) this._reprioritizePersistentInteractionRenderOrder?.();\n    }\n    this.scheduler.requestGeometry();\n    return this;\n  }\n\n  /**\n   * Set transient hover state for a node.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {number|null} index - Hovered node index, or `null` to clear.\n   * @param {number|string|Array<string>} [mask='HOVERED'] - State mask applied while hovered.\n   * @returns {Helios} This Helios instance.\n   */\n  hoverNodeState(index, mask) {\n    const resolvedIndex = index == null || Number(index) < 0 ? 0xffffffff : (Number(index) >>> 0);\n    const isVirtual = mask === 'HOVER';\n    const value = (Number(resolveStateMask(mask, this.constructor.STATES)) >>> 0);\n    const layer = this.renderer?.graphLayer ?? null;\n    if (layer && 'hoveredNodeIndex' in layer) {\n      layer.hoveredNodeIndex = resolvedIndex;\n      layer.hoveredNodeState = value;\n      layer.hoveredNodeIsVirtual = isVirtual && resolvedIndex !== 0xffffffff;\n      if (resolvedIndex !== 0xffffffff) {\n        this._promoteInteractionNodes?.([resolvedIndex], {\n          connectedEdges: this._interactionRenderOrder?.promoteHoverConnectedEdges !== false\n            && layer.propagateHoveredNodeToEdges === true,\n        });\n        this._reprioritizePersistentInteractionRenderOrder?.();\n      }\n      this.scheduler.requestRender();\n      return this;\n    }\n    this._pendingGraphLayerProps.set('hoveredNodeIndex', resolvedIndex);\n    this._pendingGraphLayerProps.set('hoveredNodeState', value);\n    this._pendingGraphLayerProps.set('hoveredNodeIsVirtual', isVirtual && resolvedIndex !== 0xffffffff);\n    if (resolvedIndex !== 0xffffffff) {\n      this._promoteInteractionNodes?.([resolvedIndex]);\n      this._reprioritizePersistentInteractionRenderOrder?.();\n    }\n    return this;\n  }\n\n  /**\n   * Set transient hover state for an edge.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {number|null} index - Hovered edge index, or `null` to clear.\n   * @param {number|string|Array<string>} [mask='HOVERED'] - State mask applied while hovered.\n   * @returns {Helios} This Helios instance.\n   */\n  hoverEdgeState(index, mask) {\n    const resolvedIndex = index == null || Number(index) < 0 ? 0xffffffff : (Number(index) >>> 0);\n    const isVirtual = mask === 'HOVER';\n    const value = (Number(resolveStateMask(mask, this.constructor.STATES)) >>> 0);\n    const layer = this.renderer?.graphLayer ?? null;\n    if (layer && 'hoveredEdgeIndex' in layer) {\n      layer.hoveredEdgeIndex = resolvedIndex;\n      layer.hoveredEdgeState = value;\n      layer.hoveredEdgeIsVirtual = isVirtual && resolvedIndex !== 0xffffffff;\n      if (resolvedIndex !== 0xffffffff) {\n        this._promoteInteractionEdges?.([resolvedIndex]);\n        this._reprioritizePersistentInteractionRenderOrder?.();\n      }\n      this.scheduler.requestRender();\n      return this;\n    }\n    this._pendingGraphLayerProps.set('hoveredEdgeIndex', resolvedIndex);\n    this._pendingGraphLayerProps.set('hoveredEdgeState', value);\n    this._pendingGraphLayerProps.set('hoveredEdgeIsVirtual', isVirtual && resolvedIndex !== 0xffffffff);\n    if (resolvedIndex !== 0xffffffff) {\n      this._promoteInteractionEdges?.([resolvedIndex]);\n      this._reprioritizePersistentInteractionRenderOrder?.();\n    }\n    return this;\n  }\n\n  _setHighlightSource(source, { nodes = [], edges = [] } = {}) {\n    const key = String(source ?? '').trim();\n    if (!key) return this;\n    this._highlightSources.set(key, {\n      nodes: new Set(Array.from(nodes ?? []).map(Number).filter((id) => Number.isInteger(id) && id >= 0)),\n      edges: new Set(Array.from(edges ?? []).map(Number).filter((id) => Number.isInteger(id) && id >= 0)),\n    });\n    return this._applyHighlightSources();\n  }\n\n  _collectConnectedHighlightEdges(nodeIds) {\n    const network = this._getRenderNetwork?.() ?? this.network ?? null;\n    const nodes = new Set(Array.from(nodeIds ?? []).map(Number).filter((id) => Number.isInteger(id) && id >= 0));\n    if (!network || !nodes.size) return [];\n    return network.withBufferAccess?.(() => {\n      const ids = network.edgeIndices ?? [];\n      const edges = network.edgesView ?? null;\n      if (!edges) return [];\n      const matches = [];\n      for (const edgeRaw of ids) {\n        const edge = Number(edgeRaw);\n        const source = Number(edges[edge * 2]);\n        const target = Number(edges[edge * 2 + 1]);\n        if (nodes.has(source) || nodes.has(target)) matches.push(edge);\n      }\n      return matches;\n    }) ?? [];\n  }\n\n  _clearHighlightSource(source) {\n    const key = String(source ?? '').trim();\n    if (!key || !this._highlightSources?.has(key)) return this;\n    this._highlightSources.delete(key);\n    return this._applyHighlightSources();\n  }\n\n  _applyHighlightSources() {\n    const nextNodes = new Set();\n    const nextEdges = new Set();\n    for (const entry of this._highlightSources?.values?.() ?? []) {\n      for (const id of entry.nodes ?? []) nextNodes.add(id);\n      for (const id of entry.edges ?? []) nextEdges.add(id);\n    }\n    if (this._highlightConnectedEdges === true) {\n      for (const edge of this._collectConnectedHighlightEdges(nextNodes)) nextEdges.add(edge);\n    }\n    const prev = this._highlightUnion ?? { nodes: new Set(), edges: new Set() };\n    const removeNodes = Array.from(prev.nodes).filter((id) => !nextNodes.has(id));\n    const addNodes = Array.from(nextNodes).filter((id) => !prev.nodes.has(id));\n    const removeEdges = Array.from(prev.edges).filter((id) => !nextEdges.has(id));\n    const addEdges = Array.from(nextEdges).filter((id) => !prev.edges.has(id));\n    if (removeNodes.length) this.nodeState(removeNodes, 'HIGHLIGHTED', { mode: 'remove' });\n    if (addNodes.length) this.nodeState(addNodes, 'HIGHLIGHTED', { mode: 'add' });\n    if (removeEdges.length) this.edgeState(removeEdges, 'HIGHLIGHTED', { mode: 'remove' });\n    if (addEdges.length) this.edgeState(addEdges, 'HIGHLIGHTED', { mode: 'add' });\n    this._highlightUnion = { nodes: nextNodes, edges: nextEdges };\n    this._reprioritizePersistentInteractionRenderOrder?.();\n    this.emit?.('highlight:change', {\n      nodes: Array.from(nextNodes),\n      edges: Array.from(nextEdges),\n      addedNodes: addNodes,\n      removedNodes: removeNodes,\n      addedEdges: addEdges,\n      removedEdges: removeEdges,\n    });\n    return this;\n  }\n\n  /**\n   * Read or set whether highlighted nodes also highlight their connected edges.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {boolean} [value] - Enable connected-edge highlighting.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  highlightConnectedEdges(value) {\n    if (arguments.length === 0) return this._highlightConnectedEdges === true;\n    this._highlightConnectedEdges = value === true;\n    this.options ??= {};\n    this.options.highlightConnectedEdges = this._highlightConnectedEdges;\n    this._applyHighlightSources();\n    this._emitUIBindingChange?.('highlightConnectedEdges', this._highlightConnectedEdges);\n    this.scheduler?.requestRender?.();\n    return this;\n  }\n\n  /**\n   * Read or set styling for nodes carrying a state bit.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {number|string} slot - State slot index or name.\n   * @param {object} [style] - Node state style with scale, opacity, outline, discard, and color fields.\n   * @returns {object|null|Helios} Current style when `style` is omitted; otherwise this Helios instance.\n   */\n  nodeStateStyle(slot, style) {\n    if (arguments.length < 2) {\n      const layer = this.renderer?.graphLayer;\n      const index = Number(resolveStateSlot(slot, this.constructor.STATES));\n      if (!Number.isInteger(index) || index < 0) return null;\n      if (!layer) {\n        return this._stateStyleCache?.nodeSlots?.get(index) ?? null;\n      }\n      if (index >= layer.stateSlotCount) return null;\n      const o = index * 4;\n      const forceMask = layer.nodeStateForceMaxAlphaMask >>> 0;\n      return {\n        sizeMul: layer.nodeStateScale[o + 0],\n        opacityMul: layer.nodeStateScale[o + 1],\n        outlineMul: layer.nodeStateScale[o + 2],\n        discard: layer.nodeStateScale[o + 3] === 1,\n        forceMaxAlpha: ((forceMask >> index) & 1) === 1,\n        colorMul: Array.from(layer.nodeStateColorMul.slice(o, o + 4)),\n        colorAdd: Array.from(layer.nodeStateColorAdd.slice(o, o + 4)),\n      };\n    }\n    const resolvedSlot = resolveStateSlot(slot, this.constructor.STATES);\n    if (this._stateStyleCache?.nodeSlots) {\n      this._stateStyleCache.nodeSlots.set(resolvedSlot, style);\n    }\n    this.renderer?.graphLayer?.setNodeStateStyle?.(resolvedSlot, style);\n    if (\n      this._hoverStyleFromHighlight === true\n      && resolvedSlot === resolveStateSlot('HIGHLIGHTED', this.constructor.STATES)\n    ) {\n      this.nodeHoverStyle(style);\n    }\n    this.scheduler.requestRender();\n    return this;\n  }\n\n  /**\n   * Read or set styling for nodes with no active state bits.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {object} [style] - Node style applied to unselected/unhighlighted nodes.\n   * @returns {object|null|Helios} Current style when omitted; otherwise this Helios instance.\n   */\n  nodeNoStateStyle(style) {\n    if (arguments.length === 0) {\n      const layer = this.renderer?.graphLayer;\n      if (!layer) return this._stateStyleCache?.nodeNoState ?? null;\n      return {\n        sizeMul: layer.nodeNoStateScale[0],\n        opacityMul: layer.nodeNoStateScale[1],\n        outlineMul: layer.nodeNoStateScale[2],\n        discard: layer.nodeNoStateScale[3] === 1,\n        colorMul: Array.from(layer.nodeNoStateColorMul.slice(0, 4)),\n        colorAdd: Array.from(layer.nodeNoStateColorAdd.slice(0, 4)),\n      };\n    }\n    if (this._stateStyleCache) {\n      this._stateStyleCache.nodeNoState = style;\n    }\n    const layer = this.renderer?.graphLayer;\n    layer?.setNodeNoStateStyle?.(style);\n    if (layer && style?.enabled !== false) layer.nodeNoStateStyleEnabled = true;\n    this.scheduler.requestRender();\n    return this;\n  }\n\n  /**\n   * Read or set styling for edges carrying a state bit.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {number|string} slot - State slot index or name.\n   * @param {object} [style] - Edge state style with width, opacity, discard, and color fields.\n   * @returns {object|null|Helios} Current style when `style` is omitted; otherwise this Helios instance.\n   */\n  edgeStateStyle(slot, style) {\n    if (arguments.length < 2) {\n      const layer = this.renderer?.graphLayer;\n      const index = Number(resolveStateSlot(slot, this.constructor.STATES));\n      if (!Number.isInteger(index) || index < 0) return null;\n      if (!layer) {\n        return this._stateStyleCache?.edgeSlots?.get(index) ?? null;\n      }\n      if (index >= layer.stateSlotCount) return null;\n      const o = index * 4;\n      const forceMask = layer.edgeStateForceMaxAlphaMask >>> 0;\n      return {\n        widthMul: layer.edgeStateScale[o + 0],\n        opacityMul: layer.edgeStateScale[o + 1],\n        discard: layer.edgeStateScale[o + 3] === 1,\n        forceMaxAlpha: ((forceMask >> index) & 1) === 1,\n        colorMul: Array.from(layer.edgeStateColorMul.slice(o, o + 4)),\n        colorAdd: Array.from(layer.edgeStateColorAdd.slice(o, o + 4)),\n      };\n    }\n    const resolvedSlot = resolveStateSlot(slot, this.constructor.STATES);\n    if (this._stateStyleCache?.edgeSlots) {\n      this._stateStyleCache.edgeSlots.set(resolvedSlot, style);\n    }\n    this.renderer?.graphLayer?.setEdgeStateStyle?.(resolvedSlot, style);\n    if (\n      this._hoverStyleFromHighlight === true\n      && resolvedSlot === resolveStateSlot('HIGHLIGHTED', this.constructor.STATES)\n    ) {\n      this.edgeHoverStyle(style);\n    }\n    this.scheduler.requestRender();\n    return this;\n  }\n\n  /**\n   * Read or set styling for edges with no active state bits.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {object} [style] - Edge style applied to unselected/unhighlighted edges.\n   * @returns {object|null|Helios} Current style when omitted; otherwise this Helios instance.\n   */\n  edgeNoStateStyle(style) {\n    if (arguments.length === 0) {\n      const layer = this.renderer?.graphLayer;\n      if (!layer) return this._stateStyleCache?.edgeNoState ?? null;\n      return {\n        widthMul: layer.edgeNoStateScale[0],\n        opacityMul: layer.edgeNoStateScale[1],\n        discard: layer.edgeNoStateScale[3] === 1,\n        colorMul: Array.from(layer.edgeNoStateColorMul.slice(0, 4)),\n        colorAdd: Array.from(layer.edgeNoStateColorAdd.slice(0, 4)),\n      };\n    }\n    if (this._stateStyleCache) {\n      this._stateStyleCache.edgeNoState = style;\n    }\n    const layer = this.renderer?.graphLayer;\n    layer?.setEdgeNoStateStyle?.(style);\n    if (layer && style?.enabled !== false) layer.edgeNoStateStyleEnabled = true;\n    this.scheduler.requestRender();\n    return this;\n  }\n\n  /**\n   * Read or set the transient hover style for nodes.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {object} [style] - Node hover style.\n   * @returns {object|null|Helios} Current style when omitted; otherwise this Helios instance.\n   */\n  nodeHoverStyle(style) {\n    if (arguments.length === 0) {\n      const layer = this.renderer?.graphLayer;\n      if (!layer || !layer.nodeHoverScale || !layer.nodeHoverColorMul || !layer.nodeHoverColorAdd) {\n        return this._stateStyleCache?.nodeHover ?? null;\n      }\n      return {\n        sizeMul: layer.nodeHoverScale[0],\n        opacityMul: layer.nodeHoverScale[1],\n        outlineMul: layer.nodeHoverScale[2],\n        forceMaxAlpha: layer.nodeHoverForceMaxAlpha === true,\n        colorMul: Array.from(layer.nodeHoverColorMul.slice(0, 4)),\n        colorAdd: Array.from(layer.nodeHoverColorAdd.slice(0, 4)),\n      };\n    }\n    if (this._stateStyleCache) this._stateStyleCache.nodeHover = style;\n    this.renderer?.graphLayer?.setNodeHoverStyle?.(style);\n    this.scheduler.requestRender();\n    return this;\n  }\n\n  /**\n   * Read or set the transient hover style for edges.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {object} [style] - Edge hover style.\n   * @returns {object|null|Helios} Current style when omitted; otherwise this Helios instance.\n   */\n  edgeHoverStyle(style) {\n    if (arguments.length === 0) {\n      const layer = this.renderer?.graphLayer;\n      if (!layer || !layer.edgeHoverScale || !layer.edgeHoverColorMul || !layer.edgeHoverColorAdd) {\n        return this._stateStyleCache?.edgeHover ?? null;\n      }\n      return {\n        widthMul: layer.edgeHoverScale[0],\n        opacityMul: layer.edgeHoverScale[1],\n        forceMaxAlpha: layer.edgeHoverForceMaxAlpha === true,\n        colorMul: Array.from(layer.edgeHoverColorMul.slice(0, 4)),\n        colorAdd: Array.from(layer.edgeHoverColorAdd.slice(0, 4)),\n      };\n    }\n    if (this._stateStyleCache) this._stateStyleCache.edgeHover = style;\n    this.renderer?.graphLayer?.setEdgeHoverStyle?.(style);\n    this.scheduler.requestRender();\n    return this;\n  }\n\n  _copyHighlightStyleToHover() {\n    const nodeStyle = this.nodeStateStyle?.('HIGHLIGHTED') ?? null;\n    const edgeStyle = this.edgeStateStyle?.('HIGHLIGHTED') ?? null;\n    if (nodeStyle) this.nodeHoverStyle(nodeStyle);\n    if (edgeStyle) this.edgeHoverStyle(edgeStyle);\n    return this;\n  }\n\n  /**\n   * Read or set whether hover style follows the highlighted-state style.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {boolean} [value] - Copy highlighted styles into hover styles.\n   * @returns {boolean|Helios} Current value when omitted; otherwise this Helios instance.\n   */\n  hoverStyleFromHighlight(value) {\n    if (arguments.length === 0) return this._hoverStyleFromHighlight === true;\n    this._hoverStyleFromHighlight = value === true;\n    this.options ??= {};\n    this.options.hoverStyleFromHighlight = this._hoverStyleFromHighlight;\n    if (this._hoverStyleFromHighlight) this._copyHighlightStyleToHover();\n    this._emitUIBindingChange?.('hoverStyleFromHighlight', this._hoverStyleFromHighlight);\n    this.scheduler?.requestRender?.();\n    return this;\n  }\n\n  /**\n   * Reset all node and edge state styles to renderer defaults.\n   *\n   * @public\n   * @apiSection Interaction\n   * @returns {Helios} This Helios instance.\n   */\n  resetStateStyles() {\n    if (this._stateStyleCache) {\n      this._stateStyleCache.nodeSlots.clear();\n      this._stateStyleCache.edgeSlots.clear();\n      this._stateStyleCache.nodeNoState = null;\n      this._stateStyleCache.edgeNoState = null;\n      this._stateStyleCache.nodeHover = null;\n      this._stateStyleCache.edgeHover = null;\n    }\n    this.renderer?.graphLayer?.resetStateStyles?.();\n    this.scheduler.requestRender();\n    return this;\n  }\n\n  /**\n   * Read, replace, or reset the default node and edge mapper collections.\n   *\n   * @public\n   * @apiSection Mappers\n   * @param {object} [mappers] - Mapper replacements. Omit to read active mapper collections.\n   * @param {Mapper} [mappers.nodeMapper] - Replacement default node mapper.\n   * @param {Mapper} [mappers.edgeMapper] - Replacement default edge mapper.\n   * @returns {object|Helios} Current mapper collections when omitted; otherwise this Helios instance.\n   */\n  mappers({ nodeMapper, edgeMapper } = {}) {\n    if (arguments.length === 0) {\n      return { nodeMapper: this.nodeMapper, edgeMapper: this.edgeMapper };\n    }\n    if (nodeMapper === null && edgeMapper === null) {\n      this.debug.log('mapper', 'Resetting mappers to defaults');\n      this.nodeMapper = new MapperCollection('node', this.network, () => {\n        this.markMappersDirty();\n      }, this.debug);\n      this.edgeMapper = new MapperCollection('edge', this.network, () => {\n        this.markMappersDirty();\n      }, this.debug);\n      this.mappersDirty = true;\n      this.emit(EVENTS.MAPPERS_CHANGED, {\n        node: serializeMapperCollectionState(this.nodeMapper),\n        edge: serializeMapperCollectionState(this.edgeMapper),\n      });\n      this.scheduler?.requestGeometry?.();\n      this.scheduler.requestGeometry();\n      return this;\n    }\n    if (nodeMapper) {\n      this.debug.log('mapper', 'Replacing node mapper');\n      this.nodeMapper.setDefault(nodeMapper);\n    }\n    if (edgeMapper) {\n      this.debug.log('mapper', 'Replacing edge mapper');\n      this.edgeMapper.setDefault(edgeMapper);\n    }\n    this.mappersDirty = true;\n    this.emit(EVENTS.MAPPERS_CHANGED, {\n      node: serializeMapperCollectionState(this.nodeMapper),\n      edge: serializeMapperCollectionState(this.edgeMapper),\n    });\n    this.scheduler.requestGeometry();\n    return this;\n  }\n\n  /**\n   * Read or replace the active layout instance.\n   *\n   * @public\n   * @apiSection Layout And Positions\n   * @param {Layout} [layout] - Layout instance extending the Helios layout base class.\n   * @returns {Layout|Helios} Current layout when omitted; otherwise this Helios instance.\n   */\n  layout(layout) {\n    if (arguments.length === 0) {\n      return this._layout;\n    }\n    if (!isLayoutInstance(layout)) {\n      throw new Error('Layout must extend the Layout base class');\n    }\n    const handoff = this._resolveLayoutHandoffContext();\n    const nextPolicy = this._resolveLayoutPositionPolicy(layout);\n    const shouldHandoffDelegatePositions = handoff.outgoingDelegate\n      && nextPolicy.source !== 'delegate';\n\n    if (handoff.pending && !shouldHandoffDelegatePositions) {\n      this._disposePendingLayoutHandoff();\n    } else if (handoff.pending) {\n      this._pendingLayoutHandoff = null;\n    }\n    if (handoff.staleLayout && handoff.staleLayout !== handoff.outgoingLayout) {\n      handoff.staleLayout.dispose?.();\n    }\n    if (!shouldHandoffDelegatePositions) {\n      handoff.outgoingLayout?.dispose?.();\n    }\n\n    this._layout = this._bindLayoutToHelios(layout);\n    this.debug.log('layout', 'Layout replaced', { layout: layout?.constructor?.name });\n    this._layout.setUpdateListener((payload) => this._handleLayoutUpdate(payload));\n    this.debug.log('layout', 'Initializing new layout instance');\n    this._layout.initialize?.();\n    this._layout.resize?.(this.layers.size);\n    if (!shouldHandoffDelegatePositions) {\n      this._enforcePositionSourcePolicy(this._layout, { resetInterpolation: true });\n      this._enforcePositionSourcePolicy(this._layout, { resetInterpolation: false });\n    } else {\n      this._startLayoutPositionHandoff({\n        previousLayout: handoff.outgoingLayout,\n        previousDelegate: handoff.outgoingDelegate,\n        nextLayout: this._layout,\n      });\n    }\n    this.debug.log('layout', 'Layout initialized and resized', this.layers.size);\n    this.scheduler.setLayout(this._layout);\n    this._emitLayoutChanged(this._layout);\n    this.scheduler.requestLayout('user');\n    this.scheduler.requestRender();\n    return this;\n  }\n\n  /**\n   * List node attributes that can seed layout positions.\n   *\n   * @public\n   * @apiSection Layout And Positions\n   * @param {object} [options] - Choice discovery options.\n   * @param {HeliosNetwork} [options.network] - Network to inspect. Defaults to the active network.\n   * @param {'2d'|'3d'} [options.mode] - Mode used to label random seed choices.\n   * @returns {Array<object>} Position choices with `value`, `label`, and `dimension` fields.\n   */\n  getLayoutPositionAttributeChoices(options = {}) {\n    const network = options.network ?? this.network ?? null;\n    const mode = (options.mode ?? this.options?.mode) === '3d' ? '3d' : '2d';\n    const currentChoice = {\n      value: NODE_POSITION_ATTRIBUTE,\n      label: 'Current positions',\n      dimension: 3,\n    };\n    const randomChoice = {\n      value: RANDOM_LAYOUT_POSITION_CHOICE,\n      label: mode === '3d' ? 'Random positions (3D cube)' : 'Random positions (2D square)',\n      dimension: mode === '3d' ? 3 : 2,\n    };\n    if (!network || typeof network.getNodeAttributeNames !== 'function') {\n      return [currentChoice, randomChoice];\n    }\n\n    const names = new Set(network.getNodeAttributeNames?.() ?? []);\n    names.add(NODE_POSITION_ATTRIBUTE);\n\n    const choices = [randomChoice];\n    for (const name of names) {\n      const info = network.getNodeAttributeInfo?.(name) ?? null;\n      const dimension = Number(info?.dimension ?? 0);\n      if (!Number.isFinite(dimension) || (dimension !== 2 && dimension !== 3)) continue;\n      if (info?.complex === true) continue;\n      if (!isNumericLayoutPositionAttributeType(info?.type)) continue;\n      choices.push({\n        value: name,\n        label: name === NODE_POSITION_ATTRIBUTE ? 'Current positions' : `${name} (${dimension}D)`,\n        dimension,\n      });\n    }\n\n    choices.sort((a, b) => {\n      if (a.value === NODE_POSITION_ATTRIBUTE) return -1;\n      if (b.value === NODE_POSITION_ATTRIBUTE) return 1;\n      if (a.value === RANDOM_LAYOUT_POSITION_CHOICE) return -1;\n      if (b.value === RANDOM_LAYOUT_POSITION_CHOICE) return 1;\n      return String(a.label).localeCompare(String(b.label));\n    });\n\n    return choices.length ? choices : [currentChoice, randomChoice];\n  }\n\n  /**\n   * Copy a numeric node attribute into the canonical layout-position attribute.\n   *\n   * @public\n   * @apiSection Layout And Positions\n   * @param {string} name - Source node attribute name, or the random seed choice value.\n   * @param {object} [options] - Position-copy options.\n   * @param {HeliosNetwork} [options.network] - Network to update. Defaults to the active network.\n   * @returns {boolean} `true` when positions were written.\n   */\n  setLayoutPositionsFromNodeAttribute(name, options = {}) {\n    const network = options.network ?? this.network ?? null;\n    const visuals = this.visuals ?? null;\n    const trimmed = typeof name === 'string' ? name.trim() : '';\n    if (!network || !trimmed) return false;\n\n    const seedBounds = resolveSeedBoundsForLayout(\n      this.options?.layout,\n      this.layers?.size,\n      this.options?.mode,\n    );\n    if (trimmed === RANDOM_LAYOUT_POSITION_CHOICE) {\n      visuals?.ensureNodeAttribute?.(NODE_POSITION_ATTRIBUTE, AttributeType.Float, 3);\n\n      let wrote = false;\n      const applyRandomSeed = () => {\n        const targetBuffer = network.getNodeAttributeBuffer?.(NODE_POSITION_ATTRIBUTE) ?? null;\n        const targetView = targetBuffer?.view ?? null;\n        const nodeIndices = network.nodeIndices ?? null;\n        if (!targetView || !nodeIndices?.length) return;\n\n        const center = Array.isArray(seedBounds.center) ? seedBounds.center : [0, 0, 0];\n        const cx = Number.isFinite(center[0]) ? center[0] : 0;\n        const cy = Number.isFinite(center[1]) ? center[1] : 0;\n        const cz = Number.isFinite(center[2]) ? center[2] : 0;\n        const safeMode = seedBounds.mode === '3d' ? '3d' : '2d';\n        const side = safeMode === '3d'\n          ? Math.max(\n              1,\n              Number(seedBounds.width) || 1,\n              Number(seedBounds.height) || 1,\n              Number(seedBounds.depth) || 0,\n            )\n          : Math.max(1, Math.min(\n              Number(seedBounds.width) || 1,\n              Number(seedBounds.height) || 1,\n            ));\n        const halfSide = side * 0.5;\n\n        for (let i = 0; i < nodeIndices.length; i += 1) {\n          const nodeId = nodeIndices[i];\n          const offset = nodeId * 3;\n          targetView[offset] = cx + ((Math.random() * 2 - 1) * halfSide);\n          targetView[offset + 1] = cy + ((Math.random() * 2 - 1) * halfSide);\n          targetView[offset + 2] = safeMode === '3d'\n            ? cz + ((Math.random() * 2 - 1) * halfSide)\n            : 0;\n          wrote = true;\n        }\n      };\n\n      if (typeof network.withBufferAccess === 'function') {\n        network.withBufferAccess(applyRandomSeed);\n      } else {\n        applyRandomSeed();\n      }\n\n      if (!wrote) return false;\n\n      this._resetInterpolationRuntime({ keepLastRendered: false, keepIntervalHistory: true });\n      visuals?.markPositionsDirty?.();\n      visuals?.bumpNodeAttributes?.(NODE_POSITION_ATTRIBUTE);\n      this._markAutoFitDirty(false);\n      this._layout?.seedFromNetworkPositions?.();\n      this.scheduler?.requestGeometry?.();\n      this.scheduler?.requestRender?.();\n      this._labels?.requestFullReselect?.('layout-position-random');\n      return true;\n    }\n\n    const info = network.getNodeAttributeInfo?.(trimmed) ?? null;\n    const dimension = Number(info?.dimension ?? 0);\n    if (!info) {\n      throw new Error(`Unknown node attribute \"${trimmed}\"`);\n    }\n    if (!isNumericLayoutPositionAttributeType(info.type) || info.complex === true || (dimension !== 2 && dimension !== 3)) {\n      throw new Error(`Node attribute \"${trimmed}\" must be a numeric 2D or 3D vector attribute`);\n    }\n\n    visuals?.ensureNodeAttribute?.(NODE_POSITION_ATTRIBUTE, AttributeType.Float, 3);\n\n    let wrote = false;\n    const apply = () => {\n      const sourceBuffer = network.getNodeAttributeBuffer?.(trimmed) ?? null;\n      const targetBuffer = network.getNodeAttributeBuffer?.(NODE_POSITION_ATTRIBUTE) ?? null;\n      const sourceView = sourceBuffer?.view ?? null;\n      const targetView = targetBuffer?.view ?? null;\n      if (!sourceView || !targetView) return;\n\n      const sourceCount = Math.floor(sourceView.length / dimension);\n      const targetCount = Math.floor(targetView.length / 3);\n      const count = Math.min(sourceCount, targetCount);\n      if (count <= 0) return;\n\n      for (let index = 0; index < count; index += 1) {\n        const sourceOffset = index * dimension;\n        const targetOffset = index * 3;\n        const x = Number(sourceView[sourceOffset]);\n        const y = Number(sourceView[sourceOffset + 1]);\n        const z = dimension === 3 ? Number(sourceView[sourceOffset + 2]) : 0;\n        if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) continue;\n        targetView[targetOffset] = x;\n        targetView[targetOffset + 1] = y;\n        targetView[targetOffset + 2] = z;\n        wrote = true;\n      }\n    };\n\n    if (typeof network.withBufferAccess === 'function') {\n      network.withBufferAccess(apply);\n    } else {\n      apply();\n    }\n\n    if (!wrote) return false;\n\n    this._resetInterpolationRuntime({ keepLastRendered: false, keepIntervalHistory: true });\n    visuals?.markPositionsDirty?.();\n    visuals?.bumpNodeAttributes?.(NODE_POSITION_ATTRIBUTE);\n    this._markAutoFitDirty(false);\n    this._layout?.seedFromNetworkPositions?.();\n    this.scheduler?.requestGeometry?.();\n    this.scheduler?.requestRender?.();\n    this._labels?.requestFullReselect?.('layout-position-attribute');\n    return true;\n  }\n\n  /**\n   * Read or update the active position source used for rendering and layout handoff.\n   *\n   * @public\n   * @apiSection Layout And Positions\n   * @param {object|null} [options] - Position pipeline options, or `null` to reset to network-backed positions.\n   * @param {'network'|'delegate'} [options.source] - Source for current positions.\n   * @param {PositionDelegate} [options.delegate] - Delegate used when `source` is `delegate`.\n   * @returns {object|Helios} Current position source when omitted; otherwise this Helios instance.\n   */\n  positions(options) {\n    if (arguments.length === 0) {\n      return {\n        source: this._positionsConfig?.source ?? 'network',\n        delegate: this._positionsConfig?.delegate ?? null,\n      };\n    }\n    if (options == null) {\n      options = { source: 'network', delegate: null };\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('positions(options) expects an object or null');\n    }\n    this._enforcePositionSourcePolicy(this._layout, { resetInterpolation: false });\n    this._applyPositionPipelineToRenderer();\n    this._markAutoFitDirty(false);\n    this.scheduler.requestGeometry();\n    this.scheduler.requestRender();\n    this._labels?.requestFullReselect?.('positions-config');\n    return this;\n  }\n\n  /**\n   * Snapshot all node positions from the active or supplied position delegate.\n   *\n   * @public\n   * @apiSection Layout And Positions\n   * @param {object} [options] - Delegate readback options.\n   * @param {PositionDelegate} [options.delegate] - Delegate to read. Defaults to the active delegate.\n   * @returns {Promise<Float32Array|null>} Packed `x,y,z` positions, or `null` when no delegate is available.\n   */\n  async snapshotDelegatePositions(options = {}) {\n    const delegate = options?.delegate ?? this._positionsConfig?.delegate ?? this._activePositionDelegate ?? null;\n    if (!delegate) return null;\n    const context = this._buildPositionDelegateContext(options);\n    if (typeof delegate.snapshotNodePositions === 'function') {\n      return delegate.snapshotNodePositions(context);\n    }\n    let view = null;\n    if (typeof delegate.getNodePositionView === 'function') {\n      view = delegate.getNodePositionView(context);\n    } else if (typeof delegate.getPositionView === 'function') {\n      view = delegate.getPositionView(context);\n    }\n    if (!view || !Number.isFinite(view.length) || view.length <= 0) return null;\n    return new Float32Array(view);\n  }\n\n  /**\n   * Snapshot selected node positions from the active position source.\n   *\n   * @public\n   * @apiSection Layout And Positions\n   * @param {Array<number>|TypedArray|number} nodeIds - Node indices to read.\n   * @param {object} [options] - Readback options.\n   * @param {Float32Array} [options.out] - Optional output buffer.\n   * @param {PositionDelegate} [options.delegate] - Delegate override.\n   * @returns {Promise<object>} Readback result with ids, packed positions, count, version, and source.\n   */\n  async snapshotNodePositions(nodeIds, options = {}) {\n    const ids = normalizeReadbackNodeIndexList(nodeIds);\n    const count = ids.length;\n    const source = this._positionsConfig ?? { source: 'network', delegate: null };\n    const delegate = options?.delegate ?? source.delegate ?? this._activePositionDelegate ?? null;\n    const out = options?.out instanceof Float32Array ? options.out : null;\n    if (delegate && (options?.delegate || source.source === 'delegate')) {\n      const context = this._buildPositionDelegateContext(options);\n      if (typeof delegate.snapshotNodePositionsById === 'function') {\n        const result = await delegate.snapshotNodePositionsById(context, ids, options);\n        if (result?.deferred === true) {\n          return {\n            ids: result.ids ?? Uint32Array.from(ids),\n            positions: null,\n            count: Number.isFinite(result.count) ? result.count : count,\n            version: Number.isFinite(result.version) ? result.version : delegate.version ?? 0,\n            source: result.source ?? 'delegate-deferred',\n            deferred: true,\n          };\n        }\n        if (result?.positions instanceof Float32Array) {\n          return {\n            ids: result.ids ?? Uint32Array.from(ids),\n            positions: result.positions,\n            count: Number.isFinite(result.count) ? result.count : count,\n            version: Number.isFinite(result.version) ? result.version : delegate.version ?? 0,\n            source: result.source ?? 'delegate',\n          };\n        }\n      }\n      let view = null;\n      if (typeof delegate.getNodePositionView === 'function') {\n        view = delegate.getNodePositionView(context);\n      } else if (typeof delegate.getPositionView === 'function') {\n        view = delegate.getPositionView(context);\n      }\n      if (view && Number.isFinite(view.length) && view.length > 0) {\n        return {\n          ids: Uint32Array.from(ids),\n          positions: copyReadbackPositionsFromView(view, ids, out),\n          count,\n          version: Number.isFinite(delegate.version) ? delegate.version : 0,\n          source: 'delegate-view',\n        };\n      }\n      const snapshot = await this.snapshotDelegatePositions({ ...options, delegate });\n      return {\n        ids: Uint32Array.from(ids),\n        positions: copyReadbackPositionsFromView(snapshot, ids, out),\n        count,\n        version: Number.isFinite(delegate.version) ? delegate.version : 0,\n        source: 'snapshot-fallback',\n      };\n    }\n\n    const network = this._getRenderNetwork?.() ?? this.network ?? null;\n    let positions = null;\n    const read = () => {\n      const view = network?.getNodeAttributeBuffer?.(NODE_POSITION_ATTRIBUTE)?.view ?? null;\n      positions = copyReadbackPositionsFromView(view, ids, out);\n    };\n    if (typeof network?.withBufferAccess === 'function') {\n      network.withBufferAccess(read);\n    } else {\n      read();\n    }\n    return {\n      ids: Uint32Array.from(ids),\n      positions: positions ?? resolveFloat32Out(out, count * 3),\n      count,\n      version: Number.isFinite(network?.getNodeAttributeVersion?.(NODE_POSITION_ATTRIBUTE))\n        ? network.getNodeAttributeVersion(NODE_POSITION_ATTRIBUTE)\n        : 0,\n      source: 'network',\n    };\n  }\n\n  /**\n   * Snapshot one node position from the active position source.\n   *\n   * @public\n   * @apiSection Layout And Positions\n   * @param {number} nodeId - Node index to read.\n   * @param {object} [options] - Readback options.\n   * @param {Float32Array} [options.out] - Optional output buffer with length at least three.\n   * @returns {Promise<object>} Readback result with id, position, version, and source.\n   */\n  async snapshotNodePosition(nodeId, options = {}) {\n    const id = Math.floor(Number(nodeId));\n    const safeId = Number.isFinite(id) && id >= 0 ? id : -1;\n    const out = options?.out instanceof Float32Array && options.out.length >= 3\n      ? options.out\n      : new Float32Array(3);\n    const result = safeId >= 0\n      ? await this.snapshotNodePositions([safeId], { ...options, out })\n      : null;\n    if (!result) {\n      out[0] = 0;\n      out[1] = 0;\n      out[2] = 0;\n    }\n    return {\n      id: safeId,\n      position: result?.positions ?? out,\n      version: result?.version ?? 0,\n      source: result?.source ?? 'invalid',\n    };\n  }\n\n  /**\n   * Compute the centroid of selected nodes from the active position source.\n   *\n   * @public\n   * @apiSection Layout And Positions\n   * @param {Array<number>|TypedArray|number} nodeIds - Node indices to include.\n   * @param {object} [options] - Readback options.\n   * @param {Float32Array} [options.out] - Optional output buffer with length at least three.\n   * @returns {Promise<object>} Centroid result with centroid, count, version, and source.\n   */\n  async snapshotNodeCentroid(nodeIds, options = {}) {\n    const ids = normalizeReadbackNodeIndexList(nodeIds);\n    const count = ids.length;\n    const source = this._positionsConfig ?? { source: 'network', delegate: null };\n    const delegate = options?.delegate ?? source.delegate ?? this._activePositionDelegate ?? null;\n    const out = options?.out instanceof Float32Array ? options.out : null;\n    if (delegate && (options?.delegate || source.source === 'delegate') && typeof delegate.snapshotNodeCentroidById === 'function') {\n      const context = this._buildPositionDelegateContext(options);\n      const result = await delegate.snapshotNodeCentroidById(context, ids, options);\n      if (result?.deferred === true) {\n        return {\n          centroid: null,\n          count: Number.isFinite(result.count) ? result.count : 0,\n          version: Number.isFinite(result.version) ? result.version : delegate.version ?? 0,\n          source: result.source ?? 'delegate-deferred',\n          deferred: true,\n        };\n      }\n      if (result?.centroid instanceof Float32Array) {\n        return {\n          centroid: result.centroid,\n          count: Number.isFinite(result.count) ? result.count : count,\n          version: Number.isFinite(result.version) ? result.version : delegate.version ?? 0,\n          source: result.source ?? 'delegate',\n        };\n      }\n    }\n    const positions = await this.snapshotNodePositions(ids, options);\n    const result = centroidFromPackedReadback(positions?.positions, positions?.count ?? count, out);\n    return {\n      centroid: result.centroid,\n      count: result.count,\n      version: positions?.version ?? 0,\n      source: positions?.source ?? 'network',\n    };\n  }\n\n  /**\n   * Write the active delegate position snapshot back into the network position attribute.\n   *\n   * @public\n   * @apiSection Layout And Positions\n   * @param {object} [options] - Delegate synchronization options.\n   * @param {PositionDelegate} [options.delegate] - Delegate to synchronize. Defaults to the active delegate.\n   * @returns {Promise<boolean>} `true` when network positions were updated.\n   */\n  async syncDelegatePositionsToNetwork(options = {}) {\n    const delegate = options?.delegate ?? this._positionsConfig?.delegate ?? this._activePositionDelegate ?? null;\n    if (!delegate) return false;\n    const context = this._buildPositionDelegateContext(options);\n    let wrote = false;\n    if (typeof delegate.synchronizeNodePositionsToNetwork === 'function') {\n      wrote = await delegate.synchronizeNodePositionsToNetwork(context);\n    } else {\n      const snapshot = await this.snapshotDelegatePositions({ ...options, delegate });\n      wrote = this._writeNodePositions(snapshot);\n    }\n    if (!wrote) return false;\n    this.visuals?.markPositionsDirty?.();\n    this._markAutoFitDirty(false);\n    this.scheduler?.requestGeometry?.();\n    this.scheduler?.requestRender?.();\n    return true;\n  }\n\n  /**\n   * Read or update GPU position interpolation settings.\n   *\n   * @public\n   * @apiSection Layout And Positions\n   * @param {object|string|null} [options] - Interpolation options, mode string, or `null` to disable interpolation.\n   * @param {boolean} [options.enabled] - Enable position interpolation.\n   * @param {'adaptive'|'fixed'} [options.durationMode] - Duration strategy.\n   * @param {number} [options.durationMs] - Fixed interpolation duration in milliseconds.\n   * @returns {object|Helios} Current interpolation snapshot when omitted; otherwise this Helios instance.\n   */\n  interpolation(options) {\n    if (arguments.length === 0) {\n      const config = this._interpolationConfig ?? POSITION_INTERPOLATION_DEFAULTS;\n      const durationMode = resolveInterpolationDurationMode(config);\n      return {\n        ...config,\n        durationMode,\n        adaptiveDuration: durationMode === 'adaptive',\n        fixedDurationMs: config.durationMs,\n        active: this._interpolationRuntime?.active === true,\n        factor: clamp01(this._interpolationRuntime?.factor, 1),\n        effectiveDurationMs: Number.isFinite(this._interpolationRuntime?.effectiveDurationMs)\n          ? this._interpolationRuntime.effectiveDurationMs\n          : this._resolveInterpolationDurationMs(performance.now()),\n      };\n    }\n    let updates = options;\n    if (typeof updates === 'string') {\n      updates = { mode: updates, enabled: true };\n    }\n    if (updates == null) {\n      updates = { enabled: false };\n    }\n    if (typeof updates !== 'object') {\n      throw new TypeError('interpolation(options) expects an object, string mode, or null');\n    }\n    const current = this._interpolationConfig ?? { ...POSITION_INTERPOLATION_DEFAULTS };\n    const next = { ...current };\n    if (Object.prototype.hasOwnProperty.call(updates, 'enabled')) {\n      next.enabled = updates.enabled === true;\n    }\n    const hasDurationModeUpdate = (\n      Object.prototype.hasOwnProperty.call(updates, 'durationMode')\n      || Object.prototype.hasOwnProperty.call(updates, 'durationStrategy')\n    );\n    const hasAdaptiveDurationUpdate = Object.prototype.hasOwnProperty.call(updates, 'adaptiveDuration');\n    const hasFixedDurationUpdate = Object.prototype.hasOwnProperty.call(updates, 'fixedDurationMs');\n    if (\n      Object.prototype.hasOwnProperty.call(updates, 'mode')\n      || Object.prototype.hasOwnProperty.call(updates, 'type')\n    ) {\n      next.mode = normalizeInterpolationMode(updates.mode ?? updates.type);\n    }\n    if (hasDurationModeUpdate) {\n      next.durationMode = normalizeInterpolationDurationMode(\n        updates.durationMode ?? updates.durationStrategy,\n        resolveInterpolationDurationMode(current),\n      );\n      next.adaptiveDuration = next.durationMode === 'adaptive';\n    }\n    if (hasAdaptiveDurationUpdate) {\n      next.adaptiveDuration = updates.adaptiveDuration === true;\n      next.durationMode = next.adaptiveDuration ? 'adaptive' : 'fixed';\n    }\n    if (\n      Object.prototype.hasOwnProperty.call(updates, 'durationMs')\n      || Object.prototype.hasOwnProperty.call(updates, 'duration')\n      || Object.prototype.hasOwnProperty.call(updates, 'fixedDurationMs')\n    ) {\n      next.durationMs = normalizeNonNegativeNumber(\n        updates.fixedDurationMs ?? updates.durationMs ?? updates.duration,\n        current.durationMs,\n        0,\n        60000,\n      );\n    }\n    if (hasFixedDurationUpdate && !hasDurationModeUpdate && !hasAdaptiveDurationUpdate) {\n      next.durationMode = 'fixed';\n      next.adaptiveDuration = false;\n    }\n    if (Object.prototype.hasOwnProperty.call(updates, 'adaptiveDurationSamples')) {\n      next.adaptiveDurationSamples = normalizePositiveInteger(\n        updates.adaptiveDurationSamples,\n        current.adaptiveDurationSamples,\n        1,\n        120,\n      );\n    }\n    if (Object.prototype.hasOwnProperty.call(updates, 'adaptiveDurationWindowMs')) {\n      next.adaptiveDurationWindowMs = normalizeNonNegativeNumber(\n        updates.adaptiveDurationWindowMs,\n        current.adaptiveDurationWindowMs,\n        100,\n        60000,\n      );\n    }\n    if (Object.prototype.hasOwnProperty.call(updates, 'adaptiveDurationScale')) {\n      next.adaptiveDurationScale = normalizeNonNegativeNumber(\n        updates.adaptiveDurationScale,\n        current.adaptiveDurationScale,\n        0,\n        16,\n      );\n    }\n    if (Object.prototype.hasOwnProperty.call(updates, 'adaptiveDurationMinMs')) {\n      next.adaptiveDurationMinMs = normalizeNonNegativeNumber(\n        updates.adaptiveDurationMinMs,\n        current.adaptiveDurationMinMs,\n        0,\n        60000,\n      );\n    }\n    if (Object.prototype.hasOwnProperty.call(updates, 'adaptiveDurationMaxMs')) {\n      next.adaptiveDurationMaxMs = normalizeNonNegativeNumber(\n        updates.adaptiveDurationMaxMs,\n        current.adaptiveDurationMaxMs,\n        0,\n        60000,\n      );\n    }\n    if (Object.prototype.hasOwnProperty.call(updates, 'easing')) {\n      next.easing = normalizeInterpolationEasing(updates.easing, current.easing);\n    }\n    if (Object.prototype.hasOwnProperty.call(updates, 'smoothing')) {\n      next.smoothing = normalizeNonNegativeNumber(updates.smoothing, current.smoothing);\n    }\n    if (Object.prototype.hasOwnProperty.call(updates, 'minDisplacementRatio')) {\n      next.minDisplacementRatio = normalizeNonNegativeNumber(\n        updates.minDisplacementRatio,\n        current.minDisplacementRatio,\n      );\n    }\n    next.durationMode = normalizeInterpolationDurationMode(\n      next.durationMode,\n      next.adaptiveDuration === true ? 'adaptive' : 'fixed',\n    );\n    next.adaptiveDuration = next.durationMode === 'adaptive';\n    next.mode = 'gpu';\n    const modeChanged = normalizeInterpolationMode(current.mode) !== normalizeInterpolationMode(next.mode);\n    const disabled = current.enabled === true && next.enabled !== true;\n    this._interpolationConfig = next;\n    if (modeChanged || disabled) {\n      this._resetInterpolationRuntime({ keepLastRendered: true });\n    } else if (this._interpolationRuntime) {\n      this._interpolationRuntime.effectiveDurationMs = this._resolveInterpolationDurationMs(performance.now());\n    }\n    this._applyPositionPipelineToRenderer();\n    this.scheduler.requestRender();\n    return this;\n  }\n\n  // Backwards-compatible aliases.\n  /**\n   * Alias for `layout(layout)`.\n   *\n   * @public\n   * @apiSection Layout And Positions\n   * @param {Layout} layout - Replacement layout.\n   * @returns {Layout|Helios} Result of `layout(layout)`.\n   */\n  setLayout(layout) { return this.layout(layout); }\n  /**\n   * Alias for `positions(options)`.\n   *\n   * @public\n   * @apiSection Layout And Positions\n   * @param {object|null} options - Position pipeline options.\n   * @returns {object|Helios} Result of `positions(options)`.\n   */\n  setPositions(options) { return this.positions(options); }\n  /**\n   * Alias for `interpolation(options)`.\n   *\n   * @public\n   * @apiSection Layout And Positions\n   * @param {object|string|null} options - Interpolation options.\n   * @returns {object|Helios} Result of `interpolation(options)`.\n   */\n  setInterpolation(options) { return this.interpolation(options); }\n  /**\n   * Alias for `density(options)`.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {object|false|null} options - Density options.\n   * @returns {object|Helios} Result of `density(options)`.\n   */\n  setDensity(options) { return this.density(options); }\n  /**\n   * Alias for `labels(options)`.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {object|null} options - Label options.\n   * @returns {object|Helios} Result of `labels(options)`.\n   */\n  setLabels(options) { return this.labels(options); }\n  /**\n   * Alias for `legends(options)`.\n   *\n   * @public\n   * @apiSection Density And Labels\n   * @param {object|false|null} options - Legend options.\n   * @returns {object|Helios} Result of `legends(options)`.\n   */\n  setLegends(options) { return this.legends(options); }\n  /**\n   * Alias for `mappers(mappers)`.\n   *\n   * @public\n   * @apiSection Mappers\n   * @param {object} mappers - Mapper replacements.\n   * @returns {object|Helios} Result of `mappers(mappers)`.\n   */\n  setMappers(mappers) { return this.mappers(mappers); }\n  /**\n   * Alias for `nodeState(indices, mask, options)`.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {Array<number>|TypedArray|number} indices - Node indices.\n   * @param {number|string|Array<string>} mask - State mask.\n   * @param {object} [options] - State options.\n   * @returns {Helios} This Helios instance.\n   */\n  setNodeState(indices, mask, options) { return this.nodeState(indices, mask, options); }\n  /**\n   * Alias for `edgeState(indices, mask, options)`.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {Array<number>|TypedArray|number} indices - Edge indices.\n   * @param {number|string|Array<string>} mask - State mask.\n   * @param {object} [options] - State options.\n   * @returns {Helios} This Helios instance.\n   */\n  setEdgeState(indices, mask, options) { return this.edgeState(indices, mask, options); }\n  /**\n   * Alias for `nodeStateStyle(slot, style)`.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {number|string} slot - State slot.\n   * @param {object} style - Node style.\n   * @returns {object|null|Helios} Result of `nodeStateStyle(slot, style)`.\n   */\n  setNodeStateStyle(slot, style) { return this.nodeStateStyle(slot, style); }\n  /**\n   * Alias for `edgeStateStyle(slot, style)`.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {number|string} slot - State slot.\n   * @param {object} style - Edge style.\n   * @returns {object|null|Helios} Result of `edgeStateStyle(slot, style)`.\n   */\n  setEdgeStateStyle(slot, style) { return this.edgeStateStyle(slot, style); }\n  /**\n   * Alias for `nodeNoStateStyle(style)`.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {object} style - Node style.\n   * @returns {object|null|Helios} Result of `nodeNoStateStyle(style)`.\n   */\n  setNodeNoStateStyle(style) { return this.nodeNoStateStyle(style); }\n  /**\n   * Alias for `edgeNoStateStyle(style)`.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {object} style - Edge style.\n   * @returns {object|null|Helios} Result of `edgeNoStateStyle(style)`.\n   */\n  setEdgeNoStateStyle(style) { return this.edgeNoStateStyle(style); }\n  /**\n   * Alias for `nodeHoverStyle(style)`.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {object} style - Node hover style.\n   * @returns {object|null|Helios} Result of `nodeHoverStyle(style)`.\n   */\n  setNodeHoverStyle(style) { return this.nodeHoverStyle(style); }\n  /**\n   * Alias for `edgeHoverStyle(style)`.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {object} style - Edge hover style.\n   * @returns {object|null|Helios} Result of `edgeHoverStyle(style)`.\n   */\n  setEdgeHoverStyle(style) { return this.edgeHoverStyle(style); }\n  /**\n   * Alias for `hoverStyleFromHighlight(value)`.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {boolean} value - Enable hover style from highlight.\n   * @returns {boolean|Helios} Result of `hoverStyleFromHighlight(value)`.\n   */\n  setHoverStyleFromHighlight(value) { return this.hoverStyleFromHighlight(value); }\n  /**\n   * Alias for `highlightConnectedEdges(value)`.\n   *\n   * @public\n   * @apiSection Interaction\n   * @param {boolean} value - Enable connected-edge highlighting.\n   * @returns {boolean|Helios} Result of `highlightConnectedEdges(value)`.\n   */\n  setHighlightConnectedEdges(value) { return this.highlightConnectedEdges(value); }\n\n  /**\n   * Enable layout execution and optionally request a layout algorithm or parameters.\n   *\n   * @public\n   * @apiSection Layout And Positions\n   * @param {string|object|null} [algo=null] - Optional layout type or parameter object.\n   * @param {object|null} [params=null] - Optional parameters when `algo` is a string.\n   * @returns {Helios} This Helios instance.\n   */\n  startLayout(algo = null, params = null) {\n    const requestedAlgo = typeof algo === 'string' ? algo : null;\n    const requestedParams = params ?? (requestedAlgo ? null : algo);\n    this.scheduler.setLayoutEnabled(true, 'user');\n    this._requestLayoutReheat('user');\n    this.scheduler.requestLayout('user');\n    if (requestedAlgo || requestedParams) {\n      this.debug.log('layout', 'startLayout called', { algo: requestedAlgo, params: requestedParams });\n    }\n    return this;\n  }\n\n  /**\n   * Disable layout execution.\n   *\n   * @public\n   * @apiSection Layout And Positions\n   * @param {string} [reason='user'] - Reason recorded for the scheduler state change.\n   * @returns {Helios} This Helios instance.\n   */\n  stopLayout(reason = 'user') {\n    this.scheduler.setLayoutEnabled(false, reason);\n    return this;\n  }\n\n  /**\n   * Schedule a render frame.\n   *\n   * @public\n   * @apiSection Rendering And Picking\n   * @returns {Helios} This Helios instance.\n   */\n  requestRender() {\n    this.scheduler.requestRender();\n    return this;\n  }\n\n  /**\n   * Render one frame immediately when manual rendering is enabled.\n   *\n   * @public\n   * @apiSection Rendering And Picking\n   * @returns {void}\n   */\n  performRendering() {\n    if (!this.manualRendering) {\n      console.warn('performRendering() should only be called when manualRendering option is enabled');\n      return;\n    }\n    if (!this.firstGeometryUpdateComplete) {\n      console.warn('performRendering() called before initialization is complete');\n      return;\n    }\n    // Update geometry if needed\n    // if (this.mappersDirty) {\n    //   this.visuals.applyMappers({\n    //     nodeMapper: this.nodeMapper.toCombinedMapper(),\n    //     edgeMapper: this.edgeMapper.toCombinedMapper(),\n    //   });\n    //   this.mappersDirty = false;\n    // }\n    const timestamp = performance.now();\n    if (this._shouldSuppressStartupRender(timestamp)) {\n      this._refreshLargeNetworkStartupFit();\n      return;\n    }\n    this._refreshLargeNetworkStartupFit({ force: true });\n    this._runInterpolationRenderPump(timestamp);\n    this._finishStartupFirstVisibleFrame();\n    const renderNetwork = this._getRenderNetwork();\n    // Create frame and render\n    const frame = {\n      network: renderNetwork,\n      timestamp,\n      camera: this.renderer?.camera,\n    };\n    this.attributeTracker?.render(frame, true);\n    if (this.renderer && typeof this.renderer.render === 'function') {\n      this.counters.renderFrames = bumpCounter(this.counters.renderFrames);\n      this.renderer.render(frame, this.size);\n    }\n  }\n\n  /**\n   * Enable offscreen attribute tracking for picking.\n   *\n   * @public\n   * @apiSection Rendering And Picking\n   * @param {string} [nodeAttribute='$index'] - Node attribute to encode into the tracking target.\n   * @param {string|null} [edgeAttribute=null] - Edge attribute to encode into the tracking target.\n   * @param {object} [options] - Tracking resolution and auto-update options.\n   * @returns {AttributeTracker|null} Attribute tracker instance, or `null` before renderer initialization.\n   */\n  enableAttributeTracking(nodeAttribute = '$index', edgeAttribute = null, options = {}) {\n    if (!this.attributeTracker && this.renderer) {\n      this.attributeTracker = new AttributeTracker(this.renderer);\n    }\n    this.attributeTracker?.enable(nodeAttribute, edgeAttribute, options);\n    const updateOptions = {\n      autoUpdate: options.autoUpdate ?? this.attributeUpdateOptions.autoUpdate,\n      maxFps: options.autoUpdateMaxFps ?? this.attributeUpdateOptions.maxFps,\n      frameSkip: options.autoUpdateFrameSkip ?? this.attributeUpdateOptions.frameSkip,\n    };\n    this.attributeUpdateOptions = updateOptions;\n    this.scheduler.configureAttributeUpdates(updateOptions);\n    return this.attributeTracker;\n  }\n\n  /**\n   * Disable attribute tracking for a scope or for all scopes.\n   *\n   * @public\n   * @apiSection Rendering And Picking\n   * @param {'node'|'edge'|string} [scope] - Scope to disable. Omit to disable all configured tracking.\n   * @returns {void}\n   */\n  disableAttributeTracking(scope) {\n    this.attributeTracker?.disable(scope);\n  }\n\n  /**\n   * Render the attribute-tracking target for the current frame.\n   *\n   * @public\n   * @apiSection Rendering And Picking\n   * @returns {Promise<object|null>} Tracking render result, or `null` when tracking is disabled.\n   */\n  async renderAttributeTracking() {\n    if (!this.attributeTracker) return null;\n    const renderNetwork = this._getRenderNetwork();\n    const frame = {\n      network: renderNetwork,\n      timestamp: performance.now(),\n      camera: this.renderer?.camera,\n    };\n    return this.attributeTracker.render(frame, true);\n  }\n\n  /**\n   * Pick encoded node and edge attributes at viewport coordinates.\n   *\n   * @public\n   * @apiSection Rendering And Picking\n   * @param {number} clientX - Viewport x coordinate.\n   * @param {number} clientY - Viewport y coordinate.\n   * @returns {Promise<{node:number, edge:number}>} Picked node and edge ids, or `-1` for misses.\n   */\n  async pickAttributesAt(clientX, clientY) {\n    if (!this.attributeTracker) return { node: -1, edge: -1 };\n    await this.renderAttributeTracking();\n    return this.attributeTracker.pick(clientX, clientY);\n  }\n\n  /**\n   * Returns a Map of framebuffer/attachment references to monotonically\n   * increasing \"version\" counters (wrapping at Number.MAX_SAFE_INTEGER).\n   *\n   * Keys are live object references (e.g. RenderTarget instances, WebGLFramebuffer,\n   * GPUTexture) so they can be used for identity comparisons.\n   */\n  getFramebufferVersionsByRefMap() {\n    const versions = new Map();\n\n    const addAttributeTrackerTargets = (tracker) => {\n      if (!tracker?.lastTargets) return;\n      const targets = tracker.lastTargets;\n      const counters = tracker.counters ?? {};\n      if (targets.node) versions.set(targets.node, counters.node ?? 0);\n      if (targets.edge) versions.set(targets.edge, counters.edge ?? 0);\n      if (targets.depthTargets?.node) versions.set(targets.depthTargets.node, counters.nodeDepth ?? 0);\n      if (targets.depthTargets?.edge) versions.set(targets.depthTargets.edge, counters.edgeDepth ?? 0);\n    };\n\n    addAttributeTrackerTargets(this.attributeTracker);\n    addAttributeTrackerTargets(this.indexPickingTracker);\n\n    if (this.renderer?.renderTarget) {\n      versions.set(this.renderer.renderTarget, this.counters?.renderFrames ?? 0);\n    }\n\n    const graphLayer = this.renderer?.graphLayer;\n    if (graphLayer?.weightedFramebuffer) {\n      versions.set(graphLayer.weightedFramebuffer, graphLayer.counters?.weightedFramebufferRenders ?? 0);\n    }\n    if (graphLayer?.weightedTextures?.color) {\n      versions.set(graphLayer.weightedTextures.color, graphLayer.counters?.weightedAttachmentRenders ?? 0);\n    }\n    if (graphLayer?.weightedTextures?.weight) {\n      versions.set(graphLayer.weightedTextures.weight, graphLayer.counters?.weightedAttachmentRenders ?? 0);\n    }\n\n    return versions;\n  }\n\n  /**\n   * Returns framebuffer/attachment information keyed by a meaningful name.\n   * Values include the version counter and a minimal shape description.\n   *\n   * Key format conventions:\n   * - `attributes.<attributeName>.<scope>.<tracking|picking>[.<depth>]`\n   * - `render.<variation>`\n   */\n  getFramebufferInformation() {\n    const info = {};\n\n    const set = (key, value) => {\n      if (!key) return;\n      info[key] = value;\n    };\n\n    const describeRenderTarget = (target, extra = {}) => {\n      if (!target) return { version: 0, ...extra };\n      const base = {\n        type: target.type ?? null,\n        width: target.width ?? null,\n        height: target.height ?? null,\n      };\n      return { ...base, ...extra };\n    };\n\n    const addTracker = (tracker, variant) => {\n      if (!tracker?.lastTargets) return;\n      const targets = tracker.lastTargets;\n      const counters = tracker.counters ?? {};\n      const nodeAttr = tracker.nodeAttribute ?? null;\n      const edgeAttr = tracker.edgeAttribute ?? null;\n      if (nodeAttr && targets.node) {\n        set(\n          `attributes.${nodeAttr}.node.${variant}`,\n          { ...describeRenderTarget(targets.node), version: counters.node ?? 0 },\n        );\n      }\n      if (edgeAttr && targets.edge) {\n        set(\n          `attributes.${edgeAttr}.edge.${variant}`,\n          { ...describeRenderTarget(targets.edge), version: counters.edge ?? 0 },\n        );\n      }\n      if (tracker.options?.trackDepth === true) {\n        if (nodeAttr && targets.depthTargets?.node) {\n          set(\n            `attributes.${nodeAttr}.node.${variant}.depth`,\n            { ...describeRenderTarget(targets.depthTargets.node), version: counters.nodeDepth ?? 0 },\n          );\n        }\n        if (edgeAttr && targets.depthTargets?.edge) {\n          set(\n            `attributes.${edgeAttr}.edge.${variant}.depth`,\n            { ...describeRenderTarget(targets.depthTargets.edge), version: counters.edgeDepth ?? 0 },\n          );\n        }\n      }\n    };\n\n    addTracker(this.attributeTracker, 'tracking');\n    addTracker(this.indexPickingTracker, 'picking');\n\n    const device = this.renderer?.device ?? null;\n    const renderTarget = this.renderer?.renderTarget ?? null;\n    if (device?.type === 'webgl2') {\n      set(\n        renderTarget ? 'render.webgl.target' : 'render.webgl.default',\n        { ...describeRenderTarget(renderTarget, { type: 'webgl2' }), version: device.counters?.beginFrame ?? 0 },\n      );\n      set('render.webgl.present', { type: 'webgl2', version: device.counters?.presentFramebuffer ?? 0 });\n    } else if (device?.type === 'webgpu') {\n      set(\n        renderTarget ? 'render.webgpu.target' : 'render.webgpu.swapchain',\n        { ...describeRenderTarget(renderTarget, { type: 'webgpu' }), version: device.counters?.beginFrame ?? 0 },\n      );\n      set(\n        'render.webgpu.depth',\n        {\n          type: 'webgpu',\n          width: renderTarget?.width ?? this.size?.width ?? null,\n          height: renderTarget?.height ?? this.size?.height ?? null,\n          version: device.counters?.beginFrame ?? 0,\n        },\n      );\n      set('render.webgpu.present', { type: 'webgpu', version: device.counters?.presentFramebuffer ?? 0 });\n    } else if (this.renderer) {\n      set('render.main', { type: 'unknown', version: this.counters?.renderFrames ?? 0 });\n    }\n\n    const graphLayer = this.renderer?.graphLayer;\n    if (graphLayer?.weightedFramebuffer) {\n      set(\n        'render.weighted.webgl.framebuffer',\n        {\n          type: 'webgl2',\n          width: graphLayer.weightedSize?.width ?? null,\n          height: graphLayer.weightedSize?.height ?? null,\n          version: graphLayer.counters?.weightedFramebufferRenders ?? 0,\n        },\n      );\n    }\n    if (graphLayer?.weightedTextures?.color) {\n      set(\n        'render.weighted.webgpu.color',\n        {\n          type: 'webgpu',\n          width: graphLayer.weightedTextures?.width ?? null,\n          height: graphLayer.weightedTextures?.height ?? null,\n          format: graphLayer.weightedTextures?.color?.format ?? null,\n          version: graphLayer.counters?.weightedAttachmentRenders ?? 0,\n        },\n      );\n    }\n    if (graphLayer?.weightedTextures?.weight) {\n      set(\n        'render.weighted.webgpu.weight',\n        {\n          type: 'webgpu',\n          width: graphLayer.weightedTextures?.width ?? null,\n          height: graphLayer.weightedTextures?.height ?? null,\n          format: graphLayer.weightedTextures?.weight?.format ?? null,\n          version: graphLayer.counters?.weightedAttachmentRenders ?? 0,\n        },\n      );\n    }\n\n    return info;\n  }\n\n  /**\n   * Returns an object keyed by a meaningful framebuffer name, where each value\n   * is the version counter.\n   *\n   * Key format conventions:\n   * - `attributes.<attributeName>.<scope>.<tracking|picking>[.<depth>]`\n   * - `render.<variation>`\n   */\n  getFramebufferVersions() {\n    const summary = {};\n\n    const addEntry = (key, version) => {\n      if (!key) return;\n      summary[key] = version ?? 0;\n    };\n\n    const addTracker = (tracker, variant) => {\n      if (!tracker?.lastTargets) return;\n      const targets = tracker.lastTargets;\n      const counters = tracker.counters ?? {};\n      const nodeAttr = tracker.nodeAttribute ?? null;\n      const edgeAttr = tracker.edgeAttribute ?? null;\n      if (nodeAttr && targets.node) {\n        addEntry(`attributes.${nodeAttr}.node.${variant}`, counters.node ?? 0);\n      }\n      if (edgeAttr && targets.edge) {\n        addEntry(`attributes.${edgeAttr}.edge.${variant}`, counters.edge ?? 0);\n      }\n      if (tracker.options?.trackDepth === true) {\n        if (nodeAttr && targets.depthTargets?.node) {\n          addEntry(`attributes.${nodeAttr}.node.${variant}.depth`, counters.nodeDepth ?? 0);\n        }\n        if (edgeAttr && targets.depthTargets?.edge) {\n          addEntry(`attributes.${edgeAttr}.edge.${variant}.depth`, counters.edgeDepth ?? 0);\n        }\n      }\n    };\n\n    addTracker(this.attributeTracker, 'tracking');\n    addTracker(this.indexPickingTracker, 'picking');\n\n    const device = this.renderer?.device ?? null;\n    const renderTarget = this.renderer?.renderTarget ?? null;\n    if (device?.type === 'webgl2') {\n      addEntry(renderTarget ? 'render.webgl.target' : 'render.webgl.default', device.counters?.beginFrame ?? 0);\n      addEntry('render.webgl.present', device.counters?.presentFramebuffer ?? 0);\n    } else if (device?.type === 'webgpu') {\n      addEntry(renderTarget ? 'render.webgpu.target' : 'render.webgpu.swapchain', device.counters?.beginFrame ?? 0);\n      addEntry('render.webgpu.depth', device.counters?.beginFrame ?? 0);\n      addEntry('render.webgpu.present', device.counters?.presentFramebuffer ?? 0);\n    } else if (this.renderer) {\n      addEntry('render.main', this.counters?.renderFrames ?? 0);\n    }\n\n    const graphLayer = this.renderer?.graphLayer;\n    if (graphLayer?.weightedFramebuffer) {\n      addEntry('render.weighted.webgl.framebuffer', graphLayer.counters?.weightedFramebufferRenders ?? 0);\n    }\n    if (graphLayer?.weightedTextures?.color) {\n      addEntry('render.weighted.webgpu.color', graphLayer.counters?.weightedAttachmentRenders ?? 0);\n    }\n    if (graphLayer?.weightedTextures?.weight) {\n      addEntry('render.weighted.webgpu.weight', graphLayer.counters?.weightedAttachmentRenders ?? 0);\n    }\n\n    return summary;\n  }\n\n  // Backwards-compatible alias: use getFramebufferInformation() for string-keyed details.\n  /**\n   * Return framebuffer resource versions keyed by reference for renderer diagnostics.\n   *\n   * @public\n   * @apiSection Rendering And Picking\n   * @returns {object} Plain object mapping framebuffer references to version numbers.\n   */\n  getFramebufferVersionsByRef() {\n    return this.getFramebufferInformation();\n  }\n\n  /**\n   * Enable pointer picking for nodes.\n   *\n   * @public\n   * @apiSection Rendering And Picking\n   * @param {object} [options] - Picking behavior options.\n   * @returns {Helios} This Helios instance.\n   */\n  enableNodePicking(options = {}) {\n    this._picking.node.enabled = true;\n    this._picking.node.hoverEnabled = options.hoverEnabled !== false && options.trackHover !== false;\n    this._mergePickingOptions(options);\n    this._applyPickingConfig();\n    return this;\n  }\n\n  /**\n   * Enable pointer picking for edges.\n   *\n   * @public\n   * @apiSection Rendering And Picking\n   * @param {object} [options] - Picking behavior options.\n   * @returns {Helios} This Helios instance.\n   */\n  enableEdgePicking(options = {}) {\n    this._picking.edge.enabled = true;\n    this._picking.edge.hoverEnabled = options.hoverEnabled !== false && options.trackHover !== false;\n    this._mergePickingOptions(options);\n    this._applyPickingConfig();\n    return this;\n  }\n\n  /**\n   * Disable node pointer picking.\n   *\n   * @public\n   * @apiSection Rendering And Picking\n   * @returns {Helios} This Helios instance.\n   */\n  disableNodePicking() {\n    this._picking.node.enabled = false;\n    this._applyPickingConfig();\n    return this;\n  }\n\n  /**\n   * Disable edge pointer picking.\n   *\n   * @public\n   * @apiSection Rendering And Picking\n   * @returns {Helios} This Helios instance.\n   */\n  disableEdgePicking() {\n    this._picking.edge.enabled = false;\n    this._applyPickingConfig();\n    return this;\n  }\n\n  _mergePickingOptions(options = {}) {\n    if (!options) return;\n    if (options.resolutionScale != null) {\n      const scale = Number(options.resolutionScale);\n      if (Number.isFinite(scale) && scale > 0) {\n        this._picking.options.resolutionScale = scale;\n      }\n    }\n    if (options.trackDepth != null) {\n      this._picking.options.trackDepth = options.trackDepth === true;\n    }\n    if (options.maxFps != null) {\n      const maxFps = Number(options.maxFps);\n      if (Number.isFinite(maxFps) && maxFps > 0) {\n        this._picking.options.maxFps = Math.floor(maxFps);\n      }\n    }\n    if (options.clickRequiresStationary != null) {\n      this._picking.options.clickRequiresStationary = options.clickRequiresStationary !== false;\n    }\n    if (options.clickMoveTolerancePx != null) {\n      const tolerance = Number(options.clickMoveTolerancePx);\n      if (Number.isFinite(tolerance) && tolerance >= 0) {\n        this._picking.options.clickMoveTolerancePx = tolerance;\n      }\n    }\n    if (options.suppressClickAfterWheelMs != null) {\n      const ms = Number(options.suppressClickAfterWheelMs);\n      if (Number.isFinite(ms) && ms >= 0) {\n        this._picking.options.suppressClickAfterWheelMs = ms;\n      }\n    }\n  }\n\n  _applyPickingConfig() {\n    const nodeEnabled = this._picking.node.enabled;\n    const edgeEnabled = this._picking.edge.enabled;\n    if (!nodeEnabled && !edgeEnabled) {\n      this._detachPickingListeners();\n      this._resetHover('disabled');\n      this.indexPickingTracker?.destroy?.();\n      this.indexPickingTracker = null;\n      this._reconcileAttributeUpdateConfig();\n      return;\n    }\n    if (!this.renderer) {\n      this.ready?.then?.(() => this._applyPickingConfig());\n      return;\n    }\n    if (!this.indexPickingTracker) {\n      this.indexPickingTracker = new AttributeTracker(this.renderer);\n    }\n    this.indexPickingTracker.enable(nodeEnabled ? '$index' : null, edgeEnabled ? '$index' : null, {\n      resolutionScale: this._picking.options.resolutionScale,\n      trackDepth: this._picking.options.trackDepth,\n      autoRender: true,\n    });\n    this.indexPickingTracker.resize(this.size);\n    this._attachPickingListeners();\n    this._syncHoverTrackingState('config');\n    this._reconcileAttributeUpdateConfig();\n    this.scheduler.requestRender();\n  }\n\n  _reconcileAttributeUpdateConfig() {\n    const manual = this.attributeUpdateOptions ?? { autoUpdate: false, maxFps: null, frameSkip: null };\n    const pickingEnabled = this._hasHoverPickingEnabled();\n    const picking = pickingEnabled\n      ? { autoUpdate: true, maxFps: this._picking.options.maxFps ?? 30, frameSkip: 0 }\n      : { autoUpdate: false, maxFps: null, frameSkip: null };\n    const autoUpdate = manual.autoUpdate === true || picking.autoUpdate === true;\n    if (!autoUpdate) {\n      this.scheduler.configureAttributeUpdates({ autoUpdate: false });\n      return;\n    }\n    const enabledMaxFps = [];\n    if (manual.autoUpdate === true) enabledMaxFps.push(manual.maxFps);\n    if (picking.autoUpdate === true) enabledMaxFps.push(picking.maxFps);\n    const effectiveFps = enabledMaxFps.map((value) => (Number.isFinite(value) && value > 0 ? value : 60));\n    const combinedMaxFps = Math.max(...effectiveFps);\n    const frameSkip = 0;\n    this.scheduler.configureAttributeUpdates({ autoUpdate: true, maxFps: combinedMaxFps, frameSkip });\n  }\n\n  _getInteractionCanvas() {\n    return this.layers?.canvas ?? this.renderer?.canvas ?? null;\n  }\n\n  _hasHoverPickingEnabled() {\n    return (\n      (this._picking.node.enabled === true && this._picking.node.hoverEnabled !== false)\n      || (this._picking.edge.enabled === true && this._picking.edge.hoverEnabled !== false)\n    );\n  }\n\n  _resolveHoverHit(picked) {\n    if (!picked) return null;\n    const nodeEnabled = this._picking.node.enabled === true && this._picking.node.hoverEnabled !== false;\n    const edgeEnabled = this._picking.edge.enabled === true && this._picking.edge.hoverEnabled !== false;\n    const nodeHit = nodeEnabled ? picked.node : -1;\n    const edgeHit = edgeEnabled ? picked.edge : -1;\n    const nodeDepth = picked.nodeDepth;\n    const edgeDepth = picked.edgeDepth;\n    if (nodeHit < 0 && edgeHit < 0) return { kind: null, index: -1, depth: null };\n    const trackDepth = this._picking.options.trackDepth === true;\n    if (trackDepth && nodeHit >= 0 && edgeHit >= 0 && Number.isFinite(nodeDepth) && Number.isFinite(edgeDepth)) {\n      return nodeDepth <= edgeDepth\n        ? { kind: 'node', index: nodeHit, depth: nodeDepth }\n        : { kind: 'edge', index: edgeHit, depth: edgeDepth };\n    }\n    if (nodeHit >= 0) return { kind: 'node', index: nodeHit, depth: Number.isFinite(nodeDepth) ? nodeDepth : null };\n    return { kind: 'edge', index: edgeHit, depth: Number.isFinite(edgeDepth) ? edgeDepth : null };\n  }\n\n  _syncHoverTrackingState(reason = 'config') {\n    if (!this._hasHoverPickingEnabled()) {\n      if (this._picking.hoverThrottleTimer) {\n        clearTimeout(this._picking.hoverThrottleTimer);\n        this._picking.hoverThrottleTimer = null;\n      }\n      if (this._picking.cameraIdleTimer) {\n        clearTimeout(this._picking.cameraIdleTimer);\n        this._picking.cameraIdleTimer = null;\n      }\n      this._picking._rerun = false;\n      this._resetHover(reason);\n      return;\n    }\n    const prev = this._picking.hover;\n    if (prev.kind === 'node' && this._picking.node.hoverEnabled === false) {\n      this._resetHover(reason);\n      return;\n    }\n    if (prev.kind === 'edge' && this._picking.edge.hoverEnabled === false) {\n      this._resetHover(reason);\n    }\n  }\n\n  _attachPickingListeners() {\n    const canvas = this._getInteractionCanvas();\n    if (!canvas || this._pickingListenersAttached) return;\n    canvas.addEventListener('pointerdown', this._boundPickingHandlers.down, { passive: true });\n    canvas.addEventListener('pointermove', this._boundPickingHandlers.move, { passive: true });\n    canvas.addEventListener('pointerup', this._boundPickingHandlers.up, { passive: true });\n    canvas.addEventListener('pointercancel', this._boundPickingHandlers.cancel, { passive: true });\n    canvas.addEventListener('pointerleave', this._boundPickingHandlers.leave, { passive: true });\n    canvas.addEventListener('wheel', this._boundPickingHandlers.wheel, { passive: true });\n    canvas.addEventListener('click', this._boundPickingHandlers.click);\n    canvas.addEventListener('dblclick', this._boundPickingHandlers.dblclick);\n    this._pickingListenersAttached = true;\n  }\n\n  _detachPickingListeners() {\n    const canvas = this._getInteractionCanvas();\n    if (!canvas || !this._pickingListenersAttached) return;\n    canvas.removeEventListener('pointerdown', this._boundPickingHandlers.down);\n    canvas.removeEventListener('pointermove', this._boundPickingHandlers.move);\n    canvas.removeEventListener('pointerup', this._boundPickingHandlers.up);\n    canvas.removeEventListener('pointercancel', this._boundPickingHandlers.cancel);\n    canvas.removeEventListener('pointerleave', this._boundPickingHandlers.leave);\n    canvas.removeEventListener('wheel', this._boundPickingHandlers.wheel);\n    canvas.removeEventListener('click', this._boundPickingHandlers.click);\n    canvas.removeEventListener('dblclick', this._boundPickingHandlers.dblclick);\n    this._pickingListenersAttached = false;\n  }\n\n  _handlePointerDown(event) {\n    const g = this._picking.gesture;\n    if (g.pointers.size === 0) {\n      g.moved = false;\n      g.cameraMoved = false;\n    }\n    g.active = true;\n    g.pointers.set(event.pointerId, {\n      pointerId: event.pointerId,\n      pointerType: event.pointerType ?? 'mouse',\n      startClientX: event.clientX ?? 0,\n      startClientY: event.clientY ?? 0,\n      clientX: event.clientX ?? 0,\n      clientY: event.clientY ?? 0,\n    });\n    // Keep wheelZoomed/lastWheelAt so we can suppress click after a zoom gesture.\n  }\n\n  async _handlePointerUp(event) {\n    const g = this._picking.gesture;\n    const pointer = g.pointers.get(event?.pointerId);\n    if (pointer && pointer.pointerType === 'touch') {\n      g.lastTouchAt = performance.now();\n    }\n    if (event?.type !== 'pointercancel' && pointer && pointer.pointerType === 'touch' && !g.moved && !g.cameraMoved) {\n      await this._handleTouchTap(event, pointer);\n    }\n    g.pointers.delete(event?.pointerId);\n    g.active = g.pointers.size > 0;\n  }\n\n  _handlePointerMove(event) {\n    const canvas = this._getInteractionCanvas();\n    if (!canvas) return;\n    const g = this._picking.gesture;\n    const pointer = g.pointers.get(event.pointerId);\n    if (pointer) {\n      const startPoints = Array.from(g.pointers.values(), (entry) => ({\n        pointerId: entry.pointerId,\n        clientX: entry.startClientX,\n        clientY: entry.startClientY,\n      }));\n      pointer.clientX = event.clientX ?? 0;\n      pointer.clientY = event.clientY ?? 0;\n      const classification = classifyGestureForSuppression(\n        startPoints,\n        g.pointers.values(),\n        this._picking.options.clickMoveTolerancePx ?? 4,\n      );\n      if (classification.moved) {\n        g.moved = true;\n        g.cameraMoved = true;\n      }\n    }\n    const rect = canvas.getBoundingClientRect();\n    const x = event.clientX - rect.left;\n    const y = event.clientY - rect.top;\n    this._picking.pointer = {\n      x,\n      y,\n      clientX: event.clientX,\n      clientY: event.clientY,\n      inside: x >= 0 && y >= 0 && x <= rect.width && y <= rect.height,\n    };\n    const touchActive = Array.from(g.pointers.values()).some((entry) => entry.pointerType === 'touch');\n    // Suppress hover while dragging or during touch gestures.\n    if ((event.buttons && event.buttons !== 0) || touchActive) {\n      this._picking.suppressHover = true;\n      this._resetHover('camera');\n      return;\n    }\n    this._picking.suppressHover = false;\n    this._scheduleHoverPick();\n  }\n\n  _handlePointerLeave() {\n    this._picking.pointer.inside = false;\n    this._picking.suppressHover = false;\n    if (this._picking.hoverThrottleTimer) {\n      clearTimeout(this._picking.hoverThrottleTimer);\n      this._picking.hoverThrottleTimer = null;\n    }\n    this._picking.gesture.active = false;\n    this._picking.gesture.pointers.clear();\n    this._resetHover('leave');\n  }\n\n  _handleWheel(_) {\n    // Zoom can trigger camera changes; avoid hover spam while the camera is moving.\n    this._picking.suppressHover = true;\n    this._picking.gesture.wheelZoomed = true;\n    this._picking.gesture.lastWheelAt = performance.now();\n    this._resetHover('camera');\n    this._scheduleCameraIdleHoverPick();\n  }\n\n  async _handleTouchTap(event, pointer) {\n    const g = this._picking.gesture;\n    const now = performance.now();\n    g.suppressNativeClickUntil = now + 700;\n    const dx = (event.clientX ?? 0) - (g.lastTapClientX ?? 0);\n    const dy = (event.clientY ?? 0) - (g.lastTapClientY ?? 0);\n    const isDouble = Number.isFinite(g.lastTapAt) && now - g.lastTapAt <= 320 && Math.hypot(dx, dy) <= 24;\n    g.lastTapAt = now;\n    g.lastTapClientX = event.clientX ?? pointer?.clientX ?? 0;\n    g.lastTapClientY = event.clientY ?? pointer?.clientY ?? 0;\n    await this._handlePointerClick({\n      ...event,\n      button: 0,\n      altKey: event.altKey === true,\n      ctrlKey: event.ctrlKey === true,\n      metaKey: event.metaKey === true,\n      shiftKey: event.shiftKey === true,\n      clientX: event.clientX ?? pointer?.clientX ?? 0,\n      clientY: event.clientY ?? pointer?.clientY ?? 0,\n      pointerType: 'touch',\n    }, isDouble, { synthetic: true });\n  }\n\n  async _handlePointerClick(event, isDouble, options = {}) {\n    if (!this.indexPickingTracker) return;\n    const synthetic = options.synthetic === true;\n    const clickRequiresStationary = this._picking.options.clickRequiresStationary !== false;\n    const g = this._picking.gesture;\n    const now = performance.now();\n    if (!synthetic && Number.isFinite(g.suppressNativeClickUntil) && now <= g.suppressNativeClickUntil) {\n      return;\n    }\n    if (clickRequiresStationary && !isDouble) {\n      const suppressWheelMs = this._picking.options.suppressClickAfterWheelMs ?? 200;\n      const wheelRecently = Number.isFinite(g.lastWheelAt) && now - g.lastWheelAt <= suppressWheelMs;\n      if (g.cameraMoved || g.moved || wheelRecently) {\n        return;\n      }\n    }\n    const canvas = this._getInteractionCanvas();\n    if (!canvas) return;\n    const rect = canvas.getBoundingClientRect();\n    const x = event.clientX - rect.left;\n    const y = event.clientY - rect.top;\n    await this._ensureIndexPickingTargets();\n    const picked = await this.indexPickingTracker.pick(x, y);\n    const hit = this._resolvePrimaryHit(picked);\n    const resolved = hit ?? { kind: null, index: -1, depth: null };\n    const baseDetail = {\n      kind: resolved.kind,\n      index: resolved.index,\n      node: resolved.kind === 'node' ? resolved.index : -1,\n      edge: resolved.kind === 'edge' ? resolved.index : -1,\n      depth: resolved.depth ?? null,\n      x,\n      y,\n      clientX: event.clientX,\n      clientY: event.clientY,\n      modifiers: {\n        altKey: event.altKey,\n        ctrlKey: event.ctrlKey,\n        metaKey: event.metaKey,\n        shiftKey: event.shiftKey,\n      },\n      button: event.button,\n    };\n\n    this.emit(isDouble ? EVENTS.GRAPH_DBLCLICK : EVENTS.GRAPH_CLICK, baseDetail);\n\n    if (resolved.kind === 'node' && resolved.index >= 0) {\n      this.emit(isDouble ? EVENTS.NODE_DBLCLICK : EVENTS.NODE_CLICK, baseDetail);\n    } else if (resolved.kind === 'edge' && resolved.index >= 0) {\n      this.emit(isDouble ? EVENTS.EDGE_DBLCLICK : EVENTS.EDGE_CLICK, baseDetail);\n    }\n  }\n\n  _scheduleCameraMove(changeDetail = null) {\n    if (changeDetail?.origin || !this._pendingCameraMoveDetail) {\n      this._pendingCameraMoveDetail = changeDetail ?? null;\n    }\n    if (this._cameraMoveRaf != null) return;\n    this._cameraMoveRaf = requestAnimationFrame((ts) => {\n      this._cameraMoveRaf = null;\n      const cameraChange = this._pendingCameraMoveDetail ?? null;\n      this._pendingCameraMoveDetail = null;\n      const camera = this.renderer?.camera ?? null;\n      const detail = {\n        timestamp: ts,\n        camera,\n        origin: cameraChange?.origin ?? null,\n        action: cameraChange?.action ?? null,\n        change: cameraChange,\n        state: camera\n          ? {\n              mode: camera.mode,\n              projection: camera.projection,\n              zoom: camera.zoom,\n              distance: camera.distance,\n              viewport: camera.viewport ? { ...camera.viewport } : null,\n            }\n          : null,\n      };\n      this.emit(EVENTS.CAMERA_MOVE, detail);\n      // Avoid hover spam during camera movement; resample once the camera settles.\n      this._picking.suppressHover = true;\n      const g = this._picking.gesture;\n      g.lastCameraMoveAt = performance.now();\n      if (g.active) {\n        g.cameraMoved = true;\n      }\n      this._resetHover('camera');\n      this._scheduleCameraIdleHoverPick();\n    });\n  }\n\n  _scheduleCameraIdleHoverPick() {\n    if (!this._hasHoverPickingEnabled()) return;\n    if (this._picking.cameraIdleTimer) {\n      clearTimeout(this._picking.cameraIdleTimer);\n    }\n    this._picking.cameraIdleTimer = setTimeout(() => {\n      this._picking.cameraIdleTimer = null;\n      this._picking.suppressHover = false;\n      if (this._picking.pointer.inside) {\n        this._scheduleHoverPick();\n      }\n    }, 80);\n  }\n\n  _scheduleHoverPick() {\n    if (!this._hasHoverPickingEnabled()) return;\n    if (this._picking._raf != null) return;\n    this._picking._raf = requestAnimationFrame(() => {\n      this._picking._raf = null;\n      void this._runHoverPick();\n    });\n  }\n\n  async _ensureIndexPickingTargets() {\n    if (!this.indexPickingTracker) return;\n    const base = this.scheduler?.currentFrame ?? null;\n    const renderNetwork = this._getRenderNetwork();\n    // Scheduler.currentFrame may exist before the renderer/camera is ready.\n    // Always force a current camera/network so the AttributeTracker can render.\n    const frame = {\n      ...(base ?? null),\n      network: renderNetwork,\n      timestamp: performance.now(),\n      camera: this.renderer?.camera,\n    };\n    await this.indexPickingTracker.render(frame, true);\n  }\n\n  _resolvePrimaryHit(picked) {\n    if (!picked) return null;\n    const nodeEnabled = this._picking.node.enabled;\n    const edgeEnabled = this._picking.edge.enabled;\n    const nodeHit = nodeEnabled ? picked.node : -1;\n    const edgeHit = edgeEnabled ? picked.edge : -1;\n    const nodeDepth = picked.nodeDepth;\n    const edgeDepth = picked.edgeDepth;\n    if (nodeHit < 0 && edgeHit < 0) return { kind: null, index: -1, depth: null };\n    const trackDepth = this._picking.options.trackDepth === true;\n    if (trackDepth && nodeHit >= 0 && edgeHit >= 0 && Number.isFinite(nodeDepth) && Number.isFinite(edgeDepth)) {\n      return nodeDepth <= edgeDepth\n        ? { kind: 'node', index: nodeHit, depth: nodeDepth }\n        : { kind: 'edge', index: edgeHit, depth: edgeDepth };\n    }\n    if (nodeHit >= 0) return { kind: 'node', index: nodeHit, depth: Number.isFinite(nodeDepth) ? nodeDepth : null };\n    return { kind: 'edge', index: edgeHit, depth: Number.isFinite(edgeDepth) ? edgeDepth : null };\n  }\n\n  async _runHoverPick() {\n    if (!this.indexPickingTracker) return;\n    if (!this._hasHoverPickingEnabled()) return;\n    if (this._picking.suppressHover) return;\n    if (!this._picking.pointer.inside) {\n      this._resetHover('outside');\n      return;\n    }\n    const maxFps = this._picking.options.maxFps ?? 30;\n    const interval = maxFps > 0 ? (1000 / maxFps) : 0;\n    const now = performance.now();\n    if (interval > 0 && now - this._picking._lastPickTime < interval) {\n      if (!this._picking.hoverThrottleTimer) {\n        const remaining = Math.max(0, interval - (now - this._picking._lastPickTime));\n        this._picking.hoverThrottleTimer = setTimeout(() => {\n          this._picking.hoverThrottleTimer = null;\n          this._scheduleHoverPick();\n        }, remaining);\n      }\n      return;\n    }\n    if (this._picking._inFlight) {\n      this._picking._rerun = true;\n      return;\n    }\n    this._picking._inFlight = true;\n    this._picking._lastPickTime = now;\n    try {\n      await this._ensureIndexPickingTargets();\n      const { x, y, clientX, clientY } = this._picking.pointer;\n      const picked = await this.indexPickingTracker.pick(x, y);\n      const hit = this._resolveHoverHit(picked);\n      const prev = this._picking.hover;\n      const next = hit ?? { kind: null, index: -1, depth: null };\n      if (prev.kind === next.kind && prev.index === next.index) return;\n      if (prev.kind === 'node' && prev.index >= 0) {\n        this.emit(EVENTS.NODE_HOVER, { state: 'out', index: prev.index, depth: prev.depth, x, y, clientX, clientY });\n      } else if (prev.kind === 'edge' && prev.index >= 0) {\n        this.emit(EVENTS.EDGE_HOVER, { state: 'out', index: prev.index, depth: prev.depth, x, y, clientX, clientY });\n      }\n      if (next.kind === 'node' && next.index >= 0) {\n        this.emit(EVENTS.NODE_HOVER, { state: 'in', index: next.index, depth: next.depth, x, y, clientX, clientY });\n      } else if (next.kind === 'edge' && next.index >= 0) {\n        this.emit(EVENTS.EDGE_HOVER, { state: 'in', index: next.index, depth: next.depth, x, y, clientX, clientY });\n      }\n      this._picking.hover = { ...next };\n      this._labels?.requestFullReselect?.('hover-change');\n      this.scheduler?.requestRender?.();\n    } finally {\n      this._picking._inFlight = false;\n      if (this._picking._rerun) {\n        this._picking._rerun = false;\n        this._scheduleHoverPick();\n      }\n    }\n  }\n\n  _resetHover(reason) {\n    const prev = this._picking.hover;\n    const { x, y, clientX, clientY } = this._picking.pointer ?? {};\n    if (prev.kind === 'node' && prev.index >= 0) {\n      this.emit(EVENTS.NODE_HOVER, {\n        state: 'out',\n        index: prev.index,\n        depth: prev.depth,\n        reason,\n        x,\n        y,\n        clientX,\n        clientY,\n      });\n    } else if (prev.kind === 'edge' && prev.index >= 0) {\n      this.emit(EVENTS.EDGE_HOVER, {\n        state: 'out',\n        index: prev.index,\n        depth: prev.depth,\n        reason,\n        x,\n        y,\n        clientX,\n        clientY,\n      });\n    }\n    this._picking.hover = { kind: null, index: -1, depth: null };\n    this._labels?.requestFullReselect?.('hover-reset');\n    this.scheduler?.requestRender?.();\n  }\n\n  async _initializeOptionalUI() {\n    const requested = this.options?.ui ?? (this.debugEnabled ? true : false);\n    if (requested === false || requested == null) return null;\n    if (this.ui) return this.ui;\n    const uiOptions = requested === true\n      ? {}\n      : (requested && typeof requested === 'object' ? requested : {});\n    const hasUiTheme = hasOwnStringOption(uiOptions, 'theme');\n    const themeOption = this._hasExplicitThemeOption && !hasUiTheme\n      ? { theme: this._initialTheme ?? 'dark' }\n      : {};\n    const ui = new HeliosUI({ helios: this, ...themeOption, ...uiOptions });\n    this.ui = ui;\n    this._applyAutoThemeDefaults(this._autoThemeDefaults?.currentTheme ?? this._initialTheme ?? 'dark');\n    this._syncQuickControlsTheme(ui.theme);\n    const panels = Object.prototype.hasOwnProperty.call(uiOptions, 'panels')\n      ? uiOptions.panels\n      : (requested === true ? true : false);\n    this._createOptionalUIPanels(ui, panels, uiOptions.panelOptions ?? uiOptions.panelsOptions ?? {});\n    this._refreshPersistenceBaselineAfterUiInit();\n    return ui;\n  }\n\n  _refreshPersistenceBaselineAfterUiInit() {\n    this._pendingPersistenceBaselineRefresh = false;\n  }\n\n  _scheduleStorageOverrideTrackingReady() {\n    if (typeof this.storage?.setOverrideTrackingReady !== 'function') return;\n    this.storage.setOverrideTrackingReady(true);\n  }\n\n  _createOptionalUIPanels(ui, panels, panelOptions = {}) {\n    if (!ui || panels === false || panels == null) return;\n    const fullPanelList = ['demo', 'metrics', 'mappers', 'layout', 'legends', 'filter', 'camera', 'selection'];\n    const normalizedBase = panels === true || panels === 'default' || panels === 'all'\n      ? fullPanelList\n      : (Array.isArray(panels) ? panels : [panels]);\n    const normalized = normalizedBase.slice();\n    if (this.debugEnabled && !normalized.some((entry) => String(entry ?? '').trim().toLowerCase() === 'debug')) {\n      normalized.push('debug');\n    }\n    const creators = {\n      demo: 'createDemoPanel',\n      scene: 'createDemoPanel',\n      data: 'createDemoPanel',\n      mappers: 'createMappersPanel',\n      layout: 'createLayoutPanel',\n      legends: 'createLegendsPanel',\n      filter: 'createFilterPanel',\n      filters: 'createFilterPanel',\n      camera: 'createCameraPanel',\n      selection: 'createSelectionPanel',\n      metrics: 'createMetricsPanel',\n      debug: 'createDebugPanel',\n    };\n    for (const entry of normalized) {\n      const key = String(entry ?? '').trim().toLowerCase();\n      const method = creators[key];\n      if (!method || typeof ui[method] !== 'function') continue;\n      ui[method](panelOptions?.[key] ?? {});\n    }\n  }\n\n  /**\n   * Dispose renderer resources, UI bindings, workers, timers, and event listeners owned by this instance.\n   *\n   * @public\n   * @apiSection Lifecycle\n   * @returns {void}\n   */\n  destroy() {\n    if (this._destroyed) return;\n    this._destroyed = true;\n    this._disconnectAutoCleanup();\n    this._networkFileDropCleanup?.();\n    this._networkFileDropCleanup = null;\n    this._autoThemeDefaults?.cleanup?.();\n    this._autoThemeDefaults?.stateCleanup?.();\n    if (this._autoThemeDefaults) {\n      this._autoThemeDefaults.cleanup = null;\n      this._autoThemeDefaults.stateCleanup = null;\n    }\n    this.scheduler.stop();\n    this.behaviors?.destroy?.();\n    this._clearEdgeAdaptiveTimer('cameraIdleTimer');\n    this._clearEdgeAdaptiveTimer('probeTimer');\n    this._detachPositionDelegate(this._activePositionDelegate ?? this._positionsConfig?.delegate ?? null);\n    this._activePositionDelegate = null;\n    this._layout?.dispose?.();\n    for (const entry of this._listenHandlers.values()) {\n      this.removeEventListener(entry.type, entry.listener, entry.capture);\n      entry.unsubscribeSignal?.();\n    }\n    this._listenHandlers.clear();\n    this._pendingGraphLayerProps.clear();\n    this._pendingRendererProps.clear();\n    if (this.removeResizeListener) {\n      this.removeResizeListener();\n      this.removeResizeListener = null;\n    }\n    this._beforeUnloadUnsavedChangesCleanup?.();\n    this._beforeUnloadUnsavedChangesCleanup = null;\n    this._detachPickingListeners();\n    this._destroyQuickControls();\n    this._startupOverlay?.remove?.();\n    this._startupOverlay = null;\n    this.attributeTracker?.destroy?.();\n    this.indexPickingTracker?.destroy?.();\n    this.indexPickingTracker = null;\n    this.storage?.destroy?.();\n    this.ui?.destroy?.();\n    this.ui = null;\n    if (this.debugEnabled && typeof window !== 'undefined' && window.__helios === this) {\n      delete window.__helios;\n    }\n    this.renderer?.destroy?.();\n    this._densityLayer = null;\n    this._labels?.destroy?.();\n    this._labels = null;\n    this._legends?.destroy?.();\n    this._legends = null;\n    if (this.options?.disposeNetworkOnDestroy !== false && this.network && typeof this.network.dispose === 'function') {\n      try {\n        this.network.dispose();\n      } catch (error) {\n        warnOnce(\n          this,\n          'destroy-network-dispose',\n          'Helios: network disposal failed during destroy.',\n          { error },\n        );\n      }\n    }\n    this.network = null;\n    this.layers.destroy();\n  }\n}\n\nexport default Helios;\n"],"names":["DEFAULT_SUPERSAMPLING_FACTOR","DEFAULT_SUPERSAMPLING_THRESHOLD","DEFAULT_GRAPHICS_POWER_PREFERENCE","normalizePositiveNumber","value","fallback","numeric","getWindowDevicePixelRatio","normalizeSupersamplingOption","forceSupersample","resolveSupersamplingPreset","normalized","supersamplingPresetToOption","preset","resolveSupersamplingMultiplier","baseDevicePixelRatio","options","baseRatio","mode","autoFactor","autoThreshold","resolveEffectiveDevicePixelRatio","multiplier","resolveWebGLAntialiasEnabled","objectOption","resolveGraphicsPowerPreference","resolveWebGLContextAttributes","resolveWebGPUAdapterOptions","adapterOptions","resolveWebGPURequestAdapterArgument","resolveWebGPUCanvasSampleCount","antialias","SVG_NS","resolveContainer","target","element","normalizeViewportInsets","insets","coerce","LayerManager","suppressBrowserGestures","event","pixelRatio","name","next","prev","callback","supersampling","rect","width","height","listener","DEFAULT_CATEGORIES","buildCategorySet","categories","key","flag","resolveDebugConfig","optionValue","source","DebugLogger","config","category","message","args","tag","createDebugLogger","Scheduler","reason","layout","enabled","handlers","ts","handler","cfg","interval","delay","now","elapsed","frameSkip","framesSince","error","timestamp","delta","perf","layoutWanted","layoutActiveNow","layoutStart","finalizeLayout","changed","result","geometryStart","renderStart","rendered","NODE_POSITION_ATTRIBUTE","NODE_COLOR_ATTRIBUTE","NODE_SIZE_ATTRIBUTE","NODE_STATE_ATTRIBUTE","NODE_OUTLINE_WIDTH_ATTRIBUTE","NODE_OUTLINE_COLOR_ATTRIBUTE","EDGE_COLOR_ATTRIBUTE","EDGE_WIDTH_ATTRIBUTE","EDGE_OPACITY_ATTRIBUTE","EDGE_STATE_ATTRIBUTE","EDGE_ENDPOINTS_SIZE_ATTRIBUTE","VISUAL_ATTRIBUTE_NAMES","DEFAULT_NODE_COLOR","DEFAULT_EDGE_COLOR","DEFAULT_EDGE_OPACITY","DEFAULT_NODE_SIZE","DEFAULT_EDGE_WIDTH","DEFAULT_NODE_OUTLINE_WIDTH","DEFAULT_VISUALS","VISUAL_ATTRIBUTE_MAP","withLogScaleBinding","binding","withVelocityRetentionBinding","Layout","network","visuals","payload","snapshot","wrote","writtenView","writeSnapshot","view","count","apply","visualView","networkView","wroteVisual","wroteNetwork","withVisualAccess","fn","StaticLayout","activeNodes","positions","minX","minY","maxX","maxY","n","offset","x","y","WorkerLayout","_documentCurrentScript","positionsCopy","nodeIndices","edges","i","layoutTimestamp","reheat","size","center","edgeIndices","edgesView","base","DEFAULT_SETTINGS","DEFAULT_OPTIONS","resolveSeedBounds","bounds","settingsCenter","radius","depth","createZeroableUnitLogBinding","shouldAutoStopAtAlphaMin","alpha","alphaMin","current","min","hash32","D3Force3DLayout","normalizedMode","defaults","settings","minZ","maxZ","z","zRange","planarTolerance","centerZ","jitterBase","jitterAmplitude","jitterMean","nodeId","jitter","helios","activeLayout","scheduler","state","hadUse2D","nextMode","nextAlpha","clamped","NETWORK_REPLACED_EVENT","INDEX_ATTRIBUTE","safeVersion","nextCounter","warnOnce","owner","detail","PositionDelegate","nextNetwork","merged","context","zValue","previous","lostNodeIndices","lostEdgeIndices","versionKey","topology","active","nodeIndexAttributeVersion","edgeIndexAttributeVersion","versions","kind","topologyVersions","hasGetter","infoGetter","attributeExists","WORKGROUP_SIZE","STORAGE_FLAG","COPY_SRC_FLAG","COPY_DST_FLAG","UNIFORM_FLAG","MAP_READ_FLAG","PARTIAL_CENTROID_CPU_THRESHOLD","LAYOUT_CHUNK_AUTO_NODE_THRESHOLD","DEFAULT_LAYOUT_CHUNK_NODE_COUNT","DEFAULT_LAYOUT_CHUNK_COUNT","MIN_LAYOUT_CHUNK_COUNT","MAX_LAYOUT_CHUNK_COUNT","WARNING_KEYS_BY_OWNER","FALLBACK_VERSION_COUNTER","keys","nextFallbackVersion","DEFAULT_UMAP_EPOCHS_SMALL","DEFAULT_UMAP_EPOCHS_LARGE","DEFAULT_UMAP_SAMPLE_CHURN","DEFAULT_UMAP_ALPHA_DECAY","buildComputeWgsl","umap","scalar","buildCentroidReductionWgsl","COMPUTE_WGSL_LINEAR","COMPUTE_WGSL_LINEAR_NORMALIZED","COMPUTE_WGSL_LINEAR_SCALAR","COMPUTE_WGSL_UMAP","OUTPUT_SCALE_WGSL","RECENTER_WGSL_BASE","RECENTER_WGSL_ROTATION","toFinite","clamp","max","normalizeCenter","createEmptyUintArray","createEmptyFloatArray","isUmapForceModel","normalizeForceNormalizationType","normalizeLayoutScheduling","normalizeComponentForces","shouldUseComponentMetadata","umapModel","disableUmapComponentOptions","shouldActivateComponentForces","componentForces","componentCount","activeCount","largestComponentSize","secondLargestComponentSize","safeActiveCount","largest","second","largestRatio","smallRatio","dominanceRatio","resolveLayoutChunkNodeCount","resolveLayoutChunkCount","shouldUseChunkedLayoutScheduling","scheduling","forceNormalizationMode","normalizeAttributeName","ensureUint32Capacity","length","required","ensureFloat32Capacity","normalizeReadbackNodeIds","nodeIds","values","push","filterReadableNodeIds","ids","capacity","limit","readable","id","resolveReadbackOut","out","copyPositionsFromFullSnapshot","src","dst","centroidFromPackedPositions","centroid","safeCount","sumX","sumY","sumZ","found","readbackNow","readbackIdsSignature","cloneFloat32","copyCachedFloat32","readScalarViewValue","index","resolveComputeDispatchShape","itemCount","workgroupSize","maxWorkgroupsPerDimension","safeWorkgroupSize","totalGroups","remainingAfterX","rowStride","layerStride","SAFE_READ_WARNED_KEYS","safeReadWithWarning","warningKey","warningMessage","getGpuUsage","getGpuShaderStage","getGpuMapMode","normalizeBackendType","snapshotTopologyInputs","nodeCapacityRaw","nodeCapacity","inferredCapacity","edgeCapacityRaw","edgeCapacity","isSameTopologySnapshot","buildTopologyPayload","topologyInputs","scratch","positionView","edgeWeightView","nodeMassView","nodeStrengthView","componentMetadataEnabled","forceNormalizationType","useLinearScalarInputs","useExplicitInitialPositions","edgeWeightAttribute","nodeMassAttribute","hasExplicitActiveIds","activeIds","activeMask","neighborCounts","nodeMass","maxUmapEdgeWeight","edgeId","weight","umapEpochs","resolveUmapEpochCount","minUmapEdgeWeight","neighborStarts","neighborLength","neighbors","neighborEdges","neighborWeights","cursor","sourceCursor","targetCursor","normalizedWeight","componentMetadata","buildActiveComponentMetadata","componentGravityScale","outputScale","normalizeInputByOutputScale","is3D","valueCount","packedPositions","packedOutputPositions","sourceOffset","targetOffset","fallbackX","fallbackY","fallbackZ","seedX","seedY","seedZ","componentSeedingApplied","applyComponentAwareInitialPositions","nextOutputZ","warmScratch","warmStartUmapPositionsFromTopology","hashToSignedUnit","sampleActiveId","iter","seed","resolveSampleChurnCount","sampleCount","sampleChurn","safeSampleCount","churn","resolveUmapSampleCount","negativeSampleRate","neighborCount","maxNeighborsPerNode","safeNegativeRate","positiveSampleCount","nodeCount","explicit","resolveSampleEpoch","churnCount","sampleFrame","safeChurnCount","safeIter","safeFrame","countChangedSampleSlots","previousFrame","previousEpoch","currentEpoch","sampleActiveIdProgressive","epoch","epochSeed","recenterActivePositions","validCount","shiftX","shiftY","shiftZ","findComponentParent","parent","root","unionComponentParents","a","b","rootA","rootB","swap","safeNodeCapacity","componentIds","componentRanks","nodeComponentRank","nodeComponentSize","componentSizes","unionSize","rootToComponent","sentinel","start","degree","otherId","largestComponentId","componentId","nextSize","nextRank","singletonComponentCount","componentSize","mainScale","singletonScale","componentForcesActive","seedingEnabled","gravityEnabled","largestLog","sizeMix","centroidX","centroidY","centroidZ","goldenAngle","safeRadius","safeDepth","baseHaloRadius","ringSpacing","targetX","targetY","targetZ","rank","angle","haloRadius","sizeOffset","signalX","signalY","nextX","nextY","signalZ","nextZ","passes","pass","sumWeight","meanX","meanY","meanZ","maxPlanarNorm","maxDepthNorm","centeredX","centeredY","centeredZ","planarScale","depthScale","currentX","currentY","currentZ","warmX","warmY","warmZ","compileWebGLShader","gl","type","shader","log","createWebGLProgram","vertexSource","fragmentSource","vertex","fragment","program","canUseWebGLTextureCompute","resolveWebGLTextureLayout","WEBGL_FORCE_FULLSCREEN_VERTEX","buildWebglComputeFragment","WEBGL_FORCE_COMPUTE_FRAGMENT_LINEAR","WEBGL_FORCE_COMPUTE_FRAGMENT_LINEAR_NORMALIZED","WEBGL_FORCE_COMPUTE_FRAGMENT_LINEAR_SCALAR","WEBGL_FORCE_COMPUTE_FRAGMENT_UMAP","WEBGL_FORCE_REDUCTION_INIT_FRAGMENT","WEBGL_FORCE_REDUCTION_COMBINE_FRAGMENT","WEBGL_FORCE_ANGULAR_REDUCTION_INIT_FRAGMENT","WEBGL_FORCE_RECENTER_FRAGMENT_BASE","WEBGL_FORCE_RECENTER_FRAGMENT_ROTATION","WebGLTextureComputePath","names","map","useUmap","useLinearScalar","useLinearNormalized","uniformNames","field","texture","sizeKey","previousSize","needsAllocation","textures","targets","status","texelCount","packed","safeLength","data","pixels","unit","positionTexture","velocityTexture","outputTexture","preserveDynamicState","previousNodeCapacity","scalarValueCount","componentGravityScalePacked","scalarValues","nodeLimit","edgeLimit","scalarValuesPacked","nodeMassPacked","neighborWeightPacked","positionPacked","outputPacked","velocityPacked","sourceTexture","sourceWidth","sourceHeight","sourceIsInitial","targetIndex","targetWidth","targetHeight","centroidTexture","stepOptions","readIndex","writeIndex","positionsIn","velocitiesIn","positionsOut","velocitiesOut","sampleChurnCount","exactRepulsionThreshold","computeKey","computeProgram","computeUniforms","rotationDamping","useRotationDamping","angularTexture","recenterProgram","recenterUniforms","output","readableIds","vec3Count","outputPositions","safeX","safeY","safeZ","WebGLForceComputeBackend","WebGPUForceComputeBackend","device","shaderVisibility","pipelineField","layoutField","entries","module","useRotation","usage","label","normalizedSize","created","bindGroup","sourceBuffer","positionBuffer","velocityBuffer","nodeStrength","edgeWeightValues","nodeVec3Bytes","nodeU32Bytes","scalarWeightCount","queue","positionBytes","zeroBytes","nodeU32BytesUsed","scalarWeights","legacyNodeCount","chunkNodeCount","currentOffset","dispatchShape","chunkStart","chunkCount","scaleParamsBuffer","scaleParamsU32","scaleParamsF32","encoder","safeChunkStart","safeChunkCount","bytes","outputScalePass","forceModel","pipeline","chunkState","dispatchCount","paramsBuffer","paramsU32","paramsF32","recenterPipeline","recenterBindGroup","recenterParamsBuffer","recenterParamsU32","recenterParamsF32","recenterPass","outputStart","outputCount","outputDispatchShape","fullOutputDispatchShape","byteLength","staging","mapped","copy","mappedFloats","reduced","groupCount","idsByteLength","partialByteLength","paramsByteLength","idsBuffer","partialBuffer","readbackBuffer","params","partials","GpuForcePositionDelegate","normalizedOptions","prevMode","prevCenter","prevForceModel","prevEdgeWeightAttribute","prevNodeMassAttribute","prevForceNormalizationType","prevLayoutScheduling","prevLayoutChunkCount","prevLayoutChunkNodeCount","prevComponentForces","prevComponentSeeding","prevComponentGravity","prevComponentMainGravityScale","prevComponentSingletonGravityScale","centerChanged","modelChanged","edgeWeightChanged","nodeMassChanged","forceNormalizationChanged","componentOptionsChanged","backend","rendererDevice","possibleDevice","gpuDevice","resolved","usesLinearStrength","usesLinearEdgeWeights","nodeStrengthAttributeVersion","readVersion","attr","getter","versionSnapshot","previousVersionSnapshot","synchronizeReason","topologyUnchanged","fallbackInputs","isWebGPU","isWebGL","linearEdgeWeightAttribute","layoutStrengthAttribute","materializePayload","activeSelectionChanged","resetForComponentSeeding","dtMs","dt","dtScale","umapForceModel","hasLinearEdgeWeights","linearScalarInputs","linearNormalizedInputs","effectiveLayoutScheduling","alphaTarget","alphaDecay","explicitSampleCountValue","explicitSampleCount","exactDecisionCount","exactRepulsionScale","minDistance","stepPayload","debugEnabled","exactThreshold","useExactRepulsion","previewCount","samplePreview","buffer","resource","version","idsKey","exact","entry","cached","pendingKey","refreshOptions","readActiveIds","amplitude","safeAmplitude","tolerance","mean","baseZ","noise","DEFAULT_BASE_OPTIONS","DEFAULT_LAYOUT_TUNING_MODEL","resolveCount","getArrayLikeLength","readNetworkSnapshot","read","edgeCount","edgePairLimit","estimateDegreeStats","avgDegree","edgePairs","availablePairs","pairLimit","stride","sampledPairs","pair","scale","sum","sumSq","d","seenNodes","unseenNodes","isolateFraction","extractLayoutTuningFeatures","hints","stats","density","degreeVariance","communityCount","logNodeCount","smallGraph","dot","coefficients","vector","total","resolveModel","model","predictLayoutTuningOptions","baseOptions","resolvedModel","features","parameters","descriptor","DEFAULT_UMAP_OUTPUT_SCALE","OUTPUT_SCALE_CONTROL_MAX","AUTO_TUNED_OPTION_KEYS","AUTO_TUNE_MIN_NODE_COUNT","AUTO_TUNE_MAX_NODE_COUNT","AUTO_TUNE_TARGET_OPTIONS","hasOwn","object","clamp01","resolveLayoutNodeCount","directCount","indexedCount","resolveAutoTuneProgress","safeNodeCount","minLog","maxLog","nodeLog","interpolateAutoTunedValue","progress","round","safeBase","safeTarget","resolveGpuForceAutoTuning","modelOptions","modelTuned","applyGpuForceAutoTuning","explicitOptions","baseAutoTuneOptions","tuned","createAutoTuneBaseOptions","GpuForceLayout","deltaMs","explicitKeys","nextOptions","sampleKey","sampleLabel","bindings","renderer","forceFullStartupLayout","Layer","frame","AMBIENT_OCCLUSION_QUALITY_DEFAULT","AMBIENT_OCCLUSION_QUALITY_OPTIONS","freezeKernel","kernel","sample","buildSmoothKernel","buildHemisphereKernel","t","radial","buildBlurWeights","sigma","weights","createPreset","AMBIENT_OCCLUSION_QUALITY_PRESETS","normalizeAmbientOcclusionQuality","getAmbientOcclusionQualityPreset","AMBIENT_OCCLUSION_MODE_DEFAULT","AMBIENT_OCCLUSION_MODE_OPTIONS","normalizeAmbientOcclusionMode","EDGE_WIDTH_SCALE_MULTIPLIER_GLOBAL","SHADED_LIGHT_DIRECTION_DEFAULT","SHADED_LIGHT_COLOR_DEFAULT","SHADED_AMBIENT_TOP_COLOR_DEFAULT","SHADED_AMBIENT_BOTTOM_COLOR_DEFAULT","SHADED_DIFFUSE_STRENGTH_DEFAULT","SHADED_AMBIENT_STRENGTH_DEFAULT","SHADED_SPECULAR_COLOR_DEFAULT","SHADED_SPECULAR_STRENGTH_DEFAULT","SHADED_SHININESS_DEFAULT","AMBIENT_OCCLUSION_STRENGTH_DEFAULT","AMBIENT_OCCLUSION_RADIUS_DEFAULT","AMBIENT_OCCLUSION_BIAS_DEFAULT","AMBIENT_OCCLUSION_INTENSITY_SCALE_DEFAULT","AMBIENT_OCCLUSION_INTENSITY_SHIFT_DEFAULT","clampUnit01","normalizeShadedColor","normalizeShadedDirection","GraphLayer","raw","requestedSlots","clampedSlots","slots","camera","uniforms","exportViewport","array","edgeWidthBase","edgeWidthScale","edgeOpacityBase","edgeOpacityScale","selection","o","is2D","trim","widthClampToNodeDiameter","propagateHoveredNodeToEdges","propagateSelectedNodesToEdges","edgeState","endpointState","mask","nextIndex","style","v","slot","bit","delegate","factor","backendContext","ensureSynchronized","pickValue","fns","gpuShared","webgpuRaw","webglRaw","versionRaw","normalizeBuffer","normalizeTexture","countFromView","countFromActiveIndices","webgpuBuffer","webglTexture","webglTextureVersion","webglTextureCount","webglTextureMeta","getMode","isUniform","GraphVisualSchema","schema","nodeCfg","edgeCfg","resolveNodeOptions","node","resolveEdgeOptions","edge","channel","fallbackSource","PACK_DEPTH_GLSL","createGraphWebGLSources","stateSlots","forceVisibilityBoost","nodeColorBuffer","nodeSizeBuffer","nodeOutlineBuffer","nodeOutlineColorBuffer","edgeColorSourceNode","edgeWidthSourceNode","edgeOpacitySourceNode","edgeEndpointSizeSourceNode","edgeColorBuffer","edgeWidthBuffer","edgeOpacityBuffer","edgeEndpointSizeBuffer","edgeColorEndpoints","edgeWidthEndpoints","edgeOpacityEndpoints","edgeEndpointSizeEndpoints","fastEdgePath","nodeShadingEnabled","edgeShadingEnabled","edgeCameraMode","edgeSemanticZoomEnabled","edgeTrimEnabled","edgeWidthClampToNodeDiameter","edgeEndpointGeometryEnabled","edgeStateEnabled","edgeEndpointStateEnabled","nodeColorDecl","nodeSizeDecl","nodeOutlineDecl","nodeOutlineColorDecl","nodeFetchColor","nodeFetchSize","nodeFetchOutline","nodeFetchOutlineColor","nodeFetchState","edgeColorDecl","edgeOpacityDecl","edgeWidthDecl","edgeEndpointSizeDecl","edgeFetchColor","edgeFetchOpacity","edgeFetchWidth","edgeFetchEndpointSize","edgeColorNodeBlock","TEXTURE_INDEX_HELPERS","edgeStateUniformDecl","edgeStateFetch","edgeLineStateBlock","edgeQuadStateBlock","edgeEndpointStateUniformDecl","edgeEndpointStateFetch","edgeEndpointGeometryBlock","edgeQuadWidthClampBlock","edgeQuadWidthDirBlock","shadedUniformDecl","nodeShadingHelper","edgeShadingHelper","NODE_VERTEX_SOURCE","NODE_FRAGMENT_SOURCE","NODE_DEPTH_FRAGMENT_SOURCE","EDGE_VERTEX_SOURCE","EDGE_QUAD_VERTEX_SOURCE","EDGE_FRAGMENT_SOURCE","EDGE_DEPTH_FRAGMENT_SOURCE","EDGE_WEIGHTED_FRAGMENT_SOURCE","invertMat4","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b00","b01","b02","b03","b04","b05","b06","b07","b08","b09","b10","b11","det","invDet","resolveContextViewport","fallbackWidth","fallbackHeight","formatFloat","fixed","createSmoothAoFragmentSource","createAltAoFragmentSource","createBlurFragmentSource","FULLSCREEN_VERTEX_SOURCE","COMPOSITE_FRAGMENT_SOURCE","createTexture","internalFormat","format","filter","deleteFramebuffer","framebuffer","deleteTexture","AmbientOcclusionWebGLAlt","quality","aoKey","fullWidth","fullHeight","aoWidth","aoHeight","recreateFull","recreateAo","cameraUniforms","strength","bias","intensityScale","intensityShift","requestedMode","viewport","aoEntry","blurEntry","compositeEntry","outputFramebuffer","normalizeEndpoints","toNumber","toRgba","len","toColorPair","fallbackStart","fallbackEnd","end","rgba","toScalarPair","fallbackA","NODE_UNIFORM_NAMES","EDGE_UNIFORM_NAMES","EDGE_QUAD_UNIFORM_NAMES","DEFAULT_STATE_SCALE","DEFAULT_STATE_COLOR_MUL","DEFAULT_STATE_COLOR_ADD","isDebugWebGLRenderEnabled","debugWebGLRender","GraphLayerWebGL","tex","extColorBufferFloat","extColorBufferHalfFloat","extFloatBlend","canDrawMultiple","visualConfig","variant","cache","buildSources","sharedCache","sharedKey","sources","nodeVariant","edgeVariant","weighted","suffix","color","getProgram","cacheKey","vert","frag","nodeQuad","edgeQuadCorners","resolveQuad","fastPath","specialization","normalize","opacity","endpointSize","indices","edgeNodeAttributes","hasNodeAttribute","hasEdgeAttribute","nodeIndexDirtyRange","edgeIndexDirtyRange","safeGet","scope","nodePositions","nodeColors","nodeSizes","nodeStates","nodeOutlineWidths","nodeOutlineColors","edgeColors","edgeWidths","edgeOpacities","edgeEndpointSizes","edgeStates","edgeNodeColor","edgeNodeWidth","edgeNodeOpacity","edgeNodeEndpointSize","positionOverride","resolvedNodePositions","resolvedNodePositionVersion","resolvedNodePositionTexture","resolvedNodePositionTextureVersion","resolvedNodePositionTextureCount","resolvedNodePositionTextureMeta","nodes","nodeEdgeSources","components","formatInfo","directView","ctor","meta","dirtyRange","dirtyCount","nodePositionsTexture","nodePositionsMeta","zoom2D","semanticZoomExponent","nodeConfig","edgeConfig","fastEdges","edgeRenderingMode","nodeProgramEntry","nodeDepthProgramEntry","edgeLineProgramEntry","edgeLineDepthProgramEntry","edgeQuadProgramEntry","edgeQuadDepthProgramEntry","edgeLineWeightedProgramEntry","edgeQuadWeightedProgramEntry","nodeColorBufferEnabled","nodeSizeBufferEnabled","nodeOutlineBufferEnabled","nodeOutlineColorBufferEnabled","nodeDefaultColor","nodeDefaultSize","nodeDefaultOutline","nodeDefaultOutlineColor","defaultEdgeColorPair","defaultEdgeWidth","defaultEdgeOpacity","defaultEdgeEndpointSize","shadedLightDirection","shadedLightColor","shadedAmbientTopColor","shadedAmbientBottomColor","shadedSpecularColor","shadedDiffuseStrength","shadedAmbientStrength","shadedSpecularStrength","shadedShininess","customEdgeNodeAttributes","usesDefaultNodeColor","usesDefaultNodeSize","defaultNodeSourceScalar","defaultNodeWidth","defaultNodeOpacity","defaultNodeEndpointSize","geometry","hasNodeColorsForNodes","hasNodeSizesForNodes","hasNodeStatesForNodes","hasNodeOutlineWidthsForNodes","hasNodeOutlineColorsForNodes","hasNodeColorsForEdges","hasNodeSizesForEdges","nodeColorSource","nodeWidthSource","nodeOpacitySource","nodeEndpointSizeSource","mapEndpointMode","interpolationState","interpolationEnabled","interpolationFactor","interpolationSourceView","interpolationSourceVersion","interpolationSourceCount","delegateNodePositionTexture","delegateNodeTextureMeta","activeNodePositionTexture","activeNodePositionMeta","interpolationSourceTexture","interpolationSourceTextureMeta","activeNodePositionFromTexture","resolvedNodePositionFromTexture","positionCount","sizeCount","stateCount","colorCount","outlineCount","outlineColorCount","sourceCount","endpointCount","edgeColorCount","edgeWidthCount","edgeOpacityCount","edgeEndpointSizeCount","edgeStateCount","rasterViewportWidth","rasterViewportHeight","logicalViewport","exportPixelRatio","screenViewportWidth","screenViewportHeight","transparencyMode","nodeBlendWithEdges","edgeDepthWrite","set1i","loc","set1f","set1ui","set2f","set3f","c","set4f","set4fv","setMat4","setShadingUniforms","drawEdges","depthOnly","passViewportWidth","passViewportHeight","hasEdgeColors","hasNodeColorsForEdgeChannel","hasEdgeWidths","hasEdgeOpacities","hasEdgeStates","hasNodeStatesForEdgeEndpoint","hasEdgeEndpointSizes","hasNodeWidthSource","hasNodeOpacitySource","hasNodeEndpointSizeSource","colorEndpointMode","opacityEndpointMode","edgeEntry","quadDefaultEdgeWidth","quadDefaultEdgeEndpointSize","drawNodes","nodeEntry","applyViewport","outputDrawBuffers","mainFramebuffer","mainDrawBuffers","effectiveEdgeCount","weightedRequested","weightedReady","ambientOcclusionActive","resolveProgram","resolveUniformColor","resolveUniformWeight","applyNodeBlend","setupNodeDepth","finalError","createGraphWebGPUSources","STATE_SLOTS","FORCE_VISIBILITY_BOOST","useNodeIndices","useEdgeIndices","nodeOptions","edgeOptions","useNodeColorBuffer","useNodeSizeBuffer","useNodeStateBuffer","useNodePositionInterpolation","useNodeShading","useNodeOutlineWidthBuffer","useNodeOutlineColorBuffer","useEdgeColorBuffer","useEdgeWidthBuffer","useEdgeOpacityBuffer","useEdgeEndpointSizeBuffer","useNodeOutlineAttributes","defaultBindings","bindingMap","hasBinding","bindingIndex","NODE_OUTLINE_STORAGE_BINDINGS","NODE_OUTLINE_RAW_EXPR","NODE_OUTLINE_BASE_COLOR_EXPR","NODE_TARGET_BINDING","NODE_SHADING_BINDING","NODE_SHADING_HELPER","NODE_FILL_COLOR_EXPR","EDGE_TARGET_BINDING","NODE_WGSL","EDGE_WGSL","EDGE_WEIGHTED_WGSL","EDGE_WEIGHTED_RESOLVE_SHARED_WGSL","EDGE_WEIGHTED_RESOLVE_WGSL","createEdgeWeightedResolveTonemapWGSL","FrameGraphRunner","bumpCounter","GraphLayerWebGPUBase","globalsFloats","quad","edgeQuad","depthStencil","outlineToggle","useIndices","useOutlineAttributes","blendKey","depthMode","nodeModule","bindGroupLayout","alphaBlend","blend","edgeModule","fragmentEntryPoint","depthWriteEnabled","edgeLayout","linePipeline","quadPipeline","variantKey","depthWriteOverride","resolvedSampleCount","viewportWidth","viewportHeight","drawWidth","drawHeight","outlineColor","nodeColor","nodeSizeRaw","nodeOutlineRaw","edgeColorPair","edgeColorStart","edgeColorEnd","edgeWidthPair","edgeOpacityPair","edgeEndpointSizePair","interpolation","nodeIndex","nodeState","edgeIndex","nodeForceMask","edgeForceMask","nodeVirtual","edgeVirtual","direction","lightColor","ambientTop","ambientBottom","specularColor","diffuseStrength","ambientStrength","specularStrength","shininess","ready","destroyOld","weightFormat","swapchainFormat","colorFormat","additiveBlend","needsRebuild","weightedModule","depthStencilAccumulate","shaderCode","commandEncoder","targetView","depthView","useQuads","edgePipeline","edgeVertexBuffer","accumulatePass","resolvePass","normalizeEdgeOption","endpoints","doubleWidth","useEdgeShading","positionInterpolationEnabled","cameraMode","semanticZoomEnabled","trimEnabled","endpointGeometryEnabled","endpointStateEnabled","useEdgeColorNode","useEdgeWidthNode","useEdgeOpacityNode","useEdgeEndpointSizeNode","edgeColorBufferSnippet","edgeColorNodeSnippet","edgeWidthBufferSnippet","edgeWidthNodeSnippet","edgeOpacityBufferSnippet","edgeOpacityNodeSnippet","edgeEndpointSizeBufferSnippet","edgeEndpointSizeNodeSnippet","semanticScaleExpr","edgeIdVertexSnippet","edgeIdQuadSnippet","edgeStateSnippet","edgeEndpointGeometrySnippet","edgeGeometrySetupSnippet","edgeLineWidthClampSnippet","edgeQuadWidthClampSnippet","edgeLineGeometrySnippet","edgeLineVisualSnippet","edgeQuadWidthDirSnippet","bindingLines","addBinding","storage","declaration","createSmoothAoComputeSource","createAltAoComputeSource","createBlurSource","AO_COMPOSITE_WGSL","AmbientOcclusionWebGPU","position","aoPipeline","blurPipeline","prepass","aoPass","blurHorizontal","blurVertical","compositePass","FALLBACK_TOPOLOGY_VERSION_COUNTER","GraphLayerWebGPU","specs","visibility","spec","bindingInfo","createBaseGraphWebGPUSources","pushStorage","currentCount","downgraded","downgradedCount","effectiveVariant","useEndpointState","useEdgeState","usePositionInterpolation","createDynamicGraphWebGPUSources","prevLayout","maxBindingSize","uploads","edgeSources","sizes","colors","states","outlineWidths","outlineColors","uploadColors","uploadSizes","uploadPositions","uploadStates","storageUsage","resourceCache","checkBindingSize","requiredBytes","aligned","ensure","interpolationSourceBuffer","delegatePositionBuffer","edgeSourceEntries","edgeSourceBuffers","uploadEdgeSource","bufferEntry","dimension","defaultColorBuffer","defaultScalarBuffer","bindGroupKey","lastBuffers","currentBuffers","buffersChanged","usedBuffers","widths","endpointSizes","opacities","useEdgeStateBuffer","edgeSourceBindings","cacheBuffers","buffers","adoptActiveBuffer","activeBuffer","existing","resolveNodeSource","AttributeType","resolvedDimension","resolvedNodePositionBuffer","nodeBlend","nodePipeline","edgePipelines","ambientOcclusionNodePipeline","ambientOcclusionEdgePipelines","passEncoder","nodeBindGroup","drawEdgesAlpha","drawNodesAmbientOcclusion","drawEdgesAmbientOcclusion","WebGLResourceCache","typedArray","topologyVersion","viewSig","sameBytes","sameVersion","sameTopo","sameCount","sameView","factory","WebGPUResourceCache","elementSize","code","ResourceCache","deviceOrGl","isDebugWebGLPickEnabled","debugWebGLPick","compileShader","createProgram","PRESENT_VERT","PRESENT_FRAG","WebGL2Device","canvas","vao","vertices","renderTarget","clearColor","availableWidth","availableHeight","readFramebufferTarget","colorAttachment","attachmentTypeEnum","noneEnum","attachmentType","attachmentName","postError","PRESENT_WGSL","WebGPUDevice","storageLimitRatio","bufferLimitRatio","adapterStorageLimit","adapterBufferLimit","adapterStorageBuffersPerStage","baseStorageLimit","baseBufferLimit","requestedStorageLimit","requestedBufferLimit","requiredLimits","requestedLimits","canvasConfigOverrides","shaderModule","pipelineLayout","targetTexture","textureWidth","textureHeight","colorView","resolveTargetView","depthTexture","bytesPerPixel","alignedBytesPerRow","readBuffer","row","srcStart","dstStart","toPointerArray","points","sortPointers","computeGestureCentroid","ordered","point","computePinchDistance","computeTwistAngle","snapshotTouchGesture","classifyGestureForSuppression","startPoints","currentPoints","tolerancePx","orderedStart","orderedCurrent","maxPointerTravel","travel","startGesture","currentGesture","centroidDistance","pinchDelta","twistDelta","createVec3","vec3Add","vec3ScaleAndAdd","s","vec3Cross","ax","ay","az","bx","by","bz","vec3Normalize","inv","vec3TransformQuat","q","qx","qy","qz","qw","ix","iy","iz","iw","quatIdentity","quatNormalize","quatMultiply","aw","bw","quatFromAxisAngle","axis","rad","half","createMat4","mat4Identity","mat4Multiply","b12","b13","b20","b21","b22","b23","b30","b31","b32","b33","mat4Perspective","fovy","aspect","near","far","f","nf","mat4Ortho","left","right","bottom","top","lr","bt","mat4LookAt","eye","up","fx","fy","fz","upVec","u","Camera","clientX","clientY","newZoom","vpWidth","vpHeight","screenX","screenY","centerX","centerY","worldX","worldY","pointer","previousPointer","previousGesture","nextGesture","previousForAction","dx","dy","startPointer","primaryPointer","action","centroidDx","centroidDy","dollyChanged","yawDelta","pitchDelta","yawQuat","rightAxis","pitchQuat","len2","l","v0","v1","axisView","axisWorld","axisLen","distanceRatio","zoomGain","fovRad","worldPerPixel","changeDetail","safeDistance","viewHeight","viewWidth","matrix","LayeredRenderer","forceWebGL","forceWebGPU","webgpuSupported","layer","layerOrName","removed","clipX","clipY","renderPayload","layerStart","createRenderer","lerp","smoothstep","logLerp","av","bv","copyVec","mergeVec","candidate","fallbackValue","radians","quatSlerp","cosOmega","omega","sinOmega","scale0","scale1","createYawPitchQuaternion","yawRadians","pitchRadians","yaw","pitch","captureCameraPose","mergeCameraPose","basePose","patch","applyCameraPose","pose","update","interpolateCameraPose","fromPose","toPose","CameraTransitionController","requestRender","resolve","durationMs","duration","startedAt","step","finish","RenderTargetPool","#makeKey","#createWebGLTarget","#createWebGPUTarget","fmt","samples","createAttributeWebGLSources","useNodeSizeAttribute","useNodeOutlineAttribute","useNodeEncodedAttribute","useEdgeWidthAttribute","useEdgeEndpointSizeAttribute","NODE_VERTEX_SIZE_DECL","NODE_VERTEX_SIZE_EXPR","NODE_VERTEX_OUTLINE_DECL","NODE_VERTEX_OUTLINE_EXPR","EDGE_VERTEX_ENDPOINT_DECL","EDGE_VERTEX_ENDPOINT_EXPR","EDGE_QUAD_WIDTH_DECL","EDGE_QUAD_WIDTH_EXPR","EDGE_QUAD_ENDPOINT_DECL","EDGE_QUAD_ENDPOINT_EXPR","nodeVertex","edgeVertex","edgeQuadVertex","createAttributeWebGPUSources","encodedOutputMode","encodedInputMode","useUintTarget","useUintInput","useNodeOutlineBuffer","useNodeEncodedBuffer","nodeIndexEncodedRaw","edgeIndexEncodedRaw","NODE_ENCODED_INPUT_DECL","EDGE_ENCODED_INPUT_DECL","NODE_ENCODED_ASSIGN","EDGE_ENCODED_ASSIGN","NODE_ENCODED_VARYING_DECL","EDGE_ENCODED_VARYING_DECL","NODE_FRAGMENT_COLOR_TYPE","NODE_FRAGMENT_ENCODED_EXPR","EDGE_FRAGMENT_ENCODED_EXPR","NODE_VERTEX_INPUT","NODE_SIZE_RAW_EXPR","EDGE_VERTEX_INPUT","EDGE_QUAD_VERTEX_INPUT","EDGE_WIDTH_PAIR_EXPR","EDGE_ENDPOINT_SIZE_PAIR_EXPR","createAttributeWebGPUTrackSources","nodeUseSizeBuffer","nodeUseOutlineBuffer","nodeUseStateBuffer","nodeTrackedMode","edgeUseWidthBuffer","edgeUseEndpointSizeBuffer","edgeUseNodeStateBuffer","edgeUseStateBuffer","edgeWidthSource","edgeEndpointSizeSource","edgeTrackedMode","NODE_TRACKED_EXPR","EDGE_TRACKED_EXPR","NODE_SIZE_EXPR","NODE_OUTLINE_EXPR","ENCODE_OUT_FN","NODE_COLOR_TYPE","EDGE_COLOR_TYPE","COMMON","nodeWGSL","edgeWGSL","TRACK_STATE_SLOTS","PACK_UINT_GLSL","INDIRECT_TEXTURE_INDEX_GLSL","WEBGL_INDIRECT_TRACK_NODE_VERTEX","WEBGL_INDIRECT_TRACK_NODE_FRAGMENT","WEBGL_INDIRECT_TRACK_NODE_OCCLUSION_FRAGMENT","WEBGL_INDIRECT_TRACK_NODE_DEPTH_FRAGMENT","WEBGL_INDIRECT_TRACK_EDGE_VERTEX","WEBGL_INDIRECT_TRACK_EDGE_QUAD_VERTEX","WEBGL_INDIRECT_TRACK_EDGE_FRAGMENT","WEBGL_INDIRECT_TRACK_EDGE_DEPTH_FRAGMENT","decodePacked","r","g","decodePackedUint32","ENCODE_FORMAT","INDEX_SENTINEL","TRACKED_VALUE_MODE","TRACKED_SOURCE_MODE","unpackDepthRGBA","inv255","getSparseEncodedName","sourceName","getSparseEncodedApi","getSparseEncodedDesc","attrName","encodedName","api","ensureSparseEncodedReady","getAttributeVersionSafe","ensureSparseEncodedReadyCached","topo","attrVersion","isSparseGraphLayer","safeGetAttributeBuffer","isSupportedTrackedIntegerBuffer","desc","resolveTrackedSourceDescriptor","normalizeNodeSourceEndpoints","toPackedInteger","writeEncodedValue","packedValue","encoded","mixVersions","primary","secondary","packActiveValues","dim","sourceBase","targetBase","isIdentityIndices","expected","selectActiveValues","packEdgeSegmentsFromSparse","edgeEndpoints","edgeBase","sourceId","targetId","outBase","packNodeSourcedEdgePairs","nodeValues","endpointsMode","sourceValue","targetValue","encodeActiveValues","attrView","activeIndices","useIndex","sourceIndex","encodeActiveValuesUint32","packActiveEncodedValues","encodedDesc","WebGLAttributeRenderer","graphLayer","pool","runner","resolveUniforms","nodeUniformNames","edgeQuadUniformNames","nodeQuadCorners","trackDepth","tagNode","tagEdge","sourceView","bytesView","provider","localTexture","sharedResources","sharedTextureKey","sharedMetaKey","upload","sharedTexture","sharedMeta","location","w","nodeNoStateEnabled","edgeWidthFactor","globalEdgeWidthBase","globalEdgeWidthScale","edgeNoStateEnabled","nodeSizeUniform","nodeSizeValue","nodeOutlineUniform","nodeOutlineValue","fallbackVersion","nodeIsIndex","edgeIsIndex","sparse","delegateNodePositionTextureCount","totalNodeCount","totalEdgeCount","drawNodeCount","drawEdgeCount","drawTextures","nodePositionVersion","nodeSizeVersion","nodeOutlineVersion","nodeStateVersion","nodeWidthSourceVersion","nodeEndpointSizeSourceVersion","edgeEndpointsVersion","edgeStateVersion","edgeWidthVersion","edgeEndpointSizeVersion","nodeTracked","edgeTracked","trackedNodeValueMode","trackedEdgeValueMode","useNodeIdBuffer","useEdgeIdBuffer","drawNodeArgs","drawEdgeArgs","setupNodeDraw","setupEdgeDraw","pixel","postErr","bits","maxVal","WebGPUAttributeRenderer","gpu","preferredFormat","cornerUsage","nodeStateBuffer","bindingSlots","edgeWidthUniform","edgeEndpointSizeUniform","edgeStateBuffer","depthFormat","nodeVertexBuffers","nodeSlots","edgeLineVertexBuffers","edgeLineSlots","edgeQuadVertexBuffers","edgeQuadSlots","nodeLayout","nodeDepthPipeline","edgeDepthPipeline","edgeQuadPipeline","edgeQuadDepthPipeline","zero","edgeNodeStateBuffer","nodeBindingInfo","edgeBindingInfo","nodeOcclusionPipeline","destroyEntry","widthSource","endpointSizeSource","uploadFallback","vertexUsageBit","hasVertexUsage","sameTopology","sameByteLength","useIntegerEncoding","nodePositionsSelection","nodeSizesSelection","nodeOutlineSelection","edgeSegments","widthFromNode","endpointSizeFromNode","widthEndpointsMode","endpointSizeEndpointsMode","edgeWidthsDirect","widthSelection","edgeEndpointSizesDirect","endpointSource","endpointSelection","nodeAttrName","edgeAttrName","sparseNodeEncoded","sparseEdgeEncoded","nodeAttr","edgeAttr","nodeEncodedFromSparse","edgeEncodedFromSparse","nodeEncodedRawIndex","edgeEncodedRawIndex","nodeEncodedView","edgeEncodedView","nodeTopologyVersion","edgeTopologyVersion","nodeWidthVersion","nodeEndpointSizeVersion","edgeSegmentVersion","shared","sharedCandidates","pipelines","occlusionPipelines","cameraBuffer","cameraArray","globalsBuffer","globalsArray","edgeEndpointPair","vertexUsage","uploadVertex","bindVertexSlots","buffersBySlot","buf","nodePositionBuffer","needNodeSize","needNodeOutline","nodeEncodedBuffer","edgeSegmentsBuffer","edgeSlots","needEdgeWidths","needEdgeEndpointSizes","edgeWidthsBuffer","edgeEncodedBuffer","nodeBuffersBySlot","canBindNode","edgeLineBuffersBySlot","edgeQuadBuffersBySlot","canBindEdge","occlusionNodeBuffers","canBindOcclusion","useQuad","nodeDepthBuffersBySlot","canBindNodeDepth","canBindEdgeDepth","useEdgeNodeStateBuffer","zeroStorage","uploadStorage","resolveStorage","nodeTopology","edgeTopology","nodePositionsView","nodePositionsDirectBuffer","nodeSizesView","nodeStatesView","nodeOutlineView","edgeEndpointsView","edgeWidthsView","edgeEndpointSizesView","edgeStatesView","nodeWidthSourceView","nodeEndpointSourceView","nodeIndicesBuffer","edgeIndicesBuffer","nodePositionsBuffer","nodeSizesBuffer","nodeStatesBuffer","edgeEndpointsBuffer","edgeEndpointSizesBuffer","edgeStatesBuffer","nodeWidthSourceBuffer","nodeEndpointSourceBuffer","nodeTrackedIntBuffer","nodeTrackedUintBuffer","edgeTrackedIntBuffer","edgeTrackedUintBuffer","trackConfigBuffer","trackConfigBytes","trackConfigView","writeU32","writeF32","nodeNoStateScale","edgeNoStateScale","nodeStateScale","edgeStateScale","defaultValue","pushBindGroupEntries","sourceMap","edgeBindGroup","sparseMode","renderOptions","canUseDirectIndirectPath","indirectEdgeVariant","edgeSourceRequests","sparseGeometry","prepared","AttributeTracker","mat","hash","widthPx","heightPx","nodePos","nodeSize","nodeOutline","edgeWidth","edgeEndSize","nodeAttrVer","edgeAttrVer","camHash","edgeMode","projection","delegateVersion","nodeStateScaleHash","edgeStateScaleHash","nodeNoStateScaleHash","edgeNoStateScaleHash","nodeAttribute","edgeAttribute","force","signature","hadNode","hadEdge","didRender","yRaw","results","readTarget","clampedX","clampedY","useBgra","decoded","webglTracker","depthTarget","depthPixels","depthBytes","reordered","PerformanceMonitor","windowSize","logEvery","bucket","summary","specifier","category10","Accent","Dark2","observable10","Paired","Pastel1","Pastel2","Set1","Set2","Set3","Tableau10","define","constructor","prototype","extend","definition","Color","darker","brighter","reI","reN","reP","reHex","reRgbInteger","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","channels","color_formatHex","color_formatHex8","color_formatHsl","color_formatRgb","hslConvert","m","rgbn","Rgb","hsla","rgbConvert","rgb","k","clampi","clampa","rgb_formatHex","rgb_formatHex8","rgb_formatRgb","hex","h","Hsl","hsl","m2","m1","hsl2rgb","clamph","clampt","degrees","A","B","C","D","E","ED","EB","BC_DA","cubehelixConvert","Cubehelix","bl","cubehelix","cosh","sinh","basis","t1","v2","v3","t2","t3","constant","linear","exponential","hue","gamma","nogamma","rgbGamma","colorRgb","rgbSpline","spline","rgbBasis","cubehelixGamma","colorCubehelix","cubehelixLong","ramp$1","scheme","interpolateRgbBasis","BrBG","ramp","PRGn","PiYG","PuOr","RdBu","RdGy","RdYlBu","RdYlGn","Spectral","BuGn","BuPu","GnBu","OrRd","PuBuGn","PuBu","PuRd","RdPu","YlGnBu","YlGn","YlOrBr","YlOrRd","Blues","Greens","Greys","Purples","Reds","Oranges","cividis","interpolateCubehelixLong","warm","cool","rainbow","pi_1_3","pi_2_3","sinebow","turbo","range","viridis","magma","inferno","plasma","lerpColor","aLen","bLen","base64ToUint8Array","b64","decodeColormapData","expectedN","normalizeCssColor","scaled","hexMatch","expand","int","rgbMatch","parts","normalizeColors","basisBlend","basisVector","cv","dv","createInterpolatorFromList","alreadyNormalized","closed","list","tRaw","localT","sampleColorsFromInterpolator","interpolator","denom","sampleColorsFromList","pos","i0","i1","CATEGORY18_COLORS","createRepeatingSchemeDescriptor","_","buildJsonColormapDescriptor","load","buildD3Descriptors","d3Chromatic","rampInterpolator","offset0","offset1","colorsByCount","baseColors","baseInterpolator","chosen","d3Descriptors","buildJsonDescriptors","CET","cmasher","rawColormapData","CETDescriptors","cmasherDescriptors","heliosDescriptors","registry","registerDescriptor","primeRegistry","colormaps","DEFAULT_NODE_COLORMAP","resolveColormap","input","normalizedInput","colormapToInterpolator","colormapToScheme","createColormapScale","colormapInput","domain","clampSpec","interpolatorReturnsArray","d0","d1","lo","hi","createCategoricalColormap","DEFAULT_NODE_OUTLINE_COLOR","DEFAULT_CATEGORICAL_COLOR","isMissingAttributeError","msg","isExpectedMetadataLookupError","validateAttribute","expectedType","expectedDimension","resolveAttributeMetadata","info","bufferGetter","normalizeAttributes","attributes","isNil","resolveNodeEndpoints","item","getNode","trimmed","NODE_ATTRIBUTE_TO_CHANNEL","computePassthroughTargetDimension","sourceDimension","resolveValueFromItem","resolveAttribute","tgt","collectInputs","attrSpec","objectInputs","containsNode","linearScale","r0","r1","categoricalScale","applyBuiltinTransform","transformType","power","p","isPercentileTransformType","applyPercentileTransform","inputs","lookup","clampForDomainTransform","eps","transformDomainIfNeeded","t0","resolveTransformFn","applyScale","baseDomain","resolveDivergentDomain","scaleKey","scaleSignature","clampMin","clampMax","maxAbs","buildPercentileLookup","sorted","mid","idx","buildPercentileLookupForIndex","resolvePercentileLookup","mapper","attrs","isNodeProxy","compute","buildNodeToEdgeValue","computeChannelValue","rule","ruleInputs","ruleBase","ruleScaled","normalizeChannelConfig","isConstantChannel","isEdgeNodePassthrough","def","resolveNodeChannelNameFromConfig","hasAttributes","channelName","removeEdgeAttributeSafe","debug","removeNodeToEdgeAttributeSafe","resolveEdgeChannelEntriesForNodeConstants","channelEntries","nodeMapper","CHANNEL_DEFS","nodeChannelName","constantValue","resolveEdgeMapperForNodeConstants","edgeMapper","derived","Mapper","ChannelBuilder","nameOrDescriptor","ruleConfig","items","attribute","sourceAttribute","passthrough","estimate","preferredEndpoints","defaultDoubleWidth","targetDimension","desired","flipDoubleWidth","candidates","candidateDoubleWidth","candidateDimension","sourceInfo","passthroughOk","retryError","resolvedSourceInfo","edgeInfo","createDefaultMappers","defaultNodeColor","VISUAL_ATTRIBUTES","MapperCollection","onChange","builder","originalDone","combined","cloned","EDGE_CHANNEL_TO_ATTRIBUTE","EDGE_CHANNEL_DEFAULT_NODE_ATTRIBUTE","LOW_DISCREPANCY_X","LOW_DISCREPANCY_Y","LOW_DISCREPANCY_Z","DEFAULT_SEED_SPREAD","fract","attributeInfoMismatched","dimensionMismatch","typeMismatch","expandAttributeData","fromDimension","toDimension","ratio","duplicateEach","baseFrom","baseTo","computeSeedPosition","side3D","cx","cy","cz","order","countOffset","xNorm","yNorm","spreadX","spreadY","spreadZ","zNorm","VisualAttributes","allowMissing","preparedOpacity","touched","invalidA","invalidB","resolvedEdgeMapper","get","normalizeNumber","normalizeRgba","outline","normalizePair","normalizeColorPair","nodeSizeFallback","nodeSizeBufferFallback","passthroughs","passthroughMap","inferNodeAttributeFromConfig","inferNodeSourceFromMapper","inferred","nodeChannels","preparedInputNodeBuffers","preparedNodeVisualBuffers","bumpNode","edgeChannels","nodeToEdgeRegistrations","skipColor","skipOpacity","skipEndpointSize","preparedEdgeBuffers","preparedNodeBuffers","preparedEdgeVisualBuffers","edgeBuffers","nodeBuffers","edgeInputs","sourceAttributes","targetAttributes","bumpEdge","edgeEndpointSizeFromEdge","endpointSizeChannel","edgeUsesNodeColor","edgeUsesNodeSize","targetIndices","outlineWidth","sizeView","stateView","outlineWidthView","outlineColorView","opacityView","widthView","preparedNodePositions","previousMaxNodeId","maxNodeId","hasAnyNonZero","missing","zeroVector","seedCount","seedBounds","seededNodeIds","assignSeededPosition","zeroSeedBaseline","isNewNode","currentDim","shouldExpand","hasExistingRows","preserved","edgeName","add","synthetic","startColor","endColor","startWidth","endWidth","startOpacity","endOpacity","maxRgb","hasAlpha","startSafe","endSafe","colorOffset","outlineOffset","posOffset","widthOffset","opacityOffset","completed","nodeNames","edgeNames","INTEGER_LIKE_TYPES","DEFAULT_CONFIG","LARGE_GRAPH_LABEL_RANK_NODE_THRESHOLD","LARGE_GRAPH_LABEL_INTERACTION_FULL_FPS","LARGE_GRAPH_LABEL_VIEW_SETTLE_MS","LARGE_GRAPH_LABEL_PROGRESSIVE_CHUNK_SIZE","normalizedKey","clampInt","quantize","normalizeColorString","normalizePinnedNodes","colorStringToSvgPaint","part","composeViewSignature","vp","projectPointInto","viewProjection","cw","invW","ndcX","ndcY","ndcZ","readPositionInto","estimateTextWidthPx","text","fontSizePx","pushMinHeap","heap","tmp","replaceHeapRoot","maskHasSelected","selectedMask","normalizeFallbackSources","normalizeSelectionMode","SvgLabelController","svg","family","hoveredNode","viewSignature","dataSignature","viewChanged","dataChanged","useAdaptiveViewUpdates","fullIntervalMs","canRunPeriodicFull","runFull","maxUpdateFps","fps","rankedCount","previousConfig","run","hover","topoNode","topoEdge","sizeVersion","stateVersion","labelVersion","positionVersion","selectedNodes","visible","pinnedNodes","seen","selectedSet","selected","configuredSource","projectionType","zoom","semanticScale","nodeOutlines","nodeSizeBase","nodeSizeScale","nodeOutlineBase","nodeOutlineScale","rawSize","rawOutline","fullSize","worldRadius","edgePoint","radiusPx","minRadiusPx","sourceAccessors","formatted","labelX","labelY","nextVisible","serial","job","currentDataSignature","currentUniforms","currentViewSignature","scratchPoint","scratchCenter","scratchOffset","pinned","hovered","score","occupied","labelW","labelH","prevVisible","selectedOnly","selectedOnlySpaceAware","sparseSelectedOnly","iterationNodeIndices","sparseSelectedSet","sparseSelected","selectedIds","maxVisible","heapCap","mustInclude","collisionCellPx","baseEntries","overlayEntries","existingIndex","visibleIds","offsets","packedIndex","fullView","maxFps","minIntervalMs","at","snapshots","configured","available","lowered","lower","accessors","categoryMap","dict","accessor","offsetPx","safeCenter","safeFactor","safeOffsetPx","maxChars","maxRows","lines","maxLineChars","acc","line","lineHeightPx","tokens","overflowed","pushCurrent","token","cellSize","pad","group","outlineLayer","fillLayer","fillPaint","outlinePaint","outlineNode","fillNode","nextText","lineHeightEm","firstDy","child","tspan","DEFAULT_FONT_FAMILY","DEFAULT_CATEGORICAL_OTHERS_LABEL","LEGEND_ORDER","LEGEND_SLOT_DEFAULTS","GUIDE_VALUES","NUMBER_FORMATTERS","normalizeInsets","normalizeLegendClickAction","rgbaArrayToCss","fontSize","truncateLine","sanitizeExponential","isNearlyInteger","epsilon","approximatelyEqual","wrapTextLines","safeMaxChars","safeMaxRows","formatNumber","stepHint","abs","safeStep","precision","decimals","maximumFractionDigits","formatter","stableLegendJson","dedupeTicks","ticks","scheduleAfterPaint","cancelled","frameId","timerId","scheduleTimer","niceStep","span","safeSpan","generateNiceTicks","desiredCount","continuousTickValues","divergent","continuousTickLabels","safeTicks","tick","computeNodeSizeLegendPreview","runtime","distance","pixelFactor","safeRange","scalarSampleValues","omitZeroMin","readableMinRatio","domainMin","domainMax","low","high","inferLabelFromAttributes","first","normalizeLegendTitles","titles","resolveLegendTitle","fallbackTitle","override","primaryAttributeName","categoricalLegendEntries","attributeName","labelsById","hasOthers","dictionary","numericValue","combineMapperChannels","collection","normalizePlacementValue","stringValue","normalizePlacements","placements","withAlpha","legendMetrics","maxScale","baseScale","lineHeight","continuousHeight","resolveLegendStrokeScale","metrics","resolveTextOutlineStrokeWidth","baseFontSize","createContinuousLegendRampHref","setSvgPaintAttributes","paint","opacityAttr","safeRectFromSize","appliedInsets","layoutAnchoredLegends","safeRect","margin","gap","groups","positioned","placement","slotItems","totalHeight","cursorY","itemX","deriveLegendItems","densityConfig","densityRuntime","legendRuntime","edgeColorSource","pushColorLegend","pushScalarLegend","shape","logRatioMode","logRatioZScore","diverging","baselineLabel","lowLabel","highLabel","densityDomain","tickLabels","layoutLegendItems","measured","titleLines","titleWidth","maxLabelWidth","totalEntryHeight","labelWidth","titleHeight","scalarSampleCount","sampleLabels","visualWidth","titleText","titleSpan","tickWidth","titleColumn","rightClearance","strokeOverflow","SvgLegendController","previousClickAction","includeRuntimeCamera","updateInputSignature","background","luminance","fill","fontWeight","anchor","baseline","rotation","fontStyle","appended","outlineText","defs","rootGroup","theme","legendGroup","panel","interactive","suppressClick","handleEnter","handleLeave","rowHeight","hit","rowWidth","singleLine","firstLineCenterY","rowCenterY","swatchY","swatch","signatures","stroke","matches","idRaw","edgeRaw","pending","valid","strokeScale","hasTitle","barX","barY","barHeight","href","image","gradientId","gradient","stop","bar","barOuter","barInner","tickStart","tickEnd","tickOutline","tickLine","labelFontSize","minRange","maxRange","previewBase","previewScale","rangeSpan","maxRadius","minRadius","sizeSources","sourceMin","sourceMax","sourceSpan","radii","maxCircleRadius","radiusLimitByWidth","radiusLimitByHeight","radiusScale","scaledRadii","scaledMaxRadius","visualTop","baselineY","circleCx","drawEntries","labelEntries","labelSlots","circle","connector","lineLength","topY","lineY","nextStrokeWidth","titleY","FILTER_SCOPE_NODE","FILTER_SCOPE_EDGE","GRAPH_FILTER_SCOPE_RENDER","GRAPH_FILTER_SCOPE_RENDER_LAYOUT","FILTER_TYPE_NUMERIC","FILTER_TYPE_STRING","FILTER_TYPE_CATEGORICAL","FILTER_TYPE_QUERY","STRING_OPERATORS","FILTER_TYPES","filterRuleIdCounter","isFilterScope","normalizeFilterScope","normalizeGraphFilterScope","normalizeStringOperator","toQueryNumber","quoteQueryString","escapeRegex","compileNumericRule","extentMin","extentMax","compileStringRule","operator","pattern","compileCategoricalRule","inputValues","compileRawQueryRule","compileRuleToQuery","normalizeRule","nextRule","cloneRule","HeliosFilter","initialRules","existingRuleId","ruleId","queries","query","nodeQuery","edgeQuery","toFiniteNumber","resolvePackedVec3Count","getTextureLayout","maxTextureSize","safeMax","matrixHasFiniteValues","LOG_RATIO_AUTO_SUPPORT_FLOOR_MULTIPLIER","LOG_RATIO_AUTO_SUPPORT_CEIL_MULTIPLIER","resolveLogRatioSupportWindow","maskThreshold","safeEpsilon","explicitFloor","autoFloor","floor","ceil","resolveDensityBandwidthViewport","cameraViewport","SPLAT_VERT_WEBGL","SPLAT_FRAG_WEBGL","FULLSCREEN_VERT_WEBGL","COMPOSITE_FRAG_WEBGL","COMPOSITE_LOG_RATIO_FRAG_WEBGL","SPLAT_WGSL","COMPOSITE_WGSL","COMPOSITE_LOG_RATIO_WGSL","normalizeComparisonMode","hasComparisonTarget","compareProperty","resolveCompareProperty","property","propertyKey","compareKey","resolveComparisonMode","defaultDensityConfig","normalizeInteractionFilter","DensityLayer","wasZoomScaled","zoomRaw","computed","requiredCount","nextRequired","ptr","compareEnabled","needsEdgeIndices","useWasmNodeWriter","useWasmEdgeWriter","fallbackNodeIndices","fallbackEdgeIndices","overflowRequest","attempt","nodeScratch","edgeScratch","focusedNodeIndices","focusedCount","highlighted","focus","primaryReader","compareReader","totalWeight","totalNegative","totalPositive","compare","totalPositiveMax","totalNegativeMax","colormapKey","numeratorWeights","denominatorWeights","numeratorReader","baselineKey","denominatorReader","numeratorTotal","denominatorTotal","numerator","denominator","propertyName","attrBuffer","edgeIndicesOverride","edgeVersion","usesOverride","supplied","fallbackCount","corners","integer","textureKey","fboKey","widthKey","heightKey","ok","colormapName","versionTag","nextLayout","sameLayout","usedTexels","rowValueCount","delegatePositionSource","positionInfo","currentPositionVersion","requiredPositionCount","sharedTex","sharedPositionCount","sharedVersion","hasCurrentVersion","versionMatches","countMatches","layoutKey","metaKey","weightKey","weightTexture","weightLayout","densityWidth","densityHeight","bandwidthViewport","positionBinding","splatBandwidth","densityResolutionViewport","indexKey","prevBlendEnabled","prevDepthEnabled","renderState","supportWindow","splatModule","compositeModule","compositeLogRatioModule","splatLayout","compositeLayout","compositeLogRatioLayout","sharedBuffers","sharedIndices","sharedPositions","sharedPositionVersion","positionVersionMatches","useSharedIndices","useSharedPositions","indexBuffer","cameraData","compositePipeline","compositeBindGroup","numeratorBuffer","denominatorBuffer","numeratorBindGroup","denominatorBindGroup","compositeData","weightsBuffer","resolveDockTarget","dock","computeDockMode","containerWidth","containerHeight","threshold","computeResizedWidth","startClientX","minWidth","maxWidth","baseWidth","normalizePanelToken","resolvePanelIconKind","title","createPanelIcon","doc","iconKind","addPath","extra","path","BaseHTMLElement","HeliosPanelElement","prop","heading","panelId","collapsed","content","defineHeliosWebComponents","docOrWin","defined","DEFAULT_POSITION","DEFAULT_DOCK_THRESHOLD","DEFAULT_MIN_WIDTH","Panel","e","zIndex","side","containerRect","panelRect","rawOffsetX","rawOffsetY","offsetX","offsetY","numericSize","headerRect","headerHeight","minHeaderVisibleWidth","numericX","numericY","allowDock","keepFree","STACK_DRAG_EDGE_SCROLL_PX","STACK_DRAG_SCROLL_STEP_PX","COMPACT_MIN_GRAPH_VIEWPORT_PX","PanelManager","panelRef","panels","panelState","leftOrder","rightOrder","resizedWidth","forceFree","sourcePanel","nextWidth","candidateWidth","panelMinWidth","leftWidth","presentation","compactPanels","panelTarget","targetA","targetB","visibilityState","dockEl","dockRect","dropLine","preview","previewRect","pointerOffsetX","pointerOffsetY","previewOffsetX","previewOffsetY","dragAnchorRatioX","dragAnchorRatioY","pointerY","children","insertBefore","midpoint","header","dockWidth","maxFromDock","compactWidth","panelElement","before","leftRect","rightRect","pointerId","fromSizePx","toSizePx","from","to","sizePx","ratioValue","cb","minPx","maxPx","paddingPx","titleEl","referenceElement","ctx","normalizeRange","UIAttribute","readOnly","DEFAULT_STYLE_ELEMENT_ID","defaultStylesText","ensureDefaultStyles","DEFAULT_UI_SLIDER_FPS","nowMs","createFpsThrottle","safeCallback","intervalMs","timeoutId","lastInvokeTime","pendingArgs","pendingThis","clearScheduled","invokePending","schedulePending","remainingMs","throttled","createDefaultPersistenceIndicator","indicator","clampToRange","minNumber","maxNumber","createSliderRow","hint","fallbackRange","sliderRange","inputMin","inputMaxOverride","inputMax","inputRange","labelTitle","labelTitleText","dirtyIndicator","tooltip","tooltipRoot","hideTooltipTimer","removeTooltipListeners","setTooltipHidden","hidden","resolveTooltipRoot","placeTooltip","el","vw","vh","tipRect","preferredLeft","preferredTop","fallbackTop","scheduleHideTooltip","showTooltip","tooltipId","onPointerEnter","onPointerLeave","onFocus","onBlur","onKeyDown","onScrollOrResize","controls","valueInput","slider","updateSliderVisual","pct","updateFromAttribute","unsub","writeSliderValue","nextValue","commitTypedValue","eventName","createAlignedRowEl","attachTooltip","rowClass","className","titleRowEl","controlWrap","SuggestedSliderControls","suggested","onCommit","set","commitSliderValue","onSliderInput","onSliderChange","onInputChange","onInputKeyDown","normalizePath","stateForPath","dirtyState","resetScope","resolvePersistenceState","stateManager","closeOpenMenus","menu","resolveMenuRoot","createDirtyIndicator","hasPath","nextState","buildMenu","addItem","onClick","resetTarget","close","stateTarget","unsubscribeState","createTooltipManager","cleanups","anchorEl","cleanup","createToggleControl","checked","disabled","onLabel","offLabel","ariaLabel","button","thumb","labels","currentChecked","sync","nextAriaChecked","commitToggle","nextChecked","on","off","previousText","createSegmentedToggleControl","offButton","onButton","currentDisabled","setChecked","activateOption","handleKeydown","handleOptionPointerUp","createSelectControl","compact","select","setOptions","option","FALLBACK_DIRECTION","EPSILON","normalizeDirection","clampUnitDisk","formatComponent","number","createSvgElement","createLightDirectionControl","equator","meridian","handleGroup","handle","axisArrow","backHandleGroup","backHandle","fields","readDirection","writeDirection","currentDirection","activeAxisSign","px","py","nx","ny","screenAngle","backScreenAngle","flatten","pointerToUnitDisk","resolveAxisSign","frontDistance","directionFromPointer","axisSign","writePointerDirection","draggingPointerId","onPointerDown","onPointerMove","onPointerUp","onPointerCancel","commitInputs","unsubscribe","div","appendResolved","PanelStack","headerRow","toggle","headerControls","body","resolveVariantClassName","cleaned","TabbedPanel","tabs","tab","tabId","normalizeKey","normalizeLabel","LABEL_ACRONYMS","humanizeControlLabel","itemKey","collectItemKeys","resolvePanelItemLabel","itemLabel","entryLabel","normalizePanelSchema","sections","section","panelSchemaKeys","panelSchemaStatus","sectionStatuses","changedSections","partialSections","populatedSections","panelSchemaSectionKeys","sectionId","panelSchemaSectionStatus","statuses","createPanelSchemaIndicator","schemaKeys","stateUnsubscribers","SCENE_PANEL_SCHEMA","LABELS_PANEL_SCHEMA","LEGENDS_PANEL_SCHEMA","MAPPERS_PANEL_SCHEMA","FILTERS_PANEL_SCHEMA","LAYOUT_PANEL_SCHEMA","SELECTION_PANEL_SCHEMA","TwoHandleRange","allowRangeDrag","track","rangeEl","aInput","bInput","clampTo","snappedMin","snappedMax","setVisual","loPct","hiPct","seedLo","seedHi","lo0","hi0","emitChange","emitCommit","commit","flushCommit","committed","onRangePointerDown","domainSpan","startX","startA","startB","startLo","startHi","clampRangeToBounds","nextLo","nextHi","shift","onMove","moveEvent","onUp","onAInput","onBInput","onAChange","onBChange","defaultFormat","digits","clampFinite","LogSliderControls","minExp","maxExp","stepExp","minValue","maxValue","exp","safe","typed","sliderSource","actual","rgbaToCss","alphaOverride","gradientCache","colormapToCssGradient","stops","css","DEFAULT_GROUP_ORDER","fallbackGradient","thumbPlaceholderGradient","ColormapPickerControl","catalog","portalRoot","searchPlaceholder","groupOrder","formatDisplay","filters","onDocPointerDown","pendingPosition","schedulePosition","onDocScroll","onDisplayClick","onDisplayKeyDown","onSearchInput","onSearchKeyDown","onElementFocusOut","nextRoot","keyRaw","emit","render","filtered","queryRaw","textMatches","note","matchesByGroup","capPerGroup","capTotal","observer","itemTitle","itemThumb","OFFSET","MARGIN","MIN_HEIGHT","MIN_WIDTH","MAX_WIDTH","MAX_HEIGHT","spaceBelow","spaceAbove","spaceRight","spaceLeft","targetW","desiredW","desiredH","canVertical","preferBelow","canHorizontal","preferRight","bottomLimit","availableH","stableH","seedQuery","clampNumber","clampedMin","clampedMax","hexToRgb01","toHex8","hex6","alpha01","aa","isPublicAttributeName","shallowCloneChannelConfig","DIVERGING_D3_COLORMAPS","DIVERGING_CMASHER_COLORMAPS","isDivergingColormapKey","canonical","buildColormapCatalog","pushEntry","searchExtras","safeLabel","terms","alias","byGroup","byKey","resolveCategoricalPaletteCatalogGroup","shouldShowCategoricalPaletteEntry","preferScheme","resolveCategoricalDefaultPalette","buildCategoricalPaletteCatalog","isScheme","isHexColorString","rgbaToHex8","colorFromIndex","naturalCompare","re","aParts","bParts","aNum","bNum","aIsNum","bIsNum","isSpecialNoneCategoryLabel","isSpecialNoneCategoryEntry","orderCategoricalEntries","sortOrder","manualOrder","maxCategories","byId","capped","regular","specialNone","visibleRegular","visibleSpecialNone","isNumericAttributeType","isIntegerAttributeType","isCategoricalAttributeType","isStringAttributeType","MappersPanel","ui","mappersBehavior","net","showDistributions","tooltips","createAlignedRow","CHANNEL_LABELS","MAPPER_TYPE_LABELS","colormapCatalog","categoricalPaletteCatalog","defaultCategoricalPalette","customPresetCounter","customPresetsByMode","getCustomPresetMap","modeMap","byChannel","isEditorTransferableConfig","rules","isEphemeralCustomPreset","registerCustomPreset","preferredName","baseId","ephemeral","pruneEphemeralCustomPresets","resolveVisualAlias","getAttributeInfo","rawName","isCompatibleAttribute","mapperType","targetMode","isEdge","edgeContext","isColorChannel","isPositionChannel","isScalarChannel","listAttributeNames","getNames","nodeRaw","unique","CONSTANT_SOURCE","LAYOUT_SOURCE","resolveSourceLabel","resolveSourceGroupLabel","appendGroupedSourceOptions","optgroup","opt","listMapperSources","inferSourceFromConfig","normalizeNodeSourceName","resolveAllowedTypesForSource","channelTypes","resolveBestTypeForSource","allowedTypes","isColor","isScalar","resolveCollection","computeScalarExtent","resolveName","integerType","minInt","maxInt","suggestDomainForAttribute","extent","CATEGORY_STRING_LIMITS","scanStringCategorization","uniques","maxLength","resolveCategoryDictionary","computeCategoryCounts","counts","unknownCount","resolveCategoryEntries","dictEntries","rawLabel","fallbackLabel","resolveCategoricalPalette","paletteName","suggestHistogramBins","bins","buildHistogram","maxCount","idxValue","createRangeHistogram","isIndex","histogram","minMarker","maxMarker","setMarkers","toPct","toLeft","ensureUiMeta","markDomainAuto","uiMeta","suggestRangeForChannel","isFiniteNumberPair","suggestStepForRange","isInteger","magnitude","isPercentileTransform","formatTransformLabel","normalizeClampSetting","resolveDivergentDomainFromSlider","prevAbs","loAbs","hiAbs","loChanged","hiChanged","resolveLiveConfig","applyConfig","createModeTab","createSubsectionHeader","wrap","divider","editorBody","applyRow","revertButton","applyButton","canApplyPending","rawType","isArrayLike","srcOk","dstOk","domainOk","rangeOk","syncApplyEnabled","setDirty","dirty","resolveAllowedTypes","localControls","registerControl","control","destroyControls","extractScalarForRule","buildRulePredicate","op","rhsRaw","rhs","vRaw","normalizeRuleList","createRuleKeyword","createHex8ColorEditor","showAlphaLabel","swatchWrap","colorInput","alphaInput","alphaLabel","rawValue","baseHex","alphaHex","renderEditor","live","hasLayout","layoutState","layoutEnabled","channelAllowedTypes","currentSourceCandidate","selectedSource","sourceSelect","customPresets","currentKey","pendingType","typeSelect","availableKeys","buildPendingForType","nextType","prevSource","sourceChanged","sourceNodeAttribute","prevDomain","liveDomain","prevRange","liveRange","hasDomain","nextMeta","categorical","setPendingType","nextAllowed","pendingTypeKey","isPosition","description","descEl","srcEl","fromAttributes","endpointsSelect","optInfo","bare","minAllowed","maxAllowed","suggestMin","suggestMax","isEdgeSplitCapable","pendingValue","isSplit","endpoint","labelStyle","srcSeed","srcValue","sourceLabel","srcControls","dstSeed","dstValue","targetLabel","dstControls","seeded","makeNum","xInput","yInput","zInput","seedSingle","makeColorControls","getValue","setValue","labelEl","liveColor","transformWrap","transformSelect","optVal","resolvedTransformType","powerInput","prevType","nextPending","domainWrap","domainAttr","percentile","isIntegerDomain","domainHistogram","domainValues","commitDomainTyped","loSlider","hiSlider","rangeWrap","suggestedRange","sliderMin","sliderMax","stepOut","rangeSlider","rangeValues","commitRangeTyped","advanced","defaultWrap","defaultInput","defaultSeed","clearDefault","rulesWrap","rulesList","renderRulesList","condRow","opSelect","ops","rhsInput","outInput","rhsVisible","getLiveSpec","commitRule","nextSpec","predicate","nextRules","ifLabel","remove","outWrap","addRuleButton","overridesSection","advancedStack","ensureCategoricalMeta","updatePendingMeta","getCategoricalSettings","metaNow","categoricalNow","paletteNameNow","preferSchemeNow","sortOrderNow","rawMax","parsedMax","maxCategoriesNow","attrInfo","scan","convertButton","entriesRaw","pendingDomain","pendingRange","entryIds","hasMissing","hasNew","currentVisibleEntries","hasHiddenEntries","specialNoneVisible","regularVisible","specialNoneNotLast","seenSpecialNone","needsSpecialNoneRebuild","AUTO_MAX_CATEGORIES","resolveMaxCategories","cap","buildOrderedEntries","numericStep","resolveNumericSettings","buildNumericPalette","applyOrdering","forcePalette","currentDomain","currentRange","colorById","palette","orderSelect","orderOptions","maxWrap","maxInput","buildFullWidthControl","alignRight","applyPaletteButton","paletteEntries","paletteCatalog","palettePicker","paletteDisplay","paletteDisplayLabel","palettePreview","palettePopover","palettePopoverPanel","paletteHeader","paletteSearch","palettePreferScheme","paletteFilterBar","schemeFilterButton","syncSchemeFilterButton","paletteList","paletteCleanups","registerPaletteCleanup","paletteToCssGradient","resolvePaletteDisplay","selectedPaletteName","updatePalettePreview","applyPaletteUi","setSelectedPalette","paletteObserver","ensurePaletteObserver","previewPalette","renderPalettePopover","paletteOffset","paletteMargin","paletteMinHeight","paletteMinWidth","paletteMaxWidth","paletteMaxHeight","positionPalettePopover","maxH","closePalettePopover","onPaletteDocPointerDown","pendingPalettePosition","schedulePalettePosition","onPaletteDocScroll","onPaletteResize","openPalettePopover","onPaletteDisplayClick","onPalettePreviewClick","onPaletteDisplayKeyDown","onPaletteSearch","onSchemeFilterClick","onPaletteSearchKeyDown","onPaletteFocusOut","orderedEntries","labelWrap","countEl","valueEditor","nextDomain","nextRange","buttons","down","move","hiddenCount","othersCount","othersRow","othersLabelWrap","othersLabel","othersCountEl","othersEditor","othersSpacer","listWrap","distributeButton","categoriesSection","sectionBody","topRow","numericMin","numericMax","numericDirection","minInput","updateNumericRange","minVal","directionSelect","ascOpt","descOpt","numericRow","colormapPicker","allowDivergent","extentAbs","divergentInput","clampState","clampMinInput","clampMaxInput","alphaSeed","alphaControls","commitClamp","nextClamp","nextDivergent","fallbackDomain","defaultEditor","outRow","resetPendingFromLive","setChannel","refreshFromLiveIfClean","attrSelect","outlineCfg","outlineColorCfg","outlineType","outlineColorType","bothConstant","updateAutoDomainFromNetwork","networkAttributeUnsub","attachNetworkAttributeListeners","unsubs","onNetworkReplaced","createDensityTab","createCheckboxControl","onChangeHandler","listDensityAttributes","applyDensity","isLogRatioMode","hasDensityComparison","resolveDensityPickerColormap","listDensityCompareAttributes","DENSITY_INTERACTION_FILTERS","RESOLUTION_PRESETS","autoBackground","manualBackgroundColor","densityBackgroundApplied","normalizeColormapSample","getDensityZeroColor","readCurrentBackgroundColor","shouldApplyDensityBackground","captureManualBackground","restoreManualBackground","applyDensityBackground","toResolutionIndex","bestIndex","bestDistance","dist","setRowEnabled","setRowVisible","enabledToggle","reliefToggle","autoBackgroundToggle","propertySelect","compareSelect","comparisonModeSelect","modeRow","normalizeToggle","normalizeRow","bandwidthControl","zoomScaleToggle","weightControl","weightRow","epsilonControl","epsilonRow","logRatioRangeControl","logRatioRangeRow","zScoreToggle","zScoreRow","supportCorrectionToggle","supportCorrectionRow","resolutionWrap","resolutionSlider","resolutionLabel","setResolutionIndex","clampedIndex","interactionFilterSelect","refresh","nextProperty","currentCompare","nextCompareOptions","compareAttrs","hasComparison","ensureOptionList","activeColormap","nodeTab","edgeTab","densityTab","activeMode","channelSelect","getActiveTab","syncChannelSelect","CURRENT_POSITION_ATTRIBUTE","formatDisplayNumber","formatBindingValue","resolveFiniteBound","fallbackNumeric","usesLogScale","scopeForStatePath","collectStateKeys","stateKeyMatchesTarget","layoutEventTargetsPath","formatInputNumber","formatHistoryValue","resolveHistoryBound","bound","buildSparklinePath","transformed","boundMin","boundMax","createPlayIcon","createPauseIcon","createStatusSpinnerIcon","subscribe","LayoutPanel","layoutBehavior","placeholder","controlsByKey","parameterEntryCleanups","staticIndicatorCleanups","currentDescriptorKey","lastChoiceSignature","lastPositionChoiceSignature","selectedPositionAttribute","getCurrentDescriptor","setText","setAttributeIfChanged","setDatasetIfChanged","setDisplayIfChanged","layoutSelect","positionAttributeSelect","statusControls","statusVisual","statusSparkline","statusSparklinePath","statusTempLabel","statusBadge","statusSpinner","statusText","runButton","runButtonIconWrap","pauseOnInteractionToggle","bindingsRoot","statusBinding","statusHistory","lastStatusSampleAt","persistenceScopeForLayoutPath","storageEntryForKey","storageValueForKey","bindingTypeForStorage","bindingLabel","bindingUiForStorage","registerLayoutPersistenceKey","debounceMs","registerOptions","createStateIndicator","indicatorScope","resolvedIndicatorScope","persistLayoutValue","registerLayoutParameterEntry","notify","changedKey","changedKeys","restored","syncLayoutParameterEntries","trackStaticIndicator","layoutRow","sourceRow","runRow","pauseOnInteractionRow","syncLayoutChoices","choices","choice","syncPositionChoices","desiredValue","nextSelected","refreshRunState","dynamic","running","stoppable","nextActionLabel","refreshPauseOnInteraction","resetStatusHistory","initialValue","commitBindingValue","parameterPath","runState","refreshStatusBinding","sampleStatusBinding","sampleMs","addBindingRow","destroy","createParameterIndicator","sparkline","history","renderHistory","lastAt","display","logControls","linearControls","previousDestroy","rebuildBindings","suppressRunButtonClick","activateRunButton","refreshBindingValues","sampleBindingValues","applySelectedPositionAttribute","unsubscribers","EVENTS","refreshMs","refreshTimer","sampleTimer","originalDestroy","LEGEND_CONTROL_HINTS","normalizeSchemaItem","LegendsPanel","legendsBehavior","createIndicator","createRow","persistencePath","built","valueForKey","writeKey","subscribeKey","unsubscribeStorage","createToggleFromSchema","createNumberFromSchema","createControlFromSchema","controller","AUTO_FIT_FREQUENCY_MIN","AUTO_FIT_FREQUENCY_MAX","AUTO_FIT_INTERVAL_MIN_MS","AUTO_FIT_INTERVAL_MAX_MS","CAMERA_MOVE_SYNC_INTERVAL_MS","createTrailingThrottle","delayMs","lastArgs","lastThis","invoke","resolveCameraBasis","forward","orbitAxisViewToWorld","viewAxis","updateSliderBounds","frequencyToIntervalMs","intervalMsToFrequency","createRowAppender","container","tooltipManager","CameraPanel","appendTopRow","persistCameraControl","shouldTrackCameraPoseOverride","origin","persistCameraPose","distanceControls","distanceRow","sectionStack","autoFitToggle","autoFitBody","appendAutoFitRow","intervalControls","fitButton","targetNodeIndices","animationToggle","animationBody","appendAnimationRow","durationControls","orbitToggle","orbitBody","appendOrbitRow","orbitSpeedControls","orbitAxisView","orbitAxisReferenceBasis","lastOrbitEnabled","commitOrbitAxis","orbitAxisControl","syncDistanceControl","poseOverride","syncDistanceControlThrottled","distanceLabel","orbitEnabled","orbitSectionItem","FILTER_IDENTIFIER_RE","FILTER_RANGE_EPSILON","warnUiDerivationFailure","parseCsvValues","formatCompactCount","suggestStepFromExtent","formatRangeInputValue","clampRangeToExtent","loRaw","hiRaw","rangesClose","createRuleShell","kindLabel","removeTestId","onRemove","removeButton","createAttributeRuleEditor","addPlaceholder","onDirty","testIds","rulesHost","addSelect","markDirty","getNetwork","getFilterableAttributes","getInfo","getCategoryEntries","sourceEntries","countsById","countValues","computeNumericExtent","getBuffer","refreshAttributeSelect","none","setNumericRangeInUi","rebuildNumericRule","resetRange","removeRule","refreshCategoricalRuleValues","matching","syncCategoricalChecklist","createNumericRule","shell","valuesHost","commitFromInputs","createStringRule","operators","createCategoricalRule","listOption","textOption","listSelect","checklistHeader","actions","selectAll","clearAll","checklist","textInput","syncMode","isText","createQueryRule","queryInput","addRuleForAttribute","refreshFromNetwork","collectRules","DEFAULT_NODE_SELECTED_STYLE","DEFAULT_NODE_HIGHLIGHT_STYLE","DEFAULT_NODE_HOVER_STYLE","DEFAULT_EDGE_SELECTED_STYLE","DEFAULT_EDGE_HIGHLIGHT_STYLE","DEFAULT_EDGE_HOVER_STYLE","DEFAULT_OTHER_SELECTED_NODE_STYLE","DEFAULT_OTHER_SELECTED_EDGE_STYLE","DEFAULT_OTHER_HIGHLIGHT_NODE_STYLE","DEFAULT_OTHER_HIGHLIGHT_EDGE_STYLE","DEFAULT_AUTO_BACKGROUND_TONE_DISABLED","DEFAULT_AUTO_BACKGROUND_TONE_SELECTED","CURRENT_SELECTION_VALUE","appendSectionHeading","rgbaArray","rgbaToHexWithAlpha","hexWithAlphaToRgba","normalizeFiniteNumber","normalizeNonNegativeNumber","normalizeNodeStyle","normalizeEdgeStyle","normalizeAutoBackgroundTone","tone","resolveStringAttributeNames","resolvePreferredHoverLabelSource","SelectionPanel","selectionBehavior","hoverBehavior","labelsBehavior","selectionState","hoverState","defaultOtherSelectedNodeStyle","defaultOtherSelectedEdgeStyle","defaultOtherHighlightNodeStyle","defaultOtherHighlightEdgeStyle","clearNodeHover","clearEdgeHover","setSelectionBinding","refreshSavedSelectionOptions","clearSelection","selectionMessageEl","setSelectionMessage","runNodeSelector","nodeSelectorEditor","refreshStatus","expandSelectionToNeighbors","centerSelectedNodesOrNetwork","statusEl","actionsWrap","clearButton","expandButton","centerButton","autoReplaceToggle","selectorInterfaceCount","selectorStackEntry","getSelectorInterfaceCount","setSelectorCollapsed","updateSelectorSectionAvailability","interfaceCount","hasSelectors","selectorApplyWrap","nextInterfaceCount","savedSelectionWrap","savedSelectionSelect","saveSelectionButton","saveDialog","saveDialogTitle","saveDialogHint","saveDialogInput","saveDialogError","saveDialogActions","saveDialogCancel","saveDialogConfirm","closeSaveDialog","openSaveDialog","collectSavedSelectionAttributes","resolveSuggestedSelectionName","saveSelectionToAttribute","restoreSelectionFromAttribute","selectorBody","selectorButtonsWrap","addMatchesButton","replaceMatchesButton","interactionBody","nodeClickToggle","nodeHoverToggle","hoverAffectsOtherElementsToggle","renderOrderToggle","hoverConnectedEdgesToggle","highlightConnectedEdgesToggle","selectedConnectedEdgesToggle","edgeClickToggle","edgeHoverToggle","hoverLabelToggle","hoverLabelSourceSelect","createColorControl","hex8","sliderControls","colorControls","createNodeStyleSection","stateKey","changes","toneGetter","tonePatch","sizeControls","opacityControls","opacityRow","outlineControls","discardToggle","forceMaxAlphaToggle","tintControls","blendControls","autoColorToggle","autoMixControls","createEdgeStyleSection","widthControls","selectedBody","refreshSelectedNode","refreshSelectedEdge","hoverBody","hoverCopyToggle","hoverCopyNote","hoverStyleControls","refreshHoverNode","refreshHoverEdge","highlightBody","refreshHighlightNode","refreshHighlightEdge","normalBody","normalNote","refreshSelectedOtherNode","refreshSelectedOtherEdge","refreshHighlightOtherNode","refreshHighlightOtherEdge","refreshStyleControls","copyHover","styleBody","styleStack","stack","refreshHoverLabelOptions","preferred","FIGURE_EXPORT_PRESETS","PRESET_DIMENSIONS","formatWindowScale","getDefaultFigureExportPreset","windowDevicePixelRatio","dpr","resolveFigurePreviewRect","outputWidth","outputHeight","windowWidth","windowHeight","targetAspect","windowAspect","sanitizeFigureExportBaseName","normalizeFigureExportFormat","normalizeFigureExportFilename","filename","fallbackBase","normalizedFormat","resolveFigureExportPresetDimensions","safePreset","dynamicWindowMatch","resolveFigureExportSupersampling","resolveFigureLegendScale","resolveFigureRelativeOverlayScale","exportSize","viewSize","exportWidth","exportHeight","resolveFigureTransparentBackground","resolveFigureExportAlphaMode","getFigureExportCapability","safeSupersampling","maxBitmapDimension","maxTexture","maxRenderbuffer","resolveFigureExportOptions","requestedPreset","baseName","legendScale","transparentBackground","alphaMode","capability","dimensions","fallbackAspect","finalWidth","finalHeight","bitmapWidth","bitmapHeight","logicalWidth","logicalHeight","devicePixelRatio","renderScale","framebufferWidth","framebufferHeight","cropX","cropY","fitsCapability","resolveFigurePreviewThumbnailOptions","exportOptions","previewOptions","maxHeight","buildFigureExportPresetList","dynamicPresetId","presets","INTERFACE_CONTROL_RELEASE_MS","FULLSCREEN_OVERLAY_LEFT_INSET_PX","LOGGED_SYNC_FAILURE_KEYS","MAX_LOGGED_SYNC_FAILURE_KEYS","storageCapabilities","storageSupportsPersistentUI","capabilities","storageSupportsSessions","STATE_ACCESSOR_PATHS","STATE_ACCESSOR_DEBOUNCE_MS","BASELINE_REFRESH_IGNORED_OVERRIDES","stateScopeForPath","persistencePanelPathForId","normalizedId","normalizedTitle","stateDebounceForPath","clonePersistenceValue","stateValueSignature","resolveUiContainer","layerName","createStatChip","labelText","valueEl","stat","formatAttributeType","isHiddenAppAttributeName","createInterfaceIcon","HeliosUI","hasExplicitTheme","autoTheme","pendingUiState","dockMetricsUnsubscribe","hasBlockingOverride","overrides","latestStorage","latestStates","existingEntry","targetPath","hasDefaultValue","hasOverride","stateStore","writeOptions","trackOverride","previousSignature","nextSignature","interfaceState","report","win","fallbackIndicators","groupRecords","rowIndicators","createStaticIndicator","createGroupIndicator","setIndicatorState","syncGroupIndicator","registerRow","registerPanel","titleWrap","registerSubpanel","subpanel","registerSubtree","unregisterSubtree","record","refreshGroups","schedule","mutations","mutation","surface","compactDockToggle","fullscreenBar","launcherButton","fullscreenPanelNav","resumePrompt","resumeText","resumeActions","resumeButton","prompt","sessions","resumeSource","renderResumeMenu","resumeMenu","session","freshButton","date","chrome","manager","appendFrom","nav","scroller","waitForScroll","scrollerRect","clock","settleTimer","scheduleFinish","onScroll","previousTimer","timer","localScope","scopeId","explicitPanelId","host","activate","activateFromPointerDown","release","releaseImmediately","accessorName","storageAttribute","makeAttribute","behavior","behaviorId","mappedPersistencePath","attributeOptions","_value","panelSchema","statePathForAccessor","createHeaderControlsWithIndicator","themeRow","themeToggle","networkControls","fileInput","formatSelect","formatWarning","warningIcon","warningPath","loadButton","saveButton","makeIcon","loadIcon","saveIcon","syncIcon","loadText","saveText","syncContainer","syncStatus","syncControls","syncButton","autoSyncGroup","autoSyncLabel","autoSyncToggle","formatRelativeSyncTime","resolveNetworkPayloadSavedAt","savedAt","showNetworkFileActions","showPersistenceSync","showSessionTab","lastPersistenceStatusSignature","syncPersistenceStatus","statusOverride","networkData","failed","failureMessage","syncWarning","logSyncFailure","oldest","hasSavedAt","cleanSyncedText","lastSyncedText","networkPersistenceEnabled","autosyncDisabledReason","autosyncDisabled","syncPersistenceStatusForChange","networkStatus","cleanSaved","currentSessionLoadConfirmationInfo","sessionSync","currentSessionSyncPayloadOptions","hasSavedNetworkPayload","includeNetwork","showThemedConfirmationDialog","confirmLabel","cancelLabel","confirmClass","onConfirm","dialog","messageEl","detailEl","cancel","confirm","confirmOpenNetworkReplacement","showOpenNetworkConfirmationDialog","confirmed","confirmContinueWithoutSync","previousId","previousLabel","syncSummary","errorMessage","syncStatusInterval","loadedFormat","sanitizeBaseName","lastValidBaseName","downloadBlob","blob","url","nameBar","syncRow","nameInput","extEl","syncExtension","exportNameInput","exportFormatSelect","exportExtEl","commitBaseName","exporterBehavior","syncBaseNameFromHelios","nodesValue","edgesValue","typeValue","avgDegValue","refreshNetworkInfo","directed","networkTab","sessionTab","sessionHeader","currentSession","currentSessionLabel","currentSessionId","sessionActions","newSessionButton","refreshSessionsButton","sessionList","refreshSessionTab","currentId","empty","visibleSessions","isCurrent","updatedAt","thumbnailCapturedAt","thumbnailIsFreshForCurrent","thumbnail","details","compactUpdated","networkName","primaryName","updated","idLine","updatedLine","resume","sessionSource","deleteButton","rowActions","nickname","attributesTab","attributesHeader","attributesSummary","hiddenAttributesToggle","hiddenAttributesWrap","attributesTableWrap","attributesTable","attributesHead","attributesHeadRow","th","attributesBody","attributesEmpty","collectAttributeRows","includeHidden","rows","appendRows","rawNames","scopeCompare","renderAttributesTable","tr","td","exportTab","exportNameBar","presetSelect","customWidthInput","customHeightInput","customSizeWrap","supersamplingSelect","labelsToggle","legendsToggle","interfaceToggle","frameToggle","backgroundToggle","alphaModeControl","syncExportUi","exportLegendScale","legendScaleAttribute","legendScaleRow","exportButton","previewContent","previewViewport","previewImage","previewStatus","previewStack","previewEntry","previewPanel","previewExpanded","previewUrl","previewDirty","previewBusy","previewIgnoreRenderEvents","previewTimer","previewCaptureGeneration","previewSceneVersion","previewCapturedSceneVersion","previewCapturedSignature","clearPreviewUrl","setPreviewStatus","markPreviewDirty","renderPreviewSummary","refreshFigurePreview","figureTabActive","resolveFigureState","thumbnailOptions","generation","nextUrl","reject","prevUrl","startPreviewTimer","stopPreviewTimer","syncExportExtension","getExportCapability","pushExporterUiState","applyExporterStateToControls","exportFrame","syncPresetOptions","firstAvailable","syncExportFrame","isCustom","unsubscribeLegendScale","exportTabContent","file","nextBase","sanitized","saveOptions","attachAttributeListeners","storageManager","attributeEventsUnsub","unsubHandler","onAfterRender","unsubAfterRender","unsubResize","dataTabs","createRows","accessorNames","bind","createToggleRow","syncToggle","createSelectRow","syncSelect","rgba01ToHex6","hexToRgba01","applyBackgroundColor","appearanceBehavior","writeAccessorPersistenceValue","createColorWithAlphaControls","lastCommittedValue","createColorControls","createLabelSourceSelect","readNodeAttributeNames","currentRaw","currentUi","createLabelFontFamilyInput","bindAppearanceAccessor","appearanceAccessorSource","registerAccessorPersistenceKey","writeAppearanceAccessor","fallbackAccessorName","createAppearanceContent","wrapper","dimensionToggle","readSceneDimension","defaultSceneDimension","unbindSceneDimension","syncDimensionToggle","currentMode","unsubscribeMode","onModeChanged","modes","edgeTransparencyAttribute","modeSelect","syncEdgeMode","unsubscribeEdgeMode","createLabelsContent","labelsModeSelect","syncLabelsMode","unsubscribeLabelsMode","selectedOnlySpaceAwareToggle","syncSelectedOnlySpaceAware","unsubscribeSelectedOnlySpaceAware","selectedOnlySpaceAwareRow","syncSelectedOnlySpaceAwareVisibility","unsubscribeLabelsModeForSpaceAware","labelSourceControl","createAdvancedContent","syncSupersampling","unsubscribeSupersampling","nodeBlendRow","edgeDepthRow","edgeWidthClampRow","nodeEdgeStack","createShadedAppearanceContent","nodesRow","edgesRow","lightDirectionAttribute","lightDirectionControl","createAmbientOcclusionContent","qualityRow","ambientOcclusionDeviceType","supportsAmbientOcclusion","shadedEnabled","shadedToggle","syncShadedToggle","unsubscribeShadedToggle","ambientOcclusionToggle","ambientOcclusionEnabled","syncAmbientOcclusionToggle","unsubscribeAmbientOcclusionToggle","createEdgeAppearanceContent","edgeFastRow","adaptiveContent","enabledRow","fastDuringCameraRow","fastDuringLayoutRow","adaptiveStack","appearanceTab","sceneTabs","dataPanel","scenePanel","FILTER_SCOPE_RENDER","FILTER_SCOPE_RENDER_LAYOUT","updateIntervalMs","filterBehavior","applyTimer","lastApplyAt","clearApplyTimer","applyFilterNow","layoutCheckbox","nodeEditor","edgeEditor","minComponentControls","scheduleApply","tabBarFilterHost","syncTabBarFilterForActiveTab","minComponentRow","layoutWrap","syncScopeFromFilter","minComponentSize","onFilterChanged","unsubNetwork","unsubFilter","unsubBehavior","tooltipCleanups","formatCompactNumber","sigDigits","createLinearSliderRow","clampInput","write","sliderValue","createLogSliderRow","writeFromSlider","defer","ms","makeValue","createStat","setDisabled","setProgressActionButtonState","isRunning","normalizeDimensionMethod","maxOrderForDimensionMethod","method","maxFiniteArrayValue","summarizeFiniteValues","markMetricOutputDirty","metricName","styleStatusHint","reportMeasurementError","err","reportErrorFailure","normalizeNeighborDirection","normalizeStrengthMeasure","normalizeClusteringVariant","isNumericEdgeWeightType","createDirectionSelect","testid","edgeWeightSelects","createEdgeWeightSelect","degreeDirectionSelect","degreeOutAttrInput","degreeCalcButton","degreeStatusEl","degreeStats","degreeMaxValue","degreeMeanValue","degreeElapsedValue","degreeAdvanced","degreeInnerStack","strengthDirectionSelect","strengthMeasureSelect","strengthWeightSelect","strengthOutAttrInput","strengthCalcButton","strengthStatusEl","strengthStats","strengthMaxValue","strengthMeanValue","strengthElapsedValue","strengthAdvanced","strengthInnerStack","clustering","clusteringDirectionSelect","clusteringVariantSelect","clusteringWeightSelect","clusteringOutAttrInput","clusteringCalcButton","clusteringStatusEl","clusteringStats","clusteringMaxValue","clusteringMeanValue","clusteringElapsedValue","clusteringAdvanced","clusteringInnerStack","eigenvector","eigenvectorDirectionSelect","eigenvectorWeightSelect","eigenvectorMaxIterationsInput","eigenvectorToleranceInput","eigenvectorOutAttrInput","eigenvectorCalcButton","eigenvectorStatusEl","eigenvectorMaxIterationsRow","eigenvectorToleranceRow","eigenvectorProgressWrap","eigenvectorProgressEl","eigenvectorProgressPct","eigenvectorProgressRow","eigenvectorStats","eigenvectorMaxValue","eigenvectorEigenvalueValue","eigenvectorElapsedValue","eigenvectorAdvanced","eigenvectorChunkIterationsInput","eigenvectorChunkIterationsRow","eigenvectorYieldMsInput","eigenvectorYieldRow","eigenvectorInnerStack","betweenness","betweennessWeightSelect","betweennessNormalizeCheckbox","betweennessOutAttrInput","betweennessCalcButton","betweennessStatusEl","betweennessProgressWrap","betweennessProgressEl","betweennessProgressPct","betweennessProgressRow","betweennessStats","betweennessMaxValue","betweennessSourceCountValue","betweennessElapsedValue","betweennessAdvanced","betweennessSourceChunkInput","betweennessSourceChunkRow","betweennessYieldMsInput","betweennessYieldRow","betweennessInnerStack","leiden","weightSelect","resolutionInput","seedInput","maxLevelsInput","maxPassesInput","outAttributeInput","calcButton","resolutionRow","leidenStats","modularityValue","communityValue","elapsedValue","progressWrap","progressEl","progressPct","progressRow","seedRow","levelsRow","passesRow","yieldMsInput","timeoutMsInput","chunkBudgetInput","leidenInnerStack","dimensionMethodSelect","dimensionMethodValue","dimensionMaxLevelInput","dimensionOrderInput","dimensionOutMaxAttrInput","dimensionOutLevelsAttrInput","dimensionSaveLevelsCheckbox","dimensionLevelsEncodingSelect","initialLevelsEncoding","dimensionLevelsPrecisionInput","dimensionCalcButton","dimensionStatusEl","dimensionMethodRow","dimensionMaxLevelRow","dimensionOrderRow","dimensionStats","dimensionGlobalMaxValue","dimensionSelectedCountValue","dimensionElapsedValue","dimensionProgressWrap","dimensionProgressEl","dimensionProgressPct","dimensionProgressRow","dimensionAdvanced","dimensionPrecisionRow","dimensionYieldMsInput","dimensionTimeoutMsInput","dimensionChunkBudgetInput","dimensionInnerStack","leidenRunning","leidenAbortController","dimensionRunning","dimensionAbortController","degreeRunning","strengthRunning","clusteringRunning","eigenvectorRunning","betweennessRunning","eigenvectorAbortController","betweennessAbortController","metricsStack","setMetricSectionState","resetMetricSectionStates","setDegreeStatus","setDegreeRunning","nextRunning","setStrengthStatus","setStrengthRunning","setClusteringStatus","setClusteringRunning","setEigenvectorStatus","setEigenvectorProgress","setEigenvectorRunning","setBetweennessStatus","setBetweennessProgress","setBetweennessRunning","setLeidenStatus","setLeidenProgress","setLeidenRunning","setDimensionStatus","setDimensionProgress","setDimensionRunning","refreshDimensionOrderLimits","methodMaxOrder","currentOrder","refreshDimensionLevelEncodingControls","saveLevels","allowPrecision","refreshClusteringWeightControls","edgeWeightInfoWarnings","refreshEdgeWeightOptions","numericNames","autoStrengthWeight","userSelected","optNone","availableValues","refreshAll","cancelLeidenRun","cancelDimensionRun","cancelEigenvectorRun","cancelBetweennessRun","runDegree","outNodeAttribute","started","ended","runStrength","measure","runClustering","runEigenvector","maxIterations","chunkIterations","yieldMs","toleranceRaw","signal","processedIterations","currentValues","lastResult","remaining","stepIterations","stepDone","converged","iterations","writeMsg","runBetweenness","totalSources","processedSources","finalValues","runLeiden","resolution","maxLevels","maxPasses","outNodeCommunityAttribute","timeoutMs","chunkBudget","phase","level","maxL","maxP","communities","elapsedMs","runDimension","maxLevel","outNodeMaxDimensionAttribute","outNodeDimensionLevelsAttribute","dimensionLevelsEncoding","dimensionLevelsStringPrecision","processed","dmax","writes","windowMs","updateFrame","minutes","sessionId","scheduleUpdate","onStorageChange","createDetailEvent","Behavior","ACCESSOR_NAMES","ACCESSOR_NAME_SET","SOURCE_EVENT_NAMES","LEGACY_APPEARANCE_PATHS","keyMatchesTarget","appearanceEventTargetsEntry","entryKey","storagePath","eventPath","behaviorPath","APPEARANCE_CONTROL_LABELS","fallbackControlLabel","match","appearanceControlLabel","cloneSerializable","appearanceValueFromState","nodeStyle","edgeStyle","adaptiveQuality","shaded","ambientOcclusion","normalizeAppearancePatch","buildAppearanceSnapshot","AppearanceBehavior","storageKey","subscribeForEntry","inferType","accessorEntry","publicState","groupedEntry","silent","BehaviorContext","BehaviorManager","idOrBehavior","BehaviorRegistry","instance","STABLE_CONFIG_KEYS","clampPositiveInt","normalizePreset","normalizeConfigPatch","pickStableConfig","summarizeBehaviorState","fallbackEnabled","summarizeViewState","ExporterBehavior","dependency","nextConfig","request","legends","cloneRules","createFilterModel","normalizeMinComponentSize","summarizeFilter","graphFilter","FilterBehavior","nextModel","nodeRules","edgeRules","graphOptions","preferActiveModel","activeModel","NEUTRAL_NODE_NO_STATE_STYLE","NEUTRAL_EDGE_NO_STATE_STYLE","DEFAULT_SELECTION_FOCUS_MAX_ZOOM","DEFAULT_SELECTION_FOCUS_MIN_DISTANCE","DEFAULT_SELECTION_FOCUS_ZOOM_TOLERANCE","backgroundLuminance","resolveBackgroundColor","applyAutoBackgroundTone","backgroundColor","resolvedTone","mixAmount","isNeutralNodeStateStyle","isNeutralEdgeStateStyle","resolveBooleanAttributeNames","resolveHoverLabelValue","resolvedSource","DEFAULT_PICKING_OPTIONS","getSelectionState","getHoverState","ensureInteractionStateStyleDefaults","selectedNodeStyle","highlightedNodeStyle","selectedEdgeStyle","highlightedEdgeStyle","resolveOtherElementsMode","highlightUnion","resolveOtherElementsStyle","applyOtherElementsState","styles","applyHoverConnectedEdges","applySelectedConnectedEdges","needsNodeHoverTracking","needsEdgeHoverTracking","syncPicking","needsNodePicking","needsEdgePicking","pickingOptions","applyHoverLabelConfig","HoverBehavior","initialLabelsConfig","labelsConfig","bindingName","normalizeDockSide","normalizeResumePrompt","normalizeInterfaceSnapshot","resolveMode","numericWidth","InterfaceBehavior","previousMode","enteringDesktop","enteringFullscreen","leavingFullscreen","nextDockSide","includeResumePrompt","restoredPrompt","modeFromViewport","preferences","persistedDockSide","shouldShowRestorePrompt","promptSource","RANDOM_LAYOUT_POSITION_CHOICE","CAMERA_MOVE_EVENT","PAUSE_ON_INTERACTION_NODE_COUNT","PAUSE_ON_INTERACTION_RESUME_DELAY_MS","getLayoutDescriptor","getRendererLabel","getLayoutChoices","getLayoutRunState","graphSizeForInteractionPause","defaultPauseOnInteraction","normalizeOptionalBoolean","interactionNow","isManualCameraMove","buildLayoutInstance","snapshotLayoutBindingValues","bindingStateEntryType","LAYOUT_PARAMETER_LABELS","layoutParameterLabel","bindingStateEntryUi","layoutParameterStateEntries","snapshotLowLevelLayoutConfig","LayoutBehavior","previousRunState","onPointerEnd","onWheel","LEGEND_KINDS","cloneTitles","clonePlacements","cloneState","booleanKeys","scalarKeys","LegendsBehavior","changeOptions","defaultOn","readBoolean","numberDefaults","readNumber","booleanEntry","numberEntry","applied","normalizeMode","stringKeys","detailTargetsPath","createEntrySubscribe","LabelsBehavior","storageKeys","buildMapperRulePredicate","valueRaw","isSerializableRule","serializeRule","restoreRule","isSerializableChannelConfig","serializeChannelConfig","serializable","restoreChannelConfig","resetMapper","snapshotExistingChannels","restoreChannelSnapshot","channelSnapshot","fallbackSnapshot","serializeMapperCollection","mappers","defaultId","restoreMapperCollection","existingChannels","mapperSnapshot","fallbackChannels","desiredDefaultId","cloneMapperSnapshot","snapshotState","cloneCollectionSnapshot","cloneBehaviorState","getCollection","MAPPER_CHANNEL_ENTRIES","createSharedChangeSubscribe","listeners","MappersBehavior","optionsHasMapperConfig","channelConfig","sortedArray","collectUniqueIndices","selectionOptionStorageKeys","SelectionBehavior","selectedEdges","nextIndices","nextIndexSet","toAdd","toRemove","defineAttribute","nodeView","edgeView","nodeMatches","edgeMatches","shiftKey","isNodeHit","isEdgeHit","BEHAVIOR_IDS","createDefaultBehaviorRegistry","PERSISTENCE_SCHEMA","PERSISTENCE_SCHEMA_VERSION","PERSISTENCE_KINDS","isPlainObject","setAtPath","segments","flattenObject","prefix","VOLATILE_OVERRIDE_PATHS","VOLATILE_OVERRIDE_PREFIXES","CAMERA_POSE_OVERRIDE_PREFIXES","CANONICAL_BEHAVIOR_OVERRIDE_IDS","isPathWithinPrefixes","prefixes","isVolatileOverridePath","pruneVolatileOverrides","normalizeOverrideMap","normalizeResponsivePreferences","createDefaultPreferencesState","createDefaultUIState","createDefaultNetworkSource","normalizeVisualizationPayload","normalizeSessionPayload","visualizationState","migratePersistenceEnvelope","createPersistenceEnvelope","metadata","migratePreferencesPayloadV0","migrateVisualizationPayloadV0","migrateSessionPayloadV0","expectedKind","flattenVisualizationOverrides","behaviors","diffOverrideMaps","paths","diff","applyOverridesToVisualizationState","envelope","normalizedOverrides","serializePersistenceEnvelope","pretty","parsePersistenceEnvelope","queueTask","LocalStoragePreferenceStore","workspaceId","requestToPromise","transactionToPromise","tx","IndexedDBSessionStore","db","store","createMemoryStorage","createMemoryIndexedDBFactory","MemoryRequest","MemoryCursor","MemoryObjectStore","records","keyPath","MemoryTransaction","MemoryDatabase","databases","needsUpgrade","cloneStateValue","valuesEqual","valuesEqualInternal","isPlainSerializableObject","proto","typedArrayValuesEqual","bytesA","bytesB","seenForA","keysA","keysB","normalizeStateKey","joinStateKey","normalizeScope","normalizeType","isExplicitStateOverrideSource","normalizeStateChangeOrigin","defaultLike","keyMatchesSubscription","requestedKey","keyAliases","requested","assertStateEntryHasNoPlacement","normalizeStateEntry","localName","hasDefault","aliases","methodName","inferredGetterSetter","detailTargetsStateKey","detailHasStateKeys","HeliosStateManager","StateBindingController","actualOwner","actualPrefix","actualEntries","previousEntry","previousValue","ownerKeys","initial","bindingCleanup","overrideValue","restoredValue","keyOrPrefix","changedChildren","exactOverride","subscription","targetSubscriptions","subscriptions","StateTransaction","transaction","events","clonedValue","aliasList","bestAlias","bestKey","oldValue","hadOverride","valueChanged","serializedOverride","overrideChanged","ancestors","ancestor","cutoff","includeRecent","includeKeys","stateChangeCount","uiChangeCount","recent","addPrefixes","applyValue","shouldTrackOverride","estimateStoredByteLength","uint8ArrayToBase64","binary","chunkSize","chunk","decodeFloat32PositionPayload","encodeFloat32PositionPayload","STALE_POSITION_AUTOSAVE_CODE","DEFAULT_POSITION_COMPRESSION_MIN_BYTES","createStalePositionAutosaveAbort","isStalePositionAutosaveAbort","compressPositionBytes","compressionMinBytes","compressed","decompressPositionBytes","compression","normalizeSessionNickname","envelopeSessionId","envelopeUpdatedAt","sessionSummaryFromEnvelope","networkSource","byteStats","sessionStoredByteStats","payloadDataByteLength","finiteStoredByteLength","positionData","networkBytes","manifestBytes","normalizeUrlSessionRouting","ensureSessionIdInUrl","routing","param","DEFAULT_SESSION_SAVE_WARNING_MS","DEFAULT_SESSION_THUMBNAIL_MAX_WIDTH","DEFAULT_SESSION_THUMBNAIL_MAX_HEIGHT","DEFAULT_SESSION_THUMBNAIL_MAX_BYTES","DEFAULT_SESSION_THUMBNAIL_AUTOSAVE_MIN_INTERVAL_MS","DEFAULT_AUTOSYNC_INTERACTION_IDLE_MS","DEFAULT_SESSION_AUTOSYNC_MIN_INTERVAL_MS","DEFAULT_POSITION_AUTOSAVE_DEBOUNCE_MS","DEFAULT_AUTOSYNC_POSITION_MAX_BYTES","DEFAULT_MANUAL_POSITION_MAX_BYTES","DEFAULT_SESSION_SYNC_TIMING_LOG_MS","SESSION_ID_ALPHABET","DEFAULT_SESSION_ID_LENGTH","createRandomSessionId","crypto","isExplicitOverrideSource","isLegacyImplicitAppearanceOverrideSource","isAppearanceOverrideKey","sanitizeLegacyImplicitAppearanceOverrides","journal","resolveKey","entryForKey","appearanceKeys","pruneDefaultAppearanceClusterValues","lastEventByKey","mergeDeepObject","normalizeSessionThumbnailOptions","rawAutosaveMinIntervalMs","autosaveEnabled","normalizeNonNegativeMs","blobToDataUrl","reader","syncTimingNowMs","performanceNow","roundTimingMs","normalizePositiveByteLimit","normalizeAutosyncPayloadLimits","positionMaxBytes","defaultNodeLimit","isUserInteractionDetail","mergeCaptureThumbnailMode","mergeSessionAutosaveOptions","nextPositionDirtyVersion","pendingPositionDirtyVersion","SessionStore","parsed","nextRecord","networkRecord","positionRecord","networkRecordId","positionRecordId","split","hydrated","dataRef","positionDataRef","indexedIds","HeliosStorageManager","networkPersistence","positionPersistence","writePreference","responsivePatch","dirtyAt","positionDirtyVersion","suppressStartupOverride","explicitNodeCount","renderNodeCount","skip","alreadyBlocked","baseDelay","interactionAutosave","keepExistingPayloadTimer","autosyncSkip","alreadyReported","flushOptions","idleDelay","idleMs","rateDelay","deltas","requestedVersion","currentVersion","logKey","operation","queued","clearNetwork","clearPositions","networkDirty","positionsDirty","readState","cameraOptions","cameraState","cameraControlState","cameraControlEntries","layoutRuntimeState","existingRecord","storageState","legacyNetworkDirty","networkStillDirty","positionsStillDirty","dirtyAfterSave","previousNetworkSavedAt","deferDelay","stateDeltas","canWriteIncrementalState","timing","startedAtMs","totalMs","queueWaitMs","thresholdMs","includeNetworkData","persistenceChangeCount","persistenceChanges","syncing","oldestSave","lastError","capturedAt","gesture","existingEnvelope","existingThumbnail","explicitMaxPositionBytes","maxPositionBytes","snapshotStartedAtMs","runtimeState","decodeStartedAtMs","byteViewStartedAtMs","compressStartedAtMs","metadataStartedAtMs","runtimeMetadata","createdAt","networkFormat","snapshotLayoutRuntime","visualizationOptions","useTrackedVisualization","visualizationPayload","includePositions","resolvedNetworkData","resolvedPositionData","dataUrl","savedPositions","savedNetwork","requestedPositionDirtyVersion","savedCurrentPositionVersion","restoredPositionRuntimeState","restoredAutosyncSkip","layoutRuntime","snapshotOptions","restoredOverrides","missingIsError","explicitId","canCreateInitialSession","wrapped","saved","entryWorkspace","unfinishedId","unfinishedRecord","sessionIdOrRecord","nativeRecord","attached","hasIncludeNetwork","hasIncludePositions","hasCaptureThumbnail","DummyStorageManager","BrowserStorageManager","indexedDBFactory","RemoteStorageManager","client","createHeliosStorageManager","DEFAULT_CAMERA_FIT_NODE_RADIUS_WORLD","DEFAULT_LAYOUT_RUNTIME_POSITION_LIMIT_BYTES","UMAP_FORCE_FLAG_ATTRIBUTE","DEFAULT_UMAP_EDGE_WEIGHT_ATTRIBUTE","DEFAULT_UMAP_NODE_MASS_ATTRIBUTE","DEFAULT_UMAP_FORCE_OPTIONS","createPickingGestureState","isLayoutInstance","encodeFloat32ArrayBase64","decodeFloat32ArrayBase64","expectedLength","forEachIndex","visitor","parseNamespacedEventType","namespace","resolveStateMask","resolveStateSlot","normalizeColorInput","normalizeDirectionInput","cloneColorInput","arrayLikeValuesEqual","cameraPoseValuesEqual","arrayFields","scalarFields","knownFields","extraA","extraB","mergeOverlayInsets","cloneMapperCollection","serializeMapperCollectionState","serializeMapperCollectionSnapshot","inferNetworkFormatFromName","normalizeNetworkFileDropOptions","formats","hasOwnOption","hasOwnStringOption","DEFAULT_DARK_CLEAR_COLOR","DEFAULT_LIGHT_CLEAR_COLOR","normalizeThemeName","resolveThemeValueFromElement","resolveThemeValueFromDocument","roots","resolveContainerElement","resolveBrowserTheme","resolveInitialTheme","uiOptions","quickOptions","explicitTheme","containerElement","hasExplicitThemeOption","copyDefaultClearColorForTheme","normalizeInitialClearColorOptions","hasClearColor","hasBackground","shouldDisableAutoThemeDefault","shouldEnablePersistence","normalizeSessionPersistenceOptions","topLevelSessionId","normalizeStorageSessionId","CAMERA_CONTROL_STATE_KEYS","isExplicitCameraStateSource","isBehaviorLike","createBehaviorNamespace","behaviorAccessor","_target","_thisArg","receiver","elementToMarkup","normalizeExportPixels","flipY","swizzleBGRA","srcRow","col","srcOffset","dstOffset","red","green","blue","pixelsToCanvas","normalizedPixels","fullCanvas","fullCtx","outputCanvas","outputCtx","canvasToBlob","scaledCanvasThumbnailBlob","sourceCanvas","loadSvgImage","svgText","ILLUSTRATOR_EXPORT_FONT_FAMILY","resolveExportBackgroundColor","buildExportLogicalViewport","createMat4Identity","safeSignedDivisor","mat4Frustum","rl","tb","interpolateFrameBounds","liveViewport","liveWidth","liveHeight","u0","u1","derivePerspectiveBounds","projectionMatrix","m00","m11","m20","m21","deriveOrthographicBounds","m30","m31","normalizeTruthyNetworkFlag","normalizeForceModel","readNetworkAttributeValue","readNetworkStringAttributeValue","readNetworkNumberAttribute","resolveGpuForceLayoutOptionsFromNetwork","requestedOptions","explicitModel","enabledByGraph","skipTuningModelForEmbeddedGraph","requestedMassAttribute","normalizedMassAttribute","requestedPositionAttribute","normalizedPositionAttribute","umapHasInitialPositions","computeGpuForceModeSwitchDepthJitter","hasMeaningfulDepth","applyPlanarDepthJitter","resolveSeedBoundsForLayout","layoutOption","safeMode","minSide","opts","isNumericLayoutPositionAttributeType","getBaseFilename","withoutGtZst","withoutKnown","copyVec3","resolve2DCenterFromPose","pan","resolve3DCenterFromPose","estimate3DDistanceFrom2DZoom","tanHalfFov","estimate2DZoomFrom3DDistance","worldHeight","DEFAULT_MODE_SWITCH_DURATION_MS","DEFAULT_MODE_SWITCH_3D_ROTATION","CAMERA_FIT_DEFAULT_MAX_SAMPLES","CAMERA_FIT_DEFAULT_2D_ZOOM_MARGIN","DEFAULT_CAMERA_ANIMATION_DURATION_MS","LARGE_NETWORK_STARTUP_NODE_THRESHOLD","LARGE_NETWORK_STARTUP_EDGE_THRESHOLD","LARGE_NETWORK_STARTUP_SCALE","LARGE_NETWORK_STARTUP_DURATION_MS","LARGE_NETWORK_STARTUP_LAYOUT_DURATION_MS","STARTUP_DEFAULTS","QUICK_CONTROL_DEFAULTS","QUICK_CONTROL_HELIOS_URL","QUICK_CONTROL_ISSUE_URL","CAMERA_CONTROL_DEFAULTS","POSITION_INTERPOLATION_DEFAULTS","DENSITY_DEFAULTS","NETWORK_VISUALIZATION_STATE_ATTRIBUTE","hasDensityComparisonTarget","resolveDensityCompareProperty","resolveDensityComparisonMode","usesLogRatioDensityColormap","resolveDensityActiveColormap","EDGE_ADAPTIVE_QUALITY_DEFAULTS","EDGE_ADAPTIVE_LAYOUT_HYSTERESIS","normalizeNodeIndexList","normalizeReadbackNodeIndexList","resolveFloat32Out","copyReadbackPositionsFromView","centroidFromPackedReadback","normalizeOrbitAngleDegrees","normalizeCameraControlConfig","normalizePositiveInteger","normalizeStartupConfig","has","normalizeQuickControlsConfig","fallbackTheme","copyCameraControlConfig","swapNumericValue","medianIndexOfThree","selectKthNumericValue","pivotIndex","pivotValue","lt","gt","quantileFromValues","loValue","hiValue","quatNormalizeInto","quatMultiplyInto","transformDirectionByQuat","normalizeVec3Array","crossVec3Array","dotVec3Array","resolveCameraBasisForRotation","normalizeInterpolationMode","normalizeInterpolationDurationMode","normalizeInterpolationEasing","rounded","normalizeEdgeAdaptiveQualityConfig","resolveInterpolationDurationMode","applyInterpolationEasing","arePositionArraysEqual","mixPositionsArray","computePositionDisplacementRatio","maxDelta","maxMagnitude","GRAPH_FILTER_ALLOWED_OPTION_KEYS","normalizeGraphFilterOptions","hasGraphFilterCriteria","safeNumber","computeFilterTopologyVersion","baseVersion","filterVersion","bumpVersionCounter","Helios","previousState","woke","reheated","previousLayoutState","hasExplicitBackground","initialNetworkSource","initialNetworkName","initialNetworkBase","optionMappers","initialMappers","debugPerformance","performanceWindow","performanceLogEvery","requestedPositionDelegate","initialPositionDelegate","initialPositionSource","interpolationOptions","interpolationDurationMode","cameraControlOptions","densityEnabled","densityScale","densityTopographic","densityScaleWithZoom","densityNormalizeVs","densityComparisonMode","initialCompareProperty","initialProperty","sanitizedInitialCompareProperty","storageEnabled","storageConfig","storageSessionId","sessionOptions","layoutIterations","layoutDurationMs","nodeThreshold","edgeThreshold","overlay","spinner","gate","previousVisibility","hasIterationTarget","hasTimeTarget","iterationsReached","timeReached","backgroundKey","themeKey","nextTheme","observerTarget","addMediaListener","uiHasOverride","isObservedRemoval","subtitle","supported","replaceOptions","confirmNetworkLoad","existingUnsyncedConfirmation","confirmUnsyncedSession","prevent","onDragEnter","onDragOver","onDragLeave","onDrop","behaviorCtor","behaviorOrOptions","reservedKeys","useEntries","behaviorOptions","optionOverrides","initialControls","cameraControlSubscribe","isArrayValue","letter","pendingPose","pendingDetail","flush","activeTargetNodeIndices","baseRotation","nextRotation","orbitAxis","rotated","positionSource","requestId","edgeAdaptiveRuntime","paddingRatio","ratioPaddingPx","exactReadback","nextPose","animate","coverage","maxSamples","sampledPointCapacity","sampledPoints","nodeRadiusWorld","sampleX","sampleY","sampleZ","nodeAttributeAccess","readNodeAttributeView","outlineView","fullDiameter","pointOffset","fitMinX","fitMinY","fitMinZ","fitMaxX","fitMaxY","fitMaxZ","bboxCx","bboxCy","bboxCz","baseInterval","minInterval","maxInterval","scaleStrength","countRef","resolvedNodeCount","intervalScale","actionTokens","isPan","isRotate","isZoom","isDolly","is2DMovementWithoutAction","detailSource","requestedNodeIndices","sampleOptions","captured","focusMode","zoomScale","focusZoomTolerance","desiredZoom","maxFocusZoom","nextZoom","desiredDistance","minFocusDistance","nextDistance","fitWidth","fitHeight","fitZoomMargin","viewportW","viewportH","availW","availH","zoomX","zoomY","clampedZoom","fitRotation","maxAbsX","maxAbsY","requiredPerspectiveDistance","tanHalfY","tanHalfX","effectiveTanX","effectiveTanY","includeFitPoint","viewX","viewY","viewForward","includedFitPoints","fitPoints","fitPose","sourceZoom","panScale","startPose","layoutIteration","sampledBounds","refreshed","completedPose","preserveRotation","currentPose","wantsRender","followIntervalMs","boundsRequest","followPose","currentSignature","followSignature","effectiveIntervalMs","fitSignature","currentFitSignature","interpolated","finalPose","lastOrbitAt","deltaSeconds","previousOrbitAngle","targetOrbitAngle","nextOrbitAngle","tauMs","collapsedNetwork","collapsedDelegate","startCenter","startDistance","targetDistance","dz","distPerspective","targetCenter","source3D","matchedPerspectiveDistance","pre2D3D","extraStateSlotsRaw","extraStateSlots","fallbackError","baseNetwork","selector","topologyNode","topologyEdge","nodeSelector","edgeSelector","nodeSelection","edgeSelection","selectorNode","selectorEdge","emptyIndices","orderVersions","dirtyRanges","mergeDirtyRange","nextStart","nextEnd","mergedStart","mergedEnd","buildSelectorView","dataPointer","copySelection","wasmHeap","countFromSelector","sourceHeap","materializeSelection","fillSelection","promoteSelectionToEnd","kept","promoted","last","resolveIncidentEdges","activeEdges","throwOnError","pendingNodeSelector","pendingEdgeSelector","previousNodeSelector","previousEdgeSelector","hasSelectorResult","nextNodeSelector","nextEdgeSelector","nextLayoutNetwork","layoutNetworkChanged","filterScope","preserveActiveFilterRef","filterOptions","hadFilter","disposeOld","keepCamera","keepMappers","recreateRenderer","frameNetwork","activePositionDelegate","wasRunning","attributeConfig","pickingConfig","prevNetwork","maxAttempts","_ignored","frameOptions","requestedFormat","sourceNameOption","sourceNameForMetadata","formatFromName","loadStartupGate","HeliosNetwork","sessionNickname","shouldCreateSession","attachedState","storageOverrides","sparseOverrides","restoredMode","restoredStorageState","includeLayoutRuntime","ignoreAttributes","previousPositions","wroteCurrentPositionsForSave","currentPositionOptions","layoutPositions","stateWriter","currentPositions","hadExisting","portableVisualizationState","sourceCamera","sourceUniforms","viewMatrix","nextProjection","liveBounds","exportBounds","nextViewProjection","exportUniforms","previousClearColor","exportFigureLogicalViewport","exportCamera","previousCameraViewport","previousManualFastEdges","previousAdaptiveFastEdges","previousForceHighQuality","labelBaseConfig","legendBaseConfig","exportReferenceSize","viewReferenceSize","exportRelativeScale","targetSize","labelGroup","exportInsets","overlaySvg","overlayImage","bitmapHref","overlays","backgroundRect","bitmapCanvas","fullExportOptions","previewRequest","previewResolved","previewExportOptions","filenameOrOptions","maybeOptions","link","typeWithNamespace","capture","listenerOptions","unsubscribeSignal","onAbort","renderNetwork","renderEnd","storageSessionsActive","sessionStatus","reuseBuffer","snapshotDelegate","restoredPositions","beforeDelegateVersion","wroteLayout","adopted","durationMode","fixedDuration","windowed","average","minDuration","maxDuration","adaptive","targetPositions","mixed","layoutElapsedMs","sourcePositions","displacementRatio","minDisplacement","shouldInterpolate","cameraKeepRunning","keepRunning","pendingHandoff","previousTargetAt","delegateSourceActive","handoffAdopted","hookNames","hookName","activeLayoutDelegate","usesLayoutDelegate","defaultNetwork","policy","prevActiveDelegate","nextActiveDelegate","outgoingDelegate","retainedLayout","previousLayout","previousDelegate","direct","delegateAlpha","readNodeIndices","visitNode","snapshotCenter","keepLastRendered","keepIntervalHistory","previousIntervals","activeDelegate","useGpuInterpolation","densityLayer","previousDiverging","previousDomain","domainChanged","holdMs","layoutActive","cameraActive","renderMs","targetCount","frameIntervalMs","renderDuration","frameInterval","hasRenderDuration","hasFrameInterval","delegateAlphaMin","failedProbeCount","failures","targetFastAverage","fastAverage","currentAlpha","fallbackAlpha","alphaThreshold","previousReason","manualFast","adaptiveFast","activity","wasAdaptiveFast","decision","edgesVisible","averageMs","slowThreshold","exitThreshold","nextReason","stateOptions","previousSnapshot","orbitAngleChanged","followChanged","followTarget","cameraControlChanged","layoutChanged","animateCamera","plan","comparisonMode","html","opened","heliosMenu","websiteButton","issueButton","addCleanup","listenButton","setHeliosMenuOpen","open","openMenuUrl","closeHeliosMenu","layoutNetwork","gpuOptions","workerOptions","initializer","hasNodeChange","hasEdgeChange","nodeDefaults","edgeDefaults","oldNodeCount","oldEdgeCount","usesBigInt","valueBig","resolvedIndex","isVirtual","nextNodes","nextEdges","removeNodes","addNodes","removeEdges","addEdges","forceMask","resolvedSlot","handoff","nextPolicy","shouldHandoffDelegatePositions","currentChoice","randomChoice","applyRandomSeed","halfSide","targetBuffer","safeId","updates","hasDurationModeUpdate","hasAdaptiveDurationUpdate","hasFixedDurationUpdate","modeChanged","algo","requestedAlgo","requestedParams","updateOptions","addAttributeTrackerTargets","tracker","counters","describeRenderTarget","addTracker","addEntry","nodeEnabled","edgeEnabled","manual","picking","enabledMaxFps","effectiveFps","combinedMaxFps","picked","nodeHit","edgeHit","nodeDepth","edgeDepth","touchActive","isDouble","clickRequiresStationary","suppressWheelMs","wheelRecently","baseDetail","cameraChange","hasUiTheme","themeOption","panelOptions","creators"],"mappings":"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kjC,CAAS,EAAIA,EAClEH,EAAO,WAAY/iC,EAASyiC,GAASziC,EAAM,OAAQ2b,CAAK,EAAIA,EAClE,MAAO,CAACA,EAAOonB,CAAG,CACpB,CACA,MAAMh0B,EAAS0zB,GAASziC,EAAOkjC,CAAS,EACxC,MAAO,CAACn0B,EAAQA,CAAM,CACxB,CAEA,MAAMo0B,GAAqB,CACzB,mBACA,sBACA,sBACA,eACA,kBACA,sBACA,4BACA,6BACA,eACA,cACA,mBACA,aACA,gBACA,SACA,WACA,yBACA,kBACA,iBACA,yBACA,yBACA,kBACA,qBACA,oBACA,mBACA,mBACA,uBACA,+BACA,mBACA,sBACA,sBACA,qBACA,wBACA,wBACA,sBACA,yBACA,yBACA,oBACA,qBACA,iBACA,kBACA,gBACA,qBACA,sBACA,iBACA,yBACA,qBACA,0BACA,6BACA,wBACA,gBACF,EAEMC,GAAqB,CACzB,mBACA,kBACA,sBACA,4BACA,6BACA,eACA,mBACA,eACA,eACA,kBACA,sBACA,kBACA,kBACA,kBACA,mBACA,uBACA,mBACA,mBACA,uBACA,+BACA,mBACA,sBACA,sBACA,qBACA,wBACA,wBACA,sBACA,yBACA,yBACA,oBACA,uBACA,sBACA,yBACA,kBACA,kBACA,qBACA,yBACA,yBACA,0BACA,wBACA,uBACA,6BACA,oBACA,qBACA,yBACA,qBACA,0BACA,6BACA,wBACA,gBACF,EAEMC,GAA0B,CAC9B,mBACA,mBACA,aACA,gBACA,SACA,aACA,kBACA,sBACA,4BACA,6BACA,eACA,mBACA,eACA,kBACA,eACA,eACA,kBACA,sBACA,oBACA,sBACA,2BACA,oBACA,uBACA,oBACA,uBACA,sBACA,yBACA,2BACA,8BACA,kBACA,kBACA,kBACA,kBACA,kBACA,qBACA,yBACA,uBACA,yBACA,8BACA,yBACA,0BACA,wBACA,qBACA,2BACA,uBACA,6BACA,4BACA,kCACA,kBACA,mBACA,oBACA,qBACA,iBACA,kBACA,qBACA,WACA,yBACA,mBACA,uBACA,mBACA,mBACA,uB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,2BAQ3BC,GAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAw4F1B,SAASC,GAAoBpG,EAAM,SAAU,CAClD,GAAI,CAACA,GAAOA,EAAI,eAAekG,EAAwB,EAAG,OAC1D,MAAM52E,EAAQ0wE,EAAI,cAAc,OAAO,EACvC1wE,EAAM,GAAK42E,GACX52E,EAAM,YAAc62E,GACpBnG,EAAI,KAAK,YAAY1wE,CAAK,CAC5B,CC55FO,MAAM+2E,GAAwB,GAErC,SAASC,IAAQ,CACf,OAAI,OAAO,YAAgB,KAAe,OAAO,YAAY,KAAQ,WAAmB,YAAY,IAAG,EAChG,KAAK,IAAG,CACjB,CAEO,SAASC,GAAkBnsG,EAAUwkF,EAAMynB,GAAuB,CACvE,MAAMG,EAAe,OAAOpsG,GAAa,WAAaA,EAAW,IAAM,CAAC,EAClEqsG,EAAa,OAAO,SAAS7nB,CAAG,GAAKA,EAAM,EAAI,IAAOA,EAAM,EAElE,IAAI8nB,EAAY,KACZC,EAAiB,KACjBC,EAAc,KACdC,EAAc,KAElB,MAAMC,EAAiB,IAAM,CACvBJ,GAAa,OACjB,WAAW,aAAaA,CAAS,EACjCA,EAAY,KACd,EAEMK,EAAgB,IAAM,CAC1B,GAAI,CAACH,EAAa,OAClB,MAAMtrG,EAAOsrG,EACPziG,EAAU0iG,EAChBD,EAAc,KACdC,EAAc,KACdF,EAAiBL,GAAK,EACtBE,EAAa,MAAMriG,EAAS7I,CAAI,CAClC,EAEM0rG,EAAkB,IAAM,CAC5B,GAAIN,GAAa,MAAQ,CAACE,GAAeH,GAAc,EAAG,OAC1D,MAAMQ,EAAc,KAAK,IAAI,EAAGR,GAAcH,GAAK,EAAKK,EAAe,EACvED,EAAY,WAAW,WAAW,IAAM,CACtCA,EAAY,KACZK,EAAa,EACTH,GAAaI,EAAe,CAClC,EAAGC,CAAW,CAChB,EAEA,SAASC,KAAa5rG,EAAM,CAI1B,GAHAsrG,EAActrG,EACdurG,EAAc,KAEVJ,GAAc,EAAG,CACnBK,EAAc,EACdC,EAAa,EACb,MACF,CAEA,GAAIL,GAAa,MAASJ,GAAK,EAAKK,GAAmBF,EAAY,CACjEM,EAAa,EACb,MACF,CAEAC,EAAe,CACjB,CAEA,OAAAE,EAAU,MAAQ,IAAM,CACtBJ,EAAc,EACdC,EAAa,CACf,EAEAG,EAAU,OAAS,IAAM,CACvBJ,EAAc,EACdF,EAAc,KACdC,EAAc,IAChB,EAEOK,CACT,CCtEA,SAASC,IAAoC,CAC3C,MAAMC,EAAY,SAAS,cAAc,MAAM,EAC/C,OAAAA,EAAU,UAAY,8DACtBA,EAAU,QAAQ,MAAQ,UAC1BA,EAAU,aAAa,cAAe,MAAM,EAC5CA,EAAU,QAAU,IAAM,CAAC,EACpBA,CACT,CAEA,SAAStgB,GAAapvF,EAAOwvF,EAAY,EAAG,CAC1C,MAAM33D,EAAI,OAAO73B,CAAK,EACtB,GAAI,CAAC,OAAO,SAAS63B,CAAC,EAAG,OAAO,OAAO73B,CAAK,EAC5C,MAAMsvF,EAAM,KAAK,IAAIz3D,CAAC,EACtB,OAAIy3D,GAAO,IAAaz3D,EAAE,QAAQ,CAAC,EAC/By3D,GAAO,IAAYz3D,EAAE,QAAQ,CAAC,EAC9By3D,GAAO,GAAWz3D,EAAE,QAAQ,CAAC,EAC1BA,EAAE,QAAQ23D,CAAS,CAC5B,CAEA,SAASmgB,GAAa3vG,EAAOwwE,EAAO,CAClC,IAAI34C,EAAI,OAAO73B,CAAK,EACpB,GAAI,CAAC,OAAO,SAAS63B,CAAC,EAAG,OAAO,KAChC,GAAI,CAAC24C,EAAO,OAAO34C,EACnB,MAAMvtB,EAAMkmE,EAAM,IACZ9gE,EAAM8gE,EAAM,IAClB,GAAIlmE,GAAO,KAAM,CACf,MAAMslG,EAAY,OAAOtlG,CAAG,EACxB,OAAO,SAASslG,CAAS,IAAG/3E,EAAI,KAAK,IAAI+3E,EAAW/3E,CAAC,EAC3D,CACA,GAAInoB,GAAO,KAAM,CACf,MAAMmgG,EAAY,OAAOngG,CAAG,EACxB,OAAO,SAASmgG,CAAS,IAAGh4E,EAAI,KAAK,IAAIg4E,EAAWh4E,CAAC,EAC3D,CACA,OAAOA,CACT,CAEO,SAASi4E,GAAgB10B,EAAWx6E,EAAU,GAAI,CACvD,MAAMwnG,EAAQxnG,EAAQ,OAASw6E,EAAU,OAASA,EAAU,GACtD20B,EAAOnvG,EAAQ,MAAQ,KACvBovG,EAAgB,CACpB,IAAK50B,EAAU,KAAO,EACtB,IAAKA,EAAU,KAAO,CAC1B,EACQ60B,EAAc70B,EAAU,kBAAoBA,EAAU,QAAU40B,EAChEE,EAAW,OAAO,UAAU,eAAe,KAAK90B,EAAU,MAAQ,CAAA,EAAI,UAAU,EAClF,OAAOA,EAAU,MAAM,QAAQ,EAC9BA,EAAU,QAAQ,KAAO60B,EAAY,IACpCE,EAAmB,OAAO,UAAU,eAAe,KAAK/0B,EAAU,MAAQ,CAAA,EAAI,UAAU,EAC1FA,EAAU,MAAM,SAChB,KACEg1B,EAAWD,IAAqB,KAClC,KACCA,GAAoB,KAAO,OAAOA,CAAgB,EAAK/0B,EAAU,QAAQ,KAAO60B,EAAY,IAC3FI,EACH,OAAO,SAASH,CAAQ,GAAK,OAAO,SAASE,CAAQ,EAClD,CAAE,IAAKF,EAAU,IAAKE,CAAQ,EAC9B,KACAvhD,EAAOjuD,EAAQ,MAAQw6E,EAAU,MAAQ,IAEzCl4B,EAAM,SAAS,cAAc,KAAK,EACxCA,EAAI,UAAY,6DAEhB,MAAMx9B,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,kBAClB,MAAM4qF,EAAa,SAAS,cAAc,KAAK,EAC/CA,EAAW,UAAY,6BACvB,MAAMC,EAAiB,SAAS,cAAc,KAAK,EACnDA,EAAe,UAAY,yBAC3BA,EAAe,YAAcnI,EAC7BkI,EAAW,YAAYC,CAAc,EACrC,MAAMC,EAAiB5vG,EAAQ,iBAAmB,OAC9C6uG,GAAiC,EACjC7uG,EAAQ,eACR4vG,GAAgBF,EAAW,YAAYE,CAAc,EAEzD,IAAIC,EAAU,KACVC,EAAc,KACdC,EAAmB,KACnBC,EAAyB,KAE7B,MAAMC,EAAoBC,GAAW,CAC9BL,IACLA,EAAQ,QAAQ,KAAOK,EAAS,QAAU,OAC1CL,EAAQ,OAASK,EACnB,EAEMC,EAAqB,IAAM7tD,EAAI,UAAU,YAAY,GAAKA,EAAI,eAAe,MAAQ,SAAS,KAE9F8tD,EAAe,IAAM,CACzB,GAAI,CAACP,EAAS,OAEd,MAAMQ,GADSR,EAAQ,QAAQ,SAAWvtD,EAAI,eAAe,iBAAiButD,EAAQ,QAAQ,QAAQ,EAAI,OACrF,KACrB,GAAI,CAACQ,EAAI,OAET,MAAMjd,EAAS,EACTpxF,EAAOquG,EAAG,sBAAqB,EAC/B,CAAE,WAAYC,EAAI,YAAaC,CAAE,EAAK,OAE5CV,EAAQ,MAAM,KAAO,MACrBA,EAAQ,MAAM,IAAM,MACpBA,EAAQ,MAAM,UAAY,8BAC1B,MAAMW,EAAUX,EAAQ,sBAAqB,EAEvCY,GAAgBzuG,EAAK,KAAOA,EAAK,MAAQ,EAAIwuG,EAAQ,MAAQ,EAC7DppD,GAAO,KAAK,IAAIgsC,EAAQ,KAAK,IAAIkd,EAAKld,EAASod,EAAQ,MAAOC,EAAa,CAAC,EAE5EC,GAAe1uG,EAAK,IAAM,EAAIwuG,EAAQ,OACtCG,GAAc3uG,EAAK,OAAS,EAC5BulD,GAAMmpD,IAAgBtd,EAASsd,GAAe,KAAK,IAAIH,EAAKnd,EAASod,EAAQ,OAAQG,EAAW,EAEtGd,EAAQ,MAAM,KAAO,GAAGzoD,EAAI,KAC5ByoD,EAAQ,MAAM,IAAM,GAAGtoD,EAAG,KAC1BsoD,EAAQ,MAAM,UAAY,iBAC5B,EAEMe,EAAsB,IAAM,CAC5Bb,GAAoB,MAAM,OAAO,aAAaA,CAAgB,EAClEA,EAAmB,OAAO,WAAW,IAAME,EAAiB,EAAI,EAAG,GAAG,CACxE,EAEMY,EAAc,IAAM,CACnBhB,IACDE,GAAoB,MAAM,OAAO,aAAaA,CAAgB,EAC7DD,IACHA,EAAcK,EAAkB,EAChCL,EAAY,YAAYD,CAAO,GAEjCI,EAAiB,EAAK,EACtBG,EAAY,EACd,EAEA,GAAIjB,EAAM,CACRU,EAAU,SAAS,cAAc,KAAK,EACtCA,EAAQ,UAAY,oBACpBA,EAAQ,OAAS,GACjBA,EAAQ,QAAQ,KAAO,QACvBA,EAAQ,YAAcV,EACtBU,EAAQ,aAAa,OAAQ,SAAS,EACtC,MAAMiB,EAAY,qBAAqB,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,GAC1EjB,EAAQ,QAAQ,SAAWiB,EAC3BnB,EAAe,GAAKmB,EACpBnB,EAAe,SAAW,EAE1B,MAAMoB,EAAiB,IAAMF,EAAW,EAClCG,EAAiB,IAAMJ,EAAmB,EAC1CK,EAAU,IAAMJ,EAAW,EAC3BK,EAAS,IAAMjB,EAAiB,EAAI,EACpCkB,EAAatI,IAAM,CACnBA,GAAE,MAAQ,WACZoH,EAAiB,EAAI,EACrBN,EAAe,KAAI,EAEvB,EACMyB,EAAmB,IAAM,CACzB,CAACvB,GAAWA,EAAQ,QACxBO,EAAY,CACd,EAEAT,EAAe,iBAAiB,eAAgBoB,CAAc,EAC9DpB,EAAe,iBAAiB,eAAgBqB,CAAc,EAC9DrB,EAAe,iBAAiB,QAASsB,CAAO,EAChDtB,EAAe,iBAAiB,OAAQuB,CAAM,EAC9CvB,EAAe,iBAAiB,UAAWwB,CAAS,EACpD,OAAO,iBAAiB,SAAUC,EAAkB,CAAE,QAAS,GAAM,EACrE,OAAO,iBAAiB,SAAUA,CAAgB,EAElDpB,EAAyB,IAAM,CAC7BL,EAAe,oBAAoB,eAAgBoB,CAAc,EACjEpB,EAAe,oBAAoB,eAAgBqB,CAAc,EACjErB,EAAe,oBAAoB,QAASsB,CAAO,EACnDtB,EAAe,oBAAoB,OAAQuB,CAAM,EACjDvB,EAAe,oBAAoB,UAAWwB,CAAS,EACvD,OAAO,oBAAoB,SAAUC,EAAkB,CAAE,QAAS,GAAM,EACxE,OAAO,oBAAoB,SAAUA,CAAgB,CACvD,CACF,CAEAtsF,EAAM,YAAY4qF,CAAU,EAE5B,MAAM2B,EAAW,SAAS,cAAc,KAAK,EAC7CA,EAAS,UAAY,4BAErB,MAAMC,EAAa,SAAS,cAAc,OAAO,EACjDA,EAAW,UAAY,mBACvBA,EAAW,KAAO,SAClBA,EAAW,UAAY,UACvBA,EAAW,KAAO,OAAOrjD,CAAI,EAC7BqjD,EAAW,SAAW92B,EAAU,SAC5Bi1B,IACE,OAAO,SAASA,EAAW,GAAG,IAAG6B,EAAW,IAAM,OAAO7B,EAAW,GAAG,GACvE,OAAO,SAASA,EAAW,GAAG,IAAG6B,EAAW,IAAM,OAAO7B,EAAW,GAAG,IAG7E,MAAM8B,EAAS,SAAS,cAAc,OAAO,EAC7CA,EAAO,UAAY,mBACnBA,EAAO,KAAO,QACdA,EAAO,IAAM,OAAOlC,EAAY,GAAG,EACnCkC,EAAO,IAAM,OAAOlC,EAAY,GAAG,EACnCkC,EAAO,KAAO,OAAOtjD,CAAI,EACzBsjD,EAAO,SAAW/2B,EAAU,SAE5B,MAAMg3B,EAAqB,IAAM,CAC/B,MAAM9nG,EAAM,OAAO6nG,EAAO,GAAG,EACvBziG,EAAM,OAAOyiG,EAAO,GAAG,EACvBnyG,EAAQ,OAAOmyG,EAAO,KAAK,EACjC,GAAI,CAAC,OAAO,SAAS7nG,CAAG,GAAK,CAAC,OAAO,SAASoF,CAAG,GAAK,CAAC,OAAO,SAAS1P,CAAK,GAAKsK,IAAQoF,EAAK,OAC9F,MAAM2iG,GAAQryG,EAAQsK,IAAQoF,EAAMpF,GAAQ,IAC5C6nG,EAAO,MAAM,YAAY,QAAS,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,IAAKE,CAAG,CAAC,CAAC,CAAC,CAC3E,EAEMC,EAAuBtyG,GAAU,CACrC,MAAM63B,EAAI,OAAO73B,CAAK,EAClB,OAAO,SAAS63B,CAAC,IAAGs6E,EAAO,MAAQ,OAAOxC,GAAa93E,EAAGo4E,CAAW,CAAC,GAC1EiC,EAAW,MAAQ9iB,GAAapvF,EAAOY,EAAQ,WAAa,CAAC,EAC7DwxG,EAAkB,CACpB,EAEMG,EAAQn3B,EAAU,UAAUk3B,CAAmB,EAC/CE,EAAmB3D,GAAmB4D,GAAc,CACxD,MAAM56E,EAAI,OAAO46E,CAAS,EACrB,OAAO,SAAS56E,CAAC,GACtBujD,EAAU,MAAMvjD,EAAG,CAAE,OAAQ,KAAM,MAAO,QAAS,CACrD,CAAC,EAEDs6E,EAAO,iBAAiB,QAAS,IAAM,CACrC,MAAMt6E,EAAI,OAAOs6E,EAAO,KAAK,EACxB,OAAO,SAASt6E,CAAC,IACtBu6E,EAAkB,EAClBI,EAAiB36E,CAAC,EACpB,CAAC,EACDs6E,EAAO,iBAAiB,SAAU,IAAM,CACtC,MAAMt6E,EAAI,OAAOs6E,EAAO,KAAK,EACxB,OAAO,SAASt6E,CAAC,IACtBu6E,EAAkB,EAClBI,EAAiB36E,CAAC,EACpB,CAAC,EAED,MAAM66E,EAAoBC,GAAc,CACtC,MAAM96E,EAAI83E,GAAauC,EAAW,MAAO7B,GAAc,IAAI,EACvDx4E,GAAK,MACTujD,EAAU,MAAMvjD,EAAG,CAAE,OAAQ,KAAM,MAAO86E,EAAW,CACvD,EAEA,OAAAT,EAAW,iBAAiB,SAAU,IAAMQ,EAAiB,QAAQ,CAAC,EACtER,EAAW,iBAAiB,UAAYzI,GAAM,CACxCA,EAAE,MAAQ,UACZiJ,EAAiB,OAAO,EACxBR,EAAW,KAAI,EAEnB,CAAC,EAEDhvD,EAAI,YAAYx9B,CAAK,EACrBusF,EAAS,YAAYE,CAAM,EAC3BF,EAAS,YAAYC,CAAU,EAC/BhvD,EAAI,YAAY+uD,CAAQ,EAEjB,CACL,QAAS/uD,EACT,QAAS,IAAM,CACbqvD,EAAK,EACLC,EAAiB,OAAM,EACnB7B,GAAoB,MAAM,OAAO,aAAaA,CAAgB,EAClEC,IAAsB,EACtBH,GAAS,SAAM,EACfA,EAAU,KACVC,EAAc,IAChB,CACJ,CACA,CC9QA,SAASjB,IAAoC,CAC3C,MAAMC,EAAY,SAAS,cAAc,MAAM,EAC/C,OAAAA,EAAU,UAAY,8DACtBA,EAAU,QAAQ,MAAQ,UAC1BA,EAAU,aAAa,cAAe,MAAM,EAC5CA,EAAU,QAAU,IAAM,CAAC,EACpBA,CACT,CAEO,SAASkD,GAAmB,CACjC,MAAAxK,EACA,KAAA2H,EACA,SAAAkC,EACA,eAAAzB,EACA,cAAAqC,EACA,SAAAC,EAAW,IACb,EAAG,CACD,MAAM5vD,EAAM,SAAS,cAAc,KAAK,EAExC,GADAA,EAAI,UAAY,uCACZ4vD,EACF,UAAWC,KAAa,OAAOD,CAAQ,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO,EAClE5vD,EAAI,UAAU,IAAI6vD,CAAS,EAG/B,MAAMrtF,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,kBAElB,MAAMstF,EAAa,SAAS,cAAc,KAAK,EAC/CA,EAAW,UAAY,6BACvB,MAAM9E,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,yBACpBA,EAAQ,YAAc9F,GAAS,GAC/B4K,EAAW,YAAY9E,CAAO,EAC9B,MAAMwB,EAAYc,IAAmB,OAAYf,GAAiC,EAAKe,EACnFd,GAAWsD,EAAW,YAAYtD,CAAS,EAC/ChqF,EAAM,YAAYstF,CAAU,EACxBjD,GAAM8C,IAAgB3E,EAAS6B,CAAI,EAEvC7sD,EAAI,YAAYx9B,CAAK,EACrB,MAAMutF,EAAc,SAAS,cAAc,KAAK,EAChD,OAAAA,EAAY,UAAY,0BACpBhB,GAAUgB,EAAY,YAAYhB,CAAQ,GAE5C,EAAQA,GAAU,WAAW,SAAS,2BAA2B,GAC9D,EAAQA,GAAU,gBAAgB,4BAA4B,IAC5C/uD,EAAI,UAAU,IAAI,uBAAuB,EAChEA,EAAI,YAAY+vD,CAAW,EACpB,CAAE,IAAA/vD,EAAK,QAAAgrD,EAAS,YAAA+E,CAAW,CACpC,CC9CA,SAASb,GAAmBD,EAAQ,CAClC,GAAI,CAACA,EAAQ,OACb,MAAM7nG,EAAM,OAAO6nG,EAAO,GAAG,EACvBziG,EAAM,OAAOyiG,EAAO,GAAG,EACvBnyG,EAAQ,OAAOmyG,EAAO,KAAK,EACjC,GAAI,CAAC,OAAO,SAAS7nG,CAAG,GAAK,CAAC,OAAO,SAASoF,CAAG,GAAK,CAAC,OAAO,SAAS1P,CAAK,GAAKsK,IAAQoF,EAAK,OAC9F,MAAM2iG,GAAQryG,EAAQsK,IAAQoF,EAAMpF,GAAQ,IAC5C6nG,EAAO,MAAM,YAAY,QAAS,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,IAAKE,CAAG,CAAC,CAAC,CAAC,CAC3E,CAEO,MAAMa,EAAwB,CACnC,YAAY,CACV,MAAAlzG,EACA,UAAAmzG,EACA,KAAAtkD,EACA,SAAAqhD,EAAW,KACX,SAAAE,EAAW,KACX,SAAAgD,EAAW,IACf,EAAK,CACD,KAAK,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,UAAY,4BAEzB,KAAK,OAAS,SAAS,cAAc,OAAO,EAC5C,KAAK,OAAO,KAAO,QACnB,KAAK,OAAO,UAAY,mBACxB,KAAK,OAAO,IAAM,OAAOD,EAAU,CAAC,CAAC,EACrC,KAAK,OAAO,IAAM,OAAOA,EAAU,CAAC,CAAC,EACrC,KAAK,OAAO,KAAO,OAAOtkD,CAAI,EAE9B,KAAK,MAAQ,SAAS,cAAc,OAAO,EAC3C,KAAK,MAAM,KAAO,SAClB,KAAK,MAAM,UAAY,mBACvB,KAAK,MAAM,KAAO,OAAOA,CAAI,EACzBqhD,GAAY,KAAM,KAAK,MAAM,IAAM,OAAOA,CAAQ,EACjD,KAAK,MAAM,gBAAgB,KAAK,EACjCE,GAAY,KAAM,KAAK,MAAM,IAAM,OAAOA,CAAQ,EACjD,KAAK,MAAM,gBAAgB,KAAK,EAErC,MAAMiD,EAAO7wG,GAAS,CACpB,MAAMiG,EAAI,OAAOjG,CAAI,EACrB,GAAI,CAAC,OAAO,SAASiG,CAAC,EAAG,OACzB,MAAM6B,EAAM,OAAO,KAAK,OAAO,GAAG,EAC5BoF,EAAM,OAAO,KAAK,OAAO,GAAG,EAC5B5D,EAAU,KAAK,IAAIxB,EAAK,KAAK,IAAIoF,EAAKjH,CAAC,CAAC,EAC9C,KAAK,OAAO,MAAQ,OAAOqD,CAAO,EAClC,KAAK,MAAM,MAAQ,OAAOrD,CAAC,EAC3B2pG,GAAmB,KAAK,MAAM,CAChC,EACA,KAAK,IAAMiB,EAEXA,EAAIrzG,CAAK,EACT,MAAMszG,EAAoBzE,GAAmB4D,GAAc,CACzDW,IAAWX,CAAS,CACtB,CAAC,EAEKc,EAAgB,IAAM,CAC1B,KAAK,MAAM,MAAQ,OAAO,KAAK,OAAO,KAAK,EAC3CnB,GAAmB,KAAK,MAAM,EAC9BkB,EAAkB,KAAK,OAAO,KAAK,CACrC,EACME,EAAiB,IAAM,CAC3B,KAAK,MAAM,MAAQ,OAAO,KAAK,OAAO,KAAK,EAC3CpB,GAAmB,KAAK,MAAM,EAC9BkB,EAAkB,KAAK,OAAO,KAAK,EACnCA,EAAkB,MAAK,CACzB,EACMG,EAAgB,IAAM,CAC1BJ,EAAI,KAAK,MAAM,KAAK,EACpBD,IAAW,KAAK,MAAM,KAAK,CAC7B,EACMM,EAAkBrxG,GAAU,CAC5BA,EAAM,MAAQ,UAChBgxG,EAAI,KAAK,MAAM,KAAK,EACpBD,IAAW,KAAK,MAAM,KAAK,EAC3B,KAAK,MAAM,KAAI,EAEnB,EAEA,KAAK,OAAO,iBAAiB,QAASG,CAAa,EACnD,KAAK,OAAO,iBAAiB,SAAUC,CAAc,EACrD,KAAK,MAAM,iBAAiB,SAAUC,CAAa,EACnD,KAAK,MAAM,iBAAiB,UAAWC,CAAc,EAErD,KAAK,SAAW,IAAM,CACpBJ,EAAkB,OAAM,EACxB,KAAK,OAAO,oBAAoB,QAASC,CAAa,EACtD,KAAK,OAAO,oBAAoB,SAAUC,CAAc,EACxD,KAAK,MAAM,oBAAoB,SAAUC,CAAa,EACtD,KAAK,MAAM,oBAAoB,UAAWC,CAAc,EACxD,KAAK,QAAQ,OAAM,CACrB,EAEA,KAAK,QAAQ,YAAY,KAAK,MAAM,EACpC,KAAK,QAAQ,YAAY,KAAK,KAAK,CACrC,CAEA,SAAU,CACR,KAAK,WAAQ,EACb,KAAK,SAAW,IAClB,CACF,CCtGA,SAASC,GAAcjL,EAAM,CAC3B,OAAO,OAAOA,GAAQ,EAAE,EAAE,KAAI,CAChC,CAEA,SAASkL,GAAaC,EAAYnL,EAAM1iE,EAAQ0iE,EAAM5nG,EAAO,UAAW,CACtE,MAAMgB,EAAS6xG,GAAcjL,CAAI,EAC3BoL,EAAaH,GAAc3tE,GAAS0iE,CAAI,EAC9C,GAAI5mG,GAAU+xG,GAAY,WAAW/xG,CAAM,EAAG,MAAO,UACrD,GAAIhB,IAAS,QAAS,CACpB,GAAIgzG,GAAcD,GAAY,WAAWC,CAAU,EAAG,OAAOD,EAAW,SAASC,CAAU,EAC3F,GAAIhyG,GAAU+xG,GAAY,SAAS/xG,CAAM,EAAG,OAAO+xG,EAAW,OAAO/xG,CAAM,CAC7E,CACA,MAAO,SACT,CAEA,SAASiyG,GAAwBxoG,EAAQm9F,EAAM1iE,EAAOllC,EAAM,CAC1D,MAAMkzG,EAAezoG,GAAQ,QAAU,KACvC,GAAI,OAAOyoG,GAAc,QAAW,WAClC,OAAOA,EAAa,OAAOlzG,IAAS,SAAWklC,GAAS0iE,EAAc,CAAE,MAAA1iE,EAAO,KAAAllC,EAAM,GAAG,OAAS,UAEnG,MAAM+yG,EAAaG,GAAc,gBAAa,GAAQ,CAAE,SAAU,CAAA,EAAI,SAAU,CAAA,EAAI,OAAQ,EAAE,EAC9F,OAAOJ,GAAaC,EAAYnL,EAAM1iE,EAAOllC,CAAI,CACnD,CAEA,SAASmzG,GAAet5F,EAAO,SAAU,CACvC,UAAWu5F,KAAQv5F,EAAK,mBAAmB,uBAAuB,GAAK,CAAA,EACrEu5F,EAAK,OAAM,CAEf,CAEA,SAASC,GAAgBzE,EAAW,CAClC,OAAOA,EAAU,UAAU,YAAY,GAAKA,EAAU,eAAe,MAAQ,SAAS,IACxF,CAEO,SAAS0E,GAAqB,CACnC,OAAA7oG,EACA,KAAAm9F,EACA,MAAA1iE,EAAQ0iE,EACR,KAAA5nG,EAAO,UACP,cAAA+xG,EAAgB,IAClB,EAAI,GAAI,CACN,MAAMnD,EAAY,SAAS,cAAc,MAAM,EAC/CA,EAAU,UAAY,4BACtBA,EAAU,QAAQ,MAAQ,UAC1BA,EAAU,aAAa,aAAc,oBAAoB,EACzD,MAAM2E,EAAU,EAAQV,GAAcjL,CAAI,EACtC2L,IACF3E,EAAU,QAAQ,KAAOiE,GAAcjL,CAAI,EAC3CgH,EAAU,QAAQ,MAAQiE,GAAc3tE,GAAS0iE,CAAI,EACrDgH,EAAU,QAAQ,KAAO5uG,IAAS,QAAU,QAAU,WAEpDuzG,IACF3E,EAAU,aAAa,OAAQ,QAAQ,EACvCA,EAAU,aAAa,WAAY,GAAG,EACtCA,EAAU,aAAa,gBAAiB,MAAM,GAE3C2E,IACH3E,EAAU,UAAU,IAAI,mCAAmC,EAC3DA,EAAU,aAAa,cAAe,MAAM,GAG9C,MAAMvhD,EAAS,IAAM,CACnB,MAAMmmD,EAAYP,GAAwBxoG,EAAQm9F,EAAM1iE,EAAOllC,CAAI,EAC/D4uG,EAAU,QAAQ,QAAU4E,IAAW5E,EAAU,QAAQ,MAAQ4E,EACvE,EAEMC,EAAY,IAAM,CACtBN,GAAevE,EAAU,aAAa,EACtC,MAAMwE,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,uBACjBA,EAAK,aAAa,OAAQ,MAAM,EAEhC,MAAMM,EAAU,CAAC9uF,EAAO+uF,EAAS7zG,EAAU,CAAA,IAAO,CAChD,MAAM01E,EAAO,SAAS,cAAc,QAAQ,EAC5C,OAAAA,EAAK,KAAO,SACZA,EAAK,UAAY11E,EAAQ,MAAQ,+DAAiE,6BAClG01E,EAAK,YAAc5wD,EACnB4wD,EAAK,SAAW11E,EAAQ,WAAa,GACrC01E,EAAK,iBAAiB,QAAS,MAAOj0E,GAAU,CAC9CA,EAAM,gBAAe,EACrB,MAAMoyG,IAAO,EACbP,EAAK,OAAM,EACX/lD,EAAM,CACR,CAAC,EACD+lD,EAAK,YAAY59B,CAAI,EACdA,CACT,EAEMo+B,EAAcf,GAAc7yG,IAAS,SAAWklC,GAAS0iE,CAAY,EAC3E8L,EAAQ,mBAAoB,IAC1BjpG,GAAQ,QAAQ,QAAQmpG,CAAW,EAClC,CACD,SAAU,CAACA,GAAehF,EAAU,QAAQ,QAAU,SAC5D,CAAK,EAED,MAAM9sG,EAAO,OAAO8sG,EAAU,uBAA0B,WACpDA,EAAU,sBAAqB,EAC/B,CAAE,OAAQ,EAAG,KAAM,CAAC,EACxB,OAAO,OAAOwE,EAAK,MAAO,CACxB,SAAU,QACV,IAAK,GAAG,KAAK,MAAMtxG,EAAK,OAAS,CAAC,CAAC,KACnC,KAAM,GAAG,KAAK,MAAMA,EAAK,IAAI,CAAC,KAC9B,OAAQ,YACd,CAAK,EACDuxG,GAAgBzE,CAAS,EAAE,YAAYwE,CAAI,EAC3C,WAAW,IAAM,CACf,MAAMS,EAAStyG,GAAU,CACnB,CAAC6xG,EAAK,SAAS7xG,EAAM,MAAM,GAAKA,EAAM,SAAWqtG,IACnDwE,EAAK,OAAM,EACXxE,EAAU,cAAc,oBAAoB,cAAeiF,EAAO,EAAI,EAE1E,EACAjF,EAAU,cAAc,iBAAiB,cAAeiF,EAAO,EAAI,CACrE,EAAG,CAAC,CACN,EAEAjF,EAAU,iBAAiB,QAAUrtG,GAAU,CAC7CA,EAAM,gBAAe,EAChBgyG,GACLE,EAAS,CACX,CAAC,EACD7E,EAAU,iBAAiB,UAAYrtG,GAAU,CAC3C,CAACgyG,GAAYhyG,EAAM,MAAQ,SAAWA,EAAM,MAAQ,MACxDA,EAAM,iBAAc,EACpBA,EAAM,kBAAe,EACrBkyG,EAAS,EACX,CAAC,EAED,MAAMP,EAAezoG,GAAQ,QAAU,KACjCkxE,EAAW,IAAMtuB,EAAM,EACvBymD,EAAcjB,GAAc7yG,IAAS,SAAWklC,GAAS0iE,CAAY,EACrEmM,EAAmBR,GAAW,OAAOL,GAAc,WAAc,WACnEA,EAAa,UAAUY,EAAan4B,EAAU,CAAE,UAAW,EAAK,CAAE,EAClE,KACJ,OAAKo4B,GAAkBb,GAAc,mBAAmB,SAAUv3B,CAAQ,EAC1Eu3B,GAAc,mBAAmB,SAAUv3B,CAAQ,EACnDizB,EAAU,QAAU,IAAM,CACxBmF,IAAgB,EACXA,GAAkBb,GAAc,sBAAsB,SAAUv3B,CAAQ,EAC7Eu3B,GAAc,sBAAsB,SAAUv3B,CAAQ,EACtDw3B,GAAevE,EAAU,aAAa,CACxC,EACI2E,GAASxB,IAAgBnD,EAAW,8DAA8D,EACtGvhD,EAAM,EACCuhD,CACT,CCjJO,SAASoF,IAAuB,CACrC,MAAMC,EAAW,IAAI,IAiHrB,MAAO,CACL,cAhHoB,CAACC,EAAUjF,IAAS,CACxC,GAAI,CAACiF,GAAY,CAACjF,EAAM,MAAO,IAAM,CAAC,EAEtC,IAAIU,EAAU,KACVC,EAAc,KACdC,EAAmB,KAEvB,MAAMI,EAAqB,IAAMiE,EAAS,UAAU,YAAY,GAAKA,EAAS,eAAe,MAAQ,SAAS,KAExGnE,EAAoBC,GAAW,CAC9BL,IACLA,EAAQ,QAAQ,KAAOK,EAAS,QAAU,OAC1CL,EAAQ,OAASK,EACnB,EAEME,EAAe,IAAM,CACzB,GAAI,CAACP,EAAS,OAEd,MAAMQ,GADSR,EAAQ,QAAQ,SAAWuE,EAAS,eAAe,iBAAiBvE,EAAQ,QAAQ,QAAQ,EAAI,OAC1F,KACrB,GAAI,CAACQ,EAAI,OAET,MAAMjd,EAAS,EACTpxF,EAAOquG,EAAG,sBAAqB,EAC/B,CAAE,WAAYC,EAAI,YAAaC,CAAE,EAAK,OAE5CV,EAAQ,MAAM,KAAO,MACrBA,EAAQ,MAAM,IAAM,MACpBA,EAAQ,MAAM,UAAY,8BAC1B,MAAMW,EAAUX,EAAQ,sBAAqB,EAEvCY,EAAgBzuG,EAAK,KAAOA,EAAK,MAAQ,EAAIwuG,EAAQ,MAAQ,EAC7DppD,EAAO,KAAK,IAAIgsC,EAAQ,KAAK,IAAIkd,EAAKld,EAASod,EAAQ,MAAOC,CAAa,CAAC,EAE5EC,EAAe1uG,EAAK,IAAM,EAAIwuG,EAAQ,OACtCG,EAAc3uG,EAAK,OAAS,EAC5BulD,EAAMmpD,GAAgBtd,EAASsd,EAAe,KAAK,IAAIH,EAAKnd,EAASod,EAAQ,OAAQG,CAAW,EAEtGd,EAAQ,MAAM,KAAO,GAAGzoD,CAAI,KAC5ByoD,EAAQ,MAAM,IAAM,GAAGtoD,CAAG,KAC1BsoD,EAAQ,MAAM,UAAY,iBAC5B,EAEMe,EAAsB,IAAM,CAC5Bb,GAAoB,MAAM,OAAO,aAAaA,CAAgB,EAClEA,EAAmB,OAAO,WAAW,IAAME,EAAiB,EAAI,EAAG,GAAG,CACxE,EAEMY,EAAc,IAAM,CACnBhB,IACDE,GAAoB,MAAM,OAAO,aAAaA,CAAgB,EAC7DD,IACHA,EAAcK,EAAkB,EAChCL,EAAY,YAAYD,CAAO,GAEjCI,EAAiB,EAAK,EACtBG,EAAY,EACd,EAEAP,EAAU,SAAS,cAAc,KAAK,EACtCA,EAAQ,UAAY,oBACpBA,EAAQ,OAAS,GACjBA,EAAQ,QAAQ,KAAO,QACvBA,EAAQ,YAAcV,EACtBU,EAAQ,aAAa,OAAQ,SAAS,EAEtC,MAAMiB,EAAY,qBAAqB,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,GAC1EjB,EAAQ,QAAQ,SAAWiB,EAC3BsD,EAAS,GAAKtD,EACdsD,EAAS,SAAW,EAEpB,MAAMrD,EAAiB,IAAMF,EAAW,EAClCG,EAAiB,IAAMJ,EAAmB,EAC1CK,EAAU,IAAMJ,EAAW,EAC3BK,EAAS,IAAMjB,EAAiB,EAAI,EACpCkB,EAAatI,GAAM,CACnBA,EAAE,MAAQ,WACZoH,EAAiB,EAAI,EACrBmE,EAAS,KAAI,EAEjB,EACMhD,EAAmB,IAAM,CACzB,CAACvB,GAAWA,EAAQ,QACxBO,EAAY,CACd,EAEAgE,EAAS,iBAAiB,eAAgBrD,CAAc,EACxDqD,EAAS,iBAAiB,eAAgBpD,CAAc,EACxDoD,EAAS,iBAAiB,QAASnD,CAAO,EAC1CmD,EAAS,iBAAiB,OAAQlD,CAAM,EACxCkD,EAAS,iBAAiB,UAAWjD,CAAS,EAC9C,OAAO,iBAAiB,SAAUC,EAAkB,CAAE,QAAS,GAAM,EACrE,OAAO,iBAAiB,SAAUA,CAAgB,EAElD,MAAMiD,EAAU,IAAM,CAChBtE,GAAoB,MAAM,OAAO,aAAaA,CAAgB,EAClEqE,EAAS,oBAAoB,eAAgBrD,CAAc,EAC3DqD,EAAS,oBAAoB,eAAgBpD,CAAc,EAC3DoD,EAAS,oBAAoB,QAASnD,CAAO,EAC7CmD,EAAS,oBAAoB,OAAQlD,CAAM,EAC3CkD,EAAS,oBAAoB,UAAWjD,CAAS,EACjD,OAAO,oBAAoB,SAAUC,EAAkB,CAAE,QAAS,GAAM,EACxE,OAAO,oBAAoB,SAAUA,CAAgB,EACrDvB,GAAS,SAAM,EACfA,EAAU,KACVC,EAAc,IAChB,EAEA,OAAAqE,EAAS,IAAIE,CAAO,EACbA,CACT,EAIE,SAAU,CACR,UAAWA,KAAWF,EAAUE,EAAO,EACvCF,EAAS,MAAK,CAChB,CACJ,CACA,CCzHO,SAASG,GAAoB,CAClC,QAAAC,EAAU,GACV,SAAAC,EAAW,GACX,QAAAC,EAAU,KACV,SAAAC,EAAW,MACX,UAAAC,EAAY,KACZ,UAAAxC,EAAY,kBACd,EAAI,GAAI,CACN,MAAMyC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,KAAO,SACdA,EAAO,UAAYzC,EACnByC,EAAO,aAAa,OAAQ,QAAQ,EAChCD,GAAWC,EAAO,aAAa,aAAc,OAAOD,CAAS,CAAC,EAElE,MAAME,EAAQ,SAAS,cAAc,MAAM,EAC3CA,EAAM,UAAY,0BAClBA,EAAM,aAAa,cAAe,MAAM,EAExC,MAAM9vB,EAAO,SAAS,cAAc,MAAM,EAC1CA,EAAK,UAAY,yBAEjB6vB,EAAO,YAAYC,CAAK,EACxBD,EAAO,YAAY7vB,CAAI,EAEvB,MAAM+vB,EAAS,CACb,GAAI,OAAOL,GAAW,IAAI,EAC1B,IAAK,OAAOC,GAAY,KAAK,CACjC,EAEE,IAAIK,EAAiB,EAAQR,EACzBrd,EAAgB,GAEpB,MAAM8d,EAAO,IAAM,CACjB,MAAMC,EAAkBF,EAAiB,OAAS,QAC9CH,EAAO,aAAa,cAAc,IAAMK,GAC1CL,EAAO,aAAa,eAAgBK,CAAe,EAErD,MAAMhoB,EAAW8nB,EAAiBD,EAAO,GAAKA,EAAO,IACjD/vB,EAAK,cAAgBkI,IACvBlI,EAAK,YAAckI,EAEvB,EAEMioB,EAAe,IAAM,CACrBN,EAAO,WACXA,EAAO,QAAU,CAACA,EAAO,QACzBA,EAAO,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAI,CAAE,CAAC,EAC7D,EAEA,cAAO,eAAeA,EAAQ,UAAW,CACvC,aAAc,GACd,WAAY,GACZ,KAAM,CACJ,OAAOG,CACT,EACA,IAAI31G,EAAO,CACT,MAAM+1G,EAAc,EAAQ/1G,EACxB+1G,IAAgBJ,IACpBA,EAAiBI,EACjBH,EAAI,EACN,CACJ,CAAG,EAEDJ,EAAO,UAAY,CAAC,CAAE,GAAAQ,EAAI,IAAAC,CAAG,EAAK,CAAA,IAAO,CACvC,MAAMC,EAAeP,EAAiBD,EAAO,GAAKA,EAAO,IACrDM,GAAM,OAAMN,EAAO,GAAK,OAAOM,CAAE,GACjCC,GAAO,OAAMP,EAAO,IAAM,OAAOO,CAAG,IACnCN,EAAiBD,EAAO,GAAKA,EAAO,OAASQ,GAAcN,EAAI,CACtE,EAEAJ,EAAO,iBAAiB,YAAcnzG,GAAU,CAC1CmzG,EAAO,UACPnzG,EAAM,QAAU,MAAQA,EAAM,SAAW,IAC7Cy1F,EAAgB,GAChBge,EAAY,EACd,CAAC,EAEDN,EAAO,iBAAiB,QAAS,IAAM,CACrC,GAAI1d,EAAe,CACjBA,EAAgB,GAChB,MACF,CACAge,EAAY,CACd,CAAC,EAEDN,EAAO,SAAW,EAAQJ,EAC1BQ,EAAI,EACGJ,CACT,CCxFO,SAASW,GAA6B,CAC3C,QAAAhB,EAAU,GACV,SAAAC,EAAW,GACX,QAAAC,EAAU,KACV,SAAAC,EAAW,MACX,UAAAC,EAAY,KACZ,UAAAxC,EAAY,4BACd,EAAI,GAAI,CACN,MAAMp4F,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAYo4F,EACjBp4F,EAAK,aAAa,OAAQ,YAAY,EAClC46F,GAAW56F,EAAK,aAAa,aAAc,OAAO46F,CAAS,CAAC,EAEhE,MAAMG,EAAS,CACb,GAAI,OAAOL,GAAW,IAAI,EAC1B,IAAK,OAAOC,GAAY,KAAK,CACjC,EAEQc,EAAY,SAAS,cAAc,QAAQ,EACjDA,EAAU,KAAO,SACjBA,EAAU,UAAY,qCACtBA,EAAU,QAAQ,QAAU,MAC5BA,EAAU,QAAQ,MAAQ,QAC1BA,EAAU,aAAa,OAAQ,OAAO,EAEtC,MAAMC,EAAW,SAAS,cAAc,QAAQ,EAChDA,EAAS,KAAO,SAChBA,EAAS,UAAY,qCACrBA,EAAS,QAAQ,QAAU,KAC3BA,EAAS,QAAQ,MAAQ,OACzBA,EAAS,aAAa,OAAQ,OAAO,EAErC17F,EAAK,YAAYy7F,CAAS,EAC1Bz7F,EAAK,YAAY07F,CAAQ,EAEzB,IAAIV,EAAiB,EAAQR,EACzBmB,EAAkB,EAAQlB,EAE9B,MAAMQ,EAAO,IAAM,CACjBQ,EAAU,YAAcV,EAAO,IAC/BW,EAAS,YAAcX,EAAO,GAC9BU,EAAU,aAAa,eAAgBT,EAAiB,QAAU,MAAM,EACxEU,EAAS,aAAa,eAAgBV,EAAiB,OAAS,OAAO,EACvES,EAAU,QAAQ,SAAWT,EAAiB,QAAU,OACxDU,EAAS,QAAQ,SAAWV,EAAiB,OAAS,QACtDS,EAAU,SAAWT,EAAiB,GAAK,EAC3CU,EAAS,SAAWV,EAAiB,EAAI,GACzCS,EAAU,SAAWE,EACrBD,EAAS,SAAWC,EACpB37F,EAAK,aAAa,gBAAiB27F,EAAkB,OAAS,OAAO,EACrE37F,EAAK,QAAQ,QAAUg7F,EAAiB,OAAS,OACnD,EAEMY,EAAcv2G,GAAU,CAC5B,MAAMwC,EAAO,EAAQxC,EACjBwC,IAASmzG,IACbA,EAAiBnzG,EACjBozG,EAAI,EACJj7F,EAAK,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAI,CAAE,CAAC,EAC3D,EAEM67F,EAAkBT,GAAgB,CAClCO,GACJC,EAAWR,CAAW,CACxB,EAEMU,EAAiBp0G,GAAU,CAC/B,GAAI,CAAAi0G,EACJ,IAAIj0G,EAAM,MAAQ,aAAeA,EAAM,MAAQ,YAAa,CAC1DA,EAAM,eAAc,EACpBk0G,EAAW,EAAK,EAChBH,EAAU,QAAK,EACf,MACF,CACA,GAAI/zG,EAAM,MAAQ,cAAgBA,EAAM,MAAQ,UAAW,CACzDA,EAAM,eAAc,EACpBk0G,EAAW,EAAI,EACfF,EAAS,QAAK,EACd,MACF,EACIh0G,EAAM,MAAQ,KAAOA,EAAM,MAAQ,WACrCA,EAAM,eAAc,EACpBk0G,EAAWl0G,EAAM,gBAAkBg0G,CAAQ,GAE/C,EAEMK,EAAyBX,GAAiB1zG,GAAU,CACpDi0G,GACAj0G,EAAM,QAAU,MAAQA,EAAM,SAAW,GAC7Cm0G,EAAeT,CAAW,CAC5B,EAEA,OAAAK,EAAU,iBAAiB,YAAaM,EAAsB,EAAK,CAAC,EACpEL,EAAS,iBAAiB,YAAaK,EAAsB,EAAI,CAAC,EAClEN,EAAU,iBAAiB,QAAS,IAAMI,EAAe,EAAK,CAAC,EAC/DH,EAAS,iBAAiB,QAAS,IAAMG,EAAe,EAAI,CAAC,EAC7DJ,EAAU,iBAAiB,UAAWK,CAAa,EACnDJ,EAAS,iBAAiB,UAAWI,CAAa,EAElD,OAAO,eAAe97F,EAAM,UAAW,CACrC,aAAc,GACd,WAAY,GACZ,KAAM,CACJ,OAAOg7F,CACT,EACA,IAAI31G,EAAO,CACT21G,EAAiB,EAAQ31G,EACzB41G,EAAI,CACN,CACJ,CAAG,EAED,OAAO,eAAej7F,EAAM,WAAY,CACtC,aAAc,GACd,WAAY,GACZ,KAAM,CACJ,OAAO27F,CACT,EACA,IAAIt2G,EAAO,CACTs2G,EAAkB,EAAQt2G,EAC1B41G,EAAI,CACN,CACJ,CAAG,EAEDj7F,EAAK,UAAY,CAAC,CAAE,GAAAq7F,EAAI,IAAAC,CAAG,EAAK,CAAA,IAAO,CACjCD,GAAM,OAAMN,EAAO,GAAK,OAAOM,CAAE,GACjCC,GAAO,OAAMP,EAAO,IAAM,OAAOO,CAAG,GACxCL,EAAI,CACN,EAEAA,EAAI,EACGj7F,CACT,CCnIO,SAASg8F,GAAoB,CAClC,QAAA/1G,EAAU,CAAA,EACV,MAAAZ,EAAQ,KACR,UAAA+yG,EAAY,mBACZ,UAAAwC,EAAY,GACZ,QAAAqB,EAAU,GACV,SAAAn6B,EAAW,IACb,EAAI,GAAI,CACN,MAAMo6B,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,UAAYD,EAAU,GAAG7D,CAAS,6BAA+BA,EACpEwC,GAAWsB,EAAO,aAAa,aAActB,CAAS,EAE1D,MAAMuB,EAAa,CAACvjF,EAAc,CAAA,EAAIk/E,EAAYzyG,IAAU,CAC1D62G,EAAO,gBAAe,EACtB,UAAW7oF,KAASuF,EAAa,CAC/B,MAAMwjF,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,MAAQ,OAAO/oF,GAAO,OAAS,EAAE,EACxC+oF,EAAO,YAAc/oF,GAAO,OAAS,OAAOA,GAAO,OAAS,EAAE,EAC1DA,GAAO,WAAa,KAAM+oF,EAAO,SAAW,IAChDF,EAAO,YAAYE,CAAM,CAC3B,CACItE,GAAa,OAAMoE,EAAO,MAAQ,OAAOpE,CAAS,EACxD,EAEA,OAAAqE,EAAWl2G,EAASZ,CAAK,EACrBy8E,GACFo6B,EAAO,iBAAiB,SAAU,IAAMp6B,EAASo6B,EAAO,KAAK,CAAC,EAEhEA,EAAO,WAAaC,EACbD,CACT,CC5BA,MAAMj1G,GAAS,6BACTo1G,GAAqB,OAAO,OAAO,CAAC,WAAa,WAAa,UAAW,CAAC,EAC1EC,GAAU,KAEhB,SAASC,GAAmBl3G,EAAOC,EAAW+2G,GAAoB,CAChE,MAAMzzG,EAAS,MAAM,QAAQvD,CAAK,GAAK,YAAY,OAAOA,CAAK,EAAIA,EAAQC,EACrE0I,EAAI,OAAOpF,IAAS,CAAC,CAAC,EACtBqF,EAAI,OAAOrF,IAAS,CAAC,CAAC,EACtBuH,EAAI,OAAOvH,IAAS,CAAC,CAAC,EACtBiO,EAAS,KAAK,MAAM7I,EAAGC,EAAGkC,CAAC,EACjC,MAAI,CAAC,OAAO,SAAS0G,CAAM,GAAKA,GAAUylG,GAAgB,MAAM,KAAKh3G,CAAQ,EACtE,CAAC0I,EAAI6I,EAAQ5I,EAAI4I,EAAQ1G,EAAI0G,CAAM,CAC5C,CAEA,SAAS2lG,GAAcxuG,EAAGC,EAAG,CAC3B,MAAM4I,EAAS,KAAK,MAAM7I,EAAGC,CAAC,EAC9B,MAAI,CAAC,OAAO,SAAS4I,CAAM,GAAKA,GAAU,EAAU,CAAC7I,EAAGC,CAAC,EAClD,CAACD,EAAI6I,EAAQ5I,EAAI4I,CAAM,CAChC,CAEA,SAAS4lG,GAAgBp3G,EAAO,CAC9B,MAAMq3G,EAAS,OAAOr3G,CAAK,EAC3B,OAAK,OAAO,SAASq3G,CAAM,EACpBA,EAAO,QAAQ,CAAC,EAAE,QAAQ,SAAU,EAAE,EADR,GAEvC,CAEA,SAASC,GAAiBhP,EAAK/lG,EAAM4zE,EAAa,CAAA,EAAI,CACpD,MAAMp0E,EAAUumG,EAAI,gBAAgB1mG,GAAQW,CAAI,EAChD,SAAW,CAACY,EAAKnD,CAAK,IAAK,OAAO,QAAQm2E,CAAU,EAClDp0E,EAAQ,aAAaoB,EAAK,OAAOnD,CAAK,CAAC,EAEzC,OAAO+B,CACT,CAEO,SAASw1G,GAA4Bn8B,EAAWx6E,EAAU,GAAI,CACnE,MAAM0nG,EAAM1nG,EAAQ,UAAY,SAC1BE,EAAOF,EAAQ,OAAS,OAAS,OAAS,QAC1C+Z,EAAO2tF,EAAI,cAAc,KAAK,EACpC3tF,EAAK,UAAY,4BACjBA,EAAK,UAAU,IAAI,8BAA8B7Z,CAAI,EAAE,EAEvD,MAAMusF,EAAMib,EAAI,cAAc,QAAQ,EACtCjb,EAAI,KAAO,SACXA,EAAI,UAAY,iCAChBA,EAAI,QAAQ,OAASzsF,EAAQ,QAAU,kCACvCysF,EAAI,aAAa,aAAczsF,EAAQ,WAAa,wBAAwB,EAE5E,MAAM0lF,EAAMgxB,GAAiBhP,EAAK,MAAO,CACvC,MAAO,oCACP,QAAS,cACT,cAAe,OACf,UAAW,OACf,CAAG,EACKhpB,EAAUg4B,GAAiBhP,EAAK,SAAU,CAC9C,MAAO,qCACP,GAAI,GACJ,GAAI,GACJ,EAAG,EACP,CAAG,EACKkP,EAAUF,GAAiBhP,EAAK,UAAW,CAC/C,MAAO,sCACP,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,EACR,CAAG,EACKmP,EAAWH,GAAiBhP,EAAK,UAAW,CAChD,MAAO,sCACP,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,EACR,CAAG,EACKxb,EAAOwqB,GAAiBhP,EAAK,OAAQ,CACzC,MAAO,iCACP,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,EACR,CAAG,EACKh/F,EAASguG,GAAiBhP,EAAK,SAAU,CAC7C,MAAO,oCACP,GAAI,GACJ,GAAI,GACJ,EAAG,GACP,CAAG,EACKoP,EAAcJ,GAAiBhP,EAAK,IAAK,CAC7C,MAAO,yCACX,CAAG,EACKqP,EAASL,GAAiBhP,EAAK,UAAW,CAC9C,MAAO,oCACP,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,CACR,CAAG,EACKsP,EAAYN,GAAiBhP,EAAK,OAAQ,CAC9C,MAAO,wCACP,EAAG,6BACP,CAAG,EACDoP,EAAY,OAAOC,EAAQC,CAAS,EACpC,MAAMC,EAAkBP,GAAiBhP,EAAK,IAAK,CACjD,MAAO,uFACX,CAAG,EACKwP,EAAaR,GAAiBhP,EAAK,UAAW,CAClD,MAAO,4EACP,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,CACR,CAAG,EACDuP,EAAgB,YAAYC,CAAU,EACtCxxB,EAAI,OAAOhH,EAASk4B,EAASC,EAAU3qB,EAAMxjF,EAAQuuG,EAAiBH,CAAW,EACjFrqB,EAAI,YAAY/G,CAAG,EAEnB,MAAMyxB,EAASzP,EAAI,cAAc,KAAK,EACtCyP,EAAO,UAAY,oCACnB,MAAMlgC,EAAS,CAAA,EACf,UAAWrxB,IAAQ,CAAC,IAAK,IAAK,GAAG,EAAG,CAClC,MAAMiuB,EAAQ6zB,EAAI,cAAc,OAAO,EACvC7zB,EAAM,KAAO,SACbA,EAAM,UAAY,mBAClBA,EAAM,IAAM,KACZA,EAAM,IAAM,IACZA,EAAM,KAAO,OACbA,EAAM,UAAY,UAClBA,EAAM,QAAQ,KAAOjuB,EACrBiuB,EAAM,QAAQ,OAAS,GAAG7zE,EAAQ,mBAAqB,iCAAiC,IAAI4lD,CAAI,GAChGiuB,EAAM,aAAa,aAAc,SAASjuB,EAAK,YAAW,CAAE,EAAE,EAC9DuxD,EAAO,YAAYtjC,CAAK,EACxBoD,EAAO,KAAKpD,CAAK,CACnB,CAEA95D,EAAK,OAAO0yE,EAAK0qB,CAAM,EAEvB,MAAMC,EAAgB,IAAMd,GAAmB97B,GAAW,QAAK,CAAI,EAC7D68B,EAAiB,CAACliE,EAAW1zC,EAAQ,WAAa,CAClD+4E,GAAW,UACfA,GAAW,QAAQ87B,GAAmBnhE,EAAWiiE,GAAe,EAAG,CAAE,OAAQ,KAAM,MAAA31G,EAAO,CAC5F,EAEA,IAAI61G,EAAmBF,EAAa,EAChCG,EAAiB,EACrB,MAAMvC,EAAO,CAAC51G,EAAQg4G,MAAoB,CACxCE,EAAmBhB,GAAmBl3G,EAAOk4G,CAAgB,EAC7D,KAAM,CAACvvG,EAAGC,EAAGkC,EAAC,EAAIotG,EACZE,GAAK,GAAKzvG,EAAI,GACd0vG,GAAK,GAAKzvG,EAAI,GACd0vG,GAAK,GAAK3vG,EAAI,GACd4vG,GAAK,GAAK3vG,EAAI,GACd4vG,GAAc,KAAK,MAAMH,GAAK,GAAID,GAAK,EAAE,EAAI,IAAM,KAAK,GACxDK,EAAkB,KAAK,MAAMF,GAAK,GAAID,GAAK,EAAE,EAAI,IAAM,KAAK,GAC5DI,GAAU,IAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI5tG,EAAC,CAAC,CAAC,EAAI,IAC9DgiF,EAAK,aAAa,KAAMsqB,GAAgBt2G,IAAS,OAASw3G,GAAK,EAAE,CAAC,EAClExrB,EAAK,aAAa,KAAMsqB,GAAgBt2G,IAAS,OAASy3G,GAAK,EAAE,CAAC,EAClEzrB,EAAK,aAAa,KAAMsqB,GAAgBgB,EAAE,CAAC,EAC3CtrB,EAAK,aAAa,KAAMsqB,GAAgBiB,EAAE,CAAC,EAC3CV,EAAO,aAAa,KAAMP,GAAgBsB,EAAO,CAAC,EAClDZ,EAAW,aAAa,KAAMV,GAAgBsB,EAAO,CAAC,EACtDhB,EAAY,aAAa,YAAa,aAAaN,GAAgBgB,EAAE,CAAC,IAAIhB,GAAgBiB,EAAE,CAAC,YAAYjB,GAAgBoB,EAAW,CAAC,GAAG,EACxIX,EAAgB,aAAa,YAAa,aAAaT,GAAgBkB,EAAE,CAAC,IAAIlB,GAAgBmB,EAAE,CAAC,YAAYnB,GAAgBqB,CAAe,CAAC,GAAG,EAChJf,EAAY,QAAQ,KAAO5sG,GAAI,EAAI,OAAS,QAC5C+sG,EAAgB,QAAQ,KAAO/sG,IAAK,EAAI,OAAS,QACjDuiF,EAAI,QAAQ,KAAOviF,GAAI,EAAI,OAAS,QACpCuiF,EAAI,aAAa,iBAAkB,KAAK+pB,GAAgBzuG,CAAC,CAAC,OAAOyuG,GAAgBxuG,CAAC,CAAC,OAAOwuG,GAAgBtsG,EAAC,CAAC,EAAE,EAC9G,QAAS5B,EAAI,EAAGA,EAAI2uE,EAAO,OAAQ3uE,GAAK,EACtC2uE,EAAO3uE,CAAC,EAAE,MAAQkuG,GAAgBc,EAAiBhvG,CAAC,CAAC,EACrD2uE,EAAO3uE,CAAC,EAAE,SAAW,EAAQkyE,GAAW,SAE1CiS,EAAI,SAAW,EAAQjS,GAAW,QACpC,EAEMu9B,EAAqBt2G,GAAU,CACnC,MAAMO,EAAOyqF,EAAI,sBAAqB,EAChChkF,EAAO,KAAK,IAAI,EAAG,KAAK,IAAIzG,EAAK,MAAOA,EAAK,MAAM,CAAC,EACpDolD,GAAOplD,EAAK,MAAQA,EAAK,MAAQyG,GAAQ,EACzC8+C,GAAMvlD,EAAK,KAAOA,EAAK,OAASyG,GAAQ,EAC9C,IAAIV,KAAMtG,EAAM,QAAU2lD,IAAQ3+C,EAAO,IAAO,EAC5CT,GAAI,IAAIvG,EAAM,QAAU8lD,IAAO9+C,EAAO,IAAO,GACjD,OAACV,GAAGC,EAAC,EAAIuuG,GAAcxuG,GAAGC,EAAC,EACpB,CAACD,GAAGC,EAAC,CACd,EAEMgwG,EAAkB,CAACjwG,EAAGC,IAAM,CAChC,GAAI9H,IAAS,OAAQ,MAAO,GAC5B,MAAM+3G,EAAgB,KAAK,MAAMlwG,EAAIuvG,EAAiB,CAAC,EAAGtvG,EAAIsvG,EAAiB,CAAC,CAAC,EAEjF,OADqB,KAAK,MAAMvvG,EAAIuvG,EAAiB,CAAC,EAAGtvG,EAAIsvG,EAAiB,CAAC,CAAC,EAC1DW,EAAgB,GAAK,CAC7C,EAEMC,EAAuB,CAACz2G,EAAO02G,EAAWZ,IAAmB,CACjE,KAAM,CAACxvG,EAAGC,EAAC,EAAI+vG,EAAkBt2G,CAAK,EAChCyI,GAAI,KAAK,KAAK,KAAK,IAAI,EAAG,EAAInC,EAAIA,EAAIC,GAAIA,EAAC,CAAC,EAClD,OAAI9H,IAAS,QAAUi4G,EAAW,EAAU,CAAC,CAACpwG,EAAG,CAACC,GAAG,CAACkC,EAAC,EAChD,CAACnC,EAAGC,GAAGkC,EAAC,CACjB,EAEMkuG,EAAwBnK,GAAmB94D,GAAc,CAC7DkiE,EAAeliE,EAAW,OAAO,CACnC,CAAC,EAED,IAAIkjE,EAAoB,KACxB,MAAMC,EAAiB72G,GAAU,CAC/B,GAAI+4E,GAAW,SAAU,OACzB/4E,EAAM,eAAc,EACpB42G,EAAoB52G,EAAM,UAC1BgrF,EAAI,oBAAoBhrF,EAAM,SAAS,EACvC,KAAM,CAACsG,EAAGC,CAAC,EAAI+vG,EAAkBt2G,CAAK,EACtC81G,EAAiBS,EAAgBjwG,EAAGC,CAAC,EACrC,MAAMpG,GAAOs2G,EAAqBz2G,EAAO81G,CAAc,EACvDvC,EAAKpzG,EAAI,EACTw2G,EAAsBx2G,EAAI,CAC5B,EACM22G,EAAiB92G,GAAU,CAC/B,GAAI42G,IAAsB52G,EAAM,UAAW,OAC3CA,EAAM,eAAc,EACpB,MAAMG,EAAOs2G,EAAqBz2G,EAAO81G,CAAc,EACvDvC,EAAKpzG,CAAI,EACTw2G,EAAsBx2G,CAAI,CAC5B,EACM42G,EAAe/2G,GAAU,CAC7B,GAAI42G,IAAsB52G,EAAM,UAAW,OAC3CA,EAAM,eAAc,EACpB,MAAMG,EAAOs2G,EAAqBz2G,EAAO81G,CAAc,EACvDvC,EAAKpzG,CAAI,EACTw2G,EAAsBx2G,CAAI,EAC1Bw2G,EAAsB,MAAK,EAC3BC,EAAoB,KACpB5rB,EAAI,wBAAwBhrF,EAAM,SAAS,CAC7C,EACMg3G,EAAmBh3G,GAAU,CAC7B42G,IAAsB52G,EAAM,YAChC22G,EAAsB,OAAM,EAC5BC,EAAoB,KACpB5rB,EAAI,wBAAwBhrF,EAAM,SAAS,EAC3CuzG,EAAI,EACN,EAEM0D,EAAe,IAAM,CACzB,MAAM92G,EAAO01G,EAAiB,MAAK,EACnC,QAAShvG,EAAI,EAAGA,EAAI2uE,EAAO,OAAQ3uE,GAAK,EAAG,CACzC,MAAMlJ,EAAQ,OAAO63E,EAAO3uE,CAAC,EAAE,KAAK,EAChC,OAAO,SAASlJ,CAAK,IAAGwC,EAAK0G,CAAC,EAAIlJ,EACxC,CACAi4G,EAAez1G,EAAM,QAAQ,EAC7BozG,EAAKoC,EAAa,CAAE,CACtB,EAEMtE,EAAkBrxG,GAAU,CAC5BA,EAAM,MAAQ,UAClBi3G,EAAY,EACZj3G,EAAM,cAAc,KAAI,EAC1B,EAEM0vG,EAAa1vG,GAAU,CAC3B,GAAI+4E,GAAW,SAAU,OACzB,MAAMvsB,EAAOxsD,EAAM,SAAW,IAAO,IAC/BG,EAAO01G,EAAiB,MAAK,EACnC,GAAI71G,EAAM,MAAQ,YAAaG,EAAK,CAAC,GAAKqsD,UACjCxsD,EAAM,MAAQ,aAAcG,EAAK,CAAC,GAAKqsD,UACvCxsD,EAAM,MAAQ,UAAWG,EAAK,CAAC,GAAKqsD,UACpCxsD,EAAM,MAAQ,YAAaG,EAAK,CAAC,GAAKqsD,UACtCxsD,EAAM,MAAQ,SAAUG,EAAK,CAAC,GAAKqsD,UACnCxsD,EAAM,MAAQ,WAAYG,EAAK,CAAC,GAAKqsD,UACrCxsD,EAAM,MAAQ,OAAQG,EAAK,OAAO,EAAG,EAAG,GAAGw0G,EAAkB,MACjE,QACL30G,EAAM,eAAc,EACpB41G,EAAez1G,EAAM,QAAQ,EAC7BozG,EAAKoC,EAAa,CAAE,CACtB,EAEA3qB,EAAI,iBAAiB,cAAe6rB,CAAa,EACjD7rB,EAAI,iBAAiB,cAAe8rB,CAAa,EACjD9rB,EAAI,iBAAiB,YAAa+rB,CAAW,EAC7C/rB,EAAI,iBAAiB,gBAAiBgsB,CAAe,EACrDhsB,EAAI,iBAAiB,UAAW0kB,CAAS,EACzC,UAAWt9B,KAASoD,EAClBpD,EAAM,iBAAiB,SAAU6kC,CAAY,EAC7C7kC,EAAM,iBAAiB,UAAWi/B,CAAc,EAElD,MAAM6F,EAAcn+B,GAAW,YAAYw6B,CAAI,GAAK,KACpD,OAAAA,EAAI,EAEG,CACL,QAASj7F,EACT,IAAKi7F,EACL,SAAU,CACR2D,IAAW,EACXP,EAAsB,OAAM,EAC5B3rB,EAAI,oBAAoB,cAAe6rB,CAAa,EACpD7rB,EAAI,oBAAoB,cAAe8rB,CAAa,EACpD9rB,EAAI,oBAAoB,YAAa+rB,CAAW,EAChD/rB,EAAI,oBAAoB,gBAAiBgsB,CAAe,EACxDhsB,EAAI,oBAAoB,UAAW0kB,CAAS,EAC5C,UAAWt9B,KAASoD,EAClBpD,EAAM,oBAAoB,SAAU6kC,CAAY,EAChD7kC,EAAM,oBAAoB,UAAWi/B,CAAc,EAErD/4F,EAAK,OAAM,CACb,CACJ,CACA,CC/SA,SAAS9Y,GAAiBE,EAAS,CACjC,GAAIA,aAAmB,YAAa,OAAOA,EAC3C,MAAMy3G,EAAM,SAAS,cAAc,KAAK,EACxC,OAAIz3G,GAAW,OAAMy3G,EAAI,YAAc,OAAOz3G,CAAO,GAC9Cy3G,CACT,CAEA,SAASC,GAAe33G,EAAQ9B,EAAO,CACrC,GAAIA,GAAS,KACb,IAAI,MAAM,QAAQA,CAAK,EAAG,CACxB,UAAWguB,KAAShuB,EAAOy5G,GAAe33G,EAAQksB,CAAK,EACvD,MACF,CACA,GAAIhuB,aAAiB,KAAM,CACzB8B,EAAO,YAAY9B,CAAK,EACxB,MACF,CACA8B,EAAO,YAAYD,GAAiB7B,CAAK,CAAC,EAC5C,CAUO,MAAM05G,EAAW,CACtB,YAAY94G,EAAU,GAAI,CACxB,KAAK,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,UAAY,kBACzB,KAAK,OAAS,IAAI,IAClB,MAAMu6E,EAAQv6E,EAAQ,OAAS,CAAA,EAC/B,UAAW01E,KAAQ6E,EAAO,KAAK,IAAI7E,CAAI,CACzC,CAEA,IAAI11E,EAAS,CACX,GAAI,CAACA,GAAS,GAAI,MAAM,IAAI,MAAM,4BAA4B,EAC9D,GAAI,KAAK,OAAO,IAAIA,EAAQ,EAAE,EAAG,MAAM,IAAI,MAAM,eAAeA,EAAQ,EAAE,kBAAkB,EAE5F,MAAM01E,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,qBACjBA,EAAK,QAAQ,UAAY11E,EAAQ,UAAY,OAAS,QAEtD,MAAMmsG,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,KAAO,SACdA,EAAO,UAAY,6BACnB,MAAM4M,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,iCAEtB,MAAMC,EAAS,SAAS,cAAc,MAAM,EAC5CA,EAAO,UAAY,6BACnBA,EAAO,aAAa,cAAe,MAAM,EAEzC,MAAMl0F,EAAQ,SAAS,cAAc,MAAM,EAC3CA,EAAM,UAAY,4BAClBA,EAAM,YAAc9kB,EAAQ,OAASA,EAAQ,GAE7C,IAAI6gB,EAAS,KACT7gB,EAAQ,YAAc,KACxB6gB,EAAS,SAAS,cAAc,MAAM,EACtCA,EAAO,UAAY,6BACnBA,EAAO,QAAQ,MAAQ,OACvBA,EAAO,OAAS,GAChBA,EAAO,aAAa,cAAe,MAAM,GAG3C,MAAMm0F,EAAO,IAAM,CACjB,MAAM5M,EAAY1yB,EAAK,QAAQ,YAAc,OAC7Cy2B,EAAO,aAAa,gBAAiB/D,EAAY,QAAU,MAAM,EACjE4Q,EAAO,YAAc5Q,EAAY,IAAM,GACzC,EAEA+D,EAAO,YAAY6M,CAAM,EACrBn4F,GAAQsrF,EAAO,YAAYtrF,CAAM,EACrCsrF,EAAO,YAAYrnF,CAAK,EACxBi0F,EAAU,YAAY5M,CAAM,EAC5B,IAAI8M,EAAiB,KACjBj5G,EAAQ,gBAAkB,OAC5Bi5G,EAAiB,SAAS,cAAc,KAAK,EAC7CA,EAAe,UAAY,sCAC3BJ,GAAeI,EAAgBj5G,EAAQ,cAAc,EACjDi5G,EAAe,WAAW,OAAS,EACrCF,EAAU,YAAYE,CAAc,EAEpCA,EAAiB,MAGrBjE,EAAI,EAEJ,MAAMkE,EAAO,SAAS,cAAc,KAAK,EACzC,OAAAA,EAAK,UAAY,2BACjBA,EAAK,YAAYj4G,GAAiBjB,EAAQ,OAAO,CAAC,EAElDmsG,EAAO,iBAAiB,QAAS,IAAM,CACrCz2B,EAAK,QAAQ,UAAYA,EAAK,QAAQ,YAAc,OAAS,QAAU,OACvEs/B,EAAI,CACN,CAAC,EAEDt/B,EAAK,YAAYqjC,CAAS,EAC1BrjC,EAAK,YAAYwjC,CAAI,EACrB,KAAK,QAAQ,YAAYxjC,CAAI,EAC7B,KAAK,OAAO,IAAI11E,EAAQ,GAAI,CAAE,KAAA01E,EAAM,OAAAy2B,EAAQ,UAAA4M,EAAW,eAAAE,EAAgB,KAAAC,EAAM,OAAAr4F,CAAM,CAAE,EAC9E7gB,EAAQ,EACjB,CAEA,UAAUwR,EAAIqP,EAAQ,CACpB,MAAMuM,EAAQ,KAAK,OAAO,IAAI5b,CAAE,EAChC,GAAI,CAAC4b,GAAO,OAAQ,OACpB,MAAMztB,EAAa,OAAOkhB,GAAW,SAAWA,EAAS,OACzDuM,EAAM,OAAO,QAAQ,MAAQztB,EAC7BytB,EAAM,OAAO,OAASztB,IAAe,MACvC,CAEA,SAAU,CACR,KAAK,QAAQ,OAAM,EACnB,KAAK,OAAO,MAAK,CACnB,CACF,CCvHA,SAASsB,GAAiBE,EAAS,CACjC,GAAIA,aAAmB,YAAa,OAAOA,EAC3C,MAAMy3G,EAAM,SAAS,cAAc,KAAK,EACxC,OAAIz3G,GAAW,OAAMy3G,EAAI,YAAc,OAAOz3G,CAAO,GAC9Cy3G,CACT,CAEA,SAASO,GAAwB71E,EAAS,CACxC,GAAI,OAAOA,GAAY,SAAU,MAAO,GACxC,MAAM81E,EAAU91E,EAAQ,KAAI,EAAG,YAAW,EAAG,QAAQ,eAAgB,EAAE,EACvE,OAAK81E,EACE,oBAAoBA,CAAO,GADb,EAEvB,CAWO,MAAMC,EAAY,CACvB,YAAYr5G,EAAU,GAAI,CACxB,KAAK,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,UAAY,iBAAiBm5G,GAAwBn5G,EAAQ,OAAO,CAAC,GAElF,KAAK,IAAM,SAAS,cAAc,KAAK,EACvC,KAAK,IAAI,UAAY,sBACrB,KAAK,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,UAAY,2BACzB,KAAK,SAAW,SAAS,cAAc,KAAK,EAC5C,KAAK,SAAS,UAAY,4BAC1B,KAAK,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,UAAY,0BAEzB,KAAK,IAAI,YAAY,KAAK,OAAO,EACjC,KAAK,IAAI,YAAY,KAAK,QAAQ,EAClC,KAAK,QAAQ,YAAY,KAAK,GAAG,EACjC,KAAK,QAAQ,YAAY,KAAK,OAAO,EAErC,KAAK,MAAQ,IAAI,IACjB,KAAK,UAAY,KACjB,KAAK,iBAAmB,OAAOA,EAAQ,iBAAoB,WAAaA,EAAQ,gBAAkB,KAE9FA,EAAQ,UACV,KAAK,SAAS,YAAYiB,GAAiBjB,EAAQ,QAAQ,CAAC,EAG9D,MAAMs5G,EAAOt5G,EAAQ,MAAQ,CAAA,EAC7B,UAAWu5G,KAAOD,EAAM,KAAK,OAAOC,CAAG,EACnCv5G,EAAQ,UAAU,KAAK,UAAUA,EAAQ,QAAQ,EACjD,CAAC,KAAK,WAAas5G,EAAK,QAAQ,KAAK,UAAUA,EAAK,CAAC,EAAE,EAAE,CAC/D,CAEA,OAAOC,EAAK,CACV,GAAI,CAACA,GAAK,GAAI,MAAM,IAAI,MAAM,oCAAoC,EAClE,GAAI,KAAK,MAAM,IAAIA,EAAI,EAAE,EAAG,MAAM,IAAI,MAAM,QAAQA,EAAI,EAAE,kBAAkB,EAC5E,MAAM3E,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,KAAO,SACdA,EAAO,UAAY,gBACnBA,EAAO,YAAc2E,EAAI,OAASA,EAAI,GACtC3E,EAAO,iBAAiB,QAAS,IAAM,KAAK,UAAU2E,EAAI,EAAE,CAAC,EAE7D,MAAMviB,EAAQ,SAAS,cAAc,KAAK,EAC1C,OAAAA,EAAM,UAAY,qBAClBA,EAAM,QAAQ,MAAQuiB,EAAI,GAC1BviB,EAAM,YAAY/1F,GAAiBs4G,EAAI,OAAO,CAAC,EAE/C,KAAK,QAAQ,YAAY3E,CAAM,EAC/B,KAAK,QAAQ,YAAY5d,CAAK,EAC9B,KAAK,MAAM,IAAIuiB,EAAI,GAAI,CAAE,GAAIA,EAAI,GAAI,OAAA3E,EAAQ,MAAA5d,CAAK,CAAE,EAE/C,KAAK,WAAW,KAAK,UAAUuiB,EAAI,EAAE,EACnCA,EAAI,EACb,CAEA,UAAU/nG,EAAI,CACZ,GAAK,KAAK,MAAM,IAAIA,CAAE,EACtB,MAAK,UAAYA,EACjB,SAAW,CAACgoG,EAAOD,CAAG,IAAK,KAAK,MAAM,UAAW,CAC/C,MAAMntG,EAASotG,IAAUhoG,EACzB+nG,EAAI,OAAO,QAAQ,OAASntG,EAAS,OAAS,QAC9CmtG,EAAI,MAAM,QAAQ,OAASntG,EAAS,OAAS,OAC/C,CACA,GAAI,KAAK,iBACP,GAAI,CACF,KAAK,iBAAiBoF,CAAE,CAC1B,OAASvN,EAAO,CACd,QAAQ,KAAK,sDAAuDA,CAAK,CAC3E,EAEJ,CAEA,UAAW,CACT,OAAO,KAAK,SACd,CAEA,SAAU,CACR,KAAK,QAAQ,OAAM,EACnB,KAAK,MAAM,MAAK,EAChB,KAAK,UAAY,IACnB,CACF,CCxGA,SAASw1G,GAAal3G,EAAK,CACzB,OAAO,OAAOA,GAAO,EAAE,EAAE,KAAI,CAC/B,CAEA,SAASm3G,GAAe50F,EAAO,CAE7B,OADc,OAAOA,GAAS,EAAE,EAAE,KAAI,GACtB,IAClB,CAEA,MAAM60F,GAAiB,OAAO,OAAO,CACnC,GAAI,KACJ,IAAK,MACL,IAAK,MACL,GAAI,KACJ,GAAI,KACJ,IAAK,MACL,KAAM,OACN,KAAM,OACN,GAAI,KACJ,KAAM,OACN,IAAK,MACL,KAAM,OACN,MAAO,QACP,OAAQ,QACV,CAAC,EASM,SAASC,GAAqBx6G,EAAO,CAC1C,MAAMq2B,EAAM,OAAOr2B,GAAS,EAAE,EAAE,KAAI,EACpC,OAAKq2B,GACQA,EACV,MAAM,GAAG,EACT,IAAK0uD,GAASA,EAAK,KAAI,CAAE,EACzB,OAAQA,GAASA,GAAQ,CAAC,SAAS,KAAKA,CAAI,CAAC,EAC7C,IAAG,GAAM1uD,GAET,QAAQ,UAAW,GAAG,EACtB,QAAQ,sBAAuB,OAAO,EACtC,QAAQ,yBAA0B,OAAO,EACzC,QAAQ,QAAS,GAAG,EACpB,KAAI,EAEJ,MAAM,GAAG,EACT,OAAO,OAAO,EACd,IAAK0uD,GAAS,CACb,MAAMiH,EAAQjH,EAAK,YAAW,EAC9B,OAAIw1B,GAAevuB,CAAK,EAAUuuB,GAAevuB,CAAK,EAC/C,GAAGjH,EAAK,MAAM,EAAG,CAAC,EAAE,YAAW,CAAE,GAAGA,EAAK,MAAM,CAAC,CAAC,EAC1D,CAAC,EACA,KAAK,GAAG,EApBM,EAqBnB,CAEA,SAAS01B,GAAQnkC,EAAM,CACrB,OAAI,OAAOA,GAAS,SACN+jC,GAAa/jC,CAAI,GACf,KAEZ,CAACA,GAAQ,OAAOA,GAAS,SAAiB,KAC1C,OAAOA,EAAK,KAAQ,SACV+jC,GAAa/jC,EAAK,GAAG,GACnB,KAEZ,OAAOA,EAAK,WAAc,UAChB+jC,GAAa/jC,EAAK,SAAS,GACzB,IAGlB,CAEA,SAASokC,GAAgBpkC,EAAM/nE,EAAO,GAAI,CACxC,MAAMpL,EAAMs3G,GAAQnkC,CAAI,EAExB,GADInzE,GAAKoL,EAAK,KAAKpL,CAAG,EAClB,CAACmzE,GAAQ,OAAOA,GAAS,SAAU,OAAO/nE,EAC9C,UAAWy/E,KAAS1X,EAAK,OAAS,CAAA,EAAIokC,GAAgB1sB,EAAOz/E,CAAI,EACjE,OAAOA,CACT,CAUO,SAASosG,GAAsBrkC,EAAM09B,EAAe,KAAM,CAC/D,MAAM4G,EAAYN,GAAe,OAAOhkC,GAAS,UAAYA,EAAOA,EAAK,MAAQ,IAAI,EACrF,GAAIskC,EAAW,OAAOA,EACtB,MAAMz3G,EAAMs3G,GAAQnkC,CAAI,EACxB,GAAInzE,GAAO,OAAO6wG,GAAc,OAAU,WAAY,CACpD,MAAM6G,EAAaP,GAAetG,EAAa,MAAM7wG,CAAG,GAAG,IAAI,KAAK,EACpE,GAAI03G,EAAY,OAAOA,CACzB,CACA,MAAM56G,EAAWkD,IACX,OAAOmzE,GAAS,UAAYA,EAAQA,EAAK,IAAMA,EAAK,KAAQA,GAClE,OAAOkkC,GAAqBv6G,CAAQ,CACtC,CASO,SAAS66G,GAAqBxhF,EAAS,GAAI,CAChD,MAAMyhF,EAAW,MAAM,QAAQzhF,EAAO,QAAQ,EAAIA,EAAO,SAAW,CAAA,EACpE,MAAO,CACL,GAAI+gF,GAAa/gF,EAAO,EAAE,EAC1B,MAAO,OAAOA,EAAO,OAAU,SAAWA,EAAO,MAAQ+gF,GAAa/gF,EAAO,EAAE,EAC/E,KAAMA,EAAO,MAAQ,KACrB,SAAUyhF,EAAS,IAAKC,IAAa,CACnC,GAAIX,GAAaW,GAAS,EAAE,EAC5B,MAAO,OAAOA,GAAS,OAAU,SAAWA,EAAQ,MAAQX,GAAaW,GAAS,EAAE,EACpF,MAAO,MAAM,QAAQA,GAAS,KAAK,EAAIA,EAAQ,MAAM,MAAK,EAAK,CAAA,CACrE,EAAM,CACN,CACA,CASO,SAASC,GAAgB3hF,EAAS,GAAI,CAC3C,MAAM/4B,EAAau6G,GAAqBxhF,CAAM,EACxC/qB,EAAO,CAAA,EACb,UAAWysG,KAAWz6G,EAAW,SAC/B,UAAW+1E,KAAQ0kC,EAAQ,MAAON,GAAgBpkC,EAAM/nE,CAAI,EAE9D,OAAO,MAAM,KAAK,IAAI,IAAIA,CAAI,CAAC,CACjC,CAUO,SAAS2sG,GAAkB5hF,EAAS,GAAI06E,EAAe,KAAM,CAClE,MAAMzzG,EAAau6G,GAAqBxhF,CAAM,EACxC6hF,EAAkB,CAAA,EACxB,IAAIC,EAAkB,EAClBC,EAAkB,EAClBC,EAAoB,EACxB,UAAWN,KAAWz6G,EAAW,SAAU,CACzC,MAAMgO,EAAO,CAAA,EACb,UAAW+nE,KAAQ0kC,EAAQ,MAAON,GAAgBpkC,EAAM/nE,CAAI,EAC5D,GAAI,CAACA,EAAK,OAAQ,CAChB4sG,EAAgBH,EAAQ,EAAE,EAAI,UAC9B,QACF,CACAM,GAAqB,EACrB,MAAMj2G,EAAUkJ,EAAK,OAAQpL,IAAS6wG,GAAc,SAAS7wG,CAAG,GAAG,OAAS,aAAe,SAAS,EAAE,OAChGuI,EAAQrG,GAAW,EAAI,UAAaA,IAAYkJ,EAAK,OAAS,UAAY,UAChF4sG,EAAgBH,EAAQ,EAAE,EAAItvG,EAC1BA,IAAU,YAAW0vG,GAAmB,GACxC1vG,IAAU,YAAW2vG,GAAmB,EAC9C,CAIA,MAAO,CACL,MAJiBD,GAAmB,EAClC,UACCC,GAAmB,GAAKD,IAAoBE,EAAoB,UAAY,UAG/E,SAAUH,CACd,CACA,CAUO,SAASI,GAAuBjiF,EAAS,GAAIkiF,EAAY,GAAI,CAClE,MAAMj7G,EAAau6G,GAAqBxhF,CAAM,EACxClnB,EAAKioG,GAAamB,CAAS,EAC3BR,EAAUz6G,EAAW,SAAS,KAAMytB,GAAUA,EAAM,KAAO5b,CAAE,EACnE,GAAI,CAAC4oG,EAAS,MAAO,CAAA,EACrB,MAAMzsG,EAAO,CAAA,EACb,UAAW+nE,KAAQ0kC,EAAQ,MAAON,GAAgBpkC,EAAM/nE,CAAI,EAC5D,OAAO,MAAM,KAAK,IAAI,IAAIA,CAAI,CAAC,CACjC,CAWO,SAASktG,GAAyBniF,EAAS,CAAA,EAAIkiF,EAAY,GAAIxH,EAAe,KAAM,CACzF,MAAM0H,EAAWR,GAAkB5hF,EAAQ06E,CAAY,EACjD5hG,EAAKioG,GAAamB,CAAS,EACjC,OAAOE,EAAS,SAAStpG,CAAE,GAAK,SAClC,CAaO,SAASupG,GAA2B,CACzC,OAAApwG,EACA,OAAA+tB,EACA,UAAAkiF,EAAY,KACZ,cAAA3I,EAAgB,IAClB,EAAI,GAAI,CACN,MAAMnD,EAAY,SAAS,cAAc,MAAM,EAC/CA,EAAU,UAAY,8DACtBA,EAAU,QAAQ,MAAQ,UAC1BA,EAAU,QAAQ,OAASoL,GAAqBxhF,CAAM,EAAE,GACxDo2E,EAAU,aAAa,aAAc,oBAAoB,EACzDA,EAAU,aAAa,cAAe,MAAM,EACxC8L,GAAa,OAAM9L,EAAU,QAAQ,QAAU2K,GAAamB,CAAS,GAEzE,MAAMrtD,EAAS,IAAM,CACnB,MAAM6lD,EAAezoG,GAAQ,QAAU,KACvC,IAAI+oG,EAAY,UACZkH,GAAa,KACflH,EAAYmH,GAAyBniF,EAAQkiF,EAAWxH,CAAY,EAEpEM,EAAY4G,GAAkB5hF,EAAQ06E,CAAY,EAAE,MAElDtE,EAAU,QAAQ,QAAU4E,IAAW5E,EAAU,QAAQ,MAAQ4E,EACvE,EACM73B,EAAW,IAAMtuB,EAAM,EACvB6lD,EAAezoG,GAAQ,QAAU,KACjCqwG,EAAaJ,GAAa,KAC5BD,GAAuBjiF,EAAQkiF,CAAS,EACxCP,GAAgB3hF,CAAM,EACpBuiF,EAAqB,OAAO7H,GAAc,WAAc,WAC1D4H,EAAW,IAAKz4G,GAAQ6wG,EAAa,UAAU7wG,EAAKs5E,EAAU,CAAE,UAAW,GAAO,CAAC,EACnF,CAAA,EACJ,OAAKo/B,EAAmB,QAAQ7H,GAAc,mBAAmB,SAAUv3B,CAAQ,EACnFu3B,GAAc,mBAAmB,SAAUv3B,CAAQ,EACnDizB,EAAU,QAAU,IAAM,CACxB,UAAW6J,KAAesC,EAAoBtC,IAAW,EACpDsC,EAAmB,QAAQ7H,GAAc,sBAAsB,SAAUv3B,CAAQ,EACtFu3B,GAAc,sBAAsB,SAAUv3B,CAAQ,CACxD,EACAo2B,IAAgBnD,EAAW,iDAAiD,EAC5EvhD,EAAM,EACCuhD,CACT,CAOY,MAACoM,GAAqB,OAAO,OAAO,CAC9C,GAAI,QACJ,MAAO,QACP,KAAM,OACN,SAAU,CACR,CACE,GAAI,aACJ,MAAO,aACP,MAAO,CACL,WACA,kBACA,wBACA,kCACA,iCACA,oCACA,yCACA,kCACA,oCACA,qCACA,CAAE,IAAK,+CAAgD,MAAO,gBAAgB,EAC9E,CAAE,IAAK,4DAA6D,MAAO,sBAAsB,EACjG,CAAE,IAAK,kEAAmE,MAAO,kBAAkB,EACnG,CAAE,IAAK,uDAAwD,MAAO,gBAAgB,EACtF,CAAE,IAAK,yDAA0D,MAAO,kBAAkB,EAC1F,CAAE,IAAK,wDAAyD,MAAO,oBAAoB,EAC3F,CAAE,IAAK,wDAAyD,MAAO,oBAAoB,EAC3F,CAAE,KAAM,SAAU,GAAI,eAAgB,UAAW,cAAc,EAC/D,CAAE,KAAM,SAAU,GAAI,eAAgB,UAAW,cAAc,EAC/D,4BACA,0BACA,0BACA,mCACA,+BACA,oCACA,uCACA,oCACA,oCACA,kCACA,qCACA,8BACA,sCACA,oCACA,oCACA,uCACA,qCACA,mCACA,mCACA,6CACA,6CACA,qCACR,CACA,EACI,CACE,GAAI,SACJ,MAAO,SACP,MAAO,CACL,cACA,iBACA,gCACA,gBACA,oBACA,uBACA,yBACA,sBACA,4BACA,kBACA,kBACA,iBACA,cACA,sBACA,mBACR,CACA,EACI,CACE,GAAI,WACJ,MAAO,WACP,MAAO,CACL,gCACA,4CACA,mCACA,wCACA,iCACA,mCACA,oCACA,2BACA,sCACA,kCACA,0CACR,CACA,CACA,CACA,CAAC,EAOYC,GAAsB,OAAO,OAAO,CAC/C,GAAI,SACJ,MAAO,SACP,KAAM,QACN,SAAU,CACR,CACE,GAAI,aACJ,MAAO,aACP,MAAO,CACL,cACA,iBACA,gCACA,eACR,CACA,EACI,CACE,GAAI,SACJ,MAAO,SACP,MAAO,CACL,oBACA,yBACA,kBACA,gBACR,CACA,EACI,CACE,GAAI,QACJ,MAAO,QACP,MAAO,CACL,uBACA,sBACA,4BACA,kBACA,cACA,sBACA,mBACR,CACA,CACA,CACA,CAAC,EAOYC,GAAuB,OAAO,OAAO,CAChD,GAAI,UACJ,MAAO,UACP,KAAM,QACN,SAAU,CACR,CACE,GAAI,aACJ,MAAO,aACP,MAAO,CACL,kBACA,4BACA,wBACA,sBACA,wBACA,uBACA,uBACR,CACA,EACI,CACE,GAAI,SACJ,MAAO,SACP,MAAO,CACL,CAAE,IAAK,mBAAoB,SAAU,IAAK,UAAW,CAAC,EAAG,EAAE,CAAC,EAC5D,CAAE,IAAK,kBAAmB,SAAU,EAAG,UAAW,CAAC,EAAG,CAAC,CAAC,EACxD,CAAE,IAAK,gBAAiB,SAAU,EAAG,UAAW,CAAC,GAAK,CAAC,CAAC,EACxD,CAAE,IAAK,2BAA4B,SAAU,IAAK,UAAW,CAAC,GAAI,GAAG,EAAG,KAAM,CAAC,CACvF,CACA,EACI,CACE,GAAI,SACJ,MAAO,SACP,MAAO,CACL,CAAE,KAAM,SAAU,GAAI,gBAAiB,UAAW,gBAAgB,EAClE,CAAE,KAAM,SAAU,GAAI,oBAAqB,UAAW,oBAAoB,CAClF,CACA,CACA,CACA,CAAC,EAOYC,GAAuB,OAAO,OAAO,CAChD,GAAI,UACJ,MAAO,UACP,KAAM,QACN,SAAU,CACR,CACE,GAAI,QACJ,MAAO,QACP,MAAO,CACL,CAAE,KAAM,SAAU,GAAI,qBAAsB,UAAW,cAAc,EACrE,CAAE,IAAK,qBAAsB,MAAO,YAAY,EAChD,CAAE,IAAK,oBAAqB,MAAO,WAAW,EAC9C,CAAE,IAAK,uBAAwB,MAAO,cAAc,EACpD,CAAE,IAAK,uBAAwB,MAAO,cAAc,EACpD,CAAE,IAAK,4BAA6B,MAAO,oBAAoB,EAC/D,CAAE,IAAK,wBAAyB,MAAO,eAAe,CAC9D,CACA,EACI,CACE,GAAI,QACJ,MAAO,QACP,MAAO,CACL,CAAE,KAAM,SAAU,GAAI,qBAAsB,UAAW,cAAc,EACrE,CAAE,IAAK,qBAAsB,MAAO,YAAY,EAChD,CAAE,IAAK,qBAAsB,MAAO,YAAY,EAChD,CAAE,IAAK,uBAAwB,MAAO,cAAc,CAC5D,CACA,CACA,CACA,CAAC,EAOYC,GAAuB,OAAO,OAAO,CAChD,GAAI,UACJ,MAAO,UACP,KAAM,QACN,SAAU,CACR,CACE,GAAI,QACJ,MAAO,QACP,MAAO,CACL,CAAE,KAAM,SAAU,GAAI,qBAAsB,UAAW,eAAe,CAC9E,CACA,EACI,CACE,GAAI,QACJ,MAAO,QACP,MAAO,CACL,CAAE,KAAM,SAAU,GAAI,qBAAsB,UAAW,eAAe,CAC9E,CACA,EACI,CACE,GAAI,UACJ,MAAO,UACP,MAAO,CACL,kBACA,gBACA,gBACA,0BACR,CACA,CACA,CACA,CAAC,EAOYC,GAAsB,OAAO,OAAO,CAC/C,GAAI,SACJ,MAAO,SACP,KAAM,QACN,SAAU,CACR,CACE,GAAI,UACJ,MAAO,UACP,MAAO,CACL,oBACA,iBACA,2BACR,CACA,EACI,CACE,GAAI,aACJ,MAAO,aACP,MAAO,CACL,CAAE,KAAM,SAAU,GAAI,oBAAqB,UAAW,mBAAmB,CACjF,CACA,CACA,CACA,CAAC,EAOYC,GAAyB,OAAO,OAAO,CAClD,GAAI,YACJ,MAAO,YACP,KAAM,QACN,SAAU,CACR,CACE,GAAI,UACJ,MAAO,UACP,MAAO,CACL,0BACA,0BACA,mCACR,CACA,EACI,CACE,GAAI,YACJ,MAAO,YACP,MAAO,CACL,CAAE,KAAM,SAAU,GAAI,uBAAwB,UAAW,qBAAqB,EAC9E,gCACR,CACA,EACI,CACE,GAAI,cACJ,MAAO,cACP,MAAO,CACL,sBACA,sBACA,kCACR,CACA,EACI,CACE,GAAI,QACJ,MAAO,QACP,MAAO,CACL,mCACA,mCACA,kCACA,iCACR,CACA,CACA,CACA,CAAC,ECzlBM,MAAMC,EAAe,CAC1B,YAAY,CAAE,IAAA/xG,EAAK,IAAAoF,EAAK,MAAA1P,EAAO,KAAA6uD,EAAM,SAAA4tB,EAAU,SAAA22B,EAAU,eAAAkJ,EAAiB,IAAQ,CAChF,KAAK,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,UAAY,mBAEzB,MAAMC,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,0BAClB,MAAM7iB,EAAM,SAAS,cAAc,KAAK,EACxCA,EAAI,UAAY,wBAChB,MAAM8iB,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,0BACpBD,EAAM,YAAY7iB,CAAG,EACrB6iB,EAAM,YAAYC,CAAO,EAEzB,MAAMC,EAAS,SAAS,cAAc,OAAO,EAC7CA,EAAO,KAAO,QACdA,EAAO,UAAY,2CACnB,MAAMC,EAAS,SAAS,cAAc,OAAO,EAC7CA,EAAO,KAAO,QACdA,EAAO,UAAY,4CAEA,IAAM,CACvBD,EAAO,IAAM,OAAOnyG,CAAG,EACvBmyG,EAAO,IAAM,OAAO/sG,CAAG,EACvB+sG,EAAO,KAAO,OAAO5tD,CAAI,EACzB6tD,EAAO,IAAM,OAAOpyG,CAAG,EACvBoyG,EAAO,IAAM,OAAOhtG,CAAG,EACvBgtG,EAAO,KAAO,OAAO7tD,CAAI,CAC3B,GACU,EAEV,MAAM8tD,EAAW9kF,GAAM,CACrB,MAAMpvB,EAAI,OAAOovB,CAAC,EAClB,GAAI,CAAC,OAAO,SAASpvB,CAAC,EAAG,OAAO,KAChC,MAAMm0G,EAAa,KAAK,IAAIn0G,EAAI6B,CAAG,GAAKukD,EAAO,EAAIvkD,EAAM7B,EACnDo0G,EAAa,KAAK,IAAID,EAAaltG,CAAG,GAAKm/C,EAAO,EAAIn/C,EAAMktG,EAClE,OAAO,KAAK,IAAItyG,EAAK,KAAK,IAAIoF,EAAKmtG,CAAU,CAAC,CAChD,EAEMC,EAAY,CAAC1nC,EAAIC,IAAO,CAC5B,MAAMgb,EAAO3gF,EAAMpF,EACbyyG,EAAQ1sB,IAAS,EAAI,GAAMjb,EAAK9qE,GAAO+lF,EAAQ,IAC/C2sB,EAAQ3sB,IAAS,EAAI,KAAQhb,EAAK/qE,GAAO+lF,EAAQ,IACvDksB,EAAM,MAAM,YAAY,YAAa,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,IAAKQ,CAAK,CAAC,CAAC,CAAC,EAC9ER,EAAM,MAAM,YAAY,YAAa,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,IAAKS,CAAK,CAAC,CAAC,CAAC,CAChF,EACA,KAAK,UAAYF,EAEjB,MAAMG,EAASN,EAAQ38G,IAAQ,CAAC,GAAKsK,CAAG,GAAKA,EACvC4yG,EAASP,EAAQ38G,IAAQ,CAAC,GAAK0P,CAAG,GAAKA,EACvCytG,EAAM,KAAK,IAAIF,EAAQC,CAAM,EAC7BE,EAAM,KAAK,IAAIH,EAAQC,CAAM,EACnCT,EAAO,MAAQ,OAAOU,CAAG,EACzBT,EAAO,MAAQ,OAAOU,CAAG,EACzBN,EAAUK,EAAKC,CAAG,EAClB,MAAMC,EAAaxO,GAAkB,CAACz5B,EAAIC,IAAO,CAC/CoH,IAAW,CAACrH,EAAIC,CAAE,CAAC,CACrB,CAAC,EACKioC,EAAa,CAACloC,EAAIC,IAAO,CAC7B+9B,IAAW,CAACh+B,EAAIC,CAAE,CAAC,CACrB,EAEMkoC,EAAUh6G,GAAW,CACzB,MAAMsX,EAAI8hG,EAAQF,EAAO,KAAK,EACxB3hG,EAAI6hG,EAAQD,EAAO,KAAK,EAC9B,GAAI7hG,GAAK,MAAQC,GAAK,KAAM,OAC5B,MAAMs6D,EAAK,KAAK,IAAIv6D,EAAGC,CAAC,EAClBu6D,EAAK,KAAK,IAAIx6D,EAAGC,CAAC,EACxB,OAAIvX,IAAW,KAAOsX,EAAIw6D,IAAIonC,EAAO,MAAQ,OAAOpnC,CAAE,GAClD9xE,IAAW,KAAOuX,EAAIs6D,IAAIsnC,EAAO,MAAQ,OAAOtnC,CAAE,GACtD0nC,EAAU1nC,EAAIC,CAAE,EAChBgoC,EAAWjoC,EAAIC,CAAE,EACV,CAACD,EAAIC,CAAE,CAChB,EAEMmoC,EAAej6G,GAAW,CAC9B,MAAMk6G,EAAYF,EAAOh6G,CAAM,EAC/B85G,EAAW,MAAK,EACZI,GAAWH,EAAW,GAAGG,CAAS,CACxC,EAGMC,EAAsBr7G,GAAU,CACpC,GAAIA,EAAM,QAAU,MAAQA,EAAM,SAAW,EAAG,OAChDA,EAAM,eAAc,EAEpB,MAAMO,EAAO25G,EAAM,sBAAqB,EAClC72C,EAAU,KAAK,IAAI,EAAG9iE,EAAK,KAAK,EAChC+6G,EAAajuG,EAAMpF,EACzB,GAAI,CAAC,OAAO,SAASqzG,CAAU,GAAK,KAAK,IAAIA,CAAU,EAAI,KAAM,OAEjE,MAAMC,EAASv7G,EAAM,QACfw7G,EAASlB,EAAQF,EAAO,KAAK,GAAKnyG,EAClCwzG,EAASnB,EAAQD,EAAO,KAAK,GAAKhtG,EAClCquG,EAAU,KAAK,IAAIF,EAAQC,CAAM,EACjCE,EAAU,KAAK,IAAIH,EAAQC,CAAM,EACjCxjB,EAAY0jB,EAAUD,EAEtBE,EAAqB,CAAC7oC,GAAIC,KAAO,CACrC,IAAI6oC,GAAS9oC,GACT+oC,GAAS9oC,GACb,GAAI6oC,GAAS5zG,EAAK,CAChB,MAAM8zG,EAAQ9zG,EAAM4zG,GACpBA,GAAS5zG,EACT6zG,IAAUC,CACZ,CACA,GAAID,GAASzuG,EAAK,CAChB,MAAM0uG,EAAQD,GAASzuG,EACvByuG,GAASzuG,EACTwuG,IAAUE,CACZ,CACA,OAAIF,GAAS5zG,IAAK4zG,GAAS5zG,GACvB6zG,GAASzuG,IAAKyuG,GAASzuG,GACvB,OAAO,SAAS4qF,CAAS,GAAKA,GAAa,GACzB6jB,GAASD,KACT5jB,IAClB6jB,GAASD,GAAS5jB,EACd6jB,GAASzuG,IACXyuG,GAASzuG,EACTwuG,GAAS,KAAK,IAAI5zG,EAAKoF,EAAM4qF,CAAS,IAIrC,CAAC4jB,GAAQC,EAAM,CACxB,EAEME,GAAUC,IAAc,CAE5B,MAAMv5G,IADOu5G,GAAU,QAAUV,GACXl4C,EAAWi4C,EAC3B,CAACO,GAAQC,CAAM,EAAIF,EAAmBF,EAAUh5G,GAAOi5G,EAAUj5G,EAAK,EAC5E03G,EAAO,MAAQ,OAAOyB,EAAM,EAC5BxB,EAAO,MAAQ,OAAOyB,CAAM,EAC5BrB,EAAUoB,GAAQC,CAAM,EACxBd,EAAWa,GAAQC,CAAM,CAC3B,EAEMI,GAAO,IAAM,CACjB,OAAO,oBAAoB,cAAeF,EAAM,EAChD,OAAO,oBAAoB,YAAaE,EAAI,EAC5C,OAAO,oBAAoB,gBAAiBA,EAAI,EAChDlB,EAAW,MAAK,EAChB,MAAMxiG,GAAI8hG,EAAQF,EAAO,KAAK,EACxB3hG,GAAI6hG,EAAQD,EAAO,KAAK,EAC1B7hG,IAAK,MAAQC,IAAK,MACtBwiG,EAAW,KAAK,IAAIziG,GAAGC,EAAC,EAAG,KAAK,IAAID,GAAGC,EAAC,CAAC,CAC3C,EAEA,OAAO,iBAAiB,cAAeujG,EAAM,EAC7C,OAAO,iBAAiB,YAAaE,EAAI,EACzC,OAAO,iBAAiB,gBAAiBA,EAAI,CAC/C,EAEMC,EAAW,IAAMjB,EAAO,GAAG,EAC3BkB,EAAW,IAAMlB,EAAO,GAAG,EAC3BmB,EAAY,IAAMlB,EAAY,GAAG,EACjCmB,EAAY,IAAMnB,EAAY,GAAG,EACnClB,GACFE,EAAQ,iBAAiB,cAAekB,CAAkB,EAE5DjB,EAAO,iBAAiB,QAAS+B,CAAQ,EACzC9B,EAAO,iBAAiB,QAAS+B,CAAQ,EACzChC,EAAO,iBAAiB,SAAUiC,CAAS,EAC3ChC,EAAO,iBAAiB,SAAUiC,CAAS,EAE3C,KAAK,SAAW,IAAM,CACpBtB,EAAW,OAAM,EACbf,GACFE,EAAQ,oBAAoB,cAAekB,CAAkB,EAE/DjB,EAAO,oBAAoB,QAAS+B,CAAQ,EAC5C9B,EAAO,oBAAoB,QAAS+B,CAAQ,EAC5ChC,EAAO,oBAAoB,SAAUiC,CAAS,EAC9ChC,EAAO,oBAAoB,SAAUiC,CAAS,EAC9C,KAAK,QAAQ,OAAM,CACrB,EAEA,KAAK,OAASlC,EACd,KAAK,OAASC,EAEdH,EAAM,YAAYE,CAAM,EACxBF,EAAM,YAAYG,CAAM,EACxB,KAAK,QAAQ,YAAYH,CAAK,CAChC,CAEA,SAAU,CACR,KAAK,WAAQ,EACb,KAAK,SAAW,IAClB,CACF,CC5LA,SAAS9sG,GAAMzP,EAAOsK,EAAKoF,EAAK,CAC9B,OAAO,KAAK,IAAIpF,EAAK,KAAK,IAAIoF,EAAK1P,CAAK,CAAC,CAC3C,CAEA,SAASoyG,GAAmBD,EAAQ,CAClC,GAAI,CAACA,EAAQ,OACb,MAAM7nG,EAAM,OAAO6nG,EAAO,GAAG,EACvBziG,EAAM,OAAOyiG,EAAO,GAAG,EACvBnyG,EAAQ,OAAOmyG,EAAO,KAAK,EACjC,GAAI,CAAC,OAAO,SAAS7nG,CAAG,GAAK,CAAC,OAAO,SAASoF,CAAG,GAAK,CAAC,OAAO,SAAS1P,CAAK,GAAKsK,IAAQoF,EAAK,OAC9F,MAAM2iG,GAAQryG,EAAQsK,IAAQoF,EAAMpF,GAAQ,IAC5C6nG,EAAO,MAAM,YAAY,QAAS,OAAO1iG,GAAM4iG,EAAK,EAAG,GAAG,CAAC,CAAC,CAC9D,CAEA,SAASuM,GAAc5+G,EAAO6+G,EAAS,EAAG,CACxC,MAAM3+G,EAAU,OAAOF,CAAK,EAC5B,GAAI,CAAC,OAAO,SAASE,CAAO,EAAG,MAAO,GACtC,MAAMovF,EAAM,KAAK,IAAIpvF,CAAO,EAC5B,OAAKovF,EAAM,GAAKA,EAAM,KAASA,GAAO,IAC7BpvF,EAAQ,cAAc,KAAK,IAAI,EAAG2+G,EAAS,CAAC,CAAC,EAE/C3+G,EAAQ,QAAQ2+G,CAAM,CAC/B,CAEA,SAASC,GAAY9+G,EAAOsK,EAAKoF,EAAKzP,EAAU,CAC9C,MAAMC,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrBuP,GAAMvP,EAASoK,EAAKoF,CAAG,EADQzP,CAExC,CAEO,MAAM8+G,EAAkB,CAC7B,YAAY,CACV,MAAA/+G,EACA,OAAAg/G,EACA,OAAAC,EACA,QAAAC,EAAU,IACV,SAAAC,EAAW,KACX,SAAAC,EAAW,KACX,SAAAlP,EAAW,KACX,SAAAE,EAAW,KACX,OAAAyO,EAAS,EACT,OAAA99E,EAAS,KACT,SAAAqyE,EAAW,IACf,EAAK,CACD,KAAK,OAAS,OAAO4L,CAAM,EAC3B,KAAK,OAAS,OAAOC,CAAM,EAC3B,KAAK,SAAW,OAAO,SAASE,CAAQ,EAAI,OAAOA,CAAQ,EAAI,KAAK,IAAI,GAAI,KAAK,MAAM,EACvF,KAAK,SAAW,OAAO,SAASC,CAAQ,EAAI,OAAOA,CAAQ,EAAI,KAAK,IAAI,GAAI,KAAK,MAAM,EACvF,KAAK,SAAW,OAAO,SAASlP,CAAQ,EAAI,OAAOA,CAAQ,EAAI,KAAK,SACpE,KAAK,SAAW,OAAO,SAASE,CAAQ,EAAI,OAAOA,CAAQ,EAAI,KAAK,SACpE,KAAK,OAAS,OAAOrvE,GAAW,WAAaA,EAAUv+B,GAASo8G,GAAcp8G,EAAMq8G,CAAM,EAC1F,KAAK,SAAWzL,EAEhB,KAAK,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,UAAY,4BAEzB,KAAK,OAAS,SAAS,cAAc,OAAO,EAC5C,KAAK,OAAO,KAAO,QACnB,KAAK,OAAO,UAAY,mBACxB,KAAK,OAAO,IAAM,OAAO,KAAK,MAAM,EACpC,KAAK,OAAO,IAAM,OAAO,KAAK,MAAM,EACpC,KAAK,OAAO,KAAO,OAAO8L,CAAO,EAEjC,KAAK,MAAQ,SAAS,cAAc,OAAO,EAC3C,KAAK,MAAM,KAAO,SAClB,KAAK,MAAM,UAAY,mBACvB,KAAK,MAAM,KAAO,MAClB,KAAK,MAAM,IAAM,OAAO,KAAK,QAAQ,EACrC,KAAK,MAAM,IAAM,OAAO,KAAK,QAAQ,EAErC,KAAK,QAAQ,YAAY,KAAK,MAAM,EACpC,KAAK,QAAQ,YAAY,KAAK,KAAK,EAEnC,KAAK,SAASl/G,GAAS,KAAK,QAAQ,EACpC,KAAK,mBAAqB6uG,GAAmB4D,GAAc,CACzD,KAAK,WAAWA,CAAS,CAC3B,CAAC,EAED,KAAK,qBAAuB,IAAM,CAChC,MAAMvyG,EAAU,KAAK,aAAa,KAAK,OAAO,KAAK,EACnD,YAAK,MAAM,MAAQ,KAAK,OAAOA,CAAO,EACtCkyG,GAAmB,KAAK,MAAM,EACvBlyG,CACT,EAEA,KAAK,eAAiB,IAAM,CAC1B,MAAMA,EAAU,KAAK,qBAAoB,EACzC,KAAK,mBAAmBA,CAAO,CACjC,EACA,KAAK,gBAAkB,IAAM,CAC3B,MAAMA,EAAU,KAAK,qBAAoB,EACzC,KAAK,mBAAmBA,CAAO,EAC/B,KAAK,mBAAmB,MAAK,CAC/B,EACA,KAAK,eAAiB,IAAM,CAC1B,MAAMA,EAAU,OAAO,KAAK,MAAM,KAAK,EACvC,GAAI,CAAC,OAAO,SAASA,CAAO,EAAG,OAC/B,MAAM4L,EAAU2D,GAAMvP,EAAS,KAAK,SAAU,KAAK,QAAQ,EAC3D,KAAK,SAAS4L,CAAO,EACrB,KAAK,WAAWA,CAAO,CACzB,EACA,KAAK,gBAAmBzJ,GAAU,CAC5BA,EAAM,MAAQ,UAClB,KAAK,eAAc,EACnB,KAAK,MAAM,KAAI,EACjB,EAEA,KAAK,OAAO,iBAAiB,QAAS,KAAK,cAAc,EACzD,KAAK,OAAO,iBAAiB,SAAU,KAAK,eAAe,EAC3D,KAAK,MAAM,iBAAiB,SAAU,KAAK,cAAc,EACzD,KAAK,MAAM,iBAAiB,UAAW,KAAK,eAAe,CAC7D,CAEA,SAASg9G,EAAK,CACZ,OAAO5vG,GAAM,OAAO4vG,CAAG,EAAG,KAAK,OAAQ,KAAK,MAAM,CACpD,CAEA,aAAar/G,EAAO,CAClB,MAAME,EAAU,OAAOF,CAAK,EACtBs/G,EAAO,OAAO,SAASp/G,CAAO,EAAIuP,GAAMvP,EAAS,KAAK,SAAU,KAAK,QAAQ,EAAI,KAAK,SAC5F,OAAO,KAAK,SAAS,KAAK,MAAM,KAAK,IAAI,KAAK,SAAUo/G,CAAI,CAAC,CAAC,CAChE,CAEA,aAAaD,EAAK,CAChB,OAAO5vG,GAAM,KAAK,IAAI,GAAI,KAAK,SAAS4vG,CAAG,CAAC,EAAG,KAAK,SAAU,KAAK,QAAQ,CAC7E,CAEA,SAAS5M,EAAW,CAClB,MAAM8M,EAAQT,GAAYrM,EAAW,KAAK,SAAU,KAAK,SAAU,KAAK,QAAQ,EAC1E+M,EAAeD,EAAQ,EAAIA,EAAQ,KAAK,SACxCF,EAAM,KAAK,aAAaG,CAAY,EACpCC,EAAS,KAAK,aAAaJ,CAAG,EACpC,KAAK,OAAO,MAAQ,OAAOA,CAAG,EAC9B,KAAK,MAAM,MAAQ,KAAK,OAAO,OAAO,SAAS,OAAO5M,CAAS,CAAC,EAAI8M,EAAQE,CAAM,EAClFrN,GAAmB,KAAK,MAAM,CAChC,CAEA,SAAU,CACR,KAAK,oBAAoB,SAAM,EAC/B,KAAK,OAAO,oBAAoB,QAAS,KAAK,cAAc,EAC5D,KAAK,OAAO,oBAAoB,SAAU,KAAK,eAAe,EAC9D,KAAK,MAAM,oBAAoB,SAAU,KAAK,cAAc,EAC5D,KAAK,MAAM,oBAAoB,UAAW,KAAK,eAAe,EAC9D,KAAK,QAAQ,OAAM,CACrB,CACF,CCjJA,SAAStgF,GAAQ9xB,EAAO,CAEtB,MADI,CAAC,OAAO,SAASA,CAAK,GACtBA,EAAQ,EAAU,EAClBA,EAAQ,EAAU,EACfA,CACT,CAEA,SAAS0/G,GAAU18E,EAAM28E,EAAe,CACtC,MAAMzrD,EAAI,KAAK,MAAM,IAAMpiC,GAAQkR,IAAO,CAAC,GAAK,CAAC,CAAC,EAC5CmxB,EAAI,KAAK,MAAM,IAAMriC,GAAQkR,IAAO,CAAC,GAAK,CAAC,CAAC,EAC5CloB,EAAI,KAAK,MAAM,IAAMgX,GAAQkR,IAAO,CAAC,GAAK,CAAC,CAAC,EAC5CnoB,EAAI8kG,GAAiB7tF,GAAQkR,IAAO,CAAC,GAAK,CAAC,EACjD,MAAO,QAAQkxB,CAAC,KAAKC,CAAC,KAAKr5C,CAAC,KAAKD,CAAC,GACpC,CAEA,MAAM+kG,GAAgB,IAAI,IAEnB,SAASC,GAAsB5kC,EAAkBr6E,EAAU,GAAI,CACpE,MAAMuqB,EAAWqpD,GAAgByG,CAAgB,EACjD,GAAI,CAAC9vD,GAAU,YAAa,OAAO,KAEnC,MAAMikC,EAAU,KAAK,IAAI,EAAG,KAAK,MAAMxuD,EAAQ,SAAW,EAAE,CAAC,EACvDuJ,EAAQvJ,EAAQ,MAChBm1C,EAAYn1C,EAAQ,WAAa,QACjCkkC,EAAW,GAAG3Z,EAAS,IAAI,IAAIhhB,GAAS,MAAM,IAAIilD,CAAO,IAAIrZ,CAAS,GACtE9nB,EAAS2xF,GAAc,IAAI96E,CAAQ,EACzC,GAAI7W,EAAQ,OAAOA,EAEnB,MAAM6xF,EAAQ,CAAA,EACRttC,EAAQpjB,EAAU,EACxB,QAASlmD,EAAI,EAAGA,EAAIkmD,EAASlmD,GAAK,EAAG,CACnC,MAAMorB,EAAIk+C,IAAU,EAAI,EAAItpE,EAAIspE,EAC1BxvC,EAAO7X,EAAS,YAAYmJ,CAAC,EAC7ByrF,EAAML,GAAU18E,EAAM74B,CAAK,EACjC21G,EAAM,KAAK,GAAGC,CAAG,KAAKzrF,EAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAC9C,CAEA,MAAMklE,EAAW,mBAAmBzjD,CAAS,KAAK+pE,EAAM,KAAK,IAAI,CAAC,IAClE,OAAAF,GAAc,IAAI96E,EAAU00D,CAAQ,EAC7BA,CACT,CCxCA,MAAMwmB,GAAsB,CAAC,KAAM,UAAW,MAAO,SAAU,OAAO,EAEtE,SAASC,IAAmB,CAC1B,MAAO,+DACT,CAEA,SAASC,IAA2B,CAClC,MAAO,4DACT,CAEO,MAAMC,EAAsB,CACjC,YAAY,CACV,QAAAC,EACA,WAAAC,EAAa,KACb,MAAArgH,EAAQ,KACR,cAAAgtD,EAAgB,qBAChB,kBAAAszD,EAAoB,oBACpB,WAAAC,EAAaP,GACb,cAAAQ,EAAgB,KAChB,QAAAC,EAAU,CAAA,EACV,SAAAhkC,EAAW,IACf,EAAM,GAAI,CACN,KAAK,QAAU2jC,GAAW,CAAE,QAAS,CAAA,EAAI,MAAO,IAAI,GAAK,EACzD,KAAK,WAAaC,EAClB,KAAK,cAAgB,OAAOrzD,GAAiB,oBAAoB,EACjE,KAAK,WAAa,MAAM,QAAQuzD,CAAU,GAAKA,EAAW,OAAS,CAAC,GAAGA,CAAU,EAAI,CAAC,GAAGP,EAAmB,EAC5G,KAAK,cAAgB,OAAOQ,GAAkB,WAC1CA,EACC,CAACxyF,EAAO7qB,IAAS6qB,EAAQ,GAAGA,EAAM,KAAK,KAAKA,EAAM,KAAK,GAAK7qB,EACjE,KAAK,SAAW,OAAOs5E,GAAa,WAAaA,EAAW,KAC5D,KAAK,aAAe,IAAI,IACxB,KAAK,QAAU,MAAM,QAAQgkC,CAAO,EAChCA,EACG,OAAQz/E,GAAWA,GAAU,OAAOA,EAAO,IAAO,UAAY,OAAOA,EAAO,WAAc,UAAU,EACpG,IAAKA,GAAW,CACf,MAAM5uB,EAAK4uB,EAAO,GAClB,YAAK,aAAa,IAAI5uB,EAAI4uB,EAAO,SAAW,EAAI,EACzC,CACL,GAAA5uB,EACA,MAAO,OAAO4uB,EAAO,OAAS5uB,CAAE,EAChC,MAAO4uB,EAAO,OAAS,KAAO,OAAOA,EAAO,KAAK,EAAI,GACrD,UAAWA,EAAO,SAChC,CACU,CAAC,EACH,CAAA,EACJ,KAAK,MAAQ,KACb,KAAK,UAAY,GAEjB,KAAK,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,UAAY,4BAEzB,KAAK,QAAU,SAAS,cAAc,QAAQ,EAC9C,KAAK,QAAQ,KAAO,SACpB,KAAK,QAAQ,UAAY,sDACzB,KAAK,QAAQ,QAAQ,sBAAwB,OAE7C,KAAK,aAAe,SAAS,cAAc,MAAM,EACjD,KAAK,aAAa,UAAY,qBAC9B,KAAK,QAAQ,YAAY,KAAK,YAAY,EAE1C,KAAK,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,UAAY,8DACzB,KAAK,QAAQ,QAAQ,sBAAwB,OAE7C,KAAK,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,UAAY,6BACzB,KAAK,QAAQ,OAAS,GAEtB,KAAK,aAAe,SAAS,cAAc,KAAK,EAChD,KAAK,aAAa,UAAY,oCAC9B,KAAK,QAAQ,YAAY,KAAK,YAAY,EAE1C,KAAK,cAAgB,SAAS,cAAc,KAAK,EACjD,KAAK,cAAc,UAAY,qCAE/B,KAAK,YAAc,SAAS,cAAc,OAAO,EACjD,KAAK,YAAY,KAAO,OACxB,KAAK,YAAY,UAAY,oDAC7B,KAAK,YAAY,YAAc,OAAOs/E,GAAqB,mBAAmB,EAC9E,KAAK,cAAc,YAAY,KAAK,WAAW,EAE/C,KAAK,UAAY,SAAS,cAAc,KAAK,EAC7C,KAAK,UAAU,UAAY,sCAC3B,KAAK,cAAgB,IAAI,IACzB,UAAWt/E,KAAU,KAAK,QAAS,CACjC,MAAMw0E,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,KAAO,SACdA,EAAO,UAAY,qCACnBA,EAAO,QAAQ,sBAAwB,OACvCA,EAAO,YAAcx0E,EAAO,MAC5Bw0E,EAAO,MAAQx0E,EAAO,MACtBw0E,EAAO,QAAQ,SAAWx0E,EAAO,GACjCw0E,EAAO,QAAQ,OAAS,KAAK,aAAa,IAAIx0E,EAAO,EAAE,IAAM,GAAO,OAAS,QAC7Ew0E,EAAO,aAAa,eAAgB,KAAK,aAAa,IAAIx0E,EAAO,EAAE,IAAM,GAAO,OAAS,OAAO,EAChGw0E,EAAO,iBAAiB,QAAS,IAAM,CACrC,KAAK,gBAAgBx0E,EAAO,GAAI,KAAK,aAAa,IAAIA,EAAO,EAAE,IAAM,EAAI,CAC3E,CAAC,EACD,KAAK,UAAU,YAAYw0E,CAAM,EACjC,KAAK,cAAc,IAAIx0E,EAAO,GAAIw0E,CAAM,CAC1C,CACA,KAAK,UAAU,OAAS,KAAK,QAAQ,SAAW,EAChD,KAAK,cAAc,YAAY,KAAK,SAAS,EAC7C,KAAK,aAAa,YAAY,KAAK,aAAa,EAEhD,KAAK,YAAc,SAAS,cAAc,KAAK,EAC/C,KAAK,YAAY,UAAY,mCAC7B,KAAK,aAAa,YAAY,KAAK,WAAW,EAE9C,KAAK,QAAQ,YAAY,KAAK,OAAO,EACrC,KAAK,QAAQ,YAAY,KAAK,OAAO,EACrC,KAAK,kBAAiB,EAEtB,KAAK,SAAW,CAAA,EAChB,KAAK,cAAgB,KAErB,KAAK,WAAW,IAAM,KAAK,QAAQ,OAAM,CAAE,EAE3C,MAAMkL,EAAoBr+G,GAAU,CAClC,MAAMP,EAASO,EAAM,OACjB,KAAK,QAAQ,QACbP,IAAW,KAAK,QAAQ,SAASA,CAAM,GAAK,KAAK,QAAQ,SAASA,CAAM,IAC5E,KAAK,aAAY,CACnB,EAEA,IAAI6+G,EAAkB,GACtB,MAAMC,EAAmB,IAAM,CACzBD,IACJA,EAAkB,GAClB,sBAAsB,IAAM,CAC1BA,EAAkB,GAClB,KAAK,gBAAe,CACtB,CAAC,EACH,EAEME,EAAex+G,GAAU,CAC7B,GAAI,KAAK,QAAQ,OAAQ,OACzB,MAAMP,EAASO,GAAO,OAClBP,GAAU,KAAK,aAAa,SAASA,CAAM,GAC/C8+G,EAAgB,CAClB,EAEME,EAAiB,IAAM,KAAK,YAAW,EACvCC,EAAoB1+G,GAAU,CAClC,GAAIA,EAAM,MAAQ,SAAWA,EAAM,MAAQ,IAAK,CAC9CA,EAAM,eAAc,EACpB,KAAK,YAAW,EAChB,MACF,CACIA,EAAM,KAAOA,EAAM,IAAI,SAAW,GAAK,CAACA,EAAM,SAAW,CAACA,EAAM,SAAW,CAACA,EAAM,SACpFA,EAAM,eAAc,EACpB,KAAK,YAAY,CAAE,UAAWA,EAAM,GAAG,CAAE,EAE7C,EAEM2+G,EAAgB,IAAM,CAC1B,KAAK,UAAY,OAAO,KAAK,YAAY,OAAS,EAAE,EACpD,KAAK,cAAc,KAAK,YAAY,KAAK,EACzC,KAAK,gBAAe,CACtB,EAEMC,EAAmB5+G,GAAU,CACjC,GAAIA,EAAM,MAAQ,SAAU,CAC1B,KAAK,aAAY,EACjB,KAAK,QAAQ,MAAK,EAClB,MACF,CACA,GAAIA,EAAM,MAAQ,UAAY,KAAK,YAAY,OAAS,IAAI,OAAQ,CAClE,KAAK,aAAY,EACjB,MAAMk9G,EAAQ,OAAO,KAAK,YAAY,OAAS,EAAE,EAAE,KAAI,EACnD,KAAK,QAAQ,MAAM,IAAIA,CAAK,GAAG,KAAK,YAAYA,EAAO,CAAE,KAAM,EAAI,CAAE,CAC3E,CACF,EAEM2B,EAAoB,IAAM,CAC9B,eAAe,IAAM,CACf,CAAC,KAAK,QAAQ,SAAS,SAAS,aAAa,GAAK,CAAC,KAAK,QAAQ,SAAS,SAAS,aAAa,GACjG,KAAK,aAAY,CAErB,CAAC,CACH,EAEA,SAAS,iBAAiB,cAAeR,EAAkB,EAAI,EAC/D,SAAS,iBAAiB,SAAUG,EAAa,EAAI,EACrD,OAAO,iBAAiB,SAAUD,CAAgB,EAClD,KAAK,QAAQ,iBAAiB,QAASE,CAAc,EACrD,KAAK,QAAQ,iBAAiB,UAAWC,CAAgB,EACzD,KAAK,QAAQ,iBAAiB,QAASD,CAAc,EACrD,KAAK,YAAY,iBAAiB,QAASE,CAAa,EACxD,KAAK,YAAY,iBAAiB,UAAWC,CAAe,EAC5D,KAAK,QAAQ,iBAAiB,WAAYC,CAAiB,EAE3D,KAAK,WAAW,IAAM,SAAS,oBAAoB,cAAeR,EAAkB,EAAI,CAAC,EACzF,KAAK,WAAW,IAAM,SAAS,oBAAoB,SAAUG,EAAa,EAAI,CAAC,EAC/E,KAAK,WAAW,IAAM,OAAO,oBAAoB,SAAUD,CAAgB,CAAC,EAC5E,KAAK,WAAW,IAAM,KAAK,QAAQ,oBAAoB,QAASE,CAAc,CAAC,EAC/E,KAAK,WAAW,IAAM,KAAK,QAAQ,oBAAoB,UAAWC,CAAgB,CAAC,EACnF,KAAK,WAAW,IAAM,KAAK,QAAQ,oBAAoB,QAASD,CAAc,CAAC,EAC/E,KAAK,WAAW,IAAM,KAAK,YAAY,oBAAoB,QAASE,CAAa,CAAC,EAClF,KAAK,WAAW,IAAM,KAAK,YAAY,oBAAoB,UAAWC,CAAe,CAAC,EACtF,KAAK,WAAW,IAAM,KAAK,QAAQ,oBAAoB,WAAYC,CAAiB,CAAC,EACrF,KAAK,WAAW,IAAM,CACpB,KAAK,eAAe,aAAU,EAC9B,KAAK,cAAgB,IACvB,CAAC,EAED,KAAK,YAAYlhH,GAAS,KAAK,cAAe,CAAE,KAAM,GAAO,CAC/D,CAEA,WAAWiI,EAAI,CACT,OAAOA,GAAO,YAAY,KAAK,SAAS,KAAKA,CAAE,CACrD,CAEA,mBAAoB,CAClB,MAAMk5G,EAAW,KAAK,YAAc,KAAK,QAAQ,UAAU,YAAY,GAAK,SAAS,KAChFA,GACD,KAAK,QAAQ,gBAAkBA,GAAUA,EAAS,YAAY,KAAK,OAAO,CAChF,CAEA,oBAAqB,CACnB,MAAMn7E,EAAQ,KAAK,QAAQ,UAAU,gBAAgB,GAAK,KACtDA,GACGA,EAAM,QAAQ,wBACjBA,EAAM,QAAQ,sBAAwB,mBAAmB,KAAK,SAAS,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,IAE9F,KAAK,QAAQ,QAAQ,sBAAwBA,EAAM,QAAQ,uBAE3D,OAAO,KAAK,QAAQ,QAAQ,sBAE9B,MAAM+iE,EAAU,KAAK,QAAQ,UAAU,kBAAkB,GAAG,SAAS,SAAW,GAC5EA,EAAS,KAAK,QAAQ,QAAQ,iBAAmBA,EAChD,OAAO,KAAK,QAAQ,QAAQ,gBACnC,CAEA,aAAaqY,EAAQ,CACnB,MAAMj+G,EAAM,OAAOi+G,GAAU,EAAE,EAAE,KAAI,EACrC,OAAKj+G,EACE,KAAK,QAAQ,MAAM,IAAIA,CAAG,GAAK,KADrB,IAEnB,CAEA,mBAAmBi+G,EAAQ,CACzB,MAAMj+G,EAAM,OAAOi+G,GAAU,EAAE,EAAE,KAAI,GAAM,KAAK,cAChD,KAAK,MAAQj+G,EACb,MAAM6qB,EAAQ,KAAK,aAAa7qB,CAAG,EAC7BwiF,EAAO,KAAK,cAAc33D,EAAO7qB,CAAG,EAC1C,KAAK,aAAa,YAAcwiF,EAChC,KAAK,QAAQ,MAAQA,EACrB,KAAK,QAAQ,QAAQ,YAAcxiF,EACnC,MAAMq2F,EAAWqmB,GAAsB18G,EAAK,CAAE,QAAS,GAAI,MAAO,EAAG,EACrE,KAAK,QAAQ,MAAM,gBAAkBq2F,GAAYymB,GAAgB,CACnE,CAEA,YAAYmB,EAAQ,CAAE,KAAAC,EAAO,EAAK,EAAK,CAAA,EAAI,CACzC,MAAMl+G,EAAM,OAAOi+G,GAAU,EAAE,EAAE,KAAI,GAAM,KAAK,cAChD,KAAK,mBAAmBj+G,CAAG,EACvBk+G,GAAM,KAAK,WAAWl+G,CAAG,CAC/B,CAEA,SAASi+G,EAAQ,CACf,KAAK,YAAYA,EAAQ,CAAE,KAAM,EAAK,CAAE,CAC1C,CAEA,gBAAgBhvG,EAAIpF,EAAQ,CAAE,OAAAs0G,EAAS,EAAI,EAAK,GAAI,CAClD,GAAI,CAAC,KAAK,aAAa,IAAIlvG,CAAE,EAAG,OAChC,MAAM5P,EAAOwK,IAAW,GACxB,KAAK,aAAa,IAAIoF,EAAI5P,CAAI,EAC9B,MAAMgzG,EAAS,KAAK,cAAc,IAAIpjG,CAAE,EACpCojG,IACFA,EAAO,QAAQ,OAAShzG,EAAO,OAAS,QACxCgzG,EAAO,aAAa,eAAgBhzG,EAAO,OAAS,OAAO,GAEzD8+G,GAAU,CAAC,KAAK,QAAQ,SAC1B,KAAK,cAAc,KAAK,YAAY,KAAK,EACzC,KAAK,gBAAe,EACpB,KAAK,2BAA0B,EAEnC,CAEA,kBAAkBh8F,EAAS,CACzB,IAAIi8F,EAAWj8F,EACf,UAAW0b,KAAU,KAAK,QACpB,KAAK,aAAa,IAAIA,EAAO,EAAE,IAAM,KACzCugF,EAAWA,EAAS,OAAQvzF,GAAU,CACpC,GAAI,CACF,OAAOgT,EAAO,UAAUhT,CAAK,IAAM,EACrC,MAAY,CACV,MAAO,EACT,CACF,CAAC,GAEH,OAAOuzF,CACT,CAEA,qBAAsB,CACpB,OAAI,KAAK,cAAsB,KAAK,cAChC,OAAO,sBAAyB,WAAmB,MAEvD,KAAK,cAAgB,IAAI,qBAAsBj8F,GAAY,CACzD,UAAW0I,KAAS1I,EAAS,CAC3B,GAAI,CAAC0I,EAAM,eAAgB,SAC3B,MAAMjsB,EAAUisB,EAAM,OAChB7qB,EAAMpB,GAAS,SAAS,YAE9B,GADI,CAACoB,GACDpB,EAAQ,QAAQ,gBAAkB,IAAK,SAC3CA,EAAQ,QAAQ,cAAgB,IAChC,MAAMy3F,EAAWqmB,GAAsB18G,EAAK,CAAE,QAAS,GAAI,MAAO,EAAG,EACrEpB,EAAQ,MAAM,gBAAkBy3F,GAAYymB,GAAgB,EAC5D,KAAK,cAAc,UAAUl+G,CAAO,CACtC,CACF,EAAG,CAAE,KAAM,KAAK,aAAc,WAAY,OAAQ,EAE3C,KAAK,cACd,CAEA,cAAcy/G,EAAU,CACtB,KAAK,YAAY,gBAAe,EAGhC,MAAMx0B,EADQ,OAAOw0B,GAAY,EAAE,EAAE,KAAI,EAAG,YAAW,EAClC,MAAM,KAAK,EAAE,OAAO,OAAO,EAE1CC,EAAcz0B,EAAO,OACvB,KAAK,QAAQ,QAAQ,OAAQh/D,GAAUg/D,EAAO,MAAOG,GAAUn/D,EAAM,OAAO,SAASm/D,CAAK,CAAC,CAAC,EAC5F,KAAK,QAAQ,QACXwL,EAAU,KAAK,kBAAkB8oB,CAAW,EAElD,GAAI,CAAC9oB,EAAQ,OAAQ,CACnB,MAAM+oB,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,kCACjBA,EAAK,YAAc,cACnB,KAAK,YAAY,YAAYA,CAAI,EACjC,MACF,CAEA,MAAMC,EAAiB,IAAI,IAC3B,UAAW3zF,KAAS2qE,EAAS,CAC3B,MAAMxmB,EAAOwvC,EAAe,IAAI3zF,EAAM,KAAK,GAAK,CAAA,EAChDmkD,EAAK,KAAKnkD,CAAK,EACf2zF,EAAe,IAAI3zF,EAAM,MAAOmkD,CAAI,CACtC,CACA,UAAWA,KAAQwvC,EAAe,SAChCxvC,EAAK,KAAK,CAACt3D,EAAGC,IAAMD,EAAE,MAAM,cAAcC,EAAE,KAAK,CAAC,EAGpD,MAAM8mG,EAAc50B,EAAO,OAAS,GAAK,IACnC60B,EAAW70B,EAAO,OAAS,IAAM,IACvC,IAAIn8D,EAAQ,EACZ,MAAMixF,EAAW,KAAK,oBAAmB,EAEzC,UAAWx0B,KAAS,KAAK,WAAY,CACnC,MAAMnb,EAAOwvC,EAAe,IAAIr0B,CAAK,EACrC,GAAI,CAACnb,GAAM,OAAQ,SAEnB,MAAM6oC,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,6BAEpB,MAAM5S,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,oCAClBA,EAAM,YAAc9a,EACpB0tB,EAAQ,YAAY5S,CAAK,EAEzB,MAAM0R,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,mCAEjB,MAAMhyB,EAAU3V,EAAK,MAAM,EAAGyvC,CAAW,EACzC,UAAW5zF,KAAS85D,EAAS,CAC3B,GAAIj3D,GAASgxF,EAAU,MACvBhxF,GAAS,EAET,MAAMylD,EAAO,SAAS,cAAc,QAAQ,EAC5CA,EAAK,KAAO,SACZA,EAAK,UAAY,kCACjBA,EAAK,QAAQ,sBAAwB,OACrCA,EAAK,QAAQ,IAAMtoD,EAAM,IACzBsoD,EAAK,QAAQ,eAAiBtoD,EAAM,QAAUA,EAAM,OAAS,GAC7DsoD,EAAK,QAAQ,aAAetoD,EAAM,OAASA,EAAM,WAAa,GAAO,SAAW,QAChFsoD,EAAK,QAAQ,eAAiBtoD,EAAM,WAAa,GAAO,OAAS,QACjE,MAAMk6D,EAAWl6D,EAAM,MAAQ,KAAK,MACpCsoD,EAAK,QAAQ,SAAW4R,EAAW,OAAS,QAC5C5R,EAAK,aAAa,gBAAiB4R,EAAW,OAAS,OAAO,EAE9D,MAAM65B,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,2DACtBA,EAAU,YAAc/zF,EAAM,MAC9B+zF,EAAU,MAAQ/zF,EAAM,IAExB,MAAMg0F,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,2DACtBA,EAAU,QAAQ,YAAch0F,EAAM,IACtCg0F,EAAU,QAAQ,cAAgB,IAClCA,EAAU,MAAM,gBAAkB9B,GAAwB,EAC1D4B,GAAU,UAAUE,CAAS,EAE7B1rC,EAAK,YAAYyrC,CAAS,EAC1BzrC,EAAK,YAAY0rC,CAAS,EAC1B1rC,EAAK,iBAAiB,cAAgBj0E,GAAU,CAC9CA,EAAM,eAAc,EACpB,KAAK,YAAY2rB,EAAM,IAAK,CAAE,KAAM,GAAM,EAC1C,KAAK,aAAY,CACnB,CAAC,EAED8rF,EAAK,YAAYxjC,CAAI,CACvB,CAEA,GAAInE,EAAK,OAASyvC,EAAa,CAC7B,MAAMF,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,kCACjBA,EAAK,YAAc,WAAWE,CAAW,OAAOzvC,EAAK,MAAM,OAAOmb,CAAK,IACvEwsB,EAAK,YAAY4H,CAAI,CACvB,CAIA,GAFA1G,EAAQ,YAAYlB,CAAI,EACxB,KAAK,YAAY,YAAYkB,CAAO,EAChCnqF,GAASgxF,EAAU,KACzB,CAEA,GAAIlpB,EAAQ,OAASkpB,EAAU,CAC7B,MAAMH,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,kCACjBA,EAAK,YAAc,WAAWG,CAAQ,OAAOlpB,EAAQ,MAAM,wBAC3D,KAAK,YAAY,YAAY+oB,CAAI,CACnC,CACF,CAEA,iBAAkB,CAChB,GAAI,KAAK,QAAQ,OAAQ,OAEzB,MAAMO,EAAS,EACTC,EAAS,GACTC,EAAa,IACbC,EAAY,IACZC,EAAY,IACZC,EAAa,IAEbprB,EAAS,KAAK,QAAQ,sBAAqB,EAC3Cga,EAAK,OAAO,WACZC,EAAK,OAAO,YAEZoR,EAAapR,EAAKja,EAAO,OAASgrB,EAClCM,EAAatrB,EAAO,IAAMgrB,EAC1BO,EAAavR,EAAKha,EAAO,MAAQgrB,EACjCQ,EAAYxrB,EAAO,KAAOgrB,EAE1BS,EAAU,KAAK,IAAIP,EAAW,KAAK,IAAIC,EAAWnrB,EAAO,KAAK,CAAC,EACrE,KAAK,QAAQ,MAAM,MAAQ,GAAGyrB,CAAO,KACrC,KAAK,QAAQ,MAAM,KAAO,MAC1B,KAAK,QAAQ,MAAM,IAAM,MACzB,KAAK,QAAQ,OAAS,GACtB,KAAK,aAAa,MAAM,OAAS,GACjC,KAAK,aAAa,MAAM,UAAY,GAEpC,MAAMjtB,EAAW,KAAK,aAAa,sBAAqB,EAClDktB,EAAWltB,EAAS,OAAS,KAAK,IAAI0sB,EAAW,KAAK,IAAIC,EAAWnrB,EAAO,KAAK,CAAC,EAClF2rB,EAAW,KAAK,aAAa,cAAgBntB,EAAS,QAAUysB,EAEhEW,EAAc,KAAK,IAAIP,EAAYC,CAAU,GAAKL,EAClDY,EAAcR,GAAcC,EAC5BQ,EAAgB,KAAK,IAAIP,EAAYC,CAAS,GAAKN,EACnDa,EAAcR,GAAcC,EAElC,IAAItuB,EAAY,SACZ0uB,EACF1uB,EAAY2uB,EAAc,SAAW,MAC5BC,EACT5uB,EAAY6uB,EAAc,QAAU,OAQpC7uB,EANa,CACX,CAAE,KAAM,SAAU,KAAMmuB,CAAU,EAClC,CAAE,KAAM,MAAO,KAAMC,CAAU,EAC/B,CAAE,KAAM,QAAS,KAAMC,CAAU,EACjC,CAAE,KAAM,OAAQ,KAAMC,CAAS,CACvC,EAAQ,KAAK,CAAC7nG,EAAGC,IAAMA,EAAE,KAAOD,EAAE,IAAI,EAAE,CAAC,GACjB,MAAQ,SAG5B,IAAImtC,EAAOkvC,EAAO,KACd/uC,EAAM+uC,EAAO,OAAS+qB,EAEtB7tB,IAAc,MAChBjsC,EAAM,KAAK,IAAI+5D,EAAQhrB,EAAO,IAAM+qB,EAAS,KAAK,IAAIY,EAAU,KAAK,IAAI,GAAIL,CAAU,CAAC,CAAC,EAChFpuB,IAAc,SACvBpsC,EAAOkvC,EAAO,MAAQ+qB,EACtB95D,EAAM+uC,EAAO,KACJ9C,IAAc,SACvBpsC,EAAO,KAAK,IAAIk6D,EAAQhrB,EAAO,KAAO+qB,EAASW,CAAQ,EACvDz6D,EAAM+uC,EAAO,KAGflvC,EAAO,KAAK,IAAIk6D,EAAQ,KAAK,IAAIhR,EAAKgR,EAASU,EAAU56D,CAAI,CAAC,EAC9DG,EAAM,KAAK,IAAI+5D,EAAQ,KAAK,IAAI/Q,EAAK+Q,EAAS,GAAI/5D,CAAG,CAAC,EAEtD,KAAK,QAAQ,MAAM,MAAQ,GAAG,KAAK,IAAIy6D,EAAU1R,EAAK,EAAIgR,CAAM,CAAC,KACjE,KAAK,QAAQ,MAAM,KAAO,GAAGl6D,CAAI,KACjC,KAAK,QAAQ,MAAM,IAAM,GAAGG,CAAG,KAE/B,MAAM+6D,EAAc9uB,IAAc,MAAQ,KAAK,IAAI8tB,EAAQhrB,EAAO,IAAM+qB,CAAM,EAAI9Q,EAAK+Q,EACjFiB,EAAa,KAAK,IAAI,IAAKD,EAAc/6D,CAAG,EAC5Ci7D,EAAU,KAAK,IAAId,EAAYa,CAAU,EAC/C,KAAK,aAAa,MAAM,OAAS,GAAGC,CAAO,KAC3C,KAAK,aAAa,MAAM,UAAY,GAAGA,CAAO,KAC9C,KAAK,YAAY,MAAM,UAAY,EACrC,CAEA,YAAY,CAAE,UAAAC,CAAS,EAAK,GAAI,CAC9B,KAAK,kBAAiB,EACtB,KAAK,mBAAkB,EACvB,KAAK,QAAQ,OAAS,GACtB,KAAK,YAAY,MAAQA,GAAa,KAAO,OAAOA,CAAS,EAAI,KAAK,UACtE,KAAK,UAAY,KAAK,YAAY,MAClC,KAAK,cAAc,KAAK,YAAY,KAAK,EACzC,KAAK,gBAAe,EACpB,KAAK,2BAA0B,EAC/B,eAAe,IAAM,KAAK,YAAY,MAAK,CAAE,CAC/C,CAEA,cAAe,CACb,KAAK,QAAQ,OAAS,GACtB,KAAK,UAAY,OAAO,KAAK,YAAY,OAAS,EAAE,CACtD,CAEA,4BAA6B,CAC3B,MAAMn7B,EAAW,KAAK,YAAY,cAAc,wDAAwD,EACnGA,GACL,sBAAsB,IAAM,CAC1BA,EAAS,eAAe,CAAE,MAAO,SAAS,CAAE,CAC9C,CAAC,CACH,CAEA,SAAU,CACR,UAAW+sB,KAAW,KAAK,SAAS,OAAO,CAAC,EAC1C,GAAI,CACFA,EAAO,CACT,OAASpwG,EAAO,CACd,QAAQ,KAAK,6CAA8CA,CAAK,CAClE,CAEF,KAAK,QAAQ,OAAM,CACrB,CACF,CC1hBO,SAASy+G,GAAYtjH,EAAO,CAAE,IAAAsK,EAAM,KAAM,IAAAoF,EAAM,IAAI,EAAK,GAAI,CAClE,GAAI1P,GAAS,KAAM,OAAO,KAC1B,MAAMyI,EAAI,OAAOzI,CAAK,EACtB,GAAI,CAAC,OAAO,SAASyI,CAAC,EAAG,OAAO,KAChC,MAAM86G,EAAaj5G,GAAO,KAAO7B,EAAI,KAAK,IAAI,OAAO6B,CAAG,EAAG7B,CAAC,EACtD+6G,EAAa9zG,GAAO,KAAO6zG,EAAa,KAAK,IAAI,OAAO7zG,CAAG,EAAG6zG,CAAU,EAC9E,OAAK,OAAO,SAASC,CAAU,EACxBA,EADkC,IAE3C,CCRA,SAASC,GAAWzjH,EAAO,CACzB,GAAI,OAAOA,GAAU,SAAU,OAAO,KACtC,MAAMq2B,EAAMr2B,EAAM,KAAI,EAAG,QAAQ,KAAM,EAAE,EACzC,GAAI,CAAC,mBAAmB,KAAKq2B,CAAG,EAAG,OAAO,KAC1C,MAAMk7C,EAAUpjC,GAAM,GAAGA,CAAC,GAAGA,CAAC,GAC9B,IAAI+lB,EAAOC,EAAOr5C,EAClB,GAAIub,EAAI,SAAW,EACjB69B,EAAI,SAASqd,EAAOl7C,EAAI,CAAC,CAAC,EAAG,EAAE,EAC/B89B,EAAI,SAASod,EAAOl7C,EAAI,CAAC,CAAC,EAAG,EAAE,EAC/Bvb,EAAI,SAASy2D,EAAOl7C,EAAI,CAAC,CAAC,EAAG,EAAE,UACtBA,EAAI,QAAU,EACvB69B,EAAI,SAAS79B,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAChC89B,EAAI,SAAS99B,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAChCvb,EAAI,SAASub,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,MAEhC,QAAO,KAET,MAAK,CAAC69B,EAAGC,EAAGr5C,CAAC,EAAE,MAAM,OAAO,QAAQ,EAC7B,CAACo5C,EAAI,IAAKC,EAAI,IAAKr5C,EAAI,GAAG,EADa,IAEhD,CAEO,SAAS4oG,GAAOC,EAAMC,EAAU,EAAG,CAExC,GAAI,CADQH,GAAWE,CAAI,EACjB,MAAO,YAEjB,MAAME,EADI,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,OAAOD,CAAO,CAAC,CAAC,EAAI,GAAG,EACvD,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,EACnCvtF,EAAM,OAAOstF,CAAI,EAAE,KAAI,EACvBl6G,EAAO4sB,EAAI,WAAW,GAAG,EAAIA,EAAI,MAAM,CAAC,EAAIA,EAIlD,MAAO,IAHY5sB,EAAK,SAAW,EAC/BA,EAAK,MAAM,EAAE,EAAE,IAAK0kC,GAAM,GAAGA,CAAC,GAAGA,CAAC,EAAE,EAAE,KAAK,EAAE,EAC7C1kC,EAAK,MAAM,EAAG,CAAC,EAAE,OAAO,EAAG,GAAG,CACb,GAAGo6G,CAAE,EAC5B,CChCO,SAASC,GAAsBvhH,EAAM,CAE1C,MADI,SAAOA,GAAS,UAChBA,EAAK,WAAW,GAAG,EAEzB,CCJO,SAASwhH,GAA0BtgH,EAAQ,CAChD,OAAKA,EACE,CACL,GAAGA,EACH,KAAMA,EAAO,MAAQ,OAAOA,EAAO,MAAS,SAAW,CAAE,GAAGA,EAAO,IAAI,EAAKA,EAAO,KACnF,WAAYA,EAAO,YAAcA,EAAO,KACxC,MAAOA,EAAO,OAAS,OAAOA,EAAO,OAAU,SAAW,CAAE,GAAGA,EAAO,KAAK,EAAKA,EAAO,MACvF,OAAQ,MAAM,QAAQA,EAAO,MAAM,EAAI,CAAC,GAAGA,EAAO,MAAM,EAAIA,EAAO,OACnE,MAAO,MAAM,QAAQA,EAAO,KAAK,EAAI,CAAC,GAAGA,EAAO,KAAK,EAAIA,EAAO,MAChE,MAAO,MAAM,QAAQA,EAAO,KAAK,EAAIA,EAAO,MAAM,IAAKywD,IAAO,CAAE,GAAGA,CAAC,EAAG,EAAI,CAAA,CAC/E,EATsB,IAUtB,CCOA,MAAM8vD,OAA6B,IAAI,CACrC,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,oBACA,oBACA,qBACF,CAAC,EAEKC,OAAkC,IAAI,CAC1C,iBACA,oBACA,iBACA,gBACA,gBACA,kBACA,mBACA,kBACA,gBACA,sBACA,mBACA,kBACA,gBACA,kBACA,oBACA,oBACF,CAAC,EAED,SAASC,GAAuB/gH,EAAK,CACnC,MAAMkzB,EAAM,OAAOlzB,GAAO,EAAE,EAAE,KAAA,EAC9B,GAAI,CAACkzB,EAAK,MAAO,GACjB,MAAM8tF,EAAY9tF,EAAI,WAAW,UAAU,EACvC,WAAWA,EAAI,MAAM,CAAiB,CAAC,GACvCA,EAGJ,OAFI2tF,GAAuB,IAAIG,CAAS,GACpCF,GAA4B,IAAIE,CAAS,GACzC,YAAY,KAAKA,CAAS,EAAU,GACjC,mBAAmB,KAAKA,CAAS,CAC1C,CAEA,SAASC,IAAuB,CAC9B,MAAM9+F,EAAU,CAAA,EAEV++F,EAAY,CAAC,CAAE,IAAAlhH,EAAK,MAAAuiB,EAAO,MAAA4nE,EAAO,aAAAg3B,EAAe,CAAA,KAAS,CAC9D,GAAI,CAACnhH,EAAK,OACV,MAAMohH,EAAY,OAAO7+F,GAASviB,CAAG,EAC/BgyF,EAAY+uB,GAAuB/gH,CAAG,EACtCqhH,EAAQ,IAAI,IAAI,CACpB,OAAOrhH,CAAG,EACVohH,EACA,OAAOj3B,GAAS,EAAE,EAClB,OAAOA,GAAS,EAAE,EAAE,YAAA,EACpB6H,EAAY,YAAc,GAC1B,GAAGmvB,EAAa,IAAKzsF,GAAM,OAAOA,CAAC,CAAC,EACpC,GAAGysF,EAAa,IAAKzsF,GAAM,OAAOA,CAAC,EAAE,YAAA,CAAa,CAAA,EAClD,OAAO,OAAO,CAAC,EACjBvS,EAAQ,KAAK,CACX,IAAK,OAAOniB,CAAG,EACf,MAAOohH,EACP,MAAO,OAAOj3B,GAAS,OAAO,EAC9B,UAAA6H,EACA,OAAQ,MAAM,KAAKqvB,CAAK,EAAE,KAAK,GAAG,EAAE,YAAA,CAAY,CACjD,CACH,EAEA,SAAW,CAACrhH,EAAKuyD,CAAI,IAAK,OAAO,QAAQ4e,IAAW,IAAM,CAAA,CAAE,EAAG,CAE7D,GADI5e,GAAM,UACNvyD,EAAI,WAAW,QAAQ,EAAG,SAC9B,MAAMuiB,EAAQviB,EAAI,WAAW,aAAa,EAAIA,EAAI,MAAM,EAAoB,EAAIA,EAChFkhH,EAAU,CAAE,IAAAlhH,EAAK,MAAAuiB,EAAO,MAAO,KAAM,aAAc,CAAC,MAAO,cAAe,QAAQ,CAAA,CAAG,CACvF,CAEA,SAAW,CAACviB,EAAKuyD,CAAI,IAAK,OAAO,QAAQ4e,IAAW,SAAW,CAAA,CAAE,EAAG,CAClE,GAAI5e,GAAM,SAAU,SACpB,MAAMhwC,EAAQviB,EAAI,WAAW,UAAU,EAAIA,EAAI,MAAM,CAAiB,EAAIA,EACpEshH,EAAQthH,EAAI,WAAW,UAAU,EAAI,WAAWuiB,CAAK,GAAKviB,EAChEkhH,EAAU,CAAE,IAAKI,EAAO,MAAA/+F,EAAO,MAAO,UAAW,aAAc,CAACviB,EAAK,WAAY,UAAU,CAAA,CAAG,CAChG,CAEA,SAAW,CAACA,EAAKuyD,CAAI,IAAK,OAAO,QAAQ4e,IAAW,KAAO,CAAA,CAAE,EAAG,CAC9D,GAAI5e,GAAM,SAAU,SACpB,MAAMhwC,EAAQviB,EAAI,WAAW,MAAM,EAAIA,EAAI,MAAM,CAAa,EAAIA,EAClEkhH,EAAU,CAAE,IAAAlhH,EAAK,MAAAuiB,EAAO,MAAO,MAAO,aAAc,CAAC,MAAM,EAAG,CAChE,CAEA,SAAW,CAACviB,EAAKuyD,CAAI,IAAK,OAAO,QAAQ4e,IAAW,QAAU,CAAA,CAAE,EAC1D5e,GAAM,UACV2uD,EAAU,CAAE,IAAAlhH,EAAK,MAAOA,EAAK,MAAO,SAAU,aAAc,CAAC,SAAS,EAAG,EAG3E,MAAMuhH,MAAc,IACdC,MAAY,IAClB,UAAW32F,KAAS1I,EAAS,CAC3B,IAAI6sD,EAAOuyC,EAAQ,IAAI12F,EAAM,KAAK,EAC7BmkD,IACHA,EAAO,CAAA,EACPuyC,EAAQ,IAAI12F,EAAM,MAAOmkD,CAAI,GAE/BA,EAAK,KAAKnkD,CAAK,EACf22F,EAAM,IAAI32F,EAAM,IAAKA,CAAK,CAC5B,CAEA,UAAWmkD,KAAQuyC,EAAQ,SACzBvyC,EAAK,KAAK,CAACt3D,EAAGC,IAAMD,EAAE,MAAM,cAAcC,EAAE,KAAK,CAAC,EAGpD,MAAO,CAAE,QAAAwK,EAAS,QAAAo/F,EAAS,MAAAC,CAAA,CAC7B,CAEO,SAASC,GAAsCrhH,EAAQ,CAE5D,OADmB,OAAOA,GAAU,EAAE,EAAE,KAAA,GACnB,OACvB,CAEO,SAASshH,GAAkC72F,EAAO82F,EAAc,CACrE,MAAO,CAACA,GAAgB92F,GAAO,WAAa,EAC9C,CAEO,SAAS+2F,GAAiCz/F,EAAU,GAAI,CAC7D,OAAOA,EAAQ,KAAM0I,GAAUA,GAAO,MAAQ,YAAY,GAAG,KACxD1I,EAAQ,KAAM0I,GAAUA,GAAO,QAAQ,GAAG,KAC1C,YACP,CAEA,SAASg3F,IAAiC,CACxC,MAAM1/F,EAAU,CAAA,EACV++F,EAAY,CAAC,CAAE,IAAAlhH,EAAK,MAAAuiB,EAAO,OAAAniB,EAAQ,SAAA0hH,KAAe,CACtD,GAAI,CAAC9hH,EAAK,OACV,MAAM8qE,EAAS,EAAQg3C,EACjB33B,EAAQs3B,GAAsCrhH,CAAM,EAC1D+hB,EAAQ,KAAK,CACX,IAAAniB,EACA,MAAO,OAAOuiB,GAASviB,CAAG,EAC1B,MAAAmqF,EACA,OAAQA,EACR,SAAUrf,EACV,KAAMA,EAAS,SAAW,MAAA,CAC3B,CACH,EAEA,SAAW,CAAC9qE,EAAKuyD,CAAI,IAAK,OAAO,QAAQ4e,IAAW,IAAM,CAAA,CAAE,EAAG,CAC7D,MAAM2wC,EAAW,EAAQvvD,GAAM,SACzBhwC,EAAQviB,EAAI,WAAW,QAAQ,EAAIA,EAAI,MAAM,CAAe,EAAIA,EACtEkhH,EAAU,CAAE,IAAAlhH,EAAK,MAAAuiB,EAAO,OAAQ,KAAM,SAAAu/F,EAAU,CAClD,CAEA,SAAW,CAAC9hH,EAAKuyD,CAAI,IAAK,OAAO,QAAQ4e,IAAW,SAAW,CAAA,CAAE,EAAG,CAClE,MAAM2wC,EAAW,EAAQvvD,GAAM,SACzBhwC,EAAQviB,EAAI,WAAW,UAAU,EAAIA,EAAI,MAAM,CAAiB,EAAIA,EACpEshH,EAAQthH,EAAI,WAAW,UAAU,EAAI,WAAWuiB,CAAK,GAAKviB,EAChEkhH,EAAU,CAAE,IAAKI,EAAO,MAAA/+F,EAAO,OAAQ,UAAW,SAAAu/F,EAAU,CAC9D,CAEA,SAAW,CAAC9hH,EAAKuyD,CAAI,IAAK,OAAO,QAAQ4e,IAAW,KAAO,CAAA,CAAE,EAAG,CAC9D,MAAM2wC,EAAW,EAAQvvD,GAAM,SACzBhwC,EAAQviB,EAAI,WAAW,MAAM,EAAIA,EAAI,MAAM,CAAa,EAAIA,EAClEkhH,EAAU,CAAE,IAAAlhH,EAAK,MAAAuiB,EAAO,OAAQ,MAAO,SAAAu/F,EAAU,CACnD,CAEA,SAAW,CAAC9hH,EAAKuyD,CAAI,IAAK,OAAO,QAAQ4e,IAAW,QAAU,CAAA,CAAE,EAAG,CACjE,MAAM2wC,EAAW,EAAQvvD,GAAM,SAC/B2uD,EAAU,CACR,IAAAlhH,EACA,MAAOA,EACP,OAAQ,SACR,SAAA8hH,CAAA,CACD,CACH,CAEA,OAAA3/F,EAAQ,KAAK,CAACzK,EAAGC,IAAMD,EAAE,MAAM,cAAcC,EAAE,KAAK,CAAC,EAC9CwK,CACT,CAEA,SAAS4/F,GAAiBllH,EAAO,CAC/B,GAAI,OAAOA,GAAU,SAAU,MAAO,GACtC,MAAMorE,EAAMprE,EAAM,KAAA,EAClB,MAAO,wDAAwD,KAAKorE,CAAG,CACzE,CAEA,SAAS+5C,GAAWniF,EAAM,CACxB,GAAI,CAAC,MAAM,QAAQA,CAAI,GAAK,CAAC,YAAY,OAAOA,CAAI,EAAG,MAAO,YAC9D,MAAMkxB,EAAI,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,OAAOlxB,EAAK,CAAC,GAAK,CAAC,CAAC,CAAC,EAAI,GAAG,EACnEmxB,EAAI,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,OAAOnxB,EAAK,CAAC,GAAK,CAAC,CAAC,CAAC,EAAI,GAAG,EACnEloB,EAAI,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,OAAOkoB,EAAK,CAAC,GAAK,CAAC,CAAC,CAAC,EAAI,GAAG,EACnEnoB,EAAI,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,OAAOmoB,EAAK,CAAC,GAAK,CAAC,CAAC,CAAC,EAAI,GAAG,EACzE,MAAO,IAAI,CAACkxB,EAAGC,EAAGr5C,EAAGD,CAAC,EAAE,IAAKgd,GAAMA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAC9E,CAEA,SAASutF,GAAe9xG,EAAQ,EAAG,CACjC,MAAM+5D,EAAO/5D,EAAQ,QAAW,IAC1BwxC,EAAI,GACJ+F,EAAI,IACJhwC,EAAIiqC,EAAI,KAAK,IAAI+F,EAAG,EAAIA,CAAC,EACzBhD,EAAKp/C,GAAM,CACf,MAAMqiE,GAAKriE,EAAI4kE,EAAM,IAAM,GACrBzoC,EAAQimB,EAAIhwC,EAAI,KAAK,IAAI,KAAK,IAAIiwD,EAAI,EAAG,EAAIA,EAAG,CAAC,EAAG,EAAE,EAC5D,OAAO,KAAK,MAAM,IAAMlmC,CAAK,CAC/B,EACA,MAAO,IAAI,CAACijB,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAG,GAAG,EAAE,IAAKhwB,GAAMA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EACzF,CAEA,SAASwtF,GAAexqG,EAAGC,EAAG,CAC5B,MAAMktC,EAAO,OAAOntC,GAAK,EAAE,EACrBotC,EAAQ,OAAOntC,GAAK,EAAE,EACtBwqG,EAAK,WACLC,EAASv9D,EAAK,MAAMs9D,CAAE,GAAK,CAAA,EAC3BE,EAASv9D,EAAM,MAAMq9D,CAAE,GAAK,CAAA,EAC5B3iF,EAAM,KAAK,IAAI4iF,EAAO,OAAQC,EAAO,MAAM,EACjD,QAASt8G,EAAI,EAAGA,EAAIy5B,EAAKz5B,GAAK,EAAG,CAC/B,MAAMyjD,EAAK44D,EAAOr8G,CAAC,GAAK,GAClB0jD,EAAK44D,EAAOt8G,CAAC,GAAK,GAClBu8G,EAAO,OAAO94D,CAAE,EAChB+4D,EAAO,OAAO94D,CAAE,EAChB+4D,EAASh5D,GAAM,OAAO,SAAS84D,CAAI,EACnCG,EAASh5D,GAAM,OAAO,SAAS84D,CAAI,EACzC,GAAIC,GAAUC,GAAUH,IAASC,SAAaD,EAAOC,EACrD,GAAIC,IAAWC,EAAQ,OAAOD,EAAS,GAAK,EAC5C,GAAIh5D,IAAOC,EAAI,OAAOD,EAAG,cAAcC,CAAE,CAC3C,CACA,OAAO5E,EAAK,cAAcC,CAAK,CACjC,CAEO,SAAS49D,GAA2B7lH,EAAO,CAChD,GAAIA,GAAS,KAAM,MAAO,GAC1B,MAAMO,EAAa,OAAOP,CAAK,EAAE,KAAA,EAAO,YAAA,EACxC,OAAOO,IAAe,QAAUA,IAAe,MACjD,CAEA,SAASulH,GAA2B93F,EAAO,CACzC,MAAI,CAACA,GAAS,OAAOA,GAAU,SAAiB,GAC5CA,EAAM,cAAgB,GAAa,GACnC,OAAO,UAAU,eAAe,KAAKA,EAAO,UAAU,EACjD63F,GAA2B73F,EAAM,QAAQ,EAE3C63F,GAA2B73F,EAAM,KAAK,CAC/C,CAEO,SAAS+3F,GAAwBzgG,EAAS,CAC/C,UAAA0gG,EAAY,YACZ,YAAAC,EAAc,CAAA,EACd,cAAAC,EAAgB,IAClB,EAAI,GAAI,CACN,MAAM/zC,EAAO,MAAM,QAAQ7sD,CAAO,EAAIA,EAAQ,MAAA,EAAU,CAAA,EACxD,GAAI,CAAC6sD,EAAK,OAAQ,MAAO,CAAA,EAEzB,GAAI6zC,IAAc,eAChB7zC,EAAK,KAAK,CAACt3D,EAAGC,IAAM,OAAOD,GAAG,OAAS,EAAE,EAAE,cAAc,OAAOC,GAAG,OAAS,EAAE,CAAC,CAAC,UACvEkrG,IAAc,UACvB7zC,EAAK,KAAK,CAACt3D,EAAGC,IAAMuqG,GAAexqG,GAAG,MAAOC,GAAG,KAAK,CAAC,UAC7CkrG,IAAc,SAAU,CACjC,MAAMG,EAAO,IAAI,IAAIh0C,EAAK,IAAKnkD,GAAU,CAACA,EAAM,GAAIA,CAAK,CAAC,CAAC,EACrDy1B,EAAUwiE,EAAY,IAAK7zG,GAAO+zG,EAAK,IAAI/zG,CAAE,CAAC,EAAE,OAAO,OAAO,EAC9D41E,EAAO,IAAI,IAAIvkC,EAAQ,IAAKz1B,GAAUA,EAAM,EAAE,CAAC,EACrD,UAAWA,KAASmkD,EACb6V,EAAK,IAAIh6D,EAAM,EAAE,GAAGy1B,EAAQ,KAAKz1B,CAAK,EAE7CmkD,EAAK,OAAO,EAAGA,EAAK,OAAQ,GAAG1uB,CAAO,CACxC,MACE0uB,EAAK,KAAK,CAACt3D,EAAGC,IAAO,OAAOA,GAAG,OAAS,CAAC,EAAI,OAAOD,GAAG,OAAS,CAAC,GAAM,OAAOA,GAAG,OAAS,EAAE,EAAE,cAAc,OAAOC,GAAG,OAAS,EAAE,CAAC,CAAC,EAGrI,MAAMsrG,EAASF,GAAiB,MAAQ,OAAO,SAAS,OAAOA,CAAa,CAAC,EACzE,KAAK,IAAI,EAAG,KAAK,IAAI/zC,EAAK,OAAQ,KAAK,MAAM,OAAO+zC,CAAa,CAAC,CAAC,CAAC,EACpE/zC,EAAK,OACHk0C,EAAUl0C,EAAK,OAAQnkD,GAAU,CAAC83F,GAA2B93F,CAAK,CAAC,EACnEs4F,EAAcn0C,EAAK,OAAQnkD,GAAU83F,GAA2B93F,CAAK,CAAC,EAC5E,IAAI85D,EAAU3V,EAAK,MAAM,EAAGi0C,CAAM,EAI9BA,EAASj0C,EAAK,QAAUk0C,EAAQ,OAAS,GAAKC,EAAY,OAAS,IACrEx+B,EAAUu+B,EAAQ,MAAM,EAAGD,CAAM,GAGnC,MAAMG,EAAiB,CAAA,EACjBC,EAAqB,CAAA,EAC3B,UAAWx4F,KAAS85D,EACdg+B,GAA2B93F,CAAK,EAAGw4F,EAAmB,KAAKx4F,CAAK,EAC/Du4F,EAAe,KAAKv4F,CAAK,EAEhC,OAAOu4F,EAAe,OAAOC,CAAkB,CACjD,CAOA,MAAMC,GAA0BpnG,GAC9BA,IAASm/B,iBAAc,SACvBn/B,IAASm/B,iBAAc,OACvBn/B,IAASm/B,iBAAc,SACvBn/B,IAASm/B,iBAAc,iBACvBn/B,IAASm/B,iBAAc,QACvBn/B,IAASm/B,iBAAc,YACvBn/B,IAASm/B,GAAAA,cAAc,mBACnBkoE,GAA0BrnG,GAC9BA,IAASm/B,GAAAA,cAAc,SACvBn/B,IAASm/B,GAAAA,cAAc,iBACvBn/B,IAASm/B,GAAAA,cAAc,YACvBn/B,IAASm/B,GAAAA,cAAc,mBACnBmoE,GAA8BtnG,GAASA,IAASm/B,GAAAA,cAAc,SAC9DooE,GAAyBvnG,GAASA,IAASm/B,GAAAA,cAAc,OAExD,MAAMqoE,EAAa,CACxB,YAAYC,EAAIlmH,EAAU,GAAI,CAC5B,KAAK,GAAKkmH,EACV,KAAK,OAASA,GAAI,QAAU,KAC5B,KAAK,QAAUlmH,CACjB,CAEA,QAAS,CACP,MAAMkmH,EAAK,KAAK,GACVv7G,EAAS,KAAK,OACdw7G,EAAkBx7G,GAAQ,UAAU,SAAWA,GAAQ,cAAc,SAAS,EAC9Ey7G,EAAM,IAAMz7G,GAAQ,SAAW,KAC/B3K,EAAU,KAAK,SAAW,CAAA,EAC1BqmH,EAAoBrmH,EAAQ,oBAAsB,GAElDsmH,EAAWpS,GAAA,EACjBgS,EAAG,iBAAiB,IAAI,IAAMI,EAAS,SAAS,EAEhD,MAAMC,EAAmB,CAAC,CAAE,MAAA/e,EAAO,KAAA2H,GAAM,SAAAkC,CAAA,IAAeW,GAAmB,CACzE,MAAAxK,EACA,KAAA2H,GACA,SAAAkC,EACA,cAAeiV,EAAS,aAAA,CACzB,EAyBKE,EAAiB,CACrB,MAAO,QACP,KAAM,OACN,QAAS,gBACT,aAAc,gBACd,SAAU,WACV,MAAO,QACP,QAAS,UACT,aAAc,eAAA,EAGVC,EAAqB,CACzB,OAAQ,SACR,SAAU,WACV,YAAa,cACb,cAAe,mBACf,WAAY,mBACZ,OAAQ,QACR,SAAU,WACV,YAAa,aAAA,EAGTrnC,EAAe,CAAC,QAAS,OAAQ,UAAW,eAAgB,UAAU,EAEtEI,EAAe,CAAC,QAAS,QAAS,SAAS,EAE3CknC,EAAkBlD,GAAA,EAClBmD,EAA4BvC,GAAA,EAC5BwC,EAA4BzC,GAAiCwC,CAAyB,EAE5F,IAAIE,EAAsB,EAC1B,MAAMC,EAAsB,CAC1B,SAAU,IACV,SAAU,GAAI,EAGVC,EAAqB,CAAC7mH,EAAM+4B,KAAY,CAC5C,MAAM+tF,EAAUF,EAAoB5mH,CAAI,EACxC,GAAI,CAAC8mH,EAAS,OAAO,IAAI,IACzB,IAAIC,EAAYD,EAAQ,IAAI/tF,EAAO,EACnC,OAAKguF,IACHA,MAAgB,IAChBD,EAAQ,IAAI/tF,GAASguF,CAAS,GAEzBA,CACT,EAEOC,EAA8BrkH,GAAW,CAC7C,GAAI,CAACA,EAAQ,MAAO,GACpB,MAAM4b,GAAO5b,EAAO,MAAQA,EAAO,MAAQ,KAE3C,GADI4b,KAAS,UACTA,KAAS,aAAc,MAAO,GAElC,MAAM0oG,EAAQ,MAAM,QAAQtkH,EAAO,KAAK,EAAIA,EAAO,MAAQ,CAAA,EAc5D,MAJK,EARFskH,EAAM,SAAW,GACjBA,EAAM,MAAOvuC,GAEP,EADOA,GAAM,MAAQ,OAAOA,EAAK,MAAS,SAAWA,EAAK,KAAO,OAEjE,OAAOA,EAAK,MAAS,WAAmB,GAErCA,EAAK,QAAU,MACvB,IAIA,OAAO/1E,EAAO,WAAc,YAAc,CAACA,EAAO,eAClD,OAAOA,EAAO,OAAU,WAAmB,GAG3C4b,KAAS,YACTA,KAAS,eACTA,KAAS,UACTA,KAAS,iBACTA,KAAS,cAAsB,GAE/BA,KAAS,YAAc5b,EAAO,SAEzB,OAAQA,EAAO,UAAYA,EAAO,OAASA,EAAO,QAAW,SAG/D,EACT,EAEMukH,EAA2BvkH,GAAW,CAE1C,GADI,CAACA,GACDqkH,EAA2BrkH,CAAM,EAAG,MAAO,GAC/C,MAAMokC,GAAOpkC,EAAO,MAAQ,OAAOA,EAAO,MAAS,SAAWA,EAAO,KAAO,KAG5E,MAFI,CAACokC,IAED,CADS,OAAO,KAAKA,EAAI,EACnB,OAAe,GAKlB,EAHJ,OAAOA,GAAK,MAAS,UAAYA,GAAK,KAAK,QAC3C,OAAOA,GAAK,QAAW,UAAYA,GAAK,OAAO,KAAA,GAC/C,OAAOA,GAAK,aAAgB,UAAYA,GAAK,YAAY,KAAA,EAE9D,EAEMogF,EAAuB,CAACnnH,EAAM+4B,GAASp2B,IAAW,CACtD,GAAI,CAACA,EAAQ,OAAO,KACpB,MAAMokC,EAAOpkC,EAAO,MAAQ,OAAOA,EAAO,MAAS,SAAWA,EAAO,KAAO,CAAA,EACtEykH,EAAgB,OAAOrgF,EAAK,MAAS,SAAWA,EAAK,KAAK,OAAS,GACnEsgF,EAASD,GAAiB,UAAUT,GAAqB,GACzDW,GAAYJ,EAAwBvkH,CAAM,EAE1C0iH,GAAOwB,EAAmB7mH,EAAM+4B,EAAO,EAC7C,IAAIznB,GAAK+1G,EACT,GAAIhC,GAAK,IAAI/zG,EAAE,EAAG,CAEhB,GADiB+zG,GAAK,IAAI/zG,EAAE,GACd,SAAW3O,EAAQ,OAAO2O,GACxC,IAAI3J,GAAI,EACR,KAAO09G,GAAK,IAAI,GAAGgC,CAAM,KAAK1/G,EAAC,GAAG,GAAGA,IAAK,EAC1C2J,GAAK,GAAG+1G,CAAM,KAAK1/G,EAAC,GACtB,CAEA,OAAA09G,GAAK,IAAI/zG,GAAI,CACX,GAAAA,GACA,MAAO81G,GAAiB,SACxB,UAAAE,GACA,OAAQrE,GAA0BtgH,CAAM,GAAKA,CAAA,CAC9C,EACM2O,EACT,EAEMi2G,EAA8B,CAACvnH,EAAM+4B,KAAY,CACrD,MAAMssF,EAAOwB,EAAmB7mH,EAAM+4B,EAAO,EAC7C,SAAW,CAACznB,EAAI3R,CAAM,IAAK0lH,EAAK,UAC1B1lH,GAAQ,WAAW0lH,EAAK,OAAO/zG,CAAE,CAEzC,EAEMk2G,EAAsB/lH,GACtB,OAAOA,GAAS,SAAiBA,EAC9BsE,GAAqBtE,CAAI,GAAKA,EAGjCgmH,EAAmB,CAACviF,EAAOwiF,KAAY,CAC3C,MAAMthH,EAAU8/G,EAAA,EAChB,GAAI,CAAC9/G,EAAS,OAAO,KACrB,GAAIshH,KAAY,SAAU,MAAO,CAAE,UAAW,EAAG,KAAM,IAAA,EACvD,GAAI,OAAOA,IAAY,UAAY,CAACA,GAAQ,OAAQ,OAAO,KAE3D,GAAIxiF,IAAU,QAAUwiF,GAAQ,WAAW,QAAQ,EAAG,CACpD,MAAMrlH,EAAMqlH,GAAQ,MAAM,CAAe,EACnCr9F,EAAWm9F,EAAmBnlH,CAAG,EACvC,GAAI,CACF,OAAO+D,EAAQ,uBAAuBikB,CAAQ,GAAK,IACrD,MAAY,CACV,OAAO,IACT,CACF,CAEA,MAAMA,EAAWm9F,EAAmBE,EAAO,EAC3C,GAAI,CACF,OAAOxiF,IAAU,OACZ9+B,EAAQ,uBAAuBikB,CAAQ,GAAK,KAC5CjkB,EAAQ,uBAAuBikB,CAAQ,GAAK,IACnD,MAAY,CACV,OAAO,IACT,CACF,EAEMs9F,EAAwB,CAACziF,EAAOnM,GAAS6uF,EAAYnmH,EAAM,CAAE,WAAAomH,CAAA,EAAe,KAAO,CACvF,MAAM3yC,EAAOuyC,EAAiBviF,EAAOzjC,CAAI,EACzC,GAAI,CAACyzE,EAAM,MAAO,GAClB,MAAM3f,GAAM2f,EAAK,WAAa,EAC9B,GAAI0yC,IAAe,cAEjB,OADI1iF,IAAU,QAAU,OAAOzjC,GAAS,UAAY,aAAa,KAAKA,CAAI,GACtE8zD,KAAQ,EAAU,GACfswD,GAA2B3wC,EAAK,IAAI,GAAK4wC,GAAsB5wC,EAAK,IAAI,EAGjF,GAAIA,EAAK,MAAQ,MAAQ,CAACywC,GAAuBzwC,EAAK,IAAI,EAAG,MAAO,GACpE,MAAM4yC,GAAS5iF,IAAU,OACnB6iF,GAAcD,IAAUD,IAAe,OACvCG,GAAiBjvF,KAAY,SAAWA,KAAY,eACpDkvF,GAAoB/iF,IAAU,QAAUnM,KAAY,WACpDmvF,GACJnvF,KAAY,QACZA,KAAY,WACZA,KAAY,SACZA,KAAY,WACZA,KAAY,eAMd,OAJI6uF,IAAe,YAIfA,IAAe,SACVryD,KAAQ,EAGbqyD,IAAe,gBACbI,GACED,GAAoBxyD,KAAQ,EACzBA,KAAQ,GAAKA,KAAQ,EAE1B2yD,GAAwB3yD,KAAQ,EAC7B,GAGLqyD,IAAe,cACbK,GACK1yD,KAAQ,EAEbyyD,GACEF,IAAU,OAAOrmH,GAAS,UAAY,aAAa,KAAKA,CAAI,EAAU,GACtEqmH,GAAevyD,KAAQ,GAAKA,KAAQ,EACjCA,KAAQ,GAAKA,KAAQ,EAE1B2yD,GACEJ,GAAevyD,KAAQ,GAAKA,KAAQ,EACjCA,KAAQ,EAEV,GAGF,EACT,EAEM4yD,EAAqB,CAACjjF,EAAO,CAAE,QAAAnM,GAAS,WAAA6uF,EAAY,WAAAC,CAAA,EAAe,KAAO,CAC9E,MAAMzhH,EAAU8/G,EAAA,EAChB,GAAI,CAAC9/G,EAAS,MAAO,CAAA,EACrB,MAAMgiH,EAAWljF,IAAU,OAAS9+B,EAAQ,sBAAwBA,EAAQ,sBAC5E,GAAI,OAAOgiH,GAAa,WAAY,MAAO,CAAA,EAC3C,IAAI7yF,GAAM,CAAA,EACV,GAAI,CACFA,GAAM6yF,EAAS,KAAKhiH,CAAO,GAAK,CAAA,CAClC,MAAY,CACV,MAAO,CAAA,CACT,CACA,MAAMoL,GAAM,CAAA,EAEZA,GAAI,KAAK,QAAQ,EACb0zB,IAAU,QACZ1zB,GAAI,KAAK,QAAS,OAAQ,UAAW,eAAgB,UAAU,EAGjE,UAAW/P,MAAQ8zB,GACb,OAAO9zB,IAAS,UACfuhH,GAAsBvhH,EAAI,GAC/B+P,GAAI,KAAK/P,EAAI,EAIf,GADuByjC,IAAU,QAAU0iF,IAAe,eACpC,OAAOxhH,EAAQ,uBAA0B,WAAY,CACzE,IAAIiiH,GAAU,CAAA,EACd,GAAI,CACFA,GAAUjiH,EAAQ,sBAAA,GAA2B,CAAA,CAC/C,MAAY,CACViiH,GAAU,CAAA,CACZ,CACA,UAAW5mH,MAAQ4mH,GACb,OAAO5mH,IAAS,UACfuhH,GAAsBvhH,EAAI,GAC/B+P,GAAI,KAAK,SAAS/P,EAAI,EAAE,CAE5B,CAEA,MAAM6mH,GAAS,MAAM,KAAK,IAAI,IAAI92G,EAAG,CAAC,EAOtC,OANA82G,GAAO,KAAK,CAACvuG,GAAGC,KACVD,KAAM,SAAiB,GACvBC,KAAM,SAAiB,EACpBD,GAAE,cAAcC,EAAC,CACzB,EAEG+e,IAAW6uF,EACNU,GAAO,OAAQ7mH,IAASkmH,EAAsBziF,EAAOnM,GAAS6uF,EAAYnmH,GAAM,CAAE,WAAAomH,CAAA,CAAY,CAAC,EAEjGS,EACT,EAEMC,EAAkB,YAClBC,EAAgB,UAEhBC,EAAsBhnH,GACtBA,IAAS8mH,EAAwB,cACjC9mH,IAAS+mH,EAAsB,mBAC/B/mH,IAAS,SAAiB,QAC1B,OAAOA,GAAS,UAAYA,EAAK,WAAW,QAAQ,EAAU,SAASA,EAAK,MAAM,CAAe,CAAC,GAC/FA,EAGHinH,EAA2BjnH,GAC3BA,IAAS8mH,GAAmB9mH,IAAS+mH,GAAiB/mH,IAAS,SAAiB,kBAChF,OAAOA,GAAS,UAAYA,EAAK,WAAW,QAAQ,EAAU,kBAC3D,aAGHknH,EAA6B,CAAC5S,EAAQtyE,KAAY,CACtD,MAAM2vD,MAAa,IAAI,CACrB,CAAC,kBAAmB,CAAA,CAAE,EACtB,CAAC,aAAc,CAAA,CAAE,EACjB,CAAC,kBAAmB,CAAA,CAAE,CAAA,CACvB,EACD,UAAW3wF,KAAUghC,GAAS,CAC5B,MAAM+oD,EAAQk8B,EAAwBjmH,CAAM,EACtC4uE,EAAO+hB,EAAO,IAAI5G,CAAK,GAAK,CAAA,EAClCnb,EAAK,KAAK5uE,CAAM,EAChB2wF,EAAO,IAAI5G,EAAOnb,CAAI,CACxB,CAEA,SAAW,CAACzsD,EAAO7T,CAAM,IAAKqiF,EAAO,UAAW,CAC9C,GAAI,CAACriF,EAAO,OAAQ,SACpB,MAAM63G,EAAW,SAAS,cAAc,UAAU,EAClDA,EAAS,MAAQhkG,EACjB,UAAWniB,MAAUsO,EAAQ,CAC3B,MAAM83G,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQpmH,GACZomH,GAAI,YAAcJ,EAAmBhmH,EAAM,EAC3CmmH,EAAS,YAAYC,EAAG,CAC1B,CACA9S,EAAO,YAAY6S,CAAQ,CAC7B,CACF,EAEME,EAAoB,CAAC9oH,EAAM+4B,KAAY,CAC3C,MAAM3yB,EAAU8/G,EAAA,EACV10G,EAAM,CAAC+2G,CAAe,EAK5B,GAJIvoH,IAAS,QAAU+4B,KAAY,YAAYvnB,EAAI,KAAKg3G,CAAa,EAErEh3G,EAAI,KAAK,GAAG22G,EAAmBnoH,EAAM,CAAE,QAAA+4B,EAAA,CAAS,CAAC,EAE7C/4B,IAAS,QAAU,OAAOoG,GAAS,uBAA0B,WAAY,CAC3EoL,EAAI,KAAK,cAAe,aAAc,gBAAiB,qBAAsB,gBAAgB,EAC7F,IAAI62G,EAAU,CAAA,EACd,GAAI,CACFA,EAAUjiH,EAAQ,sBAAA,GAA2B,CAAA,CAC/C,MAAY,CACViiH,EAAU,CAAA,CACZ,CACA,UAAW5mH,MAAQ4mH,EACb,OAAO5mH,IAAS,UACfuhH,GAAsBvhH,EAAI,GAC/B+P,EAAI,KAAK,SAAS/P,EAAI,EAAE,CAE5B,CAEA,MAAM6mH,EAAS,MAAM,KAAK,IAAI,IAAI92G,CAAG,CAAC,EACtC,OAAA82G,EAAO,KAAK,CAACvuG,EAAGC,KACVD,IAAMwuG,EAAwB,GAC9BvuG,KAAMuuG,EAAwB,EAC9BxuG,IAAMyuG,EAAsB,GAC5BxuG,KAAMwuG,EAAsB,EAC5BzuG,IAAM,SAAiB,GACvBC,KAAM,SAAiB,EACpBD,EAAE,cAAcC,EAAC,CACzB,EACMsuG,CACT,EAEMS,EAAyBpmH,GAAW,CACxC,GAAI,CAACA,EAAQ,OAAO,KACpB,MAAM4b,GAAO5b,EAAO,MAAQA,EAAO,MAAQ,KAC3C,GAAI4b,KAAS,WAAY,OAAOgqG,EAChC,GAAIhqG,KAAS,SAAU,OAAOiqG,EAC9B,IAAKjqG,KAAS,iBAAmBA,KAAS,eAAiB,OAAO5b,EAAO,eAAkB,UAAYA,EAAO,cAAc,OAC1H,MAAO,SAASA,EAAO,aAAa,GAEtC,MAAM01E,EAAQ11E,EAAO,YAAcA,EAAO,KAC1C,GAAI,OAAO01E,GAAU,UAAYA,EAAM,OAAQ,OAAOA,EACtD,GAAI,MAAM,QAAQA,CAAK,EAAG,CACxB,MAAM/Z,EAAW+Z,EAAM,KAAMn5E,GAAU,OAAOA,GAAU,UAAY,aAAa,KAAKA,CAAK,CAAC,EAC5F,GAAIo/D,EAAU,OAAOA,EAAS,QAAQ,aAAc,QAAQ,EAC5D,MAAMuyB,EAAQxY,EAAM,KAAMn5E,GAAU,OAAOA,GAAU,UAAYA,EAAM,MAAM,EAC7E,GAAI2xF,EAAO,OAAOA,CACpB,CACA,OAAO,IACT,EAEMm4B,EAA2BvmH,GAC3B,OAAOA,GAAW,SAAiB,GACnCA,EAAO,WAAW,QAAQ,EAAUA,EAAO,MAAM,CAAe,EAChEA,EAAO,WAAW,SAAS,EAAUA,EAAO,MAAM,CAAgB,EAC/DA,EAGHwmH,EAA+B,CAACjpH,EAAM+4B,GAASt2B,EAAQymH,EAAe,KACtEzmH,IAAW8lH,EAAwBW,EAAa,SAAS,UAAU,EAAI,CAAC,UAAU,EAAI,CAAA,EACtFzmH,IAAW+lH,EAAsBU,EAAa,SAAS,QAAQ,EAAI,CAAC,QAAQ,EAAI,CAAA,EAChF,OAAOzmH,GAAW,UAAY,CAACA,EAAO,OAAe,CAAA,EAElDymH,EAAa,OAAQ3qG,GACtBA,IAAS,YAAcA,IAAS,SAAiB,GACjDA,IAAS,gBACN9b,EAAO,WAAW,QAAQ,EACxBklH,EAAsB,OAAQ5uF,GAAS,gBAAiBiwF,EAAwBvmH,CAAM,EAAG,CAAE,WAAYzC,EAAM,EAD3E,GAGpC2nH,EAAsB3nH,EAAM+4B,GAASxa,EAAM9b,CAAM,CACzD,EAGG0mH,EAA2B,CAACnpH,EAAM+4B,GAASt2B,EAAQ2mH,EAAe,KAAO,CAC7E,GAAI,CAACA,EAAa,OAAQ,OAAO,KAEjC,GADI3mH,IAAW8lH,GACX9lH,IAAW+lH,EAAe,OAAOY,EAAa,CAAC,EACnD,GAAI3mH,GAAQ,aAAa,QAAQ,GAAK2mH,EAAa,SAAS,eAAe,EAAG,MAAO,gBAErF,MAAMl0C,EAAOuyC,EAAiBznH,EAAMyC,CAAM,EACpC4mH,EAAUtwF,KAAY,SAAWA,KAAY,eAC7CuwF,GACJvwF,KAAY,QACZA,KAAY,WACZA,KAAY,SACZA,KAAY,UAEd,OAAIm8C,IAAS2wC,GAA2B3wC,EAAK,IAAI,GAAK4wC,GAAsB5wC,EAAK,IAAI,IAAMk0C,EAAa,SAAS,aAAa,EACrH,cAELC,GAAWD,EAAa,SAAS,UAAU,EAAU,WACrDE,IAAYF,EAAa,SAAS,QAAQ,EAAU,SACpDA,EAAa,SAAS,aAAa,EAAU,cAC1CA,EAAa,CAAC,CACvB,EAEMG,EAAqBvpH,GACpByK,EACEzK,IAAS,OAASyK,EAAO,WAAaA,EAAO,WADhC,KAIhB++G,EAAsB,CAACtkF,EAAOwiF,KAAY,CAC9C,MAAMthH,EAAU8/G,EAAA,EAEhB,GADI,CAAC9/G,GACD,OAAOshH,IAAY,UAAY,CAACA,GAAS,OAAO,KAEpD,GAAIA,KAAY,SAAU,CACxB,MAAM9gH,GAAQs+B,IAAU,OACnB9+B,EAAQ,WAAaA,EAAQ,YAAc,KAC3CA,EAAQ,WAAaA,EAAQ,YAAc,KAChD,OAAI,OAAO,SAASQ,EAAK,GAAKA,GAAQ,EAAU,CAAE,IAAK,EAAG,IAAK,KAAK,IAAI,EAAGA,GAAQ,CAAC,EAAG,UAAW,EAAA,EAC3F,IACT,CAEA,MAAM6iH,EAAe9hH,IAAM6/G,EAAmB7/G,EAAC,EACzC2wE,EAAcpzC,IAAU,QAAUwiF,GAAQ,WAAW,QAAQ,EAC7DjmH,EAAO62E,EAAcovC,GAAQ,MAAM,CAAe,EAAIA,GACtDr9F,GAAWo/F,EAAYhoH,CAAI,EAC3ByzE,GAAOuyC,EAAiBviF,EAAOwiF,EAAO,EACtCgC,GAAcx0C,IAAM,MAAQ,MAAQ0wC,GAAuB1wC,GAAK,IAAI,EAEpEqD,GAAU,IAAM,CACpB,GAAI,CACF,MAAM5zC,GAAUO,IAAU,UACtB,CAAC,CAAC,EACDozC,GAAepzC,IAAU,OACxB9+B,EAAQ,YACRA,EAAQ,YACd,GAAI,CAACu+B,IAAW,OAAOA,GAAQ,QAAW,UAAYA,GAAQ,SAAW,EAAG,OAAO,KAKnF,MAAMh+B,IAJS2xE,EACXlyE,EAAQ,yBAAyBikB,EAAQ,EACxC6a,IAAU,OAAS9+B,EAAQ,yBAAyBikB,EAAQ,EAAIjkB,EAAQ,yBAAyBikB,EAAQ,IAEzF,MAAQ,KAC7B,GAAI,CAAC1jB,IAAQ,OAAOA,GAAK,QAAW,UAAYA,GAAK,QAAU,EAAG,OAAO,KAEzE,IAAI6C,GAAM,IACNoF,GAAM,KACV,QAASxG,GAAI,EAAGA,GAAIu8B,GAAQ,OAAQv8B,IAAK,EAAG,CAC1C,MAAM6vE,GAAMtzC,GAAQv8B,EAAC,EACf2uB,GAAI,OAAOpwB,GAAKsxE,EAAG,CAAC,EACrB,OAAO,SAASlhD,EAAC,IAClBA,GAAIvtB,KAAKA,GAAMutB,IACfA,GAAInoB,KAAKA,GAAMmoB,IACrB,CACA,GAAI,CAAC,OAAO,SAASvtB,EAAG,GAAK,CAAC,OAAO,SAASoF,EAAG,EAAG,OAAO,KAC3D,GAAI86G,GAAa,CACf,MAAMC,GAAS,KAAK,MAAMngH,EAAG,EACvBogH,GAAS,KAAK,KAAKh7G,EAAG,EAC5B,OAAI+6G,KAAWC,GAAe,CAAE,IAAKD,GAAQ,IAAKA,GAAS,EAAG,UAAW,EAAA,EAClE,CAAE,IAAKA,GAAQ,IAAKC,GAAQ,UAAW,EAAA,CAChD,CACA,OAAIpgH,KAAQoF,GAAY,CAAE,IAAApF,GAAK,IAAKA,GAAM,CAAA,EACnC,CAAE,IAAAA,GAAK,IAAAoF,EAAA,CAChB,MAAgB,CAMd,OAAO,IACT,CACF,EAEA,OAAI,OAAOxI,EAAQ,kBAAqB,WAC/BA,EAAQ,iBAAiBmyE,EAAO,EAElCA,GAAA,CACT,EAEMsxC,EAA4B,CAAC3kF,EAAOwiF,KAAY,CACpD,MAAMoC,EAASN,EAAoBtkF,EAAOwiF,EAAO,EACjD,OAAIoC,GAAU,OAAO,SAASA,EAAO,GAAG,GAAK,OAAO,SAASA,EAAO,GAAG,EAAU,CAACA,EAAO,IAAKA,EAAO,GAAG,EACjG,CAAC,EAAG,CAAC,CACd,EAEMC,GAAyB,CAC7B,UAAW,IACX,UAAW,IACX,QAAS,GAAA,EAGLC,GAA2B,CAAC9kF,EAAOwiF,KAAY,CACnD,MAAMthH,EAAU8/G,EAAA,EAChB,GAAI,CAAC9/G,EAAS,MAAO,CAAE,GAAI,GAAO,OAAQ,sBAAA,EAC1C,MAAM3E,EAAO+lH,EAAmBE,EAAO,EACjCx5F,EAAOgX,IAAU,OACnB9+B,EAAQ,wBAAwB,KAAKA,CAAO,EAC5CA,EAAQ,wBAAwB,KAAKA,CAAO,EAChD,GAAI,OAAO8nB,GAAS,WAAY,MAAO,CAAE,GAAI,GAAO,OAAQ,yCAAA,EAC5D,MAAMqqD,EAAU,IAAM,CACpB,MAAM5zC,GAAUO,IAAU,OAAS9+B,EAAQ,YAAcA,EAAQ,YAC3DgL,GAAQ,KAAK,IAAIuzB,IAAS,QAAU,EAAGolF,GAAuB,OAAO,EACrEE,OAAc,IACpB,IAAIC,GAAY,EAChB,QAAS9hH,GAAI,EAAGA,GAAIgJ,GAAOhJ,IAAK,EAAG,CACjC,MAAM6vE,GAAMtzC,GAAQv8B,EAAC,EACflJ,GAAQgvB,EAAKzsB,EAAMw2E,EAAG,EAC5B,GAAI,OAAO/4E,IAAU,SAAU,SAC/B,MAAM2iC,GAAM3iC,GAAM,OAElB,GADI2iC,GAAMqoF,KAAWA,GAAYroF,IAC7BA,GAAMkoF,GAAuB,UAC/B,MAAO,CAAE,GAAI,GAAO,OAAQ,wBAAwBA,GAAuB,SAAS,cAAA,EAEtF,GAAI7qH,IAASA,KAAU,WACrB+qH,GAAQ,IAAI/qH,EAAK,EACb+qH,GAAQ,KAAOF,GAAuB,WACxC,MAAO,CAAE,GAAI,GAAO,OAAQ,aAAaA,GAAuB,SAAS,0BAAA,CAG/E,CACA,MAAO,CAAE,GAAI,GAAM,YAAaE,GAAQ,KAAM,UAAAC,EAAA,CAChD,EACA,OAAO,OAAO9jH,EAAQ,kBAAqB,WAAaA,EAAQ,iBAAiBmyE,CAAO,EAAIA,EAAA,CAC9F,EAEM4xC,GAA4B,CAACjlF,EAAOwiF,KAAY,CACpD,MAAMthH,EAAU8/G,EAAA,EAChB,GAAI,CAAC9/G,EAAS,MAAO,CAAA,EACrB,GAAI,OAAOshH,IAAY,UAAY,CAACA,SAAgB,CAAA,EACpD,MAAMjmH,EAAO+lH,EAAmBE,EAAO,EACvC,GAAI,CACF,MAAM/8F,EAASua,IAAU,OACrB9+B,EAAQ,mCACRA,EAAQ,mCACZ,GAAI,OAAOukB,GAAW,WAAY,MAAO,CAAA,EACzC,MAAM0gE,EAAO1gE,EAAO,KAAKvkB,EAAS3E,CAAI,EACtC,OAAO,MAAM,QAAQ4pF,GAAM,OAAO,EAAIA,EAAK,QAAU,CAAA,CACvD,MAAY,CACV,MAAO,CAAA,CACT,CACF,EAEM++B,GAAwB,CAACllF,EAAOwiF,KAAY,CAChD,MAAMthH,EAAU8/G,EAAA,EAChB,GAAI,CAAC9/G,EAAS,MAAO,CAAE,OAAQ,IAAI,IAAO,aAAc,CAAA,EACxD,MAAMkyE,EAAcpzC,IAAU,QAAUwiF,IAAS,WAAW,QAAQ,EAC9DnvC,EAAU,IAAM,CACpB,MAAM5zC,EAAUO,IAAU,UACtB,CAAC,CAAC,EACDozC,GAAepzC,IAAU,OACxB9+B,EAAQ,YACRA,EAAQ,YACd,GAAI,CAACu+B,GAAW,OAAOA,EAAQ,QAAW,SAAU,MAAO,CAAE,OAAQ,IAAI,IAAO,aAAc,CAAA,EAC9F,MAAMljC,GAAO62E,EAAcovC,GAAQ,MAAM,CAAe,EAAIA,GAC5D,IAAI/gH,GAAO,KACX,GAAI,CAIFA,IAHe2xE,EACXlyE,EAAQ,yBAAyB3E,EAAI,EACpCyjC,IAAU,OAAS9+B,EAAQ,yBAAyB3E,EAAI,EAAI2E,EAAQ,yBAAyB3E,EAAI,IACvF,MAAQ,IACzB,MAAgB,CAMdkF,GAAO,IACT,CACA,GAAI,CAACA,IAAQ,OAAOA,GAAK,QAAW,SAAU,MAAO,CAAE,OAAQ,IAAI,IAAO,aAAc,CAAA,EACxF,MAAM0jH,OAAa,IACnB,IAAIC,GAAe,EACnB,QAASliH,GAAI,EAAGA,GAAIu8B,EAAQ,OAAQv8B,IAAK,EAAG,CAC1C,MAAM6vE,GAAMtzC,EAAQv8B,EAAC,EACfkJ,GAAK,OAAO3K,GAAKsxE,EAAG,CAAC,EAC3B,GAAI,CAAC,OAAO,SAAS3mE,EAAE,EAAG,CACxBg5G,IAAgB,EAChB,QACF,CACAD,GAAO,IAAI/4G,IAAK+4G,GAAO,IAAI/4G,EAAE,GAAK,GAAK,CAAC,CAC1C,CACA,MAAO,CAAE,OAAA+4G,GAAQ,aAAAC,EAAA,CACnB,EACA,OAAI,OAAOlkH,EAAQ,kBAAqB,WAC/BA,EAAQ,iBAAiBmyE,CAAO,EAElCA,EAAA,CACT,EAEMgyC,GAAyB,CAACrlF,EAAOwiF,KAAY,CACjD,MAAM8C,EAAcL,GAA0BjlF,EAAOwiF,EAAO,EACtD,CAAE,OAAA2C,EAAQ,aAAAC,CAAA,EAAiBF,GAAsBllF,EAAOwiF,EAAO,EAC/DljG,EAAU,CAAA,EACV0iE,OAAW,IACjB,UAAWh6D,MAASs9F,EAAa,CAC/B,GAAI,CAACt9F,GAAO,SACZ,MAAM5b,GAAK,OAAO4b,GAAM,EAAE,EAC1B,GAAI,CAAC,OAAO,SAAS5b,EAAE,EAAG,SAC1B,MAAMm5G,GAAW,OAAOv9F,GAAM,OAAU,SAAWA,GAAM,MAAQ,KAC3Dw9F,GAAgBx9F,GAAM,OAAS,KAAO,OAAOA,GAAM,KAAK,EAAI,GAC5Ds4F,GAAcT,GAA2B0F,EAAQ,EACjD7lG,GAAQ6lG,IAAYA,GAAS,KAAA,EAC/BA,GACCjF,GAAc,OAAUkF,IAAiBA,GAAc,KAAA,EAASA,GAAgB,IAAIp5G,EAAE,GAC3FkT,EAAQ,KAAK,CAAE,GAAAlT,GAAI,MAAAsT,GAAO,MAAOylG,EAAO,IAAI/4G,EAAE,GAAK,EAAG,SAAAm5G,GAAU,YAAAjF,EAAA,CAAa,EAC7Et+B,GAAK,IAAI51E,EAAE,CACb,CACA,SAAW,CAACA,GAAI1K,EAAK,IAAKyjH,EAAO,UAC3BnjC,GAAK,IAAI51E,EAAE,GACfkT,EAAQ,KAAK,CAAE,GAAAlT,GAAI,MAAO,IAAIA,EAAE,GAAI,MAAA1K,GAAO,EAE7C,OAAA4d,EAAQ,aAAe8lG,EAChB9lG,CACT,EAEMmmG,GAA4B,CAAC,CAAE,YAAAC,EAAa,MAAAhkH,GAAO,aAAAo9G,KAAmB,CAC1E,MAAM35F,EAAWqpD,GAAgBk3C,CAAW,GAAKl3C,GAAgB,iBAAiB,EAClF,OAAKrpD,GAGa25F,GAAgB35F,EAAS,UAAY,OAAOA,EAAS,QAAW,WAE9EA,EAAS,OAAOzjB,EAAK,EACrBktE,GAAiBzpD,EAAUzjB,EAAK,GACtB,IAAI,CAACk9B,GAAO17B,KAAMi8G,GAAWvgF,EAAK,GAAKwgF,GAAel8G,EAAC,CAAC,EAN7D,MAAM,KAAK,CAAE,OAAQxB,EAAA,EAAS,CAACqrE,GAAG7pE,KAAMk8G,GAAel8G,EAAC,CAAC,CAOpE,EAEMyiH,EAAwBjkH,GAAU,CACtC,GAAI,CAAC,OAAO,SAASA,CAAK,GAAKA,GAAS,EAAG,MAAO,GAClD,MAAMkkH,GAAO,KAAK,MAAM,KAAK,KAAKlkH,CAAK,CAAC,EACxC,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,GAAIkkH,EAAI,CAAC,CACvC,EAEMC,GAAiB,CAACpkH,EAAM6C,GAAKoF,EAAK+1B,IAAY,CAGlD,GAFI,CAACh+B,GAAQ,OAAOA,EAAK,QAAW,UAAYA,EAAK,QAAU,GAC3D,CAAC,OAAO,SAAS6C,EAAG,GAAK,CAAC,OAAO,SAASoF,CAAG,GAAKA,GAAOpF,IACzD,CAACm7B,GAAW,OAAOA,EAAQ,QAAW,UAAYA,EAAQ,QAAU,EAAG,OAAO,KAClF,MAAMmmF,EAAOD,EAAqBlmF,EAAQ,MAAM,EAC1C0lF,EAAS,IAAI,MAAMS,CAAI,EAAE,KAAK,CAAC,EAC/Bv7B,GAAO3gF,EAAMpF,GACnB,IAAIwhH,GAAW,EACX9jC,GAAO,EACX,QAAS9+E,GAAI,EAAGA,GAAIu8B,EAAQ,OAAQv8B,IAAK,EAAG,CAC1C,MAAM6iH,GAAWtmF,EAAQv8B,EAAC,EACpB2uB,GAAI,OAAOpwB,EAAKskH,EAAQ,CAAC,EAC/B,GAAI,CAAC,OAAO,SAASl0F,EAAC,EAAG,SACzB,IAAIkhD,GAAM,KAAK,OAAQlhD,GAAIvtB,IAAO+lF,GAAQu7B,CAAI,EAC1C7yC,GAAM,IAAGA,GAAM,GACfA,IAAO6yC,IAAM7yC,GAAM6yC,EAAO,GAC9B,MAAMppH,GAAO2oH,EAAOpyC,EAAG,EAAI,EAC3BoyC,EAAOpyC,EAAG,EAAIv2E,GACVA,GAAOspH,KAAUA,GAAWtpH,IAChCwlF,IAAQ,CACV,CACA,MAAI,CAACA,IAAQ8jC,IAAY,EAAU,KAC5B,CAAE,OAAAX,EAAQ,SAAAW,EAAA,CACnB,EAEOE,EAAuB,CAAC,CAAE,IAAA1hH,EAAK,IAAAoF,GAAK,MAAA8gE,EAAO,MAAAxqC,EAAO,QAAAwiF,KAAc,CACpE,MAAMthH,EAAU8/G,EAAA,EAChB,GAAI,CAAC9/G,EAAS,OAAO,KACrB,MAAMkyE,GAAcpzC,IAAU,QAAUwiF,GAAS,WAAW,QAAQ,EAC9DyD,GAAUzD,IAAY,UAAYA,IAAY,eAC9CnvC,GAAU,IAAM,CACpB,MAAM5zC,GAAUO,IAAU,UACtB,CAAC,CAAC,EACDozC,IAAepzC,IAAU,OACxB9+B,EAAQ,YACRA,EAAQ,YACd,GAAI,CAACu+B,IAAW,OAAOA,GAAQ,QAAW,UAAYA,GAAQ,SAAW,EAAG,OAAO,KACnF,GAAIwmF,GACF,OAAOJ,GAAepmF,GAASn7B,EAAKoF,GAAK+1B,EAAO,EAElD,MAAMljC,GAAO62E,GAAcovC,EAAQ,MAAM,CAAe,EAAIA,EAM5D,GAAI,EALiBpvC,GAChBlyE,EAAQ,iBAAiB,MAAM3E,EAAI,GAAK,EAAQ2E,EAAQ,uBAAuB3E,EAAI,EACnFyjC,IAAU,OACR9+B,EAAQ,iBAAiB,MAAM3E,EAAI,GAAK,EAAQ2E,EAAQ,uBAAuB3E,EAAI,EACnF2E,EAAQ,iBAAiB,MAAM3E,EAAI,GAAK,EAAQ2E,EAAQ,uBAAuB3E,EAAI,GACvE,OAAO,KAI1B,MAAMkF,IAHS2xE,GACXlyE,EAAQ,yBAAyB3E,EAAI,EACpCyjC,IAAU,OAAS9+B,EAAQ,yBAAyB3E,EAAI,EAAI2E,EAAQ,yBAAyB3E,EAAI,IACjF,MAAQ,KAC7B,MAAI,CAACkF,IAAQ,OAAOA,GAAK,QAAW,UAAYA,GAAK,SAAW,EAAU,KACnEokH,GAAepkH,GAAM6C,EAAKoF,GAAK+1B,EAAO,CAC/C,EACK5jB,GAAO,OAAO3a,EAAQ,kBAAqB,WAC7CA,EAAQ,iBAAiBmyE,EAAO,EAChCA,GAAA,EACJ,GAAI,CAACx3D,GAAM,OAAO,KAClB,MAAMqqG,GAAY,SAAS,cAAc,KAAK,EAC9CA,GAAU,UAAY,8BAEtB,UAAWxkH,MAASma,GAAK,OAAQ,CAC/B,MAAM63E,GAAM,SAAS,cAAc,KAAK,EACxCA,GAAI,UAAY,kCAChBA,GAAI,MAAM,OAAS,GAAG,KAAK,IAAI,EAAG,KAAK,MAAOhyF,GAAQma,GAAK,SAAY,GAAG,CAAC,CAAC,IAC5EqqG,GAAU,YAAYxyB,EAAG,CAC3B,CAEA,MAAMyyB,GAAY,SAAS,cAAc,KAAK,EAC9CA,GAAU,UAAY,qCACtB,MAAMC,GAAY,SAAS,cAAc,KAAK,EAC9CA,GAAU,UAAY,qCACtBF,GAAU,YAAYC,EAAS,EAC/BD,GAAU,YAAYE,EAAS,EAE/B,MAAMC,GAAa,CAACj3C,GAAIC,KAAO,CAC7B,MAAMgb,GAAO3gF,GAAMpF,EACbgiH,GAAStsH,IAAU,CACvB,GAAIqwF,KAAS,EAAG,MAAO,GACvB,MAAMh6D,IAAOr2B,GAAQsK,GAAO+lF,GAC5B,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGh6D,EAAG,CAAC,CACrC,EACMk2F,GAAUla,IACd,QAAQA,EAAG,mFAEP0K,GAAQuP,GAAMl3C,EAAE,EAChB4nC,GAAQsP,GAAMj3C,EAAE,EACtB82C,GAAU,MAAM,KAAOI,GAAOxP,EAAK,EACnCqP,GAAU,MAAM,KAAOG,GAAOvP,EAAK,CACrC,EACA,OAAAqP,GAAW,OAAO77C,IAAQ,CAAC,GAAKlmE,CAAG,EAAG,OAAOkmE,IAAQ,CAAC,GAAK9gE,EAAG,CAAC,EAExD,CAAE,QAASw8G,GAAW,WAAAG,EAAA,CAC/B,EAEMG,EAAgB1zB,GAAY,CAChC,GAAI,CAACA,GAAW,OAAOA,GAAY,SAAU,OAAO,KACpD,MAAMx6C,GAAWw6C,EAAQ,MAAQ,OAAOA,EAAQ,MAAS,SAAWA,EAAQ,KAAO,KACnF,OAAIx6C,KACJw6C,EAAQ,KAAO,CAAA,EACRA,EAAQ,KACjB,EAEM2zB,GAAiB,CAAC3zB,EAAS50F,KAAY,CAC3C,MAAMwoH,EAASF,EAAa1zB,CAAO,EAC9B4zB,IACLA,EAAO,WAAa,EAAQxoH,GAC9B,EAEMyoH,GAAyB,CAAC7rH,EAAM+4B,KAAY,CAChD,GAAI/4B,IAAS,OAAQ,CACnB,GAAI+4B,KAAY,OAAQ,MAAO,CAAC,EAAG,EAAE,EACrC,GAAIA,KAAY,UAAW,MAAO,CAAC,EAAG,EAAE,CAC1C,CACA,GAAI/4B,IAAS,OAAQ,CACnB,GAAI+4B,KAAY,QAAS,MAAO,CAAC,GAAK,CAAC,EACvC,GAAIA,KAAY,UAAW,MAAO,CAAC,EAAG,CAAC,CACzC,CACA,MAAO,CAAC,EAAG,CAAC,CACd,EAEM+yF,GAAsB5sH,GAC1B,MAAM,QAAQA,CAAK,GACnBA,EAAM,SAAW,GACjBA,EAAM,MAAOguB,IAAU,OAAO,SAAS,OAAOA,EAAK,CAAC,CAAC,EAEjD6+F,GAAsB,CAACviH,EAAKoF,GAAKo9G,EAAY,KAAU,CAC3D,GAAIA,EAAW,MAAO,GACtB,MAAMz8B,EAAO,KAAK,IAAI,OAAO3gF,EAAG,EAAI,OAAOpF,CAAG,CAAC,EAC/C,GAAI,CAAC,OAAO,SAAS+lF,CAAI,GAAKA,GAAQ,EAAG,MAAO,KAChD,MAAM08B,EAAY,KAAK,MAAM,KAAK,MAAM18B,CAAI,CAAC,EACvCxhC,EAAO,KAAK,IAAI,GAAIk+D,EAAY,CAAC,EACvC,OAAO,KAAK,IAAIl+D,EAAM,IAAI,CAC5B,EAEMm+D,GAAyBx1C,GAAkBA,IAAkB,cAAgBA,IAAkB,WAE/Fy1C,EAAwBjtH,GACxBA,IAAU,QAAgB,QAC1BA,IAAU,cAAgBA,IAAU,WAAmB,aACpD,GAAGA,EAAM,MAAM,EAAG,CAAC,EAAE,YAAA,CAAa,GAAGA,EAAM,MAAM,CAAC,CAAC,GAGtDktH,GAAyBz9G,GACzBA,GAAS,OAAOA,GAAU,SACrB,CAAE,IAAKA,EAAM,MAAQ,GAAO,IAAKA,EAAM,MAAQ,EAAA,EAEpDA,IAAU,GAAc,CAAE,IAAK,GAAO,IAAK,EAAA,EACxC,CAAE,IAAK,GAAM,IAAK,EAAA,EAGrB6oE,GAAyB,CAACvD,EAAQ61C,KAAW,CACjD,GAAI,CAAC,MAAM,QAAQ71C,CAAM,GAAKA,EAAO,SAAW,EAAG,CACjD,MAAMzqE,EAAMsgH,IAAQ,KAAO,GACrBl7G,EAAMk7G,IAAQ,KAAO,EACrBjyC,EAAS,KAAK,IAAI,KAAK,IAAIruE,CAAG,EAAG,KAAK,IAAIoF,CAAG,EAAG,CAAC,EACvD,MAAO,CAAC,CAACipE,EAAQA,CAAM,CACzB,CACA,MAAMA,EAAS,KAAK,IAAI,KAAK,IAAI5D,EAAO,CAAC,CAAC,EAAG,KAAK,IAAIA,EAAO,CAAC,CAAC,CAAC,EAChE,MAAI,CAAC,OAAO,SAAS4D,CAAM,GAAKA,IAAW,EAAU,CAAC,GAAI,CAAC,EACpD,CAAC,CAACA,EAAQA,CAAM,CACzB,EAEMw0C,GAAmC,CAAC3qH,EAAMC,KAAS,CACvD,MAAM2qH,EAAU,KAAK,IAAI3qH,KAAO,CAAC,GAAKA,KAAO,CAAC,GAAK,CAAC,EAC9C4qH,EAAQ,KAAK,IAAI7qH,IAAO,CAAC,GAAK,CAAC,EAC/B8qH,EAAQ,KAAK,IAAI9qH,IAAO,CAAC,GAAK,CAAC,EAC/B+qH,EAAY,KAAK,IAAIF,EAAQD,CAAO,EAAI,KACxCI,GAAY,KAAK,IAAIF,EAAQF,CAAO,EAAI,KACxCz0C,GAAS40C,GAAa,CAACC,GACzBH,EACCG,IAAa,CAACD,EAAYD,EAAQ,KAAK,IAAID,EAAOC,CAAK,EAC5D,MAAI,CAAC,OAAO,SAAS30C,EAAM,GAAKA,KAAW,EAAU,CAAC,GAAI,CAAC,EACpD,CAAC,CAACA,GAAQA,EAAM,CACzB,EAEM80C,GAAoB,CAAC3sH,EAAM+4B,KAAY,CAC3C,GAAIktF,GAAiB,iBACnB,OAAOA,EAAgB,iBAAiBjmH,EAAM+4B,EAAO,EAGvD,MAAMq/C,EADamxC,EAAkBvpH,CAAI,GACd,eAAiB,KAC5C,MAAI,CAACo4E,GAAU,OAAOA,EAAO,YAAe,WAAmB,KACxD6qC,GAA0B7qC,EAAO,WAAWr/C,EAAO,CAAC,CAC7D,EAEM6zF,GAAc,CAAC5sH,EAAM+4B,GAASp2B,IAAW,CAC7C,GAAIsjH,GAAiB,iBACnB,OAAOA,EAAgB,iBAAiBjmH,EAAM+4B,GAASp2B,CAAM,EAE/D,MAAMgvF,EAAa43B,EAAkBvpH,CAAI,EACnCo4E,EAASuZ,GAAY,eAAiB,KAC5C,MAAI,CAACA,GAAc,CAACvZ,GAAU,OAAOA,EAAO,YAAe,WAAmB,IAC9EA,EAAO,WAAWr/C,GAASp2B,CAAM,EACjCgvF,EAAW,QAAA,EACJ,GACT,EAEMk7B,GAAiB7sH,GAAS,CAC9B,MAAM6Z,GAAO,SAAS,cAAc,KAAK,EAEnCjP,EAAQ,CACZ,QAAU5K,IAAS,OAAUF,EAAQ,oBAAsB,QAAYA,EAAQ,oBAAsB,QACrG,QAAS,KACT,MAAO,EAAA,EAGLgtH,EAAyB,CAAC,CAAE,MAAAxlB,EAAO,OAAAj+C,GAAQ,QAAAsmD,MAAc,CAC7D,MAAMod,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,MAAM,QAAU,OACrBA,GAAK,MAAM,IAAM,MACjBA,GAAK,MAAM,MAAQ,OAEnB,MAAMC,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,MAAM,OAAS,IACvBA,EAAQ,MAAM,UAAY,yEAC1BA,EAAQ,MAAM,OAAS,YACvBD,GAAK,YAAYC,CAAO,EAExB,MAAM/gB,GAAS,SAAS,cAAc,KAAK,EAC3CA,GAAO,MAAM,QAAU,OACvBA,GAAO,MAAM,WAAa,SAC1BA,GAAO,MAAM,eAAiB,gBAC9BA,GAAO,MAAM,IAAM,MACnBA,GAAO,MAAM,SAAW,OAExB,MAAMmB,GAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,GAAQ,YAAc9F,GAAS,GAC/B8F,GAAQ,MAAM,WAAa,MAC3BA,GAAQ,MAAM,SAAW,OACzBA,GAAQ,MAAM,MAAQ,yBACtBA,GAAQ,MAAM,cAAgB,QAC9BA,GAAQ,MAAM,cAAgB,YAC1BuC,IAASyW,EAAS,gBAAgBhZ,GAASuC,EAAO,EACtD1D,GAAO,YAAYmB,EAAO,EACtB/jD,KACFA,GAAO,MAAM,WAAa,OAC1B4iD,GAAO,YAAY5iD,EAAM,GAE3B0jE,GAAK,YAAY9gB,EAAM,EAChB,CAAE,KAAA8gB,GAAM,OAAA9gB,GAAQ,QAAAmB,EAAA,CACzB,EAEQhkC,EAAWppE,IAAS,OAASs/E,EAAeJ,EAC7C9V,EAAS,SAASx+D,EAAM,OAAO,IAAGA,EAAM,QAAUw+D,EAAS,CAAC,GAEjE,MAAM6jD,EAAa,SAAS,cAAc,KAAK,EAC/CpzG,GAAK,YAAYozG,CAAU,EAE3B,MAAMC,GAAW,SAAS,cAAc,KAAK,EAC7CA,GAAS,MAAM,QAAU,OACzBA,GAAS,MAAM,eAAiB,WAChCA,GAAS,MAAM,IAAM,MACrBA,GAAS,MAAM,UAAY,OAE3B,MAAMC,GAAe,SAAS,cAAc,QAAQ,EACpDA,GAAa,KAAO,SACpBA,GAAa,UAAY,mBACzBA,GAAa,YAAc,SAE3B,MAAMC,GAAc,SAAS,cAAc,QAAQ,EACnDA,GAAY,KAAO,SACnBA,GAAY,UAAY,mBACxBA,GAAY,YAAc,QAE1BF,GAAS,YAAYC,EAAY,EACjCD,GAAS,YAAYE,EAAW,EAChCvzG,GAAK,YAAYqzG,EAAQ,EAEzB,MAAMG,GAAkB,IAAM,CAC5B,GAAI,CAACziH,EAAM,QAAS,MAAO,GAC3B,MAAM+mF,EAAa43B,EAAkBvpH,CAAI,EACnCo4E,GAASuZ,GAAY,eAAiB,KAC5C,GAAI,CAACA,GAAc,CAACvZ,IAAU,OAAOA,GAAO,YAAe,WAAY,MAAO,GAE9E,MAAMk1C,GAAU1iH,EAAM,QAAQ,MAAQA,EAAM,QAAQ,MAAQ,KACtD2T,GAAOyoG,EAA2Bp8G,EAAM,OAAO,EAAK0iH,IAAW,cAAiB,SAEtF,GAAIttH,IAAS,QAAU4K,EAAM,UAAY,YAAc2T,KAAS,SAAU,CACxE,MAAM5T,EAAYF,GAAQ,WAAa,KACvC,MAAI,CAACE,GAAa,OAAOA,EAAU,kBAAqB,WAAmB,GACpE,EAAQA,EAAU,MAC3B,CAEA,GAAI4T,KAAS,cACX,OAAO,OAAO3T,EAAM,QAAQ,YAAe,UAAYA,EAAM,QAAQ,WAAW,OAAS,EAG3F,GAAI2T,KAAS,gBACX,OAAO,OAAO3T,EAAM,QAAQ,eAAkB,UAAYA,EAAM,QAAQ,cAAc,OAAS,EAGjG,GAAI2T,KAAS,WAAY,CACvB,MAAMwY,EAAInsB,EAAM,QAAQ,MAClB2iH,GAAc,MAAM,QAAQx2F,CAAC,GAAK,YAAY,OAAOA,CAAC,EAC5D,GAAI/2B,IAAS,QAAU4K,EAAM,UAAY,WACvC,OAAO2iH,IAAex2F,EAAE,SAAW,GAAK,MAAM,KAAKA,CAAC,EAAE,MAAOlvB,IAAM,OAAO,SAASA,EAAC,CAAC,EAEvF,GAAI0lH,GAAa,OAAOx2F,EAAE,SAAW,GAAKA,EAAE,SAAW,EACvD,GAAIA,GAAK,OAAOA,GAAM,SAAU,CAC9B,GAAI/2B,IAAS,OAAQ,CACnB,GAAI4K,EAAM,UAAY,QAAS,CAC7B,MAAM8G,GAAMqlB,EAAE,QAAUA,EAAE,OAAS,KAC7BplB,GAAMolB,EAAE,QAAUA,EAAE,KAAO,KAEjC,OADIrlB,IAAO,MAAQ,CAAC0yG,GAAiB,OAAO1yG,EAAG,CAAC,GAC5CC,IAAO,MAAQ,CAACyyG,GAAiB,OAAOzyG,EAAG,CAAC,EAAU,GACnDD,IAAO,MAAQC,IAAO,IAC/B,CACA,GAAI/G,EAAM,UAAY,SAAWA,EAAM,UAAY,UAAW,CAC5D,MAAM8G,GAAM,OAAOqlB,EAAE,QAAUA,EAAE,KAAK,EAChCplB,GAAM,OAAOolB,EAAE,QAAUA,EAAE,GAAG,EAC9By2F,GAAQ,OAAO,SAAS97G,EAAG,EAC3B+7G,GAAQ,OAAO,SAAS97G,EAAG,EACjC,OAAO67G,IAASC,EAClB,CACF,CACA,MAAO,EACT,CACA,OAAI,OAAO12F,GAAM,SAAiB,OAAO,SAASA,CAAC,EAC/C,OAAOA,GAAM,SAAiBqtF,GAAiBrtF,CAAC,EAC7C,EACT,CAEA,GAAIxY,KAAS,SAAU,CACrB,GAAI,EAAE,OAAO3T,EAAM,QAAQ,YAAe,UAAYA,EAAM,QAAQ,WAAW,OAAS,GAAI,MAAO,GACnG,MAAMqpE,EAASrpE,EAAM,QAAQ,OACvB8kE,GAAQ9kE,EAAM,QAAQ,MACtB8iH,GAAW,MAAM,QAAQz5C,CAAM,GAAKA,EAAO,SAAW,GAAKA,EAAO,MAAOpsE,IAAM,OAAO,SAASA,EAAC,CAAC,EACjG8lH,GAAU,MAAM,QAAQj+C,EAAK,GAAKA,GAAM,SAAW,GAAKA,GAAM,MAAO7nE,IAAM,OAAO,SAASA,EAAC,CAAC,EACnG,OAAO6lH,IAAYC,EACrB,CAEA,GAAIpvG,KAAS,WAEX,MADI,IAAE,OAAO3T,EAAM,QAAQ,YAAe,UAAYA,EAAM,QAAQ,WAAW,OAAS,IACpF,EAAE,OAAOA,EAAM,QAAQ,UAAa,UAAYA,EAAM,QAAQ,SAAS,OAAS,IAItF,GAAI2T,KAAS,cAAe,CAC1B,GAAI,EAAE,OAAO3T,EAAM,QAAQ,YAAe,UAAYA,EAAM,QAAQ,WAAW,OAAS,GAAI,MAAO,GACnG,MAAMsqE,EAAOuyC,EAAiBznH,EAAM4K,EAAM,QAAQ,UAAU,EAC5D,GAAIsqE,GAAQ4wC,GAAsB5wC,EAAK,IAAI,EAAG,MAAO,GACrD,MAAMjB,GAASrpE,EAAM,QAAQ,OACvB8kE,GAAQ9kE,EAAM,QAAQ,MAE5B,MADI,CAAC,MAAM,QAAQqpE,EAAM,GAAK,CAAC,MAAM,QAAQvE,EAAK,GAC9CuE,GAAO,SAAW,GAAKA,GAAO,SAAWvE,GAAM,OAAe,GAC3C9kE,EAAM,UAAY,SAAWA,EAAM,UAAY,eAElE8kE,GAAM,MAAOxwE,IAAU,OAAOA,IAAU,UAAYklH,GAAiBllH,EAAK,CAAC,EAC3EwwE,GAAM,MAAOxwE,IAAU,OAAO,SAAS,OAAOA,EAAK,CAAC,CAAC,CAC3D,CAEA,MACS,EAIX,EAEM0uH,GAAmB,IAAM,CAC7BR,GAAY,SAAW,CAACC,GAAA,CAC1B,EAEMQ,GAAYC,GAAU,CAC1BljH,EAAM,MAAQ,EAAQkjH,EACtBF,GAAA,CACF,EAEMG,GAAuBh1F,GAAY,CACvC,GAAI/4B,IAAS,QAAU+4B,IAAY,iBAAmB,CAAC,SAAU,WAAY,aAAa,EAC1F,MAAMswF,GAAUtwF,IAAY,SAAWA,IAAY,eAC7CuwF,GACJvwF,IAAY,QACZA,IAAY,WACZA,IAAY,SACZA,IAAY,UACd,OAAI/4B,IAAS,QAAUqpH,GAAgB,CAAC,WAAY,cAAe,gBAAiB,cAAe,UAAU,EACzGrpH,IAAS,QAAUspH,GAAiB,CAAC,WAAY,cAAe,gBAAiB,cAAe,QAAQ,EACxGD,GAAgB,CAAC,WAAY,cAAe,cAAe,UAAU,EACrEC,GAAiB,CAAC,WAAY,cAAe,cAAe,QAAQ,EACjE,CAAC,aAAa,CACvB,EAEM0E,OAAoB,IACpBC,GAAmBC,GAAY,CAC9BA,GACLF,GAAc,IAAIE,CAAO,CAC3B,EACOC,GAAkB,IAAM,CAC5B,UAAWD,KAAWF,GACpB,GAAI,CACFE,EAAQ,UAAA,CACV,OAASnqH,GAAO,CACd,QAAQ,KAAK,mDAAoDA,EAAK,CACxE,CAEFiqH,GAAc,MAAA,CAChB,EAEMI,GAAwBr3C,GAAW,CAEvC,GADIA,GAAU,MACV,OAAOA,GAAW,SAAU,OAAOA,EACvC,GAAI,MAAM,QAAQA,CAAM,GAAK,YAAY,OAAOA,CAAM,EAAG,OAAOA,EAAO,CAAC,EACxE,GAAI,OAAOA,GAAW,SAAU,CAC9B,MAAMtpE,GAAO,OAAO,KAAKspE,CAAM,EAC/B,GAAItpE,GAAK,OAAQ,OAAOspE,EAAOtpE,GAAK,CAAC,CAAC,CACxC,CACA,OAAOspE,CACT,EAEMs3C,GAAsBn0E,GAAS,CACnC,MAAMo0E,GAAKp0E,GAAM,IAAM,KACjBq0E,GAASr0E,GAAM,IACfs0E,GAAMD,IAAU,KAAO,OAAOA,EAAM,EAAI,OAC9C,OAAQx3C,GAAW,CACjB,MAAM03C,GAAOL,GAAqBr3C,CAAM,EACxC,GAAIu3C,KAAO,UAAW,OAAOG,IAAQ,KACrC,GAAIH,KAAO,MAAO,OAAOG,IAAQ,MAAQ,OAAO,MAAM,OAAOA,EAAI,CAAC,EAClE,MAAM13F,GAAI,OAAO03F,EAAI,EACrB,OAAK,OAAO,SAAS13F,EAAC,EAClBu3F,KAAO,KAAaE,IAAO,MAAQz3F,KAAMy3F,GACzCF,KAAO,KAAaE,IAAO,MAAQz3F,GAAIy3F,GACvCF,KAAO,MAAcE,IAAO,MAAQz3F,IAAKy3F,GACzCF,KAAO,KAAaE,IAAO,MAAQz3F,GAAIy3F,GACvCF,KAAO,MAAcE,IAAO,MAAQz3F,IAAKy3F,GACtC,GANyB,EAOlC,CACF,EAEME,GAAqB12B,GACpBA,EACA,MAAM,QAAQA,EAAQ,KAAK,EAGzBA,EAFE,CAAE,GAAGA,EAAS,MAAO,EAAC,EAFV,CAAE,MAAO,CAAA,CAAC,EAO3B22B,GAAqB9pC,GAAS,CAClC,MAAMsrB,GAAK,SAAS,cAAc,KAAK,EACvC,OAAAA,GAAG,UAAY,yBACfA,GAAG,YAActrB,EACVsrB,EACT,EAEOye,GAAwB,CAAC,CAAE,MAAAhqG,EAAO,MAAA1lB,GAAO,SAAAy8E,GAAU,eAAAkzC,GAAiB,GAAO,QAAA/Y,EAAU,MAAW,CACrG,MAAM1zD,GAAM,SAAS,cAAc,KAAK,EACxCA,GAAI,MAAM,QAAU,OACnBA,GAAI,MAAM,IAAM,MACjBA,GAAI,MAAM,WAAa,SACvBA,GAAI,MAAM,MAAQ,OAWlB,MAAM0sE,GAAa,SAAS,cAAc,KAAK,EAC/CA,GAAW,UAAY,yBAEvB,MAAMp3B,GAAS,SAAS,cAAc,KAAK,EAC3CA,GAAO,UAAY,iCAEnB,MAAMq3B,GAAa,SAAS,cAAc,OAAO,EACjDA,GAAW,KAAO,QAClBA,GAAW,UAAY,gCACvBA,GAAW,aAAa,aAAyC,OAAO,EAExE,MAAMC,GAAa,SAAS,cAAc,OAAO,EACjDA,GAAW,KAAO,SAClBA,GAAW,UAAY,mBACvBA,GAAW,IAAM,IACjBA,GAAW,IAAM,IACjBA,GAAW,KAAO,OACjBA,GAAW,MAAM,SAAWlZ,EAAU,OAAS,OAChDkZ,GAAW,MAAQ,QAEnB,MAAMC,GAAa,SAAS,cAAc,MAAM,EAChDA,GAAW,YAAc,QACzBA,GAAW,MAAM,MAAQ,yBACzBA,GAAW,MAAM,QAAUJ,GAAiB,GAAK,OAEjD,MAAMK,GAAW,OAAOhwH,IAAU,SAAWA,GAAQ,UAC/Cq2B,GAAM25F,GAAS,WAAW,GAAG,EAAIA,GAAS,MAAM,CAAC,EAAIA,GACrDC,GAAU55F,GAAI,QAAU,EAAI,IAAIA,GAAI,MAAM,EAAG,CAAC,CAAC,GAAK,UACpD65F,GAAW75F,GAAI,SAAW,EAAIA,GAAI,MAAM,EAAG,CAAC,EAAI,KAChDlsB,GAAQ,KAAK,MAAM,SAAS+lH,GAAU,EAAE,EAAI,IAAM,GAAG,EAAI,IAE/DL,GAAW,MAAQI,GACnBH,GAAW,MAAQ,OAAO,OAAO,SAAS3lH,EAAK,EAAIA,GAAQ,CAAC,EAC5DquF,GAAO,MAAM,WAAaq3B,GAAW,MAErC,MAAMtS,GAAS,IAAM,CACnB,MAAM1iG,GAAIyoG,GAAYwM,GAAW,MAAO,CAAE,IAAK,EAAG,IAAK,EAAG,EACtDj1G,IAAK,OACT4hE,GAASinC,GAAOmM,GAAW,MAAOh1G,EAAC,CAAC,EACpC8zG,GAAS,EAAI,EACbn2B,GAAO,MAAM,WAAaq3B,GAAW,MACvC,EACA,OAAAA,GAAW,iBAAiB,QAAStS,EAAM,EAC3CuS,GAAW,iBAAiB,SAAUvS,EAAM,EAE5CqS,GAAW,YAAYp3B,EAAM,EAC7Bo3B,GAAW,YAAYC,EAAU,EACjC3sE,GAAI,YAAY0sE,EAAU,EACtBD,IAAgBzsE,GAAI,YAAY6sE,EAAU,EAC9C7sE,GAAI,YAAY4sE,EAAU,EACnB5sE,EACT,EAEMitE,GAAe,IAAM,CACzBlB,GAAA,EACAlB,EAAW,YAAc,GAC1B,MAAMqC,EAAO3C,GAAkB3sH,EAAM4K,EAAM,OAAO,EAElD,GAAI,CAACA,EAAM,QACT,GAAI5K,IAAS,QAAU4K,EAAM,UAAY,WAAY,CACnD,MAAMD,GAAYF,GAAQ,WAAa,KACjC8kH,GAAY,EAAQ5kH,IAAW,OAC/B6kH,GAAc,OAAO7kH,IAAW,gBAAmB,WACrDA,GAAU,eAAA,EACTA,IAAW,gBAAkB,GAAQ,UAAY,UAChD8kH,GAAgBF,IAAaC,KAAgB,UACnD5kH,EAAM,QAAU6kH,GAAgB,CAAE,KAAM7kH,EAAM,QAAS,KAAM,QAAA,EAAcq4G,GAA0BqM,CAAI,GAAK,CAAE,KAAM1kH,EAAM,OAAA,CAC9H,MACEA,EAAM,QAAUq4G,GAA0BqM,CAAI,GAAK,CAAE,KAAM1kH,EAAM,OAAA,EAIrE,MAAM8kH,GAAsB3B,GAAoBnjH,EAAM,OAAO,EACvD64B,GAAUqlF,EAAkB9oH,EAAM4K,EAAM,OAAO,EAClD,OAAQnI,IAAWwmH,EAA6BjpH,EAAM4K,EAAM,QAASnI,GAAQitH,EAAmB,EAAE,OAAS,CAAC,EACzGC,GAAyB5G,EAAsBn+G,EAAM,OAAO,GAAKm+G,EAAsBuG,CAAI,EACjG,IAAIM,EAAiBnsF,GAAQ,SAASksF,EAAsB,EACxDA,GACCA,IAA0BpH,EAC1B9kF,GAAQ,SAASmsF,CAAc,GAAGnsF,GAAQ,KAAKmsF,CAAc,EAElE,MAAMC,GAAe,SAAS,cAAc,QAAQ,EACpDA,GAAa,UAAY,mBACzBlH,EAA2BkH,GAAcpsF,EAAO,EAChDosF,GAAa,MAAQD,EAErB,IAAIxG,GAAeH,EAA6BjpH,EAAM4K,EAAM,QAASglH,EAAgBF,EAAmB,EACxG,MAAMI,GAAgBjJ,EAAmB7mH,EAAM4K,EAAM,OAAO,EA2BtDmlH,IAzBwB,IAAM,CAClC,MAAMC,GAAcplH,EAAM,SAAS,MAAQA,EAAM,SAAS,MAAQ,KAElE,GAAIolH,KAAgB,UAAY5G,GAAa,SAAS,QAAQ,EAAG,MAAO,SAExE,GAAI4G,KAAgB,cAAgB5G,GAAa,SAAS,eAAe,EAAG,MAAO,gBAEnF,GAAIx+G,EAAM,SAAWo8G,EAA2Bp8G,EAAM,OAAO,GAAKw+G,GAAa,SAAS4G,EAAW,EACjG,OAAOA,GAGT,MAAM/jE,GAAYrhD,EAAM,SAAW0kH,EACnC,GAAIrjE,IAAa,CAAC+6D,EAA2B/6D,EAAS,EAAG,CACvD,MAAM36C,GAAK61G,EAAqBnnH,EAAM4K,EAAM,QAASqhD,EAAS,EAC9D,GAAI36C,GAAI,MAAO,UAAUA,EAAE,EAC7B,CAEA,GAAIg+G,GAAQ,CAACtI,EAA2BsI,CAAI,EAAG,CAC7C,MAAMh+G,GAAK61G,EAAqBnnH,EAAM4K,EAAM,QAAS0kH,CAAI,EACzD,GAAIh+G,GAAI,MAAO,UAAUA,EAAE,EAC7B,CAEA,OAAO63G,EAAyBnpH,EAAM4K,EAAM,QAASglH,EAAgBxG,EAAY,GAAKA,GAAa,CAAC,CACtG,GAEmB,EAEb6G,GAAa,SAAS,cAAc,QAAQ,EAGlD,GAFAA,GAAW,UAAY,mBAEnB,CAAC7G,GAAa,QAAU,CAAC0G,GAAc,KAAM,CAC/C,MAAMjH,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQ,GACZA,GAAI,YAAc,uBAClBoH,GAAW,YAAYpH,EAAG,EAC1BoH,GAAW,SAAW,EACxB,CAEA,UAAWz8F,MAAK41F,GAAc,CAC5B,MAAMP,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQr1F,GACZq1F,GAAI,YAActC,EAAmB/yF,EAAC,GAAKA,GAC3Cy8F,GAAW,YAAYpH,EAAG,CAC5B,CAEA,UAAWlpH,MAAUmwH,GAAc,SAAU,CAC3C,MAAMjH,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQ,UAAUlpH,GAAO,EAAE,GAC/B,MAAMilB,GAAQ,OAAOjlB,GAAO,OAAU,SAAWA,GAAO,MAAM,OAAS,GACvEkpH,GAAI,YAAcjkG,IAASA,GAAM,YAAA,IAAkB,SAAW,WAAWA,EAAK,GAAK,SACnFqrG,GAAW,YAAYpH,EAAG,CAC5B,CAEA,MAAMqH,GAAgB,CACpB,GAAG9G,GACH,GAAG,MAAM,KAAK0G,GAAc,KAAA,CAAM,EAAE,IAAKx+G,IAAO,UAAUA,EAAE,EAAE,CAAA,EAEhE2+G,GAAW,MAAQC,GAAc,SAASH,EAAU,EAAIA,GAAcG,GAAc,CAAC,GAAK,GAE1F,MAAMC,GAAsB,CAACC,GAAU3tH,GAASmtH,IAAmB,CACjE,MAAMjuH,GAAOiJ,EAAM,SAAW,CAAA,EACxBylH,GAAatH,EAAsBpnH,EAAI,EACvC2uH,GAAgB,GAAQ7tH,IAAU4tH,IAAc5tH,KAAW4tH,IAC3D1nH,GAAOynH,KAAa,SACtB,CAAE,KAAMxlH,EAAM,QAAS,KAAMwlH,IAC7B,CACA,KAAMxlH,EAAM,QACZ,KAAMwlH,GACN,aAAczuH,GAAK,cAAgB2tH,GAAM,YAAA,EAc7C,GAZI7sH,IAAUA,KAAW8lH,GAAmB9lH,KAAW+lH,EACrD7/G,GAAK,WAAalG,GAElBkG,GAAK,WAAahH,GAAK,YAAc2tH,GAAM,YAAcA,GAAM,KAE7Dc,KAAa,aACfznH,GAAK,MAAQhH,GAAK,OAAS2tH,GAAM,MAC7B3mH,GAAK,OAAS,OAASiC,EAAM,UAAY,WAAaA,EAAM,UAAY,WAC1EjC,GAAK,MAAQ,GAEf,OAAOA,GAAK,YAEVynH,KAAa,gBAAiB,CAChC,MAAMG,GAAsBvH,EAAwBvmH,EAAM,EAG1D,GAFAkG,GAAK,cAAgB4nH,IAAuB5uH,GAAK,eAAiB2tH,GAAM,eAAiB,GACzF3mH,GAAK,UAAYhH,GAAK,WAAa2tH,GAAM,WAAa,OAClD,CAAC3mH,GAAK,cAAe,CACvB,MAAMq/G,GAAiBp9G,EAAM,UAAY,SAAWA,EAAM,UAAY,eACtEjC,GAAK,cAAgBq/G,GAAiB,QAAU,MAClD,CACAr/G,GAAK,WAAa,CAAC,SAASA,GAAK,aAAa,EAAE,CAClD,CACA,GAAIynH,KAAa,SAAU,CACzB,MAAM1lG,GAAO,OAAO/hB,GAAK,YAAe,SAAWA,GAAK,WAAa,KAC/D6nH,GAAa,CAACF,IAAiBxE,GAAmBnqH,GAAK,MAAM,EAAIA,GAAK,OAAS,KAC/E8uH,GAAa,CAACH,IAAiBxE,GAAmBwD,GAAM,MAAM,EAAIA,EAAK,OAAS,KAChFoB,GAAY,CAACJ,IAAiBxE,GAAmBnqH,GAAK,KAAK,EAAIA,GAAK,MAAQ,KAC5EgvH,EAAY,CAACL,IAAiBxE,GAAmBwD,GAAM,KAAK,EAAIA,EAAK,MAAQ,KACnF3mH,GAAK,cAAgBhH,GAAK,eAAiB2tH,GAAM,eAAiB,SAClE3mH,GAAK,eAAiBhH,GAAK,gBAAkB2tH,GAAM,gBAAkB,EACrE,MAAMsB,GAAY,GAAQJ,IAAcC,IACxC9nH,GAAK,OAAS6nH,IAAcC,IAAc5G,EAA0B7pH,EAAM0qB,EAAI,EAC9E,MAAM2nF,GAAYwZ,GAAuB7rH,EAAM4K,EAAM,OAAO,EAC5DjC,GAAK,MAAQ+nH,IAAaC,GAAate,GACvCsZ,GAAehjH,GAAM,CAACioH,EAAS,CACjC,CACA,GAAIR,KAAa,WAAY,CAC3BznH,GAAK,SAAWhH,GAAK,UAAY2tH,GAAM,UAAY,qBACnD,MAAM5kG,GAAO,OAAO/hB,GAAK,YAAe,SAAWA,GAAK,WAAa,KAC/D6nH,GAAa,CAACF,IAAiBxE,GAAmBnqH,GAAK,MAAM,EAAIA,GAAK,OAAS,KAC/E8uH,GAAa,CAACH,IAAiBxE,GAAmBwD,GAAM,MAAM,EAAIA,EAAK,OAAS,KACtF3mH,GAAK,cAAgBhH,GAAK,eAAiB2tH,GAAM,eAAiB,SAClE3mH,GAAK,eAAiBhH,GAAK,gBAAkB2tH,GAAM,gBAAkB,EACrE,MAAMsB,GAAY,GAAQJ,IAAcC,IACxC9nH,GAAK,OAAS6nH,IAAcC,IAAc5G,EAA0B7pH,EAAM0qB,EAAI,EAC9E/hB,GAAK,MAAQhH,GAAK,OAAS2tH,GAAM,OAAS,EAC1C3mH,GAAK,MAAQhH,GAAK,OAAS2tH,GAAM,OAAS,GAC1C3D,GAAehjH,GAAM,CAACioH,EAAS,CACjC,CACA,GAAIR,KAAa,cAAe,CAC9BznH,GAAK,WAAa,OAAOA,GAAK,YAAe,SACzCA,GAAK,WACJ,OAAOhH,GAAK,YAAe,SAAWA,GAAK,WAAc,OAAO2tH,GAAM,YAAe,SAAWA,EAAK,WAAa,GACvH3mH,GAAK,OAAS,CAAC2nH,IAAiB,MAAM,QAAQ3uH,GAAK,MAAM,EACrDA,GAAK,OACJ,CAAC2uH,IAAiB,MAAM,QAAQhB,GAAM,MAAM,EAAIA,EAAK,OAAS,CAAA,EACnE3mH,GAAK,MAAQ,CAAC2nH,IAAiB,MAAM,QAAQ3uH,GAAK,KAAK,EACnDA,GAAK,MACJ,CAAC2uH,IAAiB,MAAM,QAAQhB,GAAM,KAAK,EAAIA,EAAK,MAAQ,CAAA,EACjE3mH,GAAK,aAAehH,GAAK,cAAgB2tH,GAAM,cAAgB,YAC/D,MAAMvoF,GAAO,CAAE,GAAIplC,GAAK,MAAQ,OAAOA,GAAK,MAAS,SAAWA,GAAK,KAAO,KAAO,GAAI2tH,GAAM,MAAQ,OAAOA,EAAK,MAAS,SAAWA,EAAK,KAAO,IAAA,EAC3IuB,GAAW9pF,IAAQ,OAAOA,IAAS,SAAW,CAAE,GAAGA,EAAA,EAAS,CAAA,EAC5D+pF,GAAcD,GAAS,aAAe,OAAOA,GAAS,aAAgB,SACxE,CAAE,GAAGA,GAAS,WAAA,EACd,CAAA,EACCC,GAAY,YAAWA,GAAY,UAAY,aAChDA,GAAY,eAAiB,OAAMA,GAAY,cAAgB,MAC9DA,GAAY,UAASA,GAAY,QAAUpK,GAC5CoK,GAAY,cAAgB,OAAMA,GAAY,aAAe,IACjED,GAAS,YAAcC,GACvBnoH,GAAK,KAAOkoH,EACd,CACA,OAAOloH,EACT,EAEMooH,GAAiB,CAACX,GAAU3tH,GAASmtH,IAAmB,CAC5DhlH,EAAM,QAAUulH,GAAoBC,GAAU3tH,EAAM,EACpDorH,GAAS,EAAI,EACbwB,GAAA,CACF,EAEAQ,GAAa,iBAAiB,SAAU,IAAM,CAC5CD,EAAiBC,GAAa,MAC9BtI,EAA4BvnH,EAAM4K,EAAM,OAAO,EAC/C,MAAMomH,GAAc/H,EAA6BjpH,EAAM4K,EAAM,QAASglH,EAAgBF,EAAmB,EACnGU,GAAWjH,EAAyBnpH,EAAM4K,EAAM,QAASglH,EAAgBoB,EAAW,EACtFZ,GACFW,GAAeX,GAAUR,CAAc,GAEvChlH,EAAM,QAAU,CACd,KAAMA,EAAM,QACZ,WAAYglH,CAAA,EAEd/B,GAAS,EAAI,EACbwB,GAAA,EAEJ,CAAC,EAEDY,GAAW,iBAAiB,SAAU,IAAM,CAC1C,MAAMvuH,GAAOuuH,GAAW,MACxB,GAAIvuH,GAAK,WAAW,SAAS,EAAG,CAC9B,MAAM4P,GAAK5P,GAAK,MAAM,CAAgB,EAChC/B,GAASmwH,GAAc,IAAIx+G,EAAE,GAAK,KACpC3R,IAAQ,SACViL,EAAM,QAAUq4G,GAA0BtjH,GAAO,MAAM,GAAKA,GAAO,OACnEkuH,GAAS,EAAI,EACbwB,GAAA,GAEF,MACF,CACA9H,EAA4BvnH,EAAM4K,EAAM,OAAO,EAC/CmmH,GAAervH,GAAMkuH,CAAc,CACrC,CAAC,EAED3C,EAAW,YAAY5G,EAAiB,CACtC,MAAO,YACP,KAAM,2FACN,SAAUwJ,EAAA,CACX,EAAE,GAAG,EAEN5C,EAAW,YAAY5G,EAAiB,CACtC,MAAO,OACP,KAAM,2DACN,SAAU4J,EAAA,CACX,EAAE,GAAG,EAEN,MAAMgB,GAAiBhB,GAAW,MAC5BD,GAAciB,GAAe,WAAW,SAAS,EAAI,SAAWA,GACtE,GAAI,CAACjB,GAAa,CAChB,MAAMpP,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,MAAM,MAAQ,yBACnBA,GAAK,YAAc,oEACnBqM,EAAW,YAAYrM,EAAI,EAC3BgN,GAAA,EACA,MACF,CACIoC,KAAgB,YACFplH,EAAM,SAAS,MAAQA,EAAM,SAAS,MAAQ,QAE5DA,EAAM,QAAUulH,GAAoBH,GAAaJ,CAAc,IAGnE,MAAMvG,GAAUz+G,EAAM,UAAY,SAAWA,EAAM,UAAY,eACzD0+G,GACJ1+G,EAAM,UAAY,QAClBA,EAAM,UAAY,WAClBA,EAAM,UAAY,SAClBA,EAAM,UAAY,UACdsmH,GAAalxH,IAAS,QAAU4K,EAAM,UAAY,WAExD,GAAIolH,KAAgB,SAAU,CAC5B,MAAMpP,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,MAAM,MAAQ,yBACnBA,GAAK,YAAc,uDACnBqM,EAAW,YAAYrM,EAAI,CAC7B,CAEA,GAAIoP,KAAgB,SAAU,CAC5B,MAAMjpF,GAAOn8B,EAAM,SAAS,MAAQ,OAAOA,EAAM,QAAQ,MAAS,SAAWA,EAAM,QAAQ,KAAO,CAAA,EAC5FumH,GAAc,OAAOpqF,GAAK,aAAgB,SAAWA,GAAK,YAAc,GACxEtkC,GAAS,OAAOskC,GAAK,QAAW,SAAWA,GAAK,OAAS,GAEzDqqF,GAAS,SAAS,cAAc,KAAK,EAC3CA,GAAO,MAAM,WAAa,WAC1BA,GAAO,MAAM,MAAQ,yBACrBA,GAAO,YAAcD,IAAe,IACpClE,EAAW,YAAY5G,EAAiB,CACtC,MAAO,cACP,KAAM,6CACN,SAAU+K,EAAA,CACX,EAAE,GAAG,EAEN,MAAMC,GAAQ,SAAS,cAAc,KAAK,EAC1CA,GAAM,MAAM,WAAa,WACzBA,GAAM,MAAM,MAAQ,yBACpBA,GAAM,YAAc5uH,IAAU,IAC9BwqH,EAAW,YAAY5G,EAAiB,CACtC,MAAO,SACP,KAAM,kEACN,SAAUgL,EAAA,CACX,EAAE,GAAG,CACR,CAEE,GAAIrB,KAAgB,gBAAiB,CACnC,MAAMsB,GAAiB,IAAM,CAC7B,MAAMj5C,GAAQztE,EAAM,SAAS,YAAc0kH,GAAM,YAAcA,GAAM,MAAQ,KAC7E,GAAI,OAAOj3C,IAAU,UAAYA,GAAM,WAAW,QAAQ,EAAG,OAAOA,GAAM,MAAM,CAAe,EAC/F,GAAI,OAAOA,IAAU,UAAYA,GAAM,WAAW,SAAS,EAAG,OAAOA,GAAM,MAAM,CAAgB,EACjG,GAAI,MAAM,QAAQA,EAAK,EACrB,UAAWthD,MAAKshD,GAAO,CACrB,GAAI,OAAOthD,IAAM,UAAYA,GAAE,WAAW,QAAQ,EAAG,OAAOA,GAAE,MAAM,CAAe,EACnF,GAAI,OAAOA,IAAM,UAAYA,GAAE,WAAW,SAAS,EAAG,OAAOA,GAAE,MAAM,CAAgB,CACvF,CAEF,MAAO,EACT,EACMxtB,GAAU,OAAOqB,EAAM,QAAQ,eAAkB,SACnDA,EAAM,QAAQ,cACb,OAAO0kH,GAAM,eAAkB,SAAWA,EAAK,cAAiBtG,EAAwB4G,CAAc,GAAK0B,GAAA,EAY9G,GAXE/nH,IAAWqB,EAAM,QAAQ,gBAAkBrB,KAC7CqB,EAAM,QAAU,CACd,GAAGA,EAAM,QACT,KAAM,gBACN,cAAerB,GACf,UAAWqB,EAAM,QAAQ,WAAa,OACtC,WAAY,CAAC,SAASrB,EAAO,EAAE,CAAA,GAGjCqB,EAAM,mBAAqB,CAAE,WAAY,KAAM,gBAAiBA,EAAM,oBAAoB,iBAAmB,IAAA,EAEzG5K,IAAS,OAAQ,CACnB,MAAMuxH,GAAkB,SAAS,cAAc,QAAQ,EACvDA,GAAgB,UAAY,6CAC9B,MAAMzxH,GAAU,CACd,CAAE,MAAO,OAAQ,MAAO,MAAA,EACxB,CAAE,MAAO,SAAU,MAAO,QAAA,EAC1B,CAAE,MAAO,cAAe,MAAO,QAAA,CAAS,EAE1C,UAAW0xH,MAAW1xH,GAAS,CAC7B,MAAM+oH,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQ2I,GAAQ,MACpB3I,GAAI,YAAc2I,GAAQ,MAC1BD,GAAgB,YAAY1I,EAAG,CACjC,CACA0I,GAAgB,MAAQ,OAAO3mH,EAAM,QAAQ,WAAa,MAAM,EAChE2mH,GAAgB,iBAAiB,SAAU,IAAM,CAC/C,MAAME,GACJ,OAAO7mH,EAAM,QAAQ,eAAkB,UAAYA,EAAM,QAAQ,cAAc,OAC3EA,EAAM,QAAQ,cACbrB,IAAW,OAClBqB,EAAM,QAAU,CACd,GAAGA,EAAM,QACT,KAAM,gBACN,cAAe6mH,GACf,UAAWF,GAAgB,MAC3B,WAAYE,GAAO,CAAC,SAASA,EAAI,EAAE,EAAI,MAAA,EAEzC,GAAI,CACE,OAAO,gCACT,QAAQ,IAAI,4CAA6C,CACvD,KAAAzxH,EACA,QAAS4K,EAAM,QACf,cAAe6mH,GACf,UAAWF,GAAgB,KAAA,CAC5B,CAEL,OAASxtH,GAAO,CACd,QAAQ,KAAK,iDAAkDA,EAAK,CACtE,CACA8pH,GAAS,EAAI,CACf,CAAC,EACCjjH,EAAM,mBAAqB,CAAE,WAAY,KAAM,gBAAA2mH,EAAA,EAC/CtD,GAAgB,CACd,SAAU,CACJrjH,EAAM,oBAAoB,kBAAoB2mH,KAChD3mH,EAAM,mBAAqB,KAE/B,CAAA,CACD,EACDqiH,EAAW,YAAY5G,EAAiB,CACtC,MAAO,YACP,KAAM,2EACN,SAAUkL,EAAA,CACX,EAAE,GAAG,CACR,CACF,CAEF,GAAIvB,KAAgB,YAAc1G,GAAU,CAC1C,MAAMyD,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,MAAM,QAAU,OACrBA,GAAK,MAAM,IAAM,MACjBA,GAAK,MAAM,MAAQ,OAEnB,MAAM2E,IAAa9mH,EAAM,UAAY,UAAY,GAC3C+mH,GAAa/mH,EAAM,UAAY,UAAY,EAAI,KAE/C,CAACgnH,GAAYC,EAAU,EAAIhG,GAAuB7rH,EAAM4K,EAAM,OAAO,EACrEmjD,GAAOg+D,GAAoB6F,GAAYC,EAAU,EAEjDC,GAAqB9xH,IAAS,SAAW4K,EAAM,UAAY,SAAWA,EAAM,UAAY,WACxFmnH,GAAennH,EAAM,QAAQ,OAAS0kH,GAAM,MAC5C0C,GACJF,IACAC,IACA,OAAOA,IAAiB,WACvB,WAAYA,IAAgB,WAAYA,IAE3C,GAAID,GAAoB,CACtB,MAAMhZ,GAASzD,GAA6B,CAC1C,QAAS,EAAQ2c,GACjB,QAAS,gBACT,SAAU,QAAA,CACX,EACDjF,GAAK,YAAYjU,EAAM,EAEvBA,GAAO,iBAAiB,SAAU,IAAM,CACtC,MAAMvjF,GAAM3qB,EAAM,QAAQ,OAAS0kH,GAAM,MACnC33G,GAAO,OAAO,SAAS,OAAO4d,EAAG,CAAC,EAAI,OAAOA,EAAG,EAAI,EAC1D,GAAIujF,GAAO,QACTluG,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAO,CAAE,OAAQ+M,GAAM,OAAQA,GAAK,MACrF,CACL,MAAMjG,GAAM6jB,IAAO,OAAOA,IAAQ,SAAW,OAAOA,GAAI,QAAUA,GAAI,KAAK,EAAI5d,GACzEjW,GAAO,OAAO,SAASgQ,EAAG,EAAIA,GAAMiG,GAC1C/M,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAOlJ,EAAA,CAC/D,CACAmsH,GAAS,EAAI,EACbwB,GAAA,CACF,CAAC,CACH,CAEA,MAAM5S,GAAS,CAACv9G,GAAO+yH,KAAa,CAClC,MAAMtqH,GAAI66G,GAAYtjH,GAAO,CAAE,IAAKwyH,GAAY,IAAKC,GAAY,EACjE,GAAIhqH,IAAK,KAET,IAAIqqH,GAAS,CACX,MAAMzoH,GAAUqB,EAAM,QAAQ,OAAS,OAAOA,EAAM,QAAQ,OAAU,SAAWA,EAAM,QAAQ,MAAQ,CAAA,EACjGlJ,GAAOuwH,KAAa,SACtB,CAAE,GAAG1oH,GAAS,OAAQ5B,EAAA,EACtB,CAAE,GAAG4B,GAAS,OAAQ5B,EAAA,EAC1BiD,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAOlJ,EAAA,CAC/D,MACEkJ,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAOjD,EAAA,EAE/DkmH,GAAS,EAAI,EACf,EAEMqE,EAAc/hB,IAAO,CACzBA,GAAG,MAAM,SAAW,OACpBA,GAAG,MAAM,MAAQ,wBACnB,EAEA,GAAI6hB,GAAS,CACX,MAAMG,GAAU,OAAOJ,IAAc,QAAUA,IAAc,OAAS,CAAC,EACjEK,GAAW,OAAO,SAASD,EAAO,EAAIA,GAAU,EAChDE,GAAc,SAAS,cAAc,KAAK,EAChDA,GAAY,YAAc,SAC1BH,EAAWG,EAAW,EACtBtF,GAAK,YAAYsF,EAAW,EAC5B,MAAMC,GAAc,IAAIlgB,GAAwB,CAC9C,MAAOggB,GACP,UAAW,CAACR,GAAYC,EAAU,EAClC,KAAA9jE,GACA,SAAU2jE,GACV,SAAUC,GACV,SAAW56F,IAAM0lF,GAAO1lF,GAAG,QAAQ,CAAA,CACpC,EACDk3F,GAAgBqE,EAAW,EAC3BvF,GAAK,YAAYuF,GAAY,OAAO,EAEpC,MAAMC,GAAU,OAAOR,IAAc,QAAUA,IAAc,KAAOK,EAAQ,EACtEI,GAAW,OAAO,SAASD,EAAO,EAAIA,GAAUH,GAChDK,GAAc,SAAS,cAAc,KAAK,EAChDA,GAAY,YAAc,SAC1BP,EAAWO,EAAW,EACtB1F,GAAK,YAAY0F,EAAW,EAC5B,MAAMC,GAAc,IAAItgB,GAAwB,CAC9C,MAAOogB,GACP,UAAW,CAACZ,GAAYC,EAAU,EAClC,KAAA9jE,GACA,SAAU2jE,GACV,SAAUC,GACV,SAAW56F,IAAM0lF,GAAO1lF,GAAG,QAAQ,CAAA,CACpC,EACDk3F,GAAgByE,EAAW,EAC3B3F,GAAK,YAAY2F,GAAY,OAAO,CACtC,KAAO,CACL,MAAMxmE,GAAgB,OAAO,SAAS,OAAOojE,GAAM,KAAK,CAAC,EAAI,OAAOA,EAAK,KAAK,EAAI,EAC5EqD,GAAS,OAAO,SAAS,OAAO/nH,EAAM,QAAQ,KAAK,CAAC,EAAI,OAAOA,EAAM,QAAQ,KAAK,EAAIshD,GACvF,OAAO,SAAS,OAAOthD,EAAM,QAAQ,KAAK,CAAC,IAC9CA,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAO+nH,EAAA,GAE/D,MAAMxhB,GAAW,IAAIiB,GAAwB,CAC3C,MAAOugB,GACP,UAAW,CAACf,GAAYC,EAAU,EAClC,KAAA9jE,GACA,SAAU2jE,GACV,SAAUC,GACV,SAAW56F,IAAM0lF,GAAO1lF,EAAC,CAAA,CAC1B,EACDk3F,GAAgB9c,EAAQ,EACxB4b,GAAK,YAAY5b,GAAS,OAAO,CACnC,CAEA8b,EAAW,YAAY5G,EAAiB,CACtC,MAAO,QACP,KAAM,gDACN,SAAU0G,EAAA,CACX,EAAE,GAAG,CACR,CAEA,GAAIiD,KAAgB,YAAckB,GAAY,CAC5C,MAAMnE,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,MAAM,QAAU,OACrBA,GAAK,MAAM,IAAM,MAEjB,MAAM6F,GAAU,IAAM,CACpB,MAAMj/C,GAAQ,SAAS,cAAc,OAAO,EAC5C,OAAAA,GAAM,KAAO,SACbA,GAAM,UAAY,mBACXA,EACT,EAEMk/C,GAASD,GAAA,EACTE,GAASF,GAAA,EACTG,GAASH,GAAA,EAETD,IAAU,IAAM,CACpB,MAAM57F,GAAInsB,EAAM,QAAQ,OAAS0kH,GAAM,MAEvC,IADoB,MAAM,QAAQv4F,EAAC,GAAK,YAAY,OAAOA,EAAC,IACzCA,GAAE,QAAU,EAAG,CAChC,MAAMlvB,GAAI,OAAOkvB,GAAE,CAAC,CAAC,EACfjvB,EAAI,OAAOivB,GAAE,CAAC,CAAC,EACf/sB,GAAI,OAAO+sB,GAAE,CAAC,CAAC,EACrB,GAAI,OAAO,SAASlvB,EAAC,GAAK,OAAO,SAASC,CAAC,GAAK,OAAO,SAASkC,EAAC,EAAG,MAAO,CAACnC,GAAGC,EAAGkC,EAAC,CACrF,CACA,MAAO,CAAC,EAAG,EAAG,CAAC,CACjB,GAAA,EAEI,CAAC,MAAM,QAAQY,EAAM,QAAQ,KAAK,GAAK,CAAC,YAAY,OAAOA,EAAM,QAAQ,KAAK,IAChFA,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAO+nH,EAAA,GAG/DE,GAAO,MAAQ,OAAOF,GAAO,CAAC,CAAC,EAC/BG,GAAO,MAAQ,OAAOH,GAAO,CAAC,CAAC,EAC/BI,GAAO,MAAQ,OAAOJ,GAAO,CAAC,CAAC,EAE/B,MAAMlW,GAAS,IAAM,CACnB,MAAM50G,GAAI26G,GAAYqQ,GAAO,KAAK,EAC5B/qH,GAAI06G,GAAYsQ,GAAO,KAAK,EAC5B9oH,GAAIw4G,GAAYuQ,GAAO,KAAK,EAC9BlrH,IAAK,MAAQC,IAAK,MAAQkC,IAAK,OACnCY,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAO,CAAC/C,GAAGC,GAAGkC,EAAC,CAAA,EACrE6jH,GAAS,EAAI,EACf,EACAgF,GAAO,iBAAiB,SAAUpW,EAAM,EACxCqW,GAAO,iBAAiB,SAAUrW,EAAM,EACxCsW,GAAO,iBAAiB,SAAUtW,EAAM,EAExCsQ,GAAK,YAAY8F,EAAM,EACvB9F,GAAK,YAAY+F,EAAM,EACvB/F,GAAK,YAAYgG,EAAM,EACvB9F,EAAW,YAAY5G,EAAiB,CACtC,MAAO,QACP,KAAM,gDACN,SAAU0G,EAAA,CACX,EAAE,GAAG,CACR,CAEA,GAAIiD,KAAgB,YAAc3G,GAAS,CACzC,MAAM0D,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,MAAM,QAAU,OACrBA,GAAK,MAAM,IAAM,MACjBA,GAAK,MAAM,MAAQ,OAEnB,MAAM+E,GAAqB9xH,IAAS,QAAU4K,EAAM,UAAY,QAC1DmnH,GAAennH,EAAM,QAAQ,OAAS0kH,GAAM,MAC5C0C,GACJF,IACAC,IACA,OAAOA,IAAiB,WACvB,WAAYA,IAAgB,WAAYA,IAErCiB,GAAa,IAAM,CACvB,MAAMr7G,GAAO,OAAOo6G,IAAiB,SACjCA,GACC,OAAOzC,GAAM,OAAU,SAAWA,EAAK,MAAQ,UACpD,OAAO,OAAO33G,IAAS,UAAYA,GAAK,OAASA,GAAO,SAC1D,EAEA,GAAIm6G,GAAoB,CACtB,MAAMhZ,GAASzD,GAA6B,CAC1C,QAAS,EAAQ2c,GACjB,QAAS,gBACT,SAAU,QAAA,CACX,EACDjF,GAAK,YAAYjU,EAAM,EAEvBA,GAAO,iBAAiB,SAAU,IAAM,CACtC,MAAMnhG,GAAOq7G,GAAA,EACb,GAAIla,GAAO,QACTluG,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAO,CAAE,OAAQ+M,GAAM,OAAQA,GAAK,MACrF,CACL,MAAM4d,GAAM3qB,EAAM,QAAQ,OAAS0kH,GAAM,MACnC5tH,GAAO6zB,IAAO,OAAOA,IAAQ,SAAW,OAAOA,GAAI,QAAUA,GAAI,OAAS5d,EAAI,EAAIA,GACxF/M,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAOlJ,EAAA,CAC/D,CACAmsH,GAAS,EAAI,EACbwB,GAAA,CACF,CAAC,CACH,CAEA,MAAM4D,GAAoB,CAAC,CAAE,MAAAruG,GAAO,SAAAsuG,GAAU,SAAAC,MAAe,CAC3D,MAAM/wE,GAAM,SAAS,cAAc,KAAK,EAMxC,GALAA,GAAI,MAAM,QAAU,OACpBA,GAAI,MAAM,IAAM,MAChBA,GAAI,MAAM,WAAa,SACvBA,GAAI,MAAM,MAAQ,OAEdx9B,GAAO,CACT,MAAMwuG,GAAU,SAAS,cAAc,KAAK,EAC5CA,GAAQ,YAAcxuG,GACtBwuG,GAAQ,MAAM,SAAW,OACzBA,GAAQ,MAAM,MAAQ,yBACtBA,GAAQ,MAAM,SAAW,OACzBhxE,GAAI,YAAYgxE,EAAO,CACzB,CAEA,MAAMtE,EAAa,SAAS,cAAc,KAAK,EAC/CA,EAAW,UAAY,yBAEvB,MAAMp3B,GAAS,SAAS,cAAc,KAAK,EAC3CA,GAAO,UAAY,iCAEnB,MAAMq3B,GAAa,SAAS,cAAc,OAAO,EACjDA,GAAW,KAAO,QAClBA,GAAW,UAAY,gCACvBA,GAAW,aAAa,aAAcnqG,GAAQ,GAAGA,EAAK,SAAW,OAAO,EAExE,MAAMoqG,GAAa,SAAS,cAAc,OAAO,EACjDA,GAAW,KAAO,SAClBA,GAAW,UAAY,mBACvBA,GAAW,IAAM,IACjBA,GAAW,IAAM,IACjBA,GAAW,KAAO,OAClBA,GAAW,MAAM,SAAW,OAC5BA,GAAW,MAAQ,QAEnB,MAAMC,GAAa,SAAS,cAAc,MAAM,EAChDA,GAAW,YAAc,QACzBA,GAAW,MAAM,MAAQ,yBAEzB,MAAMC,GAAWgE,GAAA,EACXG,GAAY,OAAOnE,IAAa,SAAWA,GAAW,UACtD35F,GAAM89F,GAAU,WAAW,GAAG,EAAIA,GAAU,MAAM,CAAC,EAAIA,GACvDlE,GAAU55F,GAAI,QAAU,EAAI,IAAIA,GAAI,MAAM,EAAG,CAAC,CAAC,GAAK,UACpD65F,GAAW75F,GAAI,SAAW,EAAIA,GAAI,MAAM,EAAG,CAAC,EAAI,KAChDlsB,GAAQ,KAAK,MAAM,SAAS+lH,GAAU,EAAE,EAAI,IAAM,GAAG,EAAI,IAE/DL,GAAW,MAAQI,GACnBH,GAAW,MAAQ,OAAO,OAAO,SAAS3lH,EAAK,EAAIA,GAAQ,CAAC,EAC5DquF,GAAO,MAAM,WAAaq3B,GAAW,MAErC,MAAMtS,GAAS,IAAM,CACnB,MAAM1iG,GAAIyoG,GAAYwM,GAAW,MAAO,CAAE,IAAK,EAAG,IAAK,EAAG,EACtDj1G,IAAK,OACTo5G,GAASvQ,GAAOmM,GAAW,MAAOh1G,EAAC,CAAC,EACpC8zG,GAAS,EAAI,EACbn2B,GAAO,MAAM,WAAaq3B,GAAW,MACvC,EACA,OAAAA,GAAW,iBAAiB,QAAStS,EAAM,EAC3CuS,GAAW,iBAAiB,SAAUvS,EAAM,EAE5CqS,EAAW,YAAYp3B,EAAM,EAC7Bo3B,EAAW,YAAYC,EAAU,EACjC3sE,GAAI,YAAY0sE,CAAU,EAC1B1sE,GAAI,YAAY6sE,EAAU,EAC1B7sE,GAAI,YAAY4sE,EAAU,EACnB5sE,EACT,EAEA,GAAI4vE,GAAS,CACX,GAAI,CAACpnH,EAAM,QAAQ,OAAS,OAAOA,EAAM,QAAQ,OAAU,SAAU,CACnE,MAAM+M,GAAOq7G,GAAA,EACbpoH,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAO,CAAE,OAAQ+M,GAAM,OAAQA,GAAK,CAC5F,CACAo1G,GAAK,YAAYkG,GAAkB,CACjC,MAAO,SACP,SAAU,IAAM,OAAOroH,EAAM,QAAQ,OAAO,QAAUooH,IAAY,EAClE,SAAWj8F,IAAM,CACfnsB,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAO,CAAE,GAAIA,EAAM,QAAQ,OAAS,CAAA,EAAK,OAAQmsB,GAAE,CAC3G,CAAA,CACD,CAAC,EACFg2F,GAAK,YAAYkG,GAAkB,CACjC,MAAO,SACP,SAAU,IAAM,OAAOroH,EAAM,QAAQ,OAAO,QAAUA,EAAM,QAAQ,OAAO,QAAUooH,GAAA,CAAY,EACjG,SAAWj8F,IAAM,CACfnsB,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAO,CAAE,GAAIA,EAAM,QAAQ,OAAS,CAAA,EAAK,OAAQmsB,GAAE,CAC3G,CAAA,CACD,CAAC,EACFk2F,EAAW,YAAY5G,EAAiB,CACtC,MAAO,QACP,KAAM,uCACN,SAAU0G,EAAA,CACX,EAAE,GAAG,CACR,MACQ,OAAOniH,EAAM,QAAQ,OAAU,UAAYA,EAAM,QAAQ,MAAM,OAAS,IAC5EA,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAOooH,IAAW,GAE1EjG,GAAK,YAAYkG,GAAkB,CACjC,MAAO,KACP,SAAU,IAAM,OAAOroH,EAAM,QAAQ,OAASooH,IAAY,EAC1D,SAAWj8F,IAAM,CACfnsB,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAOmsB,EAAA,CAC/D,CAAA,CACD,CAAC,EACFk2F,EAAW,YAAY5G,EAAiB,CACtC,MAAO,QACP,KAAM,uCACN,SAAU0G,EAAA,CACX,EAAE,GAAG,CAET,CAEA,GAAIiD,KAAgB,SAAU,CAC5BplH,EAAM,QAAU8jH,GAAkB9jH,EAAM,OAAO,EAEhD,MAAM0oH,GAAgB,SAAS,cAAc,KAAK,EAClDA,GAAc,MAAM,QAAU,OAC9BA,GAAc,MAAM,IAAM,MAC1BA,GAAc,MAAM,WAAa,SACjCA,GAAc,MAAM,MAAQ,OAE5B,MAAMC,GAAkB,SAAS,cAAc,QAAQ,EACvDA,GAAgB,UAAY,mBAC5BA,GAAgB,MAAM,KAAO,WAC7BA,GAAgB,MAAM,SAAW,OACjCA,GAAgB,MAAM,SAAW,IACjC,UAAWC,KAAU,CAAC,SAAU,MAAO,QAAS,QAAS,QAAS,YAAY,EAAG,CAC/E,MAAM3K,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQ2K,GACZ3K,GAAI,YAAcsD,EAAqBqH,EAAM,EAC7CD,GAAgB,YAAY1K,EAAG,CACjC,CACA,MAAM4K,GAAwB7oH,EAAM,QAAQ,gBAAkB,WAC1D,aACCA,EAAM,QAAQ,eAAiB,SACpC2oH,GAAgB,MAAQ,OAAOE,EAAqB,EAEpD,MAAMC,GAAa,SAAS,cAAc,OAAO,EACjDA,GAAW,KAAO,SAClBA,GAAW,UAAY,mBACvBA,GAAW,MAAM,SAAW,OAC5BA,GAAW,MAAM,KAAO,WACxBA,GAAW,MAAQ,OAAO,OAAO,SAAS,OAAO9oH,EAAM,QAAQ,cAAc,CAAC,EAAIA,EAAM,QAAQ,eAAiB,CAAC,EAClH8oH,GAAW,OAASH,GAAgB,QAAU,QAE9CA,GAAgB,iBAAiB,SAAU,IAAM,CAC/C,MAAMnD,GAAWmD,GAAgB,OAAS,SACpCI,GAAW/oH,EAAM,QAAQ,eAAiB,SAChD8oH,GAAW,OAAStD,KAAa,QACjC,MAAMwD,GAAc,CAAE,GAAGhpH,EAAM,QAAS,KAAM,SAAU,cAAewlH,EAAA,EACvE,GAAIlE,GAAsBkE,EAAQ,EAChCwD,GAAY,OAAS,CAAC,EAAG,CAAC,EAC1BjI,GAAeiI,GAAa,EAAI,UACvB1H,GAAsByH,EAAQ,EAAG,CAC1C,MAAMjpG,GAAO,OAAO9f,EAAM,QAAQ,YAAe,SAAWA,EAAM,QAAQ,WAAa,KACvFgpH,GAAY,OAASlpG,GAAOm/F,EAA0B7pH,EAAM0qB,EAAI,EAAI,CAAC,EAAG,CAAC,EACzEihG,GAAeiI,GAAa,EAAI,CAClC,CACAhpH,EAAM,QAAUgpH,GACZxD,KAAa,QACfxlH,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,SAAU,eAAgB,MAAA,EAEpEA,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,SAAU,eAAgB,OAAO8oH,GAAW,KAAK,GAAK,CAAA,EAElG7F,GAAS,EAAI,EACbwB,GAAA,CACF,CAAC,EAEDqE,GAAW,iBAAiB,SAAU,IAAM,CAC1C,MAAM98C,GAAI4rC,GAAYkR,GAAW,KAAK,EAClC98C,IAAK,OACThsE,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,SAAU,cAAe,QAAS,eAAgBgsE,EAAA,EAC5Fi3C,GAAS,EAAI,EACbwB,GAAA,EACF,CAAC,EAEDiE,GAAc,YAAYC,EAAe,EACzCD,GAAc,YAAYI,EAAU,EACpCzG,EAAW,YAAY5G,EAAiB,CACtC,MAAO,YACP,KAAM,iDACN,SAAUiN,EAAA,CACX,EAAE,GAAG,EAEN,MAAMO,GAAa,SAAS,cAAc,KAAK,EAC/CA,GAAW,MAAM,QAAU,OAC3BA,GAAW,MAAM,IAAM,MACvBA,GAAW,MAAM,MAAQ,OAEzB,MAAMC,GAAa,OAAOlpH,EAAM,QAAQ,YAAe,SAAWA,EAAM,QAAQ,WAAa,KACvF8rE,GAAgB9rE,EAAM,QAAQ,eAAiB,SAC/CmpH,GAAa7H,GAAsBx1C,EAAa,EAChDozC,GAASiK,GAAa,CAAE,IAAK,EAAG,IAAK,GAAMvK,EAAoBxpH,EAAM8zH,EAAU,EAC/EtqH,GAAMsgH,IAAQ,KAAO,EACrBl7G,EAAMk7G,IAAQ,KAAO,EACrBkK,GAAkB,EAAQlK,IAAQ,UAClC/7D,GAAOgmE,GAAa,IAAOhI,GAAoBviH,GAAKoF,EAAKolH,EAAe,EAE9E,GAAID,KAAe,CAACjI,GAAmBlhH,EAAM,QAAQ,MAAM,GAAKA,EAAM,QAAQ,OAAO,CAAC,IAAM,GAAKA,EAAM,QAAQ,OAAO,CAAC,IAAM,GAAI,CAC/H,MAAMgpH,GAAc,CAAE,GAAGhpH,EAAM,QAAS,KAAM,SAAU,OAAQ,CAAC,EAAG,CAAC,CAAA,EACrE+gH,GAAeiI,GAAa,EAAI,EAChChpH,EAAM,QAAUgpH,EAClB,SAAW,CAAC9H,GAAmBlhH,EAAM,QAAQ,MAAM,GAAKkpH,GAAY,CAClE,MAAMF,GAAc,CAAE,GAAGhpH,EAAM,QAAS,KAAM,SAAU,OAAQ,CAACpB,GAAKoF,CAAG,CAAA,EACzE+8G,GAAeiI,GAAa,EAAI,EAChChpH,EAAM,QAAUgpH,EAClB,CACA,MAAM3/C,GAAS63C,GAAmBlhH,EAAM,QAAQ,MAAM,EAAIA,EAAM,QAAQ,OAAS,CAACpB,GAAKoF,CAAG,EAEpFqlH,GAAmB9N,GAAqB2N,GAC1C5I,EAAqB,CACrB,IAAA1hH,GACA,IAAAoF,EACA,MAAOqlE,GACP,MAAOj0E,EACP,QAAS8zH,EAAA,CACV,EACC,KACAG,IAAiBJ,GAAW,YAAYI,GAAgB,OAAO,EAEnE,MAAM5iB,GAAS,IAAIkK,GAAe,CAChC,IAAA/xG,GACA,IAAAoF,EACA,KAAAm/C,GACA,MAAOkmB,GACP,SAAWvyE,IAAS,CAClB,MAAMkyH,GAAc,CAAE,GAAGhpH,EAAM,QAAS,KAAM,SAAU,OAAQlJ,EAAA,EAChEiqH,GAAeiI,GAAa,EAAK,EACjChpH,EAAM,QAAUgpH,GAChB/F,GAAS,EAAI,EACbz5C,GAAG,MAAQ,OAAO1yE,GAAK,CAAC,CAAC,EACzB2yE,GAAG,MAAQ,OAAO3yE,GAAK,CAAC,CAAC,EACzBuyH,IAAiB,WAAWvyH,GAAK,CAAC,EAAGA,GAAK,CAAC,CAAC,CAC9C,CAAA,CACD,EACDusH,GAAgB5c,EAAM,EAEtB,MAAM6iB,GAAe,SAAS,cAAc,KAAK,EACjDA,GAAa,UAAY,2BACzB,MAAM9/C,GAAK,SAAS,cAAc,OAAO,EACzCA,GAAG,KAAO,SACVA,GAAG,UAAY,mBACfA,GAAG,MAAM,SAAW,OACpB,MAAMC,GAAK,SAAS,cAAc,OAAO,EACzCA,GAAG,KAAO,SACVA,GAAG,UAAY,mBACfA,GAAG,MAAM,SAAW,OAEpBD,GAAG,MAAQ,OAAOH,GAAO,CAAC,GAAKzqE,EAAG,EAClC6qE,GAAG,MAAQ,OAAOJ,GAAO,CAAC,GAAKrlE,CAAG,EAElC,MAAMulH,GAAoB,IAAM,CAC9B,MAAMp6G,GAAIyoG,GAAYpuC,GAAG,KAAK,EACxBp6D,GAAIwoG,GAAYnuC,GAAG,KAAK,EAC9B,GAAIt6D,IAAK,MAAQC,IAAK,KAAM,OAC5B,IAAIs6D,GAAK,KAAK,IAAIv6D,GAAGC,EAAC,EAClBu6D,GAAK,KAAK,IAAIx6D,GAAGC,EAAC,EAClBg6G,KACF1/C,GAAK,KAAK,MAAMA,EAAE,EAClBC,GAAK,KAAK,MAAMA,EAAE,GAEpB,MAAM6/C,GAAW,KAAK,IAAI5qH,GAAK,KAAK,IAAIoF,EAAK0lE,EAAE,CAAC,EAC1C+/C,GAAW,KAAK,IAAI7qH,GAAK,KAAK,IAAIoF,EAAK2lE,EAAE,CAAC,EAChD88B,GAAO,OAAO,MAAQ,OAAO+iB,EAAQ,EACrC/iB,GAAO,OAAO,MAAQ,OAAOgjB,EAAQ,EACrChjB,GAAO,UAAU+iB,GAAUC,EAAQ,EACnC,MAAMT,GAAc,CAAE,GAAGhpH,EAAM,QAAS,KAAM,SAAU,OAAQ,CAAC0pE,GAAIC,EAAE,CAAA,EACvEo3C,GAAeiI,GAAa,EAAK,EACjChpH,EAAM,QAAUgpH,GAChB/F,GAAS,EAAI,EACboG,IAAiB,WAAW3/C,GAAIC,EAAE,CACpC,EACAH,GAAG,iBAAiB,SAAU+/C,EAAiB,EAC/C9/C,GAAG,iBAAiB,SAAU8/C,EAAiB,EAE/CD,GAAa,YAAY9/C,EAAE,EAC3B8/C,GAAa,YAAY7/C,EAAE,EAC3Bw/C,GAAW,YAAYxiB,GAAO,OAAO,EACrCwiB,GAAW,YAAYK,EAAY,EACnCjH,EAAW,YAAY5G,EAAiB,CACtC,MAAO,SACP,KAAM,0CACN,SAAUwN,EAAA,CACX,EAAE,GAAG,EAEN,MAAMS,GAAY,SAAS,cAAc,KAAK,EAC9CA,GAAU,MAAM,QAAU,OAC1BA,GAAU,MAAM,IAAM,MACtBA,GAAU,MAAM,MAAQ,OAExB,MAAM5C,IAAa9mH,EAAM,UAAY,UAAY,GAC3C+mH,GAAa/mH,EAAM,UAAY,UAAY,EAAI,KAE/C2pH,GAAiB1I,GAAuB7rH,EAAM4K,EAAM,OAAO,EAC3D4pH,GAAYD,GAAe,CAAC,EAC5BE,GAAYF,GAAe,CAAC,EAC5BG,GAAU3I,GAAoByI,GAAWC,EAAS,EAElD/kD,GAAQo8C,GAAmBlhH,EAAM,QAAQ,KAAK,EAAIA,EAAM,QAAQ,MAAQ2pH,GACzEzI,GAAmBlhH,EAAM,QAAQ,KAAK,IACzCA,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,SAAU,MAAA8kE,EAAA,GAGtD,MAAMilD,GAAc,IAAIpZ,GAAe,CACrC,IAAKiZ,GACL,IAAKC,GACL,KAAMC,GACN,MAAOhlD,GACP,SAAWhuE,IAAS,CAClBkJ,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,SAAU,MAAOlJ,EAAA,EAC3DmsH,GAAS,EAAI,EACbv3C,GAAG,MAAQ,OAAO50E,GAAK,CAAC,CAAC,EACzB60E,GAAG,MAAQ,OAAO70E,GAAK,CAAC,CAAC,CAC3B,CAAA,CACD,EACDusH,GAAgB0G,EAAW,EAE3B,MAAMC,GAAc,SAAS,cAAc,KAAK,EAChDA,GAAY,UAAY,2BACxB,MAAMt+C,GAAK,SAAS,cAAc,OAAO,EACzCA,GAAG,KAAO,SACVA,GAAG,UAAY,mBACfA,GAAG,MAAM,SAAW,OACpBA,GAAG,KAAO,OAAOo+C,EAAO,EACAp+C,GAAG,IAAM,OAAOo7C,EAAU,EAC9CC,IAAc,OAAMr7C,GAAG,IAAM,OAAOq7C,EAAU,GAClD,MAAMp7C,GAAK,SAAS,cAAc,OAAO,EACzCA,GAAG,KAAO,SACVA,GAAG,UAAY,mBACfA,GAAG,MAAM,SAAW,OACpBA,GAAG,KAAO,OAAOm+C,EAAO,EACAn+C,GAAG,IAAM,OAAOm7C,EAAU,EAC9CC,IAAc,OAAMp7C,GAAG,IAAM,OAAOo7C,EAAU,GAElDr7C,GAAG,MAAQ,OAAO5G,GAAM,CAAC,GAAK6kD,GAAe,CAAC,CAAC,EAC/Ch+C,GAAG,MAAQ,OAAO7G,GAAM,CAAC,GAAK6kD,GAAe,CAAC,CAAC,EAE/C,MAAMM,GAAmB,IAAM,CAC7B,MAAM96G,GAAIyoG,GAAYlsC,GAAG,MAAO,CAAE,IAAKo7C,GAAY,IAAKC,GAAY,EAC9D33G,GAAIwoG,GAAYjsC,GAAG,MAAO,CAAE,IAAKm7C,GAAY,IAAKC,GAAY,EACpE,GAAI53G,IAAK,MAAQC,IAAK,KAAM,OAC5B,MAAMs6D,GAAK,KAAK,IAAIv6D,GAAGC,EAAC,EAClBu6D,GAAK,KAAK,IAAIx6D,GAAGC,EAAC,EAClBo6G,GAAW,KAAK,IAAII,GAAW,KAAK,IAAIC,GAAWngD,EAAE,CAAC,EACtD+/C,GAAW,KAAK,IAAIG,GAAW,KAAK,IAAIC,GAAWlgD,EAAE,CAAC,EAC5DogD,GAAY,OAAO,MAAQ,OAAOP,EAAQ,EAC1CO,GAAY,OAAO,MAAQ,OAAON,EAAQ,EAC1CM,GAAY,UAAUP,GAAUC,EAAQ,EACxCzpH,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,SAAU,MAAO,CAAC0pE,GAAIC,EAAE,CAAA,EAClEs5C,GAAS,EAAI,CACf,EACAv3C,GAAG,iBAAiB,SAAUu+C,EAAgB,EAC9Ct+C,GAAG,iBAAiB,SAAUs+C,EAAgB,EAE9CD,GAAY,YAAYt+C,EAAE,EAC1Bs+C,GAAY,YAAYr+C,EAAE,EAC1B+9C,GAAU,YAAYK,GAAY,OAAO,EACzCL,GAAU,YAAYM,EAAW,EAEjC3H,EAAW,YAAY5G,EAAiB,CACtC,MAAO,QACP,KAAM,uCACN,SAAUiO,EAAA,CACV,EAAE,GAAG,EAEN,MAAMQ,GAAW,SAAS,cAAc,KAAK,EAEtCC,GAAc,SAAS,cAAc,KAAK,EAChDA,GAAY,MAAM,QAAU,OAC5BA,GAAY,MAAM,IAAM,MACxBA,GAAY,MAAM,WAAa,SAC/BA,GAAY,MAAM,MAAQ,OAE1B,MAAMC,GAAe,SAAS,cAAc,OAAO,EACnDA,GAAa,KAAO,SACpBA,GAAa,UAAY,mBACzBA,GAAa,MAAM,MAAQ,OAC3BA,GAAa,MAAM,KAAO,WAC1BA,GAAa,MAAM,SAAW,IAC/B,MAAMC,GAAc,OAAO,SAAS,OAAOrqH,EAAM,QAAQ,YAAY,CAAC,EAAI,OAAOA,EAAM,QAAQ,YAAY,EAAI,EAC/GoqH,GAAa,MAAQ,OAAOC,EAAW,EACvCD,GAAa,iBAAiB,SAAU,IAAM,CAC5C,MAAMj+F,GAAIyrF,GAAYwS,GAAa,KAAK,EACpCj+F,IAAK,OACTnsB,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,SAAU,aAAcmsB,EAAA,EAClE82F,GAAS,EAAI,EACf,CAAC,EAEA,MAAMqH,GAAe,SAAS,cAAc,QAAQ,EACpDA,GAAa,KAAO,SACpBA,GAAa,UAAY,6CACzBA,GAAa,YAAc,IAC3BA,GAAa,aAAa,aAAc,qBAAqB,EAC7DA,GAAa,iBAAiB,QAAS,IAAM,CAC3CtqH,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,SAAU,aAAc,MAAA,EAClEijH,GAAS,EAAI,EACbwB,GAAA,CACF,CAAC,EACDjJ,EAAS,cAAc8O,GAAc,0BAA0B,EAE/DH,GAAY,YAAYC,EAAY,EACpCD,GAAY,YAAYG,EAAY,EACpCJ,GAAS,YAAYzO,EAAiB,CACpC,MAAO,UACP,KAAM,gDACN,SAAU0O,EAAA,CACX,EAAE,GAAG,EAEN,MAAMI,GAAY,SAAS,cAAc,KAAK,EAC9CA,GAAU,MAAM,QAAU,OAC1BA,GAAU,MAAM,IAAM,MACtBA,GAAU,MAAM,MAAQ,OAExB,MAAMC,GAAY,SAAS,cAAc,KAAK,EAC9CA,GAAU,MAAM,QAAU,OAC1BA,GAAU,MAAM,IAAM,MACtBD,GAAU,YAAYC,EAAS,EAEhC,MAAMC,GAAkB,IAAM,CAC5BD,GAAU,YAAc,GACxB,MAAMnO,GAAQ,MAAM,QAAQr8G,EAAM,QAAQ,KAAK,EAAIA,EAAM,QAAQ,MAAQ,CAAA,EACzE,QAASxC,GAAI,EAAGA,GAAI6+G,GAAM,OAAQ7+G,IAAK,EAAG,CACxC,MAAMswE,GAAOuuC,GAAM7+G,EAAC,EACd8xC,GAAOw+B,IAAM,MAAQ,OAAOA,GAAK,MAAS,SAC5CA,GAAK,KACL,CAAE,GAAI,KAAM,IAAK,GAAI,IAAK,CAAA,EAExBlD,GAAO,SAAS,cAAc,KAAK,EAC1CA,GAAK,MAAM,QAAU,OACrBA,GAAK,MAAM,IAAM,MACjBA,GAAK,MAAM,SAAW,WACtBA,GAAK,MAAM,QAAU,MACrBA,GAAK,MAAM,aAAe,OACzBA,GAAK,MAAM,aAAe,OAC1BA,GAAK,MAAM,OAAS,yEACpBA,GAAK,MAAM,WAAa,iEAExB,MAAMnuB,GAAM,SAAS,cAAc,KAAK,EACzCA,GAAI,MAAM,QAAU,OACpBA,GAAI,MAAM,IAAM,MAChBA,GAAI,MAAM,WAAa,SACvBA,GAAI,MAAM,oBAAsB,sBAEhC,MAAMiuE,GAAU,SAAS,cAAc,KAAK,EAC5CA,GAAQ,MAAM,QAAU,OACxBA,GAAQ,MAAM,oBAAsB,qCACpCA,GAAQ,MAAM,IAAM,MACpBA,GAAQ,MAAM,WAAa,SAC3BA,GAAQ,MAAM,SAAW,IAExB,MAAMC,GAAW,SAAS,cAAc,QAAQ,EACjDA,GAAS,UAAY,6CACrBA,GAAS,MAAM,SAAW,OAC1BA,GAAS,MAAM,MAAQ,OACtB,MAAMC,GAAM,CACV,CAAE,MAAO,KAAM,MAAO,GAAA,EACtB,CAAE,MAAO,KAAM,MAAO,GAAA,EACtB,CAAE,MAAO,MAAO,MAAO,GAAA,EACvB,CAAE,MAAO,KAAM,MAAO,GAAA,EACtB,CAAE,MAAO,MAAO,MAAO,GAAA,EACvB,CAAE,MAAO,MAAO,MAAO,KAAA,EACvB,CAAE,MAAO,UAAW,MAAO,MAAA,CAAO,EAEpC,UAAWlH,MAAMkH,GAAK,CACpB,MAAM3M,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQyF,GAAG,MACfzF,GAAI,YAAcyF,GAAG,MACrBiH,GAAS,YAAY1M,EAAG,CAC1B,CACA0M,GAAS,MAAQC,GAAI,KAAMp/F,IAAMA,GAAE,QAAU8jB,GAAK,EAAE,EAAIA,GAAK,GAAK,KAElE,MAAMu7E,GAAW,SAAS,cAAc,OAAO,EAC/CA,GAAS,KAAO,SAChBA,GAAS,UAAY,mBACtBA,GAAS,MAAM,SAAW,OAC1BA,GAAS,MAAM,MAAQ,OACtBA,GAAS,MAAQv7E,GAAK,KAAO,KAAO,OAAOA,GAAK,GAAG,EAAI,GACvDu7E,GAAS,YAAc,QAEvB,MAAMC,GAAW,SAAS,cAAc,OAAO,EAC/CA,GAAS,KAAO,SAChBA,GAAS,UAAY,mBACtBA,GAAS,MAAM,SAAW,QAC1BA,GAAS,MAAM,KAAO,WACtBA,GAAS,MAAM,SAAW,IACzBA,GAAS,MAAQx7E,GAAK,KAAO,KAAO,OAAOA,GAAK,GAAG,EAAI,OAAOw+B,GAAK,OAAS,CAAC,EAC7Eg9C,GAAS,YAAc,SAEvB,MAAMC,GAAa,IAAM,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,EAAE,SAASJ,GAAS,KAAK,EACjFE,GAAS,MAAM,QAAUE,GAAA,EAAe,GAAK,OAE7C,MAAMC,GAAc,IAAM,CACxB,MAAMrsH,GAAUqB,EAAM,SAAS,QAAQxC,EAAC,GAAG,KAC3C,OAAOmB,IAAW,OAAOA,IAAY,SAAWA,GAAU2wC,EAC5D,EAEM27E,GAAcC,IAAa,CAC/B,MAAMC,GAAY1H,GAAmByH,EAAQ,EACvCtkH,GAAMskH,GAAS,KAAO,KAAO,OAAOA,GAAS,GAAG,EAAI,OACpD94B,GAAW,CACf,GAAGtkB,GACH,KAAMo9C,GACN,KAAO/+C,IAAWg/C,GAAUh/C,EAAM,EAClC,MAAOvlE,EAAA,EAEHwkH,GAAY/O,GAAM,MAAA,EACxB+O,GAAU5tH,EAAC,EAAI40F,GACfpyF,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,SAAU,MAAOorH,EAAA,EAC3DnI,GAAS,EAAI,CACf,EAEA0H,GAAS,iBAAiB,SAAU,IAAM,CACxCE,GAAS,MAAM,QAAUE,GAAA,EAAe,GAAK,OAC7CE,GAAW,CAAE,GAAGD,GAAA,EAAe,GAAIL,GAAS,MAAO,CACrD,CAAC,EAEDE,GAAS,iBAAiB,SAAU,IAAM,CACxC,MAAMjH,GAAMhM,GAAYiT,GAAS,KAAK,EACtCI,GAAW,CAAE,GAAGD,GAAA,EAAe,IAAApH,GAAK,CACtC,CAAC,EAEDkH,GAAS,iBAAiB,SAAU,IAAM,CACxC,MAAMlkH,GAAMgxG,GAAYkT,GAAS,KAAK,EACtCG,GAAW,CAAE,GAAGD,GAAA,EAAe,IAAApkH,GAAK,CACtC,CAAC,EAED,MAAMykH,GAAUtH,GAAkBvmH,KAAM,EAAI,KAAO,SAAS,EAC7DktH,GAAQ,YAAYW,EAAO,EAC3BX,GAAQ,YAAYC,EAAQ,EAC5BD,GAAQ,YAAYG,EAAQ,EAC5BrP,EAAS,cAAcmP,GAAU,qBAAqB,EACtDnP,EAAS,cAAcqP,GAAU,mBAAmB,EACpDrP,EAAS,cAAcsP,GAAU,kBAAkB,EAEnD,MAAMQ,GAAS,SAAS,cAAc,QAAQ,EAC9CA,GAAO,KAAO,SACdA,GAAO,UAAY,6CACnBA,GAAO,YAAc,IACrBA,GAAO,aAAa,aAAc,iBAAiB,EACnD9P,EAAS,cAAc8P,GAAQ,uBAAuB,EACtDA,GAAO,MAAM,SAAW,WACxBA,GAAO,MAAM,IAAM,MACnBA,GAAO,MAAM,MAAQ,MACpBA,GAAO,iBAAiB,QAAS,IAAM,CACrC,MAAMF,GAAY/O,GAAM,OAAO,CAACh1C,GAAGgG,KAAQA,KAAQ7vE,EAAC,EACpDwC,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,SAAU,MAAOorH,EAAA,EAC3DnI,GAAS,EAAI,EACbwH,GAAA,CACF,CAAC,EAEFhuE,GAAI,YAAYiuE,EAAO,EAEvB,MAAMa,GAAU,SAAS,cAAc,KAAK,EAC5CA,GAAQ,MAAM,QAAU,OACxBA,GAAQ,MAAM,oBAAsB,sBACpCA,GAAQ,MAAM,IAAM,MACpBA,GAAQ,MAAM,WAAa,SAC3BA,GAAQ,MAAM,MAAQ,OAEtBT,GAAS,MAAM,MAAQ,OAEvBS,GAAQ,YAAYxH,GAAkB,MAAM,CAAC,EAC7CwH,GAAQ,YAAYT,EAAQ,EAE5BlgD,GAAK,YAAYnuB,EAAG,EACpBmuB,GAAK,YAAY2gD,EAAO,EACxB3gD,GAAK,YAAY0gD,EAAM,EACvBd,GAAU,YAAY5/C,EAAI,CAC5B,CACF,EAEO4gD,GAAgB,SAAS,cAAc,QAAQ,EACrDA,GAAc,KAAO,SACrBA,GAAc,UAAY,6CAC1BA,GAAc,YAAc,MAC5BA,GAAc,aAAa,aAAc,cAAc,EACvDhQ,EAAS,cAAcgQ,GAAe,8BAA8B,EACpEA,GAAc,iBAAiB,QAAS,IAAM,CAC5C,MAAMl8E,GAAO,CAAE,GAAI,KAAM,IAAK,GAAI,IAAK,CAAA,EACjC67E,GAAY1H,GAAmBn0E,EAAI,EACnC8iD,GAAW,CAAE,KAAM9iD,GAAM,KAAO68B,IAAWg/C,GAAUh/C,EAAM,EAAG,MAAO78B,GAAK,GAAA,EAC1E87E,GAAY,CAAC,GAAIprH,EAAM,QAAQ,OAAS,CAAA,EAAKoyF,EAAQ,EAC3DpyF,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,SAAU,MAAOorH,EAAA,EAC3DnI,GAAS,EAAI,EACbwH,GAAA,CACF,CAAC,EAEDA,GAAA,EACA,MAAMgB,GAAmBvJ,EAAuB,CAC9C,MAAO,YACP,QAAS,yCACT,OAAQsJ,EAAA,CACT,EACDC,GAAiB,KAAK,YAAYlB,EAAS,EAC3CL,GAAS,YAAYuB,GAAiB,IAAI,EAE1C,MAAMC,GAAgB,IAAI1d,GAC1B0d,GAAc,IAAI,CAAE,GAAI,GAAGt2H,CAAI,mBAAoB,MAAO,WAAY,UAAW,GAAM,QAAS80H,EAAA,CAAU,EAC1G7H,EAAW,YAAYqJ,GAAc,OAAO,EAC5CtQ,EAAG,iBAAiB,IAAI,IAAMsQ,GAAc,SAAS,CACtD,CAEA,GAAItG,KAAgB,cAAe,CACjC,MAAMuG,GAAwB,IAAM,CAClC,MAAMxvF,GAAOn8B,EAAM,QAAQ,MAAQ,OAAOA,EAAM,QAAQ,MAAS,SAAW,CAAE,GAAGA,EAAM,QAAQ,IAAA,EAAS,CAAA,EAClGkmH,GAAc/pF,GAAK,aAAe,OAAOA,GAAK,aAAgB,SAAW,CAAE,GAAGA,GAAK,WAAA,EAAgB,CAAA,EACzG,OAAK+pF,GAAY,YAAWA,GAAY,UAAY,aAChDA,GAAY,eAAiB,OAAMA,GAAY,cAAgB,MAC9DA,GAAY,UAASA,GAAY,QAAUpK,GAC5CoK,GAAY,cAAgB,OAAMA,GAAY,aAAe,IAC5DA,GAAY,mBAAkBA,GAAY,iBAAmB,OAC9DA,GAAY,cAAgB,OAAMA,GAAY,aAAe,MACjE/pF,GAAK,YAAc+pF,GACZ/pF,EACT,EAEMyvF,GAAqBzvF,IAAS,CAClCn8B,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,cAAe,KAAAm8B,EAAA,CAC3D,GAEI,CAACn8B,EAAM,QAAQ,MAAQ,OAAOA,EAAM,QAAQ,MAAS,YACvDA,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,cAAe,KAAM2rH,IAAsB,GAEvF,MAAME,GAAyB,IAAM,CACnC,MAAMC,GAAUH,GAAA,EACVI,GAAiBD,GAAQ,aAAe,CAAA,EACxCE,GAAiBD,GAAe,SAAWjQ,EAC3CmQ,GAAkBF,GAAe,eAAiB,GAClDG,GAAeH,GAAe,WAAa,YAC3CI,GAASJ,GAAe,cACxBK,GAAYD,IAAU,MAAQA,KAAW,GAAK,KAAO,OAAOA,EAAM,EAClEE,GAAmB,OAAO,SAASD,EAAS,EAC9C,KAAK,IAAI,EAAG,KAAK,MAAMA,EAAS,CAAC,EACjC,KACJ,MAAO,CACL,KAAMN,GACN,YAAaC,GACb,YAAaC,GACb,aAAcC,GACd,UAAWC,GACX,cAAeG,EAAA,CAEnB,EAEM,CAAE,YAAArM,GAAa,aAAA5G,GAAc,UAAAkB,GAAW,cAAAE,EAAA,EAAkBqR,GAAA,EAE1DxiE,GAAW,OAAOrpD,EAAM,QAAQ,YAAe,SAAWA,EAAM,QAAQ,WAAa,GACrFssH,GAAWjjE,GAAWwzD,EAAiBznH,EAAMi0D,EAAQ,EAAI,KAC/D,GAAI,CAACA,GAAU,CACb,MAAM2sD,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,MAAM,MAAQ,yBACnBA,GAAK,YAAc,sDACnBqM,EAAW,YAAYrM,EAAI,CAC7B,CAEA,GAAI3sD,IAAYijE,IAAYpR,GAAsBoR,GAAS,IAAI,EAAG,CAChE,MAAMC,GAAOnN,GAAyBhqH,EAAMi0D,EAAQ,EAC9C2sD,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,MAAM,MAAQ,yBACnBA,GAAK,YAAcuW,GAAK,GACpB,8BAA8BA,GAAK,aAAe,CAAC,8BAA8BA,GAAK,WAAa,CAAC,KACpG,sBAAsBA,GAAK,MAAM,GACrClK,EAAW,YAAYrM,EAAI,EAE3B,MAAMwW,GAAgB,SAAS,cAAc,QAAQ,EACrDA,GAAc,KAAO,SACrBA,GAAc,UAAY,6CAC1BA,GAAc,YAAc,yBAC5BA,GAAc,SAAW,CAACD,GAAK,GAC/BC,GAAc,iBAAiB,QAAS,IAAM,CAC5C,MAAMhxH,GAAU8/G,EAAA,EAChB,GAAI,CAAC9/G,GAAS,OACd,MAAMk3E,GAAQ4nC,KAAc,SAAW,YAAcA,GACrD,GAAI,CACEllH,IAAS,OACXoG,GAAQ,0BAA0B6tD,GAAU,CAAE,UAAWqpB,GAAO,EAEhEl3E,GAAQ,0BAA0B6tD,GAAU,CAAE,UAAWqpB,GAAO,EAElE1yE,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,cAAe,OAAQ,GAAI,MAAO,CAAA,CAAC,EAC7EijH,GAAS,EAAI,EACbwB,GAAA,CACF,OAAStrH,GAAO,CACd,QAAQ,KAAK,wCAAyCA,EAAK,CAC7D,CACF,CAAC,EACDkpH,EAAW,YAAY5G,EAAiB,CACtC,MAAO,aACP,KAAM,0DACN,SAAU+Q,EAAA,CACX,EAAE,GAAG,EACNxJ,GAAA,EACA,MACF,CAEA,GAAI35D,IAAYijE,IAAY,CAACrR,GAA2BqR,GAAS,IAAI,EAAG,CACtE,MAAMtW,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,MAAM,MAAQ,yBACnBA,GAAK,YAAc,yCACnBqM,EAAW,YAAYrM,EAAI,EAC3BgN,GAAA,EACA,MACF,CAEA,MAAMyJ,GAAapjE,GAAWs2D,GAAuBvqH,EAAMi0D,EAAQ,EAAI,CAAA,EACvE,GAAI,CAACojE,GAAW,OAAQ,CACtB,MAAMzW,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,MAAM,MAAQ,yBACnBA,GAAK,YAAc,0CACnBqM,EAAW,YAAYrM,EAAI,EAC3BgN,GAAA,EACA,MACF,CAEA,MAAM0J,EAAgB,MAAM,QAAQ1sH,EAAM,QAAQ,MAAM,EAAIA,EAAM,QAAQ,OAAS,CAAA,EAC7E4Z,GAAU6yG,GAChB,GAAI,CAAC7yG,GAAQ,OAAQ,CACnB,MAAMo8F,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,MAAM,MAAQ,yBACnBA,GAAK,YAAc,0CACnBqM,EAAW,YAAYrM,EAAI,EAC3BgN,GAAA,EACA,MACF,CACA,MAAM2J,GAAe,MAAM,QAAQ3sH,EAAM,QAAQ,KAAK,EAAIA,EAAM,QAAQ,MAAQ,CAAA,EAC1E4sH,GAAW,IAAI,IAAIhzG,GAAQ,IAAK0I,IAAUA,GAAM,EAAE,CAAC,EACnDuqG,GAAaH,EAAc,KAAMhmH,IAAO,CAACkmH,GAAS,IAAIlmH,EAAE,CAAC,EACzDomH,GAASlzG,GAAQ,KAAM0I,IAAU,CAACoqG,EAAc,SAASpqG,GAAM,EAAE,CAAC,EAClEyqG,GAAwBL,EAAc,IAAKhmH,IAAOkT,GAAQ,KAAM0I,IAAUA,GAAM,KAAO5b,EAAE,CAAC,EAAE,OAAO,OAAO,EAC1GsmH,GAAmBpzG,GAAQ,KAAM0I,IAAU,CAACoqG,EAAc,SAASpqG,GAAM,EAAE,CAAC,EAC5E2qG,GAAqBF,GAAsB,KAAMzqG,IAAUA,GAAM,cAAgB,EAAI,EACrF4qG,GAAiBH,GAAsB,KAAMzqG,IAAUA,GAAM,cAAgB,EAAI,EACvF,IAAI6qG,GAAqB,GACrBC,GAAkB,GACtB,UAAW9qG,MAASyqG,GAAuB,CACzC,GAAIzqG,GAAM,cAAgB,GAAM,CAC9B8qG,GAAkB,GAClB,QACF,CACA,GAAIA,GAAiB,CACnBD,GAAqB,GACrB,KACF,CACF,CACA,MAAME,GACHL,IAAoBC,IAAsBC,IAC1C,CAACF,IAAoBG,GAClB/hF,GACJshF,EAAc,SAAW,GACzBC,GAAa,SAAWD,EAAc,QACtCG,IACAC,IACAO,GAEIC,GAAsB,GACtBC,GAAwBvxH,IAAU,CACtC,KAAM,CAAE,cAAAw+G,GAAe,aAAApB,GAAc,YAAA4G,EAAAA,EAAgB6L,GAAA,EACrD,GAAIrR,GAAe,OAAO,KAAK,IAAIx+G,GAAOw+G,EAAa,EACvD,IAAIgT,GAAMxxH,GACV,GAAIo9G,GAAc,CAChB,MAAM35F,GAAWqpD,GAAgBk3C,EAAW,EAC5C,GAAIvgG,IAAU,UAAY,OAAOA,GAAS,QAAW,WAAY,CAC/D,MAAM8iD,GAAS9iD,GAAS,OAAA,EACpB,MAAM,QAAQ8iD,EAAM,GAAKA,GAAO,SAAQirD,GAAM,KAAK,IAAIA,GAAKjrD,GAAO,MAAM,EAC/E,CACF,CACA,OAAIirD,GAAMF,KAAqBE,GAAMF,IAC9BE,EACT,EAEMC,GAAsB,IAAM,CAChC,KAAM,CAAE,UAAAnT,EAAAA,EAAcuR,GAAA,EACtB,OAAOxR,GAAwBzgG,GAAS,CACtC,UAAA0gG,GACA,YAAa,MAAM,QAAQt6G,EAAM,QAAQ,MAAM,EAAIA,EAAM,QAAQ,OAAS,CAAA,EAC1E,cAAeutH,GAAqB3zG,GAAQ,MAAM,CAAA,CACnD,CACH,EAEMwjG,GAAiBp9G,EAAM,UAAY,SAAWA,EAAM,UAAY,eAChE,CAACgnH,GAAYC,EAAU,EAAIhG,GAAuB7rH,EAAM4K,EAAM,OAAO,EACrE0tH,GAAcvM,GAAoB6F,GAAYC,EAAU,EACxD0G,GAAyB,IAAM,CACnC,KAAM,CAAE,YAAAzH,EAAA,EAAgB2F,GAAA,EAClBlhG,GAAM,MAAM,QAAQu7F,IAAa,YAAY,EAAIA,GAAY,aAAe,CAAA,EAClF,IAAItnH,GAAM,OAAO+rB,GAAI,CAAC,CAAC,EACnB3mB,GAAM,OAAO2mB,GAAI,CAAC,CAAC,EAClB,OAAO,SAAS/rB,EAAG,IAAGA,GAAMooH,IAC5B,OAAO,SAAShjH,EAAG,IAAGA,GAAMijH,IAC7BroH,KAAQoF,KAAKA,GAAMpF,GAAM,GAC7B,MAAMyrC,GAAY67E,IAAa,mBAAqB,OAAS,OAAS,MACtE,MAAO,CAAE,IAAAtnH,GAAK,IAAAoF,GAAK,UAAAqmC,EAAA,CACrB,EACMujF,GAAuB5xH,IAAU,CACrC,KAAM,CAAE,IAAA4C,GAAK,IAAAoF,GAAK,UAAAqmC,EAAA,EAAcsjF,GAAA,EAChC,GAAI,CAAC,OAAO,SAAS3xH,EAAK,GAAKA,IAAS,EAAG,MAAO,CAAC4C,EAAG,EACtD,MAAM+lF,GAAO3gF,GAAMpF,GACbuH,GAAS,MAAM,KAAK,CAAE,OAAQnK,EAAA,EAAS,CAACqrE,GAAG7pE,KAAMoB,GAAO+lF,GAAOnnF,IAAMxB,GAAQ,EAAE,EACrF,OAAOquC,KAAc,OAASlkC,GAAO,QAAA,EAAYA,EACnD,EAEM0nH,GAAgB,CAAC,CAAE,aAAAC,GAAe,EAAA,EAAU,CAAA,IAAO,CACvD,KAAM,CAAE,YAAA9N,GAAa,aAAA5G,EAAAA,EAAiByS,GAAA,EAChC9zE,GAAU01E,GAAA,EACVM,GAAgB,MAAM,QAAQ/tH,EAAM,QAAQ,MAAM,EAAIA,EAAM,QAAQ,OAAS,CAAA,EAC7EguH,GAAe,MAAM,QAAQhuH,EAAM,QAAQ,KAAK,EAAIA,EAAM,QAAQ,MAAQ,CAAA,EAC1EiuH,OAAgB,IACtB,QAASzwH,GAAI,EAAGA,GAAIuwH,GAAc,OAAQvwH,IAAK,EAC7CywH,GAAU,IAAIF,GAAcvwH,EAAC,EAAGwwH,GAAaxwH,EAAC,CAAC,EAEjD,MAAM0wH,GAAU9Q,GACZ2C,GAA0B,CACxB,YAAAC,GACA,MAAOjoE,GAAQ,OACf,aAAAqhE,EAAA,CACD,EACDwU,GAAoB71E,GAAQ,MAAM,EAChCsxB,GAAStxB,GAAQ,IAAKz1B,IAAUA,GAAM,EAAE,EACxCwiD,GAAQ/sB,GAAQ,IAAI,CAACz1B,GAAO+qD,KAC5B,CAACygD,IAAgBG,GAAU,IAAI3rG,GAAM,EAAE,EAAU2rG,GAAU,IAAI3rG,GAAM,EAAE,EACvE86F,GAAuB8Q,GAAQ7gD,EAAG,GAAKqsC,GAAersC,EAAG,EACtD6gD,GAAQ7gD,EAAG,GAAK25C,EACxB,EACKf,GAAW0F,GAAA,EACX3C,GAAc,CAAE,GAAGhpH,EAAM,QAAS,KAAM,cAAe,OAAAqpE,GAAQ,MAAAvE,GAAO,KAAMmhD,EAAA,EAClFjmH,EAAM,QAAUgpH,GAChB/F,GAAS,EAAI,CACf,EAEI73E,IACFyiF,GAAc,CAAE,aAAcnB,EAAc,SAAW,GAAKC,GAAa,SAAWD,EAAc,OAAQ,EAG5G,MAAMyB,GAAc,SAAS,cAAc,QAAQ,EACnDA,GAAY,UAAY,mBACxB,MAAMC,GAAe,CACnB,CAAE,MAAO,YAAa,MAAO,WAAA,EAC7B,CAAE,MAAO,eAAgB,MAAO,cAAA,EAChC,CAAE,MAAO,UAAW,MAAO,SAAA,EAC3B,CAAE,MAAO,SAAU,MAAO,QAAA,CAAS,EAErC,UAAWxH,MAAWwH,GAAc,CAClC,MAAMnQ,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQ2I,GAAQ,MACpB3I,GAAI,YAAc2I,GAAQ,MAC1BuH,GAAY,YAAYlQ,EAAG,CAC7B,CACAkQ,GAAY,MAAQC,GAAa,KAAM5iG,IAAMA,GAAE,QAAU8uF,EAAS,EAAIA,GAAY,YAClF6T,GAAY,iBAAiB,SAAU,IAAM,CAC3C,MAAMlI,GAAW0F,GAAA,EACjB1F,GAAS,YAAY,UAAYkI,GAAY,MAC7CvC,GAAkB3F,EAAQ,EAC1B4H,GAAc,CAAE,aAAc,GAAO,EACrCpJ,GAAA,CACF,CAAC,EACD,MAAM4J,GAAU,SAAS,cAAc,KAAK,EAC5CA,GAAQ,MAAM,QAAU,OACxBA,GAAQ,MAAM,IAAM,MACpBA,GAAQ,MAAM,WAAa,SAC3BA,GAAQ,MAAM,MAAQ,OACtB,MAAMC,GAAW,SAAS,cAAc,OAAO,EAC/CA,GAAS,KAAO,SAChBA,GAAS,UAAY,mBACrBA,GAAS,IAAM,IACfA,GAAS,YAAc,OACvBA,GAAS,MAAQ9T,GAAgB,OAAOA,EAAa,EAAI,GACzD8T,GAAS,iBAAiB,SAAU,IAAM,CACxC,MAAMh6H,GAAQsjH,GAAY0W,GAAS,MAAO,CAAE,IAAK,EAAG,EAC9CrI,GAAW0F,GAAA,EACjB1F,GAAS,YAAY,cAAgB,OAAO,SAAS3xH,EAAK,EAAI,KAAK,MAAMA,EAAK,EAAI,KAClFs3H,GAAkB3F,EAAQ,EAC1B4H,GAAc,CAAE,aAAc,GAAO,EACrCpJ,GAAA,CACF,CAAC,EACD4J,GAAQ,YAAYC,EAAQ,EAC5B,MAAMC,GAAwB,CAAC,CAAE,MAAAv0G,GAAO,KAAAqqF,GAAM,QAAAif,GAAS,WAAAkL,GAAa,MAAY,CAC9E,MAAMrM,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,MAAM,QAAU,OACrBA,GAAK,MAAM,IAAM,MACjBA,GAAK,MAAM,MAAQ,OACnB,MAAMqG,GAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,GAAQ,YAAcxuG,IAAS,GAC/BwuG,GAAQ,MAAM,SAAW,OACzBA,GAAQ,MAAM,MAAQ,yBAClBgG,KACFhG,GAAQ,MAAM,UAAY,QAC1BA,GAAQ,MAAM,UAAY,OAExBnkB,IAAMmX,EAAS,gBAAgBgN,GAASnkB,EAAI,EAChD8d,GAAK,YAAYqG,EAAO,EACxBrG,GAAK,YAAYmB,EAAO,EACjBnB,EACT,EAEA,IAAIsM,GAAqB,KACzB,GAAIrR,GAAgB,CAClB,MAAMsR,GAAiB7S,EAA0B,IAAKv5F,KAAW,CAC/D,GAAGA,GACH,OAAQ,GAAGA,GAAM,GAAG,IAAIA,GAAM,KAAK,IAAIA,GAAM,KAAK,GAAG,YAAA,CAAY,EACjE,EACIqsG,IAAkB,IAAM,CAC5B,MAAM3V,OAAc,IACdC,OAAY,IAClB,UAAW32F,MAASosG,GAAgB,CAClC,MAAMjoD,GAAOuyC,GAAQ,IAAI12F,GAAM,KAAK,GAAK,CAAA,EACzCmkD,GAAK,KAAKnkD,EAAK,EACf02F,GAAQ,IAAI12F,GAAM,MAAOmkD,EAAI,EAC7BwyC,GAAM,IAAI32F,GAAM,IAAKA,EAAK,CAC5B,CACA,UAAWmkD,MAAQuyC,GAAQ,SACzBvyC,GAAK,KAAK,CAACt3D,GAAGC,KAAMD,GAAE,MAAM,cAAcC,GAAE,KAAK,CAAC,EAEpD,MAAO,CAAE,QAASs/G,GAAgB,QAAA1V,GAAS,MAAAC,EAAA,CAC7C,GAAA,EAEM2V,GAAgB,SAAS,cAAc,KAAK,EAClDA,GAAc,UAAY,4BAC1B,MAAMC,GAAiB,SAAS,cAAc,QAAQ,EACtDA,GAAe,KAAO,SACtBA,GAAe,UAAY,sDAE3B,MAAMC,GAAsB,SAAS,cAAc,MAAM,EACzDA,GAAoB,UAAY,qBAChCD,GAAe,YAAYC,EAAmB,EAE9C,MAAMC,GAAiB,SAAS,cAAc,KAAK,EACnDA,GAAe,UAAY,8DAE3B,MAAMC,GAAiB,SAAS,cAAc,KAAK,EACnDA,GAAe,UAAY,6BAC3BA,GAAe,OAAS,GAExB,MAAMC,GAAsB,SAAS,cAAc,KAAK,EACxDA,GAAoB,UAAY,oCAChCD,GAAe,YAAYC,EAAmB,EAE9C,MAAMC,GAAgB,SAAS,cAAc,KAAK,EAClDA,GAAc,UAAY,qCAC1B,MAAMC,GAAgB,SAAS,cAAc,OAAO,EACpDA,GAAc,KAAO,OACrBA,GAAc,UAAY,oDAC1BA,GAAc,YAAc,mBAC5BD,GAAc,YAAYC,EAAa,EACvC,IAAIC,GAAsBhW,GAC1B,MAAMiW,GAAmB,SAAS,cAAc,KAAK,EACrDA,GAAiB,UAAY,sCAC7B,MAAMC,GAAqB,SAAS,cAAc,QAAQ,EAC1DA,GAAmB,KAAO,SAC1BA,GAAmB,UAAY,qCAC/BA,GAAmB,YAAc,UACjCA,GAAmB,MAAQ,mEAC3B,MAAMC,GAAyB,IAAM,CACnCD,GAAmB,QAAQ,OAASF,GAAsB,OAAS,QACnEE,GAAmB,aAAa,eAAgBF,GAAsB,OAAS,OAAO,CACxF,EACAG,GAAA,EACAF,GAAiB,YAAYC,EAAkB,EAC/CJ,GAAc,YAAYG,EAAgB,EAC1CJ,GAAoB,YAAYC,EAAa,EAE7C,MAAMM,GAAc,SAAS,cAAc,KAAK,EAChDA,GAAY,UAAY,mCACxBP,GAAoB,YAAYO,EAAW,GAErBpU,GAAI,WAAa,SAAS,MAClC,YAAY4T,EAAc,EACxC,MAAMS,GAAkB,CAAA,EAClBC,EAA0BnzH,IAAO,CACjC,OAAOA,IAAO,YAAYkzH,GAAgB,KAAKlzH,EAAE,CACvD,EACAmzH,EAAuB,IAAMV,GAAe,QAAQ,EAEpD,MAAMW,GAAuB,CAACzB,GAAS,CAAE,SAAA3U,GAAW,EAAA,EAAU,KAAO,CACnE,GAAI,CAAC,MAAM,QAAQ2U,EAAO,GAAKA,GAAQ,SAAW,EAChD,MAAO,gEAET,GAAIA,GAAQ,SAAW,EACrB,MAAO,0BAA0BA,GAAQ,CAAC,CAAC,KAAKA,GAAQ,CAAC,CAAC,IAE5D,GAAI3U,GAAU,CACZ,MAAMp2D,GAAO,IAAM+qE,GAAQ,OAM3B,MAAO,0BALOA,GAAQ,QAAQ,CAACh1F,GAAOm0C,KAAQ,CAC5C,MAAMp9D,IAASo9D,GAAMlqB,IAAM,QAAQ,CAAC,EAC9B9rB,KAAQg2C,GAAM,GAAKlqB,IAAM,QAAQ,CAAC,EACxC,MAAO,CAAC,GAAGjqB,EAAK,IAAIjpB,EAAK,IAAK,GAAGipB,EAAK,IAAI7B,EAAG,GAAG,CAClD,CAAC,EACsC,KAAK,IAAI,CAAC,GACnD,CAKA,MAAO,0BAJO62F,GAAQ,IAAI,CAACh1F,GAAOm0C,KAAQ,CACxC,MAAMs5B,GAAOt5B,IAAO6gD,GAAQ,OAAS,GAAM,IAC3C,MAAO,GAAGh1F,EAAK,IAAIytE,GAAI,QAAQ,CAAC,CAAC,GACnC,CAAC,EACsC,KAAK,IAAI,CAAC,GACnD,EAEMipB,GAAyBla,IAAW,CACxC,MAAMj+G,GAAM,OAAOi+G,IAAU,EAAE,EAAE,KAAA,EACjC,GAAI,CAACj+G,GAAK,MAAO,GACjB,MAAM6qB,GAAQqsG,GAAe,MAAM,IAAIl3H,EAAG,EAC1C,OAAK6qB,GACE,GAAGA,GAAM,KAAK,KAAKA,GAAM,KAAK,GADlB7qB,EAErB,EACA,IAAIo4H,GAAsB7P,GAE1B,MAAM8P,GAAwBpa,IAAW,CACvC,MAAMj+G,GAAM,OAAOi+G,IAAU,EAAE,EAAE,QAAUoG,EACrCr8F,GAAWqpD,GAAgBrxE,EAAG,EAC9By2H,GAAUnO,GAA0B,CACxC,YAAatoH,GACb,MAAO,EACP,aAAc23H,EAAA,CACf,EACDL,GAAe,MAAM,gBAAkBY,GAAqBzB,GAAS,CAAE,SAAUzuG,IAAU,SAAU,CACvG,EAEMswG,GAAkBra,IAAW,CACjC,MAAMj+G,GAAM,OAAOi+G,IAAU,EAAE,EAAE,QAAUoG,EAC3C+T,GAAsBp4H,GACtBq3H,GAAoB,YAAcc,GAAsBn4H,EAAG,EAC3Do3H,GAAe,MAAQC,GAAoB,YAC3CD,GAAe,QAAQ,YAAcp3H,GACrCq4H,GAAqBr4H,EAAG,CAC1B,EAEMu4H,GAAsBta,IAAW,CACrC,MAAMj+G,GAAM,OAAOi+G,IAAU,EAAE,EAAE,QAAUoG,EACrCmK,GAAW0F,GAAA,EACjB1F,GAAS,YAAY,QAAUxuH,GAC/Bm0H,GAAkB3F,EAAQ,EAC1B8J,GAAet4H,EAAG,EAClBo2H,GAAc,CAAE,aAAc,GAAM,EACpC5K,GAAS,EAAI,CACf,EAEA8M,GAAe/P,EAAW,EAE1B,IAAIiQ,GAAkB,KACtB,MAAMC,GAAwB,IACxBD,KACA,OAAO,sBAAyB,WAAmB,MACvDA,GAAkB,IAAI,qBAAsBr2G,IAAY,CACtD,UAAW0I,MAAS1I,GAAS,CAC3B,GAAI,CAAC0I,GAAM,eAAgB,SAC3B,MAAMijF,GAAKjjF,GAAM,OACX7qB,GAAM8tG,IAAI,SAAS,YAEzB,GADI,CAAC9tG,IACD8tG,GAAG,QAAQ,gBAAkB,IAAK,SACtCA,GAAG,QAAQ,cAAgB,IAC3B,MAAM9lF,GAAWqpD,GAAgBrxE,EAAG,EAC9B04H,GAAiBpQ,GAA0B,CAC/C,YAAatoH,GACb,MAAO,EACP,aAAc23H,EAAA,CACf,EACD7pB,GAAG,MAAM,gBAAkBoqB,GAAqBQ,GAAgB,CAAE,SAAU1wG,IAAU,SAAU,EAChGwwG,GAAgB,UAAU1qB,EAAE,CAC9B,CACF,EAAG,CAAE,KAAM0pB,GAAqB,WAAY,OAAQ,EACpDS,EAAuB,IAAM,CAC3BO,IAAiB,aAAA,EACjBA,GAAkB,IACpB,CAAC,EACMA,KAGHG,GAAwBta,IAAa,CACzC0Z,GAAY,gBAAA,EAEZ,MAAMluC,GADQ,OAAOw0B,IAAY,EAAE,EAAE,KAAA,EAAO,YAAA,EACvB,MAAM,KAAK,EAAE,OAAO,OAAO,EAC1C7oB,GAAU0hC,GAAe,QAAQ,OAAQrsG,IACxC62F,GAAkC72F,GAAO8sG,EAAmB,EAC5D9tC,GAAO,OACLA,GAAO,MAAO14D,IAAMtG,GAAM,OAAO,SAASsG,EAAC,CAAC,EADxB,GADgD,EAG5E,EAED,GAAI,CAACqkE,GAAQ,OAAQ,CACnB,MAAM+oB,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,UAAY,kCACjBA,GAAK,YAAc,cACnBwZ,GAAY,YAAYxZ,EAAI,EAC5B,MACF,CAEA,MAAMnB,GAAa,CAAC,KAAM,UAAW,MAAO,SAAU,OAAO,EACvDoB,OAAqB,IAC3B,UAAW3zF,MAAS2qE,GAAS,CAC3B,MAAMxmB,GAAOwvC,GAAe,IAAI3zF,GAAM,KAAK,GAAK,CAAA,EAChDmkD,GAAK,KAAKnkD,EAAK,EACf2zF,GAAe,IAAI3zF,GAAM,MAAOmkD,EAAI,CACtC,CACA,UAAWA,MAAQwvC,GAAe,SAChCxvC,GAAK,KAAK,CAACt3D,GAAGC,KAAMD,GAAE,MAAM,cAAcC,GAAE,KAAK,CAAC,EAGpD,MAAM8mG,GAAc50B,GAAO,OAAS,GAAK,IACnC60B,GAAW70B,GAAO,OAAS,IAAM,IACvC,IAAIn8D,GAAQ,EACZ,MAAMixF,GAAW8Z,GAAA,EAEjB,UAAWtuC,MAASizB,GAAY,CAC9B,MAAMpuC,GAAOwvC,GAAe,IAAIr0B,EAAK,EACrC,GAAI,CAACnb,IAAM,OAAQ,SAEnB,MAAM6oC,GAAU,SAAS,cAAc,KAAK,EAC5CA,GAAQ,UAAY,6BAEpB,MAAM5S,GAAQ,SAAS,cAAc,KAAK,EAC1CA,GAAM,UAAY,oCAClBA,GAAM,YAAc9a,GACpB0tB,GAAQ,YAAY5S,EAAK,EAEzB,MAAM0R,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,UAAY,mCAEjB,MAAMhyB,GAAU3V,GAAK,MAAM,EAAGyvC,EAAW,EACzC,UAAW5zF,MAAS85D,GAAS,CAC3B,GAAIj3D,IAASgxF,GAAU,MACvBhxF,IAAS,EAET,MAAMylD,GAAO,SAAS,cAAc,QAAQ,EAC5CA,GAAK,KAAO,SACZA,GAAK,UAAY,kCACjBA,GAAK,QAAQ,IAAMtoD,GAAM,IACzBsoD,GAAK,QAAQ,eAAiBtoD,GAAM,QAAUA,GAAM,OAAS,GAC7DsoD,GAAK,QAAQ,aAAetoD,GAAM,OAASA,GAAM,WAAa,GAAO,SAAW,QAChFsoD,GAAK,QAAQ,eAAiBtoD,GAAM,WAAa,GAAO,OAAS,QAEjE,MAAM+zF,GAAY,SAAS,cAAc,KAAK,EAC9CA,GAAU,UAAY,2DACtBA,GAAU,YAAc/zF,GAAM,MAC9B+zF,GAAU,MAAQ,GAAG/zF,GAAM,GAAG,GAE9B,MAAMg0F,GAAY,SAAS,cAAc,KAAK,EAC9CA,GAAU,UAAY,2DACtBA,GAAU,QAAQ,YAAch0F,GAAM,IACtCg0F,GAAU,QAAQ,cAAgB,IAClCA,GAAU,MAAM,gBAAkB,6DAClCF,IAAU,UAAUE,EAAS,EAE7B1rC,GAAK,YAAYyrC,EAAS,EAC1BzrC,GAAK,YAAY0rC,EAAS,EAE1B1rC,GAAK,iBAAiB,cAAgBmzB,IAAM,CAC1CA,GAAE,eAAA,EACFiyB,GAAmB1tG,GAAM,GAAG,EAC5B0sG,GAAe,OAAS,EAC1B,CAAC,EAED5gB,GAAK,YAAYxjC,EAAI,CACvB,CAEA,GAAInE,GAAK,OAASyvC,GAAa,CAC7B,MAAMF,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,UAAY,kCACjBA,GAAK,YAAc,WAAWE,EAAW,OAAOzvC,GAAK,MAAM,OAAOmb,EAAK,IACvEwsB,GAAK,YAAY4H,EAAI,CACvB,CAIA,GAFA1G,GAAQ,YAAYlB,EAAI,EACxBohB,GAAY,YAAYlgB,EAAO,EAC3BnqF,IAASgxF,GAAU,KACzB,CAEA,GAAIlpB,GAAQ,OAASkpB,GAAU,CAC7B,MAAMH,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,UAAY,kCACjBA,GAAK,YAAc,WAAWG,EAAQ,OAAOlpB,GAAQ,MAAM,wBAC3DuiC,GAAY,YAAYxZ,EAAI,CAC9B,CACF,EAEMqa,GAAgB,EAChBC,GAAgB,GAChBC,GAAmB,IACnBC,GAAkB,IAClBC,GAAkB,IAClBC,GAAmB,IAEnBC,GAAyB,IAAM,CACnC,GAAI3B,GAAe,OAAQ,OAC3B,MAAMxjC,GAASqjC,GAAe,sBAAA,EACxBrpB,GAAK,OAAO,WACZC,GAAK,OAAO,YAEZoR,GAAapR,GAAKja,GAAO,OAAS8kC,GAClCxZ,GAAatrB,GAAO,IAAM8kC,GAC1BvZ,GAAavR,GAAKha,GAAO,MAAQ8kC,GACjCtZ,GAAYxrB,GAAO,KAAO8kC,GAEhCtB,GAAe,MAAM,MAAQ,GAAG,KAAK,IAAIwB,GAAiB,KAAK,IAAIC,GAAiBjlC,GAAO,KAAK,CAAC,CAAC,KAClGwjC,GAAe,MAAM,KAAO,MAC5BA,GAAe,MAAM,IAAM,MAC3BA,GAAe,OAAS,GAExB,MAAMhlC,GAAWilC,GAAoB,sBAAA,EAC/B/X,GAAWltB,GAAS,OAAS,KAAK,IAAIwmC,GAAiB,KAAK,IAAIC,GAAiBjlC,GAAO,KAAK,CAAC,EAC9F2rB,GAAW8X,GAAoB,cAAgBjlC,GAAS,QAAUumC,GAElEnZ,GAAc,KAAK,IAAIP,GAAYC,EAAU,GAAKyZ,GAClDlZ,GAAcR,IAAcC,GAC5BQ,GAAgB,KAAK,IAAIP,GAAYC,EAAS,GAAKwZ,GACnDjZ,GAAcR,IAAcC,GAElC,IAAItuB,GAAY,SACZ0uB,GACF1uB,GAAY2uB,GAAc,SAAW,MAC5BC,GACT5uB,GAAY6uB,GAAc,QAAU,OAQpC7uB,GANa,CACX,CAAE,KAAM,SAAU,KAAMmuB,EAAA,EACxB,CAAE,KAAM,MAAO,KAAMC,EAAA,EACrB,CAAE,KAAM,QAAS,KAAMC,EAAA,EACvB,CAAE,KAAM,OAAQ,KAAMC,EAAA,CAAU,EAChC,KAAK,CAAC7nG,GAAGC,KAAMA,GAAE,KAAOD,GAAE,IAAI,EAAE,CAAC,GACjB,MAAQ,SAG5B,IAAImtC,GAAOkvC,GAAO,KACd/uC,GAAM+uC,GAAO,OAAS6kC,GACtBO,GAAO,KAAK,IAAI,GAAI/Z,EAAU,EAE9BnuB,KAAc,OAChBkoC,GAAO,KAAK,IAAI,GAAI9Z,EAAU,EAC9Br6D,GAAM,KAAK,IAAI6zE,GAAe9kC,GAAO,IAAM6kC,GAAgB,KAAK,IAAIlZ,GAAUyZ,EAAI,CAAC,GAC1EloC,KAAc,SACvBpsC,GAAOkvC,GAAO,MAAQ6kC,GACtB5zE,GAAM+uC,GAAO,IACbolC,GAAO,KAAK,IAAI,GAAInrB,GAAK,EAAI6qB,EAAa,GACjC5nC,KAAc,SACvBpsC,GAAO,KAAK,IAAIg0E,GAAe9kC,GAAO,KAAO6kC,GAAgBnZ,EAAQ,EACrEz6D,GAAM+uC,GAAO,IACbolC,GAAO,KAAK,IAAI,GAAInrB,GAAK,EAAI6qB,EAAa,GAG5Ch0E,GAAO,KAAK,IAAIg0E,GAAe,KAAK,IAAI9qB,GAAK8qB,GAAgBpZ,GAAU56D,EAAI,CAAC,EAC5EG,GAAM,KAAK,IAAI6zE,GAAe,KAAK,IAAI7qB,GAAK6qB,GAAgB,GAAI7zE,EAAG,CAAC,EAEpEuyE,GAAe,MAAM,MAAQ,GAAG,KAAK,IAAI9X,GAAU1R,GAAK,EAAI8qB,EAAa,CAAC,KAC1EtB,GAAe,MAAM,KAAO,GAAG1yE,EAAI,KACnC0yE,GAAe,MAAM,IAAM,GAAGvyE,EAAG,KAEjC,MAAM+6D,GAAc9uB,KAAc,MAAQ,KAAK,IAAI4nC,GAAe9kC,GAAO,IAAM6kC,EAAa,EAAI5qB,GAAK6qB,GAC/F7Y,GAAa,KAAK,IAAI,IAAKD,GAAc/6D,EAAG,EAClDwyE,GAAoB,MAAM,UAAY,GAAG,KAAK,IAAIyB,GAAkBjZ,EAAU,CAAC,KAC/E+X,GAAY,MAAM,UAAY,EAChC,EAEMqB,GAAsB,IAAM,CAChC7B,GAAe,OAAS,EAC1B,EAEM8B,GAA2B/yB,IAAM,CACrC,MAAM3nG,GAAS2nG,GAAE,OACbixB,GAAe,QACf54H,KAAW44H,GAAe,SAAS54H,EAAM,GAAKw4H,GAAc,SAASx4H,EAAM,IAC/Ey6H,GAAA,CACF,EAEA,IAAIE,GAAyB,GAC7B,MAAMC,GAA0B,IAAM,CAChCD,KACJA,GAAyB,GACzB,sBAAsB,IAAM,CAC1BA,GAAyB,GACzBJ,GAAA,CACF,CAAC,EACH,EAEMM,GAAsBlzB,IAAM,CAChC,GAAIixB,GAAe,OAAQ,OAC3B,MAAM54H,GAAS2nG,IAAG,OACd3nG,IAAU64H,GAAoB,SAAS74H,EAAM,GACjD46H,GAAA,CACF,EACME,GAAkB,IAAMF,GAAA,EAE9B,SAAS,iBAAiB,cAAeF,GAAyB,EAAI,EACtE,SAAS,iBAAiB,SAAUG,GAAoB,EAAI,EAC5D,OAAO,iBAAiB,SAAUC,EAAe,EACjDxB,EAAuB,IAAM,SAAS,oBAAoB,cAAeoB,GAAyB,EAAI,CAAC,EACvGpB,EAAuB,IAAM,SAAS,oBAAoB,SAAUuB,GAAoB,EAAI,CAAC,EAC7FvB,EAAuB,IAAM,OAAO,oBAAoB,SAAUwB,EAAe,CAAC,EAElF,MAAMC,GAAqB,CAAC,CAAE,UAAAxZ,EAAA,EAAc,CAAA,IAAO,CACjDqX,GAAe,OAAS,GACxBG,GAAc,MAAQxX,IAAa,KAAO,OAAOA,EAAS,EAAI,GAC9DyY,GAAqBjB,GAAc,KAAK,EACxCwB,GAAA,EACA,eAAe,IAAMxB,GAAc,OAAO,CAC5C,EAEMiC,GAAwB,IAAMD,GAAA,EAC9BE,GAAwB,IAAMF,GAAA,EAC9BG,GAA2BvzB,IAAM,CACrC,GAAIA,GAAE,MAAQ,SAAWA,GAAE,MAAQ,IAAK,CACtCA,GAAE,eAAA,EACFozB,GAAA,EACA,MACF,CACIpzB,GAAE,KAAOA,GAAE,IAAI,SAAW,GAAK,CAACA,GAAE,SAAW,CAACA,GAAE,SAAW,CAACA,GAAE,SAChEA,GAAE,eAAA,EACFozB,GAAmB,CAAE,UAAWpzB,GAAE,GAAA,CAAK,EAE3C,EAEA8wB,GAAe,iBAAiB,QAASuC,EAAqB,EAC9DrC,GAAe,iBAAiB,QAASsC,EAAqB,EAC9DxC,GAAe,iBAAiB,UAAWyC,EAAuB,EAClE5B,EAAuB,IAAMb,GAAe,oBAAoB,QAASuC,EAAqB,CAAC,EAC/F1B,EAAuB,IAAMX,GAAe,oBAAoB,QAASsC,EAAqB,CAAC,EAC/F3B,EAAuB,IAAMb,GAAe,oBAAoB,UAAWyC,EAAuB,CAAC,EAEnG,MAAMC,EAAkB,IAAM,CAC5BnB,GAAqBjB,GAAc,KAAK,EACxCwB,GAAA,CACF,EACAxB,GAAc,iBAAiB,QAASoC,CAAe,EACvD7B,EAAuB,IAAMP,GAAc,oBAAoB,QAASoC,CAAe,CAAC,EAExF,MAAMC,GAAsB,IAAM,CAChCpC,GAAsB,CAACA,GACvBG,GAAA,EACA,MAAMtJ,GAAW0F,GAAA,EACjB1F,GAAS,YAAY,aAAemJ,GACpCxD,GAAkB3F,EAAQ,EAC1B6J,GAAqBD,EAAmB,EACxChC,GAAc,CAAE,aAAc,GAAM,EACpCuC,GAAqBjB,GAAc,KAAK,EACxCwB,GAAA,EACA1N,GAAS,EAAI,CACf,EACAqM,GAAmB,iBAAiB,QAASkC,EAAmB,EAChE9B,EAAuB,IAAMJ,GAAmB,oBAAoB,QAASkC,EAAmB,CAAC,EAEjG,MAAMC,GAA0B1zB,IAAM,CAKpC,GAJIA,GAAE,MAAQ,WACZ8yB,GAAA,EACAhC,GAAe,MAAA,GAEb9wB,GAAE,MAAQ,UAAYoxB,GAAc,OAAS,IAAI,OAAQ,CAC3D0B,GAAA,EACA,MAAMhd,GAAQ,OAAOsb,GAAc,OAAS,EAAE,EAAE,KAAA,EAC5CR,GAAe,MAAM,IAAI9a,EAAK,MAAsBA,EAAK,CAC/D,CACF,EACAsb,GAAc,iBAAiB,UAAWsC,EAAsB,EAChE/B,EAAuB,IAAMP,GAAc,oBAAoB,UAAWsC,EAAsB,CAAC,EAEjG,MAAMC,GAAoB,IAAM,CAC9B,eAAe,IAAM,CACf,CAAC9C,GAAc,SAAS,SAAS,aAAa,GAAK,CAACI,GAAe,SAAS,SAAS,aAAa,GACpG6B,GAAA,CAEJ,CAAC,CACH,EACAjC,GAAc,iBAAiB,WAAY8C,EAAiB,EAC5DhC,EAAuB,IAAMd,GAAc,oBAAoB,WAAY8C,EAAiB,CAAC,EAE7FrO,GAAgB,CACd,SAAU,CACR,UAAW9Z,MAAWkmB,GAAgB,OAAO,CAAC,EAC5C,GAAI,CACFlmB,GAAA,CACF,OAASpwG,GAAO,CACd,QAAQ,KAAK,mDAAoDA,EAAK,CACxE,CAEJ,CAAA,CACD,EAEDy1H,GAAc,YAAYC,EAAc,EACxCD,GAAc,YAAYG,EAAc,EAExC1M,EAAW,YAAY5G,EAAiB,CACtC,MAAO,UACP,KAAM,iEACN,SAAUmT,EAAA,CACX,EAAE,GAAG,EAENH,GAAqB,SAAS,cAAc,QAAQ,EACpDA,GAAmB,KAAO,SAC1BA,GAAmB,UAAY,6CAC/BA,GAAmB,YAAc,gBACjCA,GAAmB,iBAAiB,QAAS,IAAM,CACjDZ,GAAc,CAAE,aAAc,GAAM,EACpCpJ,GAAA,CACF,CAAC,CACH,CAEA,MAAMkN,GAAiBlE,GAAA,EACjBpkD,GAAS,MAAM,QAAQrpE,EAAM,QAAQ,MAAM,EAAIA,EAAM,QAAQ,OAAS,CAAA,EACtE8kE,GAAQ,MAAM,QAAQ9kE,EAAM,QAAQ,KAAK,EAAIA,EAAM,QAAQ,MAAQ,CAAA,EAEnEymE,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,MAAM,QAAU,OACrBA,GAAK,MAAM,IAAM,MACjBA,GAAK,MAAM,MAAQ,OACnBkrD,GAAe,QAAQ,CAACrvG,GAAO+qD,KAAQ,CACrC,MAAM71B,GAAM,SAAS,cAAc,KAAK,EACxCA,GAAI,MAAM,QAAU,OACpBA,GAAI,MAAM,oBAAsB,2BAChCA,GAAI,MAAM,WAAa,SACvBA,GAAI,MAAM,IAAM,MAEhB,MAAMo6E,GAAY,SAAS,cAAc,KAAK,EAC9CA,GAAU,MAAM,QAAU,OAC1BA,GAAU,MAAM,IAAM,MACtBA,GAAU,MAAM,SAAW,IAC3BA,GAAU,MAAM,UAAY,QAC5BA,GAAU,MAAM,aAAe,MAC/B,MAAMpJ,GAAU,SAAS,cAAc,KAAK,EAC5CA,GAAQ,UAAY,qBACpBA,GAAQ,YAAclmG,GAAM,OAAS,IAAIA,GAAM,EAAE,GACjDkmG,GAAQ,MAAQ,GAAGlmG,GAAM,OAASA,GAAM,EAAE,QAAQA,GAAM,EAAE,IAC1D,MAAMuvG,GAAU,SAAS,cAAc,KAAK,EAC5CA,GAAQ,MAAM,SAAW,OACzBA,GAAQ,MAAM,MAAQ,yBACtBA,GAAQ,YAAc,UAAUvvG,GAAM,OAAS,CAAC,GAChDsvG,GAAU,YAAYpJ,EAAO,EAC7BoJ,GAAU,YAAYC,EAAO,EAE7B,MAAMC,IAAe,IAAM,CACzB,GAAI1U,GACF,OAAO4G,GAAsB,CAC3B,MAAO,KACP,MAAOl/C,GAAMuI,EAAG,GAAKqsC,GAAersC,EAAG,EACvC,SAAWlhD,IAAM,CACf,MAAM4lG,GAAa1oD,GAAO,MAAA,EACpB2oD,GAAYltD,GAAM,MAAA,EACxBitD,GAAW1kD,EAAG,EAAI/qD,GAAM,GACxB0vG,GAAU3kD,EAAG,EAAIlhD,GACjBnsB,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,cAAe,OAAQ+xH,GAAY,MAAOC,EAAA,EACpF/O,GAAS,EAAI,CACf,EACA,QAAS,EAAA,CACV,EAEH,MAAMt4F,GAAMm6C,GAAMuI,EAAG,EACf06C,GAAS,OAAO,SAAS,OAAOp9F,EAAG,CAAC,EAAI,OAAOA,EAAG,EAAKijG,GAAoB+D,GAAe,MAAM,EAAEtkD,EAAG,GAAK25C,GAC1GzgB,GAAW,IAAIiB,GAAwB,CAC3C,MAAOugB,GACP,UAAW,CAACf,GAAYC,EAAU,EAClC,KAAMyG,GACN,SAAU1G,GACV,SAAUC,GACV,SAAW96F,IAAM,CACf,MAAMpvB,GAAI66G,GAAYzrF,GAAG,CAAE,IAAK66F,GAAY,IAAKC,GAAY,EAC7D,GAAIlqH,IAAK,KAAM,OACf,MAAMg1H,GAAa1oD,GAAO,MAAA,EACpB2oD,EAAYltD,GAAM,MAAA,EACxBitD,GAAW1kD,EAAG,EAAI/qD,GAAM,GACxB0vG,EAAU3kD,EAAG,EAAItwE,GACjBiD,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,cAAe,OAAQ+xH,GAAY,MAAOC,CAAA,EACpF/O,GAAS,EAAI,CACf,CAAA,CACD,EACD,OAAAI,GAAgB9c,EAAQ,EACxBA,GAAS,QAAQ,MAAM,SAAW,QAClCA,GAAS,QAAQ,MAAM,IAAM,MAC7BA,GAAS,MAAM,MAAM,SAAW,OAChCA,GAAS,MAAM,MAAM,OAAS,OACvBA,GAAS,OAClB,GAAA,EAEM0rB,GAAU,SAAS,cAAc,KAAK,EAC5CA,GAAQ,MAAM,QAAU,OACxBA,GAAQ,MAAM,IAAM,OACpBA,GAAQ,MAAM,MAAQ,OACtB,MAAMn1E,GAAK,SAAS,cAAc,QAAQ,EAC1CA,GAAG,KAAO,SACVA,GAAG,UAAY,6CACfA,GAAG,YAAc,IACjBA,GAAG,SAAWuwB,KAAQ,EACtB,MAAM6kD,GAAO,SAAS,cAAc,QAAQ,EAC5CA,GAAK,KAAO,SACZA,GAAK,UAAY,6CACjBA,GAAK,YAAc,IACnBA,GAAK,SAAW7kD,KAAQskD,GAAe,OAAS,EAChD70E,GAAG,MAAM,QAAU,UACnBo1E,GAAK,MAAM,QAAU,UACrBp1E,GAAG,MAAM,WAAa,IACtBo1E,GAAK,MAAM,WAAa,IACxBp1E,GAAG,MAAM,SAAW,IACpBo1E,GAAK,MAAM,SAAW,IACtBp1E,GAAG,MAAM,OAAS,OAClBo1E,GAAK,MAAM,OAAS,OACpBp1E,GAAG,MAAM,OAAS,OAClBo1E,GAAK,MAAM,OAAS,OACpBp1E,GAAG,MAAM,WAAa,cACtBo1E,GAAK,MAAM,WAAa,cACxBp1E,GAAG,MAAM,OAAS,UAClBo1E,GAAK,MAAM,OAAS,UACpBp1E,GAAG,MAAM,MAAQ,wBACjBo1E,GAAK,MAAM,MAAQ,wBACnBp1E,GAAG,MAAM,QAAUA,GAAG,SAAW,MAAQ,IACzCo1E,GAAK,MAAM,QAAUA,GAAK,SAAW,MAAQ,IAC7C,MAAMC,GAAQ94H,IAAU,CACtB,MAAM04H,GAAa1oD,GAAO,MAAA,EACpB2oD,GAAYltD,GAAM,MAAA,EAClB31D,GAAIk+D,GACJj+D,GAAIi+D,GAAMh0E,GAChB,CAAC04H,GAAW5iH,EAAC,EAAG4iH,GAAW3iH,EAAC,CAAC,EAAI,CAAC2iH,GAAW3iH,EAAC,EAAG2iH,GAAW5iH,EAAC,CAAC,EAC9D,CAAC6iH,GAAU7iH,EAAC,EAAG6iH,GAAU5iH,EAAC,CAAC,EAAI,CAAC4iH,GAAU5iH,EAAC,EAAG4iH,GAAU7iH,EAAC,CAAC,EAC1D,MAAM82G,GAAW0F,GAAA,EACjB1F,GAAS,YAAY,UAAY,SACjCjmH,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,cAAe,OAAQ+xH,GAAY,MAAOC,GAAW,KAAM/L,EAAA,EACrGhD,GAAS,EAAI,EACbwB,GAAA,CACF,EACA3nE,GAAG,iBAAiB,QAAS,IAAMq1E,GAAK,EAAE,CAAC,EAC3CD,GAAK,iBAAiB,QAAS,IAAMC,GAAK,CAAC,CAAC,EAC5CF,GAAQ,YAAYn1E,EAAE,EACtBm1E,GAAQ,YAAYC,EAAI,EAExB16E,GAAI,YAAYo6E,EAAS,EACzBp6E,GAAI,YAAYs6E,EAAW,EAC3Bt6E,GAAI,YAAYy6E,EAAO,EACvBxrD,GAAK,YAAYjvB,EAAG,CACtB,CAAC,EAED,MAAMmoC,GAAa,IAAI,IAAIgyC,GAAe,IAAKrvG,IAAUA,GAAM,EAAE,CAAC,EAClE,IAAI8vG,GAAc,EAClB,UAAW9vG,MAAS1I,GACb+lE,GAAW,IAAIr9D,GAAM,EAAE,IAAG8vG,IAAe,OAAO9vG,GAAM,OAAS,CAAC,GAAK,GAE5E,MAAM+vG,GAAcD,GACdE,GAAY,SAAS,cAAc,KAAK,EAC9CA,GAAU,MAAM,QAAU,OAC1BA,GAAU,MAAM,oBAAsB,2BACtCA,GAAU,MAAM,WAAa,SAC7BA,GAAU,MAAM,IAAM,MAEtB,MAAMC,GAAkB,SAAS,cAAc,KAAK,EACpDA,GAAgB,MAAM,QAAU,OAChCA,GAAgB,MAAM,IAAM,MAC5BA,GAAgB,MAAM,SAAW,IACjCA,GAAgB,MAAM,UAAY,QAClCA,GAAgB,MAAM,aAAe,MACrC,MAAMC,GAAc,SAAS,cAAc,KAAK,EAChDA,GAAY,UAAY,qBACxBA,GAAY,YAAc,SAC1BA,GAAY,MAAQ,mBACpB,MAAMC,GAAgB,SAAS,cAAc,KAAK,EAClDA,GAAc,MAAM,SAAW,OAC/BA,GAAc,MAAM,MAAQ,yBAC5BA,GAAc,YAAc,UAAUJ,EAAW,GACjDE,GAAgB,YAAYC,EAAW,EACvCD,GAAgB,YAAYE,EAAa,EAEzC,MAAMC,IAAgB,IAAM,CAC1B,GAAItV,GACF,OAAO4G,GAAsB,CAC3B,MAAO,KACP,MAAO,OAAOhkH,EAAM,QAAQ,cAAiB,SAAWA,EAAM,QAAQ,aAAe,YACrF,SAAWmsB,IAAM,CACfnsB,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,cAAe,aAAcmsB,EAAA,EACvE82F,GAAS,EAAI,CACf,EACA,QAAS,EAAA,CACV,EAEH,MAAM1uH,GAAW,OAAO,SAAS,OAAOyL,EAAM,QAAQ,YAAY,CAAC,EAC/D,OAAOA,EAAM,QAAQ,YAAY,EACjCgnH,GACEzgB,GAAW,IAAIiB,GAAwB,CAC3C,MAAOjzG,GACP,UAAW,CAACyyH,GAAYC,EAAU,EAClC,KAAMyG,GACN,SAAU1G,GACV,SAAUC,GACV,SAAW96F,IAAM,CACf,MAAMpvB,GAAI66G,GAAYzrF,GAAG,CAAE,IAAK66F,GAAY,IAAKC,GAAY,EACzDlqH,IAAK,OACTiD,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,cAAe,aAAcjD,EAAA,EACvEkmH,GAAS,EAAI,EACf,CAAA,CACD,EACD,OAAAI,GAAgB9c,EAAQ,EACxBA,GAAS,QAAQ,MAAM,SAAW,QAClCA,GAAS,QAAQ,MAAM,IAAM,MAC7BA,GAAS,MAAM,MAAM,SAAW,OAChCA,GAAS,MAAM,MAAM,OAAS,OACvBA,GAAS,OAClB,GAAA,EAEMosB,GAAe,SAAS,cAAc,KAAK,EACjDA,GAAa,MAAM,MAAQ,OAC3BA,GAAa,MAAM,OAAS,OAE5BL,GAAU,YAAYC,EAAe,EACrCD,GAAU,YAAYI,EAAY,EAClCJ,GAAU,YAAYK,EAAY,EAClClsD,GAAK,YAAY6rD,EAAS,EAE1B,MAAMM,GAAW,SAAS,cAAc,KAAK,EAC7CA,GAAS,MAAM,UAAY,QAC3BA,GAAS,MAAM,UAAY,OAC3BA,GAAS,MAAM,aAAe,MAC9BA,GAAS,YAAYnsD,EAAI,EAEzB0nD,GAAY,MAAM,SAAW,QAC7BA,GAAY,MAAM,MAAQ,OAC1BA,GAAY,MAAM,OAAS,OAC3BG,GAAS,MAAM,SAAW,QAC1BA,GAAS,MAAM,OAAS,OAExB,IAAIuE,GAAmB,KAClBzV,KACHyV,GAAmB,SAAS,cAAc,QAAQ,EAClDA,GAAiB,KAAO,SACxBA,GAAiB,UAAY,6CAC7BA,GAAiB,YAAc,aAC/BA,GAAiB,iBAAiB,QAAS,IAAM,CAC/ChF,GAAc,CAAE,aAAc,GAAM,EACpCpJ,GAAA,CACF,CAAC,GAGH,MAAMqO,GAAoB5Q,EAAuB,CAC/C,MAAO,aACP,QAAS,yDACT,OAAQ9E,GAAiBqR,GAAqBoE,EAAA,CAC/C,EACKE,GAAc,SAAS,cAAc,KAAK,EAChDA,GAAY,MAAM,QAAU,OAC5BA,GAAY,MAAM,IAAM,MACxBA,GAAY,MAAM,MAAQ,OAE1B,MAAMC,GAAS,SAAS,cAAc,KAAK,EAmB3C,GAlBAA,GAAO,MAAM,QAAU,OACvBA,GAAO,MAAM,oBAAsB,sBACnCA,GAAO,MAAM,IAAM,MACnBA,GAAO,MAAM,WAAa,MAC1BA,GAAO,YAAYzE,GAAsB,CACvC,MAAO,QACP,KAAM,kFACN,QAASJ,GACT,WAAY,EAAA,CACb,CAAC,EACF6E,GAAO,YAAYzE,GAAsB,CACvC,MAAO,MACP,KAAM,oGACN,QAASF,GACT,WAAY,EAAA,CACb,CAAC,EACF0E,GAAY,YAAYC,EAAM,EAE1B,CAAC5V,GAAgB,CACnB,KAAM,CAAE,IAAK6V,GAAY,IAAKC,GAAY,UAAWC,EAAA,EAAqBxF,GAAA,EACpEjE,GAAY,SAAS,cAAc,KAAK,EAC9CA,GAAU,MAAM,QAAU,OAC1BA,GAAU,MAAM,IAAM,MACtBA,GAAU,MAAM,WAAa,SAC7B,MAAM0J,GAAW,SAAS,cAAc,OAAO,EAC/CA,GAAS,KAAO,SAChBA,GAAS,UAAY,mBACrBA,GAAS,MAAQ,OAAOH,EAAU,EAClC,MAAM3E,GAAW,SAAS,cAAc,OAAO,EAC/CA,GAAS,KAAO,SAChBA,GAAS,UAAY,mBACrBA,GAAS,MAAQ,OAAO4E,EAAU,EAClCE,GAAS,MAAM,SAAW,OAC1B9E,GAAS,MAAM,SAAW,OAC1B8E,GAAS,MAAM,OAAS,OACxB9E,GAAS,MAAM,OAAS,OAExB,MAAM+E,GAAqB,IAAM,CAC/B,MAAMC,GAAS1b,GAAYwb,GAAS,KAAK,EACnC/iE,GAASunD,GAAY0W,GAAS,KAAK,EACnCrI,GAAW0F,GAAA,EACb,OAAO,SAAS2H,EAAM,GAAK,OAAO,SAASjjE,EAAM,EACnD41D,GAAS,YAAY,aAAe,CAACqN,GAAQjjE,EAAM,EAEnD41D,GAAS,YAAY,aAAe,KAEtC2F,GAAkB3F,EAAQ,CAC5B,EACAmN,GAAS,iBAAiB,SAAU,IAAM,CACxCC,GAAA,CACF,CAAC,EACD/E,GAAS,iBAAiB,SAAU,IAAM,CACxC+E,GAAA,CACF,CAAC,EACD3J,GAAU,YAAY0J,EAAQ,EAC9B1J,GAAU,YAAY4E,EAAQ,EAE9B,MAAMiF,GAAkB,SAAS,cAAc,QAAQ,EACvDA,GAAgB,UAAY,mBAC5B,MAAMC,GAAS,SAAS,cAAc,QAAQ,EAC9CA,GAAO,MAAQ,MACfA,GAAO,YAAc,YACrB,MAAMC,GAAU,SAAS,cAAc,QAAQ,EAC/CA,GAAQ,MAAQ,OAChBA,GAAQ,YAAc,aACtBF,GAAgB,YAAYC,EAAM,EAClCD,GAAgB,YAAYE,EAAO,EACnCF,GAAgB,MAAQJ,GACxBI,GAAgB,MAAM,SAAW,QACjCA,GAAgB,MAAM,OAAS,OAC/BA,GAAgB,iBAAiB,SAAU,IAAM,CAC/C,MAAMtN,GAAW0F,GAAA,EACjB1F,GAAS,YAAY,iBAAmBsN,GAAgB,QAAU,OAAS,OAAS,MACpF3H,GAAkB3F,EAAQ,CAC5B,CAAC,EAED,MAAMyN,GAAa,SAAS,cAAc,KAAK,EAC/CA,GAAW,MAAM,QAAU,OAC3BA,GAAW,MAAM,oBAAsB,sBACvCA,GAAW,MAAM,IAAM,MACvBA,GAAW,MAAM,WAAa,MAC9BA,GAAW,YAAYnF,GAAsB,CAC3C,MAAO,QACP,KAAM,gDACN,QAAS7E,GACT,WAAY,EAAA,CACb,CAAC,EACFgK,GAAW,YAAYnF,GAAsB,CAC3C,MAAO,YACP,KAAM,sDACN,QAASgF,GACT,WAAY,EAAA,CACb,CAAC,EACFR,GAAY,YAAYW,EAAU,CACpC,CACAX,GAAY,YAAYH,EAAQ,EAChCE,GAAkB,KAAK,YAAYC,EAAW,EAC9C1Q,EAAW,YAAYyQ,GAAkB,IAAI,CAE/C,CAED,GAAI1N,KAAgB,WAAY,CAC9BplH,EAAM,QAAU8jH,GAAkB9jH,EAAM,OAAO,EAEhD,MAAM0oH,GAAgB,SAAS,cAAc,KAAK,EAClDA,GAAc,MAAM,QAAU,OAC9BA,GAAc,MAAM,IAAM,MAC1BA,GAAc,MAAM,WAAa,SACjCA,GAAc,MAAM,MAAQ,OAE5B,MAAMC,GAAkB,SAAS,cAAc,QAAQ,EACvDA,GAAgB,UAAY,mBAC5BA,GAAgB,MAAM,KAAO,WAC7BA,GAAgB,MAAM,SAAW,OACjCA,GAAgB,MAAM,SAAW,IACjC,UAAWC,KAAU,CAAC,SAAU,MAAO,QAAS,QAAS,QAAS,YAAY,EAAG,CAC/E,MAAM3K,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQ2K,GACZ3K,GAAI,YAAcsD,EAAqBqH,EAAM,EAC7CD,GAAgB,YAAY1K,EAAG,CACjC,CACA,MAAM4K,GAAwB7oH,EAAM,QAAQ,gBAAkB,WAC1D,aACCA,EAAM,QAAQ,eAAiB,SACpC2oH,GAAgB,MAAQ,OAAOE,EAAqB,EAEpD,MAAMC,GAAa,SAAS,cAAc,OAAO,EACjDA,GAAW,KAAO,SAClBA,GAAW,UAAY,mBACvBA,GAAW,MAAM,SAAW,OAC5BA,GAAW,MAAM,KAAO,WACxBA,GAAW,MAAQ,OAAO,OAAO,SAAS,OAAO9oH,EAAM,QAAQ,cAAc,CAAC,EAAIA,EAAM,QAAQ,eAAiB,CAAC,EAClH8oH,GAAW,OAASH,GAAgB,QAAU,QAE9CA,GAAgB,iBAAiB,SAAU,IAAM,CAC/C,MAAMnD,GAAWmD,GAAgB,OAAS,SACpCI,GAAW/oH,EAAM,QAAQ,eAAiB,SAChD8oH,GAAW,OAAStD,KAAa,QACjC,MAAMwD,GAAc,CAAE,GAAGhpH,EAAM,QAAS,KAAM,WAAY,cAAewlH,EAAA,EACzE,GAAIlE,GAAsBkE,EAAQ,EAChCwD,GAAY,OAAS,CAAC,EAAG,CAAC,EAC1BjI,GAAeiI,GAAa,EAAI,UACvB1H,GAAsByH,EAAQ,EAAG,CAC1C,MAAMjpG,GAAO,OAAO9f,EAAM,QAAQ,YAAe,SAAWA,EAAM,QAAQ,WAAa,KACvFgpH,GAAY,OAASlpG,GAAOm/F,EAA0B7pH,EAAM0qB,EAAI,EAAI,CAAC,EAAG,CAAC,EACzEihG,GAAeiI,GAAa,EAAI,CAClC,CACAhpH,EAAM,QAAUgpH,GACZxD,KAAa,QACfxlH,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,eAAgB,MAAA,EAEtEA,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,eAAgB,OAAO8oH,GAAW,KAAK,GAAK,CAAA,EAEpG7F,GAAS,EAAI,EACbwB,GAAA,CACF,CAAC,EAEDqE,GAAW,iBAAiB,SAAU,IAAM,CAC1C,MAAM98C,GAAI4rC,GAAYkR,GAAW,KAAK,EAClC98C,IAAK,OACThsE,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,cAAe,QAAS,eAAgBgsE,EAAA,EAC9Fi3C,GAAS,EAAI,EACbwB,GAAA,EACF,CAAC,EAEDiE,GAAc,YAAYC,EAAe,EACzCD,GAAc,YAAYI,EAAU,EACpCzG,EAAW,YAAY5G,EAAiB,CACtC,MAAO,YACP,KAAM,sDACN,SAAUiN,EAAA,CACX,EAAE,GAAG,EAEN,MAAMiL,GAAiB,IAAIlf,GAAsB,CAC/C,QAASmH,EACT,WAAYR,GAAI,WAAa,SAAS,KACtC,MAAOp7G,EAAM,QAAQ,UAAY,qBACjC,cAAe,qBACf,kBAAmB,iDACnB,SAAWvI,IAAQ,CACjBuI,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,SAAUvI,EAAA,EAChEwrH,GAAS,EAAI,CACf,CAAA,CACD,EACDI,GAAgBsQ,EAAc,EAE9BtR,EAAW,YAAY5G,EAAiB,CACtC,MAAO,WACP,KAAM,iDACN,SAAUkY,GAAe,OAAA,CAC1B,EAAE,GAAG,EAEN,MAAM1K,GAAa,SAAS,cAAc,KAAK,EAC/CA,GAAW,MAAM,QAAU,OAC3BA,GAAW,MAAM,IAAM,MACvBA,GAAW,MAAM,MAAQ,OAEzB,MAAMC,GAAa,OAAOlpH,EAAM,QAAQ,YAAe,SAAWA,EAAM,QAAQ,WAAa,KACvF8rE,GAAgB9rE,EAAM,QAAQ,eAAiB,SAC/CmpH,GAAa7H,GAAsBx1C,EAAa,EAChD8nD,GAAiB,CAACzK,GAClBnkC,EAAY,EAAQhlF,EAAM,QAAQ,WAAc4zH,GAChD1U,GAASiK,GAAa,CAAE,IAAK,EAAG,IAAK,GAAMvK,EAAoBxpH,EAAM8zH,EAAU,EAC/EtqH,GAAMsgH,IAAQ,KAAO,EACrBl7G,GAAMk7G,IAAQ,KAAO,EACrB2U,GAAY7uC,EAAY,KAAK,IAAI,KAAK,IAAIpmF,EAAG,EAAG,KAAK,IAAIoF,EAAG,EAAG,CAAC,EAAI,KACpE4lH,GAAY5kC,EAAY,CAAC6uC,GAAYj1H,GACrCirH,GAAY7kC,EAAY6uC,GAAY7vH,GACpColH,GAAkB,EAAQlK,IAAQ,UAClC/7D,GAAOgmE,GAAa,IAAOhI,GAAoByI,GAAWC,GAAWT,EAAe,EAE1F,GAAID,KAAe,CAACjI,GAAmBlhH,EAAM,QAAQ,MAAM,GAAKA,EAAM,QAAQ,OAAO,CAAC,IAAM,GAAKA,EAAM,QAAQ,OAAO,CAAC,IAAM,GAAI,CAC/H,MAAMgpH,GAAc,CAAE,GAAGhpH,EAAM,QAAS,KAAM,WAAY,OAAQ,CAAC,EAAG,CAAC,CAAA,EACvE+gH,GAAeiI,GAAa,EAAI,EAChChpH,EAAM,QAAUgpH,EAClB,SAAW,CAAC9H,GAAmBlhH,EAAM,QAAQ,MAAM,GAAKkpH,GAAY,CAClE,MAAM6I,GAAa/sC,EAAYpY,GAAuB,CAAChuE,GAAKoF,EAAG,EAAGk7G,EAAM,EAAI,CAACtgH,GAAKoF,EAAG,EAC/EglH,GAAc,CAAE,GAAGhpH,EAAM,QAAS,KAAM,WAAY,OAAQ+xH,EAAA,EAClEhR,GAAeiI,GAAa,EAAI,EAChChpH,EAAM,QAAUgpH,EAClB,SAAWhkC,GAAak8B,GAAmBlhH,EAAM,QAAQ,MAAM,EAAG,CAChE,MAAMgpH,GAAc,CAAE,GAAGhpH,EAAM,QAAS,KAAM,WAAY,OAAQ4sE,GAAuB5sE,EAAM,QAAQ,OAAQk/G,EAAM,CAAA,EACrH6B,GAAeiI,GAAa,EAAK,EACjChpH,EAAM,QAAUgpH,EAClB,CAEA,MAAM3/C,GAAS63C,GAAmBlhH,EAAM,QAAQ,MAAM,EAClDA,EAAM,QAAQ,OACbglF,EAAYpY,GAAuB,CAAChuE,GAAKoF,EAAG,EAAGk7G,EAAM,EAAI,CAACtgH,GAAKoF,EAAG,EAEjEqlH,GAAmB,CAACF,IAAc5N,GAAqB2N,GACzD5I,EAAqB,CACrB,IAAA1hH,GACA,IAAAoF,GACA,MAAOqlE,GACP,MAAOj0E,EACP,QAAS8zH,EAAA,CACV,EACC,KACAG,IAAiBJ,GAAW,YAAYI,GAAgB,OAAO,EAEnE,MAAM5iB,GAAS,IAAIkK,GAAe,CAChC,IAAKiZ,GACL,IAAKC,GACL,KAAA1mE,GACA,MAAOkmB,GACP,eAAgB,CAAC2b,EACjB,SAAWluF,IAAS,CAClB,MAAM8uH,GAAa,MAAM,QAAQ5lH,EAAM,QAAQ,MAAM,EAAIA,EAAM,QAAQ,OAASqpE,GAChF,IAAI0oD,GAAa/sC,EAAYy8B,GAAiC3qH,GAAM8uH,EAAU,EAAI9uH,GAC9EsyH,KACF2I,GAAa,CAAC,KAAK,MAAMA,GAAW,CAAC,CAAC,EAAG,KAAK,MAAMA,GAAW,CAAC,CAAC,CAAC,GAEpE,MAAM/I,GAAc,CAAE,GAAGhpH,EAAM,QAAS,KAAM,WAAY,OAAQ+xH,EAAA,EAClEhR,GAAeiI,GAAa,EAAK,EACjChpH,EAAM,QAAUgpH,GAChB/F,GAAS,EAAI,EACbz5C,GAAG,MAAQ,OAAOuoD,GAAW,CAAC,CAAC,EAC/BtoD,GAAG,MAAQ,OAAOsoD,GAAW,CAAC,CAAC,EAC3B/sC,IACFyhB,GAAO,OAAO,MAAQ,OAAOsrB,GAAW,CAAC,CAAC,EAC1CtrB,GAAO,OAAO,MAAQ,OAAOsrB,GAAW,CAAC,CAAC,EAC1CtrB,GAAO,UAAUsrB,GAAW,CAAC,EAAGA,GAAW,CAAC,CAAC,GAE/C1I,IAAiB,WAAW0I,GAAW,CAAC,EAAGA,GAAW,CAAC,CAAC,CAC1D,CAAA,CACD,EACD1O,GAAgB5c,EAAM,EAEtB,MAAMtgG,GAAS,SAAS,cAAc,KAAK,EAC3CA,GAAO,UAAY,2BACnB,MAAMqjE,GAAK,SAAS,cAAc,OAAO,EACzCA,GAAG,KAAO,SACVA,GAAG,UAAY,mBACfA,GAAG,MAAM,SAAW,OACpB,MAAMC,GAAK,SAAS,cAAc,OAAO,EACzCA,GAAG,KAAO,SACVA,GAAG,UAAY,mBACfA,GAAG,MAAM,SAAW,OAEpBD,GAAG,MAAQ,OAAOH,GAAO,CAAC,GAAKzqE,EAAG,EAClC6qE,GAAG,MAAQ,OAAOJ,GAAO,CAAC,GAAKrlE,EAAG,EAElC,MAAMulH,GAAoB,IAAM,CAC9B,MAAMp6G,GAAIyoG,GAAYpuC,GAAG,KAAK,EACxBp6D,GAAIwoG,GAAYnuC,GAAG,KAAK,EAC9B,GAAIt6D,IAAK,MAAQC,IAAK,KAAM,OAC5B,IAAIs6D,GAAK,KAAK,IAAIv6D,GAAGC,EAAC,EAClBu6D,GAAK,KAAK,IAAIx6D,GAAGC,EAAC,EAClBg6G,KACF1/C,GAAK,KAAK,MAAMA,EAAE,EAClBC,GAAK,KAAK,MAAMA,EAAE,GAEpB,MAAMsD,GAAS+X,EAAY,KAAK,IAAI,KAAK,IAAItb,EAAE,EAAG,KAAK,IAAIC,EAAE,CAAC,EAAI,KAC5DooD,GAAa/sC,EAAY,CAAC,CAAC/X,GAAQA,EAAM,EAAI,CAACvD,GAAIC,EAAE,EACpD6/C,GAAW,KAAK,IAAII,GAAW,KAAK,IAAIC,GAAWkI,GAAW,CAAC,CAAC,CAAC,EACjEtI,GAAW,KAAK,IAAIG,GAAW,KAAK,IAAIC,GAAWkI,GAAW,CAAC,CAAC,CAAC,EACvEtrB,GAAO,OAAO,MAAQ,OAAO+iB,EAAQ,EACrC/iB,GAAO,OAAO,MAAQ,OAAOgjB,EAAQ,EACrChjB,GAAO,UAAU+iB,GAAUC,EAAQ,EACnC,MAAMT,GAAc,CAAE,GAAGhpH,EAAM,QAAS,KAAM,WAAY,OAAQ+xH,EAAA,EAClEhR,GAAeiI,GAAa,EAAK,EACjChpH,EAAM,QAAUgpH,GAChB/F,GAAS,EAAI,EACbz5C,GAAG,MAAQ,OAAOuoD,GAAW,CAAC,CAAC,EAC/BtoD,GAAG,MAAQ,OAAOsoD,GAAW,CAAC,CAAC,EAC/B1I,IAAiB,WAAW0I,GAAW,CAAC,EAAGA,GAAW,CAAC,CAAC,CAC1D,EACAvoD,GAAG,iBAAiB,SAAU+/C,EAAiB,EAC/C9/C,GAAG,iBAAiB,SAAU8/C,EAAiB,EAE/CpjH,GAAO,YAAYqjE,EAAE,EACrBrjE,GAAO,YAAYsjE,EAAE,EACrBw/C,GAAW,YAAYxiB,GAAO,OAAO,EACrCwiB,GAAW,YAAY9iH,EAAM,EAC7Bk8G,EAAW,YAAY5G,EAAiB,CACtC,MAAO,SACP,KAAM0N,GACF,kEACCnkC,EACC,4DACA,8DACN,SAAUikC,EAAA,CACX,EAAE,GAAG,EAEN,MAAMiB,GAAW,SAAS,cAAc,KAAK,EACvC4J,GAAiBtqB,GAAoB,CACzC,QAAS,EAAQxpG,EAAM,QAAQ,WAAc4zH,GAC7C,SAAU,CAACA,GACX,QAAS,KACT,SAAU,MACV,UAAW,+BAAA,CACZ,EAEKG,GAAavS,GAAsBxhH,EAAM,QAAQ,KAAK,EACtDg0H,GAAgBxqB,GAAoB,CACxC,QAASuqB,GAAW,IACpB,QAAS,KACT,SAAU,MACV,UAAW,wCAAA,CACZ,EACKE,GAAgBzqB,GAAoB,CACxC,QAASuqB,GAAW,IACpB,QAAS,KACT,SAAU,MACV,UAAW,wCAAA,CACZ,EAEKG,GAAYtc,GAAY53G,EAAM,QAAQ,OAAS,EAAG,CAAE,IAAK,EAAG,IAAK,CAAA,CAAG,GAAK,EACzEm0H,GAAgB,IAAI3sB,GAAwB,CAChD,MAAO0sB,GACP,UAAW,CAAC,EAAG,CAAC,EAChB,KAAM,IACN,SAAU,EACV,SAAU,EACV,SAAW/nG,IAAM,CACf,MAAMhd,GAAIyoG,GAAYzrF,GAAG,CAAE,IAAK,EAAG,IAAK,EAAG,EACvChd,IAAK,OACTnP,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAOmP,EAAA,EAC7D8zG,GAAS,EAAI,EACf,CAAA,CACD,EACDI,GAAgB8Q,EAAa,EAE7B,MAAMC,GAAc,IAAM,CACxB,MAAMC,GAAY,CAAE,IAAKL,GAAc,QAAS,IAAKC,GAAc,OAAA,EACnEj0H,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAOq0H,EAAA,EAC7DpR,GAAS,EAAI,CACf,EACA+Q,GAAc,iBAAiB,SAAUI,EAAW,EACpDH,GAAc,iBAAiB,SAAUG,EAAW,EAEpDN,GAAe,iBAAiB,SAAU,IAAM,CAC9C,MAAMQ,GAAgBR,GAAe,QAC/BS,GAAiBrL,GAAajK,EAA0B7pH,EAAM8zH,EAAU,EAAI,CAAC,EAAG,CAAC,EACjFv8C,GAAa,MAAM,QAAQ3sE,EAAM,QAAQ,MAAM,EAAIA,EAAM,QAAQ,OAASu0H,GAC1ExC,GAAauC,GAAgB1nD,GAAuBD,GAAYuyC,EAAM,EAAIqV,GAC1EvL,GAAc,CAAE,GAAGhpH,EAAM,QAAS,KAAM,WAAY,UAAWs0H,GAAe,OAAQvC,EAAA,EAC5FhR,GAAeiI,GAAa,EAAI,EAChChpH,EAAM,QAAUgpH,GAChB/F,GAAS,EAAI,EACbwB,GAAA,CACF,CAAC,EAEDyF,GAAS,YAAYzO,EAAiB,CACpC,MAAO,YACP,KAAMmY,GACF,8EACA,2DACJ,SAAUE,EAAA,CACX,EAAE,GAAG,EAEN5J,GAAS,YAAYzO,EAAiB,CACpC,MAAO,YACP,KAAM,8DACN,SAAUuY,EAAA,CACX,EAAE,GAAG,EACN9J,GAAS,YAAYzO,EAAiB,CACpC,MAAO,YACP,KAAM,+DACN,SAAUwY,EAAA,CACX,EAAE,GAAG,EACL/J,GAAS,YAAYzO,EAAiB,CACpC,MAAO,QACP,KAAM,yDACN,SAAU0Y,GAAc,OAAA,CACzB,EAAE,GAAG,EAEL,MAAMhK,GAAc,SAAS,cAAc,KAAK,EAChDA,GAAY,MAAM,QAAU,OAC5BA,GAAY,MAAM,IAAM,MACxBA,GAAY,MAAM,WAAa,SAC/BA,GAAY,MAAM,MAAQ,OAE1B,MAAME,GAAc,OAAOrqH,EAAM,QAAQ,cAAiB,SAAWA,EAAM,QAAQ,aAAe,YAC5Fw0H,GAAgBxQ,GAAsB,CAC1C,MAAO,KACP,MAAOqG,GACP,SAAWl+F,IAAM,CACfnsB,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,aAAcmsB,EAAA,CACtE,CAAA,CACD,EACDqoG,GAAc,MAAM,KAAO,WAC3BA,GAAc,MAAM,SAAW,IAE/B,MAAMlK,GAAe,SAAS,cAAc,QAAQ,EACpDA,GAAa,KAAO,SACpBA,GAAa,UAAY,6CACzBA,GAAa,YAAc,IAC3BA,GAAa,aAAa,aAAc,qBAAqB,EAC7DA,GAAa,iBAAiB,QAAS,IAAM,CAC3CtqH,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,aAAc,MAAA,EACpEijH,GAAS,EAAI,EACbwB,GAAA,CACF,CAAC,EACDjJ,EAAS,cAAc8O,GAAc,0BAA0B,EAE/DH,GAAY,YAAYqK,EAAa,EACrCrK,GAAY,YAAYG,EAAY,EAEpCJ,GAAS,YAAYzO,EAAiB,CACpC,MAAO,UACP,KAAM,gDACN,SAAU0O,EAAA,CACX,EAAE,GAAG,EAEN,MAAMI,GAAY,SAAS,cAAc,KAAK,EAC9CA,GAAU,MAAM,QAAU,OAC1BA,GAAU,MAAM,IAAM,MACtBA,GAAU,MAAM,MAAQ,OAExB,MAAMC,GAAY,SAAS,cAAc,KAAK,EAC9CA,GAAU,MAAM,QAAU,OAC1BA,GAAU,MAAM,IAAM,MACtBD,GAAU,YAAYC,EAAS,EAE/B,MAAMC,GAAkB,IAAM,CAC5BD,GAAU,YAAc,GACxB,MAAMnO,GAAQ,MAAM,QAAQr8G,EAAM,QAAQ,KAAK,EAAIA,EAAM,QAAQ,MAAQ,CAAA,EACzE,QAASxC,GAAI,EAAGA,GAAI6+G,GAAM,OAAQ7+G,IAAK,EAAG,CACxC,MAAMswE,GAAOuuC,GAAM7+G,EAAC,EACd8xC,GAAOw+B,IAAM,MAAQ,OAAOA,GAAK,MAAS,SAC5CA,GAAK,KACL,CAAE,GAAI,KAAM,IAAK,GAAI,IAAK,WAAA,EAExBlD,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,MAAM,QAAU,OACrBA,GAAK,MAAM,IAAM,MACjBA,GAAK,MAAM,SAAW,WACtBA,GAAK,MAAM,QAAU,MACrBA,GAAK,MAAM,aAAe,OAC1BA,GAAK,MAAM,aAAe,OAC1BA,GAAK,MAAM,OAAS,yEACpBA,GAAK,MAAM,WAAa,iEAExB,MAAMnuB,GAAM,SAAS,cAAc,KAAK,EACxCA,GAAI,MAAM,QAAU,OACpBA,GAAI,MAAM,IAAM,MAChBA,GAAI,MAAM,WAAa,SACvBA,GAAI,MAAM,oBAAsB,sBAEhC,MAAMiuE,GAAU,SAAS,cAAc,KAAK,EAC5CA,GAAQ,MAAM,QAAU,OACxBA,GAAQ,MAAM,oBAAsB,qCACpCA,GAAQ,MAAM,IAAM,MACpBA,GAAQ,MAAM,WAAa,SAC3BA,GAAQ,MAAM,SAAW,IAEzB,MAAMC,GAAW,SAAS,cAAc,QAAQ,EACjDA,GAAS,UAAY,6CACrBA,GAAS,MAAM,SAAW,OAC1BA,GAAS,MAAM,MAAQ,OACtB,MAAMC,GAAM,CACV,CAAE,MAAO,KAAM,MAAO,GAAA,EACtB,CAAE,MAAO,KAAM,MAAO,GAAA,EACtB,CAAE,MAAO,MAAO,MAAO,GAAA,EACxB,CAAE,MAAO,KAAM,MAAO,GAAA,EACtB,CAAE,MAAO,MAAO,MAAO,GAAA,EACvB,CAAE,MAAO,MAAO,MAAO,KAAA,EACvB,CAAE,MAAO,UAAW,MAAO,MAAA,CAAO,EAEpC,UAAWlH,MAAMkH,GAAK,CACpB,MAAM3M,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQyF,GAAG,MACfzF,GAAI,YAAcyF,GAAG,MACrBiH,GAAS,YAAY1M,EAAG,CAC1B,CACA0M,GAAS,MAAQC,GAAI,KAAMp/F,IAAMA,GAAE,QAAU8jB,GAAK,EAAE,EAAIA,GAAK,GAAK,KAEjE,MAAMu7E,GAAW,SAAS,cAAc,OAAO,EAC/CA,GAAS,KAAO,SAChBA,GAAS,UAAY,mBACrBA,GAAS,MAAM,SAAW,OAC1BA,GAAS,MAAM,MAAQ,OACvBA,GAAS,MAAQv7E,GAAK,KAAO,KAAO,OAAOA,GAAK,GAAG,EAAI,GACvDu7E,GAAS,YAAc,QAExB,MAAME,GAAa,IAAM,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,EAAE,SAASJ,GAAS,KAAK,EACjFE,GAAS,MAAM,QAAUE,GAAA,EAAe,GAAK,OAE7C,MAAMC,GAAc,IAAM,CACxB,MAAMrsH,GAAUqB,EAAM,SAAS,QAAQxC,EAAC,GAAG,KAC3C,OAAOmB,IAAW,OAAOA,IAAY,SAAWA,GAAU2wC,EAC5D,EAEO27E,GAAcC,IAAa,CAC/B,MAAMC,GAAY1H,GAAmByH,EAAQ,EACvC94B,GAAW,CACf,GAAGtkB,GACJ,KAAMo9C,GACN,KAAO/+C,IAAWg/C,GAAUh/C,EAAM,EAClC,MAAO++C,GAAS,KAAOp9C,GAAK,KAAA,EAExBs9C,GAAY/O,GAAM,MAAA,EACxB+O,GAAU5tH,EAAC,EAAI40F,GACfpyF,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAOorH,EAAA,EAC7DnI,GAAS,EAAI,CACf,EAEA0H,GAAS,iBAAiB,SAAU,IAAM,CACxCE,GAAS,MAAM,QAAUE,GAAA,EAAe,GAAK,OAC7CE,GAAW,CAAE,GAAGD,GAAA,EAAe,GAAIL,GAAS,MAAO,CACrD,CAAC,EAEAE,GAAS,iBAAiB,SAAU,IAAM,CACxC,MAAMjH,GAAMhM,GAAYiT,GAAS,KAAK,EACtCI,GAAW,CAAE,GAAGD,GAAA,EAAe,IAAApH,GAAK,CACtC,CAAC,EAED,MAAMyH,GAAUtH,GAAkBvmH,KAAM,EAAI,KAAO,SAAS,EAC5DktH,GAAQ,YAAYW,EAAO,EAC3BX,GAAQ,YAAYC,EAAQ,EAC5BD,GAAQ,YAAYG,EAAQ,EAC5BrP,EAAS,cAAcmP,GAAU,qBAAqB,EACtDnP,EAAS,cAAcqP,GAAU,mBAAmB,EAEpD,MAAMS,GAAS,SAAS,cAAc,QAAQ,EAC9CA,GAAO,KAAO,SACdA,GAAO,UAAY,6CACnBA,GAAO,YAAc,IACrBA,GAAO,aAAa,aAAc,iBAAiB,EACnD9P,EAAS,cAAc8P,GAAQ,uBAAuB,EACtDA,GAAO,MAAM,SAAW,WACxBA,GAAO,MAAM,IAAM,MACnBA,GAAO,MAAM,MAAQ,MACrBA,GAAO,iBAAiB,QAAS,IAAM,CACrC,MAAMF,GAAY/O,GAAM,OAAO,CAACh1C,GAAGgG,KAAQA,KAAQ7vE,EAAC,EACpDwC,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAOorH,EAAA,EAC7DnI,GAAS,EAAI,EACbwH,GAAA,CACF,CAAC,EAEDhuE,GAAI,YAAYiuE,EAAO,EAEvB,MAAM+J,GAASzQ,GAAsB,CACnC,MAAO,KACP,MAAO,OAAO10E,GAAK,KAAQ,SAAWA,GAAK,IAAM,OAAOw+B,GAAK,OAAS,WAAW,EACjF,SAAW3hD,IAAM,CACf8+F,GAAW,CAAE,GAAGD,GAAA,EAAe,IAAK7+F,GAAG,CACzC,EACA,eAAgB,GAChB,QAAS,EAAA,CACV,EAEKo/F,GAAU,SAAS,cAAc,KAAK,EAC5CA,GAAQ,MAAM,QAAU,OACxBA,GAAQ,MAAM,oBAAsB,sBACpCA,GAAQ,MAAM,IAAM,MACpBA,GAAQ,MAAM,WAAa,SAC3BA,GAAQ,MAAM,MAAQ,OAEtBkJ,GAAO,MAAM,MAAQ,OAErBlJ,GAAQ,YAAYxH,GAAkB,MAAM,CAAC,EAC7CwH,GAAQ,YAAYkJ,EAAM,EAE1B7pD,GAAK,YAAYnuB,EAAG,EACpBmuB,GAAK,YAAY2gD,EAAO,EACxB3gD,GAAK,YAAY0gD,EAAM,EACvBd,GAAU,YAAY5/C,EAAI,CAC5B,CACF,EAEA6/C,GAAA,EACA,MAAMe,GAAgB,SAAS,cAAc,QAAQ,EACrDA,GAAc,KAAO,SACrBA,GAAc,UAAY,6CAC1BA,GAAc,YAAc,MAC5BA,GAAc,aAAa,aAAc,cAAc,EACvDhQ,EAAS,cAAcgQ,GAAe,8BAA8B,EACpEA,GAAc,iBAAiB,QAAS,IAAM,CAC5C,MAAMl8E,GAAO,CAAE,GAAI,KAAM,IAAK,GAAI,IAAK,WAAA,EACjC67E,GAAY1H,GAAmBn0E,EAAI,EACnC8iD,GAAW,CAAE,KAAM9iD,GAAM,KAAO68B,IAAWg/C,GAAUh/C,EAAM,EAAG,MAAO78B,GAAK,GAAA,EAC1E87E,GAAY,CAAC,GAAIprH,EAAM,QAAQ,OAAS,CAAA,EAAKoyF,EAAQ,EAC3DpyF,EAAM,QAAU,CAAE,GAAGA,EAAM,QAAS,KAAM,WAAY,MAAOorH,EAAA,EAC7DnI,GAAS,EAAI,EACbwH,GAAA,CACF,CAAC,EAED,MAAMgB,GAAmBvJ,EAAuB,CAC9C,MAAO,YACP,QAAS,yCACT,OAAQsJ,EAAA,CACT,EACDC,GAAiB,KAAK,YAAYlB,EAAS,EAC3CL,GAAS,YAAYuB,GAAiB,IAAI,EAE1C,MAAMC,GAAgB,IAAI1d,GAC1B0d,GAAc,IAAI,CAAE,GAAI,GAAGt2H,CAAI,mBAAoB,MAAO,WAAY,UAAW,GAAM,QAAS80H,EAAA,CAAU,EAC1G7H,EAAW,YAAYqJ,GAAc,OAAO,EAC5CtQ,EAAG,iBAAiB,IAAI,IAAMsQ,GAAc,SAAS,CACxD,CAED,GAAI,CAACjN,IAAW,CAACC,IAAY0G,KAAgB,cAAe,CAC1D,MAAMpP,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,MAAM,MAAQ,yBACnBA,GAAK,YAAc,uDACnBqM,EAAW,YAAYrM,EAAI,CAC7B,CAEAgN,GAAA,CACF,EAEM0R,GAAuB,IAAM,CACjC,GAAIt/H,IAAS,QAAU4K,EAAM,UAAY,WAAY,CACnD,MAAMD,EAAYF,GAAQ,WAAa,KACjC8kH,GAAY,EAAQ5kH,GAAW,OAC/B6kH,GAAc,OAAO7kH,GAAW,gBAAmB,WACrDA,EAAU,eAAA,EACTA,GAAW,gBAAkB,GAAQ,UAAY,UAChD8kH,GAAgBF,IAAaC,KAAgB,UACnD5kH,EAAM,QAAU6kH,GAAgB,CAAE,KAAM7kH,EAAM,QAAS,KAAM,QAAA,EAAc+hH,GAAkB3sH,EAAM4K,EAAM,OAAO,GAAK,CAAE,KAAMA,EAAM,OAAA,CACrI,MACEA,EAAM,QAAU+hH,GAAkB3sH,EAAM4K,EAAM,OAAO,GAAK,CAAE,KAAMA,EAAM,OAAA,EAE1EijH,GAAS,EAAK,EACdwB,GAAA,CACF,EAEMkQ,GAAc79H,GAAS,CACtB0nE,EAAS,SAAS1nE,CAAI,IAC3BkJ,EAAM,QAAUlJ,EAChB49H,GAAA,EACF,EAEME,GAA0Bj+H,GAAU,CACxC,MAAMgK,GAAShK,GAAO,QAAUA,GAAS,CAAA,EACzC,GAAI,EAAAgK,GAAO,MAAQA,GAAO,OAASvL,IAC/B,EAAAuL,GAAO,SAAWA,GAAO,UAAYX,EAAM,SAC/C,IAAIA,EAAM,MAAO,CACfgjH,GAAA,EACA,MACF,CACA0R,GAAA,EACF,EAEAnS,GAAa,iBAAiB,QAAS,IAAM,CAC3CmS,GAAA,CACF,CAAC,EAEDlS,GAAY,iBAAiB,QAAS,IAAM,CAC1C,GAAI,CAACxiH,EAAM,QAAS,OACpB,GACE5K,IAAS,QACT4K,EAAM,UACLA,EAAM,QAAQ,OAAS,cAAgBA,EAAM,QAAQ,OAAS,kBAC/DA,EAAM,mBACN,CACA,KAAM,CAAE,WAAA60H,GAAY,gBAAAlO,EAAA,EAAoB3mH,EAAM,mBACxC6mH,GAAOgO,IAAY,OAAS70H,EAAM,QAAQ,eAAiB,OAC3DisC,EAAY06E,IAAiB,OAAS3mH,EAAM,QAAQ,WAAa,OACvEA,EAAM,QAAU,CACd,GAAGA,EAAM,QACT,KAAM,gBACN,cAAe6mH,GACf,UAAA56E,EACA,WAAY46E,GAAO,CAAC,SAASA,EAAI,EAAE,EAAI7mH,EAAM,QAAQ,UAAA,CAEzD,CAEA,GAAI,CACE,OAAO,gCACT,QAAQ,IAAI,gDAAiD,CAC3D,KAAA5K,EACA,QAAS4K,EAAM,QACf,QAASA,EAAM,QACf,KAAM+hH,GAAkB3sH,EAAM4K,EAAM,OAAO,CAAA,CAC5C,CAEL,OAAS7G,GAAO,CACd,QAAQ,KAAK,+EAAgFA,EAAK,CACpG,CAEA,GAAI/D,IAAS,QAAU4K,EAAM,UAAY,WAAY,CACnD,GAAIA,EAAM,QAAQ,OAAS,SAAU,CACnCH,GAAQ,cAAA,EACRojH,GAAS,EAAK,EACd,MACF,CACApjH,GAAQ,aAAa,YAAY,CACnC,CAGA,GADWmiH,GAAY5sH,EAAM4K,EAAM,QAASA,EAAM,OAAO,EACjD,CACN,GAAI,CACF,GAAI,OAAO,+BAAgC,CACzC,MAAMsiB,GAAQziB,GAAQ,SAAS,4BAAA,EAA8B,KAAMmsE,IAAMA,GAAE,WAAa,4BAA4B,EACpH,QAAQ,IAAI,+CAAgD,CAC1D,KAAA52E,EACA,QAAS4K,EAAM,QACf,KAAM+hH,GAAkB3sH,EAAM4K,EAAM,OAAO,EAC3C,oBAAqBsiB,IAAS,IAAA,CAC/B,CACH,CACF,OAASnpB,GAAO,CACd,QAAQ,KAAK,8EAA+EA,EAAK,CACnG,CAOA,GAJA0G,GAAQ,WAAW,kBAAA,EACnBA,GAAQ,WAAW,gBAAA,EACnBA,GAAQ,gBAAA,EAGNzK,IAAS,QACT4K,EAAM,UAAY,iBACjBA,EAAM,QAAQ,MAAQA,EAAM,QAAQ,QAAU,YAC/C,OAAOH,GAAQ,kBAAqB,WAEpC,GAAI,CACFA,EAAO,iBAAiBG,EAAM,QAAQ,KAAK,CAC7C,MAAQ,CAER,CAGF,GAAI5K,IAAS,SAAW4K,EAAM,UAAY,WAAaA,EAAM,UAAY,gBAAiB,CACxF,MAAM80H,GAAa/S,GAAkB,OAAQ,SAAS,EAChDgT,GAAkBhT,GAAkB,OAAQ,cAAc,EAC1DiT,GAAcF,IAAY,MAAQA,IAAY,MAAQ,KACtDG,EAAmBF,IAAiB,MAAQA,IAAiB,MAAQ,KACrEG,GAAeF,KAAgB,YAAcC,IAAqB,WACpE,OAAOp1H,GAAQ,0BAA6B,YAC9CA,EAAO,yBAAyB,CAACq1H,EAAY,CAEjD,CACAjS,GAAS,EAAK,CAChB,CACF,CAAC,EAED,MAAMkS,GAA8B,IAAM,CACxC,MAAM/nC,EAAUptF,EAAM,QACtB,GAAI,CAACotF,EAAS,MAAO,GACrB,MAAMz5E,GAAOy5E,EAAQ,MAAQA,EAAQ,MAAQ,KAC7C,GAAIz5E,KAAS,UAAYA,KAAS,WAAY,MAAO,GACrD,MAAMmM,GAAO,OAAOstE,EAAQ,YAAe,SAAWA,EAAQ,WAAa,KAK3E,GAJI,CAACttE,IAID,GAFWstE,EAAQ,MAAQ,OAAOA,EAAQ,MAAS,SAAWA,EAAQ,KAAO,OACtD,aAAe,IAAQttE,KAAS,UAC1C,MAAO,GAExB,MAAMiyG,GAAa9S,EAA0B7pH,EAAM0qB,EAAI,EACjD8lG,GAAa,MAAM,QAAQx4B,EAAQ,MAAM,EAAIA,EAAQ,OAAS,KACpE,GAAIw4B,IAAcA,GAAW,CAAC,IAAMmM,GAAW,CAAC,GAAKnM,GAAW,CAAC,IAAMmM,GAAW,CAAC,EAAG,MAAO,GAE7F,MAAM/I,GAAc,CAAE,GAAG57B,EAAS,KAAAz5E,GAAM,OAAQo+G,EAAA,EAChD,OAAAhR,GAAeiI,GAAa,EAAI,EAChChpH,EAAM,QAAUgpH,GAGXhpH,EAAM,QACTgiH,GAAY5sH,EAAM4K,EAAM,QAASgpH,EAAW,EAC5C/F,GAAS,EAAK,GAET,EACT,EAEA,IAAImS,GAAwB,KAC5B,MAAMC,GAAkC,IAAM,CACxCD,KACFA,GAAA,EACAA,GAAwB,MAE1B,MAAM55H,EAAU8/G,EAAA,EAChB,GAAI,CAAC9/G,EAAS,OACd,MAAM7C,GAAWhC,IAAU,CACzB,MAAM2jC,GAAQ3jC,IAAO,QAAQ,MAC7B,GAAI2jC,IAASA,KAAUllC,EAAM,OAE7B,IADauB,IAAO,MAAQ,MACf,oBAAqB,CAChC,MAAM+sH,GAAK/sH,IAAO,QAAQ,IAAM,GAChC,GAAI+sH,KAAO,cAAgBA,KAAO,eAAgB,MACpD,CACAe,GAAA,CACF,EACA,GAAI,OAAOjpH,EAAQ,IAAO,WAAY,CACpC,MAAM85H,GAAS,CACb95H,EAAQ,GAAG,oBAAqB7C,EAAO,EACvC6C,EAAQ,GAAG,oBAAqB7C,EAAO,EACvC6C,EAAQ,GAAG,oBAAqB7C,EAAO,CAAA,EAEzCy8H,GAAwB,IAAM,CAC5B,UAAWvuB,MAASyuB,GAAQzuB,KAAA,CAC9B,CACF,MAAW,OAAOrrG,EAAQ,kBAAqB,aAC7CA,EAAQ,iBAAiB,oBAAqB7C,EAAO,EACrD6C,EAAQ,iBAAiB,oBAAqB7C,EAAO,EACrD6C,EAAQ,iBAAiB,oBAAqB7C,EAAO,EACrDy8H,GAAwB,IAAM,CAC5B55H,EAAQ,oBAAoB,oBAAqB7C,EAAO,EACxD6C,EAAQ,oBAAoB,oBAAqB7C,EAAO,EACxD6C,EAAQ,oBAAoB,oBAAqB7C,EAAO,CAC1D,EAEJ,EAGM48H,GAAoB,IAAM,CAC9BJ,GAAA,EACAE,GAAA,EACIr1H,EAAM,MAAOykH,GAAA,EACZiQ,GAAA,CACP,EACMY,GAAS,CAAA,EACf,OAAIz1H,GAAQ,IACVy1H,GAAO,KAAKz1H,EAAO,GAAG,mBAAoB01H,EAAiB,CAAC,EAC5DD,GAAO,KAAKz1H,EAAO,GAAG,kBAAmB+0H,EAAsB,CAAC,GACvD/0H,GAAQ,mBACjBA,EAAO,iBAAiB,mBAAoB01H,EAAiB,EAC7D11H,EAAO,iBAAiB,kBAAmB+0H,EAAsB,EACjEU,GAAO,KAAK,IAAMz1H,EAAO,oBAAoB,mBAAoB01H,EAAiB,CAAC,EACnFD,GAAO,KAAK,IAAMz1H,EAAO,oBAAoB,kBAAmB+0H,EAAsB,CAAC,GAErF,OAAOvZ,GAAiB,IAAO,WACjCia,GAAO,KAAKja,EAAgB,GAAG,SAAUuZ,EAAsB,CAAC,EACvD,OAAOvZ,GAAiB,kBAAqB,aACtDA,EAAgB,iBAAiB,SAAUuZ,EAAsB,EACjEU,GAAO,KAAK,IAAMja,EAAgB,oBAAoB,SAAUuZ,EAAsB,CAAC,GAErFU,GAAO,QACTla,EAAG,iBAAiB,IAAI,IAAM,CAC5B,UAAWvU,KAASyuB,GAAQzuB,IAAA,CAC9B,CAAC,EAGHwuB,GAAA,EACID,IAAuBha,EAAG,iBAAiB,IAAI,IAAMga,MAAyB,EAElFV,GAAA,EACO,CAAE,KAAAzlH,GAAM,MAAAjP,EAAO,SAAAw+D,EAAU,WAAAm2D,EAAA,CAClC,EAEMa,GAAmB,IAAM,CAC7B,MAAMvmH,EAAO,SAAS,cAAc,KAAK,EAGzC,GAFAA,EAAK,UAAY,uBAEb,CAACpP,GAAU,OAAOA,EAAO,SAAY,WAAY,CACnD,MAAMm2G,EAAO,SAAS,cAAc,KAAK,EACzC,OAAAA,EAAK,MAAM,MAAQ,yBACnBA,EAAK,YAAc,6DACnB/mG,EAAK,YAAY+mG,CAAI,EACd,CAAE,KAAA/mG,EAAM,QAAS,IAAM,CAAC,CAAA,CACjC,CAEA,MAAMozG,GAAa,SAAS,cAAc,KAAK,EAC/CpzG,EAAK,YAAYozG,EAAU,EAE3B,MAAMe,MAAoB,IACpBC,EAAmBC,GAAY,CAC/BA,GAASF,EAAc,IAAIE,CAAO,CACxC,EACMC,EAAkB,IAAM,CAC5B,UAAWD,KAAWF,EACpB,GAAI,CACFE,EAAQ,UAAA,CACV,OAASnqH,GAAO,CACd,QAAQ,KAAK,2DAA4DA,EAAK,CAChF,CAEFiqH,EAAc,MAAA,CAChB,EACAhI,EAAG,iBAAiB,IAAI,IAAMmI,EAAA,CAAiB,EAE/C,MAAMkS,EAAwB,CAAC,CAAE,QAAAhsB,EAAU,GAAO,SAAA14B,GAAU,QAAA44B,GAAU,KAAM,SAAAC,GAAW,SAAY,CAEjG,MAAMsE,IADevE,KAAY,MAAQC,KAAa,MACvBa,GAA+BjB,IAAqB,CACjF,QAAS,EAAQC,EACjB,QAAAE,GACA,SAAAC,EAAA,CACD,EACK8rB,GAAkB,IAAM3kD,KAAWm9B,GAAO,OAAO,EACvD,OAAAA,GAAO,iBAAiB,SAAUwnB,EAAe,EACjDrS,EAAgB,CACd,SAAU,CACRnV,GAAO,oBAAoB,SAAUwnB,EAAe,CACtD,CAAA,CACD,EACMxnB,EACT,EAEMynB,GAAwB,IAAM,CAClC,MAAMn6H,EAAU8/G,EAAA,EAChB,GAAI,CAAC9/G,GAAW,OAAOA,EAAQ,uBAA0B,WACvD,MAAO,CAAC,UAAW,QAAQ,EAE7B,MAAM0Z,GAAQ,CAAC,UAAW,QAAQ,EAClC,IAAIyV,GAAM,CAAA,EACV,GAAI,CACFA,GAAMnvB,EAAQ,sBAAA,GAA2B,CAAA,CAC3C,OAASrC,GAAO,CACd,QAAQ,KAAK,gFAAiFA,EAAK,EACnGwxB,GAAM,CAAA,CACR,CACA,UAAW9zB,MAAQ8zB,GAAK,CAEtB,GADI,OAAO9zB,IAAS,UAChB,CAACuhH,GAAsBvhH,EAAI,EAAG,SAClC,IAAIyzE,GAAO,KACX,GAAI,CACFA,GAAO9uE,EAAQ,uBAAuB3E,EAAI,GAAK,IACjD,OAASsC,GAAO,CACd,QAAQ,KAAK,8DAA8DtC,EAAI,0BAA2BsC,EAAK,EAC/GmxE,GAAO,IACT,CACI,CAACA,KAASA,GAAK,WAAa,KAAO,GAClCywC,GAAuBzwC,GAAK,IAAI,GACrCp1D,GAAM,KAAKre,EAAI,CACjB,CACA,MAAM6mH,GAAS,MAAM,KAAK,IAAI,IAAIxoG,EAAK,CAAC,EAClC2f,GAAQ6oF,GAAO,OAAQ7mH,IAASA,KAAS,WAAaA,KAAS,QAAQ,EACvE42E,GAAQiwC,GAAO,OAAQ7mH,IAASA,KAAS,WAAaA,KAAS,QAAQ,EAC7E,OAAA42E,GAAM,KAAKksC,EAAc,EAClB,CAAC,GAAG9kF,GAAO,GAAG44C,EAAK,CAC5B,EAEM70E,GAAM,IAAMiH,EAAO,QAAA,EACnB+1H,GAAgBtzE,GAAU,CAC9BziD,EAAO,QAAQyiD,CAAK,EACpBziD,EAAO,WAAW,gBAAA,EAClBA,EAAO,gBAAA,CACT,EACMg2H,GAAiB,CAAC71H,EAAQpH,GAAA,IAAUoH,GAAO,iBAAmB,WAC9D81H,GAAuB,CAAC91H,EAAQpH,GAAA,IAAUoH,GAAO,iBAAmBA,EAAM,kBAAoB,OAC9F+1H,GAA+B,CAAC/1H,EAAQpH,OACxCi9H,GAAe71H,CAAK,EAAUA,GAAO,kBAAoBA,GAAO,mBAAqBA,GAAO,SAC5FA,GAAO,YAAc,GAAaA,GAAO,mBAAqBA,GAAO,SAClEA,GAAO,SAEVg2H,GAAgCrhC,GAAaghC,GAAA,EAAwB,OAAQrhI,IAAUA,KAAUqgG,CAAQ,EACzGshC,GAA8B,CAClC,CAAE,MAAO,OAAQ,MAAO,MAAA,EACxB,CAAE,MAAO,MAAO,MAAO,YAAA,EACvB,CAAE,MAAO,WAAY,MAAO,UAAA,EAC5B,CAAE,MAAO,cAAe,MAAO,aAAA,EAC/B,CAAE,MAAO,0BAA2B,MAAO,4BAAA,CAA6B,EAEpEC,GAAqB,CACzB,CAAE,MAAO,IAAM,MAAO,MAAA,EACtB,CAAE,MAAO,GAAK,MAAO,MAAA,EACrB,CAAE,MAAO,GAAK,MAAO,KAAA,EACrB,CAAE,MAAO,IAAM,MAAO,KAAA,EACtB,CAAE,MAAO,EAAI,EAAG,MAAO,KAAA,EACvB,CAAE,MAAO,GAAK,MAAO,KAAA,EACrB,CAAE,MAAO,EAAG,MAAO,GAAA,CAAI,EAEzB,IAAIC,GAAiB,GACjBC,GAAwB,KACxBC,GAA2B,GAE/B,MAAMjwG,GAAW9xB,GAAU,CACzB,MAAME,GAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,EAAO,EACrB,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGA,EAAO,CAAC,EADD,CAExC,EAEM8hI,GAA2B7tG,GAAW,CAC1C,GAAI,MAAM,QAAQA,CAAM,GAAK,YAAY,OAAOA,CAAM,EAAG,CACvD,MAAM+/B,GAAIpiC,GAAQqC,EAAO,CAAC,GAAK,CAAC,EAC1BggC,GAAIriC,GAAQqC,EAAO,CAAC,GAAK,CAAC,EAC1BrZ,GAAIgX,GAAQqC,EAAO,CAAC,GAAK,CAAC,EAC1BtZ,GAAIiX,GAAQqC,EAAO,QAAU,EAAIA,EAAO,CAAC,EAAI,CAAC,EACpD,MAAO,CAAC+/B,GAAGC,GAAGr5C,GAAGD,EAAC,CACpB,CACA,GAAI,OAAOsZ,GAAW,SAAU,CAC9B,MAAMkC,GAAMlC,EAAO,KAAA,EACbm9C,GAAW,4CAA4C,KAAKj7C,EAAG,EACrE,GAAIi7C,GAAU,CACZ,MAAMlG,GAAMkG,GAAS,CAAC,EAChBC,GAAUpjC,IAAM,GAAGA,EAAC,GAAGA,EAAC,GACxB5tC,GAAa6qE,GAAI,SAAW,EAC9BA,GAAI,MAAM,EAAE,EAAE,IAAKj9B,IAAMojC,GAAOpjC,EAAC,CAAC,EAAE,KAAK,EAAE,EAC3Ci9B,GAAI,SAAW,EACbA,GACAA,GAAI,MAAM,EAAG,CAAC,EACd8kD,GAAW9kD,GAAI,SAAW,EAAIA,GAAI,MAAM,EAAG,CAAC,EAAI,KACtD,MAAO,CACL,SAAS7qE,GAAW,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IACvC,SAASA,GAAW,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IACvC,SAASA,GAAW,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IACvC,SAAS2vH,GAAU,EAAE,EAAI,GAAA,CAE7B,CACA,MAAMz+C,GAAW,sBAAsB,KAAKp7C,EAAG,EAC/C,GAAIo7C,GAAU,CACZ,MAAMC,GAAQD,GAAS,CAAC,EAAE,MAAM,GAAG,EAAE,IAAK55C,IAAM,OAAOA,GAAE,KAAA,CAAM,CAAC,EAChE,GAAI65C,GAAM,QAAU,GAAKA,GAAM,MAAM,EAAG,CAAC,EAAE,MAAM,OAAO,QAAQ,EAAG,CACjE,MAAMvnE,GAAQ,OAAO,SAASunE,GAAM,CAAC,CAAC,EAAIA,GAAM,CAAC,EAAI,EACrD,MAAO,CACL5/C,GAAQ4/C,GAAM,CAAC,EAAI,GAAG,EACtB5/C,GAAQ4/C,GAAM,CAAC,EAAI,GAAG,EACtB5/C,GAAQ4/C,GAAM,CAAC,EAAI,GAAG,EACtB5/C,GAAQ3nB,EAAK,CAAA,CAEjB,CACF,CACF,CACA,MAAO,CAAC,EAAG,EAAG,EAAG,CAAC,CACpB,EAEM83H,GAAsB,CAACv2H,EAAQpH,OAAU,CAC7C,MAAMnB,GAAMs+H,GAA6B/1H,CAAK,EAExCyoB,IADWqgD,GAAgBrxE,EAAG,GAAKqxE,GAAgB,iBAAiB,IACjD,cAAc+sD,GAAe71H,CAAK,GAAKA,GAAO,YAAc,GAAO,GAAM,CAAC,GAAK,CAAC,EAAG,EAAG,EAAG,CAAC,EACnH,OAAOs2H,GAAwB7tG,EAAM,CACvC,EAEM+tG,GAA6B,IAAM,CACvC,MAAM73H,EAAUkB,EAAO,aAAA,EACvB,OAAM,MAAM,QAAQlB,CAAO,GAAK,YAAY,OAAOA,CAAO,EACnD,CACLynB,GAAQznB,EAAQ,CAAC,GAAK,CAAC,EACvBynB,GAAQznB,EAAQ,CAAC,GAAK,CAAC,EACvBynB,GAAQznB,EAAQ,CAAC,GAAK,CAAC,EACvBynB,GAAQznB,EAAQ,QAAU,EAAIA,EAAQ,CAAC,EAAI,CAAC,CAAA,EALuB,IAOvE,EAEM83H,GAA+B,CAACz2H,EAAQpH,OAAUu9H,IAAkBn2H,GAAO,UAAY,GAEvF02H,GAA0B,IAAM,CACpC,GAAIL,GAA0B,OAC9B,MAAM13H,EAAU63H,GAAA,EACZ73H,IAASy3H,GAAwBz3H,EACvC,EAEA+3H,GAAA,EAEA,MAAMC,GAA0B,IAAM,CACpC,GAAKN,KACLA,GAA2B,GACvB,EAACD,IACL,GAAI,CACFv2H,EAAO,aAAau2H,EAAqB,CAC3C,OAASj9H,EAAO,CACd,QAAQ,KAAK,uEAAwEA,CAAK,CAC5F,CACF,EAEMy9H,GAAyB,CAAC52H,EAAQpH,OAAU,CAChD,GAAI,CAAC69H,GAA6Bz2H,CAAK,EAAG,CACxC22H,GAAA,EACA,MACF,CACKN,IAA0BK,GAAA,EAC/B,GAAI,CACF72H,EAAO,aAAa02H,GAAoBv2H,CAAK,CAAC,EAC9Cq2H,GAA2B,EAC7B,OAASl9H,GAAO,CACd,QAAQ,KAAK,qEAAsEA,EAAK,CAC1F,CACF,EAEM09H,GAAqBviI,GAAU,CACnC,MAAME,GAAU,OAAOF,CAAK,EAC5B,GAAI,CAAC,OAAO,SAASE,EAAO,EAAG,MAAO,GACtC,IAAIsiI,GAAY,EACZC,GAAe,IACnB,QAASv5H,GAAI,EAAGA,GAAI04H,GAAmB,OAAQ14H,IAAK,EAAG,CACrD,MAAMw5H,GAAO,KAAK,IAAId,GAAmB14H,EAAC,EAAE,MAAQhJ,EAAO,EACvDwiI,GAAOD,KACTA,GAAeC,GACfF,GAAYt5H,GAEhB,CACA,OAAOs5H,EACT,EACMG,GAAgB,CAACz/E,EAAKh/C,KAAY,CACtC,GAAKg/C,EACL,CAAAA,EAAI,MAAM,QAAUh/C,GAAU,IAAM,OACpC,UAAW8qH,MAAW9rE,EAAI,iBAAiB,iCAAiC,EAC1E8rE,GAAQ,SAAW,CAAC9qH,GAExB,EACM0+H,GAAgB,CAAC1/E,EAAK4kC,KAAY,CACjC5kC,IACLA,EAAI,MAAM,QAAU4kC,GAAU,GAAK,OACrC,EAEM+6C,GAAgB1B,EAAsB,CAC1C,QAAS78H,KAAM,UAAY,GAC3B,SAAW6wG,GAAY,CACrBmsB,GAAa,CAAE,QAASnsB,EAAS,EACjCmtB,GAAA,CACF,EACA,QAAS,KACT,SAAU,KAAA,CACX,EACDvU,GAAW,YAAY5G,EAAiB,CACtC,MAAO,UACP,KAAM,uCACN,SAAU0b,EAAA,CACX,EAAE,GAAG,EAEN,MAAMC,EAAe3B,EAAsB,CACzC,QAAS78H,KAAM,cAAgB,GAC/B,SAAW6wG,GAAYmsB,GAAa,CAAE,YAAansB,EAAS,EAC5D,QAAS,SACT,SAAU,MAAA,CACX,EACD4Y,GAAW,YAAY5G,EAAiB,CACtC,MAAO,SACP,KAAM,uDACN,SAAU2b,CAAA,CACX,EAAE,GAAG,EAEN,MAAMC,GAAuB5B,EAAsB,CACjD,QAASU,GACT,SAAW1sB,GAAY,CACrB0sB,GAAiB1sB,IAAY,GAC7BmtB,GAAA,CACF,EACA,QAAS,QACT,SAAU,QAAA,CACX,EACDvU,GAAW,YAAY5G,EAAiB,CACtC,MAAO,SACP,KAAM,2EACN,SAAU4b,EAAA,CACX,EAAE,GAAG,EAEN,MAAMC,GAAiB,SAAS,cAAc,QAAQ,EACtDA,GAAe,UAAY,mBAC3BjV,GAAW,YAAY5G,EAAiB,CACtC,MAAO,UACP,KAAM,4BACN,SAAU6b,EAAA,CACX,EAAE,GAAG,EAEN,MAAMC,GAAgB,SAAS,cAAc,QAAQ,EACrDA,GAAc,UAAY,mBAC1BlV,GAAW,YAAY5G,EAAiB,CACtC,MAAO,KACP,KAAM,+CACN,SAAU8b,EAAA,CACX,EAAE,GAAG,EAEN,MAAMC,EAAuB,SAAS,cAAc,QAAQ,EAC5DA,EAAqB,UAAY,mBACjC,UAAWnsB,IAAU,CACnB,CAAE,MAAO,aAAc,MAAO,YAAA,EAC9B,CAAE,MAAO,WAAY,MAAO,WAAA,CAAY,EACvC,CACD,MAAM9F,GAAK,SAAS,cAAc,QAAQ,EAC1CA,GAAG,MAAQ8F,EAAO,MAClB9F,GAAG,YAAc8F,EAAO,MACxBmsB,EAAqB,YAAYjyB,EAAE,CACrC,CACA,MAAMkyB,GAAUhc,EAAiB,CAC/B,MAAO,OACP,KAAM,qFACN,SAAU+b,CAAA,CACX,EACDnV,GAAW,YAAYoV,GAAQ,GAAG,EAElC,MAAMC,GAAkBjC,EAAsB,CAC5C,QAAS78H,KAAM,cAAgB,GAC/B,SAAW6wG,GAAYmsB,GAAa,CAAE,YAAansB,EAAS,EAC5D,QAAS,aACT,SAAU,KAAA,CACX,EACKkuB,GAAelc,EAAiB,CACpC,MAAO,QACP,KAAM,8DACN,SAAUic,EAAA,CACX,EACDrV,GAAW,YAAYsV,GAAa,GAAG,EAEvC,MAAMC,GAAmB,IAAIvkB,GAAkB,CAC7C,MAAOz6G,KAAM,WAAa,KAC1B,OAAQ,IACR,OAAQ,IACR,QAAS,IACT,SAAU,IACV,SAAU,IACV,OAAQ,EACR,SAAWtE,GAAUshI,GAAa,CAAE,UAAWthI,EAAO,CAAA,CACvD,EACD+uH,EAAgBuU,EAAgB,EAChCvV,GAAW,YAAY5G,EAAiB,CACtC,MAAO,YACP,KAAM,gCACN,SAAUmc,GAAiB,OAAA,CAC5B,EAAE,GAAG,EAEN,MAAMC,GAAkBpC,EAAsB,CAC5C,QAAS78H,KAAM,gBAAkB,GACjC,SAAW6wG,GAAYmsB,GAAa,CAAE,cAAensB,EAAS,EAC9D,QAAS,QACT,SAAU,OAAA,CACX,EACD4Y,GAAW,YAAY5G,EAAiB,CACtC,MAAO,OACP,KAAM,6EACN,SAAUoc,EAAA,CACX,EAAE,GAAG,EAEN,MAAMC,GAAgB,IAAIzkB,GAAkB,CAC1C,MAAOz6G,KAAM,aAAe,kBAC5B,OAAQ,EACR,OAAQ,GACR,QAAS,GACT,SAAU,EACV,SAAU,IACV,OAAQ,EACR,SAAWtE,GAAUshI,GAAa,CAAE,YAAathI,EAAO,CAAA,CACzD,EACD+uH,EAAgByU,EAAa,EAC7B,MAAMC,GAAYtc,EAAiB,CACjC,MAAO,SACP,KAAM,4CACN,SAAUqc,GAAc,OAAA,CACzB,EACDzV,GAAW,YAAY0V,GAAU,GAAG,EAEpC,MAAMC,GAAiB,IAAI3kB,GAAkB,CAC3C,MAAOz6G,KAAM,SAAW,KACxB,OAAQ,GACR,OAAQ,IACR,QAAS,GACT,SAAU,KACV,SAAU,WACV,OAAQ,EACR,SAAWtE,GAAUshI,GAAa,CAAE,QAASthI,EAAO,CAAA,CACrD,EACD+uH,EAAgB2U,EAAc,EAC9B,MAAMC,GAAaxc,EAAiB,CAClC,MAAO,UACP,KAAM,qEACN,SAAUuc,GAAe,OAAA,CAC1B,EACD3V,GAAW,YAAY4V,GAAW,GAAG,EAErC,MAAMC,GAAuB,IAAI7kB,GAAkB,CACjD,MAAOz6G,KAAM,eAAiB,EAC9B,OAAQ,IACR,OAAQ,EACR,QAAS,IACT,SAAU,WACV,SAAU,GACV,OAAQ,EACR,SAAWtE,GAAUshI,GAAa,CAAE,cAAethI,EAAO,CAAA,CAC3D,EACD+uH,EAAgB6U,EAAoB,EACpC,MAAMC,GAAmB1c,EAAiB,CACxC,MAAO,QACP,KAAM,6FACN,SAAUyc,GAAqB,OAAA,CAChC,EACD7V,GAAW,YAAY8V,GAAiB,GAAG,EAE3C,MAAMC,GAAe3C,EAAsB,CACzC,QAAS78H,KAAM,iBAAmB,GAClC,SAAW6wG,GAAYmsB,GAAa,CAAE,eAAgBnsB,EAAS,EAC/D,QAAS,IACT,SAAU,KAAA,CACX,EACK4uB,GAAY5c,EAAiB,CACjC,MAAO,UACP,KAAM,kGACN,SAAU2c,EAAA,CACX,EACD/V,GAAW,YAAYgW,GAAU,GAAG,EAEpC,MAAMC,GAA0B7C,EAAsB,CACpD,QAAS78H,KAAM,4BAA8B,GAC7C,SAAW6wG,GAAYmsB,GAAa,CAAE,0BAA2BnsB,EAAS,EAC1E,QAAS,UACT,SAAU,KAAA,CACX,EACK8uB,GAAuB9c,EAAiB,CAC5C,MAAO,UACP,KAAM,4FACN,SAAU6c,EAAA,CACX,EACDjW,GAAW,YAAYkW,GAAqB,GAAG,EAE/C,MAAMC,GAAiB,SAAS,cAAc,KAAK,EACnDA,GAAe,MAAM,QAAU,OAC/BA,GAAe,MAAM,WAAa,SAClCA,GAAe,MAAM,IAAM,MAC3BA,GAAe,MAAM,MAAQ,OAE7B,MAAMC,GAAmB,SAAS,cAAc,OAAO,EACvDA,GAAiB,KAAO,QACxBA,GAAiB,UAAY,mBAC7BA,GAAiB,IAAM,IACvBA,GAAiB,IAAM,OAAOvC,GAAmB,OAAS,CAAC,EAC3DuC,GAAiB,KAAO,IACxBA,GAAiB,MAAM,KAAO,WAE9B,MAAMC,GAAkB,SAAS,cAAc,MAAM,EACrDA,GAAgB,MAAM,MAAQ,yBAC9BA,GAAgB,MAAM,WAAa,MACnCA,GAAgB,MAAM,SAAW,MACjCA,GAAgB,MAAM,UAAY,QAElC,MAAMC,GAAqB,CAAC/wH,EAAO,CAAE,OAAAiqG,GAAS,EAAA,EAAU,KAAO,CAC7D,MAAM+mB,GAAe,KAAK,IAAI,EAAG,KAAK,IAAI1C,GAAmB,OAAS,EAAG,KAAK,MAAM,OAAOtuH,CAAK,GAAK,CAAC,CAAC,CAAC,EAClG0a,GAAQ4zG,GAAmB0C,EAAY,EAC7CH,GAAiB,MAAQ,OAAOG,EAAY,EAC5CF,GAAgB,YAAcp2G,GAAM,MAChCuvF,IAAQ+jB,GAAa,CAAE,aAActzG,GAAM,MAAO,CACxD,EAEAm2G,GAAiB,iBAAiB,QAAS,IAAM,CAC/CE,GAAmB,OAAOF,GAAiB,KAAK,EAAG,CAAE,OAAQ,GAAM,CACrE,CAAC,EAEDD,GAAe,YAAYC,EAAgB,EAC3CD,GAAe,YAAYE,EAAe,EAC1CrW,GAAW,YAAY5G,EAAiB,CACtC,MAAO,aACP,KAAM,gCACN,SAAU+c,EAAA,CACX,EAAE,GAAG,EAEN,MAAMK,GAA0B,SAAS,cAAc,QAAQ,EAC/DA,GAAwB,UAAY,mBACpCA,GAAwB,aAAa,aAAc,eAAe,EAClE,UAAWxtB,KAAU4qB,GAA6B,CAChD,MAAM1wB,GAAK,SAAS,cAAc,QAAQ,EAC1CA,GAAG,MAAQ8F,EAAO,MAClB9F,GAAG,YAAc8F,EAAO,MACxBwtB,GAAwB,YAAYtzB,EAAE,CACxC,CACAszB,GAAwB,iBAAiB,SAAU,IAAM,CACvDjD,GAAa,CAAE,kBAAmBiD,GAAwB,KAAA,CAAO,CACnE,CAAC,EACDxW,GAAW,YAAY5G,EAAiB,CACtC,MAAO,QACP,KAAM,uIACN,SAAUod,EAAA,CACX,EAAE,GAAG,EAEN,MAAMlF,GAAiB,IAAIlf,GAAsB,CAC/C,QAASmH,EACT,WAAYR,GAAI,WAAa,SAAS,KACtC,MAAO2a,GAA6Bn9H,IAAK,EACzC,cAAe,kBACf,kBAAmB,oBACnB,QAAS,CACP,CACE,GAAI,YACJ,MAAO,YACP,MAAO,wDACP,OAAQk9H,GAAqBl9H,GAAA,CAAK,GAAKA,GAAA,GAAO,YAAc,GAC5D,UAAY0pB,GAAUA,GAAO,YAAc,EAAA,CAC7C,EAEF,SAAW7qB,GAAQ,CACjB,MAAMuI,GAAQpH,GAAA,EACVi9H,GAAe71H,EAAK,EACtB41H,GAAa,CAAE,iBAAkBn+H,EAAK,EAC7BuI,IAAO,YAAc,GAC9B41H,GAAa,CAAE,kBAAmBn+H,EAAK,EAEvCm+H,GAAa,CAAE,SAAUn+H,EAAK,EAEhCm/H,GAAA,EACAkC,GAAA,CACF,CAAA,CACD,EACDzV,EAAgBsQ,EAAc,EAC9BtR,GAAW,YAAY5G,EAAiB,CACtC,MAAO,MACP,KAAM,0EACN,SAAUkY,GAAe,OAAA,CAC1B,EAAE,GAAG,EAEN2D,GAAe,iBAAiB,SAAU,IAAM,CAC9C,MAAMyB,EAAezB,GAAe,MAC9B0B,GAAiBzB,GAAc,MAC/B0B,GAAqBjD,GAA6B+C,CAAY,EAC9Dz2E,GAAQ,CAAE,SAAUy2E,CAAA,GACtBC,KAAmBD,GAAiBC,KAAmB,QAAU,CAACC,GAAmB,SAASD,EAAc,KAC9G12E,GAAM,gBAAkB,OACxBA,GAAM,eAAiB,aACvBqxE,GAAe,gBAAgB,YAAa,GAAO,CAAE,OAAQ,GAAO,GAEtEiC,GAAatzE,EAAK,EAClBw2E,GAAA,CACF,CAAC,EACDvB,GAAc,iBAAiB,SAAU,IAAM,CACzCA,GAAc,QAAU,QAC1B3B,GAAa,CAAE,gBAAiB,OAAQ,eAAgB,aAAc,EACtEjC,GAAe,gBAAgB,YAAa,GAAO,CAAE,OAAQ,GAAO,IAEpEiC,GAAa,CAAE,gBAAiB2B,GAAc,KAAA,CAAO,EACrD5D,GAAe,gBAAgB,YAAa,GAAM,CAAE,OAAQ,GAAO,GAErEmF,GAAA,CACF,CAAC,EACDtB,EAAqB,iBAAiB,SAAU,IAAM,CACpD5B,GAAa,CAAE,eAAgB4B,EAAqB,KAAA,CAAO,EACvDA,EAAqB,QAAU,YACjC7D,GAAe,gBAAgB,YAAa,GAAM,CAAE,OAAQ,GAAO,EAErEmF,GAAA,CACF,CAAC,EAED,MAAMA,GAAU,IAAM,CACpB,MAAM94H,EAAQpH,GAAA,EACR60E,GAAQkoD,GAAA,EACRuD,GAAelD,GAA6Bh2H,EAAM,QAAQ,EAC1Dw1F,GAAiB0jC,GAAa,OAAS,EACvCC,GAAgBrD,GAAqB91H,CAAK,EAC1CupF,GAAessC,GAAe71H,CAAK,EACzC02H,GAAA,EAEA,MAAM0C,GAAmB,CAACjuB,GAAQhlG,KAAW,CAC3C,MAAMxH,GAAUwsG,GAAO,MACvBA,GAAO,YAAc,GACrB,UAAW72G,MAAS6R,GAAQ,CAC1B,MAAM83G,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQ3pH,GACZ2pH,GAAI,YAAc3pH,GAClB62G,GAAO,YAAY8S,EAAG,CACxB,CACI93G,GAAO,SAASxH,EAAO,OAAU,MAAQA,GAC/C,EAEAy6H,GAAiB9B,GAAgB7pD,EAAK,EACtC2rD,GAAiB7B,GAAe,CAAC,OAAQ,GAAG2B,EAAY,CAAC,EAEpDzrD,GAAM,SAASztE,EAAM,QAAQ,EAIhCs3H,GAAe,MAAQt3H,EAAM,UAH7Bs3H,GAAe,MAAQ,UACvB1B,GAAa,CAAE,SAAU,UAAW,GAKjC,CAAC,OAAQ,GAAGsD,EAAY,EAAE,SAASl5H,EAAM,eAAe,EAI3Du3H,GAAc,MAAQv3H,EAAM,iBAH5Bu3H,GAAc,MAAQ,OACtB3B,GAAa,CAAE,gBAAiB,OAAQ,GAK1C4B,EAAqB,MAAQjuC,GAAe,WAAa,aACzD4tC,GAAc,QAAUn3H,EAAM,UAAY,GAC1C64H,GAAwB,MAAQ5C,GAA4B,KAAM3zG,IAAUA,GAAM,QAAUtiB,EAAM,iBAAiB,EAC/GA,EAAM,kBACN,OACJo3H,EAAa,QAAUp3H,EAAM,cAAgB,GAC7C03H,GAAgB,QAAU13H,EAAM,cAAgB,GAChDo4H,GAAa,QAAUp4H,EAAM,iBAAmB,GAChDs4H,GAAwB,QAAUt4H,EAAM,4BAA8B,GACtE63H,GAAgB,QAAU73H,EAAM,gBAAkB,GAClD03H,GAAgB,SAAWH,GAAc,QAAU,QAAUhuC,GAE7DquC,GAAiB,SAAS,KAAK,IAAI,IAAM,OAAO53H,EAAM,WAAa,CAAC,CAAC,CAAC,EACtE83H,GAAc,SAAS,KAAK,IAAI,EAAG,OAAO93H,EAAM,aAAe,CAAC,CAAC,CAAC,EAClEg4H,GAAe,SAAS,KAAK,IAAI,KAAM,OAAOh4H,EAAM,SAAW,IAAI,CAAC,CAAC,EACrEk4H,GAAqB,SAAS,KAAK,IAAI,WAAa,OAAOl4H,EAAM,eAAiB,CAAC,CAAC,CAAC,EACrF24H,GAAmB9B,GAAkB72H,EAAM,YAAY,EAAG,CAAE,OAAQ,GAAO,EAE3E,MAAMq5H,GAAiBtD,GAA6B/1H,CAAK,EACzD2zH,GAAe,SAAS0F,EAAc,EACtCpC,GAAcM,GAAc,QAAQ,gBAAgB,EAAG/hC,EAAc,EACrE0hC,GAAcO,GAAQ,IAAK0B,EAAa,EACxClC,GAAcU,GAAa,IAAK,CAACpuC,IAAgBguC,GAAc,QAAU,MAAM,EAC/EN,GAAcc,GAAU,IAAK,CAACxuC,EAAY,EAC1C2tC,GAAce,GAAW,IAAKkB,IAAiB5vC,EAAY,EAC3D2tC,GAAciB,GAAiB,IAAKgB,IAAiB5vC,EAAY,EACjE2tC,GAAcmB,GAAU,IAAKc,IAAiB5vC,EAAY,EAC1D2tC,GAAcqB,GAAqB,IAAKY,IAAiB5vC,EAAY,EACrEqtC,GAAuB52H,CAAK,CAC9B,EAEMu1H,GAAoB,IAAMuD,GAAA,EAChC,IAAIjyB,GAAQ,KACZ,OAAIhnG,GAAQ,GACVgnG,GAAQhnG,EAAO,GAAG,mBAAoB01H,EAAiB,EAC9C11H,GAAQ,mBACjBA,EAAO,iBAAiB,mBAAoB01H,EAAiB,EAC7D1uB,GAAQ,IAAMhnG,EAAO,oBAAoB,mBAAoB01H,EAAiB,GAE5E1uB,IAAOuU,EAAG,iBAAiB,IAAIvU,EAAK,EAExCiyB,GAAA,EACO,CAAE,KAAA7pH,EAAM,QAAA6pH,EAAA,CACjB,EAEMQ,GAAUrX,GAAc,MAAM,EAC9BsX,GAAUtX,GAAc,MAAM,EAC9BuX,GAAahE,GAAA,EAEnB,IAAIiE,GAAa,OAEjB,MAAMC,GAAgB,SAAS,cAAc,QAAQ,EACrDA,GAAc,UAAY,6CAC1Ble,EAAS,cAAcke,GAAe,sCAAsC,EAE5E,MAAMC,GAAe,IACfF,KAAe,OAAeF,GAC9BE,KAAe,UAAkB,KAC9BH,GAGHM,GAAoB,IAAM,CAC9B,MAAMnrB,EAAMkrB,GAAA,EACZ,GAAI,CAAClrB,EAAK,CACRirB,GAAc,SAAW,GACzBA,GAAc,MAAM,QAAU,OAC9B,MACF,CACAA,GAAc,SAAW,GACzBA,GAAc,MAAM,QAAU,GAC9B,KAAM,CAAE,SAAAl7D,GAAU,MAAAx+D,CAAA,EAAUyuG,EAC5BirB,GAAc,YAAc,GAC5B,UAAW7iI,KAAQ2nE,GAAU,CAC3B,MAAMy/C,EAAM,SAAS,cAAc,QAAQ,EAC3CA,EAAI,MAAQpnH,EACZonH,EAAI,YAAcvC,EAAe7kH,CAAI,GAAKA,EAC1C6iI,GAAc,YAAYzb,CAAG,CAC/B,CACAyb,GAAc,MAAQl7D,GAAS,SAASx+D,EAAM,OAAO,EAAIA,EAAM,QAAUw+D,GAAS,CAAC,CACrF,EAEA,OAAAk7D,GAAc,iBAAiB,SAAU,IAAM,CAC7C,MAAMjrB,EAAMkrB,GAAA,EACPlrB,IACLA,EAAI,WAAWirB,GAAc,KAAK,EAClCE,GAAA,EACF,CAAC,EAEDA,GAAA,EAEOxe,EAAG,kBAAkB,CAC1B,GAAIlmH,EAAQ,IAAM,oBAClB,MAAOA,EAAQ,OAAS,UACxB,SAAUA,EAAQ,UAAY,CAAE,EAAG,GAAI,EAAG,GAAA,EAC1C,KAAMA,EAAQ,MAAQ,WACtB,SAAUwkI,GACV,gBAAkBhrB,GAAU,CACtBA,IAAU,QAAS+qB,GAAa,OAC3B/qB,IAAU,UAAW+qB,GAAa,UACtCA,GAAa,OACdA,KAAe,WAAWD,GAAW,UAAA,EACzCI,GAAA,CACF,EACA,KAAM,CACJ,CACE,GAAI,QACJ,MAAO,QACP,QAASN,GAAQ,IAAA,EAEnB,CACE,GAAI,QACJ,MAAO,QACP,QAASC,GAAQ,IAAA,EAEnB,CAAE,GAAI,UAAW,MAAO,UAAW,QAASC,GAAW,IAAA,CAAK,EAE9D,QAAS,QACT,YAAajpB,EAAA,CACd,CACH,CACF,CCluKA,MAAMspB,GAA6B,2BAEnC,SAAS/1H,GAASxP,EAAOC,EAAW,KAAM,CACxC,MAAMC,EAAU,OAAOF,CAAK,EAC5B,OAAO,OAAO,SAASE,CAAO,EAAIA,EAAUD,CAC9C,CAEA,SAASulI,GAAoBxlI,EAAO,CAClC,MAAME,EAAU,OAAOF,CAAK,EAC5B,GAAI,CAAC,OAAO,SAASE,CAAO,EAAG,MAAO,IACtC,MAAMovF,EAAM,KAAK,IAAIpvF,CAAO,EAC5B,OAAIovF,GAAO,IAAapvF,EAAQ,QAAQ,CAAC,EACrCovF,GAAO,IAAYpvF,EAAQ,QAAQ,CAAC,EACpCovF,GAAO,GAAWpvF,EAAQ,QAAQ,CAAC,EACnCovF,GAAO,EAAUpvF,EAAQ,QAAQ,CAAC,EAClCovF,GAAO,IAAapvF,EAAQ,QAAQ,CAAC,EAClCA,EAAQ,cAAc,CAAC,CAChC,CAEA,SAASulI,GAAmB1+H,EAAS/G,EAAO,CAC1C,GAAI,OAAO+G,GAAS,QAAW,WAC7B,GAAI,CACF,OAAO,OAAOA,EAAQ,OAAO/G,CAAK,CAAC,CACrC,MAAY,CACV,OAAO,OAAOA,GAAS,GAAG,CAC5B,CAEF,OAAI,OAAOA,GAAU,SAAiBwlI,GAAoBxlI,CAAK,EAC3D,OAAOA,GAAU,UAAkBA,EAAQ,KAAO,MAClDA,GAAS,MAAQA,IAAU,GAAW,IACnC,OAAOA,CAAK,CACrB,CAEA,SAASsjH,GAAYtjH,EAAOsK,EAAKoF,EAAK,CACpC,MAAMxP,EAAU,OAAOF,CAAK,EAC5B,GAAI,CAAC,OAAO,SAASE,CAAO,EAAG,OAAO,KACtC,IAAIsC,EAAOtC,EACX,MAAMi/G,EAAWumB,GAAmBp7H,EAAK,IAAI,EACvC80G,EAAWsmB,GAAmBh2H,EAAK,IAAI,EAC7C,OAAI,OAAO,SAASyvG,CAAQ,IAAG38G,EAAO,KAAK,IAAI28G,EAAU38G,CAAI,GACzD,OAAO,SAAS48G,CAAQ,IAAG58G,EAAO,KAAK,IAAI48G,EAAU58G,CAAI,GACtDA,CACT,CAEA,SAASkjI,GAAmBxvE,EAASj2D,EAAW,KAAM,CACpD,GAAIi2D,GAAW,MAAQA,IAAY,GAAI,CACrC,GAAIj2D,GAAY,MAAQA,IAAa,GAAI,OAAO,KAChD,MAAM0lI,EAAkB,OAAO1lI,CAAQ,EACvC,OAAO,OAAO,SAAS0lI,CAAe,EAAIA,EAAkB,IAC9D,CACA,MAAMzlI,EAAU,OAAOg2D,CAAO,EAC9B,GAAI,OAAO,SAASh2D,CAAO,EAAG,OAAOA,EACrC,GAAID,GAAY,MAAQA,IAAa,GAAI,OAAO,KAChD,MAAM0lI,EAAkB,OAAO1lI,CAAQ,EACvC,OAAO,OAAO,SAAS0lI,CAAe,EAAIA,EAAkB,IAC9D,CAEA,SAASC,GAAa7+H,EAAS,CAC7B,OAAOA,GAAS,QAAU,KAC5B,CAEA,SAAS8+H,GAAkBn9B,EAAM,CAC/B,MAAMh3B,EAAQ,OAAOg3B,GAAQ,EAAE,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAC1D,OAAIh3B,EAAM,QAAU,EAAU,GAAGA,EAAM,CAAC,CAAC,IAAIA,EAAM,CAAC,CAAC,GAC9CA,EAAM,CAAC,GAAK,EACrB,CAEA,SAASo0D,GAAiBz5H,EAAS,GAAI,CACrC,MAAMkC,EAAO,CAAA,EAGb,GAFI,OAAOlC,EAAO,YAAe,UAAUkC,EAAK,KAAKlC,EAAO,UAAU,EAClE,OAAOA,EAAO,UAAa,UAAUkC,EAAK,KAAKlC,EAAO,QAAQ,EAC9D,MAAM,QAAQA,EAAO,WAAW,EAClC,UAAWlJ,KAAOkJ,EAAO,YAAiB,OAAOlJ,GAAQ,UAAUoL,EAAK,KAAKpL,CAAG,EAElF,GAAI,MAAM,QAAQkJ,EAAO,SAAS,EAChC,UAAWlJ,KAAOkJ,EAAO,UAAe,OAAOlJ,GAAQ,UAAUoL,EAAK,KAAKpL,CAAG,EAEhF,OAAOoL,CACT,CAEA,SAASw3H,GAAsB5iI,EAAKrB,EAAQ,CAC1C,MAAI,CAACqB,GAAO,CAACrB,EAAe,GACrBqB,IAAQrB,GAAUqB,EAAI,WAAW,GAAGrB,CAAM,GAAG,GAAKA,EAAO,WAAW,GAAGqB,CAAG,GAAG,CACtF,CAEA,SAAS6iI,GAAuB35H,EAAS,GAAIq8F,EAAO,GAAI,CACtD,MAAMn6F,EAAOu3H,GAAiBz5H,CAAM,EACpC,OAAKkC,EAAK,OACHA,EAAK,KAAMpL,GAChB4iI,GAAsB5iI,EAAKulG,CAAI,GAC5Bq9B,GAAsB5iI,EAAK,aAAaulG,CAAI,EAAE,CAClD,EAJwB,EAK3B,CAEA,SAASu9B,GAAkBjmI,EAAO+G,EAAS,CACzC,MAAM7G,EAAU,OAAOF,CAAK,EAC5B,GAAI,CAAC,OAAO,SAASE,CAAO,EAAG,MAAO,GACtC,GAAI6G,GAAS,WAAa,aACxB,OAAO7G,EAAQ,cAAc,CAAC,EAEhC,MAAM2uD,EAAO,OAAO9nD,GAAS,IAAI,EACjC,OAAI,OAAO,SAAS8nD,CAAI,GAAKA,GAAQ,EAC5B,OAAO,KAAK,MAAM3uD,CAAO,CAAC,EAE5B,OAAO,OAAOA,EAAQ,QAAQ,CAAC,CAAC,CAAC,CAC1C,CAEA,SAASgmI,GAAmBlmI,EAAO2vB,EAAQ,SAAU,CACnD,MAAMzvB,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACxByvB,IAAU,MACL,KAAK,MAAM,KAAK,IAAI,KAAMzvB,CAAO,CAAC,EAEpCA,EAJ+B,IAKxC,CAEA,SAASimI,GAAoBC,EAAO,CAClC,MAAM/vG,EAAM,OAAO+vG,GAAU,WAAaA,EAAK,EAAKA,EAC9ClmI,EAAU,OAAOm2B,CAAG,EAC1B,OAAO,OAAO,SAASn2B,CAAO,EAAIA,EAAU,IAC9C,CAEO,SAASmmI,GAAmBj3E,EAASvsD,EAAOC,EAAQ6sB,EAAQ,SAAU9lB,EAAS,KAAM,CAC1F,MAAMgI,EAASu9C,EACZ,IAAKj7B,GAAW,OAAOA,CAAM,CAAC,EAC9B,OAAQA,GAAW,OAAO,SAASA,CAAM,CAAC,EAC7C,GAAI,CAACtiB,EAAO,OAAQ,MAAO,GAE3B,MAAMy0H,EAAcz0H,EACjB,IAAKsiB,GAAW+xG,GAAmB/xG,EAAQxE,CAAK,CAAC,EACjD,OAAQwE,GAAW,OAAO,SAASA,CAAM,CAAC,EAC7C,GAAI,CAACmyG,EAAY,OAAQ,MAAO,GAEhC,MAAMC,EAAWJ,GAAoBt8H,GAAQ,GAAG,EAC1C28H,EAAWL,GAAoBt8H,GAAQ,GAAG,EAC1CS,EAAM,OAAO,SAASi8H,CAAQ,EAChCL,GAAmBK,EAAU52G,CAAK,EAClC,KAAK,IAAI,GAAG22G,CAAW,EACrB52H,EAAM,OAAO,SAAS82H,CAAQ,EAChCN,GAAmBM,EAAU72G,CAAK,EAClC,KAAK,IAAI,GAAG22G,CAAW,EACrBj2C,EAAO,KAAK,IAAI,KAAM3gF,EAAMpF,CAAG,EACrC,GAAIg8H,EAAY,SAAW,EAAG,CAC5B,MAAM/lI,EAAa8vF,GAAQ,KAAO,GAAM,KAAK,IAAI,EAAG,KAAK,IAAI,GAAIi2C,EAAY,CAAC,EAAIh8H,GAAO+lF,CAAI,CAAC,EAE9F,MAAO,QADGvtF,EAAUvC,EAAauC,GACjB,QAAQ,CAAC,CAAC,EAC5B,CACA,OAAOwjI,EAAY,IAAI,CAACtmI,EAAOsT,IAAU,CACvC,MAAM3K,EAAK2K,EAAQ,KAAK,IAAI,EAAGgzH,EAAY,OAAS,CAAC,EAAKzjI,EACpDtC,EAAa8vF,GAAQ,KAAO,GAAM,KAAK,IAAI,EAAG,KAAK,IAAI,GAAIrwF,EAAQsK,GAAO+lF,CAAI,CAAC,EAC/EznF,EAAI9F,EAAUvC,EAAauC,EACjC,MAAO,GAAGwQ,IAAU,EAAI,IAAM,GAAG,IAAI3K,EAAE,QAAQ,CAAC,CAAC,IAAIC,EAAE,QAAQ,CAAC,CAAC,EACnE,CAAC,EAAE,KAAK,GAAG,CACb,CAEA,SAAS69H,IAAiB,CACxB,MAAMngD,EAAM,SAAS,gBAAgB,6BAA8B,KAAK,EACxEA,EAAI,aAAa,UAAW,WAAW,EACvCA,EAAI,UAAU,IAAI,wBAAwB,EAE1C,MAAMoiB,EAAO,SAAS,gBAAgB,6BAA8B,MAAM,EAC1E,OAAAA,EAAK,aAAa,IAAK,mBAAmB,EAC1CA,EAAK,aAAa,OAAQ,cAAc,EACxCA,EAAK,aAAa,SAAU,MAAM,EAElCpiB,EAAI,YAAYoiB,CAAI,EACbpiB,CACT,CAEA,SAASogD,IAAkB,CACzB,MAAMpgD,EAAM,SAAS,gBAAgB,6BAA8B,KAAK,EACxEA,EAAI,aAAa,UAAW,WAAW,EACvCA,EAAI,UAAU,IAAI,wBAAwB,EAE1C,UAAW39E,IAAK,CAAC,EAAG,EAAE,EAAG,CACvB,MAAM/F,EAAO,SAAS,gBAAgB,6BAA8B,MAAM,EAC1EA,EAAK,aAAa,IAAK,OAAO+F,CAAC,CAAC,EAChC/F,EAAK,aAAa,IAAK,KAAK,EAC5BA,EAAK,aAAa,QAAS,GAAG,EAC9BA,EAAK,aAAa,SAAU,IAAI,EAChCA,EAAK,aAAa,KAAM,MAAM,EAC9BA,EAAK,aAAa,OAAQ,cAAc,EACxC0jF,EAAI,YAAY1jF,CAAI,CACtB,CAEA,OAAO0jF,CACT,CAEA,SAASqgD,IAA0B,CACjC,MAAMrgD,EAAM,SAAS,gBAAgB,6BAA8B,KAAK,EACxEA,EAAI,aAAa,UAAW,WAAW,EACvCA,EAAI,UAAU,IAAI,kCAAkC,EAEpD,MAAMoiB,EAAO,SAAS,gBAAgB,6BAA8B,MAAM,EAC1E,OAAAA,EAAK,aAAa,IAAK,0BAA0B,EACjDA,EAAK,aAAa,OAAQ,MAAM,EAChCA,EAAK,aAAa,SAAU,cAAc,EAC1CA,EAAK,aAAa,eAAgB,GAAG,EACrCA,EAAK,aAAa,iBAAkB,OAAO,EAC3CA,EAAK,aAAa,kBAAmB,OAAO,EAE5CpiB,EAAI,YAAYoiB,CAAI,EACbpiB,CACT,CAEA,SAASsgD,GAAUr7H,EAAQonG,EAAWtuG,EAAS,CAC7C,MAAI,CAACkH,GAAU,OAAOlH,GAAY,WAAmB,IAAM,CAAC,EACxD,OAAOkH,EAAO,IAAO,WAChBA,EAAO,GAAGonG,EAAWtuG,CAAO,IAAM,IAAM,CAAC,GAE9C,OAAOkH,EAAO,kBAAqB,YACrCA,EAAO,iBAAiBonG,EAAWtuG,CAAO,EACnC,IAAMkH,EAAO,oBAAoBonG,EAAWtuG,CAAO,GAErD,IAAM,CAAC,CAChB,CAEO,MAAMwiI,EAAY,CACvB,YAAY/f,EAAIlmH,EAAU,GAAI,CAC5B,KAAK,GAAKkmH,EACV,KAAK,QAAUlmH,CACjB,CAEA,QAAS,CACP,MAAM2K,EAAS,KAAK,GAAG,QAAU,KAC3B09F,EAAU,SAAS,cAAc,KAAK,EACtC69B,EAAiBv7H,GAAQ,UAAU,QAAUA,GAAQ,cAAc,QAAQ,EAC3EsuC,EAAUtuC,GAAQ,SAAW,KAC7ByoG,EAAezoG,GAAQ,QAAUsuC,EAEvC,GAAI,CAACtuC,GAAU,CAACu7H,EAAgB,CAC9B,MAAMC,EAAc,SAAS,cAAc,KAAK,EAChDA,EAAY,UAAY,wBACxBA,EAAY,YAAc,KAAK,QAAQ,aAAe,0CACtD,KAAM,CAAE,IAAA7jF,CAAG,EAAK0vD,GAAmB,CACjC,MAAO,KAAK,QAAQ,kBAAoB,SACxC,SAAUm0B,CAClB,CAAO,EACD,OAAA99B,EAAQ,YAAY/lD,CAAG,EAChB,KAAK,GAAG,YAAY,CACzB,GAAI,KAAK,QAAQ,IAAM,mBACvB,MAAO,KAAK,QAAQ,OAAS,SAC7B,SAAU,KAAK,QAAQ,UAAY,CAAE,EAAG,GAAI,EAAG,GAAG,EAClD,KAAM,KAAK,QAAQ,MAAQ,YAC7B,QAAA+lD,CACN,CAAO,CACH,CAEA,MAAM+9B,EAAgB,IAAI,IACpBC,EAAyB,IAAI,IAC7BC,EAA0B,IAAI,IACpC,IAAIC,EAAuB,KACvBC,EAAsB,KACtBC,EAA8B,KAC9BC,EAA4BR,EAAe,oBAAiB,GAAQvB,GACxE,MAAMgC,EAAuB,IAAMT,EAAe,gBAAkB,CAClE,IAAK,SACL,MAAO,SACP,QAAS,GACT,SAAU,CAAA,CAChB,EACUU,EAAU,CAACzlI,EAAS/B,IAAU,CAClC,MAAMwC,EAAO,OAAOxC,GAAS,EAAE,EAC3B+B,GAAWA,EAAQ,cAAgBS,IAAMT,EAAQ,YAAcS,EACrE,EACMilI,EAAwB,CAAC1lI,EAASQ,EAAMvC,IAAU,CACtD,GAAI,CAAC+B,EAAS,OACd,MAAMS,GAAO,OAAOxC,GAAS,EAAE,GACf,OAAO+B,EAAQ,cAAiB,WAC5CA,EAAQ,aAAaQ,CAAI,EACzBR,EAAQ,YAAY,MAAM,OAAOQ,CAAI,CAAC,KAC1BC,IAAMT,EAAQ,aAAaQ,EAAMC,EAAI,CACvD,EACMklI,EAAsB,CAAC3lI,EAASoB,EAAKnD,IAAU,CACnD,GAAI,CAAC+B,GAAS,QAAS,OACvB,MAAMS,GAAO,OAAOxC,GAAS,EAAE,EAC3B+B,EAAQ,QAAQoB,CAAG,IAAMX,KAAMT,EAAQ,QAAQoB,CAAG,EAAIX,GAC5D,EACMmlI,EAAsB,CAAC5lI,EAAS/B,IAAU,CAC1C+B,GAAWA,EAAQ,MAAM,UAAY/B,IAAO+B,EAAQ,MAAM,QAAU/B,EAC1E,EAEM4nI,EAAe,SAAS,cAAc,QAAQ,EACpDA,EAAa,UAAY,mBAEzB,MAAMC,EAA0B,SAAS,cAAc,QAAQ,EAC/DA,EAAwB,UAAY,mBAEpC,MAAMC,EAAiB,SAAS,cAAc,KAAK,EACnDA,EAAe,UAAY,iCAE3B,MAAMC,EAAe,SAAS,cAAc,KAAK,EACjDA,EAAa,UAAY,kCAEzB,MAAMC,EAAkB,SAAS,gBAAgB,6BAA8B,KAAK,EACpFA,EAAgB,aAAa,UAAW,YAAY,EACpDA,EAAgB,aAAa,sBAAuB,MAAM,EAC1DA,EAAgB,UAAU,IAAI,8BAA+B,qCAAqC,EAElG,MAAMC,EAAsB,SAAS,gBAAgB,6BAA8B,MAAM,EACzFA,EAAoB,aAAa,OAAQ,MAAM,EAC/CA,EAAoB,aAAa,gBAAiB,oBAAoB,EACtED,EAAgB,YAAYC,CAAmB,EAE/C,MAAMC,EAAkB,SAAS,cAAc,KAAK,EACpDA,EAAgB,UAAY,gCAC5BA,EAAgB,YAAc,QAE9B,MAAMC,EAAc,SAAS,cAAc,KAAK,EAChDA,EAAY,UAAY,iCAExB,MAAMC,EAAgBzB,GAAuB,EACvC0B,EAAa,SAAS,cAAc,MAAM,EAChDA,EAAW,UAAY,gCAEvBF,EAAY,YAAYC,CAAa,EACrCD,EAAY,YAAYE,CAAU,EAClCN,EAAa,YAAYC,CAAe,EACxCD,EAAa,YAAYG,CAAe,EACxCH,EAAa,YAAYI,CAAW,EAEpC,MAAMG,EAAY,SAAS,cAAc,QAAQ,EACjDA,EAAU,KAAO,SACjBA,EAAU,UAAY,kCAEtB,MAAMC,EAAoB,SAAS,cAAc,MAAM,EACvDA,EAAkB,UAAY,uCAE9BT,EAAe,YAAYC,CAAY,EACvCD,EAAe,YAAYQ,CAAS,EAEpC,MAAME,EAA2BtzB,GAAoB,CACnD,QAAS4xB,EAAe,qBAAkB,IAAS,GACnD,QAAS,KACT,SAAU,MACV,UAAW,qCACjB,CAAK,EACD0B,EAAyB,QAAQ,OAAS,iCAE1C,MAAMC,EAAe,SAAS,cAAc,KAAK,EACjDA,EAAa,UAAY,6BAEzB,IAAIC,EAAgB,KAChBC,EAAgB,CAAA,EAChBC,EAAqB,OAAO,kBAEhC,MAAMC,EAAgC,CAACngC,EAAMzoG,EAAW,YACtDyoG,IAAS,iBAAmB,UAAYzoG,EAEpC6oI,EAAsBpgC,GAASsL,GAAc,QAAQtL,CAAI,GAAK,KAC9DqgC,EAAqB,CAACrgC,EAAMzoG,EAAW,OAAS,CACpD,MAAM+tB,EAAQ86G,EAAmBpgC,CAAI,EAC/B1oG,GAAQg0G,GAAc,MAAMtL,EAAM,MAAS,EACjD,OAAO1oG,KAAU,OAAaguB,GAAO,SAAW/tB,EAAYD,EAC9D,EACMgpI,EAAyBjiI,GACzBA,GAAS,OAAS,UAAkB,UACpCA,GAAS,OAAS,SAAiB,SACnCA,GAAS,OAAS,SAAiB,SAChC,SAEHkiI,EAAgBliI,GACnB,OAAOA,GAAS,OAAU,UAAYA,EAAQ,MAAM,KAAI,EACrDA,EAAQ,MAAM,KAAI,EAClByzG,GAAqBzzG,GAAS,GAAG,EAEjCmiI,GAAuBniI,IAAa,CACxC,MAAOkiI,EAAaliI,CAAO,EAC3B,WAAYA,GAAS,OAAS,SAC1B,SACCA,GAAS,OAAS,UAAY,SAAYA,GAAS,OAAS,SAAW,SAAW,OACvF,IAAKA,GAAS,KAAOA,GAAS,WAAa,KAC3C,IAAKA,GAAS,KAAOA,GAAS,WAAa,KAC3C,KAAMA,GAAS,MAAQA,GAAS,WAAa,KAC7C,SAAUA,GAAS,UAAY,KAC/B,SAAU,OAAO,UAAU,eAAe,KAAKA,GAAW,CAAA,EAAI,UAAU,EAAIA,EAAQ,SAAW,KAC/F,UAAWA,GAAS,WAAa,KACjC,UAAWA,GAAS,WAAa,KACjC,MAAOA,GAAS,OAAS,KACzB,QAASA,GAAS,SAAW,KAC7B,WAAY,GAClB,GACUoiI,GAA+B,CAACzgC,EAAM9nG,EAAU,CAAA,IAAO,CAC3D,GAAIkoI,EAAmBpgC,CAAI,EAAG,OAAO,KACrC,MAAM1iE,EAAQplC,EAAQ,kBAAoBA,EAAQ,OAASioI,EAA8BngC,CAAI,EACvF0gC,GAAaxoI,EAAQ,aAAe8nG,EAAK,WAAW,oBAAoB,EAAI,IAAM,KAClF2gC,GAAkB,CACtB,MAAArjG,EACA,WAAAojG,GACA,SAAUxoI,EAAQ,UAAY,CAAA,CACtC,EACM,OAAI,OAAO,UAAU,eAAe,KAAKA,EAAS,cAAc,IAC9DyoI,GAAgB,aAAezoI,EAAQ,cAElC,KAAK,GAAG,uBAAuB8nG,EAAM2gC,EAAe,GACtD,KAAK,GAAG,oBAAoB3gC,EAAM2gC,EAAe,CACxD,EACMC,GAAuB,CAAC5gC,EAAO,GAAI6gC,EAAiB,KAAM3oI,EAAU,KAAO,CAC/E,GAAI,KAAK,GAAG,wBAA0B,GAAO,OAAO,KAChD8nG,GAAMygC,GAA6BzgC,EAAM9nG,CAAO,EACpD,MAAM4oI,GAAyBD,GAAkB1D,GAAkBn9B,CAAI,EACvE,OAAO,KAAK,GAAG,uBAAuBA,EAAM8gC,GAAwB,CAAE,SAAU,EAAK,CAAE,GAClFp1B,GAAqB,CACtB,OAAA7oG,EACA,KAAAm9F,EACA,MAAO8gC,EACjB,CAAO,CACH,EACMC,GAAqB,CAAC/gC,EAAM1oG,EAAOY,EAAU,CAAA,IAAO,CACxD,MAAMolC,GAAQplC,EAAQ,OAASioI,EAA8BngC,CAAI,EAC3D0gC,GAAaxoI,EAAQ,aAAe8nG,EAAK,WAAW,oBAAoB,EAAI,IAAM,KACxF,GAAI,OAAOsL,GAAc,KAAQ,YAAc80B,EAAmBpgC,CAAI,EAAG,CACvEsL,EAAa,IAAItL,EAAM1oG,EAAO,CAC5B,MAAAgmC,GACA,OAAQ,KACR,OAAQplC,EAAQ,QAAU,iBAC1B,QAAS,EACnB,CAAS,EACD,MACF,CACAuoI,GAA6BzgC,EAAM,CAAE,MAAA1iE,GAAO,WAAAojG,GAAY,SAAUxoI,EAAQ,UAAY,CAAA,EAAI,GAC3E,KAAK,GAAG,mBAAqB,KAAK,GAAG,mBAC5C,KAAK,KAAK,GAAI8nG,EAAM1oG,EAAO,CACjC,MAAAgmC,GACA,OAAQ,KACR,OAAQplC,EAAQ,QAAU,iBAC1B,WAAAwoI,EACR,CAAO,CACH,EACMM,GAAgC3iI,GAAY,CAChD,MAAM5D,EAAM,OAAO4D,GAAS,KAAQ,SAAWA,EAAQ,IAAI,KAAI,EAAK,GACpE,GAAI,CAAC5D,GAAO,CAAC6wG,GAAgB,OAAOA,EAAa,UAAa,WAAY,OAAO,KACjF,MAAMtL,EAAO,qBAAqBvlG,CAAG,GACrC,GAAI2lI,EAAmBpgC,CAAI,EAAG,OAAO,KACrC,MAAMuM,GAAUjB,EAAa,SAAS,KAAM,mBAAoB,CAC9D,CAAC,cAAc7wG,CAAG,EAAE,EAAG,CACrB,YAAa4D,EAAQ,MAAQ,oBAAoB5D,CAAG,IACpD,QAAS4D,EAAQ,MAAG,EACpB,KAAMiiI,EAAsBjiI,CAAO,EACnC,MAAO,YACP,QAAS,CAAC2hG,CAAI,EACd,GAAIwgC,GAAoBniI,CAAO,EAC/B,OAAQ,IAAM+/H,EAAe,YAAY3jI,CAAG,EAC5C,OAASnD,IAAU8mI,EAAe,YAAY3jI,EAAKnD,GAAO,CAAE,OAAQ,GAAM,EAC1E,UAAY2pI,IAAW7C,EAAe,KAAK,SAAWzkI,IAAU,CAC9D,MAAMgK,GAAShK,IAAO,QAAU,CAAA,EAC1BunI,GAAav9H,GAAO,KAAO,KAC3Bw9H,GAAc,MAAM,QAAQx9H,GAAO,IAAI,EAAIA,GAAO,KAAO,CAAA,EAC3Du9H,IAAcA,KAAezmI,GAC7B0mI,GAAY,QAAU,CAACA,GAAY,SAAS1mI,CAAG,GAC/C,CAACymI,IAAc,CAACC,GAAY,QAAU,CAAC7D,GAAuB35H,GAAQq8F,CAAI,GAC9EihC,GAAO,OAAWt9H,EAAM,CAC1B,CAAC,CACX,CACA,CAAO,EAED,GADI,OAAO4oG,IAAY,YAAYgyB,EAAuB,IAAIv+B,EAAMuM,EAAO,EACvEjB,EAAa,SAAStL,EAAM,CAAE,kBAAmB,EAAI,CAAE,GAAG,cAAgB,GAAM,CAClF,MAAMohC,GAAWf,EAAmBrgC,EAAM,MAAS,EAC/CohC,KAAa,QAAWhD,EAAe,YAAY3jI,EAAK2mI,GAAU,CAAE,OAAQ,GAAM,CACxF,CACA,OAAO70B,EACT,EACM80B,GAA8B14G,GAAe,CACjD,UAAWtqB,KAAWsqB,GAAY,UAAY,CAAA,EAExC,EADQ,OAAOtqB,GAAS,KAAQ,UAAWA,EAAQ,IAAI,KAAI,IACnDA,EAAQ,OAAS,WAC7B2iI,GAA6B3iI,CAAO,CAExC,EAEMijI,EAAwBt6B,IACxBA,GAAW,SAASw3B,EAAwB,IAAI,IAAMx3B,EAAU,SAAS,EACtEA,GAGHu6B,GAAYr3B,GAAmB,CACnC,MAAO,SACP,SAAUg1B,EACV,eAAgBoC,EAAqBV,GAAqB,oBAAqB,SAAU,CACvF,aAAcR,EAAmB,mBAAmB,GAAG,SAAWvB,EAAoB,EAAG,GACjG,CAAO,CAAC,CACR,CAAK,EACDt+B,EAAQ,YAAYghC,GAAU,GAAG,EAEjC,MAAMC,EAAYt3B,GAAmB,CACnC,MAAO,WACP,KAAM,2EACN,SAAUi1B,EACV,eAAgB,IACtB,CAAK,EACD5+B,EAAQ,YAAYihC,EAAU,GAAG,EAEjC,MAAMC,EAASv3B,GAAmB,CAChC,MAAO,SACP,SAAUk1B,EACV,eAAgBkC,EAAqBV,GAAqB,iBAAkB,SAAU,CACpF,iBAAkB,UAClB,aAAcR,EAAmB,gBAAgB,GAAG,UAAahC,EAAe,WAAQ,GAAQ,aAAe,SACvH,CAAO,CAAC,CACR,CAAK,EACD79B,EAAQ,YAAYkhC,EAAO,GAAG,EAE9B,MAAMC,GAAwBx3B,GAAmB,CAC/C,MAAO,iBACP,KAAM,yIACN,SAAU41B,EACV,eAAgBwB,EAAqBV,GAAqB,4BAA6B,SAAU,CAC/F,aAAcR,EAAmB,2BAA2B,GAAG,SAAYhC,EAAe,qBAAkB,IAAS,EAC7H,CAAO,CAAC,CACR,CAAK,EACD79B,EAAQ,YAAYmhC,GAAsB,GAAG,EAC7CnhC,EAAQ,YAAYw/B,CAAY,EAEhC,MAAM7wC,GAAQ,KAAK,GAAG,YAAY,CAChC,GAAI,KAAK,QAAQ,IAAM,mBACvB,MAAO,KAAK,QAAQ,OAAS,SAC7B,SAAU,KAAK,QAAQ,UAAY,CAAE,EAAG,GAAI,EAAG,GAAG,EAClD,KAAM,KAAK,QAAQ,MAAQ,YAC3B,YAAaukB,GACb,QAAAlT,CACN,CAAK,EAEKohC,GAAoB,IAAM,CAC9B,MAAMh5G,EAAak2G,EAAoB,EACjC+C,EAAUxD,EAAe,UAAO,GAAQ,CAAA,EACxChgE,EAAY,KAAK,UAAU,CAC/Bz1C,EAAW,IACX,GAAGi5G,EAAQ,IAAKC,IAAW,CAACA,GAAO,MAAOA,GAAO,KAAK,CAAC,CAC/D,CAAO,EACD,GAAIzjE,IAAcsgE,EAAqB,CACjCQ,EAAa,QAAUv2G,EAAW,MACpCu2G,EAAa,MAAQv2G,EAAW,KAElC,MACF,CACA+1G,EAAsBtgE,EACtB8gE,EAAa,YAAc,GAC3B,UAAW2C,MAAUD,EAAS,CAC5B,MAAMvzB,GAAS,SAAS,cAAc,QAAQ,EAC9CA,GAAO,MAAQwzB,GAAO,MACtBxzB,GAAO,YAAcwzB,GAAO,MAC5B3C,EAAa,YAAY7wB,EAAM,CACjC,CACA,GAAI,CAACuzB,EAAQ,KAAMC,IAAWA,GAAO,QAAUl5G,EAAW,GAAG,EAAG,CAC9D,MAAM0lF,GAAS,SAAS,cAAc,QAAQ,EAC9CA,GAAO,MAAQ1lF,EAAW,IAC1B0lF,GAAO,YAAc1lF,EAAW,MAChCu2G,EAAa,YAAY7wB,EAAM,CACjC,CACA6wB,EAAa,MAAQv2G,EAAW,GAClC,EAEMm5G,GAAsB,IAAM,CAChC,MAAMn5G,EAAak2G,EAAoB,EAEjCrjI,GADc4iI,EAAe,WAAQ,GAAQ,aACnB,UAC1BwD,GAAU,OAAOxD,EAAe,0BAA6B,WAC/DA,EAAe,yBAAwB,EACvC,CAAC,CAAE,MAAOvB,GAA4B,MAAO,oBAAqB,UAAW,EAAG,EAC9Ez+D,GAAY,KAAK,UAAUwjE,GAAQ,IAAKC,IAAW,CAACA,GAAO,MAAOA,GAAO,MAAOA,GAAO,SAAS,CAAC,CAAC,EAClGv9E,GAAgBs9E,GAAQ,CAAC,GAAG,OAAS/E,GAErCkF,GAD4Bp5G,EAAW,UAAY,IAAQntB,EAChBqhI,GAA6B+B,EACxEoD,GAAeJ,GAAQ,KAAMC,IAAWA,GAAO,QAAUE,EAAY,EACvEA,GACAz9E,GAEJ,GAAI8Z,KAAcugE,EAA6B,CAC7CA,EAA8BvgE,GAC9B+gE,EAAwB,YAAc,GACtC,UAAW0C,MAAUD,GAAS,CAC5B,MAAMvzB,GAAS,SAAS,cAAc,QAAQ,EAC9CA,GAAO,MAAQwzB,GAAO,MACtBxzB,GAAO,YAAcwzB,GAAO,MAC5B1C,EAAwB,YAAY9wB,EAAM,CAC5C,CACF,CAEIuwB,IAA8BoD,KAAcpD,EAA4BoD,IACxE7C,EAAwB,QAAU6C,KAAc7C,EAAwB,MAAQ6C,GACtF,EAEMC,GAAkB,IAAM,CAE5B,MAAMC,EADarD,EAAoB,EACZ,UAAY,GACjC77H,EAAQk/H,EAAW9D,EAAe,WAAQ,GAAQ,UAAa,UAC/D+D,GAAUn/H,IAAU,UACpBo/H,GAAYp/H,IAAU,WAAaA,IAAU,OAC7Cga,GAAQha,IAAU,OAAS,OAAUm/H,GAAU,UAAY,UAEjElD,EAAoBwC,EAAO,IAAKS,EAAU,GAAK,MAAM,EACrDlD,EAAoBI,EAAgB,QAASp8H,CAAK,EAClDg8H,EAAoBK,EAAc,QAASr8H,CAAK,EAChDg8H,EAAoBS,EAAa,QAASz8H,CAAK,EAC/C87H,EAAQa,EAAY3iH,EAAK,EACzBgiH,EAAoBW,EAAY,QAAS38H,CAAK,EAC9Ci8H,EAAoBS,EAAeyC,GAAU,GAAK,MAAM,EACxDnD,EAAoBY,EAAW,QAAS58H,CAAK,EAC7C,MAAMq/H,GAAkBD,GAAY,cAAgB,eAChDxC,EAAU,QAAUyC,KAAiBzC,EAAU,MAAQyC,IAC3DtD,EAAsBa,EAAW,aAAcyC,EAAe,EAC9D,MAAMxiC,GAAWuiC,GAAY,QAAU,OACnCvC,EAAkB,QAAQ,WAAahgC,KACzCggC,EAAkB,QAAQ,SAAWhgC,GACrCggC,EAAkB,gBAAgBuC,GAAYpE,GAAe,EAAKD,GAAc,CAAE,GAEhF8B,EAAkB,gBAAkBD,GAAWA,EAAU,YAAYC,CAAiB,EAC1Fd,EAAsBa,EAAW,YAAauC,GAAU,OAAS,OAAO,CAC1E,EAEMG,EAA4B,IAAM,CAClC,SAAS,gBAAkBxC,IAC/BA,EAAyB,QAAU1B,EAAe,qBAAkB,IAAS,GAC/E,EAEMmE,GAAqB,IAAM,CAC/BtC,EAAgB,CAAA,EAChBC,EAAqB,OAAO,kBAC5B,MAAMsC,EAAe,OAAOxC,GAAe,MAAG,CAAI,EAC9C,OAAO,SAASwC,CAAY,IAC9BvC,EAAc,KAAKuC,CAAY,EAC/BtC,EAAqB,YAAY,IAAG,GAEtC,MAAMj5G,EAAQ+4G,GAAe,SAAS,QAAU,MAAQ,MAAQ,SAC1D7+H,EAAS6+H,GAAe,SAAW,KACnC54G,GAAIu2G,GAAmBsC,EAAe,IAAK,GAAIh5G,EAAO9lB,CAAM,EAClEo+H,EAAoB,aAAa,IAAKn4G,IAAK,EAAE,CAC/C,EAEMq7G,GAAqB,CAACpkI,EAAS/G,IAAU,CAC7C,GAAI,CAAC+G,EAAS,OACd,MAAMqkI,EAAgBrkI,EAAQ,IAAM,qBAAqBA,EAAQ,GAAG,GAAK,KACzE,GAAIqkI,GAAiBtC,EAAmBsC,CAAa,GAAK,OAAOp3B,GAAc,KAAQ,WACrFA,EAAa,IAAIo3B,EAAeprI,EAAO,CACrC,OAAQ,KACR,OAAQ,mBACR,QAAS,EACnB,CAAS,MACI,CACL,GAAI+G,EAAQ,KAAO,OAAO+/H,EAAe,WAAc,WACrDA,EAAe,UAAU//H,EAAQ,IAAK/G,EAAO,CAAE,OAAQ,GAAM,UACpD,OAAO+G,EAAQ,KAAQ,WAChCA,EAAQ,IAAI/G,CAAK,MAEjB,QAEF8mI,EAAe,aAAa,YAAa,CACvC,IAAK//H,EAAQ,KAAO,KACpB,MAAA/G,EACA,OAAQ,IAClB,CAAS,EACG+G,EAAQ,KACV0iI,GAAmB,qBAAqB1iI,EAAQ,GAAG,GAAI/G,EAAO,CAC5D,OAAQ,mBACR,SAAU,CAAE,UAAW+G,EAAQ,GAAG,CAC9C,CAAW,CAEL,CACA,MAAMsqB,GAAak2G,EAAoB,EACjC8D,GAAWvE,EAAe,WAAQ,GAAQ,UAC5Cz1G,GAAW,UAAY,IAAQg6G,KAAa,WAC9C9/H,EAAO,cAAW,EAEpBqqG,GAAK,EAAK,CACZ,EAEM01B,GAAuB,IAAM,CACjC9D,EAAQU,EAAiBQ,GAAe,OAAS,OAAO,EACxDf,EAAoBI,EAAcW,EAAgB,GAAK,MAAM,EAC7DuC,GAAkB,CACpB,EAEMM,GAAuB9mI,GAAQ,CACnC,GAAI,CAACikI,GAAe,QAAS,OAC7B,MAAM8C,EAAW,KAAK,IAAI,IAAK,OAAO9C,EAAc,QAAQ,UAAY,GAAI,GAAK,GAAI,EACrF,GAAIjkI,EAAMmkI,EAAqB4C,EAAU,OACzC,MAAM/4B,EAAY,OAAOi2B,EAAc,MAAG,CAAI,EAC9C,GAAI,CAAC,OAAO,SAASj2B,CAAS,EAAG,OACjCm2B,EAAqBnkI,EACrBkkI,EAAc,KAAKl2B,CAAS,EAC5B,MAAMvgG,GAAQ,KAAK,IAAI,EAAG,KAAK,MAAMw2H,EAAc,QAAQ,QAAU,EAAE,CAAC,EACxE,KAAOC,EAAc,OAASz2H,IAAOy2H,EAAc,MAAK,EACxD,MAAMh5G,GAAQ+4G,EAAc,QAAQ,QAAU,MAAQ,MAAQ,SACxD7+H,GAAS6+H,EAAc,SAAW,KAClC54G,GAAIu2G,GAAmBsC,EAAe,IAAK,GAAIh5G,GAAO9lB,EAAM,EAClEo+H,EAAoB,aAAa,IAAKn4G,IAAK,EAAE,CAC/C,EAEM27G,GAAiB1kI,GAAY,CACjC,IAAIkrG,EAAW,KACXa,EAAW,KACX0xB,GAAU,IAAM,CAAC,EACjBrwG,GAAS,KACTu3G,GAAU,IAAM,CAAC,EACjBl7B,GAAiB,KACrB,MAAM46B,GAAgBrkI,EAAQ,IAAM,qBAAqBA,EAAQ,GAAG,GAAK,KACnE4kI,GAA2B,IAAOP,GACpC9B,GAAqB8B,GAAe,oBAAqB,CAAE,aAAcrkI,EAAQ,OAAO,CAAE,EAC1F,KAGJ,GAFIqkI,IAAe1B,GAA6B3iI,CAAO,EAEnDA,EAAQ,OAAS,UAAW,CAC9B,MAAM8mH,GAAO,SAAS,cAAc,KAAK,EAEzC,GADAA,GAAK,UAAY,kCACb9mH,EAAQ,QAAS,CACnB,MAAM6kI,GAAY,SAAS,gBAAgB,6BAA8B,KAAK,EAC9EA,GAAU,aAAa,UAAW,YAAY,EAC9CA,GAAU,aAAa,sBAAuB,MAAM,EACpDA,GAAU,UAAU,IAAI,6BAA6B,EAErD,MAAMljC,GAAO,SAAS,gBAAgB,6BAA8B,MAAM,EAC1EA,GAAK,aAAa,OAAQ,MAAM,EAChCA,GAAK,aAAa,gBAAiB,oBAAoB,EACvDkjC,GAAU,YAAYljC,EAAI,EAE1B,MAAMmjC,GAAU,CAAA,EACV35H,GAAQ,KAAK,IAAI,EAAG,KAAK,MAAMnL,EAAQ,QAAQ,QAAU,EAAE,CAAC,EAC5D4oB,GAAQ5oB,EAAQ,QAAQ,QAAU,MAAQ,MAAQ,SAClD8C,GAAS9C,EAAQ,SAAW,KAE5B+kI,GAAgB,IAAM,CAC1B,MAAMh8G,GAAIu2G,GAAmBwF,GAAS,IAAK,GAAIl8G,GAAO9lB,EAAM,EAC5D6+F,GAAK,aAAa,IAAK54E,IAAK,EAAE,CAChC,EAEAqE,GAAU1vB,IAAQ,CAChB,MAAM+mI,GAAW,KAAK,IAAI,IAAK,OAAOzkI,EAAQ,QAAQ,UAAY,GAAI,GAAK,GAAI,EACzEglI,GAAS53G,IAAQ,SAAW,KAClC,GAAI1vB,GAAMsnI,GAASP,GAAU,OAC7B,MAAM/4B,GAAY1rG,EAAQ,MAAG,EAC7B,GAAK,OAAO,SAAS,OAAO0rG,EAAS,CAAC,EAGtC,KAFAt+E,GAAO,QAAU1vB,GACjBonI,GAAQ,KAAK,OAAOp5B,EAAS,CAAC,EACvBo5B,GAAQ,OAAS35H,IAAO25H,GAAQ,MAAK,EAC5CC,GAAa,EACf,EAEA,MAAMZ,GAAe,OAAOnkI,EAAQ,MAAG,CAAI,EACvC,OAAO,SAASmkI,EAAY,IAC9BW,GAAQ,KAAKX,EAAY,EACzB/2G,GAAO,QAAU,YAAY,IAAG,EAChC23G,GAAa,GAGfje,GAAK,YAAY+d,EAAS,EAC1B35B,EAAW4b,GACX2W,GAAU,IAAM,CAAC,CACnB,KAAO,CACL,MAAMwH,GAAU,SAAS,cAAc,KAAK,EAC5CA,GAAQ,UAAY,4BACpBne,GAAK,YAAYme,EAAO,EACxB/5B,EAAW4b,GACX2W,GAAU,IAAM,CACdgD,EAAQwE,GAASvG,GAAmB1+H,EAASA,EAAQ,MAAG,CAAI,CAAC,CAC/D,CACF,CACF,SAAWA,EAAQ,OAAS,UAAW,CACrCypG,GAAiBm7B,GAAwB,EACzC,MAAMjmH,GAAQujH,EAAaliI,CAAO,EAC5B6yG,GAAS1E,GAAoB,CACjC,QAAS,EAAQnuG,EAAQ,QACzB,QAAS,KACT,SAAU,MACV,UAAW2e,EACrB,CAAS,EACDk0F,GAAO,iBAAiB,SAAU,IAAM,CACtCuxB,GAAmBpkI,EAAS6yG,GAAO,OAAO,CAC5C,CAAC,EACD3H,EAAW2H,GACX4qB,GAAU,IAAM,CACV,SAAS,gBAAkB5qB,KAC/BA,GAAO,QAAU,EAAQ7yG,EAAQ,MAAG,EACtC,CACF,SAAWA,EAAQ,OAAS,SAAU,CACpCypG,GAAiBm7B,GAAwB,EACzC,MAAM90B,GAAS,SAAS,cAAc,QAAQ,EAC9CA,GAAO,UAAY,mBACnBA,GAAO,aAAa,aAAcoyB,EAAaliI,CAAO,CAAC,EACvD,UAAWinB,MAASjnB,EAAQ,SAAW,CAAA,EAAI,CACzC,MAAMgwG,GAAS,SAAS,cAAc,QAAQ,EAC9CA,GAAO,MAAQ,OAAO/oF,GAAM,KAAK,EACjC+oF,GAAO,YAAc/oF,GAAM,OAAS,OAAOA,GAAM,KAAK,EACtD6oF,GAAO,YAAYE,EAAM,CAC3B,CACAF,GAAO,iBAAiB,SAAU,IAAM,CACtCs0B,GAAmBpkI,EAAS8vG,GAAO,KAAK,CAC1C,CAAC,EACD5E,EAAW4E,GACX2tB,GAAU,IAAM,CACd,GAAI,SAAS,gBAAkB3tB,GAAQ,OACvC,MAAMpE,GAAY,OAAO1rG,EAAQ,MAAG,GAAQ,EAAE,EAC1C8vG,GAAO,QAAUpE,KAAWoE,GAAO,MAAQpE,GACjD,CACF,KAAO,CACLjC,GAAiBm7B,GAAwB,EACzC,MAAM9d,GAAO,SAAS,cAAc,KAAK,EACnCyH,GAAYoQ,GAAmB3+H,EAAQ,UAAWA,EAAQ,GAAG,EAC7DwuH,GAAYmQ,GAAmB3+H,EAAQ,UAAWA,EAAQ,GAAG,EAC7DmpG,GAAWw1B,GAAmB3+H,EAAQ,SAAUA,EAAQ,GAAG,EAC3DqpG,GAAWs1B,GAAmB3+H,EAAQ,SAAUA,EAAQ,GAAG,EAEjE,GADiB,OAAO,SAASuuH,EAAS,GAAK,OAAO,SAASC,EAAS,EAGtE,GADAziB,EAAW,wBACP8yB,GAAa7+H,CAAO,EAAG,CACzB,MAAMklI,GAAc,IAAIltB,GAAkB,CACxC,MAAOh4G,EAAQ,MAAG,EAClB,OAAQ,KAAK,MAAM,KAAK,IAAI,MAAOuuH,EAAS,CAAC,EAC7C,OAAQ,KAAK,MAAM,KAAK,IAAI,MAAOC,EAAS,CAAC,EAC7C,QAASxuH,EAAQ,YAAc,IAC/B,SAAUuuH,GACV,SAAUC,GACV,SAAArlB,GACA,SAAAE,GACA,OAAS5tG,IAASyjI,GAAkBzjI,GAAMuE,CAAO,EACjD,SAAWvE,IAAS,CAClB,MAAMsJ,GAAUw3G,GAAY9gH,GAAM0tG,GAAUE,EAAQ,EAChDtkG,IAAW,MACfq/H,GAAmBpkI,EAAS+E,EAAO,CACrC,CACd,CAAa,EACDmmG,EAAWg6B,GAAY,QACvBP,GAAU,IAAMO,GAAY,QAAO,EACnCzH,GAAU,IAAM,CACd,MAAMhiI,GAAOgN,GAASzI,EAAQ,MAAG,CAAI,EACjCvE,IAAQ,MACR,SAAS,gBAAkBypI,GAAY,QAAU,SAAS,gBAAkBA,GAAY,OAC1FA,GAAY,SAASzpI,EAAI,CAE7B,CACF,KAAO,CACL,MAAM0pI,GAAiB,IAAIh5B,GAAwB,CACjD,MAAOnsG,EAAQ,MAAG,EAClB,UAAW,CAACuuH,GAAWC,EAAS,EAChC,KAAMxuH,EAAQ,MAAQ,IACtB,SAAAmpG,GACA,SAAAE,GACA,SAAW5tG,IAAS,CAClB,MAAMsJ,GAAUw3G,GAAY9gH,GAAM0tG,GAAUE,EAAQ,EAChDtkG,IAAW,MACfq/H,GAAmBpkI,EAAS+E,EAAO,CACrC,CACd,CAAa,EACDogI,GAAe,MAAM,UAAY,UACjCA,GAAe,MAAM,KAAO,OAAOnlI,EAAQ,WAAcA,EAAQ,MAAQ,GAAK,EAC9EkrG,EAAWi6B,GAAe,QAC1BR,GAAU,IAAMQ,GAAe,QAAO,EACtC1H,GAAU,IAAM,CACd,MAAMhiI,GAAOgN,GAASzI,EAAQ,MAAG,CAAI,EACjCvE,IAAQ,MACR,SAAS,gBAAkB0pI,GAAe,QAAU,SAAS,gBAAkBA,GAAe,OAChGA,GAAe,IAAI1pI,EAAI,CAE3B,CACF,KACK,CACL,MAAMiyE,GAAQ,SAAS,cAAc,OAAO,EAC5CA,GAAM,KAAO,SACbA,GAAM,UAAY,UAClBA,GAAM,UAAY,mBAClBA,GAAM,KAAO,OAAO1tE,EAAQ,YAAcA,EAAQ,WAAa,aAAe,MAASA,EAAQ,MAAQ,IAAM,EAC7G0tE,GAAM,iBAAiB,SAAU,IAAM,CACrC,MAAMgpC,GAAY6F,GAAY7uC,GAAM,MAAO1tE,EAAQ,IAAKA,EAAQ,GAAG,EAC/D02G,IAAa,OACjBhpC,GAAM,MAAQwxD,GAAkBxoB,GAAW12G,CAAO,EAClDokI,GAAmBpkI,EAAS02G,EAAS,EACvC,CAAC,EACDoQ,GAAK,YAAYp5C,EAAK,EACtBw9B,EAAW4b,GACX2W,GAAU,IAAM,CACV,SAAS,gBAAkB/vD,KAC/BA,GAAM,MAAQwxD,GAAkBl/H,EAAQ,MAAG,EAAMA,CAAO,EAC1D,CACF,CACF,CAEA,MAAMm8C,GAAM0vD,GAAmB,CAC7B,MAAOq2B,EAAaliI,CAAO,EAC3B,KAAMA,EAAQ,MAAQ,KACtB,SAAAkrG,EACA,eAAAzB,GACA,SAAAsC,CACR,CAAO,EACD21B,EAAa,YAAYvlF,GAAI,GAAG,EAChC,MAAMipF,GAAkBT,GACxBA,GAAU,IAAM,CACdS,KAAe,EACf37B,IAAgB,UAAO,CACzB,EACAw2B,EAAc,IAAIjgI,EAAQ,IAAK,CAAE,QAAAy9H,GAAS,OAAArwG,GAAQ,QAAAu3G,GAAS,EAC3DlH,GAAO,EACPrwG,KAAS,YAAY,KAAK,CAC5B,EAEMi4G,GAAkB,IAAM,CAC5B,MAAM/6G,EAAak2G,EAAoB,EACvCJ,EAAuB91G,EAAW,IAClC04G,GAA2B14G,CAAU,EACrC,UAAW29F,KAAWgY,EAAc,SAClChY,EAAQ,UAAO,EAOjB,GALAgY,EAAc,MAAK,EACnByB,EAAa,YAAc,GAC3BC,EAAgB,KAChB4C,GAAoB,EAEhB,EAACj6G,EAAW,UAAU,OAI1B,UAAWtqB,KAAWsqB,EAAW,SAAU,CACzC,GAAItqB,GAAS,MAAQ,gBAAkBA,GAAS,OAAS,WAAaA,GAAS,QAAS,CACtF2hI,EAAgB3hI,EAChBukI,GAAoB,EACpBC,GAAoB,YAAY,KAAK,EACrC,QACF,CACAE,GAAc1kI,CAAO,CACvB,CACF,EAEA,IAAIslI,GAAyB,GAC7B,MAAMC,GAAoB,IAAM,CAE9B,GADmB/E,EAAoB,EACxB,UAAY,GAAM,OACjC,MAAM77H,EAAQo7H,EAAe,WAAQ,GAAQ,UACzCp7H,IAAU,WAAaA,IAAU,OACnCo7H,EAAe,OAAO,iBAAiB,GAEvCA,EAAe,SAAS,iBAAiB,EACzCA,EAAe,QAAK,EACpBQ,EAA4B/B,IAE9BkE,GAAmB,iBAAkB,EAAE/9H,IAAU,WAAaA,IAAU,QAAS,CAC/E,MAAO,UACP,WAAY,EACZ,OAAQ,gBAChB,CAAO,EACDkqG,GAAK,EAAK,CACZ,EAEM22B,GAAuB,IAAM,CACjC,UAAWvd,KAAWgY,EAAc,SAClChY,EAAQ,UAAO,CAEnB,EAEMwd,GAAuB/nI,GAAQ,CACnC8mI,GAAoB9mI,CAAG,EACvB,UAAWuqH,KAAWgY,EAAc,SAClChY,EAAQ,SAASvqH,CAAG,CAExB,EAEMmxG,GAAO,CAAC/uC,EAAQ,KAAU,CAC9BwjE,GAAiB,EACjBG,GAAmB,EACnB,MAAMn5G,EAAak2G,EAAoB,GACnC1gE,GAASx1C,EAAW,MAAQ81G,IAC9BiF,GAAe,EAEjBG,GAAoB,EACpB5B,GAAe,EACfK,EAAyB,CAC3B,EAEMyB,GAAiC,IAAM,CAG3C,GAFA3F,EAAe,oBAAoBQ,CAAyB,EAExD,CADWR,EAAe,yBAAyBQ,CAAyB,EACnE,CACX1xB,GAAK,EAAK,EACV,MACF,CACA,MAAMvkF,EAAak2G,EAAoB,EACjCjX,EAAcwW,EAAe,WAAQ,GAAQ,UAC/Cz1G,EAAW,UAAY,IAAQi/F,IAAgB,YACjDgX,EAA4B/B,IAE9B3vB,GAAK,EAAK,CACZ,EAEAiyB,EAAwB,iBAAiB,SAAU,IAAM,CACvDP,EAA4BO,EAAwB,OAAStC,GAC7DkH,GAA8B,CAChC,CAAC,EAEDnE,EAAU,iBAAiB,YAAcjmI,GAAU,CAC7CimI,EAAU,UACVjmI,EAAM,QAAU,MAAQA,EAAM,SAAW,IAC7CgqI,GAAyB,GACzBC,GAAiB,EACnB,CAAC,EAEDhE,EAAU,iBAAiB,QAAS,IAAM,CACxC,GAAI+D,GAAwB,CAC1BA,GAAyB,GACzB,MACF,CACAC,GAAiB,CACnB,CAAC,EAED9D,EAAyB,iBAAiB,SAAU,IAAM,CACxD1B,EAAe,qBAAqB0B,EAAyB,OAAO,EACpEiB,GAAmB,4BAA6BjB,EAAyB,QAAS,CAChF,OAAQ,uBAChB,CAAO,EACD5yB,GAAK,EAAK,CACZ,CAAC,EAEDgyB,EAAa,iBAAiB,SAAU,IAAM,CAC5Cd,EAAe,OAAOc,EAAa,KAAK,EACxC6B,GAAmB,oBAAqB7B,EAAa,MAAO,CAC1D,OAAQ,aAChB,CAAO,EACGA,EAAa,QAAU,UACzBd,EAAe,OAAO,iBAAiB,EACvC2C,GAAmB,iBAAkB,GAAO,CAC1C,MAAO,UACP,WAAY,EACZ,OAAQ,gBAClB,CAAS,IACS3C,EAAe,WAAQ,GAAQ,aAAe,YACxDQ,EAA4B/B,IAE9B3vB,GAAK,EAAK,CACZ,CAAC,EAED,MAAM82B,GAAgB,CAGpB5F,EAAe,KAAK,SAAWzkI,GAAU,CACvC,MAAM2B,EAAS3B,GAAO,OACtBuzG,GAAK5xG,IAAW,WAAaA,IAAW,MAAM,CAChD,CAAC,IAAM,IAAM,CAAC,GACd4iI,GAAUr7H,EAAQohI,GAAO,eAAgB,IAAM/2B,GAAK,EAAI,CAAC,EACzDgxB,GAAUr7H,EAAQohI,GAAO,aAAc,IAAM,CAC3CrF,EAA4B/B,GAC5B3vB,GAAK,EAAK,CACZ,CAAC,EACDgxB,GAAUr7H,EAAQohI,GAAO,YAAa,IAAMhC,GAAe,CAAE,EAC7D/D,GAAUr7H,EAAQohI,GAAO,iBAAkB,IAAM/2B,GAAK,EAAI,CAAC,CACjE,EAEUg3B,GAAY,KAAK,IAAI,IAAK,OAAO,KAAK,QAAQ,WAAa,GAAG,GAAK,GAAG,EACtEC,EAAe,OAAO,YAAY,IAAMj3B,GAAK,EAAK,EAAGg3B,EAAS,EAC9DE,GAAc,OAAO,YAAY,IAAMN,GAAoB,YAAY,KAAK,EAAG,GAAI,EAEzF52B,GAAK,EAAI,EAET,MAAMm3B,EAAkBn1C,GAAM,SAAS,KAAKA,EAAK,EACjD,OAAIm1C,IACFn1C,GAAM,QAAU,IAAM,CACpB,OAAO,cAAci1C,CAAY,EACjC,OAAO,cAAcC,EAAW,EAChC,UAAWvzB,KAAemzB,GAAenzB,IAAW,EACpD,UAAWyV,KAAWgY,EAAc,SAClChY,EAAQ,UAAO,EAEjBgY,EAAc,MAAK,EACnB,UAAW/xB,KAAWgyB,EAAuB,OAAM,EAAIhyB,IAAO,EAC9DgyB,EAAuB,MAAK,EAC5B,UAAWhyB,KAAWiyB,EAAyBjyB,IAAO,EACtDiyB,EAAwB,MAAK,EAC7B6F,EAAe,CACjB,GAGKn1C,EACT,CACF,CC9iCA,SAAS4G,GAAex+F,EAAOC,EAAW,KAAM,CAC9C,GAAID,GAAS,MAAQ,GAAGA,CAAK,GAAG,KAAI,IAAO,GAAI,OAAOC,EACtD,MAAMC,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrBA,EAD+BD,CAExC,CAEA,MAAM+sI,GAAuB,OAAO,OAAO,CACzC,kBAAmB,6CACnB,4BAA6B,uEAC7B,wBAAyB,mDACzB,sBAAuB,uDACvB,wBAAyB,qEACzB,uBAAwB,sDACxB,wBAAyB,uDACzB,mBAAoB,2EACpB,kBAAmB,oDACnB,gBAAiB,kDACjB,2BAA4B,wCAC9B,CAAC,EAED,SAASC,GAAoB32D,EAAM,CACjC,OAAI,OAAOA,GAAS,SAAiB,CAAE,IAAKA,CAAI,EAC5C,CAACA,GAAQ,OAAOA,GAAS,UACzBA,EAAK,OAAS,SAAiB,KAC/B,OAAOA,EAAK,KAAQ,SAAiBA,EAClC,IACT,CAEO,MAAM42D,EAAa,CACxB,YAAYpmB,EAAIlmH,EAAU,GAAI,CAC5B,KAAK,GAAKkmH,EACV,KAAK,QAAUlmH,CACjB,CAEA,QAAS,CACP,MAAM2K,EAAS,KAAK,GAAG,QAAU,KAC3B09F,EAAU,SAAS,cAAc,KAAK,EAC5C,KAAK,GAAG,kBAAoB,KAC5B,MAAMkkC,EAAkB5hI,GAAQ,UAAU,SAAWA,GAAQ,cAAc,SAAS,EAGpF,GAFA,KAAK,gBAAkB4hI,GAAmB,KAC1C,KAAK,MAAQA,GAAiB,OAAS,KACnC,CAAC5hI,GAAU,CAAC4hI,GAAmB,OAAOA,EAAgB,SAAY,WAAY,CAChF,MAAMpG,EAAc,SAAS,cAAc,KAAK,EAChD,OAAAA,EAAY,YAAc,4CAC1B99B,EAAQ,YAAY89B,CAAW,EACxB,KAAK,GAAG,YAAY,CACzB,GAAI,KAAK,QAAQ,IAAM,oBACvB,MAAO,KAAK,QAAQ,OAAS,UAC7B,SAAU,KAAK,QAAQ,UAAY,CAAE,EAAG,GAAI,EAAG,GAAG,EAClD,KAAM,KAAK,QAAQ,MAAQ,YAC3B,QAAA99B,CACR,CAAO,CACH,CAEA,MAAMie,EAAWpS,GAAoB,EAC/Bd,EAAezoG,GAAQ,QAAUA,GAAQ,SAAW,KACpD6hI,EAAmB1kC,GAAS,KAAK,GAAG,uBAAuBA,EAAM,UAAW,CAChF,SAAU,EAChB,CAAK,GAAK,KACA2kC,EAAY,CAAC,CAAE,MAAAjlC,EAAO,KAAA2H,EAAM,SAAAkC,EAAU,gBAAAq7B,EAAkB,QAAW,CACvE,MAAMC,EAAQ36B,GAAmB,CAC/B,MAAAxK,EACA,KAAA2H,EACA,SAAAkC,EACA,eAAgBq7B,EAAkBF,EAAgBE,CAAe,EAAI,OACrE,cAAepmB,EAAS,aAChC,CAAO,EACD,OAAAje,EAAQ,YAAYskC,EAAM,GAAG,EACtBA,CACT,EACMC,EAAc,CAACrqI,EAAKlD,EAAW,OAAS,CAC5C,MAAM+tB,EAAQgmF,GAAc,QAAQ7wG,CAAG,GAAK,KACtCnD,EAAQg0G,GAAc,MAAM7wG,EAAK,MAAS,EAChD,OAAOnD,IAAU,OAAaguB,GAAO,SAAW/tB,EAAYD,CAC9D,EACMytI,EAAW,CAACtqI,EAAKnD,IAAU,CAC/B,GAAI,OAAOg0G,GAAc,KAAQ,WAAY,CAC3CA,EAAa,IAAI7wG,EAAKnD,EAAO,CAC3B,OAAQ,KACR,OAAQ,WAAW,OAAOmD,CAAG,EAAE,MAAM,GAAG,EAAE,OAAS,SAAS,GAC5D,QAAS,EACnB,CAAS,EACD,MACF,CACA,MAAM0lG,EAAO,OAAO1lG,CAAG,EAAE,MAAM,GAAG,EAAE,IAAG,EACnC0lG,GAAMskC,EAAgB,QAAQ,CAAE,CAACtkC,CAAI,EAAG7oG,EAAO,CACrD,EACM0tI,EAAe,CAACvqI,EAAKyyG,IAAS,CAClC,MAAM+3B,EAAqB35B,GAAc,YAAY7wG,EAAMnD,GAAU41G,EAAK51G,CAAK,CAAC,GAAK,KACrF,OAAI,OAAO2tI,GAAuB,WAAmBA,EAC9CR,EAAgB,KAAK,SAAU,IAAMv3B,EAAK43B,EAAYrqI,CAAG,CAAC,CAAC,IAAM,IAAM,CAAC,EACjF,EACMyqI,EAA0Bt3D,GAAS,CACvC,MAAMnzE,EAAMmzE,EAAK,IACXtoD,EAAQgmF,GAAc,QAAQ7wG,CAAG,GAAK,KACtCuiB,EAAQi1F,GAAsBrkC,EAAM09B,CAAY,EAChD4F,EAAS1E,GAAoB,CACjC,QAAS,EAAQs4B,EAAYrqI,EAAK6qB,GAAO,SAAW,EAAK,EACzD,UAAWtI,CACnB,CAAO,EAIK6zF,EAAcm0B,EAAavqI,EAHnBnD,GAAU,CACtB45G,EAAO,QAAU,EAAQ55G,CAC3B,CAC0C,EAC1C45G,EAAO,iBAAiB,SAAU,IAAM6zB,EAAStqI,EAAKy2G,EAAO,OAAO,CAAC,EACrEyzB,EAAU,CACR,MAAO3nH,EACP,KAAM4wD,EAAK,MAAQ02D,GAAqB7pI,CAAG,GAAK6qB,GAAO,aAAe,KACtE,SAAU4rF,EACV,gBAAiBz2G,CACzB,CAAO,EACD,KAAK,GAAG,iBAAiB,IAAI,IAAMo2G,EAAW,CAAE,CAClD,EACMs0B,EAA0Bv3D,GAAS,CACvC,MAAMnzE,EAAMmzE,EAAK,IACXtoD,EAAQgmF,GAAc,QAAQ7wG,CAAG,GAAK,KACtCuiB,EAAQi1F,GAAsBrkC,EAAM09B,CAAY,EAChD8S,EAAK94F,GAAO,IAAM,CAAA,EAClB1jB,EAAMgsE,EAAK,UAAYwwC,EAAG,UAAYA,EAAG,KAAO,EAChDp3G,EAAM4mE,EAAK,UAAYwwC,EAAG,UAAYA,EAAG,KAAO,EAChD3T,EAAY78B,EAAK,WAAa,CAClCA,EAAK,cAAgBwwC,EAAG,cAAgBA,EAAG,KAAOx8G,EAClDgsE,EAAK,cAAgBwwC,EAAG,cAAgBA,EAAG,KAAOp3G,CAC1D,EACYuiG,EAAW,IAAIiB,GAAwB,CAC3C,MAAOs6B,EAAYrqI,EAAK6qB,GAAO,SAAW,CAAC,EAC3C,UAAAmlF,EACA,KAAM78B,EAAK,MAAQwwC,EAAG,MAAQ,EAC9B,SAAUx8G,EACV,SAAUoF,EACV,SAAW1P,GAAU,CACnB,MAAME,EAAUs+F,GAAex+F,EAAO,IAAI,EACtCE,GAAW,MACfutI,EAAStqI,EAAKjD,CAAO,CACvB,CACR,CAAO,EACKq5G,EAAcm0B,EAAavqI,EAAMnD,GAAU,CAC/C,MAAME,EAAUs+F,GAAex+F,EAAO,IAAI,EACtCE,GAAW,MAAM+xG,EAAS,IAAI/xG,CAAO,CAC3C,CAAC,EACDmtI,EAAU,CACR,MAAO3nH,EACP,KAAM4wD,EAAK,MAAQ02D,GAAqB7pI,CAAG,GAAK6qB,GAAO,aAAe,KACtE,SAAUikF,EAAS,QACnB,gBAAiB9uG,CACzB,CAAO,EACD,KAAK,GAAG,iBAAiB,IAAI,IAAM,CACjCo2G,EAAW,EACXtH,EAAS,QAAO,CAClB,CAAC,CACH,EACM67B,EAA2Bx3D,GAAS,CACxC,MAAM/1E,EAAa0sI,GAAoB32D,CAAI,EAC3C,GAAI,CAAC/1E,EAAY,OACjB,MAAMytB,EAAQgmF,GAAc,QAAQzzG,EAAW,GAAG,GAAK,KACjDwtI,EAAaxtI,EAAW,YAAcytB,GAAO,IAAI,YAAcA,GAAO,KACxE+/G,IAAe,UAAY//G,GAAO,OAAS,UAC7C4/G,EAAuBrtI,CAAU,GACxBwtI,IAAe,UAAY//G,GAAO,OAAS,WACpD6/G,EAAuBttI,CAAU,CAErC,EAEA,UAAWy6G,KAAWgB,GAAqB,SACzC,UAAW1lC,KAAQ0kC,EAAQ,MAAO8yB,EAAwBx3D,CAAI,EAGhE,YAAK,GAAG,iBAAiB,IAAI,IAAM4wC,EAAS,SAAS,EAE9C,KAAK,GAAG,YAAY,CACzB,GAAI,KAAK,QAAQ,IAAM,oBACvB,MAAO,KAAK,QAAQ,OAAS,UAC7B,SAAU,KAAK,QAAQ,UAAY,CAAE,EAAG,GAAI,EAAG,GAAG,EAClD,KAAM,KAAK,QAAQ,MAAQ,YAC3B,YAAalL,GACb,QAAA/S,CACN,CAAK,CACH,CACF,CChLA,MAAM+kC,GAAyB,EACzBC,GAAyB,GACzBC,GAA2B,IAC3BC,GAA2B,IAC3BC,GAA+B,IAErC,SAASxH,GAAUr7H,EAAQonG,EAAWtuG,EAAS,CAC7C,MAAI,CAACkH,GAAU,OAAOlH,GAAY,WAAmB,IAAM,CAAC,EACxD,OAAOkH,EAAO,IAAO,WAChBA,EAAO,GAAGonG,EAAWtuG,CAAO,IAAM,IAAM,CAAC,GAE9C,OAAOkH,EAAO,kBAAqB,YACrCA,EAAO,iBAAiBonG,EAAWtuG,CAAO,EACnC,IAAMkH,EAAO,oBAAoBonG,EAAWtuG,CAAO,GAErD,IAAM,CAAC,CAChB,CAEO,SAASgqI,GAAuB3rI,EAAU4rI,EAAU,EAAG,CAC5D,IAAIp+C,EAAU,KACVq+C,EAAW,KACXC,EAAW,KAEf,MAAMC,EAAS,IAAM,CAEnB,GADAv+C,EAAU,KACN,CAACq+C,EAAU,OACf,MAAM3qI,EAAO2qI,EACP9hI,EAAU+hI,EAChBD,EAAW,KACXC,EAAW,KACX9rI,EAAS,MAAM+J,EAAS7I,CAAI,CAC9B,EAEM4rG,EAAY,YAAsB5rG,EAAM,CAC5C2qI,EAAW3qI,EACX4qI,EAAW,KACPt+C,GAAW,OACfA,EAAU,WAAWu+C,EAAQ,KAAK,IAAI,EAAGH,CAAO,CAAC,EACnD,EAEA,OAAA9+B,EAAU,MAAQ,IAAM,CAClBtf,GAAW,OACb,aAAaA,CAAO,EACpBA,EAAU,MAEZu+C,EAAM,CACR,EAEAj/B,EAAU,OAAS,IAAM,CACnBtf,GAAW,OACb,aAAaA,CAAO,EACpBA,EAAU,MAEZq+C,EAAW,KACXC,EAAW,IACb,EAEOh/B,CACT,CAEA,SAAS8T,GAAYtjH,EAAOsK,EAAKoF,EAAKzP,EAAU,CAC9C,MAAMC,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,IAAIoK,EAAK,KAAK,IAAIoF,EAAKxP,CAAO,CAAC,EADLD,CAExC,CAEA,SAASi3G,GAAmBl3G,EAAOC,EAAW,CAAC,EAAG,EAAG,CAAC,EAAG,CACvD,MAAMsD,EAAS,MAAM,QAAQvD,CAAK,GAAK,YAAY,OAAOA,CAAK,EAAIA,EAAQC,EACrE0I,EAAI,OAAOpF,IAAS,CAAC,CAAC,EACtBqF,EAAI,OAAOrF,IAAS,CAAC,CAAC,EACtBuH,EAAI,OAAOvH,IAAS,CAAC,CAAC,EACtBiO,EAAS,KAAK,MAAM7I,EAAGC,EAAGkC,CAAC,EACjC,MAAI,CAAC,OAAO,SAAS0G,CAAM,GAAKA,GAAU,KAAa,MAAM,KAAKvR,CAAQ,EACnE,CAAC0I,EAAI6I,EAAQ5I,EAAI4I,EAAQ1G,EAAI0G,CAAM,CAC5C,CAEA,SAASk9H,GAAmBnjI,EAAQ,CAClC,MAAMkrB,EAASlrB,GAAQ,UAAU,QAAU,KAC3CkrB,GAAQ,cAAW,EACnB,MAAMwxB,EAAQivD,GAAmBzgF,GAAQ,MAAO,CAAC,EAAG,EAAG,CAAC,CAAC,EACnD+xB,EAAK0uD,GAAmBzgF,GAAQ,GAAI,CAAC,EAAG,EAAG,CAAC,CAAC,EAC7Ck4G,EAAUz3B,GAAmBzgF,GAAQ,QAAS,CAAC,EAAG,EAAG,EAAE,CAAC,EAC9D,MAAO,CAAE,MAAAwxB,EAAO,GAAAO,EAAI,QAAAmmF,CAAO,CAC7B,CAEA,SAASC,GAAqBrjI,EAAQsjI,EAAUjiE,EAAQ8hE,GAAmBnjI,CAAM,EAAG,CAClF,MAAMi7C,EAAO0wD,GAAmB23B,EAAU,CAAC,EAAG,EAAG,CAAC,CAAC,EAC7C,CAAE,MAAA5mF,EAAO,GAAAO,EAAI,QAAAmmF,CAAO,EAAK/hE,EAC/B,OAAOsqC,GAAmB,CACvB1wD,EAAK,CAAC,EAAIyB,EAAM,CAAC,EAAMzB,EAAK,CAAC,EAAIgC,EAAG,CAAC,EAAMhC,EAAK,CAAC,EAAImoF,EAAQ,CAAC,EAC9DnoF,EAAK,CAAC,EAAIyB,EAAM,CAAC,EAAMzB,EAAK,CAAC,EAAIgC,EAAG,CAAC,EAAMhC,EAAK,CAAC,EAAImoF,EAAQ,CAAC,EAC9DnoF,EAAK,CAAC,EAAIyB,EAAM,CAAC,EAAMzB,EAAK,CAAC,EAAIgC,EAAG,CAAC,EAAMhC,EAAK,CAAC,EAAImoF,EAAQ,CAAC,CACnE,CAAG,CACH,CAEA,SAASG,GAAmB78B,EAAU3nG,EAAKoF,EAAKm/C,EAAO,KAAM,CACvD,CAACojD,GAAU,QAAU,CAACA,GAAU,QACpCA,EAAS,OAAO,IAAM,OAAO3nG,CAAG,EAChC2nG,EAAS,OAAO,IAAM,OAAOviG,CAAG,EAC5Bm/C,GAAQ,OACVojD,EAAS,OAAO,KAAO,OAAOpjD,CAAI,EAClCojD,EAAS,MAAM,KAAO,OAAOpjD,CAAI,GAEnCojD,EAAS,MAAM,IAAM,OAAO3nG,CAAG,EAC/B2nG,EAAS,MAAM,IAAM,OAAOviG,CAAG,EACjC,CAEA,SAASq/H,GAAsB/uI,EAAO,CAEpC,MAAM,GADUsjH,GAAYtjH,EAAOguI,GAAwBC,GAAwB,CAAC,EAC/DD,KAA2BC,GAAyBD,IACnE57G,EAAS,KAAK,IAAI87G,EAAwB,EAC1C77G,EAAS,KAAK,IAAI87G,EAAwB,EAChD,OAAO,KAAK,MAAM,KAAK,IAAI97G,GAAWD,EAASC,GAAU,CAAE,CAAC,CAC9D,CAEA,SAAS28G,GAAsBhvI,EAAO,CACpC,MAAME,EAAUojH,GAAYtjH,EAAOkuI,GAA0BC,GAA0B,GAAG,EACpF/7G,EAAS,KAAK,IAAI87G,EAAwB,EAC1C77G,EAAS,KAAK,IAAI87G,EAAwB,EAC1C75G,GAAK,KAAK,IAAIp0B,CAAO,EAAImyB,IAAWD,EAASC,GACnD,OAAO27G,GAA0B1qB,GAAYhvF,EAAG,EAAG,EAAG,CAAC,GAAK25G,GAAyBD,GACvF,CAEA,SAASiB,GAAkBC,EAAWC,EAAgB,CACpD,MAAO,CAAC,CAAE,MAAA/mC,EAAO,KAAA2H,EAAM,SAAAkC,CAAQ,IAAO,CACpC,KAAM,CAAE,IAAA/uD,CAAG,EAAK0vD,GAAmB,CACjC,MAAAxK,EACA,KAAA2H,EACA,SAAAkC,EACA,cAAek9B,EAAe,aACpC,CAAK,EACD,OAAAD,EAAU,YAAYhsF,CAAG,EAClBA,CACT,CACF,CAEO,MAAMksF,EAAY,CACvB,YAAYtoB,EAAIlmH,EAAU,GAAI,CAC5B,KAAK,GAAKkmH,EACV,KAAK,QAAUlmH,CACjB,CAEA,QAAS,CACP,MAAM2K,EAAS,KAAK,GAAG,QAAU,KAC3B09F,EAAU,SAAS,cAAc,KAAK,EAC5C,GAAI,CAAC19F,EAAQ,CACX,MAAMw7H,EAAc,SAAS,cAAc,KAAK,EAChD,OAAAA,EAAY,YAAc,KAAK,QAAQ,aAAe,6CACtD99B,EAAQ,YAAY89B,CAAW,EACxB,KAAK,GAAG,YAAY,CACzB,GAAI,KAAK,QAAQ,IAAM,mBACvB,MAAO,KAAK,QAAQ,OAAS,SAC7B,SAAU,KAAK,QAAQ,UAAY,CAAE,EAAG,GAAI,EAAG,GAAG,EAClD,KAAM,KAAK,QAAQ,MAAQ,YAC3B,UAAW,KAAK,QAAQ,WAAa,GACrC,QAAA99B,CACR,CAAO,CACH,CAEA,MAAMkmC,EAAiBr6B,GAAoB,EACrCu6B,EAAeJ,GAAkBhmC,EAASkmC,CAAc,EACxDG,EAAuB,CAACthF,EAAQ,KAAO,CAC3C,MAAM3jD,EAAUkB,EAAO,iBAAc,GAAQ,CAAA,EAC7C,SAAW,CAACpI,EAAKnD,EAAK,IAAK,OAAO,QAAQguD,CAAK,EAAG,CAChD,MAAM06C,GAAO,mBAAmBvlG,CAAG,GACnC,KAAK,GAAG,oBAAoBulG,GAAM,CAChC,MAAO,UACP,WAAY,IACZ,aAAcr+F,EAAQlH,CAAG,EACzB,SAAU,CAAE,MAAO,SAAU,QAASA,CAAG,CACnD,CAAS,EACD,KAAK,GAAG,mBAAmBulG,GAAM1oG,GAAO,CACtC,MAAO,UACP,OAAQ,KACR,OAAQ,iBACR,WAAY,GACtB,CAAS,CACH,CACF,EACMuvI,EAAgC,CAACljI,EAAS,OAAS,CACvD,MAAMmjI,EAAS,OAAOnjI,GAAQ,QAAUA,GAAQ,QAAQ,QAAU,EAAE,EAAE,KAAI,EAC1E,OAAOmjI,IAAW,MAAQA,IAAW,eAAiBA,IAAW,OAASA,IAAW,SACvF,EACMC,EAAoB,CAACvhF,EAAO3iD,EAAO,aAAU,GAAQ,KAAM3K,EAAU,KAAO,CAC5E,CAACstD,GAAQ,OAAOA,GAAS,WAC7B,KAAK,GAAG,oBAAoB,cAAe,CACzC,MAAO,UACP,WAAY,IACZ,aAAcA,EACd,SAAU,CAAE,MAAO,QAAQ,CACnC,CAAO,EACD,KAAK,GAAG,mBAAmB,cAAeA,EAAM,CAC9C,MAAO,UACP,OAAQ,KACR,OAAQ,cACR,WAAY,IACZ,cAAettD,EAAQ,gBAAkB,EACjD,CAAO,EACH,EAEM8uI,EAAmB,IAAIx8B,GAAwB,CACnD,MAAO,EACP,UAAW,CAAC,KAAO,EAAE,EACrB,KAAM,KACN,SAAWlzG,GAAU,CACnB,MAAMkuD,EAAO3iD,EAAO,aAAU,GAAQ,KACtC,GAAI,CAAC2iD,EAAM,OACX,MAAMhuD,EAAU,OAAOF,CAAK,EACvB,OAAO,SAASE,CAAO,IACxBguD,EAAK,OAAS,KAChB3iD,EAAO,cAAc,CAAE,SAAUrL,CAAO,EAAI,CAAE,OAAQ,KAAM,EAE5DqL,EAAO,cAAc,CAAE,KAAMrL,CAAO,EAAI,CAAE,OAAQ,KAAM,EAE1DuvI,EAAkB,KAAM,CAAE,cAAe,EAAI,CAAE,EACjD,CACN,CAAK,EACKE,EAAcN,EAAa,CAC/B,MAAO,WACP,KAAM,sDACN,SAAUK,EAAiB,OACjC,CAAK,EAEKE,EAAe,IAAIl2B,GACzBk2B,EAAa,QAAQ,MAAM,UAAY,MAEvC,MAAMC,EAAgB36B,GAAoB,CACxC,QAAS,GACT,QAAS,KACT,SAAU,MACV,UAAW,UACjB,CAAO,EACD26B,EAAc,iBAAiB,SAAU,IAAM,CAC7C,MAAM7hF,EAAQ,CAAE,QAAS6hF,EAAc,OAAO,EAC9CtkI,EAAO,iBAAiByiD,CAAK,EAC7BshF,EAAqBthF,CAAK,CAC5B,CAAC,EACH,MAAM8hF,EAAc,SAAS,cAAc,KAAK,EAC1CC,EAAmBd,GAAkBa,EAAaX,CAAc,EAEhEa,EAAmB,IAAI98B,GAAwB,CACnD,MAAO87B,GAAsB,GAAG,EAChC,UAAW,CAAChB,GAAwBC,EAAsB,EAC1D,KAAM,GACN,SAAUD,GACR,SAAUC,GACV,SAAWjuI,GAAU,CACnB,MAAMguD,EAAQ,CAAE,kBAAmB+gF,GAAsB/uI,CAAK,CAAC,EAC/DuL,EAAO,iBAAiByiD,CAAK,EAC7BshF,EAAqBthF,CAAK,CAC5B,CACR,CAAO,EACH+hF,EAAiB,CACf,MAAO,cACP,KAAM,+FACN,SAAUC,EAAiB,OACjC,CAAK,EAED,MAAMC,EAAY,SAAS,cAAc,QAAQ,EACjDA,EAAU,KAAO,SACjBA,EAAU,UAAY,mBACtBA,EAAU,YAAc,aACxBA,EAAU,iBAAiB,QAAS,IAAM,CACxC,MAAMh+B,EAAW1mG,EAAO,iBAAc,GAAQ,CAAA,EACxC2kI,EAAoB3kI,EAAO,oBAAiB,GAAQ,CAAA,EAC1DA,EAAO,sBAAsB,CAC3B,YAAa2kI,EAAkB,OAASA,EAAoB,OAC5D,SAAUj+B,EAAS,gBACnB,aAAcA,EAAS,oBACvB,WAAYA,EAAS,kBACrB,QAASA,EAAS,YAAc,GAChC,WAAYA,EAAS,oBACrB,iBAAkB,GAClB,UAAWi+B,EAAkB,OAAS,WAAa,MAC3D,CAAO,CACH,CAAC,EACDH,EAAiB,CACf,MAAO,MACP,KAAM,wEACN,SAAUE,CAChB,CAAK,EAEDL,EAAa,IAAI,CACf,GAAI,kBACJ,MAAO,WACP,UAAW,GACX,UAAW,GACX,eAAgBC,EAChB,QAASC,CACf,CAAK,EAED,MAAMK,EAAkBj7B,GAAoB,CAC1C,QAAS,GACT,QAAS,KACT,SAAU,MACV,UAAW,kBACjB,CAAO,EACDi7B,EAAgB,iBAAiB,SAAU,IAAM,CAC/C,MAAMniF,EAAQ,CAAE,UAAWmiF,EAAgB,OAAO,EAClD5kI,EAAO,iBAAiByiD,CAAK,EAC7BshF,EAAqBthF,CAAK,CAC5B,CAAC,EACH,MAAMoiF,EAAgB,SAAS,cAAc,KAAK,EAC5CC,EAAqBpB,GAAkBmB,EAAejB,CAAc,EAEpEmB,EAAmB,IAAIp9B,GAAwB,CACnD,MAAO,IACP,UAAW,CAAC,EAAG,GAAI,EACnB,KAAM,GACJ,SAAU,EACV,SAAU,IACV,SAAWlzG,GAAU,CACnB,MAAMguD,EAAQ,CAAE,oBAAqBs1D,GAAYtjH,EAAO,EAAG,IAAO,GAAG,CAAC,EACtEuL,EAAO,iBAAiByiD,CAAK,EAC7BshF,EAAqBthF,CAAK,CAC5B,CACR,CAAO,EACHqiF,EAAmB,CACjB,MAAO,WACP,KAAM,2EACN,SAAUC,EAAiB,OACjC,CAAK,EAEDV,EAAa,IAAI,CACf,GAAI,mBACJ,MAAO,YACP,UAAW,GACX,UAAW,GACX,eAAgBO,EAChB,QAASC,CACf,CAAK,EAED,MAAMG,EAAcr7B,GAAoB,CACtC,QAAS,GACT,QAAS,KACT,SAAU,MACV,UAAW,cACjB,CAAK,EACKs7B,EAAY,SAAS,cAAc,KAAK,EACxCC,EAAiBxB,GAAkBuB,EAAWrB,CAAc,EAE5DuB,EAAqB,IAAIx9B,GAAwB,CACrD,MAAO,IACP,UAAW,CAAC,EAAG,EAAG,EAClB,KAAM,IACN,SAAU,EACV,SAAU,GACV,SAAWlzG,GAAU,CACnB,MAAMguD,EAAQ,CAAE,WAAYs1D,GAAYtjH,EAAO,EAAG,GAAI,GAAI,CAAC,EAC3DuL,EAAO,iBAAiByiD,CAAK,EAC7BshF,EAAqBthF,CAAK,CAC5B,CACN,CAAK,EACDyiF,EAAe,CACb,MAAO,cACP,KAAM,uCACN,SAAUC,EAAmB,OACnC,CAAK,EAED,IAAIC,EAAgB,CAAC,EAAG,EAAG,CAAC,EACxBC,EAA0BlC,GAAmBnjI,CAAM,EACnDslI,EAAmB,GACvB,MAAMC,EAAkB,CAAClkE,EAAQ8hE,GAAmBnjI,CAAM,IAAM,CAC9DqlI,EAA0BhkE,EAC1B,MAAM5e,EAAQ,CAAE,UAAW4gF,GAAqBrjI,EAAQolI,EAAe/jE,CAAK,CAAC,EAC7ErhE,EAAO,iBAAiByiD,CAAK,EAC7BshF,EAAqBthF,CAAK,CAC5B,EACAuiF,EAAY,iBAAiB,SAAU,IAAM,CAC3C,GAAIA,EAAY,QAAS,CACvBK,EAA0BlC,GAAmBnjI,CAAM,EACnD,MAAMyiD,EAAQ,CACZ,MAAO,GACP,UAAW4gF,GAAqBrjI,EAAQolI,EAAeC,CAAuB,CACxF,EACQrlI,EAAO,iBAAiByiD,CAAK,EAC7BshF,EAAqBthF,CAAK,CAC5B,KAAO,CACL,MAAMA,EAAQ,CAAE,MAAO,EAAK,EAC5BziD,EAAO,iBAAiByiD,CAAK,EAC7BshF,EAAqBthF,CAAK,CAC5B,CACF,CAAC,EASD,MAAM+iF,EAAmBx5B,GARE,CACzB,SAAU,GACV,MAAO,IAAMo5B,EACb,MAAQ3wI,GAAU,CAChB2wI,EAAgBz5B,GAAmBl3G,EAAO2wI,CAAa,EACvDG,EAAgBpC,GAAmBnjI,CAAM,CAAC,CAC5C,CACN,EAC6E,CACvE,KAAM,OACN,UAAW,aACX,OAAQ,6BACR,kBAAmB,4BACzB,CAAK,EACDklI,EAAe,CACb,MAAO,aACP,KAAM,iGACN,SAAUM,EAAiB,OACjC,CAAK,EAED,MAAM9R,EAAkBtoB,GAAoB,CAC1C,MAAO,KACP,QAAS,GACT,QAAS,CACP,CAAE,MAAO,KAAM,MAAO,WAAW,EACjC,CAAE,MAAO,MAAO,MAAO,SAAS,CACxC,EACQ,SAAW32G,GAAU,CACnB,MAAMguD,EAAQ,CAAE,eAAgBhuD,IAAU,MAAQ,GAAK,CAAC,EACxDuL,EAAO,iBAAiByiD,CAAK,EAC7BshF,EAAqBthF,CAAK,CAC5B,CACR,CAAO,EACHyiF,EAAe,CACb,MAAO,YACP,KAAM,6CACN,SAAUxR,CAChB,CAAK,EAED2Q,EAAa,IAAI,CACf,GAAI,eACJ,MAAO,QACP,UAAW,GACX,UAAW,GACX,eAAgBW,EAChB,QAASC,CACf,CAAK,EAEDvnC,EAAQ,YAAY2mC,EAAa,OAAO,EAExC,MAAMoB,EAAsB,CAACC,EAAe,OAAS,CACnD,MAAM/iF,EAAO+iF,GAAgB1lI,EAAO,aAAU,GAAQ,KAChDkrB,EAASlrB,EAAO,UAAU,QAAU,KACpC8L,GAAO62C,GAAM,OAAS,KAEtBixD,GAAW9nG,GACb,KAAK,IAAI,KAAO,OAAOof,GAAQ,aAAgB,GAAK,CAAE,CAAC,EACvD,KAAK,IAAI,KAAQ,OAAOA,GAAQ,SAAY,KAAQ,CAAE,CAAC,EACrD2oF,GAAW/nG,GACb,KAAK,IAAI8nG,GAAU,OAAO1oF,GAAQ,aAAe,IAAK,CAAC,EACvD,KAAK,IAAI0oF,GAAU,OAAO1oF,GAAQ,SAAW,EAAE,CAAC,EACpDq4G,GACEY,EACAvwB,GACAC,GACA/nG,GAAO,KAAK,IAAI,IAAM+nG,GAAWD,IAAY,GAAG,EAAI,IAC5D,EACMuwB,EAAiB,IAAIr4H,GAAQ62C,GAAM,UAAYixD,GAAajxD,GAAM,MAAQixD,EAAS,CACrF,EAEM+xB,EAA+B7C,GAAwBhsI,GAAU,CACrE,MAAMgK,EAAShK,GAAO,QAAUA,GAAS,KACnCqJ,EAAQW,GAAQ,OAAS,KACzB6hD,GAAOxiD,EACT,CACA,KAAMA,EAAM,KACZ,SAAUA,EAAM,SAChB,KAAMA,EAAM,IACtB,EACU,KACJslI,EAAoB9iF,EAAI,EACxBuhF,EAAkB,KAAM,CAAE,cAAeF,EAA8BljI,CAAM,CAAC,CAAE,CAClF,EAAG+hI,EAA4B,EAEzBx4B,EAAO,IAAM,CACjB,MAAM1nD,EAAO3iD,EAAO,aAAU,GAAQ,KACvBA,EAAO,UAAU,OAChC,MAAM0mG,EAAW1mG,EAAO,iBAAc,GAAQ,CAAA,EACxC8L,EAAO62C,GAAM,OAAS,KAE5B8iF,EAAoB9iF,CAAI,EAExB,MAAMijF,GAAgBxB,EAAY,cAAc,yBAAyB,EACrEwB,KAAeA,GAAc,YAAc95H,EAAO,WAAa,QAEnEw4H,EAAc,QAAU59B,EAAS,UAAY,GAC7C+9B,EAAiB,IAAIhB,GAAsB/8B,EAAS,mBAAqB,GAAG,CAAC,EAE7Ek+B,EAAgB,QAAUl+B,EAAS,YAAc,GACjDq+B,EAAiB,IAAIr+B,EAAS,qBAAuB,GAAG,EAExD,MAAMm/B,GAAen/B,EAAS,QAAU,GACpCm/B,IAAgB,CAACP,EACnBD,EAA0BlC,GAAmBnjI,CAAM,EACzC6lI,KACVR,EAA0BlC,GAAmBnjI,CAAM,GAErDslI,EAAmBO,GAEnBb,EAAY,QAAUt+B,EAAS,QAAU,GACzCy+B,EAAmB,IAAIz+B,EAAS,YAAc,GAAI,EAClD8+B,EAAiB,IAAIJ,CAAa,EAClC1R,EAAgB,MAAQ,OAAOhtB,EAAS,cAAc,EAAI,EAAI,MAAQ,KAEtE,MAAMo/B,GAAmBzB,EAAa,OAAO,IAAI,cAAc,GAAG,MAAQ,KACtEyB,KAAkBA,GAAiB,OAAS,CAACh6H,EACnD,EACAu+F,EAAI,EAEJ,MAAM82B,EAAgB,CACpB9F,GAAUr7H,EAAQohI,GAAO,YAAauE,CAA4B,EAClEtK,GAAUr7H,EAAQohI,GAAO,sBAAuB/2B,CAAI,EACpDgxB,GAAUr7H,EAAQohI,GAAO,iBAAkB/2B,CAAI,EAC/CgxB,GAAUr7H,EAAQohI,GAAO,qBAAsB/2B,CAAI,EACnDgxB,GAAUr7H,EAAQohI,GAAO,aAAc/2B,CAAI,EAC3CgxB,GAAUr7H,EAAQohI,GAAO,OAAQ/2B,CAAI,CAC3C,EAEUhe,EAAQ,KAAK,GAAG,YAAY,CAChC,GAAI,KAAK,QAAQ,IAAM,mBACvB,MAAO,KAAK,QAAQ,OAAS,SAC7B,SAAU,KAAK,QAAQ,UAAY,CAAE,EAAG,GAAI,EAAG,GAAG,EAClD,KAAM,KAAK,QAAQ,MAAQ,YAC3B,UAAW,KAAK,QAAQ,WAAa,GACrC,QAAAqR,CACN,CAAK,EAEK8jC,EAAkBn1C,EAAM,SAAS,KAAKA,CAAK,EACjD,OAAAA,EAAM,QAAU,IAAM,CACpBs5C,EAA6B,SAAM,EACnC,UAAW33B,KAAemzB,EAAenzB,IAAW,EACpD41B,EAAe,QAAO,EACtBS,EAAa,QAAO,EACpBF,EAAiB,QAAO,EACxBM,EAAiB,QAAO,EACxBM,EAAiB,QAAO,EACxBI,EAAmB,QAAO,EAC1BK,EAAiB,QAAO,EACxBhE,IAAe,CACjB,EAEOn1C,CACT,CACF,CC7hBA,MAAM05C,GAAuB,2BACvBC,GAAuB,KAE7B,SAASC,GAAwB7tI,EAAS0I,EAAQ,CAGlD,CAEA,SAASo6G,GAAuBpnG,EAAM,CACpC,OAAOA,IAASm/B,iBAAc,SACzBn/B,IAASm/B,GAAAA,cAAc,OACvBn/B,IAASm/B,GAAAA,cAAc,QACvBn/B,IAASm/B,GAAAA,cAAc,SACvBn/B,IAASm/B,GAAAA,cAAc,iBACvBn/B,IAASm/B,GAAAA,cAAc,YACvBn/B,IAASm/B,GAAAA,cAAc,kBAC9B,CAEA,SAASkoE,GAAuBrnG,EAAM,CACpC,OAAOA,IAASm/B,GAAAA,cAAc,SACzBn/B,IAASm/B,GAAAA,cAAc,iBACvBn/B,IAASm/B,GAAAA,cAAc,YACvBn/B,IAASm/B,GAAAA,cAAc,kBAC9B,CAEA,SAASooE,GAAsBvnG,EAAM,CACnC,OAAOA,IAASm/B,GAAAA,cAAc,MAChC,CAEA,SAASmoE,GAA2BtnG,EAAM,CACxC,OAAOA,IAASm/B,GAAAA,cAAc,QAChC,CAEA,SAASizF,GAAe9rD,EAAM,CAC5B,MAAMqC,MAAW,IACX11E,EAAM,CAAA,EACZ,UAAW+jB,KAAO,OAAOsvD,GAAQ,EAAE,EAAE,MAAM,GAAG,EAAG,CAC/C,MAAM3lF,EAAQq2B,EAAI,KAAA,EACd,CAACr2B,GAASgoF,EAAK,IAAIhoF,CAAK,IAC5BgoF,EAAK,IAAIhoF,CAAK,EACdsS,EAAI,KAAKtS,CAAK,EAChB,CACA,OAAOsS,CACT,CAEA,SAASo/H,GAAmB1xI,EAAO,CACjC,MAAM0H,EAAQ,OAAO1H,CAAK,EAC1B,MAAI,CAAC,OAAO,SAAS0H,CAAK,GAAKA,EAAQ,EAAU,GAC7CA,GAAS,IAAgB,GAAG,QAAQA,EAAQ,KAAS,YAAY,CAAC,CAAC,CAAC,IACpEA,GAAS,IAAa,GAAG,QAAQA,EAAQ,KAAM,YAAY,CAAC,CAAC,CAAC,IAC3D,OAAO,KAAK,MAAMA,CAAK,CAAC,CACjC,CAEA,SAASikH,GAAqBjkH,EAAO,CACnC,MAAI,CAAC,OAAO,SAASA,CAAK,GAAKA,GAAS,EAAU,EAC3C,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,KAAK,MAAM,KAAK,KAAKA,CAAK,CAAC,CAAC,CAAC,CAC/D,CAEA,SAASmkH,GAAepkH,EAAM6C,EAAKoF,EAAK+1B,EAAS,CAG/C,GAFI,CAACh+B,GAAQ,OAAOA,EAAK,QAAW,UAAYA,EAAK,QAAU,GAC3D,CAAC,OAAO,SAAS6C,CAAG,GAAK,CAAC,OAAO,SAASoF,CAAG,GAAKA,GAAOpF,GACzD,CAACm7B,GAAW,OAAOA,EAAQ,QAAW,UAAYA,EAAQ,QAAU,EAAG,OAAO,KAClF,MAAMmmF,EAAOD,GAAqBlmF,EAAQ,MAAM,EAC1C0lF,EAAS,IAAI,MAAMS,CAAI,EAAE,KAAK,CAAC,EAC/Bv7B,EAAO3gF,EAAMpF,EACnB,IAAIwhH,EAAW,EACX9jC,EAAO,EACX,QAAS9+E,EAAI,EAAGA,EAAIu8B,EAAQ,OAAQv8B,GAAK,EAAG,CAC1C,MAAM6iH,EAAWtmF,EAAQv8B,CAAC,EACpBlJ,EAAQ,OAAOyH,EAAKskH,CAAQ,CAAC,EACnC,GAAI,CAAC,OAAO,SAAS/rH,CAAK,EAAG,SAC7B,IAAI+4E,EAAM,KAAK,OAAQ/4E,EAAQsK,GAAO+lF,EAAQu7B,CAAI,EAC9C7yC,EAAM,IAAGA,EAAM,GACfA,GAAO6yC,IAAM7yC,EAAM6yC,EAAO,GAC9B,MAAMppH,EAAO2oH,EAAOpyC,CAAG,EAAI,EAC3BoyC,EAAOpyC,CAAG,EAAIv2E,EACVA,EAAOspH,IAAUA,EAAWtpH,GAChCwlF,GAAQ,CACV,CACA,MAAI,CAACA,GAAQ8jC,GAAY,EAAU,KAC5B,CAAE,OAAAX,EAAQ,SAAAW,CAAA,CACnB,CAEA,SAAS6lB,GAAsB/mB,EAAQ,CACrC,GAAI,CAACA,EAAQ,MAAO,KACpB,GAAIA,EAAO,UAAW,MAAO,GAC7B,MAAMv6B,EAAO,KAAK,IAAI,OAAOu6B,EAAO,GAAG,EAAI,OAAOA,EAAO,GAAG,CAAC,EAC7D,MAAI,CAAC,OAAO,SAASv6B,CAAI,GAAKA,GAAQ,EAAU,IACzC,KAAK,IAAIA,EAAO,IAAK,IAAI,CAClC,CAEA,SAASuhD,GAAsB5xI,EAAO8sH,EAAY,GAAO,CACvD,MAAM5sH,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACN,OAAlB4sH,EAAyB,KAAK,MAAM5sH,CAAO,EACjC,OAAOA,EAAQ,YAAY,EAAE,CAAC,CADI,EADV,EAGxC,CAEA,SAAS2xI,GAAmBrhE,EAAOo6C,EAAQ,CACzC,GAAI,CAACA,EAAQ,OAAO,KACpB,MAAMknB,EAAQ,OAAO,MAAM,QAAQthE,CAAK,EAAIA,EAAM,CAAC,EAAIo6C,EAAO,GAAG,EAC3DmnB,EAAQ,OAAO,MAAM,QAAQvhE,CAAK,EAAIA,EAAM,CAAC,EAAIo6C,EAAO,GAAG,EAC3Dx1C,EAAK,OAAO,SAAS08D,CAAK,EAAI,KAAK,IAAIlnB,EAAO,IAAK,KAAK,IAAIA,EAAO,IAAKknB,CAAK,CAAC,EAAIlnB,EAAO,IACzFv1C,EAAK,OAAO,SAAS08D,CAAK,EAAI,KAAK,IAAInnB,EAAO,IAAK,KAAK,IAAIA,EAAO,IAAKmnB,CAAK,CAAC,EAAInnB,EAAO,IAC/F,OAAOx1C,GAAMC,EAAK,CAACD,EAAIC,CAAE,EAAI,CAACA,EAAID,CAAE,CACtC,CAEA,SAAS48D,GAAYxhE,EAAOo6C,EAAQ,CAClC,MAAI,CAAC,MAAM,QAAQp6C,CAAK,GAAK,CAACo6C,EAAe,GACtC,KAAK,IAAI,OAAOp6C,EAAM,CAAC,CAAC,EAAI,OAAOo6C,EAAO,GAAG,CAAC,GAAK2mB,IACrD,KAAK,IAAI,OAAO/gE,EAAM,CAAC,CAAC,EAAI,OAAOo6C,EAAO,GAAG,CAAC,GAAK2mB,EAC1D,CAEA,SAASU,GAAgB72D,EAAW82D,EAAWC,EAAcC,EAAU,CACrE,MAAMlvF,EAAM,SAAS,cAAc,KAAK,EACxCA,EAAI,MAAM,QAAU,OACpBA,EAAI,MAAM,IAAM,MAChBA,EAAI,MAAM,QAAU,MACpBA,EAAI,MAAM,aAAe,OACzBA,EAAI,MAAM,OAAS,oCACnBA,EAAI,MAAM,WAAa,iEAEvB,MAAM6pD,EAAS,SAAS,cAAc,KAAK,EAC3CA,EAAO,MAAM,QAAU,OACvBA,EAAO,MAAM,WAAa,SAC1BA,EAAO,MAAM,eAAiB,gBAC9BA,EAAO,MAAM,IAAM,MAEnB,MAAMrnF,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,YAAc,GAAG01D,CAAS,KAAK82D,CAAS,IAC9CxsH,EAAM,MAAM,WAAa,MACzBA,EAAM,MAAM,aAAe,WAC3BqnF,EAAO,YAAYrnF,CAAK,EAExB,MAAM2sH,EAAe,SAAS,cAAc,QAAQ,EACpDA,EAAa,KAAO,SACpBA,EAAa,UAAY,mBACzBA,EAAa,YAAc,IACvBF,IAAcE,EAAa,QAAQ,OAASF,GAChDE,EAAa,iBAAiB,QAASD,CAAQ,EAC/CrlC,EAAO,YAAYslC,CAAY,EAE/B,MAAMv4B,EAAO,SAAS,cAAc,KAAK,EACzC,OAAAA,EAAK,MAAM,QAAU,OACrBA,EAAK,MAAM,IAAM,MAEjB52D,EAAI,YAAY6pD,CAAM,EACtB7pD,EAAI,YAAY42D,CAAI,EACb,CAAE,IAAA52D,EAAK,KAAA42D,CAAA,CAChB,CAEO,SAASw4B,GAA0B1xI,EAAU,GAAI,CACtD,KAAM,CACJ,OAAA2K,EAAS,KACT,MAAAy6B,EAAQ,OACR,eAAAusG,EAAiB,gBACjB,QAAAC,EAAU,KACV,QAAAC,EAAU,CAAA,CAAC,EACT7xI,EAEEmB,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,MAAM,QAAU,OACxBA,EAAQ,MAAM,IAAM,MAEpB,MAAM2wI,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,MAAM,QAAU,OAC1BA,EAAU,MAAM,IAAM,MACtB3wI,EAAQ,YAAY2wI,CAAS,EAE7B,MAAMC,EAAY,SAAS,cAAc,QAAQ,EACjDA,EAAU,UAAY,6CACtBA,EAAU,MAAM,SAAW,QAC3BA,EAAU,MAAM,SAAW,QACvBF,EAAQ,YAAWE,EAAU,QAAQ,OAASF,EAAQ,WAE1D,MAAM/mI,EAAQ,CAIZ,QAAS,CAAA,EACT,kBAAmB,IACnB,UAAW,GAAI,EAGXknI,EAAY,IAAM,CACtBJ,IAAA,CACF,EAEMK,EAAa,IAAMtnI,GAAQ,SAAW,KAEtCunI,EAA0B,IAAM,CACpC,MAAM5rI,EAAU2rI,EAAA,EAChB,GAAI,CAAC3rI,EAAS,MAAO,CAAA,EACrB,MAAMgiH,EAAWljF,IAAU,OACvB9+B,EAAQ,sBACRA,EAAQ,sBACN6rI,EAAU/sG,IAAU,OACtB9+B,EAAQ,qBACRA,EAAQ,qBACZ,GAAI,OAAOgiH,GAAa,YAAc,OAAO6pB,GAAY,iBAAmB,CAAA,EAE5E,MAAMzgI,EAAM,CAAA,EACNsO,EAAQsoG,EAAS,KAAKhiH,CAAO,GAAK,CAAA,EACxC,UAAW3E,KAAQqe,EAAO,CAGxB,GAFI,OAAOre,GAAS,UAChB,CAACuhH,GAAsBvhH,CAAI,GAC3B,CAAC+uI,GAAqB,KAAK/uI,CAAI,EAAG,SACtC,MAAMyzE,EAAO+8D,EAAQ,KAAK7rI,EAAS3E,CAAI,EACvC,GAAI,CAACyzE,GAAQA,EAAK,YAAc,EAAG,SACnC,IAAI32D,EAAO,KACPqG,EAAQ,GACR+gG,GAAuBzwC,EAAK,IAAI,GAClC32D,EAAO,UACPqG,EAAQ,WACCkhG,GAAsB5wC,EAAK,IAAI,GACxC32D,EAAO,SACPqG,EAAQ,UACCihG,GAA2B3wC,EAAK,IAAI,IAC7C32D,EAAO,cACPqG,EAAQ,eAELrG,GACL/M,EAAI,KAAK,CAAE,KAAA/P,EAAM,KAAA8c,EAAM,MAAAqG,EAAO,CAChC,CACA,OAAApT,EAAI,KAAK,CAAE,KAAM,YAAa,KAAM,QAAS,MAAO,QAAS,YAAa,cAAA,CAAgB,EAC1FA,EAAI,KAAK,CAACuI,EAAGC,IACPD,EAAE,OAAS,SAAWC,EAAE,OAAS,QAAgB,EACjDA,EAAE,OAAS,SAAWD,EAAE,OAAS,QAAgB,GAC9CA,EAAE,KAAK,cAAcC,EAAE,IAAI,CACnC,EACMxI,CACT,EAEM0gI,EAAsB7gD,GAAkB,CAC5C,MAAMjrF,EAAU2rI,EAAA,EAChB,GAAI,CAAC3rI,GAAW,OAAOirF,GAAkB,UAAY,CAACA,QAAsB,CAAA,EAC5E,MAAM1mE,EAASua,IAAU,OACrB9+B,EAAQ,mCACRA,EAAQ,mCACZ,GAAI,OAAOukB,GAAW,WAAY,MAAO,CAAA,EACzC,GAAI,CACF,MAAM6mE,EAAa7mE,EAAO,KAAKvkB,EAASirF,EAAe,CAAE,SAAU,EAAA,CAAO,GAAK,CAAA,EACzE8gD,EAAgB,MAAM,QAAQ3gD,EAAW,OAAO,EAClDA,EAAW,QACX,MAAM,QAAQA,EAAW,MAAM,EAC7BA,EAAW,OAAO,IAAI,CAAC5sE,EAAOpS,KAAW,CAAE,GAAIg/E,EAAW,MAAMh/E,CAAK,EAAG,MAAAoS,CAAA,EAAQ,EAChF,CAAA,EACAwtH,MAAiB,IACvB,GAAI,CACF,MAAMC,EAAc,IAAM,CACxB,MAAMxlH,EAASqY,IAAU,OACrB9+B,EAAQ,yBAAyBirF,CAAa,EAC9CjrF,EAAQ,yBAAyBirF,CAAa,EAC5C1sD,GAAUO,IAAU,OAAS9+B,EAAQ,YAAcA,EAAQ,YAC3DO,GAAOkmB,GAAQ,MAAQ,KAC7B,GAAI,GAAClmB,IAAQ,CAACg+B,IAAW,CAACA,GAAQ,QAClC,QAASv8B,GAAI,EAAGA,GAAIu8B,GAAQ,OAAQv8B,IAAK,EAAG,CAC1C,MAAMkJ,GAAK,OAAO3K,GAAKg+B,GAAQv8B,EAAC,CAAC,CAAC,EAC7B,OAAO,SAASkJ,EAAE,GACvB8gI,EAAW,IAAI9gI,IAAK8gI,EAAW,IAAI9gI,EAAE,GAAK,GAAK,CAAC,CAClD,CACF,EACI,OAAOlL,EAAQ,kBAAqB,WAAYA,EAAQ,iBAAiBisI,CAAW,EACnFA,EAAA,CACP,OAAStuI,EAAO,CAEhB,CAEA,MAAMmjF,MAAW,IACX11E,EAAM,CAAA,EACZ,UAAW+jB,KAAO48G,EAAe,CAC/B,MAAMvtH,EAAQ,OAAO2Q,GAAK,OAASA,GAAO,EAAE,EAAE,KAAA,EAC9C,GAAI,CAAC3Q,GAASsiE,EAAK,IAAItiE,CAAK,EAAG,SAC/BsiE,EAAK,IAAItiE,CAAK,EACd,MAAMtT,GAAK,OAAOikB,GAAK,EAAE,EACzB/jB,EAAI,KAAK,CACP,MAAAoT,EACA,GAAI,OAAO,SAAStT,EAAE,EAAIA,GAAK,KAC/B,MAAO,OAAO,SAASA,EAAE,EAAK8gI,EAAW,IAAI9gI,EAAE,GAAK,EAAK,IAAA,CAC1D,CACH,CACA,OAAAE,EAAI,KAAK,CAACuI,EAAGC,IAAMD,EAAE,MAAM,cAAcC,EAAE,KAAK,CAAC,EAC1CxI,CACT,MAAY,CACV,MAAO,CAAA,CACT,CACF,EAEM8gI,EAAwBjhD,GAAkB,CAC9C,MAAMjrF,EAAU2rI,EAAA,EAChB,GAAI,CAAC3rI,GAAW,OAAOirF,GAAkB,UAAY,CAACA,EAAe,OAAO,KAC5E,GAAI,CACF,MAAM4gD,EAAU/sG,IAAU,OACtB9+B,EAAQ,qBACRA,EAAQ,qBACN8uE,EAAO,OAAO+8D,GAAY,WAAaA,EAAQ,KAAK7rI,EAASirF,CAAa,EAAI,KAC9E26B,EAAY,GAAQ92C,GAAQ0wC,GAAuB1wC,EAAK,IAAI,GAC5DhnD,EAAO,IAAM,CACjB,MAAMrB,EAASqY,IAAU,OACrB9+B,EAAQ,yBAAyBirF,CAAa,EAC9CjrF,EAAQ,yBAAyBirF,CAAa,EAC5C1sD,EAAUO,IAAU,OAAS9+B,EAAQ,YAAcA,EAAQ,YACjE,GAAI,CAACu+B,GAAW,CAACA,EAAQ,OAAQ,OAAO,KACxC,MAAMh+B,EAAOkmB,GAAQ,MAAQ,KAC7B,GAAI,CAAClmB,GAAQ,CAACA,EAAK,OAAQ,OAAO,KAClC,IAAI6C,EAAM,IACNoF,GAAM,KACV,QAASxG,GAAI,EAAGA,GAAIu8B,EAAQ,OAAQv8B,IAAK,EAAG,CAC1C,MAAMkJ,GAAKqzB,EAAQv8B,EAAC,EACdlJ,GAAQ,OAAOyH,EAAK2K,EAAE,CAAC,EACxB,OAAO,SAASpS,EAAK,IACtBA,GAAQsK,IAAKA,EAAMtK,IACnBA,GAAQ0P,KAAKA,GAAM1P,IACzB,CACA,GAAI,CAAC,OAAO,SAASsK,CAAG,GAAK,CAAC,OAAO,SAASoF,EAAG,EAAG,OAAO,KAC3D,GAAIo9G,EAAW,CACb,MAAMrC,GAAS,KAAK,MAAMngH,CAAG,EACvBogH,GAAS,KAAK,KAAKh7G,EAAG,EAC5B,OAAI+6G,KAAWC,GAAe,CAAE,IAAKD,GAAQ,IAAKA,GAAS,EAAG,UAAW,EAAA,EAClE,CAAE,IAAKA,GAAQ,IAAKC,GAAQ,UAAW,EAAA,CAChD,CACA,OAAIpgH,IAAQoF,GAAY,CAAE,IAAApF,EAAK,IAAKA,EAAM,EAAG,UAAW,EAAA,EACjD,CAAE,IAAAA,EAAK,IAAAoF,GAAK,UAAW,EAAA,CAChC,EACA,GAAI,OAAOxI,EAAQ,kBAAqB,WACtC,GAAI,CACF,OAAOA,EAAQ,iBAAiB8nB,CAAI,CACtC,OAASnqB,EAAO,CACd,OAKO,IACT,CAEF,OAAOmqB,EAAA,CACT,MAAgB,CAEd,OAAO,IACT,CACF,EAEMg9F,EAAuB,CAAC,CAAE,cAAA75B,EAAe,MAAA3hB,EAAO,OAAAo6C,KAAa,CACjE,MAAM1jH,EAAU2rI,EAAA,EAChB,GAAI,CAAC3rI,GAAW,CAAC0jH,GAAU,CAACz4B,EAAe,OAAO,KAClD,IAAItwE,EAAO,KACX,GAAI,CACF,MAAMw3D,EAAU,IAAM,CACpB,MAAMg6D,GAAYrtG,IAAU,OACxB9+B,EAAQ,uBACRA,EAAQ,uBACZ,GAAI,OAAOmsI,IAAc,WAAY,OAAO,KAC5C,MAAM1lH,GAAS0lH,GAAU,KAAKnsI,EAASirF,CAAa,EAC9C1sD,GAAUO,IAAU,OAAS9+B,EAAQ,YAAcA,EAAQ,YACjE,GAAI,CAACu+B,IAAW,CAACA,GAAQ,OAAQ,OAAO,KACxC,MAAMh+B,GAAOkmB,IAAQ,MAAQ,KAC7B,MAAI,CAAClmB,IAAQ,CAACA,GAAK,OAAe,KAC3BokH,GAAepkH,GAAMmjH,EAAO,IAAKA,EAAO,IAAKnlF,EAAO,CAC7D,EACA,GAAI,OAAOv+B,EAAQ,kBAAqB,WACtC,GAAI,CACF2a,EAAO3a,EAAQ,iBAAiBmyE,CAAO,CACzC,OAASx0E,GAAO,CAMdgd,EAAO,IACT,MAEAA,EAAOw3D,EAAA,CAEX,MAAgB,CAEdx3D,EAAO,IACT,CACA,GAAI,CAACA,EAAM,OAAO,KAElB,MAAMqqG,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,8BACtB,UAAWxkH,KAASma,EAAK,OAAQ,CAC/B,MAAM63E,GAAM,SAAS,cAAc,KAAK,EACxCA,GAAI,UAAY,kCAChBA,GAAI,MAAM,OAAS,GAAG,KAAK,IAAI,EAAG,KAAK,MAAOhyF,EAAQma,EAAK,SAAY,GAAG,CAAC,CAAC,IAC5EqqG,EAAU,YAAYxyB,EAAG,CAC3B,CAEA,MAAMyyB,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,qCACtB,MAAMC,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,qCACtBF,EAAU,YAAYC,CAAS,EAC/BD,EAAU,YAAYE,CAAS,EAE/B,MAAMC,EAAa,CAACj3C,EAAIC,KAAO,CAC7B,MAAMgb,GAAOu6B,EAAO,IAAMA,EAAO,IAC3B0B,GAAStsH,IAAU,CACvB,GAAIqwF,KAAS,EAAG,MAAO,GACvB,MAAMh6D,IAAOr2B,GAAQ4qH,EAAO,KAAOv6B,GACnC,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGh6D,EAAG,CAAC,CACrC,EACMk2F,GAAUla,IACd,QAAQA,EAAG,mFACb8Z,EAAU,MAAM,KAAOI,GAAOD,GAAMl3C,CAAE,CAAC,EACvCg3C,EAAU,MAAM,KAAOG,GAAOD,GAAMj3C,EAAE,CAAC,CACzC,EAEA,OAAAg3C,EAAW,OAAO77C,IAAQ,CAAC,GAAKo6C,EAAO,GAAG,EAAG,OAAOp6C,IAAQ,CAAC,GAAKo6C,EAAO,GAAG,CAAC,EACtE,CAAE,QAASsB,EAAW,WAAAG,CAAA,CAC/B,EAEMinB,EAAyB,IAAM,CACnC,MAAM3mI,EAAW,OAAOgmI,EAAU,OAAS,EAAE,EAAE,KAAA,EAC/CA,EAAU,gBAAA,EACV,MAAMY,EAAO,SAAS,cAAc,QAAQ,EAC5CA,EAAK,MAAQ,GACbA,EAAK,YAAchB,EACnBI,EAAU,YAAYY,CAAI,EAE1B,MAAMznD,EAAYpgF,EAAM,QAAQ,OAAQsiB,GAAU,CAACtiB,EAAM,MAAM,IAAIsiB,EAAM,IAAI,CAAC,EAC9E,UAAWA,KAAS89D,EAAW,CAC7B,MAAMirB,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,MAAQ/oF,EAAM,KACrB,MAAMg+G,EAAUh+G,EAAM,aAAeA,EAAM,KAC3C+oF,EAAO,YAAc,GAAGi1B,CAAO,KAAKh+G,EAAM,KAAK,IAC/C2kH,EAAU,YAAY57B,CAAM,CAC9B,CACA47B,EAAU,MAAQ7mD,EAAU,KAAM99D,GAAUA,EAAM,OAASrhB,CAAQ,EAAIA,EAAW,GAClFgmI,EAAU,SAAW7mD,EAAU,SAAW,CAC5C,EAEM0nD,EAAsB,CAACh6D,EAAMkkD,IAAc,CAC/C,GAAI,CAAClkD,EAAK,OAAQ,OAClB,IAAI1tE,EAAU+lI,GAAmBnU,EAAWlkD,EAAK,MAAM,EAClD1tE,IACD0tE,EAAK,OAAO,YACd1tE,EAAU+lI,GAAmB,CAAC,KAAK,MAAM/lI,EAAQ,CAAC,CAAC,EAAG,KAAK,MAAMA,EAAQ,CAAC,CAAC,CAAC,EAAG0tE,EAAK,MAAM,EACtF,CAAC1tE,KAEP0tE,EAAK,MAAQ1tE,EACT0tE,EAAK,SACPA,EAAK,OAAO,OAAO,MAAQ,OAAO1tE,EAAQ,CAAC,CAAC,EAC5C0tE,EAAK,OAAO,OAAO,MAAQ,OAAO1tE,EAAQ,CAAC,CAAC,EAC5C0tE,EAAK,OAAO,UAAU1tE,EAAQ,CAAC,EAAGA,EAAQ,CAAC,CAAC,GAE9C0tE,EAAK,aAAa1tE,EAAQ,CAAC,EAAGA,EAAQ,CAAC,CAAC,EACpC0tE,EAAK,WAAUA,EAAK,SAAS,MAAQo4D,GAAsB9lI,EAAQ,CAAC,EAAG0tE,EAAK,OAAO,SAAS,GAC5FA,EAAK,WAAUA,EAAK,SAAS,MAAQo4D,GAAsB9lI,EAAQ,CAAC,EAAG0tE,EAAK,OAAO,SAAS,IAClG,EAEMi6D,EAAqB,CAACj6D,EAAM,CAAE,WAAAk6D,EAAa,EAAA,EAAU,KAAO,CAShE,GARAl6D,EAAK,YAAY,gBAAA,EACjBA,EAAK,eAAe,gBAAA,EAChBA,EAAK,SACPA,EAAK,OAAO,QAAA,EACZA,EAAK,OAAS,MAEhBA,EAAK,WAAa,KAClBA,EAAK,OAAS45D,EAAqB55D,EAAK,SAAS,EAC7C,CAACA,EAAK,OAAQ,CACZA,EAAK,WACPA,EAAK,SAAS,SAAW,GACzBA,EAAK,SAAS,MAAQ,IAEpBA,EAAK,WACPA,EAAK,SAAS,SAAW,GACzBA,EAAK,SAAS,MAAQ,IAExB,MACF,CAEAA,EAAK,MAAQk6D,GAAc,CAAC,MAAM,QAAQl6D,EAAK,KAAK,EAChD,CAACA,EAAK,OAAO,IAAKA,EAAK,OAAO,GAAG,EACjCq4D,GAAmBr4D,EAAK,MAAOA,EAAK,MAAM,EAE1CA,EAAK,WACPA,EAAK,SAAS,SAAW,GACzBA,EAAK,SAAS,KAAOA,EAAK,OAAO,UAAY,IAAM,MACnDA,EAAK,SAAS,IAAMo4D,GAAsBp4D,EAAK,OAAO,IAAKA,EAAK,OAAO,SAAS,EAChFA,EAAK,SAAS,IAAMo4D,GAAsBp4D,EAAK,OAAO,IAAKA,EAAK,OAAO,SAAS,GAE9EA,EAAK,WACPA,EAAK,SAAS,SAAW,GACzBA,EAAK,SAAS,KAAOA,EAAK,OAAO,UAAY,IAAM,MACnDA,EAAK,SAAS,IAAMo4D,GAAsBp4D,EAAK,OAAO,IAAKA,EAAK,OAAO,SAAS,EAChFA,EAAK,SAAS,IAAMo4D,GAAsBp4D,EAAK,OAAO,IAAKA,EAAK,OAAO,SAAS,GAGlF,MAAM24B,EAAS,IAAIkK,GAAe,CAChC,IAAK7iC,EAAK,OAAO,IACjB,IAAKA,EAAK,OAAO,IACjB,MAAOA,EAAK,MACZ,KAAMm4D,GAAsBn4D,EAAK,MAAM,EACvC,SAAWkkD,GAAc,CACvB8V,EAAoBh6D,EAAMkkD,CAAS,EACnCkV,EAAA,CACF,CAAA,CACD,EACGp5D,EAAK,kBAAiB24B,EAAO,OAAO,QAAQ,OAAS34B,EAAK,iBAC1DA,EAAK,kBAAiB24B,EAAO,OAAO,QAAQ,OAAS34B,EAAK,iBAC9DA,EAAK,OAAS24B,EACd34B,EAAK,YAAY,YAAY24B,EAAO,OAAO,EAE3C,MAAM+Z,EAAYF,EAAqB,CACrC,cAAexyC,EAAK,UACpB,MAAOA,EAAK,MACZ,OAAQA,EAAK,MAAA,CACd,EACG0yC,IACF1yC,EAAK,WAAa0yC,EAAU,WAC5B1yC,EAAK,eAAe,YAAY0yC,EAAU,OAAO,GAEnDsnB,EAAoBh6D,EAAMA,EAAK,KAAK,CACtC,EAEMm6D,EAAa,CAACv4D,EAAW,CAAE,OAAAuuD,EAAS,EAAA,EAAS,KAAO,CACxD,MAAMnwD,EAAO9tE,EAAM,MAAM,IAAI0vE,CAAS,EACjC5B,IACLA,EAAK,QAAQ,UAAA,EACbA,EAAK,KAAK,SAAA,EACV9tE,EAAM,MAAM,OAAO0vE,CAAS,EAC5Bk4D,EAAA,EACI3J,GAAQiJ,EAAA,EACd,EAEMgB,EAAgCp6D,GAAS,CAC7C,MAAMl0D,EAAU0tH,EAAmBx5D,EAAK,SAAS,EAC3C0O,EAAW,IAAI,IAAI,MAAM,KAAK1O,EAAK,YAAY,iBAAmB,CAAA,CAAE,EAAE,IAAKu9B,GAAWA,EAAO,KAAK,CAAC,EACzGv9B,EAAK,YAAY,gBAAA,EACjBA,EAAK,WAAW,gBAAA,EAChB,UAAWxrD,KAAS1I,EAAS,CAC3B,MAAMI,EAAQsI,EAAM,MACd+oF,EAAS,SAAS,cAAc,QAAQ,EAM9C,GALAA,EAAO,MAAQrxF,EACfqxF,EAAO,YAAcrxF,EACjBwiE,EAAS,IAAIxiE,CAAK,MAAU,SAAW,IAC3C8zD,EAAK,YAAY,YAAYu9B,CAAM,EAE/Bv9B,EAAK,UAAW,CAClB,MAAMlD,EAAO,SAAS,cAAc,OAAO,EAC3CA,EAAK,UAAY,wCACjBA,EAAK,QAAQ,MAAQ5wD,EAErB,MAAM+uD,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,KAAO,WACbA,EAAM,MAAQ/uD,EACd+uD,EAAM,QAAUyT,EAAS,IAAIxiE,CAAK,EAClC+uD,EAAM,iBAAiB,SAAU,IAAM,CACrC,MAAMo/D,GAAW,MAAM,KAAKr6D,EAAK,YAAY,SAAW,EAAE,EAAE,KAAMzsB,IAAcA,GAAU,QAAUrnC,CAAK,EACrGmuH,KAAUA,GAAS,SAAWp/D,EAAM,SACxCq/D,EAAyBt6D,CAAI,EAC7Bo5D,EAAA,CACF,CAAC,EACDt8D,EAAK,YAAY7B,CAAK,EAEtB,MAAMkR,EAAO,SAAS,cAAc,MAAM,EAC1CA,EAAK,UAAY,yCACjBA,EAAK,YAAcjgE,EACnB4wD,EAAK,YAAYqP,CAAI,EAErB,MAAMj+E,EAAQ,SAAS,cAAc,MAAM,EAC3CA,EAAM,UAAY,yCAClBA,EAAM,YAAcgqI,GAAmB1jH,EAAM,KAAK,EAClDsoD,EAAK,YAAY5uE,CAAK,EAEtB8xE,EAAK,UAAU,YAAYlD,CAAI,CACjC,CACF,CACIkD,EAAK,aACPA,EAAK,WAAW,SAAWl0D,EAAQ,SAAW,EAC9Ck0D,EAAK,WAAW,KAAO,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGl0D,EAAQ,QAAU,CAAC,CAAC,GAErEwuH,EAAyBt6D,CAAI,CAC/B,EAEMs6D,EAA4Bt6D,GAAS,CACzC,MAAM0O,EAAW,IAAI,IAAI,MAAM,KAAK1O,EAAK,YAAY,iBAAmB,CAAA,CAAE,EAAE,IAAKu9B,GAAWA,EAAO,KAAK,CAAC,EAEnGlmF,EADU,MAAM,KAAK2oD,EAAK,YAAY,SAAW,EAAE,EACnC,OAClBA,EAAK,UACPA,EAAK,QAAQ,YAAe3oD,EAExBq3D,EAAS,OAASr3D,EAChB,OAAOA,CAAK,YACZ,GAAGq3D,EAAS,IAAI,OAAOr3D,CAAK,YAH9B,iBAKN,UAAWylD,KAAQkD,EAAK,WAAW,mBAAmB,wCAAwC,GAAK,GAAI,CACrG,MAAM27B,EAAUjtB,EAAS,IAAI5R,EAAK,QAAQ,KAAK,EAC/CA,EAAK,QAAQ,QAAU6+B,EAAU,OAAS,QAC1C,MAAM1gC,EAAQ6B,EAAK,cAAc,wBAAwB,EACrD7B,MAAa,QAAU0gC,EAC7B,CACF,EAEM4+B,EAAqB34D,GAAc,CACvC,MAAM44D,EAAQ/B,GAAgB72D,EAAW,UAAWq3D,EAAQ,cAAe,IAAMkB,EAAWv4D,CAAS,CAAC,EAChG5B,EAAO,CACX,UAAA4B,EACA,KAAM,UACN,IAAK44D,EAAM,IACX,OAAQ,KACR,MAAO,KACP,WAAY,SAAS,cAAc,KAAK,EACxC,cAAe,SAAS,cAAc,KAAK,EAC3C,OAAQ,KACR,WAAY,KACZ,SAAU,KACV,SAAU,KACV,gBAAiBvB,EAAQ,UACzB,gBAAiBA,EAAQ,SAAA,EAE3Bj5D,EAAK,WAAW,MAAM,MAAQ,OAC9BA,EAAK,cAAc,MAAM,MAAQ,OAEjC,MAAMy6D,EAAa,SAAS,cAAc,KAAK,EAC/CA,EAAW,UAAY,2BACvBA,EAAW,MAAM,MAAQ,OAEzB,MAAMnV,EAAW,SAAS,cAAc,OAAO,EAC/CA,EAAS,KAAO,SAChBA,EAAS,UAAY,mBACjB2T,EAAQ,WAAU3T,EAAS,QAAQ,OAAS2T,EAAQ,UACxD3T,EAAS,SAAW,GAEpB,MAAM9E,EAAW,SAAS,cAAc,OAAO,EAC/CA,EAAS,KAAO,SAChBA,EAAS,UAAY,mBACjByY,EAAQ,WAAUzY,EAAS,QAAQ,OAASyY,EAAQ,UACxDzY,EAAS,SAAW,GAEpBxgD,EAAK,SAAWslD,EAChBtlD,EAAK,SAAWwgD,EAChBia,EAAW,YAAYnV,CAAQ,EAC/BmV,EAAW,YAAYja,CAAQ,EAE/B,MAAMka,EAAmB,IAAM,CAC7B,GAAI,CAAC16D,EAAK,OAAQ,OAClB,MAAMs4D,EAAQ,OAAOhT,EAAS,KAAK,EAC7BiT,EAAQ,OAAO/X,EAAS,KAAK,EACnC,GAAI,CAAC,OAAO,SAAS8X,CAAK,GAAK,CAAC,OAAO,SAASC,CAAK,EAAG,CACtDyB,EAAoBh6D,EAAMA,EAAK,OAAS,CAACA,EAAK,OAAO,IAAKA,EAAK,OAAO,GAAG,CAAC,EAC1E,MACF,CACAg6D,EAAoBh6D,EAAM,CAACs4D,EAAOC,CAAK,CAAC,EACxCa,EAAA,CACF,EAEA9T,EAAS,iBAAiB,SAAUoV,CAAgB,EACpDla,EAAS,iBAAiB,SAAUka,CAAgB,EACpDpV,EAAS,iBAAiB,OAAQoV,CAAgB,EAClDla,EAAS,iBAAiB,OAAQka,CAAgB,EAClDpV,EAAS,iBAAiB,UAAYz8H,GAAU,CAC1CA,EAAM,MAAQ,UAClBA,EAAM,eAAA,EACN6xI,EAAA,EACF,CAAC,EACDla,EAAS,iBAAiB,UAAY33H,GAAU,CAC1CA,EAAM,MAAQ,UAClBA,EAAM,eAAA,EACN6xI,EAAA,EACF,CAAC,EAEDF,EAAM,KAAK,YAAYx6D,EAAK,aAAa,EACzCw6D,EAAM,KAAK,YAAYx6D,EAAK,UAAU,EACtCw6D,EAAM,KAAK,YAAYC,CAAU,EAEjCR,EAAmBj6D,EAAM,CAAE,WAAY,EAAA,CAAM,EAC7Ck5D,EAAU,YAAYl5D,EAAK,GAAG,EAC9B9tE,EAAM,MAAM,IAAI0vE,EAAW5B,CAAI,EAC/B85D,EAAA,EACAV,EAAA,CACF,EAEMuB,EAAoB/4D,GAAc,CACtC,MAAM44D,EAAQ/B,GAAgB72D,EAAW,SAAUq3D,EAAQ,aAAc,IAAMkB,EAAWv4D,CAAS,CAAC,EAC9F5B,EAAO,CACX,UAAA4B,EACA,KAAM,SACN,IAAK44D,EAAM,IACX,eAAgB,KAChB,WAAY,IAAA,EAGRz2C,EAAW,SAAS,cAAc,QAAQ,EAChDA,EAAS,UAAY,mBACrBA,EAAS,MAAM,SAAW,OACtBk1C,EAAQ,iBAAgBl1C,EAAS,QAAQ,OAASk1C,EAAQ,gBAC9D,MAAM2B,EAAY,CAChB,CAAE,MAAO,WAAY,MAAO,UAAA,EAC5B,CAAE,MAAO,cAAe,MAAO,aAAA,EAC/B,CAAE,MAAO,YAAa,MAAO,WAAA,EAC7B,CAAE,MAAO,QAAS,MAAO,OAAA,CAAQ,EAEnC,UAAWpmH,KAASomH,EAAW,CAC7B,MAAMr9B,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,MAAQ/oF,EAAM,MACrB+oF,EAAO,YAAc/oF,EAAM,MAC3BuvE,EAAS,YAAYwZ,CAAM,CAC7B,CAEA,MAAM7E,EAAa,SAAS,cAAc,OAAO,EACjDA,EAAW,KAAO,OAClBA,EAAW,UAAY,iBACvBA,EAAW,YAAc,QACrBugC,EAAQ,cAAavgC,EAAW,QAAQ,OAASugC,EAAQ,aAE7Dl1C,EAAS,iBAAiB,SAAUq1C,CAAS,EAC7C1gC,EAAW,iBAAiB,QAAS0gC,CAAS,EAE9Cp5D,EAAK,eAAiB+jB,EACtB/jB,EAAK,WAAa04B,EAElB8hC,EAAM,KAAK,YAAYz2C,CAAQ,EAC/By2C,EAAM,KAAK,YAAY9hC,CAAU,EAEjCwgC,EAAU,YAAYl5D,EAAK,GAAG,EAC9B9tE,EAAM,MAAM,IAAI0vE,EAAW5B,CAAI,EAC/B85D,EAAA,EACAV,EAAA,CACF,EAEMyB,EAAyBj5D,GAAc,CAC3C,MAAM44D,EAAQ/B,GAAgB72D,EAAW,cAAeq3D,EAAQ,kBAAmB,IAAMkB,EAAWv4D,CAAS,CAAC,EACxG5B,EAAO,CACX,UAAA4B,EACA,KAAM,cACN,IAAK44D,EAAM,IACX,WAAY,KACZ,WAAY,KACZ,UAAW,KACX,UAAW,KACX,QAAS,IAAA,EAGLlzI,EAAO,SAAS,cAAc,QAAQ,EAC5CA,EAAK,UAAY,mBACjBA,EAAK,MAAM,SAAW,OAClB2xI,EAAQ,kBAAiB3xI,EAAK,QAAQ,OAAS2xI,EAAQ,iBAE3D,MAAM6B,EAAa,SAAS,cAAc,QAAQ,EAClDA,EAAW,MAAQ,OACnBA,EAAW,YAAc,YACzBxzI,EAAK,YAAYwzI,CAAU,EAE3B,MAAMC,EAAa,SAAS,cAAc,QAAQ,EAClDA,EAAW,MAAQ,OACnBA,EAAW,YAAc,yBACzBzzI,EAAK,YAAYyzI,CAAU,EAE3B,MAAMC,EAAa,SAAS,cAAc,QAAQ,EAClDA,EAAW,UAAY,uDACvBA,EAAW,SAAW,GAClB/B,EAAQ,kBAAiB+B,EAAW,QAAQ,OAAS/B,EAAQ,iBAEjE,MAAMgC,EAAkB,SAAS,cAAc,KAAK,EACpDA,EAAgB,UAAY,0CAC5B,MAAMvsE,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,2CACpBusE,EAAgB,YAAYvsE,CAAO,EAEnC,MAAMwsE,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,2CACpB,MAAMC,GAAY,SAAS,cAAc,QAAQ,EACjDA,GAAU,KAAO,SACjBA,GAAU,UAAY,0CACtBA,GAAU,YAAc,MACxB,MAAMC,GAAW,SAAS,cAAc,QAAQ,EAChDA,GAAS,KAAO,SAChBA,GAAS,UAAY,0CACrBA,GAAS,YAAc,OACvBF,EAAQ,YAAYC,EAAS,EAC7BD,EAAQ,YAAYE,EAAQ,EAC5BH,EAAgB,YAAYC,CAAO,EAEnC,MAAMG,GAAY,SAAS,cAAc,KAAK,EAC9CA,GAAU,UAAY,kCAClBpC,EAAQ,kBAAiBoC,GAAU,QAAQ,OAAS,GAAGpC,EAAQ,eAAe,cAElF,MAAMqC,GAAY,SAAS,cAAc,OAAO,EAChDA,GAAU,KAAO,OACjBA,GAAU,UAAY,iBACtBA,GAAU,YAAc,aACpBrC,EAAQ,kBAAiBqC,GAAU,QAAQ,OAASrC,EAAQ,iBAChEqC,GAAU,OAAS,GAEnB,MAAMC,GAAW,IAAM,CACrB,MAAMC,GAASl0I,EAAK,QAAU,OAC9B2zI,EAAgB,OAASO,GACzBH,GAAU,OAASG,GACnBF,GAAU,OAAS,CAACE,EACtB,EAEAl0I,EAAK,iBAAiB,SAAU,IAAM,CACpCi0I,GAAA,EACAnC,EAAA,CACF,CAAC,EACD4B,EAAW,iBAAiB,SAAU,IAAM,CAC1CV,EAAyBt6D,CAAI,EAC7Bo5D,EAAA,CACF,CAAC,EACDkC,GAAU,iBAAiB,QAASlC,CAAS,EAC7C+B,GAAU,iBAAiB,QAAS,IAAM,CACxC,UAAW59B,MAAU,MAAM,KAAKy9B,EAAW,OAAO,KAAU,SAAW,GACvEV,EAAyBt6D,CAAI,EAC7Bo5D,EAAA,CACF,CAAC,EACDgC,GAAS,iBAAiB,QAAS,IAAM,CACvC,UAAW79B,MAAU,MAAM,KAAKy9B,EAAW,OAAO,KAAU,SAAW,GACvEV,EAAyBt6D,CAAI,EAC7Bo5D,EAAA,CACF,CAAC,EAEDp5D,EAAK,WAAa14E,EAClB04E,EAAK,WAAag7D,EAClBh7D,EAAK,UAAYs7D,GACjBt7D,EAAK,UAAYq7D,GACjBr7D,EAAK,QAAUtR,EAEf6sE,GAAA,EACAnB,EAA6Bp6D,CAAI,EAEjCw6D,EAAM,KAAK,YAAYlzI,CAAI,EAC3BkzI,EAAM,KAAK,YAAYS,CAAe,EACtCT,EAAM,KAAK,YAAYa,EAAS,EAChCb,EAAM,KAAK,YAAYQ,CAAU,EACjCR,EAAM,KAAK,YAAYc,EAAS,EAEhCpC,EAAU,YAAYl5D,EAAK,GAAG,EAC9B9tE,EAAM,MAAM,IAAI0vE,EAAW5B,CAAI,EAC/B85D,EAAA,EACAV,EAAA,CACF,EAEMqC,EAAkB,IAAM,CAC5B,MAAM75D,EAAY,YACZ44D,EAAQ/B,GAAgB,eAAgB,QAASQ,EAAQ,YAAa,IAAMkB,EAAWv4D,CAAS,CAAC,EACjG5B,EAAO,CACX,UAAA4B,EACA,KAAM,QACN,IAAK44D,EAAM,IACX,MAAO,IAAA,EAGHkB,EAAa,SAAS,cAAc,OAAO,EACjDA,EAAW,KAAO,OAClBA,EAAW,UAAY,iBACvBA,EAAW,YAAc,4BACrBzC,EAAQ,aAAYyC,EAAW,QAAQ,OAASzC,EAAQ,YAC5DyC,EAAW,iBAAiB,QAAStC,CAAS,EAC9Cp5D,EAAK,MAAQ07D,EACblB,EAAM,KAAK,YAAYkB,CAAU,EAEjCxC,EAAU,YAAYl5D,EAAK,GAAG,EAC9B9tE,EAAM,MAAM,IAAI0vE,EAAW5B,CAAI,EAC/B85D,EAAA,EACAV,EAAA,CACF,EAEMuC,EAAuB/5D,GAAc,CACzC,MAAM74E,EAAO,OAAO64E,GAAa,EAAE,EAAE,KAAA,EACrC,GAAI,CAAC74E,GAAQmJ,EAAM,MAAM,IAAInJ,CAAI,EAAG,OACpC,MAAMyrB,EAAQtiB,EAAM,cAAc,IAAInJ,CAAI,EACrCyrB,IACDA,EAAM,OAAS,UAAW+lH,EAAkBxxI,CAAI,EAC3CyrB,EAAM,OAAS,SAAUmmH,EAAiB5xI,CAAI,EAC9CyrB,EAAM,OAAS,cAAeqmH,EAAsB9xI,CAAI,EACxDyrB,EAAM,OAAS,SAASinH,EAAA,EACnC,EAEAtC,EAAU,iBAAiB,SAAU,IAAM,CACzC,MAAMv3D,EAAY,OAAOu3D,EAAU,OAAS,EAAE,EAAE,KAAA,EAC3Cv3D,IACL+5D,EAAoB/5D,CAAS,EAC7Bu3D,EAAU,MAAQ,GACpB,CAAC,EAED,MAAMyC,EAAqB,IAAM,CAC/B1pI,EAAM,QAAUonI,EAAA,EAChBpnI,EAAM,cAAgB,IAAI,IAAIA,EAAM,QAAQ,IAAKsiB,GAAU,CAACA,EAAM,KAAMA,CAAK,CAAC,CAAC,EAE/E,UAAWotD,KAAa,MAAM,KAAK1vE,EAAM,MAAM,KAAA,CAAM,EAC9CA,EAAM,cAAc,IAAI0vE,CAAS,GACpCu4D,EAAWv4D,EAAW,CAAE,OAAQ,EAAA,CAAO,EAI3C,UAAW5B,KAAQ9tE,EAAM,MAAM,OAAA,EACzB8tE,EAAK,OAAS,UAChBi6D,EAAmBj6D,EAAM,CAAE,WAAY,EAAA,CAAO,EACrCA,EAAK,OAAS,eACvBo6D,EAA6Bp6D,CAAI,EAIrC85D,EAAA,CACF,EAEM+B,EAAe,IAAM,CACzB,MAAMttB,EAAQ,CAAA,EACd,UAAWvuC,KAAQ9tE,EAAM,MAAM,OAAA,EAAU,CACvC,GAAI8tE,EAAK,OAAS,UAAW,CAE3B,GADI,CAACA,EAAK,QAAU,CAAC,MAAM,QAAQA,EAAK,KAAK,GACzCw4D,GAAYx4D,EAAK,MAAOA,EAAK,MAAM,EAAG,SAC1CuuC,EAAM,KAAK,CACT,GAAI,GAAG/hF,CAAK,IAAIwzC,EAAK,SAAS,GAC9B,MAAAxzC,EACA,KAAM,UACN,UAAWwzC,EAAK,UAChB,IAAKA,EAAK,MAAM,CAAC,EACjB,IAAKA,EAAK,MAAM,CAAC,EACjB,UAAWA,EAAK,OAAO,IACvB,UAAWA,EAAK,OAAO,GAAA,CACxB,EACD,QACF,CACA,GAAIA,EAAK,OAAS,SAAU,CAC1B,MAAMx5E,EAAQ,OAAOw5E,EAAK,YAAY,OAAS,EAAE,EAAE,KAAA,EACnD,GAAI,CAACx5E,EAAO,SACZ+nH,EAAM,KAAK,CACT,GAAI,GAAG/hF,CAAK,IAAIwzC,EAAK,SAAS,GAC9B,MAAAxzC,EACA,KAAM,SACN,UAAWwzC,EAAK,UAChB,SAAU,OAAOA,EAAK,gBAAgB,OAAS,UAAU,EACzD,MAAAx5E,CAAA,CACD,EACD,QACF,CACA,GAAIw5E,EAAK,OAAS,cAAe,CAE/B,MAAM3nE,EADU,OAAO2nE,EAAK,YAAY,OAAS,MAAM,IAAM,OAEzDi4D,GAAej4D,EAAK,WAAW,OAAS,EAAE,EAC1C,MAAM,KAAKA,EAAK,YAAY,iBAAmB,CAAA,CAAE,EAAE,IAAKu9B,GAAWA,EAAO,KAAK,EACnF,GAAI,CAACllG,EAAO,OAAQ,SACpBk2G,EAAM,KAAK,CACT,GAAI,GAAG/hF,CAAK,IAAIwzC,EAAK,SAAS,GAC9B,MAAAxzC,EACA,KAAM,cACN,UAAWwzC,EAAK,UAChB,OAAA3nE,CAAA,CACD,EACD,QACF,CACA,GAAI2nE,EAAK,OAAS,QAAS,CACzB,MAAM6kB,EAAQ,OAAO7kB,EAAK,OAAO,OAAS,EAAE,EAAE,KAAA,EAC9C,GAAI,CAAC6kB,EAAO,SACZ0pB,EAAM,KAAK,CACT,GAAI,GAAG/hF,CAAK,SACZ,MAAAA,EACA,KAAM,QACN,MAAAq4D,CAAA,CACD,CACH,CACF,CACA,OAAO0pB,CACT,EAEM2jB,EAAU,IAAM,CACpB,UAAWlyD,KAAQ9tE,EAAM,MAAM,OAAA,EAC7B8tE,EAAK,QAAQ,UAAA,EAEf9tE,EAAM,MAAM,MAAA,EACZinI,EAAU,OAAA,EACV5wI,EAAQ,OAAA,CACV,EAEA,OAAAqzI,EAAA,EAEO,CACL,QAAArzI,EACA,UAAA4wI,EACA,mBAAAyC,EACA,aAAAC,EACA,QAAA3J,CAAA,CAEJ,CCr8BA,MAAM4J,GAA8B,OAAO,OAAO,CAChD,QAAS,EACT,WAAY,EACZ,WAAY,EACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,IAAM,IAAM,IAAM,CAAC,CAChC,CAAC,EAEKC,GAA+B,OAAO,OAAO,CACjD,QAAS,IACT,WAAY,EACZ,WAAY,KACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,IAAM,IAAM,IAAM,CAAC,CAChC,CAAC,EAEKC,GAA2B,OAAO,OAAO,CAC7C,QAAS,KACT,WAAY,EACZ,WAAY,IACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,IAAM,IAAM,IAAM,CAAC,CAChC,CAAC,EAEKC,GAA8B,OAAO,OAAO,CAChD,SAAU,IACV,WAAY,EACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,GAAK,IAAM,IAAM,CAAC,CAC/B,CAAC,EAEKC,GAA+B,OAAO,OAAO,CACjD,SAAU,KACV,WAAY,GACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,IAAM,IAAM,IAAM,CAAC,CAChC,CAAC,EAEKC,GAA2B,OAAO,OAAO,CAC7C,SAAU,KACV,WAAY,GACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,IAAM,IAAM,IAAM,CAAC,CAChC,CAAC,EAqBKC,GAAoC,OAAO,OAAO,CACtD,QAAS,IACT,WAAY,EACZ,WAAY,IACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,CACvB,CAAC,EAEKC,GAAoC,OAAO,OAAO,CACtD,SAAU,IACV,WAAY,IACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,CACvB,CAAC,EAEKC,GAAqC,OAAO,OAAO,CACvD,QAAS,GACT,WAAY,EACZ,WAAY,GACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,CACvB,CAAC,EAEKC,GAAqC,OAAO,OAAO,CACvD,SAAU,GACV,WAAY,GACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,CACvB,CAAC,EAEKC,GAAwC,OAAO,OAAO,CAC1D,QAAS,GACT,OAAQ,GACV,CAAC,EAEKC,GAAwC,OAAO,OAAO,CAC1D,QAAS,GACT,OAAQ,EACV,CAAC,EAMKC,GAA0B,wBAEhC,SAAStP,GAAUr7H,EAAQonG,EAAWtuG,EAAS,CAC7C,MAAI,CAACkH,GAAU,OAAOlH,GAAY,WAAmB,IAAM,CAAC,EACxD,OAAOkH,EAAO,IAAO,WAChBA,EAAO,GAAGonG,EAAWtuG,CAAO,IAAM,IAAM,CAAC,GAE9C,OAAOkH,EAAO,kBAAqB,YACrCA,EAAO,iBAAiBonG,EAAWtuG,CAAO,EACnC,IAAMkH,EAAO,oBAAoBonG,EAAWtuG,CAAO,GAErD,IAAM,CAAC,CAChB,CAEA,SAAS8xI,GAAqBjH,EAAWvpD,EAAM,CAC7C,MAAMmjB,EAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAQ,UAAY,wBACpBA,EAAQ,MAAM,OAAS,aACvBA,EAAQ,MAAM,WAAa,MAC3BA,EAAQ,MAAM,cAAgB,SAC9BA,EAAQ,YAAcnjB,EACtBupD,EAAU,YAAYpmC,CAAO,EACtBA,CACT,CAEA,SAASstC,GAAUp2I,EAAOC,EAAU,CAClC,MAAMwY,EAAO,MAAM,QAAQxY,CAAQ,EAAIA,EAAW,CAAC,EAAG,EAAG,EAAG,CAAC,EAC7D,MAAI,CAAC,MAAM,QAAQD,CAAK,GAAK,CAAC,YAAY,OAAOA,CAAK,EAAU,CAAC,GAAGyY,CAAI,EACjE,CAAC,EAAG,EAAG,EAAG,CAAC,EAAE,IAAKnF,GAAU,CACjC,MAAMpT,EAAU,OAAOF,EAAMsT,CAAK,CAAC,EACnC,OAAO,OAAO,SAASpT,CAAO,EAAIA,EAAUuY,EAAKnF,CAAK,CACxD,CAAC,CACH,CAEA,SAAS+iI,GAAmBr2I,EAAOC,EAAW,YAAa,CACzD,MAAM+iC,EAAOozG,GAAUp2I,EAAO,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,EAAE,IAAI,CAACguB,EAAO1a,IAC9B,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG0a,CAAK,CAAC,CAEvD,EACKkmC,EAAI,KAAK,MAAMlxB,EAAK,CAAC,EAAI,GAAG,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,EAC1DmxB,EAAI,KAAK,MAAMnxB,EAAK,CAAC,EAAI,GAAG,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,EAC1DloB,EAAI,KAAK,MAAMkoB,EAAK,CAAC,EAAI,GAAG,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,EAC1DnoB,EAAI,KAAK,MAAMmoB,EAAK,CAAC,EAAI,GAAG,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,EAC1DooC,EAAM,IAAIlX,CAAC,GAAGC,CAAC,GAAGr5C,CAAC,GAAGD,CAAC,GAC7B,MAAO,mBAAmB,KAAKuwD,CAAG,EAAIA,EAAMnrE,CAC9C,CAEA,SAASq2I,GAAmBt2I,EAAOC,EAAU,CAC3C,MAAMwY,EAAO29H,GAAUn2I,EAAU,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,EACvCo2B,EAAM,OAAOr2B,GAAS,EAAE,EAAE,OAAO,QAAQ,KAAM,EAAE,EACvD,MAAK,kBAAkB,KAAKq2B,CAAG,EACxB,CACL,OAAO,SAASA,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IACvC,OAAO,SAASA,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IACvC,OAAO,SAASA,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IACvC,OAAO,SAASA,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,GAC3C,EAN2C5d,CAO3C,CAEA,SAAS89H,GAAsBv2I,EAAOC,EAAU,CAC9C,GAAID,GAAS,MAAQ,GAAGA,CAAK,GAAG,KAAI,IAAO,GAAI,OAAOC,EACtD,MAAMC,EAAU,OAAOF,CAAK,EAC5B,OAAO,OAAO,SAASE,CAAO,EAAIA,EAAUD,CAC9C,CAEA,SAASu2I,GAA2Bx2I,EAAOC,EAAU,CACnD,OAAOqjH,GAAYizB,GAAsBv2I,EAAO,IAAI,EAAG,CAAE,IAAK,CAAC,CAAE,GAAKC,CACxE,CAEA,SAASw2I,GAAmB7+G,EAAO33B,EAAU,CAC3C,MAAMwY,EAAOxY,GAAYq1I,GACnB9yI,EAAOo1B,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EAC1D,MAAO,CACL,QAAS4+G,GAA2Bh0I,EAAK,SAAWiW,EAAK,QAASA,EAAK,OAAO,EAC9E,WAAY+9H,GAA2Bh0I,EAAK,YAAciW,EAAK,WAAYA,EAAK,UAAU,EAC1F,WAAY+9H,GAA2Bh0I,EAAK,YAAciW,EAAK,WAAYA,EAAK,UAAU,EAC1F,QAASjW,EAAK,UAAY,GAC1B,cAAeA,EAAK,gBAAkB,GACtC,SAAU4zI,GAAU5zI,EAAK,SAAUiW,EAAK,QAAQ,EAChD,SAAU29H,GAAU5zI,EAAK,SAAUiW,EAAK,QAAQ,CACpD,CACA,CAEA,SAASi+H,GAAmB9+G,EAAO33B,EAAU,CAC3C,MAAMwY,EAAOxY,GAAYw1I,GACnBjzI,EAAOo1B,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EAC1D,MAAO,CACL,SAAU4+G,GAA2Bh0I,EAAK,UAAYiW,EAAK,SAAUA,EAAK,QAAQ,EAClF,WAAY+9H,GAA2Bh0I,EAAK,YAAciW,EAAK,WAAYA,EAAK,UAAU,EAC1F,QAASjW,EAAK,UAAY,GAC1B,cAAeA,EAAK,gBAAkB,GACtC,SAAU4zI,GAAU5zI,EAAK,SAAUiW,EAAK,QAAQ,EAChD,SAAU29H,GAAU5zI,EAAK,SAAUiW,EAAK,QAAQ,CACpD,CACA,CAWA,SAASk+H,GAA4BC,EAAM32I,EAAW+1I,GAAuC,CAC3F,MAAMv9H,EAAOxY,GAAY,OAAOA,GAAa,SAAWA,EAAW+1I,GAC7DxzI,EAAOo0I,GAAQ,OAAOA,GAAS,SAAWA,EAAO,CAAA,EACvD,MAAO,CACL,QAASp0I,EAAK,SAAW,KAAOiW,EAAK,UAAY,GAAOjW,EAAK,UAAY,GACzE,OAAQ8gH,GAAY9gH,EAAK,QAAUiW,EAAK,OAAQ,CAAE,IAAK,EAAG,IAAK,CAAC,CAAE,GAAKA,EAAK,MAChF,CACA,CAqDA,SAASo+H,GAA4B3vI,EAAS,CAC5C,GAAI,CAACA,EAAS,MAAO,CAAA,EACrB,MAAMoe,EAAU,CAAA,EAChB,UAAW/iB,KAAQ2E,EAAQ,wBAAqB,GAAQ,CAAA,EACzCA,EAAQ,uBAAuB3E,CAAI,GACtC,OAASi8C,GAAAA,cAAc,QACjCl5B,EAAQ,KAAK,OAAO/iB,CAAI,CAAC,EAE3B,OAAA+iB,EAAQ,KAAK,CAACzK,EAAGC,IAAMD,EAAE,cAAcC,CAAC,CAAC,EAClCwK,CACT,CAoBA,SAASwxH,GAAiC5vI,EAAS,CACjD,GAAI,CAACA,EAAS,MAAO,MACrB,MAAM0Z,EAAQ,IAAI,KAAK1Z,EAAQ,wBAAqB,GAAQ,CAAA,GAAI,IAAK3E,GAAS,CAAC,OAAOA,CAAI,EAAE,YAAW,EAAI,OAAOA,CAAI,CAAC,CAAC,CAAC,EACzH,UAAWY,IAAO,CAAC,QAAS,OAAQ,OAAO,EAAG,CAC5C,MAAM6P,EAAQ4N,EAAM,IAAIzd,CAAG,EAC3B,GAAI,CAAC6P,EAAO,SAEZ,GADa9L,EAAQ,uBAAuB8L,CAAK,GACvC,OAASwrC,iBAAc,OAAQ,OAAOxrC,CAClD,CACA,MAAO,KACT,CAeO,MAAM+jI,EAAe,CAC1B,YAAYjwB,EAAIlmH,EAAU,GAAI,CAC5B,KAAK,GAAKkmH,EACV,KAAK,QAAUlmH,CACjB,CAEA,QAAS,CACP,MAAM2K,EAAS,KAAK,GAAG,QAAU,KAC3B09F,EAAU,SAAS,cAAc,KAAK,EAG5C,GAFAA,EAAQ,MAAM,YAAY,wBAAyB,OAAO,EAEtD,CAAC19F,EAAQ,CACX,MAAMw7H,EAAc,SAAS,cAAc,KAAK,EAChD,OAAAA,EAAY,YAAc,KAAK,QAAQ,aAAe,gDACtD99B,EAAQ,YAAY89B,CAAW,EACxB,KAAK,GAAG,YAAY,CACzB,GAAI,KAAK,QAAQ,IAAM,sBACvB,MAAO,KAAK,QAAQ,OAAS,YAC7B,SAAU,KAAK,QAAQ,UAAY,CAAE,EAAG,GAAI,EAAG,GAAG,EAClD,KAAM,KAAK,QAAQ,MAAQ,YAC3B,QAAA99B,CACR,CAAO,CACH,CAEA,MAAMie,EAAWpS,GAAoB,EAC/Bu4B,EAAY,CAAC6B,EAAW,CAAE,MAAA9mC,GAAO,KAAA2H,GAAM,SAAAkC,MAAe,CAC1D,MAAMs7B,GAAQ36B,GAAmB,CAC/B,MAAAxK,GACA,KAAA2H,GACA,SAAAkC,GACA,cAAeiV,EAAS,aAChC,CAAO,EACD,OAAAgoB,EAAU,YAAY3B,GAAM,GAAG,EACxBA,EACT,EAEMyJ,EAAoBzrI,EAAO,cAAc,YAAa,KAAK,OAAO,GAAKA,EAAO,UAAU,WAAa,KACrG0rI,EAAgB1rI,EAAO,cAAc,QAAS,KAAK,OAAO,GAAKA,EAAO,UAAU,OAAS,KACzF2rI,EAAiB3rI,EAAO,UAAU,QAAUA,EAAO,cAAc,QAAQ,EAC/E,GAAI,CAACyrI,EACH,MAAM,IAAI,MAAM,wEAAwE,EAE1F,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,oEAAoE,EAEtF,MAAME,EAAiBH,EAAkB,MACnCI,EAAaH,EAAc,MAE3BI,EAAgCZ,GACpCb,GACAA,EACN,EACU0B,EAAgCZ,GACpCb,GACAA,EACN,EACU0B,EAAiCd,GACrCX,GACAA,EACN,EACU0B,EAAiCd,GACrCX,GACAA,EACN,EAOU0B,EAAiB,IAAMR,EAAc,eAAc,EACnDS,EAAiB,IAAMT,EAAc,eAAc,EAInDU,EAAsB,CAAC33I,EAAQk2I,KAA4B,CAC/Dc,EAAkB,oBAAoBh3I,CAAK,EAC3C43I,GAA4B,CAC9B,EACMC,EAAiB,CAACj3I,EAAU,CAAA,IAAOo2I,EAAkB,eAAep2I,CAAO,EAI3Ek3I,EAAqB,SAAS,cAAc,KAAK,EACvDA,EAAmB,UAAY,wBAC/BA,EAAmB,MAAM,WAAa,MACtCA,EAAmB,MAAM,OAAS,UAClCA,EAAmB,OAAS,GAE5B,MAAMC,EAAsB,CAACp0I,EAAU,KAAO,CAC5C,MAAMgiF,GAAO,OAAOhiF,GAAY,SAAWA,EAAQ,KAAI,EAAK,GAC5Dm0I,EAAmB,YAAcnyD,GACjCmyD,EAAmB,OAAS,CAACnyD,EAC/B,EAEMqyD,EAAkB,CAACl3I,EAAO,QAAU,CACxC,GAAI,CACF,MAAMinH,GAAQkwB,EAAmB,aAAY,EAC7C,GAAI,CAAClwB,GAAM,OAAQ,CACjBgwB,EAAoB,+CAA+C,EACnE,MACF,CACAf,EAAkB,wBAAwBjvB,GAAOjnH,CAAI,EACrDo3I,EAAa,EACbH,EAAoB,EAAE,CACxB,OAASlzI,GAAO,CACdkzI,EAAoBlzI,cAAiB,MAAQA,GAAM,QAAU,OAAOA,EAAK,CAAC,CAC5E,CACF,EAEMszI,EAA6B,IAAM,CACvC,GAAI,CAAChB,EAAe,cAAc,KAAM,CACtCY,EAAoB,yDAAyD,EAC7E,MACF,CACA,GAAI,CACFf,EAAkB,2BAA0B,EAC5CkB,EAAa,EACbH,EAAoB,EAAE,CACxB,OAASlzI,EAAO,CACdkzI,EAAoBlzI,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,CAAC,CAC5E,CACF,EAEMuzI,EAA+B,CAACx3I,EAAU,CAAA,IAAOo2I,EAAkB,6BAA6Bp2I,CAAO,EAEvGy3I,EAAW,SAAS,cAAc,KAAK,EAC7CA,EAAS,UAAY,oDACrBA,EAAS,MAAM,OAAS,WAExB,MAAMH,EAAgB,IAAM,CAC1BG,EAAS,YAAc,WAAWlB,EAAe,cAAc,IAAI,QAAQA,EAAe,cAAc,OAAS,EAAI,GAAK,GAAG,IAAIA,EAAe,cAAc,IAAI,QAAQA,EAAe,cAAc,OAAS,EAAI,GAAK,GAAG,EAC9N,EAEMmB,EAAc,SAAS,cAAc,KAAK,EAChDA,EAAY,UAAY,+BACxBA,EAAY,MAAM,QAAU,OAC5BA,EAAY,MAAM,SAAW,OAC7BA,EAAY,MAAM,IAAM,MACxBA,EAAY,MAAM,OAAS,UAE3B,MAAMC,EAAc,SAAS,cAAc,QAAQ,EACnDA,EAAY,KAAO,SACnBA,EAAY,UAAY,mBACxBA,EAAY,YAAc,QAC1BA,EAAY,aAAa,aAAc,iBAAiB,EACxDA,EAAY,iBAAiB,QAAS,IAAM,CAC1CV,EAAc,EACdK,EAAa,EACbH,EAAoB,EAAE,CACxB,CAAC,EACDO,EAAY,YAAYC,CAAW,EAEnC,MAAMC,EAAe,SAAS,cAAc,QAAQ,EACpDA,EAAa,KAAO,SACpBA,EAAa,UAAY,mBACzBA,EAAa,YAAc,mBAC3BA,EAAa,aAAa,aAAc,+BAA+B,EACvEA,EAAa,iBAAiB,QAAS,IAAM,CAC3CL,EAA0B,CAC5B,CAAC,EACDG,EAAY,YAAYE,CAAY,EAEpC,MAAMC,EAAe,SAAS,cAAc,QAAQ,EACpDA,EAAa,KAAO,SACpBA,EAAa,UAAY,mBACzBA,EAAa,YAAc,SAC3BA,EAAa,aAAa,aAAc,qBAAqB,EAC7DA,EAAa,iBAAiB,QAAS,IAAM,CAC3CL,EAA4B,EAC5BL,EAAoB,EAAE,CACxB,CAAC,EACDO,EAAY,YAAYG,CAAY,EAEpC,IAAIC,EAAoB,KACpBC,EAAyB,EACzBC,EAAqB,KAEzB,MAAMC,EAA4B,IAAM,CACtC,MAAMnG,EAAYuF,EAAmB,QAAQ,kBAC7C,OAAOvF,aAAqB,YAAcA,EAAU,kBAAoB,CAC1E,EAEMoG,EAAwB9vC,GAAc,CAC1C,GAAI,CAAC4vC,EAAoB,OACzBA,EAAmB,KAAK,QAAQ,UAAY5vC,EAAY,OAAS,QACjE4vC,EAAmB,OAAO,aAAa,gBAAiB5vC,EAAY,QAAU,MAAM,EACpF,MAAM4Q,GAASg/B,EAAmB,OAAO,cAAc,6BAA6B,EAChFh/B,KAAQA,GAAO,YAAc5Q,EAAY,IAAM,IACrD,EAEM+vC,EAAoC,CAACC,EAAiB,IAAM,CAChE,MAAMC,GAAe,OAAOD,CAAc,EAAI,EAC9CE,EAAkB,OAAS,CAACD,GACvBL,IACLA,EAAmB,OAAO,SAAW,CAACK,GACtCL,EAAmB,OAAO,aAAa,gBAAiBK,GAAe,QAAU,MAAM,EAClFA,IACHH,EAAqB,EAAI,EAE7B,EAEMb,EAAqB3F,GAA0B,CACnD,OAAA/mI,EACA,MAAO,OACP,eAAgB,kBAChB,QAAS,IAAM,CACb,MAAM4tI,EAAqBN,EAAyB,EACpD7B,EAAkB,mBAAmBiB,EAAmB,cAAc,EACtEc,EAAkCI,CAAkB,EAChDA,EAAqBR,GAA0BC,GAAoB,MAAM,SAAS,YAAc,QAClGE,EAAqB,EAAK,EAE5BH,EAAyBQ,EACrBT,GAAmB,SAAWS,EAAqB,GACrDnB,EAAgB,SAAS,CAE7B,CACN,CAAK,EAEKoB,EAAqB,SAAS,cAAc,KAAK,EACvDA,EAAmB,UAAY,6BAC/BA,EAAmB,MAAM,QAAU,OACnCA,EAAmB,MAAM,WAAa,SACtCA,EAAmB,MAAM,IAAM,MAC/BA,EAAmB,MAAM,OAAS,UAElC,MAAMC,EAAuB1iC,GAAoB,CAC/C,UAAW,2BACjB,CAAK,EACD0iC,EAAqB,MAAM,KAAO,QAClCD,EAAmB,YAAYC,CAAoB,EAEnD,MAAMC,EAAsB,SAAS,cAAc,QAAQ,EAC3DA,EAAoB,KAAO,SAC3BA,EAAoB,UAAY,mBAChCA,EAAoB,YAAc,OAClCA,EAAoB,aAAa,aAAc,gBAAgB,EAC/DF,EAAmB,YAAYE,CAAmB,EAElD,MAAMC,EAAa,SAAS,cAAc,QAAQ,EAClDA,EAAW,UAAY,mBACvBA,EAAW,aAAa,aAAc,0BAA0B,EAEhE,MAAMC,GAAkB,SAAS,cAAc,KAAK,EACpDA,GAAgB,UAAY,0BAC5BA,GAAgB,YAAc,iBAE9B,MAAMC,GAAiB,SAAS,cAAc,KAAK,EACnDA,GAAe,UAAY,wBAC3BA,GAAe,YAAc,yDAE7B,MAAMC,GAAkB,SAAS,cAAc,OAAO,EACtDA,GAAgB,KAAO,OACvBA,GAAgB,UAAY,iBAC5BA,GAAgB,YAAc,iBAC9BA,GAAgB,aAAe,MAC/BA,GAAgB,WAAa,GAC7BA,GAAgB,aAAa,aAAc,0BAA0B,EAErE,MAAMC,GAAkB,SAAS,cAAc,KAAK,EACpDA,GAAgB,UAAY,wBAC5BA,GAAgB,MAAM,MAAQ,0BAC9BA,GAAgB,OAAS,GAEzB,MAAMC,GAAoB,SAAS,cAAc,KAAK,EACtDA,GAAkB,UAAY,4BAE9B,MAAMC,GAAmB,SAAS,cAAc,QAAQ,EACxDA,GAAiB,KAAO,SACxBA,GAAiB,UAAY,mBAC7BA,GAAiB,YAAc,SAC/BA,GAAiB,aAAa,aAAc,uBAAuB,EAEnE,MAAMC,EAAoB,SAAS,cAAc,QAAQ,EACzDA,EAAkB,KAAO,SACzBA,EAAkB,UAAY,mBAC9BA,EAAkB,YAAc,OAChCA,EAAkB,aAAa,aAAc,wBAAwB,EAErEF,GAAkB,YAAYC,EAAgB,EAC9CD,GAAkB,YAAYE,CAAiB,EAC/CP,EAAW,YAAYC,EAAe,EACtCD,EAAW,YAAYE,EAAc,EACrCF,EAAW,YAAYG,EAAe,EACtCH,EAAW,YAAYI,EAAe,EACtCJ,EAAW,YAAYK,EAAiB,EACxC3wC,EAAQ,YAAYswC,CAAU,EAE9B,MAAMQ,GAAkB,IAAM,CAC5BJ,GAAgB,OAAS,GACzBA,GAAgB,YAAc,GAC1B,OAAOJ,EAAW,OAAU,YAAcA,EAAW,KAAMA,EAAW,MAAK,EAC1EA,EAAW,gBAAgB,MAAM,CACxC,EAEMS,EAAiB,CAACh6I,EAAQ,KAAO,CACrC25I,GAAgB,OAAS,GACzBA,GAAgB,YAAc,GAC9BD,GAAgB,MAAQ15I,EACpB,OAAOu5I,EAAW,WAAc,YAAc,CAACA,EAAW,KAAMA,EAAW,UAAS,EACnFA,EAAW,aAAa,OAAQ,EAAE,EACvC,WAAW,WAAW,IAAM,CAC1BG,GAAgB,MAAK,EACrBA,GAAgB,OAAM,CACxB,EAAG,CAAC,CACN,EAEMO,EAAkC,IAAMjD,EAAkB,gCAA+B,EAEzFkD,GAAgC,IAAM,CAC1C,MAAM50H,EAAU20H,EAA+B,EACzCr5H,GAAQ,IAAI,IAAI0E,EAAQ,IAAK0I,IAAUA,GAAM,IAAI,CAAC,EAClD3jB,GAAU8sI,EAAe,0BAA4BjB,GACvDiB,EAAe,wBACfA,EAAe,4BACb1tI,GAAQ,OAAOY,IAAY,UAAYA,GAAQ,OAAUA,GAAQ,KAAI,EAAK,YAChF,GAAI,CAACuW,GAAM,IAAInX,EAAI,EAAG,OAAOA,GAC7B,IAAIk7B,GAAS,EACb,KAAO/jB,GAAM,IAAI,GAAGnX,EAAI,IAAIk7B,EAAM,EAAE,GAAGA,IAAU,EACjD,MAAO,GAAGl7B,EAAI,IAAIk7B,EAAM,EAC1B,EAEMizG,GAA+B,IAAM,CACzC,MAAMtyH,EAAU20H,EAA+B,EACzC5vI,GAAU,OAAO8sI,EAAe,yBAA4B,SAC9DA,EAAe,wBACfjB,GACEzjC,GAAYpoG,KAAY6rI,IAA2B5wH,EAAQ,KAAM0I,IAAUA,GAAM,OAAS3jB,EAAO,EACnGA,GACA6rI,GACEt1I,GAAU,CACd,CACE,MAAOs1I,GACP,MAAO,mBACjB,EACQ,GAAG5wH,EAAQ,IAAK0I,KAAW,CACzB,MAAOA,GAAM,KACb,MAAOA,GAAM,MAAQA,GAAM,KACvBA,GAAM,KACNA,GAAM,KACJ,GAAGA,GAAM,IAAI,WACb,GAAGA,GAAM,IAAI,UAC7B,EAAU,CACV,EACMmpH,EAAe,wBAA0B1kC,GACzC4mC,EAAqB,WAAWz4I,GAAS6xG,EAAS,CACpD,EAEM0nC,GAA4B53I,GAAS,CACzC,MAAMi0E,GAAUwgE,EAAkB,yBAAyBz0I,CAAI,EAC/D,OAAAq1I,GAA4B,EAC5ByB,EAAqB,MAAQ7iE,GAC7BuhE,EAAoB,EAAE,EACfvhE,EACT,EAEM4jE,GAAiC73I,GAAS,CAC9Cy0I,EAAkB,8BAA8Bz0I,CAAI,EACpD21I,EAAa,EACbH,EAAoB,EAAE,CACxB,EAEAsB,EAAqB,iBAAiB,SAAU,IAAM,CACpD1B,EAAoB0B,EAAqB,OAASnD,EAAuB,EACzE0B,GAA4B,EACxBT,EAAe,0BAA4BjB,GAC7CkE,GAA8BjD,EAAe,uBAAuB,EAEpEY,EAAoB,EAAE,CAE1B,CAAC,EAEDuB,EAAoB,iBAAiB,QAAUj3I,GAAU,CACvD,GAAIA,EAAM,WAAa,IAAQ80I,EAAe,0BAA4BjB,GAAyB,CACjG8D,EAAeE,GAA6B,CAAE,EAC9C,MACF,CACA,GAAI/C,EAAe,yBAA2BA,EAAe,0BAA4BjB,GACvF,GAAI,CACFiE,GAAyBhD,EAAe,uBAAuB,CACjE,OAAStyI,GAAO,CACdkzI,EAAoBlzI,cAAiB,MAAQA,GAAM,QAAU,OAAOA,EAAK,CAAC,CAC5E,CAEJ,CAAC,EAEDg1I,GAAiB,iBAAiB,QAAS,IAAM,CAC/CE,GAAe,CACjB,CAAC,EAEDR,EAAW,iBAAiB,SAAWl3I,GAAU,CAC/CA,EAAM,eAAc,EACpB03I,GAAe,CACjB,CAAC,EAEDL,GAAgB,iBAAiB,UAAYr3I,GAAU,CACjDA,EAAM,MAAQ,UAClBA,EAAM,eAAc,EACpBy3I,EAAkB,MAAK,EACzB,CAAC,EAEDA,EAAkB,iBAAiB,QAAS,IAAM,CAChD,GAAI,CACFK,GAAyBT,GAAgB,KAAK,EAC9CK,GAAe,CACjB,OAASl1I,EAAO,CACd80I,GAAgB,YAAc90I,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACnF80I,GAAgB,OAAS,EAC3B,CACF,CAAC,EAED,MAAMU,GAAe,SAAS,cAAc,KAAK,EACjDA,GAAa,YAAYpC,EAAmB,OAAO,EAEnD,MAAMiB,EAAoB,SAAS,cAAc,KAAK,EACtDA,EAAkB,MAAM,QAAU,OAClCA,EAAkB,MAAM,WAAa,SACrCA,EAAkB,MAAM,eAAiB,gBACzCA,EAAkB,MAAM,IAAM,OAC9BA,EAAkB,MAAM,UAAY,MAEpCR,EAAoBviC,GAA6B,CAC/C,QAAS,GACT,QAAS,eACT,SAAU,SACV,UAAW,uDACjB,CAAK,EACDuiC,EAAkB,MAAM,UAAY,cACpCA,EAAkB,MAAM,gBAAkB,cAC1CQ,EAAkB,YAAYR,CAAiB,EAE/C,MAAM4B,GAAsB,SAAS,cAAc,KAAK,EACxDA,GAAoB,MAAM,QAAU,OACpCA,GAAoB,MAAM,WAAa,SACvCA,GAAoB,MAAM,eAAiB,WAC3CA,GAAoB,MAAM,IAAM,MAEhC,MAAMC,GAAmB,SAAS,cAAc,QAAQ,EACxDA,GAAiB,KAAO,SACxBA,GAAiB,UAAY,mBAC7BA,GAAiB,YAAc,MAC/BA,GAAiB,aAAa,aAAc,sBAAsB,EAClEA,GAAiB,iBAAiB,QAAS,IAAM,CAC/CvC,EAAgB,KAAK,CACvB,CAAC,EACDsC,GAAoB,YAAYC,EAAgB,EAEhD,MAAMC,GAAuB,SAAS,cAAc,QAAQ,EAC5DA,GAAqB,KAAO,SAC5BA,GAAqB,UAAY,mBACjCA,GAAqB,YAAc,UACnCA,GAAqB,aAAa,aAAc,8CAA8C,EAC9FA,GAAqB,iBAAiB,QAAS,IAAM,CACnDxC,EAAgB,SAAS,CAC3B,CAAC,EACDsC,GAAoB,YAAYE,EAAoB,EACpDtB,EAAkB,YAAYoB,EAAmB,EACjDrC,EAAmB,QAAQ,YAAYiB,CAAiB,EAExDA,EAAkB,OAAS,GAE3B,MAAMuB,GAAkB,SAAS,cAAc,KAAK,EAC9C/4B,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,UAAY,wBACjBA,GAAK,MAAM,OAAS,WACpBA,GAAK,YAAc,8GACnB+4B,GAAgB,YAAY/4B,EAAI,EAEhC,MAAMg5B,GAAkBxlC,GAAoB,CAC1C,QAASiiC,EAAe,UACxB,UAAW,sBACjB,CAAK,EACDuD,GAAgB,iBAAiB,SAAU,IAAM,CAC/C1D,EAAkB,OAAO,CAAE,UAAW0D,GAAgB,OAAO,CAAE,CACjE,CAAC,EACDrN,EAAUoN,GAAiB,CACzB,MAAO,aACP,KAAM,+EACN,SAAUC,EAChB,CAAK,EAED,MAAMC,GAAkBzlC,GAAoB,CAC1C,QAASkiC,EAAW,UACpB,UAAW,sBACjB,CAAK,EACDuD,GAAgB,iBAAiB,SAAU,IAAM,CAC/C1D,EAAc,OAAO,CAAE,UAAW0D,GAAgB,OAAO,CAAE,EACtDA,GAAgB,SAASlD,EAAc,CAC9C,CAAC,EACDpK,EAAUoN,GAAiB,CACzB,MAAO,aACP,KAAM,sEACN,SAAUE,EAChB,CAAK,EAED,MAAMC,GAAkC1lC,GAAoB,CAC1D,QAASkiC,EAAW,4BAA8B,GAClD,UAAW,6BACjB,CAAK,EACDwD,GAAgC,iBAAiB,SAAU,IAAM,CAC/D3D,EAAc,OAAO,CAAE,0BAA2B2D,GAAgC,OAAO,CAAE,CAC7F,CAAC,EACDvN,EAAUoN,GAAiB,CACzB,MAAO,sBACP,KAAM,uIACN,SAAUG,EAChB,CAAK,EAED,MAAMC,GAAoB3lC,GAAoB,CAC5C,QAAS3pG,EAAO,yBAAsB,IAAS,GAC/C,UAAW,0BACjB,CAAK,EACDsvI,GAAkB,iBAAiB,SAAU,IAAM,CACjDtvI,EAAO,yBAAyBsvI,GAAkB,OAAO,CAC3D,CAAC,EACDxN,EAAUoN,GAAiB,CACzB,MAAO,gBACP,KAAM,kHACN,SAAUI,EAChB,CAAK,EAED1E,GAAqBsE,GAAiB,iBAAiB,EAEvD,MAAMK,GAA4B5lC,GAAoB,CACpD,QAASkiC,EAAW,oBACpB,UAAW,0BACjB,CAAK,EACD0D,GAA0B,iBAAiB,SAAU,IAAM,CACzD7D,EAAc,OAAO,CAAE,oBAAqB6D,GAA0B,OAAO,CAAE,CACjF,CAAC,EACDzN,EAAUoN,GAAiB,CACzB,MAAO,QACP,KAAM,+HACN,SAAUK,EAChB,CAAK,EAED,MAAMC,GAAgC7lC,GAAoB,CACxD,QAASkiC,EAAW,0BAA4B,GAChD,UAAW,8BACjB,CAAK,EACD2D,GAA8B,iBAAiB,SAAU,IAAM,CAC7D9D,EAAc,OAAO,CAAE,wBAAyB8D,GAA8B,OAAO,CAAE,CACzF,CAAC,EACD1N,EAAUoN,GAAiB,CACzB,MAAO,YACP,KAAM,qHACN,SAAUM,EAChB,CAAK,EAED,MAAMC,GAA+B9lC,GAAoB,CACvD,QAASiiC,EAAe,uBACxB,UAAW,8BACjB,CAAK,EACD6D,GAA6B,iBAAiB,SAAU,IAAM,CAC5DhE,EAAkB,OAAO,CAAE,uBAAwBgE,GAA6B,OAAO,CAAE,CAC3F,CAAC,EACD3N,EAAUoN,GAAiB,CACzB,MAAO,WACP,KAAM,uGACN,SAAUO,EAChB,CAAK,EAED,MAAMC,GAAkB/lC,GAAoB,CAC1C,QAASiiC,EAAe,UACxB,UAAW,sBACjB,CAAK,EACD8D,GAAgB,iBAAiB,SAAU,IAAM,CAC/CjE,EAAkB,OAAO,CAAE,UAAWiE,GAAgB,OAAO,CAAE,CACjE,CAAC,EACD5N,EAAUoN,GAAiB,CACzB,MAAO,aACP,KAAM,2FACN,SAAUQ,EAChB,CAAK,EAED,MAAMC,GAAkBhmC,GAAoB,CAC1C,QAASkiC,EAAW,UACpB,UAAW,sBACjB,CAAK,EACD8D,GAAgB,iBAAiB,SAAU,IAAM,CAC/CjE,EAAc,OAAO,CAAE,UAAWiE,GAAgB,OAAO,CAAE,EACtDA,GAAgB,SAASxD,EAAc,CAC9C,CAAC,EACDrK,EAAUoN,GAAiB,CACzB,MAAO,aACP,KAAM,sEACN,SAAUS,EAChB,CAAK,EAED,MAAMC,EAAmBjmC,GAAoB,CAC3C,QAASkiC,EAAW,WACpB,UAAW,aACjB,CAAK,EACD+D,EAAiB,iBAAiB,SAAU,IAAM,CAChDlE,EAAc,OAAO,CAAE,WAAYkE,EAAiB,OAAO,CAAE,CAC/D,CAAC,EACD9N,EAAUoN,GAAiB,CACzB,MAAO,cACP,KAAM,kEACN,SAAUU,CAChB,CAAK,EAED,MAAMC,GAAyBzkC,GAAoB,CACjD,UAAW,qBACX,QAAS,EACf,CAAK,EACDykC,GAAuB,iBAAiB,SAAU,IAAM,CACtDnE,EAAc,OAAO,CAAE,iBAAkBmE,GAAuB,OAAS,OAAQ,CACnF,CAAC,EACD/N,EAAUoN,GAAiB,CACzB,MAAO,eACP,KAAM,4GACN,SAAUW,EAChB,CAAK,EAED,MAAMC,EAAqB,CAAC,CAAE,UAAA9lC,EAAW,SAAAye,GAAU,SAAAC,GAAU,SAAAh0H,MAAe,CAC1E,MAAMijD,GAAM,SAAS,cAAc,KAAK,EACxCA,GAAI,MAAM,QAAU,OACpBA,GAAI,MAAM,WAAa,SACvBA,GAAI,MAAM,IAAM,MAChBA,GAAI,MAAM,MAAQ,OAElB,MAAM0sE,GAAa,SAAS,cAAc,KAAK,EAC/CA,GAAW,UAAY,yBAEvB,MAAMp3B,GAAS,SAAS,cAAc,KAAK,EAC3CA,GAAO,UAAY,iCAEnB,MAAMq3B,GAAa,SAAS,cAAc,OAAO,EACjDA,GAAW,KAAO,QAClBA,GAAW,UAAY,gCACvBA,GAAW,aAAa,aAAc,GAAGta,CAAS,QAAQ,EAE1D,MAAMwa,GAAa,SAAS,cAAc,MAAM,EAChDA,GAAW,YAAc,QACzBA,GAAW,MAAM,MAAQ,yBAEzB,MAAMD,GAAa,SAAS,cAAc,OAAO,EACjDA,GAAW,KAAO,SAClBA,GAAW,UAAY,mBACvBA,GAAW,IAAM,IACjBA,GAAW,IAAM,IACjBA,GAAW,KAAO,OAClBA,GAAW,MAAM,SAAW,OAC5BA,GAAW,aAAa,aAAc,GAAGva,CAAS,QAAQ,EAE1D,MAAMivB,GAAU,IAAM,CACpB,MAAM8W,GAAOjF,GAAmBriB,GAAQ,EAAIqiB,GAAmBp2I,EAAQ,CAAC,EACxE4vH,GAAW,MAAQ,IAAIyrB,GAAK,MAAM,EAAG,CAAC,CAAC,GACvCxrB,GAAW,MAAQ,OAAO,KAAK,MAAO,OAAO,SAASwrB,GAAK,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IAAO,GAAG,EAAI,GAAG,EAC/F9iD,GAAO,MAAM,WAAaq3B,GAAW,KACvC,EAEMtS,GAAS,IAAM,CACnB,MAAMpzG,GAAQm5G,GAAYwM,GAAW,MAAO,CAAE,IAAK,EAAG,IAAK,EAAG,EAC1D3lH,IAAS,OACb8pH,GAASqiB,GAAmB5yB,GAAOmM,GAAW,MAAO1lH,EAAK,EAAGlK,EAAQ,CAAC,EACtEukI,GAAO,EACT,EAEA,OAAA3U,GAAW,iBAAiB,QAAStS,EAAM,EAC3CuS,GAAW,iBAAiB,SAAUvS,EAAM,EAE5CqS,GAAW,YAAYp3B,EAAM,EAC7Bo3B,GAAW,YAAYC,EAAU,EACjC3sE,GAAI,YAAY0sE,EAAU,EAC1B1sE,GAAI,YAAY6sE,EAAU,EAC1B7sE,GAAI,YAAY4sE,EAAU,EAEnB,CACL,QAAS5sE,GACT,QAAAshF,GACA,QAAS,IAAM,CACb3U,GAAW,oBAAoB,QAAStS,EAAM,EAC9CuS,GAAW,oBAAoB,SAAUvS,EAAM,CACjD,CACR,CACI,EAEMg+B,EAAiB,CAAA,EACjBC,EAAgB,CAAA,EAEhBC,EAAyB,CAACvM,EAAWwM,GAAUz7I,GAAUW,GAAU,KAAO,CAC9Eu1I,GAAqBjH,EAAW,OAAO,EACvC,MAAMzjH,GAAS7qB,GAAQ,WAAa,IAAM61I,GAAmBlrI,EAAO,iBAAiBmwI,EAAQ,EAAGz7I,EAAQ,GAClG+tD,GAAQptD,GAAQ,aAAgB+6I,IAAY,CAChDpwI,EAAO,iBAAiBmwI,GAAUjF,GAAmB,CAAE,GAAGhrH,GAAM,EAAI,GAAGkwH,IAAW17I,EAAQ,CAAC,CAC7F,GACM27I,GAAah7I,GAAQ,SAAW,KAChCi7I,GAAYj7I,GAAQ,WAAa,KAEjCk7I,GAAe,IAAI5oC,GAAwB,CAC/C,MAAOznF,GAAM,EAAG,QAChB,UAAW,CAAC,EAAG,CAAC,EAChB,KAAM,IACN,SAAU,EACV,SAAWzrB,IAAUguD,GAAM,CAAE,QAASwoF,GAA2Bx2I,GAAOyrB,GAAM,EAAG,OAAO,EAAG,CACnG,CAAO,EACD8vH,EAAe,KAAKO,EAAY,EAChCzO,EAAU6B,EAAW,CACnB,MAAO,OACP,KAAM,8DACN,SAAU4M,GAAa,OAC/B,CAAO,EAED,MAAMC,GAAkB,IAAI7oC,GAAwB,CAClD,MAAOznF,GAAM,EAAG,WAChB,UAAW,CAAC,EAAG,CAAC,EAChB,KAAM,IACN,SAAU,EACV,SAAWzrB,IAAUguD,GAAM,CAAE,WAAYwoF,GAA2Bx2I,GAAOyrB,GAAM,EAAG,UAAU,EAAG,CACzG,CAAO,EACD8vH,EAAe,KAAKQ,EAAe,EACnC,MAAMC,GAAa3O,EAAU6B,EAAW,CACtC,MAAO,eACP,KAAM,qIACN,SAAU6M,GAAgB,OAClC,CAAO,EACDC,GAAW,IAAI,QAAQ,2BAA6B,OACpDA,GAAW,IAAI,QAAQ,6BAA+B,aAEtD,MAAMC,GAAkB,IAAI/oC,GAAwB,CAClD,MAAOznF,GAAM,EAAG,WAChB,UAAW,CAAC,EAAG,CAAC,EAChB,KAAM,IACN,SAAU,EACV,SAAWzrB,IAAUguD,GAAM,CAAE,WAAYwoF,GAA2Bx2I,GAAOyrB,GAAM,EAAG,UAAU,EAAG,CACzG,CAAO,EACD8vH,EAAe,KAAKU,EAAe,EACnC5O,EAAU6B,EAAW,CACnB,MAAO,UACP,KAAM,2DACN,SAAU+M,GAAgB,OAClC,CAAO,EAED,MAAMC,GAAgBhnC,GAAoB,CACxC,QAASzpF,GAAM,EAAG,QAClB,UAAW,GAAGiwH,GAAS,YAAW,CAAE,eAC5C,CAAO,EACDQ,GAAc,iBAAiB,SAAU,IAAMluF,GAAM,CAAE,QAASkuF,GAAc,OAAO,CAAE,CAAC,EACxF7O,EAAU6B,EAAW,CACnB,MAAO,UACP,KAAM,yDACN,SAAUgN,EAClB,CAAO,EAED,IAAIC,GAAsB,KACtBv7I,GAAQ,qBAAuB,KACjCu7I,GAAsBjnC,GAAoB,CACxC,QAASzpF,KAAS,gBAAkB,GACpC,UAAW,GAAGiwH,GAAS,YAAW,CAAE,uBAC9C,CAAS,EACDS,GAAoB,iBAAiB,SAAU,IAAMnuF,GAAM,CAAE,cAAemuF,GAAoB,OAAO,CAAE,CAAC,EAC1G9O,EAAU6B,EAAW,CACnB,MAAO,mBACP,KAAM,2IACN,SAAUiN,EACpB,CAAS,GAGH,MAAMC,GAAef,EAAmB,CACtC,UAAW,GAAGK,GAAS,YAAW,CAAE,aACpC,SAAU,IAAMjwH,GAAM,EAAG,SACzB,SAAWzrB,IAAUguD,GAAM,CAAE,SAAUhuD,EAAK,CAAE,EAC9C,SAAUC,GAAS,QAC3B,CAAO,EACDu7I,EAAc,KAAKY,EAAY,EAC/B/O,EAAU6B,EAAW,CACnB,MAAO,OACP,KAAM,wDACN,SAAUkN,GAAa,OAC/B,CAAO,EAED,MAAMC,GAAgBhB,EAAmB,CACvC,UAAW,GAAGK,GAAS,YAAW,CAAE,cACpC,SAAU,IAAMjwH,GAAM,EAAG,SACzB,SAAWzrB,IAAUguD,GAAM,CAAE,SAAUhuD,EAAK,CAAE,EAC9C,SAAUC,GAAS,QAC3B,CAAO,EACDu7I,EAAc,KAAKa,EAAa,EAChChP,EAAU6B,EAAW,CACnB,MAAO,QACP,KAAM,4DACN,SAAUmN,GAAc,OAChC,CAAO,EAED,IAAIC,GAAkB,KAClBC,GAAkB,KACtB,OAAIX,IAAcC,KAChBS,GAAkBpnC,GAAoB,CACpC,QAAS0mC,KAAa,UAAY,GAClC,UAAW,GAAGF,GAAS,YAAW,CAAE,kBAC9C,CAAS,EACDY,GAAgB,iBAAiB,SAAU,IAAMT,GAAU,CAAE,QAASS,GAAgB,OAAO,CAAE,CAAC,EAChGjP,EAAU6B,EAAW,CACnB,MAAO,aACP,KAAM,yHACN,SAAUoN,EACpB,CAAS,EAEDC,GAAkB,IAAIrpC,GAAwB,CAC5C,MAAO0oC,GAAU,EAAG,OACpB,UAAW,CAAC,EAAG,CAAC,EAChB,KAAM,IACN,SAAU,EACV,SAAU,EACV,SAAW57I,IAAU67I,GAAU,CAAE,OAAQv4B,GAAYtjH,GAAO,CAAE,IAAK,EAAG,IAAK,CAAC,CAAE,GAAK47I,GAAU,EAAG,OAAQ,CAClH,CAAS,EACDL,EAAe,KAAKgB,EAAe,EACnClP,EAAU6B,EAAW,CACnB,MAAO,WACP,KAAM,wHACN,SAAUqN,GAAgB,OACpC,CAAS,GAGI,IAAM,CACX,MAAMlyI,GAAUohB,GAAM,EACtBqwH,GAAa,IAAIzxI,GAAQ,OAAO,EAChC0xI,GAAgB,IAAI1xI,GAAQ,UAAU,EACtC4xI,GAAgB,IAAI5xI,GAAQ,UAAU,EACtC6xI,GAAc,QAAU7xI,GAAQ,QAC5B8xI,KAAqBA,GAAoB,QAAU9xI,GAAQ,gBAAkB,IACjF+xI,GAAa,QAAO,EACpBC,GAAc,QAAO,EACjBC,KAAiBA,GAAgB,QAAUV,GAAU,EAAG,UAAY,IACpEW,IAAiBA,GAAgB,IAAIX,GAAU,EAAG,MAAM,CAC9D,CACF,EAEMY,GAAyB,CAACtN,EAAWwM,GAAUz7I,GAAUW,GAAU,KAAO,CAC9Eu1I,GAAqBjH,EAAW,OAAO,EACvC,MAAMzjH,GAAS7qB,GAAQ,WAAa,IAAM81I,GAAmBnrI,EAAO,iBAAiBmwI,EAAQ,EAAGz7I,EAAQ,GAClG+tD,GAAQptD,GAAQ,aAAgB+6I,IAAY,CAChDpwI,EAAO,iBAAiBmwI,GAAUhF,GAAmB,CAAE,GAAGjrH,GAAM,EAAI,GAAGkwH,IAAW17I,EAAQ,CAAC,CAC7F,GACM27I,GAAah7I,GAAQ,SAAW,KAChCi7I,GAAYj7I,GAAQ,WAAa,KAEjC67I,GAAgB,IAAIvpC,GAAwB,CAChD,MAAOznF,GAAM,EAAG,SAChB,UAAW,CAAC,EAAG,CAAC,EAChB,KAAM,IACN,SAAU,EACV,SAAWzrB,IAAUguD,GAAM,CAAE,SAAUwoF,GAA2Bx2I,GAAOyrB,GAAM,EAAG,QAAQ,EAAG,CACrG,CAAO,EACD8vH,EAAe,KAAKkB,EAAa,EACjCpP,EAAU6B,EAAW,CACnB,MAAO,QACP,KAAM,+DACN,SAAUuN,GAAc,OAChC,CAAO,EAED,MAAMV,GAAkB,IAAI7oC,GAAwB,CAClD,MAAOznF,GAAM,EAAG,WAChB,UAAW,CAAC,EAAG,CAAC,EAChB,KAAM,IACN,SAAU,EACV,SAAWzrB,IAAUguD,GAAM,CAAE,WAAYwoF,GAA2Bx2I,GAAOyrB,GAAM,EAAG,UAAU,EAAG,CACzG,CAAO,EACD8vH,EAAe,KAAKQ,EAAe,EACnC,MAAMC,GAAa3O,EAAU6B,EAAW,CACtC,MAAO,eACP,KAAM,qIACN,SAAU6M,GAAgB,OAClC,CAAO,EACDC,GAAW,IAAI,QAAQ,2BAA6B,OACpDA,GAAW,IAAI,QAAQ,6BAA+B,aAEtD,MAAME,GAAgBhnC,GAAoB,CACxC,QAASzpF,GAAM,EAAG,QAClB,UAAW,GAAGiwH,GAAS,YAAW,CAAE,eAC5C,CAAO,EACDQ,GAAc,iBAAiB,SAAU,IAAMluF,GAAM,CAAE,QAASkuF,GAAc,OAAO,CAAE,CAAC,EACxF7O,EAAU6B,EAAW,CACnB,MAAO,UACP,KAAM,yDACN,SAAUgN,EAClB,CAAO,EAED,IAAIC,GAAsB,KACtBv7I,GAAQ,qBAAuB,KACjCu7I,GAAsBjnC,GAAoB,CACxC,QAASzpF,KAAS,gBAAkB,GACpC,UAAW,GAAGiwH,GAAS,YAAW,CAAE,uBAC9C,CAAS,EACDS,GAAoB,iBAAiB,SAAU,IAAMnuF,GAAM,CAAE,cAAemuF,GAAoB,OAAO,CAAE,CAAC,EAC1G9O,EAAU6B,EAAW,CACnB,MAAO,mBACP,KAAM,2IACN,SAAUiN,EACpB,CAAS,GAGH,MAAMC,GAAef,EAAmB,CACtC,UAAW,GAAGK,GAAS,YAAW,CAAE,aACpC,SAAU,IAAMjwH,GAAM,EAAG,SACzB,SAAWzrB,IAAUguD,GAAM,CAAE,SAAUhuD,EAAK,CAAE,EAC9C,SAAUC,GAAS,QAC3B,CAAO,EACDu7I,EAAc,KAAKY,EAAY,EAC/B/O,EAAU6B,EAAW,CACnB,MAAO,OACP,KAAM,wDACN,SAAUkN,GAAa,OAC/B,CAAO,EAED,MAAMC,GAAgBhB,EAAmB,CACvC,UAAW,GAAGK,GAAS,YAAW,CAAE,cACpC,SAAU,IAAMjwH,GAAM,EAAG,SACzB,SAAWzrB,IAAUguD,GAAM,CAAE,SAAUhuD,EAAK,CAAE,EAC9C,SAAUC,GAAS,QAC3B,CAAO,EACDu7I,EAAc,KAAKa,EAAa,EAChChP,EAAU6B,EAAW,CACnB,MAAO,QACP,KAAM,4DACN,SAAUmN,GAAc,OAChC,CAAO,EAED,IAAIC,GAAkB,KAClBC,GAAkB,KACtB,OAAIX,IAAcC,KAChBS,GAAkBpnC,GAAoB,CACpC,QAAS0mC,KAAa,UAAY,GAClC,UAAW,GAAGF,GAAS,YAAW,CAAE,kBAC9C,CAAS,EACDY,GAAgB,iBAAiB,SAAU,IAAMT,GAAU,CAAE,QAASS,GAAgB,OAAO,CAAE,CAAC,EAChGjP,EAAU6B,EAAW,CACnB,MAAO,aACP,KAAM,yHACN,SAAUoN,EACpB,CAAS,EAEDC,GAAkB,IAAIrpC,GAAwB,CAC5C,MAAO0oC,GAAU,EAAG,OACpB,UAAW,CAAC,EAAG,CAAC,EAChB,KAAM,IACN,SAAU,EACV,SAAU,EACV,SAAW57I,IAAU67I,GAAU,CAAE,OAAQv4B,GAAYtjH,GAAO,CAAE,IAAK,EAAG,IAAK,CAAC,CAAE,GAAK47I,GAAU,EAAG,OAAQ,CAClH,CAAS,EACDL,EAAe,KAAKgB,EAAe,EACnClP,EAAU6B,EAAW,CACnB,MAAO,WACP,KAAM,wHACN,SAAUqN,GAAgB,OACpC,CAAS,GAGI,IAAM,CACX,MAAMlyI,GAAUohB,GAAM,EACtBgxH,GAAc,IAAIpyI,GAAQ,QAAQ,EAClC0xI,GAAgB,IAAI1xI,GAAQ,UAAU,EACtC6xI,GAAc,QAAU7xI,GAAQ,QAC5B8xI,KAAqBA,GAAoB,QAAU9xI,GAAQ,gBAAkB,IACjF+xI,GAAa,QAAO,EACpBC,GAAc,QAAO,EACjBC,KAAiBA,GAAgB,QAAUV,GAAU,EAAG,UAAY,IACpEW,IAAiBA,GAAgB,IAAIX,GAAU,EAAG,MAAM,CAC9D,CACF,EAEMc,GAAe,SAAS,cAAc,KAAK,EAC3CC,GAAsBlB,EAAuBiB,GAAc,WAAYpH,EAA2B,EAClGsH,GAAsBJ,GAAuBE,GAAc,WAAYjH,EAA2B,EAElGoH,GAAY,SAAS,cAAc,KAAK,EACxCC,GAAkB5nC,GAAoB,CAC1C,QAASkiC,EAAW,0BAA4B,GAChD,UAAW,mCACjB,CAAK,EACD0F,GAAgB,iBAAiB,SAAU,IAAM,CAC/C7F,EAAc,OAAO,CAAE,wBAAyB6F,GAAgB,OAAO,CAAE,CAC3E,CAAC,EACDzP,EAAUwP,GAAW,CACnB,MAAO,sBACP,KAAM,wJACN,SAAUC,EAChB,CAAK,EAED,MAAMC,GAAgB,SAAS,cAAc,KAAK,EAClDA,GAAc,UAAY,wBAC1BA,GAAc,MAAM,QAAU,OAC9BA,GAAc,MAAM,OAAS,aAC7BA,GAAc,MAAM,QAAU,WAC9BA,GAAc,MAAM,OAAS,sCAC7BA,GAAc,MAAM,aAAe,MACnCA,GAAc,MAAM,WAAa,4BACjCA,GAAc,YAAc,kHAC5BF,GAAU,YAAYE,EAAa,EAEnC,MAAMC,GAAqB,SAAS,cAAc,KAAK,EACvDH,GAAU,YAAYG,EAAkB,EACxC,MAAMC,GAAmBxB,EAAuBuB,GAAoB,QAASxH,GAA0B,CACrG,SAAU,IAAMiB,GAAmBlrI,EAAO,iBAAc,EAAMiqI,EAAwB,EACtF,WAAamG,GAAY,CACvBpwI,EAAO,iBAAiBkrI,GAAmB,CAAE,GAAGA,GAAmBlrI,EAAO,iBAAc,EAAMiqI,EAAwB,EAAG,GAAGmG,CAAO,EAAInG,EAAwB,CAAC,CAClK,CACN,CAAK,EACK0H,GAAmBV,GAAuBQ,GAAoB,QAASrH,GAA0B,CACrG,SAAU,IAAMe,GAAmBnrI,EAAO,iBAAc,EAAMoqI,EAAwB,EACtF,WAAagG,GAAY,CACvBpwI,EAAO,iBAAiBmrI,GAAmB,CAAE,GAAGA,GAAmBnrI,EAAO,iBAAc,EAAMoqI,EAAwB,EAAG,GAAGgG,CAAO,EAAIhG,EAAwB,CAAC,CAClK,CACN,CAAK,EAEKwH,GAAgB,SAAS,cAAc,KAAK,EAC5CC,GAAuB3B,EAAuB0B,GAAe,cAAe5H,EAA4B,EACxG8H,GAAuBb,GAAuBW,GAAe,cAAezH,EAA4B,EAExG4H,GAAa,SAAS,cAAc,KAAK,EACzCC,GAAa,SAAS,cAAc,KAAK,EAC/CA,GAAW,UAAY,wBACvBA,GAAW,MAAM,OAAS,WAC1BA,GAAW,YAAc,6IACzBD,GAAW,YAAYC,EAAU,EAEjCpH,GAAqBmH,GAAY,eAAe,EAChD,MAAME,GAA2B/B,EAAuB6B,GAAY,iBAAkBjG,EAA+B,CACnH,mBAAoB,GACpB,SAAU,IAAMZ,GAAmBU,EAAe,uBAAwBE,CAA6B,EACvG,WAAasE,GAAY,CACvB3E,EAAkB,OAAO,CACvB,uBAAwBP,GAAmB,CAAE,GAAGU,EAAe,uBAAwB,GAAGwE,CAAO,EAAItE,CAA6B,CAC5I,CAAS,CACH,EACA,QAAS,IAAMV,GAA4BQ,EAAe,sBAAuBlB,EAAqC,EACtH,UAAY0F,GAAY,CACtB3E,EAAkB,OAAO,CACvB,sBAAuBL,GACrB,CAAE,GAAGQ,EAAe,sBAAuB,GAAGwE,CAAO,EACrD1F,EACZ,CACA,CAAS,CACH,CACN,CAAK,EACKwH,GAA2BjB,GAAuBc,GAAY,iBAAkBhG,EAA+B,CACnH,mBAAoB,GACpB,SAAU,IAAMZ,GAAmBS,EAAe,uBAAwBG,CAA6B,EACvG,WAAaqE,GAAY,CACvB3E,EAAkB,OAAO,CACvB,uBAAwBN,GAAmB,CAAE,GAAGS,EAAe,uBAAwB,GAAGwE,CAAO,EAAIrE,CAA6B,CAC5I,CAAS,CACH,EACA,QAAS,IAAMX,GAA4BQ,EAAe,sBAAuBlB,EAAqC,EACtH,UAAY0F,GAAY,CACtB3E,EAAkB,OAAO,CACvB,sBAAuBL,GACrB,CAAE,GAAGQ,EAAe,sBAAuB,GAAGwE,CAAO,EACrD1F,EACZ,CACA,CAAS,CACH,CACN,CAAK,EAEDE,GAAqBmH,GAAY,kBAAkB,EACnD,MAAMI,GAA4BjC,EAAuB6B,GAAY,oBAAqB/F,EAAgC,CACxH,mBAAoB,GACpB,SAAU,IAAMd,GAAmBW,EAAW,wBAAyBG,CAA8B,EACrG,WAAaoE,GAAY,CACvB1E,EAAc,OAAO,CACnB,wBAAyBR,GAAmB,CAAE,GAAGW,EAAW,wBAAyB,GAAGuE,CAAO,EAAIpE,CAA8B,CAC3I,CAAS,CACH,EACA,QAAS,IAAMZ,GAA4BS,EAAW,uBAAwBpB,EAAqC,EACnH,UAAY2F,GAAY,CACtB1E,EAAc,OAAO,CACnB,uBAAwBN,GACtB,CAAE,GAAGS,EAAW,uBAAwB,GAAGuE,CAAO,EAClD3F,EACZ,CACA,CAAS,CACH,CACN,CAAK,EACK2H,GAA4BnB,GAAuBc,GAAY,oBAAqB9F,EAAgC,CACxH,mBAAoB,GACpB,SAAU,IAAMd,GAAmBU,EAAW,wBAAyBI,CAA8B,EACrG,WAAamE,GAAY,CACvB1E,EAAc,OAAO,CACnB,wBAAyBP,GAAmB,CAAE,GAAGU,EAAW,wBAAyB,GAAGuE,CAAO,EAAInE,CAA8B,CAC3I,CAAS,CACH,EACA,QAAS,IAAMb,GAA4BS,EAAW,uBAAwBpB,EAAqC,EACnH,UAAY2F,GAAY,CACtB1E,EAAc,OAAO,CACnB,uBAAwBN,GACtB,CAAE,GAAGS,EAAW,uBAAwB,GAAGuE,CAAO,EAClD3F,EACZ,CACA,CAAS,CACH,CACN,CAAK,EAEK4H,GAAuB,IAAM,CACjCjB,GAAmB,EACnBC,GAAmB,EACnBK,GAAgB,EAChBC,GAAgB,EAChBE,GAAoB,EACpBC,GAAoB,EACpBG,GAAwB,EACxBC,GAAwB,EACxBC,GAAyB,EACzBC,GAAyB,EACzB,MAAME,EAAYzG,EAAW,0BAA4B,IAAQ7rI,EAAO,0BAAuB,IAAS,GACxGuxI,GAAgB,QAAUe,EAC1Bd,GAAc,MAAM,QAAUc,EAAY,QAAU,OACpDb,GAAmB,MAAM,QAAUa,EAAY,OAAS,GACxDb,GAAmB,MAAM,cAAgBa,EAAY,OAAS,GAC9DhD,GAAkB,QAAUtvI,EAAO,yBAAsB,IAAS,GAClEuvI,GAA0B,QAAU1D,EAAW,sBAAwB,GACvEwD,GAAgC,QAAUxD,EAAW,4BAA8B,GACnF2D,GAA8B,QAAU3D,EAAW,0BAA4B,IAAQ7rI,EAAO,0BAAuB,IAAS,EAChI,EAEMuyI,GAAY,SAAS,cAAc,KAAK,EACxCC,GAAa,IAAIrkC,GACvBqkC,GAAW,IAAI,CACb,GAAI,8BACJ,MAAO,cACP,UAAW,GACX,UAAW,GACX,QAAStD,EACf,CAAK,EACDsD,GAAW,IAAI,CACb,GAAI,2BACJ,MAAO,WACP,UAAW,GACX,UAAW,GACX,QAASrB,EACf,CAAK,EACDqB,GAAW,IAAI,CACb,GAAI,wBACJ,MAAO,QACP,UAAW,GACX,UAAW,GACX,QAASlB,EACf,CAAK,EACDkB,GAAW,IAAI,CACb,GAAI,4BACJ,MAAO,YACP,UAAW,GACX,UAAW,GACX,QAASZ,EACf,CAAK,EACDY,GAAW,IAAI,CACb,GAAI,yBACJ,MAAO,iBACP,UAAW,GACX,UAAW,GACX,QAAST,EACf,CAAK,EACDQ,GAAU,YAAYC,GAAW,OAAO,EAExC90C,EAAQ,YAAYovC,CAAQ,EAC5BpvC,EAAQ,YAAYqvC,CAAW,EAC/BrvC,EAAQ,YAAYmwC,CAAkB,EACtCnwC,EAAQ,YAAY6uC,CAAkB,EAEtC,MAAMkG,GAAQ,IAAItkC,GAClBskC,GAAM,IAAI,CACR,GAAI,sBACJ,MAAO,YACP,UAAW,GACX,UAAW,GACX,eAAgB,CACdriC,GAA2B,CACzB,OAAApwG,EACA,OAAQ6wG,GACR,UAAW,YACX,cAAe8K,EAAS,aAClC,CAAS,EACD+wB,EAAmB,SAC3B,EACM,QAASoC,EACf,CAAK,EACDzB,EAAqBoF,GAAM,OAAO,IAAI,qBAAqB,GAAK,KAChEA,GAAM,IAAI,CACR,GAAI,kBACJ,MAAO,QACP,UAAW,GACX,UAAW,GACX,eAAgBriC,GAA2B,CACzC,OAAApwG,EACA,OAAQ6wG,GACR,UAAW,QACX,cAAe8K,EAAS,aAChC,CAAO,EACD,QAAS42B,EACf,CAAK,EACD70C,EAAQ,YAAY+0C,GAAM,OAAO,EAEjC,MAAMC,GAA2B,IAAM,CACrC,MAAM/2I,EAAUqE,EAAO,SAAW,KAC5B2yI,GAAYpH,GAAiC5vI,CAAO,EACpD0Z,GAAQi2H,GAA4B3vI,CAAO,EAC3CtG,GAAU,CACd,CAAE,MAAO,OAAQ,MAAO,SAASs9I,EAAS,GAAG,EAC7C,CAAE,MAAO,MAAO,MAAO,KAAK,EAC5B,GAAGt9H,GAAM,IAAKre,KAAU,CAAE,MAAOA,GAAM,MAAOA,EAAI,EAAG,CAC7D,EACM64I,GAAuB,WAAWx6I,GAASw2I,EAAW,gBAAgB,EACjEx2I,GAAQ,KAAMotB,IAAUA,GAAM,QAAUopH,EAAW,gBAAgB,IACtEA,EAAW,iBAAmB,OAC9BgE,GAAuB,MAAQ,OAEnC,EAEA,IAAIta,EAAwB,KAC5B,MAAMC,GAAkC,IAAM,CACxCD,IACFA,EAAqB,EACrBA,EAAwB,MAE1B,MAAM55H,EAAUqE,EAAO,SAAW,KAClC,GAAI,CAACrE,EAAS,OACd,MAAM7C,GAAWhC,IAAU,CACzB,MAAM2jC,GAAQ3jC,IAAO,QAAQ,MACvBgd,GAAOhd,IAAO,MAAQ,IACvB,CAAC2jC,IAASA,KAAU,UACvB3mB,KAAS,qBACNhd,IAAO,QAAQ,KAAO,cACtBA,IAAO,QAAQ,KAAO,iBAEzB41I,EAAmB,mBAAkB,GAEnC,CAACjyG,IAASA,KAAU,QAAUA,KAAU,SAC1C4xG,GAA4B,CAEhC,EACA,GAAI,OAAO1wI,EAAQ,IAAO,WAAY,CACpC,MAAM85H,GAAS,CACb95H,EAAQ,GAAG,oBAAqB7C,EAAO,EACvC6C,EAAQ,GAAG,oBAAqB7C,EAAO,EACvC6C,EAAQ,GAAG,oBAAqB7C,EAAO,CACjD,EACQy8H,EAAwB,IAAM,CAC5B,UAAWvnB,MAAeynB,GAAQznB,KAAW,CAC/C,CACF,MAAW,OAAOryG,EAAQ,kBAAqB,aAC7CA,EAAQ,iBAAiB,oBAAqB7C,EAAO,EACrD6C,EAAQ,iBAAiB,oBAAqB7C,EAAO,EACrD6C,EAAQ,iBAAiB,oBAAqB7C,EAAO,EACrDy8H,EAAwB,IAAM,CAC5B55H,EAAQ,oBAAoB,oBAAqB7C,EAAO,EACxD6C,EAAQ,oBAAoB,oBAAqB7C,EAAO,EACxD6C,EAAQ,oBAAoB,oBAAqB7C,EAAO,CAC1D,EAEJ,EAEA45I,GAAwB,EACxBrG,GAA4B,EAC5BK,EAAmB,mBAAkB,EACrCU,EAAyBE,EAAyB,EAClDE,EAAkCJ,CAAsB,EACxDiF,GAAoB,EACpB1F,EAAa,EACbnX,GAA+B,EAE/B,MAAM2L,GAAgB,CACpBsK,EAAkB,GAAG,SAAU,IAAM,CACnCkB,EAAa,EACbN,GAA4B,EAC5BgG,GAAoB,CACtB,CAAC,EACD3G,EAAc,GAAG,SAAU,IAAM,CAC/B2G,GAAoB,EACpBK,GAAwB,CAC1B,CAAC,EACDrX,GAAUr7H,EAAQ,oBAAsBlJ,GAAU,CAC5CA,GAAO,QAAQ,OAAS,0BAA0Bu7I,GAAoB,CAC5E,CAAC,CACP,EAEI,KAAK,GAAG,iBAAiB,IAAI,IAAM12B,EAAS,SAAS,EACrD,KAAK,GAAG,iBAAiB,IAAI,IAAM,CACjC,UAAWjV,KAAYspC,EAAgBtpC,EAAS,QAAO,EACvD,UAAWA,KAAYupC,EAAevpC,EAAS,QAAO,EACtD,UAAWsH,KAAemzB,GAAenzB,EAAW,EACpDunB,IAAqB,EACrBmX,EAAmB,QAAO,EAC1B8B,GAAe,EACfR,EAAW,OAAM,EACjBwE,GAAW,QAAO,EAClBC,GAAM,QAAO,CACf,CAAC,EAED,MAAMpmD,GAAQ,KAAK,GAAG,YAAY,CAChC,GAAI,KAAK,QAAQ,IAAM,sBACvB,MAAO,KAAK,QAAQ,OAAS,YAC7B,SAAU,KAAK,QAAQ,UAAY,CAAE,EAAG,GAAI,EAAG,GAAG,EAClD,KAAM,KAAK,QAAQ,MAAQ,YAC3B,YAAawkB,GACb,QAAAnT,CACN,CAAK,EACD,OAAArR,GAAM,eAAiBu/C,EACvBv/C,GAAM,kBAAoBo/C,EAC1Bp/C,GAAM,WAAaw/C,EACnBx/C,GAAM,cAAgBq/C,EACtBr/C,GAAM,eAAiBs/C,GAAkB,KACzCt/C,GAAM,sBAAwB,IAAM,CAClCqgD,EAAmB,mBAAkB,EACrCU,EAAyBE,EAAyB,EAClDE,EAAkCJ,CAAsB,EACxDsF,GAAwB,EACxBrG,GAA4B,EAC5BgG,GAAoB,EACpB1F,EAAa,CACf,EACOtgD,EACT,CACF,CCtoDY,MAACumD,GAAwB,OAAO,OAAO,CACjD,CAAE,GAAI,SAAU,MAAO,QAAQ,EAC/B,CAAE,GAAI,YAAa,MAAO,YAAY,EACtC,CAAE,GAAI,YAAa,MAAO,YAAY,EACtC,CAAE,GAAI,QAAS,MAAO,OAAO,EAC7B,CAAE,GAAI,KAAM,MAAO,IAAI,EACvB,CAAE,GAAI,KAAM,MAAO,IAAI,EACvB,CAAE,GAAI,SAAU,MAAO,QAAQ,CACjC,CAAC,EAEKC,GAAoB,OAAO,OAAO,CACtC,QAAS,OAAO,OAAO,CAAE,MAAO,KAAM,OAAQ,KAAM,EACpD,KAAM,OAAO,OAAO,CAAE,MAAO,KAAM,OAAQ,KAAM,EACjD,KAAM,OAAO,OAAO,CAAE,MAAO,KAAM,OAAQ,KAAM,CACnD,CAAC,EAED,SAASpvD,GAAmBn0E,EAAGC,EAAGi0E,EAAU,KAAM,CAChD,OAAO,KAAK,IAAI,OAAOl0E,CAAC,EAAI,OAAOC,CAAC,CAAC,GAAKi0E,CAC5C,CAEA,SAAShvF,GAAwBC,EAAOC,EAAW,EAAG,CACpD,MAAMC,EAAU,OAAOF,CAAK,EAC5B,MAAI,CAAC,OAAO,SAASE,CAAO,GAAKA,GAAW,EAAUD,EAC/CC,CACT,CAEA,SAASm+I,GAAkBr+I,EAAO,CAChC,MAAME,EAAUH,GAAwBC,EAAO,CAAC,EAChD,OAAIgvF,GAAmB9uF,EAAS,KAAK,MAAMA,CAAO,CAAC,EAAU,OAAO,KAAK,MAAMA,CAAO,CAAC,EAChFA,EAAQ,QAAQ,CAAC,EAAE,QAAQ,UAAW,EAAE,CACjD,CAYO,SAASo+I,GAA6BC,EAAyB,EAAG,CACvE,MAAMC,EAAMz+I,GAAwBw+I,EAAwB,CAAC,EAC7D,OAAIvvD,GAAmBwvD,EAAK,CAAC,EAAU,SACnCxvD,GAAmBwvD,EAAK,CAAC,EAAU,YACnCxvD,GAAmBwvD,EAAK,CAAC,EAAU,YAChC,UAAUH,GAAkBG,CAAG,CAAC,GACzC,CAEO,SAASC,GAAyBC,EAAaC,EAAc52E,EAAa,CAAA,EAAI,CACnF,MAAM62E,EAAcl6D,GAAS3c,EAAW,MAAO,EAAG,CAAC,EAC7C82E,EAAen6D,GAAS3c,EAAW,OAAQ,EAAG,CAAC,EAC/C+2E,EAAe,KAAK,IAAI,KAAM,OAAOJ,CAAW,EAAI,KAAK,IAAI,EAAG,OAAOC,CAAY,CAAC,CAAC,EACrFI,EAAeH,EAAc,KAAK,IAAI,EAAGC,CAAY,EAC3D,GAAI7vD,GAAmB+vD,EAAcD,CAAY,EAC/C,MAAO,CAAE,EAAG,EAAG,EAAG,EAAG,MAAOF,EAAa,OAAQC,CAAY,EAE/D,GAAIC,EAAeC,EAAc,CAC/B,MAAMl8I,EAAQ+7I,EACR97I,EAASD,EAAQi8I,EACvB,MAAO,CACL,EAAG,EACH,GAAID,EAAe/7I,GAAU,GAC7B,MAAAD,EACA,OAAAC,CACN,CACE,CACA,MAAMA,EAAS+7I,EACTh8I,EAAQC,EAASg8I,EACvB,MAAO,CACL,GAAIF,EAAc/7I,GAAS,GAC3B,EAAG,EACH,MAAAA,EACA,OAAAC,CACJ,CACA,CAEA,SAAS4hF,GAAS1kF,EAAOsK,EAAKrK,EAAU,CACtC,MAAMC,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,IAAIoK,EAAK,KAAK,MAAMpK,CAAO,CAAC,EADFD,CAExC,CAEO,SAAS++I,GAA6Bh/I,EAAOC,EAAW,SAAU,CAEvE,OADY,OAAOD,GAAS,EAAE,EAAE,OAAO,QAAQ,6BAA8B,GAAG,GAClEC,CAChB,CAEO,SAASg/I,GAA4Bj/I,EAAOC,EAAW,MAAO,CAEnE,OADe,OAAOD,GAASC,CAAQ,EAAE,KAAI,EAAG,YAAW,IACzC,MAAQ,MAAQ,KACpC,CAEO,SAASi/I,GAA8BC,EAAUp+G,EAAS,MAAOq+G,EAAe,SAAU,CAC/F,MAAMC,EAAmBJ,GAA4Bl+G,EAAQ,KAAK,EAC5D1K,EAAM,OAAO8oH,GAAY,EAAE,EAAE,KAAI,EAEvC,MAAO,GADMH,GAA6B3oH,EAAI,QAAQ,YAAa,EAAE,EAAG+oH,CAAY,CACtE,IAAIC,CAAgB,EACpC,CAEO,SAASC,GAAoC7+I,EAAQsnE,EAAa,GAAI,CAC3E,MAAMw3E,EAAa,OAAO9+I,GAAU,QAAQ,EAAE,KAAI,EAAG,YAAW,EAC1Dm+I,EAAcl6D,GAAS3c,EAAW,MAAO,EAAG,CAAC,EAC7C82E,EAAen6D,GAAS3c,EAAW,OAAQ,EAAG,CAAC,EACrD,GAAIw3E,IAAe,SAAU,MAAO,CAAE,MAAOX,EAAa,OAAQC,EAAc,OAAQ,QAAQ,EAChG,GAAIU,IAAe,YAAa,MAAO,CAAE,MAAOX,EAAc,EAAG,OAAQC,EAAe,EAAG,OAAQ,WAAW,EAC9G,GAAIU,IAAe,YAAa,MAAO,CAAE,MAAOX,EAAc,EAAG,OAAQC,EAAe,EAAG,OAAQ,WAAW,EAC9G,MAAMW,EAAqBD,EAAW,MAAM,4BAA4B,EACxE,GAAIC,EAAoB,CACtB,MAAMvnH,EAASl4B,GAAwBy/I,EAAmB,CAAC,EAAG,CAAC,EAC/D,MAAO,CACL,MAAO,KAAK,IAAI,EAAG,KAAK,MAAMZ,EAAc3mH,CAAM,CAAC,EACnD,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAM4mH,EAAe5mH,CAAM,CAAC,EACrD,OAAQ,UAAUomH,GAAkBpmH,CAAM,CAAC,GACjD,CACE,CACA,OAAImmH,GAAkBmB,CAAU,EAAU,CAAE,GAAGnB,GAAkBmB,CAAU,EAAG,OAAQA,CAAU,EACzF,IACT,CAEO,SAASE,GAAiCz/I,EAAOC,EAAW,EAAG,CACpE,MAAMC,EAAU,OAAOF,CAAK,EAC5B,MAAI,CAAC,OAAO,SAASE,CAAO,GAAKA,GAAW,EAAUD,EAClDC,GAAW,EAAU,EACrBA,GAAW,EAAU,EACrBA,GAAW,EAAU,EAClB,KAAK,IAAI,EAAG,KAAK,MAAMA,CAAO,CAAC,CACxC,CAEO,SAASw/I,GAAyB1/I,EAAOC,EAAW,EAAG,CAC5D,MAAMC,EAAU,OAAOF,CAAK,EAC5B,MAAI,CAAC,OAAO,SAASE,CAAO,GAAKA,GAAW,EAAUD,EAC/C,KAAK,IAAI,IAAM,KAAK,IAAI,EAAGC,CAAO,CAAC,CAC5C,CAEO,SAASy/I,GAAkCC,EAAa,CAAA,EAAIC,EAAW,CAAA,EAAI5/I,EAAW,EAAG,CAC9F,MAAM6/I,EAAc//I,GAAwB6/I,EAAW,OAASA,EAAW,aAAc,GAAG,EACtFG,EAAehgJ,GAAwB6/I,EAAW,QAAUA,EAAW,cAAe,GAAG,EACzFl0F,EAAY3rD,GAAwB8/I,EAAS,MAAO,GAAG,EACvDp0F,EAAa1rD,GAAwB8/I,EAAS,OAAQ,GAAG,EAC/D,MACE,CAAC,OAAO,SAASC,CAAW,GACzB,CAAC,OAAO,SAASC,CAAY,GAC7B,CAAC,OAAO,SAASr0F,CAAS,GAC1B,CAAC,OAAO,SAASD,CAAU,EAEvB1rD,GAAwBE,EAAU,CAAC,EAErC,KAAK,IAAI,KAAM,KAAK,IAAI6/I,EAAcp0F,EAAWq0F,EAAet0F,CAAU,CAAC,CACpF,CAEO,SAASu0F,GAAmChgJ,EAAOC,EAAW,GAAO,CAC1E,OAAID,GAAS,KAAaC,EACnBD,IAAU,EACnB,CAEO,SAASigJ,GAA6BjgJ,EAAOC,EAAW,WAAY,CAEzE,OADmB,OAAOD,GAASC,CAAQ,EAAE,KAAI,EAAG,YAAW,IACzC,gBAAkB,gBAAkB,UAC5D,CAWO,SAASigJ,GAA0BvsH,EAAUhxB,EAAgB,EAAG,CACrE,MAAMw9I,EAAoBV,GAAiC98I,EAAe,CAAC,EAC3E,IAAIy9I,EAAqB,KACzB,MAAMl7H,EAASyO,GAAU,QAAU,KACnC,GAAIzO,GAAQ,OAAS,SAAU,CAC7B,MAAM9F,EAAK8F,EAAO,IAAM,KAClBm7H,EAAajhI,GAAI,eAAeA,EAAG,gBAAgB,GAAKghI,EACxDE,EAAkBlhI,GAAI,eAAeA,EAAG,qBAAqB,GAAKghI,EACxEA,EAAqB,KAAK,IAAI,EAAG,KAAK,MAAM,KAAK,IAAIC,EAAYC,CAAe,CAAC,CAAC,CACpF,SAAWp7H,GAAQ,OAAS,SAAU,CACpC,MAAMhT,EAAQgT,EAAO,QAAQ,QAAQ,uBAAyBk7H,EAC9DA,EAAqB,KAAK,IAAI,EAAG,KAAK,MAAMluI,CAAK,CAAC,CACpD,CACA,MAAO,CACL,cAAeiuI,EACf,mBAAAC,EACA,mBAAoB,KAAK,IAAI,EAAG,KAAK,MAAMA,EAAqBD,CAAiB,CAAC,CACtF,CACA,CAeO,SAASI,GAA2B3/I,EAAU,GAAI6L,EAAU,CAAA,EAAI,CACrE,MAAM+zI,EAAkB,OAAO5/I,EAAQ,QAAUA,EAAQ,YAAc,EAAE,EAAE,KAAI,EAAG,YAAW,EACvF29I,EAAyBx+I,GAAwB0M,EAAQ,uBAAwB,CAAC,EAClFhM,EAAS+/I,IAAoB5/I,EAAQ,OAASA,EAAQ,OAAS,SAAW09I,GAA6BC,CAAsB,GAC7Hx9G,EAASk+G,GAA4Br+I,EAAQ,OAAQ,KAAK,EAC1DmnE,EAAat7D,EAAQ,YAAc,CAAA,EACnCg0I,EAAWzB,GAA6Bp+I,EAAQ,UAAYA,EAAQ,MAAQA,EAAQ,UAAY,QAAQ,EACxG+B,EAAgB88I,GAAiC7+I,EAAQ,cAAe,CAAC,EACzE8/I,EAAchB,GAAyB9+I,EAAQ,YAAa,CAAC,EAC7D+/I,EAAwBX,GAAmCp/I,EAAQ,sBAAuB,EAAK,EAC/FggJ,EAAYD,EACdV,GAA6Br/I,EAAQ,UAAW,UAAU,EAC1D,WACEigJ,EAAap0I,EAAQ,YAAcyzI,GAA0BzzI,EAAQ,SAAU9J,CAAa,EAElG,IAAIm+I,EAAa,KAIjB,GAHIrgJ,IAAW,WACbqgJ,EAAaxB,GAAoC7+I,EAAQsnE,CAAU,GAEjE,CAAC+4E,EAAY,CACf,MAAM7gJ,EAAWq/I,GAAoC,SAAUv3E,CAAU,GAAK,CAAE,MAAO,EAAG,OAAQ,CAAC,EAC7Fg5E,EAAiB,KAAK,IAAI,KAAM9gJ,EAAS,MAAQ,KAAK,IAAI,EAAGA,EAAS,MAAM,CAAC,EACnF,IAAI4C,EAAQ,OAAOjC,EAAQ,KAAK,EAC5BkC,EAAS,OAAOlC,EAAQ,MAAM,EAC9B,CAAC,OAAO,SAASiC,CAAK,GAAK,OAAO,SAASC,CAAM,IAAGD,EAAQC,EAASi+I,GACrE,CAAC,OAAO,SAASj+I,CAAM,GAAK,OAAO,SAASD,CAAK,IAAGC,EAASD,EAAQk+I,GACzED,EAAa,CACX,OAAQ,SACR,MAAOp8D,GAAS7hF,EAAO,EAAG5C,EAAS,KAAK,EACxC,OAAQykF,GAAS5hF,EAAQ,EAAG7C,EAAS,MAAM,CACjD,CACE,CAEA,MAAM+gJ,EAAa,KAAK,IAAI,EAAG,KAAK,MAAMF,EAAW,KAAK,CAAC,EACrDG,EAAc,KAAK,IAAI,EAAG,KAAK,MAAMH,EAAW,MAAM,CAAC,EACvDI,EAAc,KAAK,IAAI,EAAG,KAAK,MAAMF,EAAar+I,CAAa,CAAC,EAChEw+I,EAAe,KAAK,IAAI,EAAG,KAAK,MAAMF,EAAct+I,CAAa,CAAC,EAClEypG,EAAcqyC,GAAyBuC,EAAYC,EAAal5E,CAAU,EAC1Eq5E,EAAe,KAAK,IAAI,EAAG,OAAOh1C,EAAY,OAAS40C,CAAU,CAAC,EAClEK,EAAgB,KAAK,IAAI,EAAG,OAAOj1C,EAAY,QAAU60C,CAAW,CAAC,EACrEK,EAAmB,KAAK,IAC5B,EACAJ,EAAc,KAAK,IAAI,EAAGE,CAAY,EACtCD,EAAe,KAAK,IAAI,EAAGE,CAAa,CAC5C,EACQE,EAAc5+I,EACd6+I,EAAmBN,EACnBO,EAAoBN,EACpBO,EAAQ,EACRC,EAAQ,EACRC,EAAiBV,GAAeL,EAAW,oBAAsBM,GAAgBN,EAAW,mBAElG,MAAO,CACL,OAAQC,EAAW,OACnB,OAAA//G,EACA,SAAA0/G,EACA,SAAUvB,GAA8Bt+I,EAAQ,UAAY6/I,EAAU1/G,EAAQ0/G,CAAQ,EACtF,eAAgB7/I,EAAQ,iBAAmB,GAC3C,cAAeA,EAAQ,gBAAkB,GACzC,iBAAkBA,EAAQ,mBAAqB,GAC/C,MAAOogJ,EACP,OAAQC,EACR,YAAAC,EACA,aAAAC,EACA,aAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,YAAAC,EACA,YAAAn1C,EACA,iBAAAo1C,EACA,kBAAAC,EACA,SAAU,CACR,EAAGC,EACH,EAAGC,EACH,MAAOT,EACP,OAAQC,CACd,EACI,cAAAx+I,EACA,YAAA+9I,EACA,sBAAAC,EACA,UAAAC,EACA,WAAAC,EACA,eAAAe,CACJ,CACA,CAEO,SAASC,GAAqCC,EAAgB,GAAIC,EAAiB,CAAA,EAAI,CAC5F,MAAM9+H,EAAcyhE,GAASo9D,EAAc,MAAO,EAAG,CAAC,EAChD5+H,EAAewhE,GAASo9D,EAAc,OAAQ,EAAG,CAAC,EAClD95C,EAAWtjB,GAASq9D,EAAe,SAAU,EAAG,GAAG,EACnDC,EAAYt9D,GAASq9D,EAAe,UAAW,EAAG,GAAG,EACrDpyH,EAAQ,KAAK,IAAIq4E,EAAW/kF,EAAa++H,EAAY9+H,EAAc,CAAC,EACpErgB,EAAQ,KAAK,IAAI,EAAG,KAAK,MAAMogB,EAAc0M,CAAK,CAAC,EACnD7sB,EAAS,KAAK,IAAI,EAAG,KAAK,MAAMogB,EAAeyM,CAAK,CAAC,EACrD8wH,EAAWzB,GAA6B8C,EAAc,UAAYA,EAAc,UAAY,QAAQ,EAE1G,MAAO,CACL,SAAU,GAAGrB,CAAQ,WACrB,SAAU,GAAGA,CAAQ,WACrB,OAAQ,MACR,OAAQ,SACR,MAAA59I,EACA,OAAAC,EACA,cAAe28I,GAAiCsC,EAAe,cAAe,CAAC,EAC/E,cAAeD,EAAc,gBAAkB,GAC/C,eAAgBA,EAAc,iBAAmB,GACjD,iBAAkBA,EAAc,mBAAqB,GACrD,YAAapC,GAAyBoC,EAAc,YAAa,CAAC,EAClE,sBAAuB9B,GAAmC8B,EAAc,sBAAuB,EAAK,EACpG,UAAW7B,GAA6B6B,EAAc,UAAW,UAAU,CAC/E,CACA,CAWO,SAASG,GAA4Bl6E,EAAa,CAAA,EAAI84E,EAAa,CAAE,mBAAoB,GAAQ,EAAIl+I,EAAgB,EAAG,CAC7H,MAAMw9I,EAAoBV,GAAiC98I,EAAe,CAAC,EACrEy9I,EAAqB,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOS,GAAY,kBAAkB,GAAK,GAAQ,CAAC,EAC/FtC,EAAyBx+I,GAAwB8gJ,GAAY,uBAAwB,CAAC,EACtFqB,EAAkB5D,GAA6BC,CAAsB,EACrE4D,EAAU,CAAC,GAAGhE,EAAqB,EACzC,MAAK,CAAC,SAAU,YAAa,WAAW,EAAE,SAAS+D,CAAe,GAChEC,EAAQ,OAAO,EAAG,EAAG,CAAE,GAAID,EAAiB,MAAO,WAAW7D,GAAkBE,CAAsB,CAAC,GAAG,CAAE,EAEvG4D,EAAQ,IAAKn0H,GAAU,CAC5B,GAAIA,EAAM,KAAO,SACf,MAAO,CAAE,GAAGA,EAAO,UAAW,GAAM,MAAO,KAAM,OAAQ,IAAI,EAE/D,MAAM7C,EAAWm0H,GAAoCtxH,EAAM,GAAI+5C,CAAU,GAAK,CAAE,MAAO,EAAG,OAAQ,CAAC,EAC7F+jB,EAAa3gE,EAAS,MAAQg1H,GAAsBC,GACpDj1H,EAAS,OAASg1H,GAAsBC,EAC9C,MAAO,CACL,GAAGpyH,EACH,MAAO7C,EAAS,MAChB,OAAQA,EAAS,OACjB,UAAA2gE,CACN,CACE,CAAC,CACH,CCvTA,MAAMs2D,GAA+B,IAC/BC,GAAmC,GACnCC,OAA+B,IAC/BC,GAA+B,IAErC,SAASC,GAAoBj3I,EAAQ,CACnC,OAAOA,GAAQ,SAAS,cAAgB,CAAA,CAC1C,CAEA,SAASk3I,GAA4Bl3I,EAAQ,CAC3C,MAAMm3I,EAAeF,GAAoBj3I,CAAM,EAC/C,OAAOm3I,EAAa,aAAe,IAAQA,EAAa,WAAa,EACvE,CAEA,SAASC,GAAwBp3I,EAAQ,CACvC,OAAOi3I,GAAoBj3I,CAAM,EAAE,WAAa,EAClD,CAEA,MAAMq3I,GAAuB,OAAO,OAAO,CACzC,WAAY,wBACZ,WAAY,wBACZ,qBAAsB,kCACtB,cAAe,2BACf,cAAe,iCACf,aAAc,gCACd,iBAAkB,oCAClB,gBAAiB,mCACjB,sBAAuB,yCACvB,qBAAsB,wCACtB,qBAAsB,4CACtB,mBAAoB,sCACpB,eAAgB,kCAChB,cAAe,iCACf,iBAAkB,oCAClB,gBAAiB,mCACjB,iBAAkB,oCAClB,eAAgB,kCAChB,kBAAmB,qCACnB,6BAA8B,2CAC9B,2BAA4B,+CAC5B,wCAAyC,4DACzC,8CAA+C,kEAC/C,mCAAoC,uDACpC,qCAAsC,yDACtC,oCAAqC,wDACrC,oCAAqC,wDACrC,cAAe,4BACf,YAAa,0BACb,YAAa,0BACb,qBAAsB,mCACtB,sBAAuB,qCACvB,sBAAuB,qCACvB,sBAAuB,qCACvB,iBAAkB,+BAClB,sBAAuB,oCACvB,yBAA0B,uCAC1B,sBAAuB,oCACvB,sBAAuB,oCACvB,oBAAqB,kCACrB,uBAAwB,qCACxB,gBAAiB,8BACjB,wBAAyB,sCACzB,sBAAuB,oCACvB,sBAAuB,oCACvB,yBAA0B,uCAC1B,uBAAwB,qCACxB,qBAAsB,mCACtB,qBAAsB,mCACtB,+BAAgC,6CAChC,+BAAgC,6CAChC,wBAAyB,sCACzB,WAAY,cACZ,6BAA8B,gCAC9B,cAAe,iBACf,iBAAkB,oBAClB,oBAAqB,uBACrB,sBAAuB,yBACvB,mBAAoB,sBACpB,yBAA0B,4BAC1B,eAAgB,kBAChB,eAAgB,kBAChB,cAAe,iBACf,eAAgB,iBAClB,CAAC,EAEKC,GAA6B,IAC7BC,GAAqC,IAAI,IAAI,CAAC,oBAAqB,iBAAiB,CAAC,EAE3F,SAASC,GAAkBr6C,EAAM,CAC/B,MAAM/tF,EAAO,OAAO+tF,GAAQ,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,EAC5C,OAAI/tF,IAAS,MAAQA,IAAS,YAAoB,OAC9CA,IAAS,WAAaA,IAAS,YAAoB,YAChD,SACT,CAEA,SAASqoI,GAA0B5wI,EAAIg2F,EAAQ,GAAI,CACjD,MAAM66C,EAAe,OAAO7wI,GAAM,EAAE,EAAE,KAAA,EAChC8wI,EAAkB,OAAO96C,GAAS,EAAE,EAAE,KAAA,EAAO,YAAA,EACnD,OAAI66C,IAAiB,qBAAuBC,IAAoB,UAAkB,UAC9ED,IAAiB,oBAAsBC,IAAoB,UAAYA,IAAoB,UAAkB,UAC7GD,IAAiB,oBAAsBC,IAAoB,SAAiB,SAC5ED,IAAiB,qBAAuBC,IAAoB,UAAkB,UAC9ED,IAAiB,oBAAsBC,IAAoB,SAAiB,SAC5ED,IAAiB,uBAAyBC,IAAoB,YAAoB,YAClFD,IAAiB,qBAAuBC,IAAoB,UAAkB,UAC3E,IACT,CAEA,SAASC,GAAqBz6C,EAAM,CAClC,MAAM/iB,EAAO,OAAO+iB,GAAQ,EAAE,EAC9B,OAAI/iB,EAAK,WAAW,SAAS,EAAU,IACnCA,EAAK,WAAW,SAAS,EAAU,IACnCA,EAAK,WAAW,UAAU,GAAKA,EAAK,WAAW,UAAU,EAAU,IAChEk9D,EACT,CAEA,SAASO,GAAsBpjJ,EAAO,CACpC,GAAIA,GAAS,MAAQ,OAAOA,GAAU,SAAU,OAAOA,EACvD,GAAI,CACF,GAAI,OAAO,iBAAoB,WAAY,OAAO,gBAAgBA,CAAK,CACzE,MAAY,CAEZ,CACA,GAAI,CACF,OAAO,KAAK,MAAM,KAAK,UAAUA,CAAK,CAAC,CACzC,MAAY,CACV,OAAOA,CACT,CACF,CAEA,SAASqjJ,GAAoBrjJ,EAAO,CAClC,GAAI,CACF,OAAO,KAAK,UAAUA,CAAK,CAC7B,MAAY,CACV,OAAO,OAAOA,CAAK,CACrB,CACF,CAEA,SAAS6lI,GAAkBn9B,EAAM,CAC/B,MAAMh3B,EAAQ,OAAOg3B,GAAQ,EAAE,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAC1D,OAAIh3B,EAAM,QAAU,EAAU,GAAGA,EAAM,CAAC,CAAC,IAAIA,EAAM,CAAC,CAAC,GAC9CA,EAAM,CAAC,GAAK,EACrB,CAEA,SAAS4xE,GAAmB,CAAE,OAAA/3I,EAAQ,UAAA2jI,EAAW,UAAAqU,GAAa,CAC5D,GAAIrU,EAAW,OAAOA,EACtB,GAAI3jI,GAAQ,QAAQ,QAAU,OAAOA,EAAO,OAAO,UAAa,WAAY,CAC1E,MAAMygD,EAAQ,SAAS,cAAc,KAAK,EAC1C,OAAAA,EAAM,UAAY,YAClBzgD,EAAO,OAAO,SAASg4I,GAAa,KAAMv3F,CAAK,EACxCA,CACT,CACA,MAAM/rD,EAAW,SAAS,cAAc,KAAK,EAC7C,OAAAA,EAAS,UAAY,aACpB,SAAS,MAAQ,SAAS,iBAAiB,YAAYA,CAAQ,EACzDA,CACT,CAEA,SAASujJ,GAAeC,EAAWC,EAAS,CAC1C,MAAMC,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,iBACjB,MAAMj+H,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,wBAClBA,EAAM,YAAc+9H,EACpB,MAAMzjJ,EAAQ0jJ,GAAW,SAAS,cAAc,KAAK,EACrD,OAAKA,EAIH1jJ,EAAM,UAAU,IAAI,uBAAuB,GAH3CA,EAAM,UAAY,wBAClBA,EAAM,YAAc,KAItB2jJ,EAAK,YAAYj+H,CAAK,EACtBi+H,EAAK,YAAY3jJ,CAAK,EACf,CAAE,KAAA2jJ,EAAM,MAAAj+H,EAAO,MAAA1lB,CAAA,CACxB,CAEA,SAAS4jJ,GAAoBvkI,EAAM,CACjC,OAAQA,EAAA,CACN,KAAKm/B,GAAAA,cAAc,QAAS,MAAO,UACnC,KAAKA,GAAAA,cAAc,MAAO,MAAO,QACjC,KAAKA,GAAAA,cAAc,OAAQ,MAAO,SAClC,KAAKA,GAAAA,cAAc,QAAS,MAAO,UACnC,KAAKA,GAAAA,cAAc,gBAAiB,MAAO,mBAC3C,KAAKA,GAAAA,cAAc,SAAU,MAAO,WACpC,KAAKA,GAAAA,cAAc,OAAQ,MAAO,SAClC,KAAKA,GAAAA,cAAc,KAAM,MAAO,OAChC,KAAKA,GAAAA,cAAc,WAAY,MAAO,aACtC,KAAKA,GAAAA,cAAc,WAAY,MAAO,cACtC,KAAKA,GAAAA,cAAc,mBAAoB,MAAO,uBAC9C,KAAKA,GAAAA,cAAc,cAAe,MAAO,iBACzC,QAAS,OAAO,OAAOn/B,GAAQ,SAAS,CAAA,CAE5C,CAEA,SAASwkI,GAAyBthJ,EAAM,CACtC,OAAO,OAAOA,GAAS,UAAYA,EAAK,WAAW,GAAG,CACxD,CA6DA,SAASuhJ,GAAoBx7C,EAAKl7F,EAAM,CACtC,MAAMk5E,EAAMgiB,EAAI,gBAAgB,6BAA8B,KAAK,EACnEhiB,EAAI,aAAa,UAAW,WAAW,EACvCA,EAAI,UAAU,IAAI,0BAA0B,EAC5C,MAAMoiB,EAAOJ,EAAI,gBAAgB,6BAA8B,MAAM,EACrE,OAAAI,EAAK,aAAa,OAAQ,MAAM,EAChCA,EAAK,aAAa,SAAU,cAAc,EAC1CA,EAAK,aAAa,eAAgB,KAAK,EACvCA,EAAK,aAAa,iBAAkB,OAAO,EAC3CA,EAAK,aAAa,kBAAmB,OAAO,EACxCt7F,IAAS,YAAas7F,EAAK,aAAa,IAAK,6BAA6B,EACrEt7F,IAAS,aAAcs7F,EAAK,aAAa,IAAK,6BAA6B,EAC3Et7F,IAAS,QAASs7F,EAAK,aAAa,IAAK,sBAAsB,EACnEA,EAAK,aAAa,IAAK,+CAA+C,EAC3EpiB,EAAI,YAAYoiB,CAAI,EACbpiB,CACT,CAsBO,MAAMy9D,EAAS,CACpB,YAAYnjJ,EAAU,GAAI,CACxB,KAAK,OAASA,EAAQ,QAAU,KAC5B,KAAK,QAAU,CAAC,KAAK,OAAO,KAAI,KAAK,OAAO,GAAK,MACrD,KAAK,QAAQ,WAAW,QAAQ,IAAI,EACpC,KAAK,UAAYA,EAAQ,WAAa,KACtC,MAAMojJ,EAAmB,OAAO,UAAU,eAAe,KAAKpjJ,EAAS,OAAO,EACxEqjJ,EAAY,KAAK,QAAQ,oBAAoB,WAAa,GAC5D,KAAK,QAAQ,oBAAoB,aACjC,KACJ,KAAK,MAAQrjJ,EAAQ,OAASqjJ,GAAa,OACvCD,GACF,KAAK,QAAQ,gCAAgC,WAAY,CACvD,OAAQ,UACR,OAAQ,uBACR,cAAe,EAAA,CAChB,EAEH,KAAK,OAASpjJ,EAAQ,QAAU,UAChC,KAAK,sBAAwBA,EAAQ,wBAA0B,IAAS6hJ,GAA4B,KAAK,MAAM,EAE3G,KAAK,SAAW,WAAW/zC,GAAoB9tG,EAAQ,UAAY,QAAQ,EAG/EsoG,GAA0BtoG,EAAQ,UAAY,QAAQ,EAEtD,KAAK,UAAY0iJ,GAAmB,CAClC,OAAQ,KAAK,OACb,UAAW1iJ,EAAQ,WAAa,KAChC,UAAW,KAAK,SAAA,CACjB,EACD,KAAK,UAAU,UAAU,IAAI,WAAW,EACxC,KAAK,UAAU,UAAU,OAAO,8BAA+B,CAAC,KAAK,qBAAqB,EAC1F,KAAK,UAAU,QAAQ,MAAQ,KAAK,MACpC,KAAK,qBAAuB,IAC5B,KAAK,yBAA2B,IAChC,KAAK,0BAA4B,KACjC,KAAK,kBAAoB,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAA,EAC9D,KAAK,uBAAyB,KAC9B,KAAK,oBAAsB,KAC3B,KAAK,4BAA8B,QACnC,KAAK,yBAA2B,KAChC,KAAK,8BAAgC,KACrC,KAAK,2BAA6B,KAClC,KAAK,iCAAmC,KACxC,KAAK,2BAA6B,QAClC,KAAK,uBAAyB,KAE9B,KAAK,aAAe,IAAIiqG,GAAa,CACnC,UAAW,KAAK,UAChB,UAAWjqG,EAAQ,WAAa,GAChC,YAAaA,EAAQ,aAAe,MAAA,CACrC,EACD,KAAK,kBAAoB,KAAK,QAAQ,cAAc,YAAaA,EAAQ,WAAaA,EAAQ,WAAW,SAAS,SAAS,GAAK,KAChI,KAAK,yBAA2B,KAChC,KAAK,iBAAmB,KAAK,uBAAA,EAC7B,KAAK,mBAAmB,SAAS,IAAI,EACrC,KAAK,kBAAkB,WAAY,CACjC,MAAO,OACP,WAAY,EACZ,aAAc,KAAK,MACnB,SAAU,CAAE,QAAS,OAAA,CAAQ,CAC9B,EACD,KAAK,QAAQ,0BAA0B,KAAK,QAAQ,oBAAoB,cAAgB,KAAK,KAAK,EAClG,KAAK,kCAAA,EACL,KAAK,iCAAA,EACL,KAAK,qCAAA,EACL,MAAMsjJ,EAAiB,KAAK,QAAQ,6BAChCA,GAAkB,OAAOA,GAAmB,WAE5C,KAAK,aAAaA,CAAc,EAChC,KAAK,OAAO,6BAA+B,KAC3C,KAAK,iBAAiB,WAAY,KAAK,MAAO,CAC5C,MAAO,OACP,OAAQ,UACR,OAAQ,gBACR,WAAY,EACZ,SAAU,GACV,cAAe,EAAA,CAChB,EAGC,KAAK,QAAQ,qCAAuC,KACtD,KAAK,OAAO,mCAAqC,IAEnD,KAAK,OAAO,6BAA+B,MAE7C,KAAK,oBAAA,EACL,MAAMC,EAAyB,KAAK,aAAa,sBAAuBliJ,GAAW,CACjF,KAAK,kBAAoB,CAAE,GAAGA,CAAA,EAC9B,KAAK,WAAW,OAAO,cAAc,8BAA+B,GAAG,KAAK,IAAI,EAAG,OAAOA,GAAQ,IAAI,GAAK,CAAC,CAAC,IAAI,EACjH,KAAK,WAAW,OAAO,cAAc,+BAAgC,GAAG,KAAK,IAAI,EAAG,OAAOA,GAAQ,KAAK,GAAK,CAAC,CAAC,IAAI,EACnH,KAAK,0BAAA,CACP,CAAC,EACGkiJ,GAAwB,KAAK,iBAAiB,IAAIA,CAAsB,CAC9E,CAEA,8BAA+B,CAC7B,GAAI,KAAK,2BAA6B,CAAC,KAAK,OAAQ,OACpD,MAAM9/I,EAAWhC,GAAU,CAEzB,MAAM+P,EADS/P,GAAO,QACH,GACnB,GAAI,CAAC+P,EAAI,OACT,MAAMgpE,EAAY,KAAK,qBAAqB,IAAIhpE,CAAE,EAC9CgpE,KAAqB,OAAA,CAC3B,EACI,OAAO,KAAK,OAAO,IAAO,WAC5B,KAAK,0BAA4B,KAAK,OAAO,GAAG,oBAAqB/2E,CAAO,EACnE,OAAO,KAAK,OAAO,kBAAqB,aACjD,KAAK,OAAO,iBAAiB,oBAAqBA,CAAO,EACzD,KAAK,0BAA4B,IAAM,KAAK,OAAO,oBAAoB,oBAAqBA,CAAO,GAEjG,KAAK,2BAA2B,KAAK,iBAAiB,IAAI,KAAK,yBAAyB,CAC9F,CAEA,qCAAsC,CACpC,MAAMw1C,EAAU,KAAK,QAAQ,SAAW,KAClCm6D,EAAe,KAAK,QAAQ,QAAU,KAC5C,GAAI,CAACn6D,GAAW,OAAOA,EAAQ,OAAU,WAAY,OACrD,MAAMuqG,EAAsB,CAACC,EAAY,CAAA,IAAO,OAAO,KAAKA,CAAS,EAClE,KAAM37C,GAAS,CAACo6C,GAAmC,IAAIp6C,CAAI,CAAC,EAC3D07C,EAAoBpwC,GAAc,eAAe,CAAE,QAAS,GAAO,GAAK,CAAA,CAAE,IAC1E,KAAK,kCAAoC,MAAM,aAAa,KAAK,gCAAgC,EACrG,KAAK,iCAAmC,WAAW,IAAM,CACvD,KAAK,iCAAmC,KACxC,MAAMswC,EAAgB,KAAK,QAAQ,SAAW,KACxCC,EAAe,KAAK,QAAQ,QAAU,KACxC,CAACD,GAAiBF,EAAoBG,GAAc,eAAe,CAAE,QAAS,EAAA,CAAO,GAAK,CAAA,CAAE,GAC5F,KAAK,SAAQ,KAAK,OAAO,mCAAqC,GACpE,EAAG,CAAC,EACN,CAWA,qBAAqB77C,EAAM9nG,EAAU,GAAI,CACvC,MAAMozG,EAAe,KAAK,QAAQ,QAAU,KAC5C,GAAI,CAACtL,GAAQ,OAAOsL,GAAc,UAAa,WAAY,OAAO,KAClE,MAAMwwC,EAAgB,OAAOxwC,GAAc,OAAU,WAAaA,EAAa,MAAMtL,CAAI,EAAI,KACvF+7C,EAAaD,GAAe,KAAO97C,EACnCg8C,EAAkB,OAAO,UAAU,eAAe,KAAK9jJ,EAAS,cAAc,EAC9E+jJ,EAAc3wC,GAAc,SAASywC,CAAU,GAAG,cAAgB,GAClE7/E,EAAe8/E,EAAkB9jJ,EAAQ,aAAe4jJ,GAAe,SAAW,KACxF,GAAI,CACF,OAAOxwC,EAAa,SAAS,KAAM,GAAI,CACrC,CAACywC,CAAU,EAAG,CACZ,GAAID,GAAiB,CAAA,EACrB,QAASpB,GAAsBuB,EAAc3wC,EAAa,IAAIywC,CAAU,EAAI7/E,CAAY,EACxF,MAAOhkE,EAAQ,OAASmiJ,GAAkBr6C,CAAI,EAC9C,KAAM9nG,EAAQ,MAAQ4jJ,GAAe,MAAQ,SAC7C,GAAI,CACF,GAAIA,GAAe,IAAM,CAAA,EACzB,MAAO5jJ,EAAQ,OAAS4jJ,GAAe,IAAI,MAC3C,WAAY5jJ,EAAQ,YAAc4jJ,GAAe,IAAI,WACrD,WAAY5jJ,EAAQ,YAAcuiJ,GAAqBz6C,CAAI,CAAA,CAC7D,CACF,CACD,CACH,OAAS7jG,EAAO,CACd,eAAQ,KAAK,gDAAgD6jG,CAAI,KAAM7jG,CAAK,EACrE,IACT,CACF,CAEA,kBAAkB6jG,EAAM9nG,EAAU,GAAI,CACpC,OAAO,KAAK,qBAAqB8nG,EAAM9nG,CAAO,CAChD,CAYA,kBAAkB8nG,EAAM1oG,EAAOY,EAAU,CAAA,EAAI,CAC3C,MAAMgkJ,EAAa,KAAK,QAAQ,QAAU,KAC1C,GAAI,CAACl8C,GAAQ,OAAOk8C,GAAY,KAAQ,WAAY,OAAO,KAC3D,GAAI,CACF,MAAMC,EAAe,CACnB,MAAOjkJ,EAAQ,OAASmiJ,GAAkBr6C,CAAI,EAC9C,OAAQ9nG,EAAQ,QAAU,KAC1B,OAAQA,EAAQ,QAAU,UAC1B,SAAUA,EAAQ,SAClB,aAAcA,EAAQ,aACtB,WAAYA,EAAQ,WACpB,QAASA,EAAQ,SAAW,EAAA,EAExBkkJ,EAAgBlkJ,EAAQ,eAAiB,KAAK,QAAQ,SAAS,wBAA0B,GAC/F,OAAIkkJ,IAAkB,IAAS,OAAO,UAAU,eAAe,KAAKlkJ,EAAS,eAAe,KAC1FikJ,EAAa,cAAgBC,GAExBF,EAAW,IAAIl8C,EAAM1oG,EAAO6kJ,CAAY,CACjD,OAAShgJ,EAAO,CACd,eAAQ,KAAK,6CAA6C6jG,CAAI,KAAM7jG,CAAK,EAClE,IACT,CACF,CAEA,iBAAiB6jG,EAAM1oG,EAAOY,EAAU,CAAA,EAAI,CAC1C,OAAO,KAAK,kBAAkB8nG,EAAM1oG,EAAOY,CAAO,CACpD,CAYA,qBAAqB8nG,EAAO,GAAI1iE,EAAQ,KAAMplC,EAAU,GAAI,CAC1D,GAAI,CAAC,KAAK,sBAAuB,OAAO,KACxC,MAAMkB,EAAS,OAAO4mG,GAAQ,EAAE,EAAE,KAAA,EAClC,OAAI5mG,GAAUlB,EAAQ,WAAa,IACjC,KAAK,qBAAqBkB,EAAQ,CAChC,MAAOlB,EAAQ,kBAAoBmiJ,GAAkBjhJ,CAAM,EAC3D,WAAYlB,EAAQ,YAAcuiJ,GAAqBrhJ,CAAM,EAC7D,GAAI,OAAO,UAAU,eAAe,KAAKlB,EAAS,cAAc,EAC5D,CAAE,aAAcA,EAAQ,YAAA,EACxB,CAAA,EACJ,SAAUA,EAAQ,QAAA,CACnB,EAEIwzG,GAAqB,CAC1B,OAAQ,KAAK,OACb,KAAMtyG,EACN,MAAOkkC,GAASplC,EAAQ,gBAAkBkB,EAC1C,KAAMlB,EAAQ,KACd,cAAeA,EAAQ,aAAA,CACxB,CACH,CAEA,qBAAqBw6E,EAAWstB,EAAM9nG,EAAU,CAAA,EAAI,CAClD,GAAI,CAACw6E,GAAa,CAACstB,GAAQ,KAAK,uBAAuB,IAAIttB,CAAS,EAAG,OACvE,KAAK,uBAAuB,IAAIA,CAAS,EACzC,MAAMguD,EAAaxoI,EAAQ,YAAcuiJ,GAAqBz6C,CAAI,EAC5D1iE,EAAQplC,EAAQ,OAASmiJ,GAAkBr6C,CAAI,EAC/CwiC,EAAe,OAAO9vD,EAAU,OAAU,WAAaA,EAAU,QAAUx6E,EAAQ,aACzF,KAAK,kBAAkB8nG,EAAM,CAC3B,MAAA1iE,EACA,WAAAojG,EACA,aAAcxoI,EAAQ,cAAgBsqI,EACtC,SAAU,CAAE,QAAS9vD,EAAU,IAAM,KAAM,GAAIx6E,EAAQ,UAAY,CAAA,CAAC,CAAG,CACxE,EACD,IAAImkJ,EAAoB1B,GAAoBnY,CAAY,EACxD,MAAM3xB,EAAcn+B,EAAU,UAAWp7E,GAAU,CACjD,MAAMglJ,EAAgB3B,GAAoBrjJ,CAAK,EAC3CglJ,IAAkBD,IACtBA,EAAoBC,EACpB,KAAK,iBAAiBt8C,EAAM1oG,EAAO,CACjC,MAAAgmC,EACA,OAAQ,KACR,OAAQplC,EAAQ,QAAU,UAC1B,WAAAwoI,EACA,aAAc,EAAA,CACf,EACH,EAAG,CAAE,UAAW,GAAO,EACvB,KAAK,iBAAiB,IAAI,IAAM7vB,EAAA,CAAa,CAC/C,CAUA,SAAS7hB,EAAO92F,EAAU,GAAI,CAC5B,KAAK,MAAQ82F,EACT,KAAK,YAAW,KAAK,UAAU,QAAQ,MAAQA,GACnD,KAAK,QAAQ,gCAAgC,WAAY92F,CAAO,EAChE,KAAK,QAAQ,0BAA0B82F,CAAK,CAC9C,CASA,YAAY92F,EAAU,GAAI,CACxB,KAAK,SAAS,KAAK,QAAU,OAAS,QAAU,OAAQ,CACtD,OAAQA,EAAQ,QAAU,UAC1B,OAAQA,EAAQ,QAAU,QAC1B,cAAeA,EAAQ,aAAA,CACxB,CACH,CASA,gBAAiB,CACf,MAAMoqG,EAAa,KAAK,cAAc,iBAAA,GAAsB,CAAA,EACtDi6C,EAAiB,KAAK,mBAAmB,0BAAA,GAA+B,CAAA,EAC9E,MAAO,CACL,MAAO,KAAK,MACZ,OAAQj6C,EAAW,QAAU,CAAA,EAC7B,UAAWA,EAAW,WAAa,CAAA,EACnC,UAAWi6C,CAAA,CAEf,CAUA,aAAav5I,EAAQ,GAAI,CACvB,MAAI,CAACA,GAAS,OAAOA,GAAU,SAAiB,MAC5C,OAAOA,EAAM,OAAU,UAAYA,EAAM,OAC3C,KAAK,SAASA,EAAM,MAAO,CAAE,OAAQ,UAAW,OAAQ,gBAAiB,EAE3E,KAAK,cAAc,eAAeA,CAAK,EACvC,KAAK,mBAAmB,wBAAwBA,EAAM,WAAa,CAAA,CAAE,EACrE,KAAK,oBAAA,EACE,KACT,CASA,kBAAmB,CACjB,MAAMmwE,EAAa,CACjB,KAAK,WAAW,YAChB,KAAK,WAAW,wBAAA,GAA2B,MAC3C,KAAK,QAAQ,QAAQ,MAAM,MAC3B,KAAK,QAAQ,MAAM,MACnB,KAAK,WAAW,eAAe,aAAa,WAC5C,WAAW,QAAQ,UAAA,EAErB,UAAW77E,KAAS67E,EAAY,CAC9B,MAAMh5E,EAAQ,OAAO7C,CAAK,EAC1B,GAAI,OAAO,SAAS6C,CAAK,GAAKA,EAAQ,EAAG,OAAOA,CAClD,CACA,MAAO,EACT,CAUA,4BAA4B6I,EAAQ,GAAI,CACtC,MAAMrE,EAAWqE,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EAC9D,YAAK,UAAU,QAAQ,cAAgBrE,EAAS,MAAQ,UACxD,KAAK,UAAU,QAAQ,iBAAmBA,EAAS,mBAAqB,GAAQ,QAAU,OAC1F,KAAK,cAAc,4BAA4B,CAC7C,KAAMA,EAAS,MAAQ,UACvB,SAAUA,EAAS,UAAY,OAC/B,aAAcA,EAAS,eAAiB,GACxC,cAAeA,EAAS,eAAiB,KACzC,QAASA,EAAS,UAAY,EAAA,CAC/B,GACGA,EAAS,UAAY,IAAQA,EAAS,eAAiB,KACzD,KAAK,uBAAuB,IAAI,EAElC,KAAK,0BAA0BA,CAAQ,EACvC,KAAK,uBAAuBA,CAAQ,EAC7B,IACT,CAEA,0BAA0BqE,EAAQ,KAAM,CAItC,MAAM5K,GAHW4K,GAAS,OAAOA,GAAU,SACvCA,EACC,KAAK,mBAAmB,0BAAA,GAA+B,CAAE,KAAM,SAAA,GAC9C,MAAQ,UAC9B,GAAI5K,IAAS,UAAW,CACtB,KAAK,QAAQ,QAAQ,oBAAoB,KAAK,iBAAiB,EAC/D,KAAK,QAAQ,gBAAgB,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAA,CAAG,EACrE,KAAK,QAAQ,gCAAA,EACb,MACF,CAEA,GADA,KAAK,QAAQ,QAAQ,oBAAoB,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAA,CAAG,EAC7EA,IAAS,aAAc,CACzB,KAAK,QAAQ,gBAAgB,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAMuhJ,EAAA,CAAkC,EACpG,KAAK,QAAQ,gCAAA,EACb,MACF,CACA,KAAK,QAAQ,gBAAgB,KAAK,iBAAiB,EACnD,KAAK,QAAQ,gCAAA,CACf,CAEA,mCAAoC,CAClC,MAAM6C,EAAS,IAAM,CACnB,KAAK,mBAAmB,mBAAmB,KAAK,iBAAA,EAAoB,CAAE,OAAQ,GAAM,EACpF,KAAK,oBAAA,CACP,EACI,OAAO,gBAAmB,YAC5B,KAAK,yBAA2B,IAAI,eAAe,IAAMA,GAAQ,EACjE,KAAK,yBAAyB,QAAQ,KAAK,SAAS,GAC3C,OAAO,QAAQ,kBAAqB,aAC7C,OAAO,iBAAiB,SAAUA,CAAM,EACxC,KAAK,iBAAiB,IAAI,IAAM,OAAO,oBAAoB,SAAUA,CAAM,CAAC,GAE9E,KAAK,iBAAiB,IAAI,IAAM,KAAK,0BAA0B,cAAc,EAC7EA,EAAA,CACF,CAEA,qBAAsB,CACpB,KAAK,4BAA4B,KAAK,mBAAmB,0BAA0B,CAAE,oBAAqB,EAAA,CAAM,GAAK,CACnH,SAAU,OACV,KAAM,UACN,iBAAkB,GAClB,aAAc,GACd,cAAe,KACf,QAAS,GACT,aAAc,IAAA,CACf,CACH,CAEA,sCAAuC,CACrC,GAAI,CAAC,KAAK,uBAAyB,CAAC,KAAK,UAAW,OAEpD,MAAM58C,EAAM,KAAK,UAAU,eAAiB,SACtC68C,EAAM78C,EAAI,aAAe,WACzB88C,MAAyB,IACzBC,MAAmB,IACnBC,MAAoB,QACpBC,EAAwB,IAAM,CAClC,MAAM71C,EAAY0E,GAAqB,CACrC,OAAQ,KAAK,OACb,KAAM,EAAA,CACP,EACD,OAAA1E,EAAU,UAAU,IAAI,qCAAqC,EAC7D01C,EAAmB,IAAI11C,CAAS,EAChC,KAAK,iBAAiB,IAAI,IAAM,CAC9B01C,EAAmB,OAAO11C,CAAS,EACnCA,EAAU,UAAA,CACZ,CAAC,EACMA,CACT,EACM81C,EAAuB,IAAM,CACjC,MAAM91C,EAAYpH,EAAI,cAAc,MAAM,EAC1C,OAAAoH,EAAU,UAAY,+FACtBA,EAAU,QAAQ,MAAQ,UAC1BA,EAAU,aAAa,cAAe,MAAM,EACrCA,CACT,EACM+1C,EAAoB,CAAC/1C,EAAWhkG,IAAU,CAC1CgkG,GAAW,SAAS,QAAUhkG,IAAOgkG,EAAU,QAAQ,MAAQhkG,EACrE,EACMg6I,EAAqB,CAACh2C,EAAW1pE,IAAU,CAC/C,MAAM3gC,EAAU,EAAQ2gC,GAAO,gBAAgB,iEAAiE,EAChHy/G,EAAkB/1C,EAAWrqG,EAAU,UAAY,SAAS,CAC9D,EAEMsgJ,EAAeziG,GAAQ,CAE3B,GADI,CAACA,GAAOoiG,EAAc,IAAIpiG,CAAG,GAC7BA,EAAI,gBAAgB,mCAAmC,EAAG,OAE9D,MAAMphD,EADWohD,EAAI,gBAAgB,oCAAoC,GAC9CA,EAAI,gBAAgB,gCAAgC,GAAG,cAClF,GAAI,CAACphD,EAAQ,OACb,MAAM4tG,EAAY61C,EAAA,EAClBzjJ,EAAO,YAAY4tG,CAAS,EAC5B41C,EAAc,IAAIpiG,EAAKwsD,CAAS,CAClC,EAEMk2C,EAAiBhuD,GAAU,CAC/B,GAAI,CAACA,EAAO,OACZ,MAAMiuD,EAAYjuD,EAAM,gBAAgB,gEAAgE,EACxG,GAAI,CAACiuD,EAAW,OAGhB,GAFgCjuD,EAAM,gBAAgB,2EAA2E,GAC5HA,EAAM,gBAAgB,sEAAsE,EACpE,CAC3BiuD,EAAU,gBAAgB,4CAA4C,GAAG,OAAA,EACzE,MACF,CACA,IAAIn2C,EAAYm2C,EAAU,gBAAgB,4CAA4C,EACjFn2C,IACHA,EAAY81C,EAAA,EACZK,EAAU,YAAYn2C,CAAS,GAEjC,MAAMoK,EAAOliB,EAAM,gBAAgB,iCAAiC,EACpEytD,EAAa,IAAIztD,EAAO,CAAE,KAAMA,EAAO,KAAAkiB,EAAM,UAAApK,EAAW,EACxDg2C,EAAmBh2C,EAAWoK,CAAI,CACpC,EAEMgsC,EAAoBC,GAAa,CACrC,GAAI,CAACA,EAAU,OACf,MAAMh5C,EAASg5C,EAAS,gBAAgB,wEAAwE,EAChH,GAAI,CAACh5C,EAAQ,OAIb,GAHkBg5C,EAAS,gBAAgB,0CAA0C,GAC1C,gBAAgB,0EAA0E,GAChIh5C,EAAO,gBAAgB,6CAA6C,EAC5C,CAC3BA,EAAO,gBAAgB,4CAA4C,GAAG,OAAA,EACtE,MACF,CACA,IAAI2C,EAAY3C,EAAO,gBAAgB,4CAA4C,EAC9E2C,IACHA,EAAY81C,EAAA,EACZz4C,EAAO,YAAY2C,CAAS,GAE9B,MAAMoK,EAAOisC,EAAS,gBAAgB,oCAAoC,EAC1EV,EAAa,IAAIU,EAAU,CAAE,KAAMA,EAAU,KAAAjsC,EAAM,UAAApK,EAAW,EAC9Dg2C,EAAmBh2C,EAAWoK,CAAI,CACpC,EAEMksC,EAAmBtsH,GAAS,CAChC,GAAI,GAACA,GAAQA,EAAK,WAAa,GAC/B,CAAIA,EAAK,UAAU,gBAAgB,KAAeA,CAAI,EACtD,UAAWwpB,KAAOxpB,EAAK,mBAAmB,gBAAgB,GAAK,CAAA,IAAgBwpB,CAAG,EAC9ExpB,EAAK,UAAU,kBAAkB,KAAiBA,CAAI,EAC1D,UAAWk+D,KAASl+D,EAAK,mBAAmB,kBAAkB,GAAK,CAAA,IAAkBk+D,CAAK,EACtFl+D,EAAK,UAAU,qBAAqB,KAAoBA,CAAI,EAChE,UAAWqsH,KAAYrsH,EAAK,mBAAmB,qBAAqB,GAAK,CAAA,IAAqBqsH,CAAQ,EACxG,EAEME,EAAqBvsH,GAAS,CAClC,GAAI,GAACA,GAAQA,EAAK,WAAa,GAC/B,WAAWg2E,KAAa,MAAM,KAAK01C,CAAkB,GAC/C1rH,IAASg2E,GAAah2E,EAAK,WAAWg2E,CAAS,KACjD01C,EAAmB,OAAO11C,CAAS,EACnCA,EAAU,UAAA,GAGd,SAAW,CAAC/0F,EAAMurI,CAAM,IAAK,MAAM,KAAKb,EAAa,QAAA,CAAS,GACxD3rH,IAASwsH,EAAO,MAAQxsH,EAAK,WAAWwsH,EAAO,IAAI,IAAGb,EAAa,OAAO1qI,CAAI,EAEtF,EAEMwrI,EAAgB,IAAM,CAC1B,KAAK,2BAA6B,KAClC,SAAW,CAACxrI,EAAMurI,CAAM,IAAK,MAAM,KAAKb,EAAa,QAAA,CAAS,EAAG,CAC/D,GAAI,CAACa,EAAO,MAAM,YAAa,CAC7Bb,EAAa,OAAO1qI,CAAI,EACxB,QACF,CACA+qI,EAAmBQ,EAAO,UAAWA,EAAO,IAAI,CAClD,CACF,EAEME,EAAW,IAAM,CACjB,KAAK,4BAA8B,OACvC,KAAK,2BAA6BjB,EAAI,wBAAwBgB,CAAa,GACtEhB,EAAI,aAAagB,EAAe,CAAC,EACxC,EAEAH,EAAgB,KAAK,SAAS,EAC9BI,EAAA,EACI,OAAOjB,EAAI,kBAAqB,aAClC,KAAK,8BAAgC,IAAIA,EAAI,iBAAkBkB,GAAc,CAC3E,UAAWC,KAAYD,EAAW,CAChC,UAAW3sH,KAAQ4sH,EAAS,cAAgB,CAAA,IAAsB5sH,CAAI,EACtE,UAAWA,KAAQ4sH,EAAS,YAAc,CAAA,IAAoB5sH,CAAI,CACpE,CACA0sH,EAAA,CACF,CAAC,EACD,KAAK,8BAA8B,QAAQ,KAAK,UAAW,CACzD,UAAW,GACX,QAAS,EAAA,CACV,EACD,KAAK,iBAAiB,IAAI,IAAM,KAAK,+BAA+B,cAAc,GAEpF,MAAMvsG,EAAU,KAAK,QAAQ,SAAW,KACxCA,GAAS,mBAAmB,SAAUusG,CAAQ,EAC9C,KAAK,iBAAiB,IAAI,IAAM,CAC9BvsG,GAAS,sBAAsB,SAAUusG,CAAQ,CACnD,CAAC,EACD,KAAK,iBAAiB,IAAI,IAAM,CAC1B,KAAK,4BAA8B,OACvCjB,EAAI,uBAAuB,KAAK,0BAA0B,EAC1DA,EAAI,eAAe,KAAK,0BAA0B,EAClD,KAAK,2BAA6B,KACpC,CAAC,CACH,CAEA,wBAAyB,CACvB,MAAM78C,EAAM,KAAK,WAAW,eAAiB,SACvCi+C,EAAUj+C,EAAI,cAAc,KAAK,EACvCi+C,EAAQ,UAAY,8BAEpB,MAAMC,EAAoBl+C,EAAI,cAAc,QAAQ,EACpDk+C,EAAkB,KAAO,SACzBA,EAAkB,UAAY,kCAC9BA,EAAkB,aAAa,aAAc,qCAAqC,EAClFA,EAAkB,aAAa,QAAS,qCAAqC,EAC7EA,EAAkB,iBAAiB,QAAS,IAAM,CAChD,KAAK,mBAAmB,iBAAA,CAC1B,CAAC,EAED,MAAMC,EAAgBn+C,EAAI,cAAc,KAAK,EAC7Cm+C,EAAc,UAAY,qCAE1B,MAAMC,EAAiBp+C,EAAI,cAAc,QAAQ,EACjDo+C,EAAe,KAAO,SACtBA,EAAe,UAAY,yFAC3BA,EAAe,iBAAiB,QAAS,IAAM,CACxB,KAAK,mBAAmB,eAAA,IAAqB,IAEhE,KAAK,mBAAmB,uBAAA,EACxB,KAAK,mBAAmB,qBAAA,EACxB,KAAK,uBAAuB,IAAI,GAEhC,KAAK,mBAAmB,sBAAA,CAE5B,CAAC,EAED,MAAMC,EAAqBr+C,EAAI,cAAc,KAAK,EAClDq+C,EAAmB,UAAY,iCAE/BF,EAAc,YAAYC,CAAc,EACxCD,EAAc,YAAYE,CAAkB,EAE5C,MAAMC,EAAet+C,EAAI,cAAc,KAAK,EAC5Cs+C,EAAa,UAAY,0BAEzB,MAAMC,EAAav+C,EAAI,cAAc,KAAK,EAC1Cu+C,EAAW,UAAY,gCAEvB,MAAMC,EAAgBx+C,EAAI,cAAc,KAAK,EAC7Cw+C,EAAc,UAAY,mCAE1B,MAAMC,EAAez+C,EAAI,cAAc,QAAQ,EAC/Cy+C,EAAa,KAAO,SACpBA,EAAa,UAAY,mBACzBA,EAAa,YAAc,SAC3BA,EAAa,iBAAiB,QAAS,SAAY,CACjD,MAAMC,EAAS,KAAK,mBAAmB,eAAA,GAAoB,KAC3D,IAAIC,EAAW,MAAM,QAAQD,GAAQ,QAAQ,EAAIA,EAAO,SAAS,OAAQh5H,GAAUA,GAAO,EAAE,EAAI,CAAA,EAEhG,MAAMk5H,EADU,KAAK,QAAQ,SAAW,KAKxC,GAHID,EAAS,QAAU,GAAK,OAAOC,GAAc,mBAAsB,aACrED,EAAW,MAAMC,EAAa,kBAAkB,CAAE,MAAO,EAAG,GAE1DD,EAAS,OAAS,EAAG,CACvBE,EAAiBF,CAAQ,EACzBG,EAAW,OAAS,GACpB,MACF,CACA,KAAK,mBAAmB,gBAAA,CAC1B,CAAC,EAED,MAAMA,EAAa9+C,EAAI,cAAc,KAAK,EAC1C8+C,EAAW,UAAY,gCACvBA,EAAW,OAAS,GAEpB,MAAMD,EAAmB,CAACF,EAAW,KAAO,CAC1CG,EAAW,gBAAA,EACX,QAASl+I,EAAI,EAAGA,EAAI+9I,EAAS,OAAQ/9I,GAAK,EAAG,CAC3C,MAAMm+I,EAAUJ,EAAS/9I,CAAC,EACpBotE,EAAOgyB,EAAI,cAAc,QAAQ,EACvChyB,EAAK,KAAO,SACZA,EAAK,UAAY,qCACjBA,EAAK,QAAQ,UAAY+wE,EAAQ,GACjC/wE,EAAK,YAAc,KAAK,0BAA0B+wE,EAASn+I,CAAC,EAC5DotE,EAAK,iBAAiB,QAAS,SAAY,CACzC8wE,EAAW,OAAS,GACpBR,EAAa,OAAS,GACtBtwE,EAAK,SAAW,GAChB,GAAI,CACF,MAAO,KAAK,mBAAmB,gBAAgB,CAAE,UAAW+wE,EAAQ,EAAA,CAAI,GACnE,KAAK,QAAQ,SAAS,gBAAgBA,EAAQ,EAAE,EACvD,QAAA,CACE/wE,EAAK,SAAW,EAClB,CACF,CAAC,EACD8wE,EAAW,YAAY9wE,CAAI,CAC7B,CACF,EACA8wE,EAAW,uBAAyBD,EAEpC,MAAMG,EAAch/C,EAAI,cAAc,QAAQ,EAC9C,OAAAg/C,EAAY,KAAO,SACnBA,EAAY,UAAY,mBACxBA,EAAY,YAAc,cAC1BA,EAAY,iBAAiB,QAAS,SAAY,CAChDF,EAAW,OAAS,GACpBR,EAAa,OAAS,GACtBU,EAAY,SAAW,GACvB,GAAI,CACF,MAAM,KAAK,mBAAmB,aAAA,CAChC,QAAA,CACEA,EAAY,SAAW,EACzB,CACF,CAAC,EAEDR,EAAc,YAAYC,CAAY,EACtCD,EAAc,YAAYQ,CAAW,EACrCV,EAAa,YAAYC,CAAU,EACnCD,EAAa,YAAYE,CAAa,EACtCF,EAAa,YAAYQ,CAAU,EAEnCb,EAAQ,YAAYC,CAAiB,EACrCD,EAAQ,YAAYE,CAAa,EACjCF,EAAQ,YAAYK,CAAY,EAChC,KAAK,UAAU,YAAYL,CAAO,EAE3B,CACL,QAAAA,EACA,kBAAAC,EACA,cAAAC,EACA,eAAAC,EACA,mBAAAC,EACA,aAAAC,EACA,WAAAC,EACA,WAAAO,CAAA,CAEJ,CAEA,0BAA0BC,EAAS/zI,EAAQ,EAAG,CAC5C,MAAMxO,EAAY,OAAOuiJ,GAAS,SAAS,EACrCE,EAAO,OAAO,SAASziJ,CAAS,GAAKA,EAAY,EACnD,IAAI,KAAKA,CAAS,EAAE,eAAe,OAAW,CAC9C,MAAO,QACP,IAAK,UACL,KAAM,UACN,OAAQ,SAAA,CACT,EACC,eACJ,OAAIwO,IAAU,EAAU,YAAYi0I,CAAI,GAEjC,GADO,OAAOF,GAAS,OAASA,GAAS,IAAM,WAAW/zI,EAAQ,CAAC,EAAE,EAAE,KAAA,GAAU,WAAWA,EAAQ,CAAC,EAC7F,MAAMi0I,CAAI,EAC3B,CAEA,uBAAuB77I,EAAQ,GAAI,CACjC,MAAMrE,EAAWqE,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EACxD87I,EAAS,KAAK,iBACpB,GAAI,CAACA,EAAQ,OAEbA,EAAO,QAAQ,QAAQ,KAAOngJ,EAAS,MAAQ,UAC/CmgJ,EAAO,kBAAkB,OAASngJ,EAAS,OAAS,UACpDmgJ,EAAO,cAAc,OAASngJ,EAAS,OAAS,aAChDmgJ,EAAO,eAAe,OAASngJ,EAAS,OAAS,aACjDmgJ,EAAO,kBAAkB,QAAQ,KAAOngJ,EAAS,WAAa,QAAU,QAAU,OAClFmgJ,EAAO,kBAAkB,aACvB,aACAngJ,EAAS,WAAa,QAAU,6BAA+B,6BAAA,EAEjEmgJ,EAAO,kBAAkB,aACvB,QACAngJ,EAAS,WAAa,QAAU,6BAA+B,6BAAA,EAEjEmgJ,EAAO,kBAAkB,gBACvB1D,GACE,KAAK,WAAW,eAAiB,SACjCz8I,EAAS,WAAa,QAAU,YAAc,YAAA,CAChD,EAEFmgJ,EAAO,eAAe,aAAa,aAAcngJ,EAAS,eAAiB,GAAO,iBAAmB,eAAe,EACpHmgJ,EAAO,eAAe,aAAa,QAASngJ,EAAS,eAAiB,GAAO,iBAAmB,eAAe,EAC/GmgJ,EAAO,eAAe,gBACpB1D,GACE,KAAK,WAAW,eAAiB,SACjCz8I,EAAS,eAAiB,GAAO,QAAU,UAAA,CAC7C,EAEF,KAAK,0BAA0BA,CAAQ,EAEvC,MAAM2/I,EAASrE,GAAwB,KAAK,MAAM,GAAK,CAAC,KAAK,QAAQ,SAAS,mBACzEt7I,EAAS,cAAgB,KAC1B,KAEJ,GADAmgJ,EAAO,aAAa,OAAS,CAACR,GAAQ,QAClCA,GAAQ,QAAS,CACnB,MAAMpyF,EAAaoyF,EAAO,eAAe,MAAQA,EAAO,eAAe,UAAY,mBAC7EC,EAAW,MAAM,QAAQD,EAAO,QAAQ,EAAIA,EAAO,SAAS,OAAQh5H,GAAUA,GAAO,EAAE,EAAI,CAAA,EACjGw5H,EAAO,WAAW,YAAcP,EAAS,OAAS,EAC9C,6BACA,gCAAgCryF,CAAU,IAC1C4yF,EAAO,aACTA,EAAO,WAAW,OAAS,GAC3BA,EAAO,WAAW,yBAAyBP,CAAQ,EAEvD,MAAWO,EAAO,aAChBA,EAAO,WAAW,OAAS,GAC3BA,EAAO,WAAW,gBAAA,EAEtB,CAEA,0BAA2B,CACzB,MAAMC,EAAU,KAAK,cAAgB,KACrC,GAAI,CAACA,EAAS,MAAO,CAAA,EACrB,MAAMhkG,EAAU,CAAA,EACVukC,MAAW,IACX0/D,EAAcxY,GAAc,CAChC,UAAWntI,KAAW,MAAM,KAAKmtI,GAAW,UAAY,CAAA,CAAE,EAAG,CAC3D,MAAMnmC,EAAUhnG,GAAS,SAAS,QAClC,GAAI,CAACgnG,GAAW/gB,EAAK,IAAI+gB,CAAO,EAAG,SACnC,MAAMnR,EAAQ6vD,EAAQ,WAAW1+C,CAAO,GAAK,KACxCnR,IACL5P,EAAK,IAAI+gB,CAAO,EAChBtlD,EAAQ,KAAKm0C,CAAK,EACpB,CACF,EACA8vD,EAAWD,EAAQ,cAAc,EACjCC,EAAWD,EAAQ,QAAQ,EAC3BC,EAAWD,EAAQ,SAAS,EAC5B,UAAW7vD,KAAS6vD,EAAQ,YAAA,GAAiB,CAAA,EACvC,CAAC7vD,GAAO,IAAM5P,EAAK,IAAI4P,EAAM,EAAE,IACnC5P,EAAK,IAAI4P,EAAM,EAAE,EACjBn0C,EAAQ,KAAKm0C,CAAK,GAEpB,OAAOn0C,CACT,CAEA,0BAA0B/3C,EAAQ,GAAI,CAEpC,MAAMi8I,EADS,KAAK,kBACA,mBACpB,GAAI,CAACA,EAAK,OACV,MAAMtgJ,EAAWqE,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EACxDo8E,EAAUzgF,EAAS,OAAS,cAAgBA,EAAS,eAAiB,GAE5E,GADAsgJ,EAAI,OAAS,CAAC7/D,EACV,CAACA,EAAS,CACZ6/D,EAAI,gBAAA,EACJ,MACF,CAEA,MAAMr/C,EAAM,KAAK,WAAW,eAAiB,SACvCq1B,EAAU,KAAK,yBAAA,EAA2B,IAAK/lC,GAAU,CAC7D,MAAM4d,EAASlN,EAAI,cAAc,QAAQ,EACzC,OAAAkN,EAAO,KAAO,SACdA,EAAO,UAAY,0DACnBA,EAAO,QAAQ,QAAU5d,EAAM,GAC/B4d,EAAO,QAAQ,OAASnuG,EAAS,gBAAkBuwF,EAAM,GAAK,OAAS,QACvE4d,EAAO,aAAa,aAAc,WAAW5d,EAAM,KAAK,EAAE,EAC1D4d,EAAO,aAAa,QAAS5d,EAAM,KAAK,EACxC4d,EAAO,YACLnN,GAAgBC,EAAK,CAAE,GAAI1Q,EAAM,GAAI,MAAOA,EAAM,KAAA,EAAS,CAAE,UAAW,uCAAwC,CAAA,EAElH4d,EAAO,iBAAiB,QAAS,IAAM,CACrC,KAAK,uBAAuB5d,EAAM,EAAE,CACtC,CAAC,EACM4d,CACT,CAAC,EACDmyC,EAAI,gBAAgB,GAAGhqB,CAAO,CAChC,CAEA,uBAAuB50B,EAAS,CAC9B,MAAMnR,EAAQ,KAAK,cAAc,WAAWmR,CAAO,GAAK,KACxD,GAAI,CAACnR,EAAO,QACR,OAAOA,EAAM,WAAc,YAAcA,EAAM,aAExCA,EAAM,SAAS,SAAS,YAAc,SAC/CA,EAAM,eAAe,EAAK,EAE5B,KAAK,mBAAmB,qBAAA,EACxB,KAAK,uBAAuB,IAAI,EAChC,MAAMgwD,EAAW,KAAK,cAAc,gBAAkB,KAChDC,EAAgB,KAAK,gCAAgCjwD,EAAOgwD,CAAQ,EAC1E,KAAK,iCAAiChwD,EAAO,CAAE,SAAAgwD,EAAU,cAAAC,EAAe,EACxEjwD,EAAM,SAAS,iBAAiB,CAAE,MAAO,QAAS,SAAU,SAAU,CACxE,CAEA,gCAAgCA,EAAOgwD,EAAU,CAC/C,GAAI,CAAChwD,GAAO,SAAS,uBAAyB,CAACgwD,GAAU,sBAAuB,MAAO,GACvF,MAAM/9C,EAAYjS,EAAM,QAAQ,sBAAA,EAC1BkwD,EAAeF,EAAS,sBAAA,EAE9B,GADI,CAAC,OAAO,SAAS/9C,GAAW,GAAG,GAAK,CAAC,OAAO,SAASA,GAAW,MAAM,GACtE,CAAC,OAAO,SAASi+C,GAAc,GAAG,GAAK,CAAC,OAAO,SAASA,GAAc,MAAM,EAAG,MAAO,GAC1F,MAAMv5H,EAAY,EAClB,OAAOs7E,EAAU,IAAMi+C,EAAa,IAAMv5H,GAAas7E,EAAU,OAASi+C,EAAa,OAASv5H,CAClG,CAEA,iCAAiCqpE,EAAOh3F,EAAU,GAAI,CACpD,KAAK,+BAAA,EACL,KAAM,CAAE,SAAAgnJ,EAAW,KAAM,cAAAC,EAAgB,IAAUjnJ,EACnD,GAAI,CAACinJ,GAAiB,CAACD,GAAY,OAAOA,EAAS,kBAAqB,WAAY,CAClF,KAAK,4BAA4BhwD,CAAK,EACtC,MACF,CACA,MAAMmwD,EAAQ,KAAK,WAAW,eAAe,aAAe,WAC5D,IAAIC,EAAc,KAClB,MAAMl5F,EAAS,IAAM,CACnBmmD,EAAA,EACA,KAAK,4BAA4Brd,CAAK,CACxC,EACMqwD,EAAiB,CAACzjJ,EAAQ,MAAQ,CAClCwjJ,GAAe,MAAMD,EAAM,eAAeC,CAAW,EACzDA,EAAcD,EAAM,aAAaj5F,EAAQtqD,CAAK,GAAK,IACrD,EACM0jJ,EAAW,IAAM,CACrBD,EAAe,GAAG,CACpB,EACMhzC,EAAU,IAAM,CAChB+yC,GAAe,OACjBD,EAAM,eAAeC,CAAW,EAChCA,EAAc,MAEhBJ,EAAS,sBAAsB,SAAUM,CAAQ,EAC7C,KAAK,0BAA0B,UAAYjzC,SAAc,yBAA2B,KAC1F,EACA,KAAK,yBAA2B,CAAE,QAAAA,CAAA,EAClC2yC,EAAS,iBAAiB,SAAUM,CAAQ,EAC5CD,EAAe,GAAG,CACpB,CAEA,gCAAiC,CAC/B,KAAK,0BAA0B,UAAA,EAC/B,KAAK,yBAA2B,IAClC,CAEA,4BAA4BrwD,EAAO,CACjC,MAAMmV,EAASnV,GAAO,QAAUA,GAAO,SAAS,gBAAgB,0BAA0B,GAAK,KAC/F,GAAI,CAACmV,GAAQ,QAAS,OACjB,KAAK,0BAAyB,KAAK,4BAA8B,SACtE,MAAMo7C,EAAgB,KAAK,wBAAwB,IAAIp7C,CAAM,EACzDo7C,GAAiB,OACL,KAAK,WAAW,eAAe,aAAe,YACtD,eAAeA,CAAa,EAEpCp7C,EAAO,QAAQ,SAAW,OAE1B,MAAMq7C,GADQ,KAAK,WAAW,eAAe,aAAe,YACxC,aAAa,IAAM,CACjCr7C,GAAQ,SAAS,OAAOA,EAAO,QAAQ,SAC3C,KAAK,yBAAyB,SAASA,CAAM,CAC/C,EAAG,IAAI,EACHq7C,GAAS,MAAM,KAAK,wBAAwB,IAAIr7C,EAAQq7C,CAAK,CACnE,CAEA,2BAA2BtmJ,EAAQ,CAEjC,GADI,CAACA,GAAU,OAAOA,EAAO,SAAY,YACrC,CAAC,KAAK,+BAA+BA,CAAM,EAAG,OAAO,KACzD,MAAMumJ,EAAavmJ,EAAO,QAAQ,yEAAyE,EAC3G,GAAIumJ,EAAY,OAAOA,EACvB,MAAMC,EAAUxmJ,EAAO,QAAQ,iCAAiC,GAAG,SAAS,sBAC5E,OAAKwmJ,EACE,KAAK,WAAW,gBAAgB,mCAAmCA,CAAO,IAAI,GAAK,KADrE,IAEvB,CAEA,+BAA+BxmJ,EAAQ,CAErC,GADI,CAACA,GAAU,OAAOA,EAAO,SAAY,YACrCA,EAAO,QAAQ,sCAAsC,EAAG,MAAO,GACnE,GAAIA,EAAO,QAAQ,uCAAuC,EAAG,MAAO,GAEpE,MAAMktH,EAAUltH,EAAO,QAAQ,+EAA+E,EAE9G,GADI,CAACktH,GACDA,EAAQ,QAAQ,sCAAsC,EAAG,MAAO,GACpE,GAAIA,EAAQ,UAAY,QAAS,CAC/B,MAAM3vG,EAAO,OAAO2vG,EAAQ,eAAe,MAAM,GAAKA,EAAQ,MAAQ,EAAE,EAAE,YAAA,EAC1E,GAAI3vG,IAAS,UAAYA,IAAS,UAAYA,IAAS,SAAWA,IAAS,OAAQ,MAAO,EAC5F,CACA,MAAO,EACT,CAEA,sBAAsBvd,EAAQkkC,EAAQ,KAAM,CAC1C,MAAMuiH,EAAkBzmJ,GAAQ,UAAU,2BAA2B,GAAG,SAAS,iBACjF,GAAIymJ,EAAiB,OAAOA,EAC5B,MAAMx/C,EAAU/iE,GAAO,UAAU,kBAAkB,GAAG,SAAS,SAC1DlkC,GAAQ,UAAU,kBAAkB,GAAG,SAAS,SAChD,KACL,OAAO,OAAOinG,GAAY,UAAYA,EAAUA,EAAU,IAC5D,CAEA,kCAAmC,CACjC,MAAMy/C,EAAO,KAAK,UAClB,GAAI,CAACA,GAAM,iBAAkB,OAE7B,MAAMC,EAAYpmJ,GAAU,CAC1B,MAAM2jC,EAAQ,KAAK,2BAA2B3jC,GAAO,MAAM,EAC3D,GAAI,CAAC2jC,EAAO,OACZ,KAAK,uBAAuBA,CAAK,EACjC,MAAM+iE,EAAU,KAAK,sBAAsB1mG,GAAO,OAAQ2jC,CAAK,EAC3D+iE,GAAS,KAAK,mBAAmB,kBAAkBA,CAAO,CAChE,EACM2/C,EAA2BrmJ,GAAU,CAKrCA,GAAO,cAAgB,SAC3BomJ,EAASpmJ,CAAK,CAChB,EACMsmJ,EAAU,IAAM,CACpB,KAAK,iCAAA,CACP,EACMC,EAAqB,IAAM,CAC3B,KAAK,wBAA0B,OACjC,aAAa,KAAK,sBAAsB,EACxC,KAAK,uBAAyB,MAEhC,KAAK,uBAAuB,IAAI,EAChC,KAAK,mBAAmB,qBAAA,CAC1B,EAEAJ,EAAK,iBAAiB,cAAeE,EAAyB,CAAE,QAAS,GAAM,EAC/EF,EAAK,iBAAiB,UAAWC,CAAQ,EACzCD,EAAK,iBAAiB,QAASC,CAAQ,EACvCD,EAAK,iBAAiB,SAAUC,CAAQ,EACxCD,EAAK,iBAAiB,QAASC,CAAQ,EACvCD,EAAK,iBAAiB,YAAaG,EAAS,CAAE,QAAS,GAAM,EAC7DH,EAAK,iBAAiB,gBAAiBI,EAAoB,CAAE,QAAS,GAAM,EAC5EJ,EAAK,iBAAiB,SAAUI,EAAoB,CAAE,QAAS,GAAM,EACrEJ,EAAK,iBAAiB,SAAUG,CAAO,EACvCH,EAAK,iBAAiB,WAAYG,CAAO,EAEzC,KAAK,iBAAiB,IAAI,IAAM,CAC9BH,EAAK,oBAAoB,cAAeE,EAAyB,CAAE,QAAS,GAAM,EAClFF,EAAK,oBAAoB,UAAWC,CAAQ,EAC5CD,EAAK,oBAAoB,QAASC,CAAQ,EAC1CD,EAAK,oBAAoB,SAAUC,CAAQ,EAC3CD,EAAK,oBAAoB,QAASC,CAAQ,EAC1CD,EAAK,oBAAoB,YAAaG,EAAS,CAAE,QAAS,GAAM,EAChEH,EAAK,oBAAoB,gBAAiBI,EAAoB,CAAE,QAAS,GAAM,EAC/EJ,EAAK,oBAAoB,SAAUI,EAAoB,CAAE,QAAS,GAAM,EACxEJ,EAAK,oBAAoB,SAAUG,CAAO,EAC1CH,EAAK,oBAAoB,WAAYG,CAAO,CAC9C,CAAC,CACH,CAEA,uBAAuB3iH,EAAO,CACxB,KAAK,sBAAwBA,IAC7B,KAAK,qBAAqB,SAC5B,OAAO,KAAK,oBAAoB,QAAQ,mBAE1C,KAAK,oBAAsBA,GAAS,KAChC,KAAK,qBAAqB,SAC5B,KAAK,oBAAoB,QAAQ,mBAAqB,OAClD,KAAK,WAAW,UAAS,KAAK,UAAU,QAAQ,oBAAsB,QACjE,KAAK,WAAW,SACzB,OAAO,KAAK,UAAU,QAAQ,oBAElC,CAEA,kCAAmC,CAC7B,KAAK,wBAA0B,MACjC,aAAa,KAAK,sBAAsB,EAE1C,KAAK,uBAAyB,WAAW,IAAM,CAC7C,KAAK,uBAAyB,KAC9B,KAAK,uBAAuB,IAAI,EAChC,KAAK,mBAAmB,qBAAA,CAC1B,EAAGo8G,EAA4B,CACjC,CAWA,mBAAmByG,EAAcjoJ,EAAU,GAAI,CAC7C,GAAI,CAAC,KAAK,OACR,MAAM,IAAI,MAAM,wDAAwD,EAE1E,MAAMwrF,EAAW,KAAK,OAAOy8D,CAAY,EACzC,GAAI,OAAOz8D,GAAa,WACtB,MAAM,IAAI,MAAM,2CAA2Cy8D,CAAY,KAAK,EAE9E,MAAM7yE,EAAO,OAAO,KAAK,OAAO,eAAkB,WAC7C,KAAK,OAAO,cAAc6yE,CAAY,GAAK,KAC5C,KACEr8I,EAASwpE,EAAO,CAAE,GAAGA,EAAM,GAAGp1E,GAAYA,EAC1C+xG,EAAYnmG,EAAO,YAAcq8I,IAAiB,aAAe,aAAeA,GAChFvb,EAAkBsV,GAAqBiG,CAAY,GAAKjG,GAAqBjwC,CAAS,GAAK,KAC3Fm2C,EAAmB,KAAK,4BAA4Bxb,EAAiB,CACzE,GAAG9gI,EACH,GAAIA,EAAO,IAAM,UAAUmmG,CAAS,GACpC,MAAOnmG,EAAO,OAASguG,GAAqBquC,CAAY,EACxD,KAAM,CAAE,OAAQ,SAAU,SAAUA,EAAc,UAAAl2C,EAAW,GAAGnmG,EAAO,IAAA,CAAK,CAC7E,EACD,GAAIs8I,EAAkB,OAAOA,EAC7B,MAAM12I,EAAK5F,EAAO,IAAM,UAAUmmG,CAAS,GACrCjtF,EAAQlZ,EAAO,OAASguG,GAAqBquC,CAAY,EACzDjkF,EAAep4D,EAAO,cAAgB,KACtC6S,EAAO7S,EAAO,MAAQ,SACtBu8I,EAAiBjpG,GAAYA,EAAQ,CACzC,GAAA1tC,EACA,MAAAsT,EACA,SAAU,GAAQlZ,EAAO,UAAY,IACrC,IAAKA,EAAO,KAAO,KACnB,IAAKA,EAAO,KAAO,KACnB,KAAMA,EAAO,MAAQ,KACrB,OAAQA,EAAO,QAAU,KACzB,iBAAkBA,EAAO,kBAAoB,KAC7C,KAAM,CAAE,OAAQ,SAAU,SAAUq8I,EAAc,UAAAl2C,EAAW,GAAGnmG,EAAO,IAAA,EACvE,IAAK,IAAM,CACT,MAAMxM,EAAQosF,EAAS,KAAK,KAAK,MAAM,EACvC,OAAOpsF,GAAgB4kE,CACzB,EACA,IAAM5kE,GAAUosF,EAAS,KAAK,KAAK,OAAQpsF,CAAK,CAAA,CACjD,EACKo7E,EACF2tE,EADc1pI,IAAS,UACTivF,GAAY,QAC1BjvF,IAAS,SACOivF,GAAY,OACZA,GAAY,MAHK,EAIrC,YAAK,qBAAqB,IAAIl8F,EAAIgpE,CAAS,EACvCkyD,GACF,KAAK,qBAAqBlyD,EAAWkyD,EAAiB,CACpD,MAAO9gI,EAAO,kBAAoBu2I,GAAkBzV,CAAe,EACnE,WAAY9gI,EAAO,uBAAyB22I,GAAqB7V,CAAe,EAChF,aAAA1oE,EACA,SAAU,CAAE,SAAUikF,EAAc,UAAAl2C,CAAA,CAAU,CAC/C,EAEH,KAAK,6BAAA,EACEv3B,CACT,CAYA,qBAAqB4tE,EAAUH,EAAcjoJ,EAAU,CAAA,EAAI,CACzD,GAAI,CAACooJ,GAAY,OAAOA,IAAWH,CAAY,GAAM,WACnD,MAAM,IAAI,MAAM,oCAAoCA,CAAY,KAAK,EAEvE,MAAM7yE,EAAO,OAAO,KAAK,QAAQ,eAAkB,WAC9C,KAAK,OAAO,cAAc6yE,CAAY,GAAK,KAC5C,KACEr8I,EAASwpE,EAAO,CAAE,GAAGA,EAAM,GAAGp1E,GAAYA,EAC1CwR,EAAK5F,EAAO,IAAM,mBAAmBw8I,EAAS,IAAM,UAAU,IAAIH,CAAY,GAC9EnjI,EAAQlZ,EAAO,OAASguG,GAAqBquC,CAAY,EACzDI,EAAa,OAAOD,EAAS,IAAM,UAAU,EAC7CE,EAAwBtG,GAAqBiG,CAAY,GAAK,KAC9Dvb,EAAkB9gI,EAAO,iBAAmB08I,GAAyB,aAAaD,CAAU,IAAIJ,CAAY,GAC5GC,EAAmB,KAAK,4BAA4Bxb,EAAiB,CACzE,GAAG9gI,EACH,GAAA4F,EACA,MAAAsT,EACA,KAAM,CAAE,OAAQ,WAAY,SAAUsjI,EAAS,IAAM,KAAM,SAAUH,EAAc,GAAGr8I,EAAO,IAAA,CAAK,CACnG,EACD,GAAIs8I,EAAkB,OAAOA,EAC7B,MAAMlkF,EAAep4D,EAAO,cAAgB,KACtC6S,EAAO7S,EAAO,MAAQ,SACtBu8I,EAAiBjpG,GAAYA,EAAQ,CACzC,GAAA1tC,EACA,MAAAsT,EACA,SAAU,GAAQlZ,EAAO,UAAY,IACrC,IAAKA,EAAO,KAAO,KACnB,IAAKA,EAAO,KAAO,KACnB,KAAMA,EAAO,MAAQ,KACrB,OAAQA,EAAO,QAAU,KACzB,iBAAkBA,EAAO,kBAAoB,KAC7C,KAAM,CAAE,OAAQ,WAAY,SAAUw8I,EAAS,IAAM,KAAM,SAAUH,EAAc,GAAGr8I,EAAO,IAAA,EAC7F,IAAK,IAAM,CACT,MAAMxM,EAAQgpJ,EAASH,CAAY,EAAA,EACnC,OAAO7oJ,GAAgB4kE,CACzB,EACA,IAAM5kE,GAAUgpJ,EAASH,CAAY,EAAE7oJ,CAAK,CAAA,CAC7C,EACKo7E,EACF2tE,EADc1pI,IAAS,UACTivF,GAAY,QAC1BjvF,IAAS,SACOivF,GAAY,OACZA,GAAY,MAHK,EAIrC,KAAK,qBAAqBlzB,EAAWkyD,EAAiB,CACpD,MAAO9gI,EAAO,mBAAqBy8I,IAAe,aAAeA,IAAe,WAAa,OAAS,WACtG,WAAYz8I,EAAO,uBAAyBq2I,GAC5C,aAAAj+E,EACA,SAAU,CAAE,SAAUqkF,EAAY,SAAUJ,CAAA,CAAa,CAC1D,EACD,MAAMtvC,EAAcyvC,EAAS,KAAK,SAAU,IAAM5tE,EAAU,OAAA,CAAQ,IAAM,IAAM,CAAC,GACjF,YAAK,iBAAiB,IAAI,IAAMm+B,EAAA,CAAa,EACtCn+B,CACT,CAEA,4BAA4BstB,EAAM9nG,EAAU,GAAI,CAC9C,MAAMozG,EAAe,KAAK,QAAQ,QAAU,KACtClyG,EAAS,OAAO4mG,GAAQ,EAAE,EAAE,KAAA,EAClC,GAAI,CAAC5mG,GAAU,OAAOkyG,GAAc,OAAU,YAAc,OAAOA,GAAc,KAAQ,WAAY,OAAO,KAC5G,MAAMhmF,EAAQgmF,EAAa,MAAMlyG,CAAM,EACvC,GAAI,CAACksB,EAAO,OAAO,KACnB,MAAM84F,EAAK94F,EAAM,IAAM,CAAA,EACjB3O,EAAO2O,EAAM,OAAS,UACxB,UACCA,EAAM,OAAS,UAAYA,EAAM,OAAS,OAAS,SAAW,SAC7D42C,EAAe,OAAO,UAAU,eAAe,KAAKhkE,EAAS,cAAc,EAC7EA,EAAQ,aACRotB,EAAM,QACJ6Z,EAAO,CACX,WAAY/lC,EACZ,GAAIlB,EAAQ,MAAQ,CAAA,CAAC,EAEnBkmH,EAAG,UAAY,OAAMj/E,EAAK,SAAWi/E,EAAG,UACxCA,EAAG,UAAY,OAAMj/E,EAAK,SAAWi/E,EAAG,UAC5C,MAAMqiC,EAAmB,CACvB,GAAIvoJ,EAAQ,IAAMotB,EAAM,KAAOlsB,EAC/B,MAAOglH,EAAG,OAASlmH,EAAQ,OAAS45G,GAAqBxsF,EAAM,KAAOlsB,CAAM,EAC5E,SAAU,GAAQlB,EAAQ,UAAY,IACtC,IAAKA,EAAQ,KAAOkmH,EAAG,KAAOA,EAAG,WAAa,KAC9C,IAAKlmH,EAAQ,KAAOkmH,EAAG,KAAOA,EAAG,WAAa,KAC9C,KAAMlmH,EAAQ,MAAQkmH,EAAG,MAAQ,KACjC,OAAQlmH,EAAQ,QAAU,KAC1B,iBAAkBA,EAAQ,mBACxB,OAAO,SAAS,OAAOkmH,EAAG,SAAS,CAAC,GAAK,OAAO,SAAS,OAAOA,EAAG,SAAS,CAAC,EACzE,CAAE,IAAK,OAAOA,EAAG,SAAS,EAAG,IAAK,OAAOA,EAAG,SAAS,CAAA,EACrD,MAEN,KAAAj/E,EACA,IAAK,IAAM,CACT,MAAM7nC,EAAQg0G,EAAa,IAAIlyG,EAAQ8iE,CAAY,EACnD,OAAO5kE,GAAgB4kE,CACzB,EACA,IAAM5kE,GAAU,CACdg0G,EAAa,IAAIlyG,EAAQ9B,EAAO,CAC9B,OAAQ,KACR,OAAQY,EAAQ,QAAU,UAC1B,SAAUA,EAAQ,SAClB,WAAYye,IAAS,UAAY,EAAIze,EAAQ,sBAC7C,QAAS,EAAA,CACV,CACH,CAAA,EAEIw6E,EAAY/7D,IAAS,UACvBivF,GAAY,QAAQ66C,CAAgB,EACpC9pI,IAAS,SACPivF,GAAY,OAAO66C,CAAgB,EACnC76C,GAAY,OAAO66C,CAAgB,EACzC,KAAK,qBAAqB,IAAI/tE,EAAU,GAAIA,CAAS,EACrD,MAAMm+B,EAAcvF,EAAa,UAAUlyG,EAAQ,CAACsnJ,EAAQ/8I,EAAS,KAAO,CACtEA,GAAQ,SAAW,MACvB+uE,EAAU,OAAA,CACZ,EAAG,CAAE,UAAW,GAAO,EACvB,YAAK,iBAAiB,IAAI,IAAMm+B,EAAA,CAAa,EACtCn+B,CACT,CAUA,YAAYx6E,EAAS,CACnB,MAAMg3F,EAAQ,KAAK,aAAa,YAAY,CAC1C,GAAGh3F,EACH,KAAMA,GAAS,MAAQunG,GAAqB,CAAE,GAAIvnG,GAAS,GAAI,MAAOA,GAAS,KAAA,CAAO,CAAA,CACvF,EACKyoJ,EAAczoJ,GAAS,aAAe,KACtC0sI,EAAkB1sI,GAAS,kBAAoB,IAEhDyoJ,EADD,KACuBzoJ,GAAS,iBAAmBoiJ,GAA0BpiJ,GAAS,GAAIA,GAAS,KAAK,EAC5G,IAAKyoJ,GAAe/b,IAAoB11C,GAAO,UAAW,CACxD,MAAM8X,EAAY25C,EACd1tC,GAA2B,CAC3B,OAAQ,KAAK,OACb,OAAQ0tC,CAAA,CACT,EACC,KAAK,qBAAqB/b,EAAiBA,EAAiB,CAC5D,KAAM,QACN,SAAU,CAAE,MAAO1sI,GAAS,IAAM,IAAA,CAAK,CACxC,EACC8uG,IACFA,EAAU,UAAU,IAAI,wCAAwC,EAChE9X,EAAM,UAAU,aAAa8X,EAAW9X,EAAM,gBAAkB,IAAI,EACpE,KAAK,iBAAiB,IAAI,IAAM8X,EAAU,WAAW,EAEzD,CACA,YAAK,oCAAA,EACE9X,CACT,CAUA,kBAAkBh3F,EAAU,GAAI,CAC9B,MAAMs5G,EAAO,IAAID,GAAY,CAC3B,KAAMr5G,EAAQ,MAAQ,CAAA,EACtB,SAAUA,EAAQ,SAClB,SAAUA,EAAQ,SAClB,QAASA,EAAQ,QACjB,gBAAiBA,EAAQ,eAAA,CAC1B,EACD,YAAK,iBAAiB,IAAI,IAAMs5G,EAAK,SAAS,EACvC,KAAK,YAAY,CACtB,GAAIt5G,EAAQ,GACZ,MAAOA,EAAQ,MACf,SAAUA,EAAQ,SAClB,KAAMA,EAAQ,KACd,gBAAiBA,EAAQ,gBACzB,YAAaA,EAAQ,YACrB,QAASs5G,EAAK,OAAA,CACf,CACH,CAUA,gBAAgBt5G,EAAU,GAAI,CAC5B,MAAMqoG,EAAU,SAAS,cAAc,KAAK,EAEtCie,EAAWpS,GAAA,EACjB,KAAK,iBAAiB,IAAI,IAAMoS,EAAS,SAAS,EAElD,MAAMoiB,EAAuB,CAAC5gC,EAAO,GAAI1iE,EAAQ,OAAS,CACxD,GAAI,CAAC,KAAK,sBAAuB,OAAO,KACxC,MAAM0pE,EAAY0E,GAAqB,CACrC,OAAQ,KAAK,OACb,KAAM1L,GAAQ,GACd,MAAO1iE,GAAS6/F,GAAkBn9B,CAAI,EACtC,cAAewe,EAAS,aAAA,CACzB,EACD,YAAK,iBAAiB,IAAI,IAAMxX,EAAU,WAAW,EAC9CA,CACT,EAEMyX,EAAmB,CAAC,CAAE,MAAA/e,EAAO,KAAA2H,EAAM,SAAAkC,EAAU,eAAAzB,CAAA,IAAqBoC,GAAmB,CACzF,MAAAxK,EACA,KAAA2H,EACA,SAAAkC,EACA,eAAgBzB,IAAmB,OAAY84B,EAAA,EAAyB94B,EACxE,cAAe0W,EAAS,aAAA,CACzB,EAEKoiC,EAAwBT,GAAiBjG,GAAqBiG,CAAY,GAAK,KAE/EU,EAAoC,CAACv6B,EAAStmB,IAAS,CAC3D,MAAMuJ,EAAW,SAAS,cAAc,KAAK,EAC7CA,EAAS,UAAY,0BACrB,MAAMvC,EAAY45B,EAAqB5gC,CAAI,EAC3C,OAAIgH,GAAWuC,EAAS,YAAYvC,CAAS,EAC7CuC,EAAS,YAAY+c,CAAO,EACrB/c,CACT,EAEA,IAAIu3C,EAAW,SAAS,cAAc,KAAK,EAC3C,MAAMC,EAActzC,GAA6B,CAC/C,QAAS,KAAK,QAAU,OACxB,QAAS,OACT,SAAU,QACV,UAAW,OAAA,CACZ,EAqBD,GApBAszC,EAAY,QAAQ,qBAAuB,OAC3CA,EAAY,iBAAiB,SAAU,IAAM,CAC3C,KAAK,YAAY,CAAE,OAAQ,KAAM,OAAQ,QAAS,EAClDA,EAAY,QAAU,KAAK,QAAU,OACrC,KAAK,iBAAiB,WAAY,KAAK,MAAO,CAC5C,MAAO,OACP,OAAQ,KACR,OAAQ,QACR,WAAY,CAAA,CACb,CACH,CAAC,EAQDD,EANcriC,EAAiB,CAC7B,MAAO,QACP,KAAM,oBACN,SAAUsiC,EACV,eAAgBngB,EAAqB,WAAY,IAAI,CAAA,CACtD,EACgB,IAEb,KAAK,OAAQ,CACf,MAAM51G,EAAW,KAAK,QAAQ,aAAa,aAAe,KAEpDg2H,GAAmB,IAAM,CAC7B,MAAMxa,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,oBAEtB,MAAMya,EAAY,SAAS,cAAc,OAAO,EAChDA,EAAU,KAAO,OACjBA,EAAU,OAAS,uCACnBA,EAAU,MAAM,QAAU,OAE1B,MAAMC,GAAe,SAAS,cAAc,QAAQ,EACpDA,GAAa,UAAY,6CACzB,UAAWz6F,IAAO,CAAC,QAAS,QAAS,OAAQ,MAAO,IAAI,EAAG,CACzD,MAAMw6D,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQx6D,EACZw6D,GAAI,YAAcx6D,EAAI,YAAA,EACtBy6F,GAAa,YAAYjgC,EAAG,CAC9B,CAEA,MAAMkgC,GAAgB,SAAS,cAAc,MAAM,EACnDA,GAAc,UAAY,oCAC1BA,GAAc,aAAa,OAAQ,KAAK,EACxCA,GAAc,aAAa,aAAc,iCAAiC,EAC1EA,GAAc,OAAS,GACvB,MAAMC,GAAc,SAAS,gBAAgB,6BAA8B,KAAK,EAChFA,GAAY,aAAa,UAAW,WAAW,EAC/CA,GAAY,aAAa,cAAe,MAAM,EAC9CA,GAAY,UAAU,IAAI,wCAAwC,EAClE,MAAMC,GAAc,SAAS,gBAAgB,6BAA8B,MAAM,EACjFA,GAAY,aAAa,IAAK,gGAAgG,EAC9HA,GAAY,aAAa,OAAQ,MAAM,EACvCA,GAAY,aAAa,SAAU,cAAc,EACjDA,GAAY,aAAa,eAAgB,GAAG,EAC5CA,GAAY,aAAa,iBAAkB,OAAO,EAClDA,GAAY,aAAa,kBAAmB,OAAO,EACnDD,GAAY,YAAYC,EAAW,EACnCF,GAAc,YAAYC,EAAW,EAErC,MAAME,GAAa,SAAS,cAAc,QAAQ,EAClDA,GAAW,KAAO,SAClBA,GAAW,UAAY,0CACvBA,GAAW,aAAa,aAAc,eAAe,EAErD,MAAMC,EAAa,SAAS,cAAc,QAAQ,EAClDA,EAAW,KAAO,SAClBA,EAAW,UAAY,0CACvBA,EAAW,aAAa,aAAc,cAAc,EAEpD,MAAMC,GAAYp6H,GAAM,CACtB,MAAMw2D,GAAM,SAAS,gBAAgB,6BAA8B,KAAK,EACxEA,GAAI,aAAa,UAAW,WAAW,EACvCA,GAAI,UAAU,IAAI,wBAAwB,EAC1C,MAAMoiB,GAAO,SAAS,gBAAgB,6BAA8B,MAAM,EAC1E,OAAAA,GAAK,aAAa,IAAK54E,CAAC,EACxB44E,GAAK,aAAa,OAAQ,MAAM,EAChCA,GAAK,aAAa,SAAU,cAAc,EAC1CA,GAAK,aAAa,eAAgB,GAAG,EACrCA,GAAK,aAAa,iBAAkB,OAAO,EAC3CA,GAAK,aAAa,kBAAmB,OAAO,EAC5CpiB,GAAI,YAAYoiB,EAAI,EACbpiB,EACT,EAGM6jE,GAAWD,GAAS,wCAAwC,EAC5DE,GAAWF,GAAS,uCAAuC,EAC3DG,GAAWH,GAAS,uEAAuE,EAE3FI,GAAW,SAAS,cAAc,MAAM,EAC9CA,GAAS,YAAc,OACvB,MAAMC,GAAW,SAAS,cAAc,MAAM,EAC9CA,GAAS,YAAc,OACvBP,GAAW,YAAYG,EAAQ,EAC/BH,GAAW,YAAYM,EAAQ,EAC/BL,EAAW,YAAYG,EAAQ,EAC/BH,EAAW,YAAYM,EAAQ,EAE/BrjC,EAAS,cAAc8iC,GAAY,4DAA4D,EAC/F9iC,EAAS,cAAc+iC,EAAY,wEAAwE,EAC3G/iC,EAAS,cAAc0iC,GAAc,sBAAsB,EAC3D1iC,EAAS,cAAc2iC,GAAe,gJAAgJ,EAEtL,MAAMW,GAAgB,SAAS,cAAc,KAAK,EAClDA,GAAc,UAAY,gCAC1B,MAAMC,GAAa,SAAS,cAAc,MAAM,EAChDA,GAAW,UAAY,wCACvBA,GAAW,YAAc,aACzB,MAAMC,GAAe,SAAS,cAAc,KAAK,EACjDA,GAAa,UAAY,0CACzB,MAAMC,GAAa,SAAS,cAAc,QAAQ,EAClDA,GAAW,KAAO,SAClBA,GAAW,UAAY,8EACvBA,GAAW,aAAa,aAAc,yBAAyB,EAC/DA,GAAW,YAAYN,EAAQ,EAC/BK,GAAa,YAAYC,EAAU,EACnCH,GAAc,YAAYE,EAAY,EACtCF,GAAc,YAAYC,EAAU,EACpCvjC,EAAS,cAAcyjC,GAAY,uDAAuD,EAE1F,MAAMC,GAAgB,SAAS,cAAc,KAAK,EAClDA,GAAc,UAAY,6BAC1B,MAAMC,GAAgB,SAAS,cAAc,MAAM,EACnDA,GAAc,UAAY,oCAC1BA,GAAc,YAAc,YAC5B,MAAMC,GAAiB51C,GAAoB,CACzC,QAAS,KAAK,QAAQ,QAAQ,MAAM,+BAAgC,EAAI,IAAM,GAC9E,QAAS,KACT,SAAU,MACV,UAAW,gCACX,UAAW,+EAAA,CACZ,EACD01C,GAAc,YAAYC,EAAa,EACvCD,GAAc,YAAYE,EAAc,EACxC5jC,EAAS,cAAc4jC,GAAgB,wEAAwE,EAC/GJ,GAAa,YAAYE,EAAa,EAEtC,MAAM34C,GAAW,SAAS,cAAc,KAAK,EAC7CA,GAAS,UAAY,6BACrBA,GAAS,MAAM,UAAY,MAC3BA,GAAS,MAAM,aAAe,OAC9BA,GAAS,YAAY+3C,EAAU,EAC/B/3C,GAAS,YAAYg4C,CAAU,EAC/Bh4C,GAAS,YAAY23C,EAAY,EACjC33C,GAAS,YAAY43C,EAAa,EAClC53C,GAAS,YAAY03C,CAAS,EAE9B,MAAMoB,EAA0BjmJ,GAAc,CAC5C,GAAI,CAAC,OAAO,SAASA,CAAS,EAAG,OAAO,KACxC,MAAMJ,GAAU,KAAK,IAAI,EAAG,KAAK,IAAA,EAAQ,OAAOI,CAAS,CAAC,EAC1D,OAAIJ,GAAU,IAAc,GAAG,KAAK,MAAMA,GAAU,GAAI,CAAC,QACrDA,GAAU,KAAgB,GAAG,KAAK,MAAMA,GAAU,GAAK,CAAC,QACrD,GAAG,KAAK,MAAMA,GAAU,IAAO,CAAC,OACzC,EAEMsmJ,GAAgCvpI,GAAW,CAC/C,MAAMwpI,GAAU,OAAOxpI,GAAQ,aAAa,OAAO,EACnD,OAAO,OAAO,SAASwpI,EAAO,GAAKA,GAAU,EAAIA,GAAU,IAC7D,EAEMC,EAAyBtqJ,EAAQ,yBAA2B,GAC5DuqJ,EAAsBvqJ,EAAQ,sBAAwB,IAAS6hJ,GAA4B,KAAK,MAAM,EACtG2I,EAAiBxqJ,EAAQ,iBAAmB,IAAS+hJ,GAAwB,KAAK,MAAM,EAE9F,IAAI0I,EAAiC,GACrC,MAAMC,GAAwB,CAACC,EAAiB,OAAS,CACvD,GAAI,CAACJ,EAAqB,OAC1B,MAAMtxG,GAAU,KAAK,QAAQ,SAAW,KAClCp4B,GAAS8pI,GAAkB1xG,IAAS,uBAAyBA,IAAS,YAAc,KACpF2xG,GAAc/pI,IAAQ,aAAe,CAAA,EAErCgqI,IADgBhqI,IAAQ,eAAiB,CAAA,GAClB,KAAMuM,IAAUA,IAAO,KAAO,EAAK,GAAK,KAC/D09H,GAAiBD,IAAQ,OAC1BhqI,IAAQ,aAAa,OACrBA,IAAQ,WACR+pI,GAAY,eACZ,GACCG,GAAclqI,IAAQ,aAAa,SACpCA,IAAQ,aACR+pI,GAAY,aACZ,GACCI,GAAiB,IAAM,CAC3B,GAAI,CAACF,GAAgB,OACrB,MAAMvoJ,GAAM,KAAK,UAAU,CACzB,QAASuoJ,GACT,QAASD,IAAQ,IAAMA,IAAQ,MAAQA,IAAQ,MAAQ,KACvD,UAAWhqI,IAAQ,WAAa,IAAA,CACjC,EACD,GAAI,OAAK,yBAA2Bte,IAAOm/I,GAAyB,IAAIn/I,EAAG,GAG3E,IAFA,KAAK,uBAAyBA,GAC9Bm/I,GAAyB,IAAIn/I,EAAG,EAC5Bm/I,GAAyB,KAAOC,GAA8B,CAChE,KAAM,CAACsJ,EAAM,EAAIvJ,GACjBA,GAAyB,OAAOuJ,EAAM,CACxC,CACA,QAAQ,MAAM,8BAA+B,CAC3C,MAAOH,GACP,QAASD,IAAU,KACnB,OAAAhqI,EAAA,CACD,EACH,EACMwpI,GAAUD,GAA6BvpI,EAAM,EAC7CqqI,GAAab,IAAW,KACxBnkF,GAAY,KAAK,UAAU,CAC/B,QAASrlD,IAAQ,UAAY,GAC7B,cAAeA,IAAQ,aAAa,QAAU,KAC9C,eAAgBA,IAAQ,aAAa,SAAW,KAChD,cAAe+pI,GAAY,QAAU,KACrC,MAAOA,GAAY,QAAU,GAC7B,aAAcA,GAAY,eAAiB,GAC3C,eAAgBA,GAAY,iBAAmB,GAC/C,iBAAkBA,GAAY,mBAAqB,GACnD,uBAAwBA,GAAY,wBAAwB,SAAW,GACvE,QAASA,GAAY,UAAY,GACjC,SAAUA,GAAY,WAAa,GACnC,QAAAP,GACA,UAAWxpI,IAAQ,WAAa,KAChC,YAAaA,IAAQ,aAAe,KACpC,cAAe+pI,GAAY,eAAiB,KAC5C,WAAYM,GAAa,KAAK,MAAM,KAAK,IAAA,EAAQ,GAAK,EAAI,CAAA,CAC3D,EACD,GAAIhlF,KAAcukF,EAAgC,OAClDA,EAAiCvkF,GACjC,MAAMilF,GAAkBD,GAAa,SAAW,KAC1CE,GAAiBF,GAAa,eAAef,EAAuBE,EAAO,CAAC,IAAM,GAClFgB,GAA4BT,GAAY,UAAY,GACpDU,GAAyBV,GAAY,wBAAwB,UAC7DA,GAAY,mBAAqB,GACjC,2EACA,IACAW,GAAmBX,GAAY,mBAAqB,GAC1DV,GAAe,QAAUqB,GACrB,GACAX,GAAY,WAAa,GAC7BV,GAAe,SAAW,CAACmB,IAA6BE,GACxDvB,GAAc,MAAQsB,GACtBpB,GAAe,MAAQoB,GACvBtB,GAAc,QAAQ,MAAQuB,GAAmB,WAAa,UAC9DxB,GAAW,MAAQ,GACflpI,IAAQ,SAAW+pI,GAAY,SAAW,WAC5Cf,GAAW,YAAckB,GAAc,qBAAuB,aAC9DhB,GAAW,QAAQ,MAAQ,UAC3BA,GAAW,SAAW,GACtBA,GAAW,MAAQgB,IACVH,GAAY,SAAW,WAAaA,GAAY,SAAS,SAAW,cAC7Ef,GAAW,YAAc,oBACzBE,GAAW,QAAQ,MAAQ,QAC3BA,GAAW,SAAW,GACtBA,GAAW,MAAQ,iGACVc,IAAUhqI,IAAQ,aAAa,SAAW,SAAWA,IAAQ,WAAa+pI,GAAY,eAC/FI,GAAA,EACAnB,GAAW,YAAc,cACzBE,GAAW,QAAQ,MAAQ,QAC3BA,GAAW,SAAW,GACtBA,GAAW,MAAQe,IACVF,GAAY,gBACrBf,GAAW,YAAc,qBACzBE,GAAW,QAAQ,MAAQ,QAC3BA,GAAW,SAAW,GACtBA,GAAW,MAAQ,GAAGqB,EAAc,gFAAgF,KAAA,GAC3GR,GAAY,OACrBf,GAAW,YAAc,mBACzBE,GAAW,QAAQ,MAAQ,QAC3BA,GAAW,SAAW,GACtBA,GAAW,MAAQ,GAAGqB,EAAc,+EAA+E,KAAA,GAC1GF,IACTrB,GAAW,YAAcsB,GACzBpB,GAAW,QAAQ,MAAQ,QAC3BA,GAAW,SAAW,KAEtBF,GAAW,YAAc,GACzBE,GAAW,QAAQ,MAAQ,OAC3BA,GAAW,SAAW,GAE1B,EAEMyB,GAAkC/pJ,GAAU,CAChD,MAAMgK,GAAShK,GAAO,QAAU,OAAOA,EAAM,QAAW,SAAWA,EAAM,OAAS,CAAA,EAC5E2B,GAAS,OAAOqI,GAAO,QAAU,EAAE,EACnCggJ,GAAgBhgJ,GAAO,QAAQ,aAAe,OAAOA,GAAO,OAAO,aAAgB,SACrFA,GAAO,OAAO,YACd,KACEigJ,GAAaD,IAAe,SAAW,SACxCA,GAAc,QAAU,IACxBA,GAAc,iBAAmB,GAChCZ,GAASY,IAAe,SAAW,SACpCA,IAAe,SAAW,WAC1B,EAAQA,IAAe,eACvB,EAAQhgJ,GAAO,OACf,EAAQA,GAAO,SACfA,GAAO,QAAQ,aAAa,SAAW,QAS5C,GAAIrI,KAAW,QAAUA,KAAW,uBAAyBA,KAAW,sBARtDA,KAAW,sBACxBA,KAAW,gBACXA,KAAW,uBACXA,KAAW,4BACXA,KAAW,wBACXA,KAAW,sBACXA,KAAW,yBACXA,KAAW,6BAC4FsoJ,IAAcb,GAAQ,CAChIH,GAAsBj/I,GAAO,QAAU,IAAI,EAC3C,MACF,CACA,GAAIggJ,KAAkBA,GAAc,QAAU,IAAQA,GAAc,iBAAmB,IAAQA,GAAc,SAAW,SAAU,CAChIf,GAAsBj/I,GAAO,QAAU,IAAI,EAC3C,MACF,EACgB,MAAM,QAAQA,GAAO,OAAO,EAAIA,GAAO,QAAU,CAAA,GACrD,KAAM2hB,IAAU,CAC1B,MAAM06E,GAAO,OAAO16E,IAAO,MAAQ,EAAE,EACrC,OAAO06E,GAAK,WAAW,qBAAqB,GAAKA,GAAK,WAAW,uBAAuB,CAC1F,CAAC,GACC4iD,GAAsBj/I,GAAO,QAAU,IAAI,CAE/C,EAEMkgJ,GAAqC,IAAM,CAC/C,MAAM1yG,EAAU,KAAK,QAAQ,SAAW,KACxC,GAAI,CAAC8oG,GAAwB,KAAK,MAAM,GAAK,CAAC9oG,EAAS,OAAO,KAC9D,MAAMp4B,GAASo4B,EAAQ,oBAAA,GAAyBA,EAAQ,YAAc,KACtE,GAAI,CAACp4B,IAAU,CAACA,GAAO,UAAW,OAAO,KACzC,MAAM+pI,GAAc/pI,GAAO,aAAe,CAAA,EACpC+qI,GAAc/qI,GAAO,aAAe,CAAA,EACpCwpI,GAAUD,GAA6BvpI,EAAM,EAUnD,GAAI,EATsBA,GAAO,UAAY,IACxC+qI,GAAY,UAAY,IACxBhB,GAAY,QAAU,IACtBA,GAAY,iBAAmB,IAC/B,EAAQ/pI,GAAO,WACf,EAAQ+pI,GAAY,eACpBgB,GAAY,SAAW,SACvB3yG,EAAQ,yBAAA,IAA+B,IACvCoxG,IAAW,MACQ,OAAO,KAC/B,IAAIjnJ,GAAS,2CACb,OAAIyd,GAAO,UAAY,IAAQ+qI,GAAY,UAAY,GACrDxoJ,GAAS,mCACAyd,GAAO,WAAa+pI,GAAY,eAAiBgB,GAAY,SAAW,QACjFxoJ,GAAS,gCACAwnJ,GAAY,iBAAmB,GACxCxnJ,GAAS,qDACAwnJ,GAAY,QAAU,IAAQ3xG,EAAQ,yBAAA,IAA+B,GAC9E71C,GAAS,4CACAinJ,IAAW,OACpBjnJ,GAAS,8CAEJ,CACL,OAAAyd,GACA,OAAAzd,GACA,YAAainJ,IAAW,KAAO,kBAAoB,eAAeF,EAAuBE,EAAO,CAAC,GAAA,CAErG,EAEMwB,GAAmC,IAAM,CAC7C,MAAM5yG,EAAU,KAAK,QAAQ,SAAW,KAElC2xG,IADS3xG,GAAS,oBAAA,GAAyBA,GAAS,YAAc,OAC5C,aAAe,CAAA,EACrC6yG,GAAyBlB,GAAY,SAAW,KAChDmB,GAAiBnB,GAAY,eAAiB,IAAQ,CAACkB,GAC7D,MAAO,CACL,eAAAC,GACA,iBAAkBnB,GAAY,iBAAmB,GACjD,iBAAkBmB,GAAiB,OAAS,EAAA,CAEhD,EAEMC,GAA+B,CAAC,CACpC,MAAAxkD,EACA,QAAAzkG,GACA,OAAA0I,GAAS,GACT,aAAAwgJ,GAAe,WACf,YAAAC,GAAc,SACd,aAAAC,GAAe,GACf,UAAAC,GAAY,IAAA,EACV,KAAO,IAAI,QAASv+F,IAAY,CAClC,MAAM65C,GAAM,KAAK,WAAW,eAAiB,SAC7C,GAAI,CAACA,IAAK,cAAe,CACvB75C,GAAQ,EAAK,EACb,MACF,CACA,MAAMw+F,GAAS3kD,GAAI,cAAc,QAAQ,EACzC2kD,GAAO,UAAY,mBACnBA,GAAO,aAAa,aAAc7kD,GAAS,gBAAgB,EAE3D,MAAM8F,GAAU5F,GAAI,cAAc,KAAK,EACvC4F,GAAQ,UAAY,0BACpBA,GAAQ,YAAc9F,GAAS,UAE/B,MAAM8kD,GAAY5kD,GAAI,cAAc,KAAK,EACzC4kD,GAAU,UAAY,yBACtBA,GAAU,YAAcvpJ,IAAW,GAEnC,MAAMwpJ,GAAW7kD,GAAI,cAAc,KAAK,EACxC6kD,GAAS,UAAY,yBACrBA,GAAS,YAAc9gJ,IAAU,GACjC8gJ,GAAS,OAAS,CAACA,GAAS,YAE5B,MAAMzY,GAAUpsC,GAAI,cAAc,KAAK,EACvCosC,GAAQ,UAAY,4BAEpB,MAAM0Y,GAAS9kD,GAAI,cAAc,QAAQ,EACzC8kD,GAAO,KAAO,SACdA,GAAO,UAAY,mBACnBA,GAAO,YAAcN,GAErB,MAAMO,GAAU/kD,GAAI,cAAc,QAAQ,EAC1C+kD,GAAQ,KAAO,SACfA,GAAQ,UAAY,oBAAoBN,EAAY,GAAG,KAAA,EACvDM,GAAQ,YAAcR,GAEtBnY,GAAQ,YAAY0Y,EAAM,EAC1B1Y,GAAQ,YAAY2Y,EAAO,EAC3BJ,GAAO,YAAY/+C,EAAO,EAC1B++C,GAAO,YAAYC,EAAS,EAC5BD,GAAO,YAAYE,EAAQ,EAC3BF,GAAO,YAAYvY,EAAO,EAE1B,MAAMh6H,GAAS,KAAK,WAAa4tF,GAAI,KAC/BqM,GAAS30G,IAAU,CACnB,OAAOitJ,GAAO,OAAU,YAAcA,GAAO,SAAa,MAAA,EAC9DA,GAAO,OAAA,EACPx+F,GAAQzuD,EAAK,CACf,EACAotJ,GAAO,iBAAiB,QAAS,IAAMz4C,GAAM,EAAK,CAAC,EACnD04C,GAAQ,iBAAiB,QAAS,IAAM,CAClC,OAAOJ,GAAO,OAAU,YAAcA,GAAO,SAAa,MAAA,EAC9DA,GAAO,OAAA,EACH,OAAOD,IAAc,YAAYA,GAAA,EACrCv+F,GAAQ,EAAI,CACd,CAAC,EACDw+F,GAAO,iBAAiB,SAAW5qJ,IAAU,CAC3CA,GAAM,eAAA,EACNsyG,GAAM,EAAK,CACb,CAAC,EACDj6F,GAAO,YAAYuyI,EAAM,EACrB,OAAOA,GAAO,WAAc,cAAmB,UAAA,EAC9CA,GAAO,aAAa,OAAQ,EAAE,EACnC,WAAW,WAAW,IAAMI,GAAQ,MAAA,EAAS,CAAC,CAChD,CAAC,EAEKC,GAAgC,MAAO,CAAE,WAAA14F,EAAa,IAAA,EAAS,CAAA,IAAO,CAC1E,MAAMohB,GAAOu2E,GAAA,EACb,GAAI,CAACv2E,GAAM,MAAO,GAClB,MAAMm9C,GAAcv+D,EAAa,KAAKA,CAAU,IAAM,GACtD,OAAOg4F,GAA6B,CAClC,MAAO,eACP,QAAS,UAAUz5B,EAAW,+KAC9B,OAAQ,GAAGn9C,GAAK,WAAW,IAAIA,GAAK,MAAM,GAC1C,aAAc,cAAA,CACf,CACH,EAEMu3E,GAAqCP,GAAc,CAClDM,GAAA,EAAgC,KAAME,IAAc,CACnDA,IAAa,OAAOR,GAAc,YAAYA,EAAA,CACpD,CAAC,CACH,EAEMS,GAA6B,MAAO,CAAE,MAAA5oJ,EAAO,WAAA6oJ,GAAY,OAAAjsI,GAAQ,WAAAmzC,GAAa,IAAA,EAAS,KAAO,CAClG,MAAM+4F,GAAgBD,GAAa,KAAKA,EAAU,IAAM,GAClDzC,GAAUD,GAA6BvpI,EAAM,EAC7CmsI,GAAc3C,IAAW,KAAO,kBAAoB,eAAeF,EAAuBE,EAAO,CAAC,IAClG4C,GAAehpJ,GAAO,QAAU,IAAIA,EAAM,OAAO,GAAK,GACtDsuH,GAAcv+D,GAAa,KAAKA,EAAU,IAAM,GACtD,OAAOg4F,GAA6B,CAClC,MAAO,yBACP,QAAS,4CAA4Ce,EAAa,kBAAkBx6B,EAAW,2EAC/F,OAAQ,GAAGy6B,EAAW,GAAGC,EAAY,GACrC,aAAc,WACd,aAAc,0BAAA,CACf,CACH,EAEA,KAAK,OAAO,0BAA4BP,GACxC,KAAK,OAAO,8BAAgCG,GAC5C,KAAK,iBAAiB,IAAI,IAAM,CAC1B,KAAK,QAAQ,4BAA8BH,KAC7C,KAAK,OAAO,0BAA4B,MAEtC,KAAK,QAAQ,gCAAkCG,KACjD,KAAK,OAAO,8BAAgC,KAEhD,CAAC,EAED,MAAMK,GAAqB3C,EACvB,YAAYG,GAAuB,GAAK,EACxC,KACAwC,IAAsB,MACxB,KAAK,iBAAiB,IAAI,IAAM,cAAcA,EAAkB,CAAC,EAGnEnD,GAAW,iBAAiB,QAAS,SAAY,CAC/CA,GAAW,SAAW,GACtBA,GAAW,QAAQ,MAAQ,UAC3BF,GAAW,YAAc,aACzB,GAAI,CACF,MAAM,KAAK,QAAQ,SAAS,OAAO,CACjC,GAAGgC,GAAA,EACH,UAAW,CAAE,QAAS,EAAA,CAAM,CAC7B,CACH,OAAS5nJ,EAAO,CACd,QAAQ,MAAM,qCAAsCA,CAAK,CAC3D,QAAA,CACEymJ,GAAA,CACF,CACF,CAAC,EAEDR,GAAe,iBAAiB,SAAU,IAAM,EAC3B,KAAK,QAAQ,QAAU,OAC9B,MAAM,+BAAgCA,GAAe,QAAS,CACxE,MAAO,YACP,OAAQ,KACR,OAAQ,yBAAA,CACT,EACD,KAAK,QAAQ,SAAS,YAAY,CAChC,mBAAoB,CAAE,SAAUA,GAAe,OAAA,CAAQ,CACxD,EACDQ,GAAA,CACF,CAAC,EAED,IAAI7K,GAAW,KAAK,OAAO,wBAA0B,UACjDsN,GAAe,KAAK,OAAO,0BAA4B,KACvDA,IAAgB,CAAC,QAAS,QAAS,OAAQ,MAAO,IAAI,EAAE,SAASA,EAAY,IAC/EnE,GAAa,MAAQmE,IAGvB,MAAMC,GAAoBhuJ,GACZ,OAAOA,GAAS,EAAE,EAAE,KAAA,EAErB,QAAQ,6BAA8B,GAAG,EAGtD,IAAIiuJ,GAAoBD,GAAiBvN,EAAQ,GAAK,UACtDA,GAAWwN,GAEX,MAAMC,GAAe,CAACC,EAAMhP,KAAa,CACvC,MAAMiP,GAAM,IAAI,gBAAgBD,CAAI,EAC9BtzI,GAAI,SAAS,cAAc,GAAG,EACpCA,GAAE,KAAOuzI,GACTvzI,GAAE,SAAWskI,GACbtkI,GAAE,MAAM,QAAU,OAClB,SAAS,KAAK,YAAYA,EAAC,EAC3BA,GAAE,MAAA,EACFA,GAAE,OAAA,EACF,WAAW,IAAM,IAAI,gBAAgBuzI,EAAG,EAAG,GAAG,CAChD,EAEMC,GAAU,SAAS,cAAc,KAAK,EAC5CA,GAAQ,UAAY,0BACpBA,GAAQ,MAAM,UAAY,MAE1B,MAAMC,GAAU,SAAS,cAAc,KAAK,EAC5CA,GAAQ,UAAY,8BAEpB,MAAMC,GAAY,SAAS,cAAc,OAAO,EAChDA,GAAU,KAAO,OACjBA,GAAU,UAAY,iBACtBA,GAAU,MAAQN,GAClBM,GAAU,YAAc,UACxBA,GAAU,WAAa,GACvBA,GAAU,eAAiB,MAC3BA,GAAU,aAAe,MACzBA,GAAU,UAAY,OAEtB,MAAMC,GAAQ,SAAS,cAAc,MAAM,EAC3CA,GAAM,UAAY,yBAElB,MAAMC,GAAgB,IAAM,CAC1BD,GAAM,YAAc,IAAI5E,GAAa,KAAK,GAC1CC,GAAc,OAASD,GAAa,QAAU,OAASA,GAAa,QAAU,IAChF,EACA6E,GAAA,EAEA,MAAMC,GAAkB,SAAS,cAAc,OAAO,EACtDA,GAAgB,KAAO,OACvBA,GAAgB,UAAY,iBAC5BA,GAAgB,MAAQT,GACxBS,GAAgB,YAAc,SAC9BA,GAAgB,WAAa,GAC7BA,GAAgB,eAAiB,MACjCA,GAAgB,aAAe,MAC/BA,GAAgB,UAAY,OAE5B,MAAMC,GAAqB,SAAS,cAAc,QAAQ,EAC1DA,GAAmB,UAAY,mBAC/B,UAAWx/F,IAAO,CAAC,MAAO,KAAK,EAAG,CAChC,MAAMw6D,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQx6D,EACZw6D,GAAI,YAAcx6D,EAAI,YAAA,EACtBw/F,GAAmB,YAAYhlC,EAAG,CACpC,CAEA,MAAMilC,GAAc,SAAS,cAAc,MAAM,EACjDA,GAAY,UAAY,yBAExB,MAAMC,GAAkBp6E,GAAU,CAChC,MAAM1nB,GAAYihG,GAAiBv5E,EAAM,KAAK,EAC1C1nB,IACFkhG,GAAoBlhG,GACpB0zF,GAAW1zF,GACPwhG,GAAU,QAAUxhG,KAAWwhG,GAAU,MAAQxhG,IACjD2hG,GAAgB,QAAU3hG,KAAW2hG,GAAgB,MAAQ3hG,IACjE+hG,IAAkB,WAAW/hG,EAAS,GAEtC0nB,EAAM,MAAQw5E,EAElB,EAEMc,GAAyB,IAAM,CACnC,MAAMhiG,EAAYihG,GAAiB,KAAK,QAAQ,wBAA0B,EAAE,EACxE,CAACjhG,GAAaA,IAAckhG,KAChCxN,GAAW1zF,EACXkhG,GAAoBlhG,EAChBwhG,GAAU,QAAUxhG,IAAWwhG,GAAU,MAAQxhG,GACjD2hG,GAAgB,QAAU3hG,IAAW2hG,GAAgB,MAAQ3hG,GACjE+hG,IAAkB,WAAW/hG,CAAS,EACxC,EAEAwhG,GAAU,iBAAiB,OAAQ,IAAMM,GAAeN,EAAS,CAAC,EAClEA,GAAU,iBAAiB,UAAY9kD,GAAM,CACvCA,EAAE,MAAQ,UACZA,EAAE,eAAA,EACF8kD,GAAU,KAAA,EAEd,CAAC,EACDG,GAAgB,iBAAiB,OAAQ,IAAMG,GAAeH,EAAe,CAAC,EAC9EA,GAAgB,iBAAiB,UAAYjlD,GAAM,CAC7CA,EAAE,MAAQ,UACZA,EAAE,eAAA,EACFilD,GAAgB,KAAA,EAEpB,CAAC,EAEDxnC,EAAS,cAAcqnC,GAAW,sDAAsD,EACxFrnC,EAAS,cAAcwnC,GAAiB,gEAAgE,EAExGL,GAAQ,YAAYE,EAAS,EAC7BF,GAAQ,YAAYG,EAAK,EACrBrD,GACFmD,GAAQ,YAAY9D,EAAa,EAGnC,MAAMp6H,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,2CAClBA,EAAM,MAAM,aAAe,MAC3B,MAAM4+H,GAAa,SAAS,cAAc,KAAK,EAC/CA,GAAW,YAAc,IACzB,MAAMC,GAAa,SAAS,cAAc,KAAK,EAC/CA,GAAW,YAAc,IACzB,MAAMC,GAAY,SAAS,cAAc,KAAK,EAC9CA,GAAU,YAAc,IACxB,MAAMC,EAAc,SAAS,cAAc,KAAK,EAChDA,EAAY,YAAc,IAE1B/+H,EAAM,YAAYozH,GAAe,QAASwL,EAAU,EAAE,IAAI,EAC1D5+H,EAAM,YAAYozH,GAAe,QAASyL,EAAU,EAAE,IAAI,EAC1D7+H,EAAM,YAAYozH,GAAe,OAAQ0L,EAAS,EAAE,IAAI,EACxD9+H,EAAM,YAAYozH,GAAe,UAAW2L,CAAW,EAAE,IAAI,EAE7D,MAAMC,GAAqB,IAAM,CAC/B,MAAMloJ,EAAU,KAAK,QAAQ,SAAW,KAClCqgC,GAAQrgC,GAAS,WAAa,EAC9B+B,GAAQ/B,GAAS,WAAa,EAC9BmoJ,GAAW,EAAQnoJ,GAAS,SAC5BkoB,GAAYmY,GAAS8nH,GAAWpmJ,GAAQs+B,GAAS,EAAIt+B,GAASs+B,GAAS,EAE7EwnH,GAAA,EACAN,GAAA,EACAO,GAAW,YAAc,OAAOznH,EAAK,EACrC0nH,GAAW,YAAc,OAAOhmJ,EAAK,EACrCimJ,GAAU,YAAcG,GAAW,WAAa,aAChDF,EAAY,YAAc,OAAO,SAAS//H,EAAS,EAAIA,GAAU,QAAQ,CAAC,EAAI,GAChF,EAEAggI,GAAA,EACIjE,GAAqBG,GAAA,EAEzB,MAAMgE,GAAa,SAAS,cAAc,KAAK,EAC/CA,GAAW,YAAYl/H,CAAK,EACxB86H,IACFoE,GAAW,YAAYr9C,EAAQ,EAC/Bq9C,GAAW,YAAYjB,EAAO,GAE5BlD,GAAqBmE,GAAW,YAAYhB,EAAO,EAEvD,MAAMiB,GAAa,SAAS,cAAc,KAAK,EAC/CA,GAAW,UAAY,wBACvB,MAAMC,GAAgB,SAAS,cAAc,KAAK,EAClDA,GAAc,UAAY,gCAC1B,MAAMC,GAAiB,SAAS,cAAc,KAAK,EACnDA,GAAe,UAAY,iCAC3B,MAAMC,GAAsB,SAAS,cAAc,KAAK,EACxDA,GAAoB,UAAY,uCAChCA,GAAoB,YAAc,UAClC,MAAMC,GAAmB,SAAS,cAAc,KAAK,EACrDA,GAAiB,UAAY,oCAC7BF,GAAe,YAAYC,EAAmB,EAC9CD,GAAe,YAAYE,EAAgB,EAC3C,MAAMC,GAAiB,SAAS,cAAc,KAAK,EACnDA,GAAe,UAAY,iCAC3B,MAAMC,GAAmB,SAAS,cAAc,QAAQ,EACxDA,GAAiB,KAAO,SACxBA,GAAiB,UAAY,mBAC7BA,GAAiB,YAAc,eAC/B,MAAMC,GAAwB,SAAS,cAAc,QAAQ,EAC7DA,GAAsB,KAAO,SAC7BA,GAAsB,UAAY,0CAClCA,GAAsB,aAAa,aAAc,kBAAkB,EACnEA,GAAsB,YAAY5F,GAAS,uEAAuE,CAAC,EACnH0F,GAAe,YAAYC,EAAgB,EAC3CD,GAAe,YAAYE,EAAqB,EAChDN,GAAc,YAAYC,EAAc,EACxCD,GAAc,YAAYI,EAAc,EACxC,MAAMG,GAAc,SAAS,cAAc,KAAK,EAChDA,GAAY,UAAY,8BACxBR,GAAW,YAAYC,EAAa,EACpCD,GAAW,YAAYQ,EAAW,EAClC7oC,EAAS,cAAc2oC,GAAkB,wDAAwD,EACjG3oC,EAAS,cAAc4oC,GAAuB,wBAAwB,EAEtE,MAAME,GAAoB,SAAY,CACpC,MAAMn2G,EAAU,KAAK,QAAQ,SAAW,KAClCo2G,GAAYp2G,GAAS,WAAa,KAGxC,GAFA81G,GAAiB,YAAcM,IAAa,OAC5CF,GAAY,gBAAA,EACR,CAACl2G,GAAS,cAAc,SAAU,CACpC,MAAMq2G,GAAQ,SAAS,cAAc,KAAK,EAC1CA,GAAM,UAAY,wBAClBA,GAAM,YAAc,sCACpBH,GAAY,YAAYG,EAAK,EAC7B,MACF,CACA,IAAIjJ,GAAW,CAAA,EACf,GAAI,CAEFA,GAAW,MADW,OAAOptG,GAAS,sBAAyB,WAAaA,EAAU,aACvD,qBAAqB,CAClD,gBAAiB,GACjB,qBAAsB,EAAA,CACvB,CACH,OAASh1C,GAAO,CACd,MAAMqrJ,GAAQ,SAAS,cAAc,KAAK,EAC1CA,GAAM,UAAY,wBAClBA,GAAM,YAAc,4BAA4BrrJ,IAAO,SAAWA,EAAK,GACvEkrJ,GAAY,YAAYG,EAAK,EAC7B,MACF,CACA,MAAMC,GAAkBlJ,GAAS,OAAQj5H,IAAUA,IAAO,EAAE,EAC5D,GAAI,CAACmiI,GAAgB,OAAQ,CAC3B,MAAMD,GAAQ,SAAS,cAAc,KAAK,EAC1CA,GAAM,UAAY,wBAClBA,GAAM,YAAc,qBACpBH,GAAY,YAAYG,EAAK,EAC7B,MACF,CACA,QAAShnJ,GAAI,EAAGA,GAAIinJ,GAAgB,OAAQjnJ,IAAK,EAAG,CAClD,MAAMm+I,GAAU8I,GAAgBjnJ,EAAC,EAC3BknJ,GAAYH,IAAa,MAAQ,OAAO5I,GAAQ,EAAE,IAAM,OAAO4I,EAAS,EACxE/sG,GAAM,SAAS,cAAc,KAAK,EACxCA,GAAI,UAAY,6BAChBA,GAAI,QAAQ,QAAUktG,GAAY,OAAS,QAC3CltG,GAAI,QAAQ,UAAYmkG,GAAQ,GAChC,MAAMgJ,GAAY,OAAOhJ,GAAQ,SAAS,EACpCiJ,GAAsB,OAAOjJ,GAAQ,WAAW,UAAU,EAC1DkJ,GAA6B,CAACH,IAC/B,CAAC,OAAO,SAASC,EAAS,GAC1B,CAAC,OAAO,SAASC,EAAmB,GACpCA,IAAuBD,GACtBG,GAAYnJ,GAAQ,WAAW,SAAWkJ,GAC5C,SAAS,cAAc,KAAK,EAC5B,KACAC,KACFttG,GAAI,UAAU,IAAI,4CAA4C,EAC9DstG,GAAU,UAAY,mCACtBA,GAAU,IAAMnJ,GAAQ,UAAU,QAClCmJ,GAAU,IAAM,GAChBA,GAAU,QAAU,QAEtB,MAAMC,GAAU,SAAS,cAAc,KAAK,EAC5CA,GAAQ,UAAY,iCACpB,MAAMroD,GAAQ,SAAS,cAAc,KAAK,EAC1CA,GAAM,UAAY,+BAClB,MAAMsoD,GAAiB,OAAO,SAASL,EAAS,GAAKA,GAAY,EAC7D,IAAI,KAAKA,EAAS,EAAE,eAAe,OAAW,CAC9C,MAAO,QACP,IAAK,UACL,KAAM,UACN,OAAQ,SAAA,CACT,EACC,eACEM,GAAc,OAClBtJ,GAAQ,eAAe,UACpBA,GAAQ,eAAe,MACvB,KAAK,QAAQ,wBACb,SAAA,EACH,QAAU,UAENuJ,GADW,OAAOvJ,GAAQ,UAAY,EAAE,EAAE,KAAA,GAChBsJ,GAChCvoD,GAAM,YAAc,GAAGwoD,EAAW,MAAMF,EAAc,GACtD,MAAM7oH,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,UAAY,8BACjB,MAAMgpH,GAAU,OAAO,SAASR,EAAS,GAAKA,GAAY,EACtD,IAAI,KAAKA,EAAS,EAAE,eAAA,EACpB,eACE9oI,GAAQ,OAAO,SAAS8/H,GAAQ,KAAK,GAAKA,GAAQ,MAAQ,EAC5D,GAAG,KAAK,IAAI,EAAG,KAAK,MAAMA,GAAQ,MAAQ,IAAI,CAAC,CAAC,MAChD,eACEyJ,GAAS,SAAS,cAAc,KAAK,EAC3CA,GAAO,UAAY,wEACnBA,GAAO,YAAc,OAAOzJ,GAAQ,EAAE,EACtC,MAAM0J,GAAc,SAAS,cAAc,KAAK,EAChDA,GAAY,UAAY,mCACxBA,GAAY,YAAc,UAAUF,EAAO,MAAMtpI,EAAK,GACtDsgB,GAAK,YAAYipH,EAAM,EACvBjpH,GAAK,YAAYkpH,EAAW,EAC5BN,GAAQ,YAAY5oH,EAAI,EACxB,MAAMmpH,GAAS,SAAS,cAAc,QAAQ,EAC9CA,GAAO,KAAO,SACdA,GAAO,UAAY,mBACnBA,GAAO,YAAcZ,GAAY,UAAY,SAC7CY,GAAO,SAAWZ,GAClBY,GAAO,iBAAiB,QAAS,SAAY,CAC3C,GAAI,CAAAZ,GACJ,CAAAY,GAAO,SAAW,GAClB,GAAI,CACF,MAAMC,EAAgBp3G,EACtB,MAAO,KAAK,mBAAmB,gBAAgB,CAAE,UAAWwtG,GAAQ,GAAI,GACnE4J,GAAe,gBAAgB5J,GAAQ,EAAE,GACzC4J,GAAe,iBAAiB5J,GAAQ,EAAE,GAC/C,MAAMxtG,GAAS,OAAO,CACpB,GAAG4yG,GAAA,EACH,UAAW,CAAE,QAAS,EAAA,CAAM,CAC7B,EACD2C,GAAA,EACA9D,GAAA,CACF,QAAA,CACE0F,GAAO,SAAW,EACpB,EACF,CAAC,EACD,MAAME,GAAe,SAAS,cAAc,QAAQ,EACpDA,GAAa,KAAO,SACpBA,GAAa,UAAY,wEACzBA,GAAa,aAAa,aAAc,kBAAkBN,EAAW,EAAE,EACvEM,GAAa,YAAYhH,GAAS,qDAAqD,CAAC,EACxFhjC,EAAS,cAAcgqC,GAAc,2BAA2B,EAChEA,GAAa,iBAAiB,QAAS,SAAY,CAEjD,GADkB,WAAW,UAAU,yBAAyBN,EAAW,2BAA2B,GAAK,GAE3G,CAAAM,GAAa,SAAW,GACxBF,GAAO,SAAW,GAClB,GAAI,CACF,MAAOn3G,GAAW,cAAc,gBAAgBwtG,GAAQ,EAAE,EAC1D,MAAM2I,GAAA,CACR,QAAA,CACEkB,GAAa,SAAW,GACxBF,GAAO,SAAWZ,EACpB,EACF,CAAC,EACD,MAAMe,GAAa,SAAS,cAAc,KAAK,EAC/CA,GAAW,UAAY,qCACvBA,GAAW,YAAYH,EAAM,EAC7BG,GAAW,YAAYD,EAAY,EACnC,MAAMp3C,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,UAAY,8BACb02C,IAAW12C,GAAK,YAAY02C,EAAS,EACzC12C,GAAK,YAAY22C,EAAO,EACxB32C,GAAK,YAAYq3C,EAAU,EAC3BjuG,GAAI,YAAYklD,EAAK,EACrBllD,GAAI,YAAY42D,EAAI,EACpBi2C,GAAY,YAAY7sG,EAAG,CAC7B,CACF,EAEA2sG,GAAiB,iBAAiB,QAAS,SAAY,CACrDA,GAAiB,SAAW,GAC5B,GAAI,CACF,MAAMh2G,EAAU,KAAK,QAAQ,SAAW,KAClCu3G,GAAW,KAAK,QAAQ,wBAA0B,KAAK,QAAQ,wBAA0B,UAC/F,MAAMv3G,GAAS,cAAc,CAC3B,SAAAu3G,GACA,cAAe,QACf,eAAgB,GAChB,iBAAkB,GAClB,UAAW,CAAE,QAAS,EAAA,CAAM,CAC7B,EACD9F,GAAA,EACA,MAAM0E,GAAA,CACR,QAAA,CACEH,GAAiB,SAAW,EAC9B,CACF,CAAC,EACDC,GAAsB,iBAAiB,QAAS,IAAM,CAC/CE,GAAA,CACP,CAAC,EAED,MAAMqB,GAAgB,SAAS,cAAc,KAAK,EAC5CC,GAAmB,SAAS,cAAc,KAAK,EACrDA,GAAiB,MAAM,QAAU,OACjCA,GAAiB,MAAM,WAAa,SACpCA,GAAiB,MAAM,eAAiB,gBACxCA,GAAiB,MAAM,IAAM,MAC7BA,GAAiB,MAAM,OAAS,WAEhC,MAAMC,GAAoB,SAAS,cAAc,KAAK,EACtDA,GAAkB,UAAY,wBAE9B,MAAMC,GAAyBr7C,GAA6B,CAC1D,QAAS,GACT,QAAS,YACT,SAAU,aACV,UAAW,wBAAA,CACZ,EAEKs7C,GAAuB,SAAS,cAAc,KAAK,EACzDA,GAAqB,MAAM,QAAU,cACrCA,GAAqB,MAAM,WAAa,SACxCA,GAAqB,MAAM,IAAM,MACjCA,GAAqB,YAAYD,EAAsB,EAEvDF,GAAiB,YAAYC,EAAiB,EAC9CD,GAAiB,YAAYG,EAAoB,EAEjD,MAAMC,GAAsB,SAAS,cAAc,KAAK,EACxDA,GAAoB,UAAY,kCAEhC,MAAMC,GAAkB,SAAS,cAAc,OAAO,EACtDA,GAAgB,UAAY,6BAE5B,MAAMC,GAAiB,SAAS,cAAc,OAAO,EAC/CC,GAAoB,SAAS,cAAc,IAAI,EACrD,UAAWnsI,IAAS,CAAC,QAAS,YAAa,OAAQ,KAAK,EAAG,CACzD,MAAMosI,GAAK,SAAS,cAAc,IAAI,EACtCA,GAAG,YAAcpsI,EACjBmsI,GAAkB,YAAYC,EAAE,CAClC,CACAF,GAAe,YAAYC,EAAiB,EAE5C,MAAME,GAAiB,SAAS,cAAc,OAAO,EACrDJ,GAAgB,YAAYC,EAAc,EAC1CD,GAAgB,YAAYI,EAAc,EAC1CL,GAAoB,YAAYC,EAAe,EAE/C,MAAMK,GAAkB,SAAS,cAAc,KAAK,EACpDA,GAAgB,UAAY,wBAC5BA,GAAgB,YAAc,yBAC9BA,GAAgB,OAAS,GAEzBX,GAAc,YAAYC,EAAgB,EAC1CD,GAAc,YAAYK,EAAmB,EAC7CL,GAAc,YAAYW,EAAe,EAEzC,MAAMC,GAAuB,CAAC,CAAE,cAAAC,EAAgB,EAAA,EAAU,CAAA,IAAO,CAC/D,MAAMhrJ,GAAU,KAAK,QAAQ,SAAW,KACxC,GAAI,CAACA,GAAS,MAAO,CAAA,EACrB,MAAMirJ,GAAO,CAAA,EACPC,GAAa,CAACpsH,GAAOkjF,GAAU6pB,KAAY,CAC/C,MAAMsf,GAAWnpC,IAAU,KAAKhiH,EAAO,GAAK,CAAA,EAC5C,UAAWshH,MAAW6pC,GAAU,CAC9B,MAAM9vJ,GAAO,OAAOimH,EAAO,EAC3B,GAAI,CAAC0pC,GAAiBrO,GAAyBthJ,EAAI,EAAG,SACtD,MAAMyzE,GAAO+8D,IAAS,KAAK7rI,GAAS3E,EAAI,GAAK,KAC7C4vJ,GAAK,KAAK,CACR,MAAAnsH,GACA,KAAAzjC,GACA,KAAMqhJ,GAAoB5tE,IAAM,IAAI,EACpC,UAAW,OAAO,SAASA,IAAM,SAAS,EAAI,OAAOA,GAAK,SAAS,EAAI,GAAA,CACxE,CACH,CACF,EACA,OAAAo8E,GAAW,OAAQlrJ,GAAQ,sBAAuBA,GAAQ,oBAAoB,EAC9EkrJ,GAAW,OAAQlrJ,GAAQ,sBAAuBA,GAAQ,oBAAoB,EAC9EkrJ,GAAW,UAAWlrJ,GAAQ,yBAA0BA,GAAQ,uBAAuB,EACvFirJ,GAAK,KAAK,CAACt3I,GAAGC,KAAM,CAClB,MAAMw3I,GAAez3I,GAAE,MAAM,cAAcC,GAAE,KAAK,EAClD,OAAIw3I,KAAiB,EAAUA,GACxBz3I,GAAE,KAAK,cAAcC,GAAE,IAAI,CACpC,CAAC,EACMq3I,EACT,EAEMI,EAAwB,IAAM,CAClC,MAAML,EAAgBV,GAAuB,UAAY,GACnDW,GAAOF,GAAqB,CAAE,cAAAC,EAAe,EACnDH,GAAe,gBAAA,EACfR,GAAkB,YAAc,GAAGY,GAAK,MAAM,aAAaA,GAAK,SAAW,EAAI,GAAK,GAAG,GACvFH,GAAgB,OAASG,GAAK,OAAS,EACvCT,GAAoB,OAASS,GAAK,SAAW,EAC7C,UAAWjvG,MAAOivG,GAAM,CACtB,MAAMK,GAAK,SAAS,cAAc,IAAI,EACtC,UAAWxyJ,KAAS,CAACkjD,GAAI,MAAOA,GAAI,KAAMA,GAAI,KAAMA,GAAI,SAAS,EAAG,CAClE,MAAMuvG,GAAK,SAAS,cAAc,IAAI,EACtCA,GAAG,YAAczyJ,GACjBwyJ,GAAG,YAAYC,EAAE,CACnB,CACAV,GAAe,YAAYS,EAAE,CAC/B,CACF,EAEAhB,GAAuB,iBAAiB,SAAU,IAAM,CACtDe,EAAA,CACF,CAAC,EACDA,EAAA,EAEA,MAAMG,GAAY,SAAS,cAAc,KAAK,EACxCC,GAAgB,SAAS,cAAc,KAAK,EAClDA,GAAc,UAAY,0BAC1BA,GAAc,MAAM,UAAY,MAChCA,GAAc,MAAM,aAAe,OACnCA,GAAc,YAAYjE,EAAe,EACzCiE,GAAc,YAAY/D,EAAW,EAErC,MAAMgE,GAAe,SAAS,cAAc,QAAQ,EACpDA,GAAa,UAAY,mBACzB,MAAM9D,GAAmB,KAAK,QAAQ,UAAU,UAAY,KAEtD+D,GAAmB,SAAS,cAAc,OAAO,EACvDA,GAAiB,KAAO,SACxBA,GAAiB,UAAY,mBAC7BA,GAAiB,IAAM,IACvBA,GAAiB,KAAO,IACxBA,GAAiB,MAAQ,OAAO,KAAK,QAAQ,QAAQ,MAAM,OAAS,KAAK,QAAQ,MAAM,OAAS,IAAI,EACpGA,GAAiB,MAAM,SAAW,OAElC,MAAMC,GAAoB,SAAS,cAAc,OAAO,EACxDA,GAAkB,KAAO,SACzBA,GAAkB,UAAY,mBAC9BA,GAAkB,IAAM,IACxBA,GAAkB,KAAO,IACzBA,GAAkB,MAAQ,OAAO,KAAK,QAAQ,QAAQ,MAAM,QAAU,KAAK,QAAQ,MAAM,QAAU,IAAI,EACvGA,GAAkB,MAAM,SAAW,OAEnC,MAAMC,GAAiB,SAAS,cAAc,KAAK,EACnDA,GAAe,MAAM,QAAU,cAC/BA,GAAe,MAAM,WAAa,SAClCA,GAAe,MAAM,IAAM,MAC3BA,GAAe,YAAYF,EAAgB,EAC3CE,GAAe,YAAY,SAAS,eAAe,GAAG,CAAC,EACvDA,GAAe,YAAYD,EAAiB,EAE5C,MAAME,GAAsB,SAAS,cAAc,QAAQ,EAC3DA,GAAoB,UAAY,mBAChC,UAAWhzJ,IAAS,CAAC,EAAG,EAAG,CAAC,EAAG,CAC7B,MAAM2pH,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQ,OAAO3pH,CAAK,EACxB2pH,GAAI,YAAc,GAAG3pH,CAAK,IAC1BgzJ,GAAoB,YAAYrpC,EAAG,CACrC,CAEA,MAAMspC,GAAe/9C,GAAoB,CACvC,QAAS,GACT,QAAS,KACT,SAAU,MACV,UAAW,eAAA,CACZ,EACKg+C,GAAgBh+C,GAAoB,CACxC,QAAS,GACT,QAAS,KACT,SAAU,MACV,UAAW,gBAAA,CACZ,EACKi+C,GAAkBj+C,GAAoB,CAC1C,QAAS,GACT,QAAS,KACT,SAAU,MACV,UAAW,2BAAA,CACZ,EACKk+C,GAAcl+C,GAAoB,CACtC,QAAS,GACT,QAAS,KACT,SAAU,MACV,UAAW,mBAAA,CACZ,EACKm+C,GAAmBn+C,GAAoB,CAC3C,QAAS,GACT,QAAS,KACT,SAAU,MACV,UAAW,mBAAA,CACZ,EACKo+C,GAAmB38C,GAAoB,CAC3C,UAAW,aACX,MAAO,WACP,QAAS,CACP,CAAE,MAAO,WAAY,MAAO,UAAA,EAC5B,CAAE,MAAO,gBAAiB,MAAO,eAAA,CAAgB,EAEnD,SAAU,IAAM48C,GAAA,CAAa,CAC9B,EACD,IAAIC,GAAoB1E,IAAkB,cAAA,GAAmB,EAC7D,MAAM2E,GAAuBnlD,GAAY,OAAO,CAC9C,GAAI,qBACJ,MAAO,eACP,IAAK,IACL,IAAK,EACL,KAAM,IACN,OAAQ,CAAE,IAAK,IAAM,IAAK,CAAA,EAC1B,iBAAkB,CAAE,IAAK,GAAK,IAAK,GAAA,EACnC,IAAK,IAAMklD,GACX,IAAMxzJ,GAAU,CACd,MAAME,GAAU,OAAOF,CAAK,EACvB,OAAO,SAASE,EAAO,IAC5BszJ,GAAoBlwC,GAAYpjH,GAAS,GAAO,EAChD4uJ,IAAkB,cAAc0E,EAAiB,EACnD,CAAA,CACD,EACKE,GAAiB5jD,GAAgB2jD,GAAsB,CAC3D,KAAM,4GACN,UAAW,EACX,KAAM,GAAA,CACP,EACD,KAAK,iBAAiB,IAAIC,GAAe,OAAO,EAEhD,MAAMC,GAAe,SAAS,cAAc,QAAQ,EACpDA,GAAa,KAAO,SACpBA,GAAa,UAAY,mBACzBA,GAAa,YAAc,SAC3BA,GAAa,MAAM,WAAa,OAEhC,MAAMC,GAAiB,SAAS,cAAc,KAAK,EACnDA,GAAe,UAAY,2BAE3B,MAAMC,GAAkB,SAAS,cAAc,KAAK,EACpDA,GAAgB,UAAY,qCAC5B,MAAMC,GAAe,SAAS,cAAc,KAAK,EACjDA,GAAa,UAAY,kCACzBA,GAAa,IAAM,wBACnBA,GAAa,SAAW,QACxBA,GAAa,QAAU,QACvBD,GAAgB,YAAYC,EAAY,EAExC,MAAMC,GAAgB,SAAS,cAAc,KAAK,EAClDA,GAAc,UAAY,mCAC1BA,GAAc,YAAc,IAE5BH,GAAe,YAAYC,EAAe,EAC1CD,GAAe,YAAYG,EAAa,EAExC,MAAMC,GAAe,IAAIt6C,GACzBs6C,GAAa,IAAI,CACf,GAAI,iBACJ,MAAO,UACP,UAAW,GACX,UAAW,GACX,QAASJ,EAAA,CACV,EACD,MAAMK,GAAeD,GAAa,OAAO,IAAI,gBAAgB,GAAK,KAC5DE,GAAeD,IAAc,MAAQ,KACrCE,GAAkB,IAAMD,IAAc,QAAQ,YAAc,OAElE,IAAIE,GAAa,KACbC,GAAe,GACfC,GAAc,GACdC,GAA4B,EAC5BC,GAAe,KACfC,GAA2B,EAC3BC,GAAsB,EACtBC,GAA8B,GAC9BC,GAA2B,GAE/B,MAAMC,GAAkB,IAAM,CACvBT,KACL,IAAI,gBAAgBA,EAAU,EAC9BA,GAAa,KACf,EACA,KAAK,iBAAiB,IAAI,IAAMS,GAAA,CAAiB,EAEjD,MAAMC,GAAoBnxJ,GAAY,CAChCowJ,GAAc,cAAgBpwJ,IAClCowJ,GAAc,YAAcpwJ,EAC9B,EAEMoxJ,GAAmB,IAAM,CAC7BV,GAAe,EACjB,EAEMW,GAAuB,CAAC7pI,EAAUqlI,KAAc,CAEpDsE,GAAiB,GAAG3pI,EAAS,KAAK,IAAIA,EAAS,MAAM,EAAE,CACzD,EAEM8pI,GAAuB,MAAO,CAAE,MAAApuF,EAAQ,EAAA,EAAU,CAAA,IAAO,CAC7D,GAAI,CAAC,KAAK,QAAU,CAACquF,IAAmB,CAACf,GAAA,GAAqBG,IAAgB,CAACztF,GAAS,CAACwtF,GAAe,OACxG,MAAMlpI,GAAWgqI,GAAA,EACXC,GAAmBvT,GAAqC12H,GAAU,CACtE,SAAU,IACV,UAAW,GAAA,CACZ,EACK27C,GAAY,KAAK,UAAUsuF,EAAgB,EACjD,GAAI,CAACvuF,GAAS+tF,KAA6B9tF,IAAa6tF,KAAgCD,GAAqB,CAC3GL,GAAe,GACfW,GAAqB7pI,EAA0B,EAC/C,MACF,CACAmpI,GAAc,GACdD,GAAe,GACfW,GAAqB7pI,EAA0B,EAC/C,MAAMkqI,GAAa,EAAEZ,GACrB,GAAI,CACFF,IAA6B,EAC7B,MAAMpG,GAAOW,GACT,MAAMA,GAAiB,kBAAkB,CAAA,EAAI,CAC7C,SAAU,IACV,UAAW,GAAA,CACZ,EACC,MAAM,KAAK,OAAO,wBAAwB3jI,GAAU,CACpD,SAAU,IACV,UAAW,GAAA,CACZ,EACGmqI,GAAU,IAAI,gBAAgBnH,EAAI,EAOxC,GANA,MAAM,IAAI,QAAQ,CAAC1/F,GAAS8mG,KAAW,CACrC,MAAMj8D,GAAQ,IAAI,MAClBA,GAAM,OAAS,IAAM7qC,GAAA,EACrB6qC,GAAM,QAAU,IAAMi8D,GAAO,IAAI,MAAM,gCAAgC,CAAC,EACxEj8D,GAAM,IAAMg8D,EACd,CAAC,EACGD,KAAeZ,GAA0B,OAC7C,MAAMe,GAAUpB,GAChBA,GAAakB,GACbxB,GAAa,IAAMwB,GACnBV,GAA2B9tF,GAC3B6tF,GAA8BD,GAC1Bc,IAAS,IAAI,gBAAgBA,EAAO,EACxCR,GAAqB7pI,GAAUiqI,EAAgB,CACjD,OAASvwJ,GAAO,CACd,GAAIwwJ,KAAeZ,GAA0B,OAC7CK,GAAiBjwJ,cAAiB,MAAQA,GAAM,QAAU,2BAA2B,CACvF,QAAA,CACEyvJ,GAAc,EAChB,CACF,EAEMmB,GAAoB,IAAM,CAC1BjB,IAAgB,OACpBA,GAAe,WAAW,YAAY,IAAM,CACrCS,GAAA,CACP,EAAG,GAAI,EACT,EACMS,GAAmB,IAAM,CACzBlB,IAAgB,OACpB,WAAW,cAAcA,EAAY,EACrCA,GAAe,KACjB,EACA,KAAK,iBAAiB,IAAI,IAAMkB,GAAA,CAAkB,EAElD,MAAMC,GAAsB,IAAM,CAChC/G,GAAY,YAAc,IAAID,GAAmB,KAAK,EACxD,EAEMiH,GAAsB,IAAM9G,IAAkB,kBAAkB,CACpE,cAAe,OAAOkE,GAAoB,OAAS,CAAC,CAAA,CACrD,GAAK,KAAK,QAAQ,8BAA8B,CAC/C,cAAe,OAAOA,GAAoB,OAAS,CAAC,CAAA,CACrD,GAAK,CACJ,mBAAoB,KACpB,QAAS/Q,GAA4B,KAAK,QAAQ,QAAQ,MAAQ,KAAK,QAAQ,MAAQ,CAAA,EAAI,CAAE,mBAAoB,IAAA,EAAQ,OAAO+Q,GAAoB,OAAS,CAAC,CAAC,CAAA,EAG3J6C,GAAsB,CAAC7nG,EAAQ,KAAO,CACrC8gG,KACLA,GAAiB,OAAO9gG,CAAK,EAC7BwlG,GAAoB1E,GAAiB,iBAAmB0E,GAC1D,EAEMsC,GAA+B,IAAM,CACzC,MAAMpqJ,EAAQojJ,IAAkB,iBAAA,GAAsB,KACjDpjJ,IACDgjJ,GAAgB,QAAUhjJ,EAAM,WAAUgjJ,GAAgB,MAAQhjJ,EAAM,UACxEijJ,GAAmB,QAAUjjJ,EAAM,SAAQijJ,GAAmB,MAAQjjJ,EAAM,QAC5EknJ,GAAa,QAAU,OAAOlnJ,EAAM,QAAU,EAAE,IAAGknJ,GAAa,MAAQ,OAAOlnJ,EAAM,QAAU,EAAE,GACjGmnJ,GAAiB,QAAU,OAAOnnJ,EAAM,OAASmnJ,GAAiB,KAAK,IAAGA,GAAiB,MAAQ,OAAOnnJ,EAAM,OAASmnJ,GAAiB,KAAK,GAC/IC,GAAkB,QAAU,OAAOpnJ,EAAM,QAAUonJ,GAAkB,KAAK,IAAGA,GAAkB,MAAQ,OAAOpnJ,EAAM,QAAUonJ,GAAkB,KAAK,GACrJE,GAAoB,QAAU,OAAOtnJ,EAAM,eAAiB,CAAC,IAAGsnJ,GAAoB,MAAQ,OAAOtnJ,EAAM,eAAiB,CAAC,GAC/HunJ,GAAa,QAAUvnJ,EAAM,gBAAkB,GAC/CwnJ,GAAc,QAAUxnJ,EAAM,iBAAmB,GACjDynJ,GAAgB,QAAUznJ,EAAM,mBAAqB,GACrD0nJ,GAAY,QAAU1nJ,EAAM,YAAc,GAC1C2nJ,GAAiB,QAAU3nJ,EAAM,wBAA0B,GAC3D4nJ,GAAiB,MAAQ5nJ,EAAM,WAAa,WAC5C8nJ,GAAoB,OAAO9nJ,EAAM,aAAe8nJ,EAAiB,EACjEC,GAAqB,OAAA,EACvB,EAEMsC,GAAc,SAAS,cAAc,KAAK,EAChDA,GAAY,UAAY,yBACxBA,GAAY,aAAa,cAAe,MAAM,EAC9C,OAAO,OAAOA,GAAY,MAAO,CAC/B,SAAU,WACV,QAAS,OACT,UAAW,aACX,OAAQ,oBACR,cAAe,MAAA,CAChB,GACA,KAAK,QAAQ,QAAQ,SAAW,KAAK,WAAW,YAAYA,EAAW,EACxE,KAAK,iBAAiB,IAAI,IAAMA,GAAY,QAAQ,EAEpD,IAAIb,GAAkB,GAEtB,MAAMc,GAAoB,IAAM,CAC9B,MAAMnV,EAAa+U,GAAA,EACbzT,GAAUtB,GAAY,SAAW,CAAA,EACjCl0I,GAAWimJ,GAAa,OAAS/R,GAAY,eAAiB,SACpE+R,GAAa,gBAAA,EACb,IAAIqD,GAAiB,SACrB,UAAWjoI,MAASm0H,GAAS,CAC3B,MAAMx4B,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQ37F,GAAM,GAClB27F,GAAI,YAAc37F,GAAM,YAAc,GAAQ,GAAGA,GAAM,KAAK,iBAAmBA,GAAM,MACrF27F,GAAI,SAAW37F,GAAM,YAAc,GAC/BA,GAAM,YAAc,IAASioI,KAAmB,cAA2BjoI,GAAM,IACrF4kI,GAAa,YAAYjpC,EAAG,CAC9B,CACAipC,GAAa,MAAQ,MAAM,KAAKA,GAAa,OAAO,EAAE,KAAMjpC,IAAQA,GAAI,QAAUh9G,IAAY,CAACg9G,GAAI,QAAQ,EACvGh9G,GACAspJ,GACAnH,IAAoBA,GAAiB,SAAA,IAAe8D,GAAa,OACnEiD,GAAoB,CAAE,OAAQjD,GAAa,KAAA,CAAO,CAEtD,EAEMuC,GAAqB,IAAMrG,IAAkB,qBAAA,IAA2B,IAAM,CAClF,MAAMjO,EAAa+U,GAAA,EACnB,OAAOrV,GAA2B,CAChC,SAAUmO,GAAgB,MAC1B,OAAQC,GAAmB,MAC3B,OAAQiE,GAAa,MACrB,MAAOC,GAAiB,MACxB,OAAQC,GAAkB,MAC1B,cAAe,OAAOE,GAAoB,OAAS,CAAC,EACpD,cAAeC,GAAa,QAC5B,eAAgBC,GAAc,QAC9B,iBAAkBC,GAAgB,QAClC,YAAaK,GACb,sBAAuBH,GAAiB,UAAY,GACpD,UAAWC,GAAiB,KAAA,EAC3B,CACD,SAAU,KAAK,QAAQ,SACvB,WAAAzS,EACA,WAAY,KAAK,QAAQ,QAAQ,MAAQ,KAAK,QAAQ,MAAQ,CAAE,MAAO,EAAG,OAAQ,CAAA,CAAE,CACrF,CACH,GAAA,EAEMqV,GAAmB/qI,GAAa,CACpC,MAAMvoB,GAAOuoB,GAAU,aAAe,KAChC28D,GAAU,GAAQotE,KAAoBpG,IAAkB,eAAiBsE,GAAY,UAAYxwJ,IACvGmzJ,GAAY,MAAM,QAAUjuE,GAAU,QAAU,OAC3CA,KACLiuE,GAAY,MAAM,KAAO,GAAGnzJ,GAAK,CAAC,KAClCmzJ,GAAY,MAAM,IAAM,GAAGnzJ,GAAK,CAAC,KACjCmzJ,GAAY,MAAM,MAAQ,GAAGnzJ,GAAK,KAAK,KACvCmzJ,GAAY,MAAM,OAAS,GAAGnzJ,GAAK,MAAM,KAC3C,EAEM2wJ,GAAe,IAAM,CACzByC,GAAA,EACAF,GAAA,EACAH,GAAA,EACA,MAAMxqI,EAAWgqI,GAAA,EACXgB,GAAWhrI,EAAS,SAAW,SACrC0nI,GAAiB,SAAW,CAACsD,GAC7BrD,GAAkB,SAAW,CAACqD,GAC9B7C,GAAiB,SAAWD,GAAiB,UAAY,GACzDM,GAAa,SAAWxoI,EAAS,iBAAmB,GACpDwoI,GAAa,MAAQxoI,EAAS,iBAAmB,GAC7C,gBACA,yBAAyBA,EAAS,WAAW,IAAIA,EAAS,YAAY,0CAA0CA,EAAS,WAAW,kBAAkB,MAC1J+qI,GAAgB/qI,CAAQ,EACxB2pI,GAAiB,GAAG3pI,EAAS,KAAK,IAAIA,EAAS,MAAM,EAAE,EACvD4pI,GAAA,EACIG,IAAmBf,MACrBsB,GAAA,EACK3B,GAAa,KAAUmB,GAAqB,CAAE,MAAO,GAAM,GAEhES,GAAA,CAEJ,EAEA/G,GAAmB,iBAAiB,SAAU,IAAM,CAClDkH,GAAoB,CAAE,OAAQlH,GAAmB,KAAA,CAAO,EACxD4E,GAAA,CACF,CAAC,EACDX,GAAa,iBAAiB,SAAU,IAAM,CAC5CiD,GAAoB,CAAE,OAAQjD,GAAa,KAAA,CAAO,EAClDW,GAAA,CACF,CAAC,EACDP,GAAoB,iBAAiB,SAAU,IAAM,CACnD6C,GAAoB,CAAE,cAAe,OAAO7C,GAAoB,OAAS,CAAC,EAAG,EAC7EO,GAAA,CACF,CAAC,EACDV,GAAiB,iBAAiB,SAAU,IAAM,CAChDgD,GAAoB,CAAE,WAAY,CAAE,MAAOhD,GAAiB,MAAO,OAAQC,GAAkB,KAAA,EAAS,EACtGS,GAAA,CACF,CAAC,EACDT,GAAkB,iBAAiB,SAAU,IAAM,CACjD+C,GAAoB,CAAE,WAAY,CAAE,MAAOhD,GAAiB,MAAO,OAAQC,GAAkB,KAAA,EAAS,EACtGS,GAAA,CACF,CAAC,EACDN,GAAa,iBAAiB,SAAU,IAAM,CAC5C4C,GAAoB,CAAE,cAAe5C,GAAa,OAAA,CAAS,EAC3DM,GAAA,CACF,CAAC,EACDL,GAAc,iBAAiB,SAAU,IAAM,CAC7C2C,GAAoB,CAAE,eAAgB3C,GAAc,OAAA,CAAS,EAC7DK,GAAA,CACF,CAAC,EACDJ,GAAgB,iBAAiB,SAAU,IAAM,CAC/C0C,GAAoB,CAAE,iBAAkB1C,GAAgB,OAAA,CAAS,EACjEI,GAAA,CACF,CAAC,EACDH,GAAY,iBAAiB,SAAU,IAAM,CAC3CyC,GAAoB,CAAE,UAAWzC,GAAY,OAAA,CAAS,EACtDG,GAAA,CACF,CAAC,EACDF,GAAiB,iBAAiB,SAAU,IAAM,CAChDwC,GAAoB,CAAE,sBAAuBxC,GAAiB,UAAY,GAAM,EAChFE,GAAA,CACF,CAAC,EACDD,GAAiB,iBAAiB,SAAU,IAAM,CAChDuC,GAAoB,CAAE,UAAWvC,GAAiB,KAAA,CAAO,EACzDC,GAAA,CACF,CAAC,EACD,MAAM6C,GAAyB3C,GAAqB,UAAU,IAAMF,KAAgB,CAAE,UAAW,GAAO,EAExG,GADA,KAAK,iBAAiB,IAAI,IAAM6C,GAAA,CAAwB,EACpDtH,IAAkB,GAAI,CACxB,MAAMv1C,EAAcu1C,GAAiB,GAAG,SAAU,IAAM,CACtDgH,GAAA,EACAvC,GAAA,CACF,CAAC,EACD,KAAK,iBAAiB,IAAIh6C,CAAW,CACvC,CAEA,MAAM88C,GAAmB,SAAS,cAAc,KAAK,EACrDA,GAAiB,YAAYlvC,EAAiB,CAC5C,MAAO,SACP,KAAM,mFACN,SAAUwnC,EAAA,CACX,EAAE,GAAG,EACN0H,GAAiB,YAAYlvC,EAAiB,CAC5C,MAAO,OACP,KAAM,oFACN,SAAUyrC,EAAA,CACX,EAAE,GAAG,EACNyD,GAAiB,YAAYlvC,EAAiB,CAC5C,MAAO,SACP,KAAM,4CACN,SAAU4rC,EAAA,CACX,EAAE,GAAG,EACNsD,GAAiB,YAAYlvC,EAAiB,CAC5C,MAAO,gBACP,KAAM,2GACN,SAAU6rC,EAAA,CACX,EAAE,GAAG,EACNqD,GAAiB,YAAYlvC,EAAiB,CAC5C,MAAO,UACP,KAAM,mFACN,SAAU+rC,EAAA,CACX,EAAE,GAAG,EACNmD,GAAiB,YAAYlvC,EAAiB,CAC5C,MAAO,YACP,KAAM,gGACN,SAAUgsC,EAAA,CACX,EAAE,GAAG,EACNkD,GAAiB,YAAY3C,GAAe,OAAO,EACnD2C,GAAiB,YAAYlvC,EAAiB,CAC5C,MAAO,SACP,KAAM,oDACN,SAAU8rC,EAAA,CACX,EAAE,GAAG,EACNoD,GAAiB,YAAYlvC,EAAiB,CAC5C,MAAO,aACP,KAAM,mHACN,SAAUksC,EAAA,CACX,EAAE,GAAG,EACNgD,GAAiB,YAAYlvC,EAAiB,CAC5C,MAAO,QACP,KAAM,gHACN,SAAUmsC,EAAA,CACX,EAAE,GAAG,EACN+C,GAAiB,YAAYlvC,EAAiB,CAC5C,MAAO,QACP,KAAM,6DACN,SAAUisC,EAAA,CACX,EAAE,GAAG,EACNT,GAAc,YAAYgB,EAAY,EACtC0C,GAAiB,YAAY1D,EAAa,EAC1CqB,GAAa,QAAQ,MAAM,UAAY,MACvCqC,GAAiB,YAAYrC,GAAa,OAAO,EACjDtB,GAAU,YAAY2D,EAAgB,EAEtCrM,GAAW,iBAAiB,QAAS,IAAM,CACzCuD,GAAkC,IAAM5D,EAAU,OAAO,CAC3D,CAAC,EACDA,EAAU,iBAAiB,SAAU,SAAY,CAC/C,MAAM2M,EAAO3M,EAAU,QAAQ,CAAC,GAAK,KAErC,GADAA,EAAU,MAAQ,GACd,EAAC2M,EACL,CAAAtM,GAAW,SAAW,GACtBC,EAAW,SAAW,GACtB,GAAI,CACF,MAAM,KAAK,OAAO,YAAYqM,EAAM,CAClC,WAAY,GACZ,iBAAkB,GAClB,WAAY,GACZ,mBAAoB,GACpB,uBAAyBjqJ,IAAWohJ,GAA2B,CAC7D,GAAGphJ,GACH,WAAYiqJ,EAAK,IAAA,CAClB,CAAA,CACF,EACD,MAAMC,GAAW,KAAK,OAAO,wBAA0BD,EAAK,KAAK,QAAQ,WAAY,EAAE,EACjFE,GAAYxI,GAAiBuI,EAAQ,EACvCC,KACF/V,GAAW+V,GACXvI,GAAoBuI,GACpBjI,GAAU,MAAQiI,GAClB9H,GAAgB,MAAQ8H,GACxB1H,IAAkB,WAAW0H,EAAS,GAExCzI,GAAe,KAAK,OAAO,0BAA4BA,GACnDA,IAAgB,CAAC,QAAS,QAAS,OAAQ,MAAO,IAAI,EAAE,SAASA,EAAY,IAC/EnE,GAAa,MAAQmE,GACrBU,GAAA,EAEJ,OAAS5pJ,GAAO,CAEd,QAAQ,MAAM,yBAA0BA,EAAK,CAC/C,QAAA,CACEuqJ,GAAA,EACApF,GAAW,SAAW,GACtBC,EAAW,SAAW,EACxB,EACF,CAAC,EAEDA,EAAW,iBAAiB,QAAS,SAAY,CAC/CA,EAAW,SAAW,GACtBD,GAAW,SAAW,GACtB,GAAI,CACF6E,GAAeN,EAAS,EACxB,MAAMp/F,EAAMy6F,GAAa,MACzB,IAAIuE,GAAO,KACX,GAAIh/F,IAAQ,OAASA,IAAQ,KAC3B,MAAM,KAAK,OAAO,iCAAA,EAClBg/F,GAAO,MAAM,KAAK,OAAO,YAAYh/F,EAAK,CAAE,OAAQ,OAAQ,MACvD,CACL,MAAMsnG,GAAc,CAClB,OAAQ,OACR,qBAAsB,GACtB,wBAAyB,GACzB,uBAAwB,GACxB,cAAe,CAAE,eAAgB,EAAA,EACjC,QAAS,CAAE,eAAgB,EAAA,CAAM,EAEnCtI,GAAO,MAAM,KAAK,OAAO,SAAS,sBAAsBh/F,EAAKsnG,EAAW,GACnE,MAAM,KAAK,OAAO,sBAAsBtnG,EAAKsnG,EAAW,GACxD,MAAM,KAAK,OAAO,YAAYtnG,EAAK,CAAE,OAAQ,OAAQ,CAC5D,CACA,GAAIg/F,GAAM,CACR,MAAMhP,GAAW,GAAG8O,EAAiB,IAAI9+F,CAAG,GAC5C++F,GAAaC,GAAMhP,EAAQ,CAC7B,CACA,MAAM,KAAK,OAAO,SAAS,OAAOsN,IAAkC,CACtE,OAAS5nJ,EAAO,CAEd,QAAQ,MAAM,yBAA0BA,CAAK,CAC/C,QAAA,CACEuqJ,GAAA,EACA9D,GAAA,EACArB,EAAW,SAAW,GACtBD,GAAW,SAAW,EACxB,CACF,CAAC,EAED2J,GAAa,iBAAiB,QAAS,SAAY,CACjDA,GAAa,SAAW,GACxB,GAAI,CACF9E,GAAeH,EAAe,EAC9BI,IAAkB,WAAWJ,GAAgB,KAAK,EAClD,MAAMvjI,EAAWgqI,GAAA,EACXhH,GAAOW,GACT,MAAMA,GAAiB,aACvB,MAAM,KAAK,OAAO,iBAAiB3jI,CAAQ,EAC/C+iI,GAAaC,GAAMhjI,EAAS,QAAQ,CACtC,OAAStmB,EAAO,CAEd,QAAQ,MAAM,0BAA2BA,CAAK,CAChD,QAAA,CACE0uJ,GAAA,CACF,CACF,CAAC,EAED3J,GAAa,iBAAiB,SAAU,IAAM,CAC5C6E,GAAA,EACAW,GAAA,CACF,CAAC,EAGD,MAAMnuB,GAAoB,IAAM,CAC9By1B,GAAA,EACAtH,GAAA,EACA9D,GAAA,EACAiH,EAAA,EACAgB,GAAA,CACF,EACA,IAAIhhD,GAAQ,KACR,KAAK,QAAQ,GACfA,GAAQ,KAAK,OAAO,GAAG,mBAAoB0uB,EAAiB,EACnD,KAAK,QAAQ,mBACtB,KAAK,OAAO,iBAAiB,mBAAoBA,EAAiB,EAClE1uB,GAAQ,IAAM,KAAK,OAAO,oBAAoB,mBAAoB0uB,EAAiB,GAEjF1uB,IAAO,KAAK,iBAAiB,IAAIA,EAAK,EAC1C,MAAMokD,GAAiB,KAAK,QAAQ,SAAW,KAC/CA,IAAgB,mBAAmB,SAAUvK,EAA8B,EAC3E,KAAK,iBAAiB,IAAI,IAAM,CAC9BuK,IAAgB,sBAAsB,SAAUvK,EAA8B,CAChF,CAAC,EACG0C,KACFA,GAAiB,WAAWb,EAAiB,EAC7C6H,GAAA,GAGF,IAAIc,GAAuB,KAC3B,MAAMF,GAA2B,IAAM,CACrCE,KAAA,EACAA,GAAuB,KACvB,MAAM1vJ,EAAU,KAAK,QAAQ,SAAW,KACxC,GAAI,CAACA,EAAS,OACd,MAAM7C,GAAWhC,IAAU,CACzB,MAAM2jC,GAAQ3jC,IAAO,QAAQ,MACzB2jC,IAASA,KAAU,QAAUA,KAAU,QAAUA,KAAU,WAC/DusH,EAAA,CACF,EACA,GAAI,OAAOrrJ,EAAQ,IAAO,WAAY,CACpC,MAAM85H,GAAS,CACb95H,EAAQ,GAAG,oBAAqB7C,EAAO,EACvC6C,EAAQ,GAAG,oBAAqB7C,EAAO,EACvC6C,EAAQ,GAAG,oBAAqB7C,EAAO,CAAA,EAEzCuyJ,GAAuB,IAAM,CAC3B,UAAWC,MAAgB71B,GAAQ61B,KAAA,CACrC,CACF,MAAW,OAAO3vJ,EAAQ,kBAAqB,aAC7CA,EAAQ,iBAAiB,oBAAqB7C,EAAO,EACrD6C,EAAQ,iBAAiB,oBAAqB7C,EAAO,EACrD6C,EAAQ,iBAAiB,oBAAqB7C,EAAO,EACrDuyJ,GAAuB,IAAM,CAC3B1vJ,EAAQ,oBAAoB,oBAAqB7C,EAAO,EACxD6C,EAAQ,oBAAoB,oBAAqB7C,EAAO,EACxD6C,EAAQ,oBAAoB,oBAAqB7C,EAAO,CAC1D,EAEJ,EACAqyJ,GAAA,EACA,KAAK,iBAAiB,IAAI,IAAME,KAAA,CAAwB,EAExD,MAAME,GAAgB,IAAM,CAC1B,GAAIvC,GAA4B,EAAG,CACjCA,IAA6B,EAC7B,MACF,CACAG,IAAuB,EACvBK,GAAA,CACF,EACA,IAAIgC,GAAmB,KACnB,KAAK,QAAQ,GACfA,GAAmB,KAAK,OAAO,GAAG,eAAgBD,EAAa,EACtD,KAAK,QAAQ,mBACtB,KAAK,OAAO,iBAAiB,eAAgBA,EAAa,EAC1DC,GAAmB,IAAM,KAAK,OAAO,oBAAoB,eAAgBD,EAAa,GAEpFC,IAAkB,KAAK,iBAAiB,IAAIA,EAAgB,EAEhE,MAAMC,GAAc,KAAK,QAAQ,QAAQ,WAAW,IAAMzD,IAAc,EACpEyD,IAAa,KAAK,iBAAiB,IAAIA,EAAW,EAEtD/C,IAAc,OAAO,iBAAiB,QAAS,IAAM,CAC/CiB,IAAmBf,MACrBY,GAAA,EACAU,GAAA,EACK3B,GAAa,KAAUmB,GAAqB,CAAE,MAAO,GAAM,GAEhES,GAAA,CAEJ,CAAC,EAED,MAAMuB,GAAW,CACf,CAAE,GAAI,UAAW,MAAO,UAAW,QAAS3H,EAAA,EAC5C,CAAE,GAAI,SAAU,MAAO,SAAU,QAASoD,EAAA,EAC1C,CAAE,GAAI,aAAc,MAAO,aAAc,QAASrB,EAAA,CAAc,EAE9DjG,GAAgB6L,GAAS,KAAK,CAAE,GAAI,UAAW,MAAO,UAAW,QAAS1H,GAAY,EAE1F,MAAMr1C,GAAO,IAAID,GAAY,CAC3B,QAAS,QACT,gBAAkB7nG,GAAO,CACvB8iJ,GAAkB9iJ,IAAO,SACzBmhJ,GAAA,CACF,EACA,KAAM0D,EAAA,CACP,EACD,YAAK,iBAAiB,IAAI,IAAM/8C,GAAK,SAAS,EAC9Cg1B,EAAU,YAAYh1B,GAAK,OAAO,EAClCq5C,GAAA,EACInI,GAAqB4E,GAAA,EAClB9gB,CACT,GAAA,EAEMgoB,EAAa,CAACC,EAAe,CACjC,OAAA5zJ,EAAS,KAAK,OACd,KAAA6zJ,GAAQvO,IAAiB,KAAK,mBAAmBA,EAAY,CAAA,EAC3D,KAAO,CACT,MAAM3Z,GAAY,SAAS,cAAc,KAAK,EAC9C,UAAW2Z,MAAgBsO,EAAe,CACxC,MAAMnhF,GAAOtiD,IAAWm1H,EAAY,GAAK,KAEzC,GADI7yE,IAAM,MAAQA,GAAK,OAAS,UAC5B,OAAOzyE,IAASslJ,EAAY,GAAM,WAAY,SAClD,MAAMztE,GAAYg8E,GAAKvO,EAAY,EAC7BnjI,EAAQ01D,GAAU,OAASpF,IAAM,OAASwkC,GAAqBquC,EAAY,EAC3EngD,GAAO4gD,EAAqBT,EAAY,EACxC3lG,GAAM4sD,GAAgB10B,GAAW,CACrC,MAAO11D,EACP,KAAMswD,IAAM,aAAe,KAC3B,eAAgBszD,EAAqB5gC,EAAI,CAAA,CAC1C,EACDwmC,GAAU,YAAYhsF,GAAI,OAAO,EACjC,KAAK,iBAAiB,IAAIA,GAAI,OAAO,CACvC,CACA,OAAOgsF,EACT,EAEMmoB,EAAkB,CAACxO,EAAc,CACrC,OAAAtlJ,EAAS,KAAK,OACd,KAAA6zJ,GAAQ70J,IAAS,KAAK,mBAAmBA,EAAI,CAAA,EAC3C,KAAO,CACT,MAAMyzE,GAAOtiD,IAAWm1H,CAAY,GAAK,KAEzC,GADI,CAAC7yE,IAAQA,GAAK,OAAS,WACvB,OAAOzyE,IAASslJ,CAAY,GAAM,WAAY,OAAO,KACzD,MAAMztE,GAAYg8E,GAAKvO,CAAY,EAC7BnjI,GAAQ01D,GAAU,OAASpF,GAAK,OAASwkC,GAAqBquC,CAAY,EAC1EjvC,GAAS1E,GAAoB,CACjC,QAAS,GACT,QAAS,KACT,SAAU,MACV,UAAWxvF,GACX,SAAU01D,GAAU,QAAA,CACrB,EAEKk8E,EAAct3J,IAAU,CAC5B,MAAMkE,GAAU,EAAQlE,GACxB45G,GAAO,QAAU11G,GACjB01G,GAAO,SAAWx+B,GAAU,QAC9B,EAEMm3B,GAAQn3B,GAAU,UAAWp7E,IAAU,CAC3Cs3J,EAAWt3J,EAAK,CAClB,CAAC,EAED45G,GAAO,iBAAiB,SAAU,IAAM,CACtCx+B,GAAU,MAAMw+B,GAAO,QAAS,CAAE,OAAQ,KAAM,MAAO,SAAU,CACnE,CAAC,EAED,MAAM3H,GAAW,SAAS,cAAc,KAAK,EAC7CA,GAAS,UAAY,0BACrBA,GAAS,YAAY2H,EAAM,EAC3B,KAAM,CAAE,IAAA12D,EAAA,EAAQikE,EAAiB,CAC/B,MAAOzhG,GACP,KAAMswD,GAAK,aAAe,KAC1B,SAAAi8B,GACA,eAAgBq3B,EAAqBggB,EAAqBT,CAAY,CAAC,CAAA,CACxE,EACD,YAAK,iBAAiB,IAAI,IAAMt2C,GAAA,CAAO,EAChCrvD,EACT,EAEMq0G,EAAkB,CAAC1O,EAAcjoJ,EAAS,CAC9C,OAAA2C,GAAS,KAAK,OACd,KAAA6zJ,GAAQ70J,IAAS,KAAK,mBAAmBA,EAAI,CAAA,EAC3C,KAAO,CACT,MAAMyzE,GAAOtiD,IAAWm1H,CAAY,GAAK,KAEzC,GADI,CAAC7yE,IAAQA,GAAK,OAAS,UACvB,OAAOzyE,KAASslJ,CAAY,GAAM,WAAY,OAAO,KACzD,MAAMztE,GAAYg8E,GAAKvO,CAAY,EAC7BnjI,GAAQ01D,GAAU,OAASpF,GAAK,OAASwkC,GAAqBquC,CAAY,EAC1EhyC,EAASF,GAAoB,CACjC,UAAWjxF,GACX,QAAA9kB,EACA,MAAOw6E,GAAU,MAAA,CAAM,CACxB,EAEKo8E,GAAcx3J,IAAU,CAC5B62G,EAAO,MAAQ,OAAO72G,IAAS,EAAE,EACjC62G,EAAO,SAAWz7B,GAAU,QAC9B,EAEMm3B,GAAQn3B,GAAU,UAAWp7E,IAAU,CAC3Cw3J,GAAWx3J,EAAK,CAClB,CAAC,EAED62G,EAAO,iBAAiB,SAAU,IAAM,CACtCz7B,GAAU,MAAMy7B,EAAO,MAAO,CAAE,OAAQ,KAAM,MAAO,SAAU,CACjE,CAAC,EAED,MAAM5E,GAAW,SAAS,cAAc,KAAK,EAC7CA,GAAS,UAAY,0BACrBA,GAAS,YAAY4E,CAAM,EAC3B,KAAM,CAAE,IAAA3zD,EAAA,EAAQikE,EAAiB,CAC/B,MAAOzhG,GACP,KAAMswD,GAAK,aAAe,KAC1B,SAAAi8B,GACA,eAAgBq3B,EAAqBggB,EAAqBT,CAAY,CAAC,CAAA,CACxE,EACD,YAAK,iBAAiB,IAAI,IAAMt2C,GAAA,CAAO,EAChCrvD,EACT,EAEMpxB,EAAW9xB,GAAU,CACzB,MAAM63B,EAAI,OAAO73B,CAAK,EACtB,OAAK,OAAO,SAAS63B,CAAC,EACf,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGA,CAAC,CAAC,EADD,CAElC,EAEM4/H,EAAgBz0H,GAAS,CAC7B,MAAMkxB,EAAI,KAAK,MAAM,IAAMpiC,EAAQkR,IAAO,CAAC,GAAK,CAAC,CAAC,EAC5CmxB,GAAI,KAAK,MAAM,IAAMriC,EAAQkR,IAAO,CAAC,GAAK,CAAC,CAAC,EAC5CloB,GAAI,KAAK,MAAM,IAAMgX,EAAQkR,IAAO,CAAC,GAAK,CAAC,CAAC,EAClD,MAAO,IAAIkxB,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,GAAGC,GAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,GAAGr5C,GAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAChH,EACM48I,EAAe13J,GAAU,CAC7B,MAAMq2B,EAAM,OAAOr2B,GAAS,EAAE,EAAE,OAAO,QAAQ,KAAM,EAAE,EACvD,GAAI,CAAC,+BAA+B,KAAKq2B,CAAG,EAAG,OAAO,KACtD,MAAM69B,GAAI,SAAS79B,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAChC89B,GAAI,SAAS99B,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAChCvb,GAAI,SAASub,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAChCxb,GAAIwb,EAAI,SAAW,EAAI,SAASA,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IAC7D,MAAK,CAAC69B,GAAGC,GAAGr5C,GAAGD,EAAC,EAAE,MAAM,OAAO,QAAQ,EAChC,CAACq5C,GAAI,IAAKC,GAAI,IAAKr5C,GAAI,IAAKD,GAAI,GAAG,EADO,IAEnD,EACM88I,EAAwB33J,GAAU,CACtC,MAAMO,EAAam3J,EAAY13J,CAAK,GAAKA,EACnC8B,GAAS81J,GAAoB,YAAc,KAAK,QAAQ,YAAc,KAAK,QAAQ,WACrF,OAAO91J,IAAW,YAAYA,GAAO,KAAK81J,GAAsB,KAAK,OAAQr3J,CAAU,EAC3Fs3J,EAA8B,aAAct3J,EAAY,YAAY,CACtE,EAEMu3J,EAA+B,CAAC,CAAE,UAAAviD,EAAW,SAAAye,EAAU,SAAAC,MAAe,CAC1E,MAAM/wE,GAAM,SAAS,cAAc,KAAK,EACxCA,GAAI,MAAM,QAAU,OACpBA,GAAI,MAAM,IAAM,MAChBA,GAAI,MAAM,WAAa,SACvBA,GAAI,MAAM,MAAQ,OAElB,MAAM0sE,GAAa,SAAS,cAAc,KAAK,EAC/CA,GAAW,UAAY,yBAEvB,MAAMp3B,GAAS,SAAS,cAAc,KAAK,EAC3CA,GAAO,UAAY,iCAEnB,MAAMq3B,GAAa,SAAS,cAAc,OAAO,EACjDA,GAAW,KAAO,QAClBA,GAAW,UAAY,gCACvBA,GAAW,aAAa,aAActa,CAAS,EAE/C,MAAMua,EAAa,SAAS,cAAc,OAAO,EACjDA,EAAW,KAAO,SAClBA,EAAW,UAAY,mBACvBA,EAAW,IAAM,IACjBA,EAAW,IAAM,IACjBA,EAAW,KAAO,OAClBA,EAAW,MAAM,SAAW,OAC5BA,EAAW,MAAQ,QACnBA,EAAW,aAAa,aAAc,GAAGva,CAAS,QAAQ,EAE1D,MAAMwa,GAAa,SAAS,cAAc,MAAM,EAChDA,GAAW,YAAc,QACzBA,GAAW,MAAM,MAAQ,yBAEzB,MAAMC,GAAWgE,IAAA,EAEjB,IAAI/D,GAAU,UACV9lH,GAAQ,EACZ,GAAI,OAAO6lH,IAAa,SAAU,CAChC,MAAM35F,GAAM25F,GAAS,WAAW,GAAG,EAAIA,GAAS,MAAM,CAAC,EAAIA,GAC3DC,GAAU55F,GAAI,QAAU,EAAI,IAAIA,GAAI,MAAM,EAAG,CAAC,CAAC,GAAK,UACpD,MAAM65F,GAAW75F,GAAI,SAAW,EAAIA,GAAI,MAAM,EAAG,CAAC,EAAI,KACtDlsB,GAAQ,KAAK,MAAO,SAAS+lH,GAAU,EAAE,EAAI,IAAO,GAAG,EAAI,GAC7D,MAAW,MAAM,QAAQF,EAAQ,GAAK,YAAY,OAAOA,EAAQ,KAC/DC,GAAUwnC,EAAaznC,EAAQ,EAC/B7lH,GAAQ2nB,EAAQk+F,KAAW,CAAC,GAAK,CAAC,GAGpCH,GAAW,MAAQI,GACnBH,EAAW,MAAQ,OAAO,OAAO,SAAS3lH,EAAK,EAAIA,GAAQ,CAAC,EAC5D,IAAI4tJ,GAAqBr0C,GAAOmM,GAAW,MAAO/9F,EAAQg+F,EAAW,KAAK,CAAC,EAC3Et3B,GAAO,MAAM,WAAaq3B,GAAW,MAErC,MAAMtS,GAAS,IAAM,CACnB,MAAM1iG,GAAIyoG,GAAYwM,EAAW,MAAO,CAAE,IAAK,EAAG,IAAK,EAAG,EAC1D,GAAIj1G,IAAK,KAAM,OACf,MAAM43F,GAAYiR,GAAOmM,GAAW,MAAOh1G,EAAC,EACxC43F,KAAcslD,KAClBA,GAAqBtlD,GACrBwhB,KAAWxhB,EAAS,EACpBja,GAAO,MAAM,WAAaq3B,GAAW,MACvC,EAEA,OAAAA,GAAW,iBAAiB,QAAStS,EAAM,EAC3CuS,EAAW,iBAAiB,SAAUvS,EAAM,EAE5CqS,GAAW,YAAYp3B,EAAM,EAC7Bo3B,GAAW,YAAYC,EAAU,EACjC3sE,GAAI,YAAY0sE,EAAU,EAC1B1sE,GAAI,YAAY6sE,EAAU,EAC1B7sE,GAAI,YAAY4sE,CAAU,EACnB5sE,EACT,EAEM80G,EAAsB,CAAC,CAAE,UAAAziD,EAAW,SAAAye,EAAU,SAAAC,MAAe,CACjE,MAAM/wE,GAAM,SAAS,cAAc,KAAK,EACxCA,GAAI,MAAM,QAAU,OACpBA,GAAI,MAAM,IAAM,MAChBA,GAAI,MAAM,WAAa,SACvBA,GAAI,MAAM,MAAQ,OAElB,MAAM0sE,GAAa,SAAS,cAAc,KAAK,EAC/CA,GAAW,UAAY,yBAEvB,MAAMp3B,GAAS,SAAS,cAAc,KAAK,EAC3CA,GAAO,UAAY,iCAEnB,MAAMq3B,GAAa,SAAS,cAAc,OAAO,EACjDA,GAAW,KAAO,QAClBA,GAAW,UAAY,gCACvBA,GAAW,aAAa,aAActa,CAAS,EAE/Csa,GAAW,MAAQ4nC,EAAazjC,KAAY,EAC5C,IAAI+jC,EAAqBr0C,GAAOmM,GAAW,MAAO,CAAC,EACnDr3B,GAAO,MAAM,WAAaq3B,GAAW,MACrC,MAAMtS,GAAS,IAAM,CACnB,MAAM9K,GAAYiR,GAAOmM,GAAW,MAAO,CAAC,EACxCpd,KAAcslD,IAClBA,EAAqBtlD,GACrBwhB,KAAWxhB,EAAS,EACpBja,GAAO,MAAM,WAAaq3B,GAAW,MACvC,EACA,OAAAA,GAAW,iBAAiB,QAAStS,EAAM,EAE3CqS,GAAW,YAAYp3B,EAAM,EAC7Bo3B,GAAW,YAAYC,EAAU,EACjC3sE,GAAI,YAAY0sE,EAAU,EACnB1sE,EACT,EAEM+0G,EAA0B,CAAC/gB,EAAiB,OAAS,CACzD,MAAMrgC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,UAAY,mBACnBA,EAAO,aAAa,aAAc,wBAAwB,EAE1D,MAAMqhD,GAAyB,IAAM,CACnC,MAAMhxJ,GAAU,KAAK,QAAQ,SAAW,KACxC,GAAI,CAACA,IAAW,OAAOA,GAAQ,uBAA0B,iBAAmB,CAAA,EAC5E,GAAI,CACF,MAAMmvB,EAAMnvB,GAAQ,sBAAA,GAA2B,CAAA,EACzCoL,GAAM,CAAA,EACZ,UAAW/P,MAAQ8zB,EACb,OAAO9zB,IAAS,UACfuhH,GAAsBvhH,EAAI,GAC/B+P,GAAI,KAAK/P,EAAI,EAEf,OAAA+P,GAAI,KAAK,CAACuI,GAAGC,KAAMD,GAAE,cAAcC,EAAC,CAAC,EAC9BxI,EACT,MAAY,CACV,MAAO,CAAA,CACT,CACF,EAEM6b,GAAiB,IAAM,CAC3B,MAAMgqI,GAAajhB,GAAgB,SAAA,GAAc,KAAK,QAAQ,cAAA,EACxD7sI,EAAU,OAAO8tJ,IAAe,SAAWA,GAAW,OAAS,GAC/DC,GAAY/tJ,IAAY,MAAQ,SAAWA,EAE3CzJ,GAAU,CACd,CAAE,MAAO,GAAI,MAAO,wBAAA,EACpB,CAAE,MAAO,SAAU,MAAO,kBAAA,CAAmB,EAEzConF,GAAO,IAAI,IAAIpnF,GAAQ,IAAKotB,IAAUA,GAAM,KAAK,CAAC,EACxD,UAAWzrB,MAAQ21J,KACblwE,GAAK,IAAIzlF,EAAI,IACjB3B,GAAQ,KAAK,CAAE,MAAO2B,GAAM,MAAOA,GAAM,EACzCylF,GAAK,IAAIzlF,EAAI,GAEX61J,IAAa,CAACpwE,GAAK,IAAIowE,EAAS,IAClCx3J,GAAQ,KAAK,CAAE,MAAOw3J,GAAW,MAAO,GAAGA,EAAS,YAAa,EACjEpwE,GAAK,IAAIowE,EAAS,GAGpBvhD,EAAO,gBAAA,EACP,UAAW7oF,MAASptB,GAAS,CAC3B,MAAM+oH,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQ37F,GAAM,MAClB27F,GAAI,YAAc37F,GAAM,MACxB6oF,EAAO,YAAY8S,EAAG,CACxB,CACA9S,EAAO,MAAQ7uB,GAAK,IAAIowE,EAAS,EAAIA,GAAY,EACnD,EAEAvhD,EAAO,iBAAiB,SAAU,IAAM,CACtC,MAAMr0G,GAAO,OAAOq0G,EAAO,OAAS,EAAE,EAAE,KAAA,EACnCr0G,GAEMA,KAAS,SAClB00I,GAAgB,SAAS,KAAK,GAAK,KAAK,QAAQ,cAAc,KAAK,EAEnEA,GAAgB,SAAS10I,EAAI,GAAK,KAAK,QAAQ,cAAcA,EAAI,EAJjE00I,GAAgB,SAAS,IAAI,GAAK,KAAK,QAAQ,cAAc,IAAI,EAMnE/oH,GAAA,CACF,CAAC,EAED,MAAM8yG,GAAoB,IAAM9yG,GAAA,EAChC,IAAIorF,GAAc,KAClB,OAAI,KAAK,QAAQ,GACfA,GAAc,KAAK,OAAO,GAAG,mBAAoB0nB,EAAiB,EACzD,KAAK,QAAQ,mBACtB,KAAK,OAAO,iBAAiB,mBAAoBA,EAAiB,EAClE1nB,GAAc,IAAM,KAAK,OAAO,oBAAoB,mBAAoB0nB,EAAiB,GAG3F9yG,GAAA,EACO,CACL,QAAS0oF,EACT,SAAU,CACJ,OAAO0C,IAAgB,YAAYA,GAAA,CACzC,CAAA,CAEJ,EAEM8+C,EAA6B,CAACnhB,EAAiB,OAAS,CAC5D,MAAMziE,EAAQ,SAAS,cAAc,OAAO,EAC5C,OAAAA,EAAM,KAAO,OACbA,EAAM,UAAY,iBAClBA,EAAM,YAAc,uCACpBA,EAAM,aAAa,aAAc,mBAAmB,EACpDA,EAAM,MAAQ,OAAOyiE,GAAgB,gBAAkB,KAAK,QAAQ,kBAAA,GAAuB,EAAE,EAC7FziE,EAAM,iBAAiB,SAAU,IAAM,CACrC,MAAMjyE,GAAO,OAAOiyE,EAAM,OAAS,EAAE,EAAE,KAAA,EACvCyiE,GAAgB,aAAa10I,EAAI,GAAK,KAAK,QAAQ,kBAAkBA,EAAI,CAC3E,CAAC,EACMiyE,CACT,EAEMmjF,EAAqB,KAAK,QAAQ,UAAU,YAAc,KAAK,QAAQ,cAAc,YAAY,EACvG,KAAK,wBAA0BA,GAAsB,KACrD,MAAMU,EAAyB,CAACzP,EAAcjoJ,EAAU,CAAA,IACtDg3J,EACI,KAAK,qBAAqBA,EAAoB/O,EAAcjoJ,CAAO,EACnE,KAAK,mBAAmBioJ,EAAcjoJ,CAAO,EAE7C23J,EAA2BX,GAAsB,KAAK,OACtDY,EAAiC,CAAC3P,EAAc75H,IAAS,CAC7D,MAAM05E,GAAO4gD,EAAqBT,CAAY,EAC9C,OAAKngD,IACL,KAAK,kBAAkBA,GAAM,CAC3B,MAAOq6C,GAAkBr6C,EAAI,EAC7B,WAAYy6C,GAAqBz6C,EAAI,EACrC,aAAc15E,IAAA,EACd,SAAU,CAAE,SAAU65H,CAAA,CAAa,CACpC,EACMngD,IAPW,IAQpB,EACMmvD,EAAgC,CAAChP,EAAc7oJ,EAAOgE,GAAS6kJ,IAAiB,CACpF,MAAMngD,GAAO4gD,EAAqBT,CAAY,EAC9C,OAAKngD,GACE,KAAK,iBAAiBA,GAAM1oG,EAAO,CACxC,MAAO+iJ,GAAkBr6C,EAAI,EAC7B,OAAQ,KACR,OAAA1kG,GACA,WAAYm/I,GAAqBz6C,EAAI,EACrC,aAAc,EAAA,CACf,EAPiB,IAQpB,EACM+vD,EAA0B,CAAC5P,EAAc7oJ,EAAOgE,GAAS6kJ,IAAiB,CAC9E,MAAMngD,GAAO4gD,EAAqBT,CAAY,EACxC70C,GAAe,KAAK,QAAQ,QAAU,KAC5C,GAAItL,IAAQ,OAAOsL,IAAc,OAAU,YAAc,OAAOA,IAAc,KAAQ,YAAcA,GAAa,MAAMtL,EAAI,EACzH,OAAO,KAAK,iBAAiBA,GAAM1oG,EAAO,CACxC,MAAO+iJ,GAAkBr6C,EAAI,EAC7B,OAAQ,KACR,OAAA1kG,GACA,WAAYm/I,GAAqBz6C,EAAI,EACrC,aAAc,EAAA,CACf,EAEH,MAAMgwD,GAAuB7P,IAAiB,aAAe,aAAeA,EACtE/mJ,GAAS81J,IAAqB/O,CAAY,GAAK,KAAK,SAAS6P,EAAoB,EACvF,OAAI,OAAO52J,IAAW,YAAYA,GAAO,KAAK81J,GAAsB,KAAK,OAAQ53J,CAAK,EAC/E63J,EAA8BhP,EAAc7oJ,EAAOgE,EAAM,CAClE,EAEM20J,EAA0B,IAAM,CACpC,MAAMC,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,YAAYpP,CAAQ,EAE5B,MAAMqP,EAAkB1iD,GAA6B,CACnD,QAAS,GACT,QAAS,KACT,SAAU,KACV,UAAW,iBAAA,CACZ,EACD0iD,EAAgB,QAAQ,OAAS,gCACjC,MAAMC,GAAqB,KACxB,KAAK,QAAQ,OAAA,GAAY,KAAK,QAAQ,SAAS,MAAQ,QAAU,KAAO,KAAO,KAE5EC,GAAwB,KAAK,QAAQ,eAAiB,KAAO,KAAO,KAC1E,KAAK,kBAAkB,kBAAmB,CACxC,MAAO,UACP,WAAY,EACZ,aAAcA,GACd,SAAU,CAAE,QAAS,WAAA,CAAY,CAClC,EACD,MAAMC,GAAuB,KAAK,QAAQ,QAAQ,YAAY,kBAAoBh5J,IAAU,CACxF,MAAM4L,GAAW5L,KAAU,KAAO,KAAO,KACrC84J,GAAA,IAAyBltJ,IAC7B,KAAK,QAAQ,UAAUA,EAAQ,CACnC,CAAC,EACG,OAAOotJ,IAAyB,YAAY,KAAK,iBAAiB,IAAIA,EAAoB,EAE9F,MAAMC,GAAsB,CAACn4J,GAAO,OAAS,CAC3C,MAAM8K,GAAW9K,KAAS,KACtB,KACAg4J,GAAA,EACJD,EAAgB,QAAUjtJ,KAAa,KACvCitJ,EAAgB,SAAW,OAAO,KAAK,QAAQ,SAAY,UAC7D,EAEAA,EAAgB,iBAAiB,SAAU,IAAM,CAC/C,MAAMlwC,GAAakwC,EAAgB,QAAU,KAAO,KACpD,QAAQ,QAAQ,KAAK,QAAQ,UAAUlwC,EAAU,CAAC,EAC/C,KAAK,IAAM,CACV,MAAMuwC,GAAcJ,GAAA,EACpB,GAAII,KAAgBvwC,GAAY,CAC9BswC,GAAoBC,EAAW,EAC/B,MACF,CACA,KAAK,iBAAiB,kBAAmBA,GAAa,CACpD,MAAO,UACP,OAAQ,KACR,OAAQ,YACR,WAAY,CAAA,CACb,CACH,CAAC,EACA,MAAOr0J,IAAU,CAEhB,QAAQ,MAAMA,EAAK,EACnBo0J,GAAA,CACF,CAAC,CACL,CAAC,EAED,IAAIE,GAAkB,KACtB,MAAMC,EAAiB/2J,IAAU42J,GAAoB52J,IAAO,QAAQ,MAAQA,IAAO,MAAQ,IAAI,EAC3F,KAAK,QAAQ,GACf82J,GAAkB,KAAK,OAAO,GAAG,eAAgBC,CAAa,EACrD,KAAK,QAAQ,mBACtB,KAAK,OAAO,iBAAiB,eAAgBA,CAAa,EAC1DD,GAAkB,IAAM,KAAK,OAAO,oBAAoB,eAAgBC,CAAa,GAEnFD,IAAiB,KAAK,iBAAiB,IAAIA,EAAe,EAC9DF,GAAA,EAEAT,EAA+B,aAAc,IAAMZ,GAAoB,aAAA,GAAkB,KAAK,QAAQ,cAAc,EACpHgB,EAAQ,YAAYzxC,EAAiB,CACnC,MAAO,YACP,KAAM,qDACN,SAAU0xC,EACV,eAAgBvvB,EAAqB,kBAAmB,OAAO,CAAA,CAChE,EAAE,GAAG,EAENsvB,EAAQ,YAAYzxC,EAAiB,CACnC,MAAO,aACP,KAAM,8CACN,SAAU2wC,EAA6B,CACrC,UAAW,mBACX,SAAU,IAAMF,GAAoB,gBAAkB,KAAK,QAAQ,aAAA,EACnE,SAAUD,CAAA,CACX,EACD,eAAgBruB,EAAqBggB,EAAqB,YAAY,CAAC,CAAA,CACxE,EAAE,GAAG,EAEN,MAAM+P,GAAQ,CACZ,CAAE,MAAO,QAAS,MAAO,OAAA,EACzB,CAAE,MAAO,WAAY,MAAO,QAAA,EAC5B,CAAE,MAAO,WAAY,MAAO,UAAA,EAC5B,CAAE,MAAO,SAAU,MAAO,QAAA,EAC1B,CAAE,MAAO,MAAO,MAAO,KAAA,EACvB,CAAE,MAAO,sBAAuB,MAAO,uBAAA,EACvC,CAAE,MAAO,sBAAuB,MAAO,uBAAA,EACvC,CAAE,MAAO,6BAA8B,MAAO,8BAAA,CAA+B,EAEzEC,GAA4BhB,EAAuB,sBAAsB,EACzEiB,GAAa5iD,GAAoB,CACrC,UAAW,yBACX,QAAS0iD,GACT,MAAOC,GAA0B,MAAA,CAAM,CACxC,EACDpyC,EAAS,cAAcqyC,GAAY,8CAA8C,EACjF,MAAMC,GAAgBx5J,IAAU,CAC9B,MAAMwC,GAAO,OAAOxC,IAAU,SAAWA,GAAQ,WACjDu5J,GAAW,MAAQF,GAAM,KAAMrrI,IAAUA,GAAM,QAAUxrB,EAAI,EAAIA,GAAO,WACxE+2J,GAAW,SAAWD,GAA0B,QAClD,EACMG,GAAsBH,GAA0B,UAAWt5J,IAAUw5J,GAAax5J,EAAK,CAAC,EAC9F,OAAAu5J,GAAW,iBAAiB,SAAU,IAAM,CAC1CD,GAA0B,MAAMC,GAAW,MAAO,CAAE,OAAQ,KAAM,MAAO,SAAU,CACrF,CAAC,EACD,KAAK,iBAAiB,IAAI,IAAME,GAAA,CAAqB,EAErDb,EAAQ,YAAYzxC,EAAiB,CACnC,MAAO,aACP,KAAM,sFACN,SAAUoyC,GACV,eAAgBjwB,EAAqBggB,EAAqB,sBAAsB,CAAC,CAAA,CAClF,EAAE,GAAG,EAECsP,CACT,EAEMc,EAAsB,IAAM,CAChC,MAAMd,EAAU,SAAS,cAAc,KAAK,EACtC1hB,EAAiB,KAAK,QAAQ,UAAU,QAAU,KAAK,QAAQ,cAAc,QAAQ,EAErFyiB,GAAmBhjD,GAAoB,CAC3C,UAAW,aACX,QAAS,CACP,CAAE,MAAO,MAAO,MAAO,KAAA,EACvB,CAAE,MAAO,OAAQ,MAAO,aAAA,EACxB,CAAE,MAAO,gBAAiB,MAAO,eAAA,CAAgB,EAEnD,MAAOugC,GAAgB,OAAA,GAAY,KAAK,QAAQ,aAAA,CAAa,CAC9D,EACK0iB,GAAkB55J,IAAU,CAChC,MAAMwC,GAAOxC,KAAU,gBAAkB,gBAAmBA,KAAU,MAAQ,MAAQ,OACtF25J,GAAiB,MAAQn3J,GACzBm3J,GAAiB,SAAW,EAC9B,EACME,GAAwB3iB,GAAgB,KAAK,SAAW70I,IAAU,CACtEu3J,GAAev3J,IAAO,QAAQ,OAAO,UAAY,GAC5CA,IAAO,QAAQ,OAAO,gBAAkB,gBAAkB,gBAAkB,OAC7E,KAAK,CACX,CAAC,IAAM,IAAM,CAAC,GACds3J,GAAiB,iBAAiB,SAAU,IAAM,CAChDziB,GAAgB,OAAOyiB,GAAiB,KAAK,CAC/C,CAAC,EACD,KAAK,iBAAiB,IAAI,IAAME,GAAA,CAAuB,EACvDjB,EAAQ,YAAYzxC,EAAiB,CACnC,MAAO,SACP,KAAM,qHACN,SAAUwyC,GACV,eAAgBrwB,EAAqB,cAAe,QAAQ,CAAA,CAC7D,EAAE,GAAG,EAEN,MAAMwwB,GAA+B5kD,GAAoB,CACvD,QAASgiC,GAAgB,OAAO,yBAA2B,GAC3D,QAAS,KACT,SAAU,MACV,UAAW,yDACX,SAAU,EAAA,CACX,EACK6iB,GAA8B/5J,IAAU,CAC5C85J,GAA6B,QAAU,EAAQ95J,GAC/C85J,GAA6B,SAAW,EAC1C,EACME,EAAoC9iB,GAAgB,KAAK,SAAW70I,IAAU,CAClF03J,GAA2B13J,IAAO,QAAQ,OAAO,yBAA2B,EAAI,CAClF,CAAC,IAAM,IAAM,CAAC,GACdy3J,GAA6B,iBAAiB,SAAU,IAAM,CAC5D5iB,GAAgB,SAAS,CAAE,uBAAwB4iB,GAA6B,QAAS,CAC3F,CAAC,EACD,KAAK,iBAAiB,IAAI,IAAME,EAAA,CAAmC,EACnE,MAAMC,GAA4B9yC,EAAiB,CACjD,MAAO,sBACP,KAAM,8GACN,eAAgBmiB,EAAqB,gCAAiC,QAAQ,EAC9E,UAAW,IAAM,CACf,MAAMr3B,GAAW,SAAS,cAAc,KAAK,EAC7C,OAAAA,GAAS,UAAY,0BACrBA,GAAS,YAAY6nD,EAA4B,EAC1C7nD,EACT,GAAA,CAAG,CACJ,EAAE,IACGioD,GAAwCp5J,IAAS,CACrDm5J,GAA0B,MAAM,QAAUn5J,KAAS,gBAAkB,GAAK,MAC5E,EACAo5J,GAAqChjB,GAAgB,OAAA,GAAY,KAAK,QAAQ,cAAc,EAC5F,MAAMijB,GAAqCjjB,GAAgB,KAAK,SAAW70I,IAAU,CACnF,MAAMqJ,GAAQrJ,IAAO,QAAQ,OAAS,CAAA,EACtC63J,GAAqCxuJ,GAAM,UAAY,GAClDA,GAAM,gBAAkB,gBAAkB,gBAAkB,OAC7D,KAAK,CACX,CAAC,IAAM,IAAM,CAAC,GACd,KAAK,iBAAiB,IAAI,IAAMyuJ,GAAA,CAAoC,EACpEvB,EAAQ,YAAYqB,EAAyB,EAE7CrB,EAAQ,YAAY1B,EAAW,CAC7B,mBACA,sBACA,wBACA,qBACA,2BACA,iBACA,iBACA,eAAA,CACD,CAAC,EAEF,MAAMkD,GAAqBnC,EAAwB/gB,CAAc,EACjE,OAAA0hB,EAAQ,YAAYzxC,EAAiB,CACnC,MAAO,SACP,KAAM,2EACN,SAAUizC,GAAmB,QAC7B,eAAgB9wB,EAAqB,gBAAiB,QAAQ,CAAA,CAC/D,EAAE,GAAG,EACN,KAAK,iBAAiB,IAAI,IAAM8wB,GAAmB,SAAS,EAE5DxB,EAAQ,YAAYzxC,EAAiB,CACnC,MAAO,cACP,KAAM,sCACN,SAAUkxC,EAA2BnhB,CAAc,EACnD,eAAgB5N,EAAqB,oBAAqB,QAAQ,CAAA,CACnE,EAAE,GAAG,EAENsvB,EAAQ,YAAYzxC,EAAiB,CACnC,MAAO,OACP,KAAM,4BACN,eAAgBmiB,EAAqB,cAAe,QAAQ,EAC5D,SAAUwuB,EAA6B,CACrC,UAAW,mBACX,SAAU,IAAM5gB,GAAgB,UAAY,KAAK,QAAQ,YAAA,EACzD,SAAWl3I,IAAUk3I,GAAgB,OAAOl3I,EAAK,GAAK,KAAK,QAAQ,YAAYA,EAAK,CAAA,CACrF,CAAA,CACF,EAAE,GAAG,EAEN44J,EAAQ,YAAYzxC,EAAiB,CACnC,MAAO,UACP,KAAM,oCACN,eAAgBmiB,EAAqB,sBAAuB,QAAQ,EACpE,SAAUwuB,EAA6B,CACrC,UAAW,sBACX,SAAU,IAAM5gB,GAAgB,kBAAoB,KAAK,QAAQ,oBAAA,EACjE,SAAWl3I,IAAUk3I,GAAgB,eAAel3I,EAAK,GAAK,KAAK,QAAQ,oBAAoBA,EAAK,CAAA,CACrG,CAAA,CACF,EAAE,GAAG,EACC44J,CACT,EAEMyB,EAAwB,IAAM,CAClC,MAAMzkC,EAAW,SAAS,cAAc,KAAK,EAW7C,GAVAA,EAAS,YAAYshC,EAAW,CAC9B,eACA,uBACA,kBACA,uBACA,gBACA,kBACA,kBAAA,CACD,CAAC,EAEE,OAAO,KAAK,QAAQ,eAAkB,WAAY,CACpD,MAAMv0J,GAAgB,KAAK,mBAAmB,eAAe,EACvDqwJ,GAAsB,SAAS,cAAc,QAAQ,EAC3DA,GAAoB,UAAY,mBAChCA,GAAoB,aAAa,aAAc,eAAe,EAC9D9rC,EAAS,cAAc8rC,GAAqB,yFAAyF,EACrI,UAAWj8C,KAAU,CACnB,CAAE,MAAO,MAAO,MAAO,KAAA,EACvB,CAAE,MAAO,OAAQ,MAAO,MAAA,EACxB,CAAE,MAAO,KAAM,MAAO,IAAA,CAAK,EAC1B,CACD,MAAMh1G,GAAU,SAAS,cAAc,QAAQ,EAC/CA,GAAQ,MAAQg1G,GAAO,MACvBh1G,GAAQ,YAAcg1G,GAAO,MAC7Bi8C,GAAoB,YAAYjxJ,EAAO,CACzC,CACA,MAAMu4J,GAAqBt6J,IAAU,CACnC,MAAMwC,GAAOxC,KAAU,OAASA,KAAU,KAAOA,GAAQ,OACzDgzJ,GAAoB,MAAQxwJ,EAC9B,EACM+3J,EAA2B53J,GAAc,UAAW3C,IAAU,CAClEs6J,GAAkBt6J,EAAK,CACzB,CAAC,EACDgzJ,GAAoB,iBAAiB,SAAU,IAAM,CACnDrwJ,GAAc,MAAMqwJ,GAAoB,MAAO,CAAE,OAAQ,KAAM,MAAO,SAAU,CAClF,CAAC,EACD,KAAK,iBAAiB,IAAI,IAAMuH,EAAA,CAA0B,EACtD3kC,EAAS,YAAYzO,EAAiB,CACpC,MAAO,gBACP,KAAM,0EACN,SAAU6rC,GACV,eAAgB1pB,EAAqBggB,EAAqB,eAAe,CAAC,CAAA,CAC3E,EAAE,GAAG,CACZ,CAEA,MAAMkR,EAAenD,EAAgB,qBAAsB,CACzD,OAAQkB,EACR,KAAMD,CAAA,CACP,EACGkC,GAAc5kC,EAAS,YAAY4kC,CAAY,EACnD,MAAMC,GAAepD,EAAgB,gBAAgB,EACjDoD,IAAc7kC,EAAS,YAAY6kC,EAAY,EACnD,MAAMC,GAAoBrD,EAAgB,+BAAgC,CACxE,OAAQkB,EACR,KAAMD,CAAA,CACP,EACD,OAAIoC,IAAmB9kC,EAAS,YAAY8kC,EAAiB,EACtD9kC,CACT,EAEM+kC,EAAgB,IAAIjhD,GACpBkhD,EAAgC,IAAM,CAC1C,MAAM1rB,EAAY,SAAS,cAAc,KAAK,EAC9CspB,EAA+B,mBAAoB,IAAMZ,GAAoB,mBAAA,GAAwB,KAAK,QAAQ,oBAAoB,EACtIY,EAA+B,wBAAyB,IAAMZ,GAAoB,wBAAA,GAA6B,KAAK,QAAQ,yBAAyB,EACrJY,EAA+B,2BAA4B,IAAMZ,GAAoB,2BAAA,GAAgC,KAAK,QAAQ,4BAA4B,EAC9JY,EAA+B,sBAAuB,IAAMZ,GAAoB,sBAAA,GAA2B,KAAK,QAAQ,uBAAuB,EAC/I,MAAMiD,EAAWxD,EAAgB,cAAe,CAC9C,OAAQkB,EACR,KAAMD,CAAA,CACP,EACGuC,GAAU3rB,EAAU,YAAY2rB,CAAQ,EAC5C,MAAMC,GAAWzD,EAAgB,cAAe,CAC9C,OAAQkB,EACR,KAAMD,CAAA,CACP,EACGwC,IAAU5rB,EAAU,YAAY4rB,EAAQ,EAC5C,MAAMC,GAA0BzC,EAAuB,uBAAwB,CAC7E,MAAO,kBACP,aAAc,CAAC,WAAa,WAAa,UAAW,CAAA,CACrD,EACK0C,GAAwBzjD,GAA4BwjD,GAAyB,CACjF,UAAW,wBAAA,CACZ,EACD,OAAA7rB,EAAU,YAAY/nB,EAAiB,CACrC,MAAO,kBACP,KAAM,sFACN,SAAU6zC,GAAsB,QAChC,eAAgB1xB,EAAqBggB,EAAqB,sBAAsB,CAAC,CAAA,CAClF,EAAE,GAAG,EACN,KAAK,iBAAiB,IAAI,IAAM0R,GAAsB,SAAS,EAC/D9rB,EAAU,YAAY/nB,EAAiB,CACrC,MAAO,cACP,KAAM,qDACN,SAAU6wC,EAAoB,CAC5B,UAAW,qBACX,SAAU,IAAMJ,GAAoB,sBAAwB,KAAK,QAAQ,mBAAA,EACzE,SAAW53J,IAAU,CACnBy4J,EAAwB,mBAAoBz4J,GAAO,oBAAoB,CACzE,CAAA,CACD,EACD,eAAgBspI,EAAqBggB,EAAqB,kBAAkB,CAAC,CAAA,CAC9E,EAAE,GAAG,EACNpa,EAAU,YAAYgoB,EAAW,CAAC,uBAAuB,EAAG,CAC1D,OAAQqB,EACR,KAAMD,CAAA,CACP,CAAC,EACFppB,EAAU,YAAY/nB,EAAiB,CACrC,MAAO,cACP,KAAM,oDACN,SAAU6wC,EAAoB,CAC5B,UAAW,2BACX,SAAU,IAAMJ,GAAoB,2BAA6B,KAAK,QAAQ,wBAAA,EAC9E,SAAW53J,IAAU,CACnBy4J,EAAwB,wBAAyBz4J,GAAO,0BAA0B,CACpF,CAAA,CACD,EACD,eAAgBspI,EAAqBggB,EAAqB,uBAAuB,CAAC,CAAA,CACnF,EAAE,GAAG,EACNpa,EAAU,YAAY/nB,EAAiB,CACrC,MAAO,iBACP,KAAM,wCACN,SAAU6wC,EAAoB,CAC5B,UAAW,8BACX,SAAU,IAAMJ,GAAoB,8BAAgC,KAAK,QAAQ,2BAAA,EACjF,SAAW53J,IAAU,CACnBy4J,EAAwB,2BAA4Bz4J,GAAO,6BAA6B,CAC1F,CAAA,CACD,EACD,eAAgBspI,EAAqBggB,EAAqB,0BAA0B,CAAC,CAAA,CACtF,EAAE,GAAG,EACNpa,EAAU,YAAYgoB,EAAW,CAAC,uBAAuB,EAAG,CAC1D,OAAQqB,EACR,KAAMD,CAAA,CACP,CAAC,EACFppB,EAAU,YAAY/nB,EAAiB,CACrC,MAAO,iBACP,KAAM,2CACN,SAAU6wC,EAAoB,CAC5B,UAAW,wBACX,SAAU,IAAMJ,GAAoB,yBAA2B,KAAK,QAAQ,sBAAA,EAC5E,SAAW53J,IAAU,CACnBy4J,EAAwB,sBAAuBz4J,GAAO,uBAAuB,CAC/E,CAAA,CACD,EACD,eAAgBspI,EAAqBggB,EAAqB,qBAAqB,CAAC,CAAA,CACjF,EAAE,GAAG,EACNpa,EAAU,YAAYgoB,EAAW,CAAC,yBAA0B,iBAAiB,EAAG,CAC9E,OAAQqB,EACR,KAAMD,CAAA,CACP,CAAC,EACKppB,CACT,EAEM+rB,EAAgC,IAAM,CAC1C,MAAM/rB,EAAY,SAAS,cAAc,KAAK,EACxC2rB,EAAWxD,EAAgB,wBAAyB,CACxD,OAAQkB,EACR,KAAMD,CAAA,CACP,EACGuC,GAAU3rB,EAAU,YAAY2rB,CAAQ,EAC5C,MAAMC,GAAWzD,EAAgB,wBAAyB,CACxD,OAAQkB,EACR,KAAMD,CAAA,CACP,EACGwC,IAAU5rB,EAAU,YAAY4rB,EAAQ,EAC5C,MAAM33B,GAAUo0B,EAAgB,uBAAwBviI,GAAgC,CACtF,OAAQujI,EACR,KAAMD,CAAA,CACP,EACGn1B,IAAS+L,EAAU,YAAY/L,EAAO,EAC1C,MAAM+3B,GAAa3D,EAAgB,0BAA2BvjI,GAAmC,CAC/F,OAAQukI,EACR,KAAMD,CAAA,CACP,EACD,OAAI4C,IAAYhsB,EAAU,YAAYgsB,EAAU,EAChDhsB,EAAU,YAAYgoB,EAAW,CAC/B,2BACA,yBACA,uBACA,iCACA,gCAAA,EACC,CACD,OAAQqB,EACR,KAAMD,CAAA,CACP,CAAC,EACKppB,CACT,EACMisB,EAA6B,OAAO,KAAK,QAAQ,UAAU,QAAQ,MAAQ,EAAE,EAAE,YAAA,EAC/EC,EAA2BD,IAA+B,UAAYA,IAA+B,SAErGE,EAAgB/C,EAAuB,eAAe,EACtDgD,EAAepmD,GAAoB,CACvC,QAAS,GACT,QAAS,KACT,SAAU,MACV,UAAW,SACX,SAAUmmD,EAAc,QAAA,CACzB,EACKE,GAAoBv7J,GAAU,CAClCs7J,EAAa,QAAU,EAAQt7J,EAC/Bs7J,EAAa,SAAWD,EAAc,QACxC,EACMG,GAA0BH,EAAc,UAAWr7J,GAAU,CACjEu7J,GAAiBv7J,CAAK,CACxB,CAAC,EACDs7J,EAAa,iBAAiB,SAAU,IAAM,CAC5CD,EAAc,MAAMC,EAAa,QAAS,CAAE,OAAQ,KAAM,MAAO,SAAU,CAC7E,CAAC,EACD,KAAK,iBAAiB,IAAI,IAAME,GAAA,CAAyB,EACzD,IAAIC,GAAyB,KAC7B,GAAIL,EAA0B,CAC5B,MAAMM,EAA0BpD,EAAuB,yBAAyB,EAChFmD,GAAyBvmD,GAAoB,CAC3C,QAAS,GACT,QAAS,KACT,SAAU,MACV,UAAW,oBACX,SAAUwmD,EAAwB,QAAA,CACnC,EACD,MAAMC,EAA8B37J,IAAU,CAC5Cy7J,GAAuB,QAAU,EAAQz7J,GACzCy7J,GAAuB,SAAWC,EAAwB,QAC5D,EACME,GAAoCF,EAAwB,UAAW17J,IAAU,CACrF27J,EAA2B37J,EAAK,CAClC,CAAC,EACDy7J,GAAuB,iBAAiB,SAAU,IAAM,CACtDC,EAAwB,MAAMD,GAAuB,QAAS,CAAE,OAAQ,KAAM,MAAO,SAAU,CACjG,CAAC,EACD,KAAK,iBAAiB,IAAI,IAAMG,GAAA,CAAmC,CACrE,CACA,MAAMC,GAA8B,IAAM,CACxC,MAAM3sB,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,YAAYgoB,EAAW,CAAC,iBAAkB,kBAAkB,EAAG,CACvE,OAAQqB,EACR,KAAMD,CAAA,CACP,CAAC,EACF,MAAMwD,EAAczE,EAAgB,oBAAqB,CACvD,OAAQkB,EACR,KAAMD,CAAA,CACP,EAED,GADIwD,GAAa5sB,EAAU,YAAY4sB,CAAW,EAC9C,OAAO,KAAK,QAAQ,qBAAwB,WAAY,CAC1D,MAAMC,GAAkB,SAAS,cAAc,KAAK,EAC9CC,GAAa3E,EAAgB,6BAA8B,CAC/D,OAAQkB,EACR,KAAMD,CAAA,CACP,EACG0D,IAAYD,GAAgB,YAAYC,EAAU,EACtDD,GAAgB,YAAY7E,EAAW,CACrC,0CACA,gDACA,qCACA,sCAAA,EACC,CACD,OAAQqB,EACR,KAAMD,CAAA,CACP,CAAC,EACF,MAAM2D,GAAsB5E,EAAgB,sCAAuC,CACjF,OAAQkB,EACR,KAAMD,CAAA,CACP,EACG2D,IAAqBF,GAAgB,YAAYE,EAAmB,EACxE,MAAMC,GAAsB7E,EAAgB,sCAAuC,CACjF,OAAQkB,EACR,KAAMD,CAAA,CACP,EACG4D,IAAqBH,GAAgB,YAAYG,EAAmB,EAExE,MAAMC,GAAgB,IAAIziD,GAC1ByiD,GAAc,IAAI,CAChB,GAAI,wBACJ,MAAO,WACP,UAAW,GACX,UAAW,GACX,QAASJ,EAAA,CACV,EACD7sB,EAAU,YAAYitB,GAAc,OAAO,EAC3C,KAAK,iBAAiB,IAAI,IAAMA,GAAc,SAAS,CACzD,CAEA,OAAOjtB,CACT,EACAyrB,EAAc,IAAI,CAChB,GAAI,kBACJ,MAAO,QACP,QAASzD,EAAW,CAAC,gBAAiB,mBAAoB,uBAAuB,EAAG,CAClF,OAAQqB,EACR,KAAMD,CAAA,CACP,CAAA,CACF,EACDqC,EAAc,IAAI,CAChB,GAAI,kBACJ,MAAO,QACP,QAASkB,GAAA,CAA4B,CACtC,EACDlB,EAAc,IAAI,CAChB,GAAI,oBACJ,MAAO,SACP,UAAW,GACX,UAAW,GACX,eAAgBpR,EAAkC+R,EAAchS,EAAqB,eAAe,CAAC,EACrG,QAASsR,EAAA,CAA8B,CACxC,EACGQ,GACFT,EAAc,IAAI,CAChB,GAAI,+BACJ,MAAO,oBACP,UAAW,GACX,UAAW,GACX,eAAgBpR,EAAkCkS,GAAwBnS,EAAqB,yBAAyB,CAAC,EACzH,QAAS2R,EAAA,CAA8B,CACxC,EAEH,KAAK,iBAAiB,IAAI,IAAMN,EAAc,SAAS,EAEvD,MAAMyB,GAAgB,SAAS,cAAc,KAAK,EAClDA,GAAc,YAAYzD,GAAyB,EACnDyD,GAAc,YAAYzB,EAAc,OAAO,EAE/C,MAAM0B,GAAY,IAAIpiD,GAAY,CAChC,QAAS,QACT,KAAM,CACJ,CACE,GAAI,aACJ,MAAO,aACP,QAASmiD,EAAA,EAEX,CACE,GAAI,SACJ,MAAO,SACP,QAAS1C,EAAA,CAAoB,EAE/B,CACE,GAAI,WACJ,MAAO,WACP,QAASW,EAAA,CAAsB,CACjC,CACF,CACD,EACDpxD,EAAQ,YAAYozD,GAAU,OAAO,EACrC,KAAK,iBAAiB,IAAI,IAAMA,GAAU,SAAS,EAEnD,IAAIC,EAAY,MACZ17J,EAAQ,kBAAoB,MAC9B07J,EAAY,KAAK,YAAY,CAC3B,GAAI17J,EAAQ,aAAe,iBAC3B,MAAOA,EAAQ,gBAAkB,OACjC,SAAUA,EAAQ,mBAAqB,CAAE,EAAG,GAAI,EAAG,EAAA,EACnD,KAAMA,EAAQ,eAAiBA,EAAQ,MAAQ,WAC/C,QAAS8oJ,CAAA,CACV,GAGH,MAAM6S,GAAa,KAAK,YAAY,CAClC,GAAI37J,EAAQ,IAAM,iBAClB,MAAOA,EAAQ,OAAS,QACxB,SAAUA,EAAQ,UAAY,CAAE,EAAG,GAAI,EAAG,GAAA,EAC1C,KAAMA,EAAQ,MAAQ,WACtB,YAAak7G,GACb,QAAA7S,CAAA,CACD,EAED,OAAIqzD,IACFC,GAAW,UAAYD,GAGlBC,EACT,MACEtzD,EAAQ,YAAYugD,CAAQ,EAG9B,OAAO,KAAK,YAAY,CACtB,GAAI5oJ,EAAQ,IAAM,iBAClB,MAAOA,EAAQ,OAAS,QACxB,SAAUA,EAAQ,UAAY,CAAE,EAAG,GAAI,EAAG,EAAA,EAC1C,KAAMA,EAAQ,MAAQ,WACtB,QAAAqoG,CAAA,CACD,CACH,CAUA,kBAAkBroG,EAAU,GAAI,CAC9B,MAAMqoG,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,mBAEpB,MAAMuzD,EAAsB,SACtBC,EAA6B,gBAC7BC,EAAmB,OAAO,SAAS97J,GAAS,gBAAgB,EAC9D,KAAK,IAAI,EAAG,KAAK,MAAMA,EAAQ,gBAAgB,CAAC,EAChD,OAAO,SAASA,GAAS,UAAU,EACjC,KAAK,IAAI,EAAG,KAAK,MAAMA,EAAQ,UAAU,CAAC,EAC1C,GAEA+7J,EAAiB,KAAK,QAAQ,UAAU,SAAW,KAAK,QAAQ,cAAc,SAAS,EACzF/7J,EAAQ,uBAAuBo9F,IACjC2+D,GAAgB,iBAAiB/7J,EAAQ,YAAa,CAAE,OAAQ,aAAc,EAGhF,IAAIg8J,EAAa,KACbC,EAAc,EAElB,MAAMC,EAAkB,IAAM,CACxBF,GAAc,OAClB,aAAaA,CAAU,EACvBA,EAAa,KACf,EAEMG,EAAiB,IAAM,CAC3BD,EAAA,EACAD,EAAe,OAAO,YAAgB,KAAe,OAAO,YAAY,KAAQ,WAC5E,YAAY,MACZ,KAAK,IAAA,EACT,GAAI,CACFF,GAAgB,eAAe,CAC7B,MAAOK,EAAe,QAAUP,EAA6BD,EAC7D,UAAWS,EAAW,aAAA,EACtB,UAAWC,EAAW,aAAA,EACtB,iBAAkB,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOC,EAAqB,MAAM,KAAK,GAAK,CAAC,CAAC,CAAA,CACxF,CACH,OAASt4J,EAAO,CAEd,QAAQ,MAAM,0CAA2CA,CAAK,CAChE,CACF,EAEMu4J,EAAgB,IAAM,CAC1B,MAAM34J,EAAO,OAAO,YAAgB,KAAe,OAAO,YAAY,KAAQ,WAC1E,YAAY,MACZ,KAAK,IAAA,EACHC,EAAU,KAAK,IAAI,EAAGD,EAAMo4J,CAAW,EAC7C,GAAIn4J,GAAWg4J,EAAkB,CAC/BK,EAAA,EACA,MACF,CACAD,EAAA,EACAF,EAAa,WAAWG,EAAgB,KAAK,IAAI,EAAGL,EAAmBh4J,CAAO,CAAC,CACjF,EAEMu4J,EAAa3qB,GAA0B,CAC3C,OAAQ,KAAK,OACb,MAAO,OACP,eAAgB,gBAChB,QAAS8qB,EACT,QAAS,CACP,UAAW,iCACX,UAAW,kCACX,UAAW,kCACX,SAAU,2BACV,SAAU,2BACV,cAAe,sCACf,eAAgB,uCAChB,YAAa,oCACb,aAAc,qCACd,gBAAiB,wCACjB,gBAAiB,wCACjB,gBAAiB,wCACjB,kBAAmB,0CACnB,WAAY,6BACZ,YAAa,mCAAA,CACf,CACD,EAEKF,EAAa5qB,GAA0B,CAC3C,OAAQ,KAAK,OACb,MAAO,OACP,eAAgB,gBAChB,QAAS8qB,EACT,QAAS,CACP,UAAW,iCACX,UAAW,kCACX,UAAW,kCACX,SAAU,2BACV,SAAU,2BACV,cAAe,sCACf,eAAgB,uCAChB,YAAa,oCACb,aAAc,qCACd,gBAAiB,wCACjB,gBAAiB,wCACjB,gBAAiB,wCACjB,kBAAmB,0CACnB,WAAY,6BACZ,YAAa,mCAAA,CACf,CACD,EAEKC,EAAmB,SAAS,cAAc,KAAK,EACrDA,EAAiB,MAAM,QAAU,OACjCA,EAAiB,MAAM,WAAa,SACpCA,EAAiB,MAAM,eAAiB,WACxCA,EAAiB,MAAM,SAAW,IAClCA,EAAiB,YAAYJ,EAAW,SAAS,EACjDI,EAAiB,YAAYH,EAAW,SAAS,EAEjD,MAAMI,EAAgCljD,GAAU,CAC9C,MAAMptG,EAASotG,IAAU,QAAU,OAAS,OAC5C6iD,EAAW,UAAU,OAASjwJ,IAAW,OACzCkwJ,EAAW,UAAU,OAASlwJ,IAAW,MAC3C,EAEMktG,EAAO,IAAID,GAAY,CAC3B,QAAS,QACT,SAAUojD,EACV,gBAAkBjjD,GAAU,CAC1BkjD,EAA6BljD,CAAK,CACpC,EACA,KAAM,CACJ,CACE,GAAI,QACJ,MAAO,QACP,QAAS6iD,EAAW,OAAA,EAEtB,CACE,GAAI,QACJ,MAAO,QACP,QAASC,EAAW,OAAA,CACtB,CACF,CACD,EACD,KAAK,iBAAiB,IAAI,IAAMhjD,EAAK,SAAS,EAC9CojD,EAA6BpjD,EAAK,WAAA,GAAgB,OAAO,EAEzD,MAAM8iD,EAAiB7mD,GAA6B,CAClD,QAAS,GACT,QAAS,gBACT,SAAU,cACV,UAAW,8BAAA,CACZ,EACD6mD,EAAe,QAAQ,OAAS,yBAChCA,EAAe,iBAAiB,SAAUI,CAAa,EAEvD,MAAMD,EAAuB,IAAIjqD,GAAwB,CACvD,MAAO,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOtyG,EAAQ,gBAAgB,GAAK,CAAC,CAAC,EACpE,UAAW,CAAC,EAAG,EAAE,EACjB,KAAM,EACN,SAAU,EACV,SAAU,KACV,SAAWZ,GAAU,CACnB,MAAMwC,EAAO,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOxC,CAAK,GAAK,CAAC,CAAC,EACvDm9J,EAAqB,IAAI36J,CAAI,EAC7B46J,EAAA,CACF,CAAA,CACD,EACDD,EAAqB,OAAO,QAAQ,OAAS,4CAC7CA,EAAqB,MAAM,QAAQ,OAAS,qCAC5CA,EAAqB,MAAM,UAAY,UACvCA,EAAqB,MAAM,aAAa,aAAc,wBAAwB,EAE9E,MAAMI,EAAkB3qD,GAAmB,CACzC,MAAO,aACP,KAAM,6EACN,SAAUuqD,EAAqB,QAC/B,eAAgB,KAAK,qBAAqB,2BAA4B,0BAA0B,CAAA,CACjG,EAEKK,EAAa,SAAS,cAAc,KAAK,EAC/CA,EAAW,MAAM,QAAU,cAC3BA,EAAW,MAAM,WAAa,SAC9BA,EAAW,MAAM,IAAM,MACvBA,EAAW,MAAM,UAAY,MAC7BA,EAAW,MAAM,SAAW,OAC5BA,EAAW,MAAM,WAAa,OAC9BA,EAAW,YAAYR,CAAc,EAErC,MAAMS,EAAsB,IAAM,CAChC,MAAMz8H,EAAS27H,GAAgB,UAAA,GAAe,KAAK,QAAQ,oBAAsB,KACjFK,EAAe,QAAUh8H,GAAQ,QAAUy7H,EAC3C,MAAMiB,EAAmB,KAAK,IAC5B,EACA,KAAK,MAAM,OAAO18H,GAAQ,kBAAoBA,GAAQ,SAAS,gBAAgB,GAAK,CAAC,CAAA,EAGrF,SAAS,gBAAkBm8H,EAAqB,QAC7C,SAAS,gBAAkBA,EAAqB,OAEnDA,EAAqB,IAAIO,CAAgB,CAE7C,EAEMtoB,EAAqB,IAAM,CAC/B6nB,EAAW,mBAAA,EACXC,EAAW,mBAAA,CACb,EAEA,IAAIp8B,EAAwB,KAC5B,MAAMC,EAAkC,IAAM,CACxCD,IACFA,EAAA,EACAA,EAAwB,MAE1B,MAAM55H,EAAU,KAAK,QAAQ,SAAW,KACxC,GAAI,CAACA,EAAS,OACd,MAAM7C,EAAWhC,GAAU,CACzB,MAAM2jC,EAAQ3jC,GAAO,QAAQ,MAC7B,GAAI2jC,GAASA,IAAU,QAAUA,IAAU,OAAQ,OAEnD,IADa3jC,GAAO,MAAQ,MACf,oBAAqB,CAChC,MAAM+sH,EAAK/sH,GAAO,QAAQ,IAAM,GAChC,GAAI+sH,IAAO,cAAgBA,IAAO,eAAgB,MACpD,CACAgmB,EAAA,CACF,EACA,GAAI,OAAOluI,EAAQ,IAAO,WAAY,CACpC,MAAM85H,EAAS,CACb95H,EAAQ,GAAG,oBAAqB7C,CAAO,EACvC6C,EAAQ,GAAG,oBAAqB7C,CAAO,EACvC6C,EAAQ,GAAG,oBAAqB7C,CAAO,CAAA,EAEzCy8H,EAAwB,IAAM,CAC5B,UAAWvuB,KAASyuB,EAAQzuB,IAAA,CAC9B,CACF,MAAW,OAAOrrG,EAAQ,kBAAqB,aAC7CA,EAAQ,iBAAiB,oBAAqB7C,CAAO,EACrD6C,EAAQ,iBAAiB,oBAAqB7C,CAAO,EACrD6C,EAAQ,iBAAiB,oBAAqB7C,CAAO,EACrDy8H,EAAwB,IAAM,CAC5B55H,EAAQ,oBAAoB,oBAAqB7C,CAAO,EACxD6C,EAAQ,oBAAoB,oBAAqB7C,CAAO,EACxD6C,EAAQ,oBAAoB,oBAAqB7C,CAAO,CAC1D,EAEJ,EAEM48H,EAAoB,IAAM,CAC9BF,EAAA,EACAqU,EAAA,EACAgoB,EAAA,CACF,EAEMO,EAAkB,IAAM,CAC5BF,EAAA,CACF,EAEA,IAAIG,EAAe,KACfC,EAAc,KACd,KAAK,QAAQ,IACfD,EAAe,KAAK,OAAO,GAAG,mBAAoB38B,CAAiB,EACnE48B,EAAc,KAAK,OAAO,GAAG,uBAAwBF,CAAe,GAC3D,KAAK,QAAQ,mBACtB,KAAK,OAAO,iBAAiB,mBAAoB18B,CAAiB,EAClE,KAAK,OAAO,iBAAiB,uBAAwB08B,CAAe,EACpEC,EAAe,IAAM,KAAK,OAAO,oBAAoB,mBAAoB38B,CAAiB,EAC1F48B,EAAc,IAAM,KAAK,OAAO,oBAAoB,uBAAwBF,CAAe,GAEzFC,GAAc,KAAK,iBAAiB,IAAIA,CAAY,EACpDC,GAAa,KAAK,iBAAiB,IAAIA,CAAW,EACtD,MAAMC,EAAgBnB,GAAgB,KAAK,SAAUgB,CAAe,GAAK,KACzE,OAAIG,GAAe,KAAK,iBAAiB,IAAIA,CAAa,EAC1D/8B,EAAA,EACID,GAAuB,KAAK,iBAAiB,IAAI,IAAMA,KAAyB,EACpF,KAAK,iBAAiB,IAAI,IAAM,CAC9Bg8B,EAAA,EACAG,EAAW,QAAA,EACXC,EAAW,QAAA,EACXC,EAAqB,QAAA,CACvB,CAAC,EAEDM,EAAA,EACAroB,EAAA,EAEAnsC,EAAQ,YAAYiR,EAAK,OAAO,EAChCjR,EAAQ,YAAYu0D,CAAU,EAC9Bv0D,EAAQ,YAAYs0D,EAAgB,GAAG,EAEhC,KAAK,YAAY,CACtB,GAAI38J,EAAQ,IAAM,mBAClB,MAAOA,EAAQ,OAAS,SACxB,SAAUA,EAAQ,UAAY,CAAE,EAAG,GAAI,EAAG,GAAA,EAC1C,KAAMA,EAAQ,MAAQ,WACtB,MAAOA,EAAQ,MACf,SAAUA,EAAQ,SAClB,YAAas7G,GACb,QAAAjT,CAAA,CACD,CACH,CASA,mBAAmBroG,EAAU,GAAI,CAC/B,MAAMqoG,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,MAAM,YAAY,wBAAyB,OAAO,EAE1D,MAAM80D,MAAsB,IAEtBlrD,EAAgB,CAACmC,EAAUjF,KAAS,CACxC,GAAI,CAACiF,GAAY,CAACjF,SAAa,IAAM,CAAC,EAEtC,IAAIU,GAAU,KACVC,GAAc,KACdC,GAAmB,KAEvB,MAAMI,GAAqB,IAAMiE,EAAS,UAAU,YAAY,GAAKA,EAAS,eAAe,MAAQ,SAAS,KAExGnE,GAAoBC,IAAW,CAC9BL,KACLA,GAAQ,QAAQ,KAAOK,GAAS,QAAU,OAC1CL,GAAQ,OAASK,GACnB,EAEME,GAAe,IAAM,CACzB,GAAI,CAACP,GAAS,OAEd,MAAMQ,IADSR,GAAQ,QAAQ,SAAWuE,EAAS,eAAe,iBAAiBvE,GAAQ,QAAQ,QAAQ,EAAI,OAC1F,KACrB,GAAI,CAACQ,GAAI,OAET,MAAMjd,GAAS,EACTpxF,GAAOquG,GAAG,sBAAA,EACV,CAAE,WAAYC,GAAI,YAAaC,IAAO,OAE5CV,GAAQ,MAAM,KAAO,MACrBA,GAAQ,MAAM,IAAM,MACpBA,GAAQ,MAAM,UAAY,8BAC1B,MAAMW,GAAUX,GAAQ,sBAAA,EAElBY,GAAgBzuG,GAAK,KAAOA,GAAK,MAAQ,EAAIwuG,GAAQ,MAAQ,EAC7DppD,GAAO,KAAK,IAAIgsC,GAAQ,KAAK,IAAIkd,GAAKld,GAASod,GAAQ,MAAOC,EAAa,CAAC,EAE5EC,GAAe1uG,GAAK,IAAM,EAAIwuG,GAAQ,OACtCG,GAAc3uG,GAAK,OAAS,EAC5BulD,GAAMmpD,IAAgBtd,GAASsd,GAAe,KAAK,IAAIH,GAAKnd,GAASod,GAAQ,OAAQG,EAAW,EAEtGd,GAAQ,MAAM,KAAO,GAAGzoD,EAAI,KAC5ByoD,GAAQ,MAAM,IAAM,GAAGtoD,EAAG,KAC1BsoD,GAAQ,MAAM,UAAY,iBAC5B,EAEMe,GAAsB,IAAM,CAC5Bb,IAAoB,MAAM,OAAO,aAAaA,EAAgB,EAClEA,GAAmB,OAAO,WAAW,IAAME,GAAiB,EAAI,EAAG,GAAG,CACxE,EAEMY,GAAc,IAAM,CACnBhB,KACDE,IAAoB,MAAM,OAAO,aAAaA,EAAgB,EAC7DD,KACHA,GAAcK,GAAA,EACdL,GAAY,YAAYD,EAAO,GAEjCI,GAAiB,EAAK,EACtBG,GAAA,EACF,EAEAP,GAAU,SAAS,cAAc,KAAK,EACtCA,GAAQ,UAAY,oBACpBA,GAAQ,OAAS,GACjBA,GAAQ,QAAQ,KAAO,QACvBA,GAAQ,YAAcV,GACtBU,GAAQ,aAAa,OAAQ,SAAS,EAEtC,MAAMiB,GAAY,qBAAqB,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,GAC1EjB,GAAQ,QAAQ,SAAWiB,GAC3BsD,EAAS,GAAKtD,GACdsD,EAAS,SAAW,EAEpB,MAAMrD,GAAiB,IAAMF,GAAA,EACvBG,GAAiB,IAAMJ,GAAA,EACvBK,GAAU,IAAMJ,GAAA,EAChBK,GAAS,IAAMjB,GAAiB,EAAI,EACpCkB,GAAatI,IAAM,CACnBA,GAAE,MAAQ,WACZoH,GAAiB,EAAI,EACrBmE,EAAS,KAAA,EAEb,EACMhD,GAAmB,IAAM,CACzB,CAACvB,IAAWA,GAAQ,QACxBO,GAAA,CACF,EAEAgE,EAAS,iBAAiB,eAAgBrD,EAAc,EACxDqD,EAAS,iBAAiB,eAAgBpD,EAAc,EACxDoD,EAAS,iBAAiB,QAASnD,EAAO,EAC1CmD,EAAS,iBAAiB,OAAQlD,EAAM,EACxCkD,EAAS,iBAAiB,UAAWjD,EAAS,EAC9C,OAAO,iBAAiB,SAAUC,GAAkB,CAAE,QAAS,GAAM,EACrE,OAAO,iBAAiB,SAAUA,EAAgB,EAElD,MAAMiD,GAAU,IAAM,CAChBtE,IAAoB,MAAM,OAAO,aAAaA,EAAgB,EAClEqE,EAAS,oBAAoB,eAAgBrD,EAAc,EAC3DqD,EAAS,oBAAoB,eAAgBpD,EAAc,EAC3DoD,EAAS,oBAAoB,QAASnD,EAAO,EAC7CmD,EAAS,oBAAoB,OAAQlD,EAAM,EAC3CkD,EAAS,oBAAoB,UAAWjD,EAAS,EACjD,OAAO,oBAAoB,SAAUC,GAAkB,CAAE,QAAS,GAAM,EACxE,OAAO,oBAAoB,SAAUA,EAAgB,EACrDvB,IAAS,SAAA,EACTA,GAAU,KACVC,GAAc,IAChB,EAEA,OAAAqtD,EAAgB,IAAI9oD,EAAO,EACpBA,EACT,EAEMkS,EAAmB,CAAC,CAAE,MAAA/e,EAAO,KAAA2H,GAAM,SAAAkC,MAAe,CACtD,MAAM/uD,GAAM,SAAS,cAAc,KAAK,EACxCA,GAAI,UAAY,uCAChB,MAAMx9B,GAAQ,SAAS,cAAc,KAAK,EAC1CA,GAAM,UAAY,kBAElB,MAAMstF,GAAa,SAAS,cAAc,KAAK,EAC/CA,GAAW,UAAY,6BACvB,MAAM9E,GAAU,SAAS,cAAc,KAAK,EAC5CA,GAAQ,UAAY,yBACpBA,GAAQ,YAAc9F,GAAS,GAC/B4K,GAAW,YAAY9E,EAAO,EAC9BxoF,GAAM,YAAYstF,EAAU,EACxBjD,IAAM8C,EAAc3E,GAAS6B,EAAI,EAErC7sD,GAAI,YAAYx9B,EAAK,EACrB,MAAMutF,GAAc,SAAS,cAAc,KAAK,EAChD,OAAAA,GAAY,UAAY,0BACpBhB,IAAUgB,GAAY,YAAYhB,EAAQ,EAC9C/uD,GAAI,YAAY+vD,EAAW,EACpB,CAAE,IAAA/vD,GAAK,QAAAgrD,GAAS,YAAA+E,EAAA,CACzB,EAEMb,EAAsBD,GAAW,CACrC,GAAI,CAACA,EAAQ,OACb,MAAM7nG,GAAM,OAAO6nG,EAAO,GAAG,EACvBziG,GAAM,OAAOyiG,EAAO,GAAG,EACvBnyG,GAAQ,OAAOmyG,EAAO,KAAK,EACjC,GAAI,CAAC,OAAO,SAAS7nG,EAAG,GAAK,CAAC,OAAO,SAASoF,EAAG,GAAK,CAAC,OAAO,SAAS1P,EAAK,GAAKsK,KAAQoF,GAAK,OAC9F,MAAM2iG,IAAQryG,GAAQsK,KAAQoF,GAAMpF,IAAQ,IAC5C6nG,EAAO,MAAM,YAAY,QAAS,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,IAAKE,EAAG,CAAC,CAAC,CAAC,CAC3E,EAEM2rD,EAAsB,CAACh+J,EAAOi+J,GAAY,IAAM,CACpD,MAAMpmI,GAAI,OAAO73B,CAAK,EACtB,OAAK,OAAO,SAAS63B,EAAC,EAClBA,KAAM,EAAU,IACb,OAAO,OAAOA,GAAE,YAAYomI,EAAS,CAAC,CAAC,EAFd,EAGlC,EAEMC,EAAwB,CAAC,CAAE,MAAA91D,EAAO,KAAA2H,GAAM,WAAAmC,GAAY,MAAA1hC,GAAO,KAAA3hB,GAAO,EAAG,SAAAqhD,GAAW,KAAM,SAAAE,GAAW,KAAM,WAAA+tD,GAAa,MAAW,CACnI,KAAM,CAAE,IAAAj7G,GAAK,YAAA+vD,EAAA,EAAgBkU,EAAiB,CAAE,MAAA/e,EAAO,KAAA2H,GAAM,SAAU,KAAM,EAC7E7sD,GAAI,UAAU,IAAI,uBAAuB,EAEzC,MAAM+uD,GAAW,SAAS,cAAc,KAAK,EAC7CA,GAAS,UAAY,4BAErB,MAAME,GAAS,SAAS,cAAc,OAAO,EAC7CA,GAAO,UAAY,mBACnBA,GAAO,KAAO,QACdA,GAAO,IAAM,OAAO3hC,GAAM,GAAG,EAC7B2hC,GAAO,IAAM,OAAO3hC,GAAM,GAAG,EAC7B2hC,GAAO,KAAO,OAAOtjD,EAAI,EAEzBqjD,GAAW,UAAU,IAAI,kBAAkB,EAC3CA,GAAW,KAAO,SAClBA,GAAW,KAAO,OAAOrjD,EAAI,EAC7BqjD,GAAW,IAAM,OAAOhC,IAAY1/B,GAAM,GAAG,EACzC4/B,IAAY,KAAM8B,GAAW,IAAM,OAAO9B,EAAQ,EACjD8B,GAAW,gBAAgB,KAAK,EAErC,MAAMksD,GAAS57J,IAAS,CACtB,MAAMiG,GAAI,OAAOjG,EAAI,EACrB,GAAI,CAAC,OAAO,SAASiG,EAAC,EAAG,OACzB,MAAMgqG,GAAY0rD,GAAa,KAAK,IAAI3tF,GAAM,IAAK,KAAK,IAAIA,GAAM,IAAK/nE,EAAC,CAAC,EAAIA,GACvE41J,GAAc,KAAK,IAAI7tF,GAAM,IAAK,KAAK,IAAIA,GAAM,IAAK/nE,EAAC,CAAC,EAC9D0pG,GAAO,MAAQ,OAAOksD,EAAW,EACjCnsD,GAAW,MAAQ,OAAOO,EAAS,EACnCL,EAAmBD,EAAM,CAC3B,EAEA,OAAAisD,GAAMlsD,GAAW,OAAS1hC,GAAM,GAAG,EAEnC2hC,GAAO,iBAAiB,QAAS,IAAMisD,GAAMjsD,GAAO,KAAK,CAAC,EAC1DD,GAAW,iBAAiB,SAAU,IAAMksD,GAAMlsD,GAAW,KAAK,CAAC,EACnEA,GAAW,iBAAiB,UAAYzI,IAAM,CACxCA,GAAE,MAAQ,UACZ20D,GAAMlsD,GAAW,KAAK,EACtBA,GAAW,KAAA,EAEf,CAAC,EAEDD,GAAS,YAAYE,EAAM,EAC3BF,GAAS,YAAYC,EAAU,EAC/Be,GAAY,YAAYhB,EAAQ,EACzB,CAAE,IAAA/uD,GAAK,OAAAivD,GAAQ,MAAAisD,EAAA,CACxB,EAEME,EAAqB,CAAC,CAAE,MAAAl2D,EAAO,KAAA2H,GAAM,WAAAmC,GAAY,OAAA8M,GAAS,GAAI,OAAAC,GAAS,EAAG,QAAAC,GAAU,GAAA,IAAW,CACnG,KAAM,CAAE,IAAAh8D,GAAK,YAAA+vD,EAAA,EAAgBkU,EAAiB,CAAE,MAAA/e,EAAO,KAAA2H,GAAM,SAAU,KAAM,EAC7E7sD,GAAI,UAAU,IAAI,uBAAuB,EAEzC,MAAM+uD,GAAW,SAAS,cAAc,KAAK,EAC7CA,GAAS,UAAY,4BAErB,MAAME,GAAS,SAAS,cAAc,OAAO,EAC7CA,GAAO,UAAY,mBACnBA,GAAO,KAAO,QACdA,GAAO,IAAM,OAAO6M,EAAM,EAC1B7M,GAAO,IAAM,OAAO8M,EAAM,EAC1B9M,GAAO,KAAO,OAAO+M,EAAO,EAK5BhN,GAAW,UAAU,IAAI,kBAAkB,EAC3CA,GAAW,KAAO,SAClBA,GAAW,KAAO,MAClBA,GAAW,IAAM,IAEjB,MAAMksD,GAAS57J,IAAS,CACtB,MAAMiG,GAAI,OAAOjG,EAAI,EACrB,GAAI,CAAC,OAAO,SAASiG,EAAC,GAAKA,IAAK,EAAG,OAGnC,MAAM42G,GAAM,KAAK,MAAM52G,EAAC,EACxB0pG,GAAO,MAAQ,OAAO,KAAK,IAAI6M,GAAQ,KAAK,IAAIC,GAAQI,EAAG,CAAC,CAAC,EAC7DnN,GAAW,MAAQ8rD,EAAoBv1J,GAAG,CAAC,EAC3C2pG,EAAmBD,EAAM,CAC3B,EAEMosD,GAAkB,IAAM,CAC5B,MAAMl/C,GAAM,OAAOlN,GAAO,KAAK,EAC/B,GAAI,CAAC,OAAO,SAASkN,EAAG,EAAG,OAC3B,MAAMr/G,GAAQ,IAAMq/G,GACpBnN,GAAW,MAAQ8rD,EAAoBh+J,GAAO,CAAC,EAC/CoyG,EAAmBD,EAAM,CAC3B,EAGA,OAAAisD,GAAMlsD,GAAW,OAAS,CAAC,EAE3BC,GAAO,iBAAiB,QAAS,IAAMosD,GAAA,CAAiB,EACxDrsD,GAAW,iBAAiB,SAAU,IAAMksD,GAAMlsD,GAAW,KAAK,CAAC,EACnEA,GAAW,iBAAiB,UAAYzI,IAAM,CACxCA,GAAE,MAAQ,UACZ20D,GAAMlsD,GAAW,KAAK,EACtBA,GAAW,KAAA,EAEf,CAAC,EAEDD,GAAS,YAAYE,EAAM,EAC3BF,GAAS,YAAYC,EAAU,EAC/Be,GAAY,YAAYhB,EAAQ,EACzB,CAAE,IAAA/uD,GAAK,OAAAivD,GAAQ,MAAAisD,EAAA,CACxB,EAEMp3C,EAAM,IAAM,KAAK,QAAQ,SAAW,KACpCw3C,EAAQ,CAACC,EAAK,IAAM,IAAI,QAAShwG,IAAY,WAAWA,GAAS,KAAK,IAAI,EAAG,OAAOgwG,CAAE,GAAK,CAAC,CAAC,CAAC,EAE9FrvE,EAAe,CAACpvF,EAAO6+G,GAAS,IAC/B,OAAO,SAAS7+G,CAAK,EACnB,OAAOA,CAAK,EAAE,QAAQ6+G,EAAM,EADC,IAIhC6/C,EAAY,CAAC/4E,EAAO,MAAQ,CAChC,MAAMsrB,GAAK,SAAS,cAAc,KAAK,EACvC,OAAAA,GAAG,UAAY,kBACfA,GAAG,YAActrB,EACVsrB,EACT,EAEM0tD,EAAa,CAAClb,EAAWC,KAAY,CACzC,MAAMC,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,UAAY,iBACjB,MAAMj+H,GAAQ,SAAS,cAAc,KAAK,EAC1CA,GAAM,UAAY,wBAClBA,GAAM,YAAc+9H,EACpB,MAAMzjJ,GAAQ0jJ,IAAW,SAAS,cAAc,KAAK,EACrD,OAAKA,GAIH1jJ,GAAM,UAAU,IAAI,uBAAuB,GAH3CA,GAAM,UAAY,wBAClBA,GAAM,YAAc,KAItB2jJ,GAAK,YAAYj+H,EAAK,EACtBi+H,GAAK,YAAY3jJ,EAAK,EACf,CAAE,KAAA2jJ,GAAM,MAAAj+H,GAAO,MAAA1lB,EAAA,CACxB,EAEM4+J,EAAc,CAAC3tD,EAAImE,KAAa,CAC/BnE,IACLA,EAAG,SAAW,EAAQmE,GACxB,EAEMypD,EAA+B,CAACrpD,EAAQq1B,KAAY,CACxD,GAAI,CAACr1B,EAAQ,OACb,MAAMspD,GAAY,EAAQj0B,GAC1Br1B,EAAO,UAAU,OAAO,2BAA4BspD,EAAS,EAC7DtpD,EAAO,UAAU,OAAO,6BAA8BspD,EAAS,EAC/DtpD,EAAO,YAAcspD,GAAY,SAAW,YAC5CtpD,EAAO,MAAQspD,GACX,qBACCtpD,EAAO,QAAQ,WAAa,YACjCA,EAAO,aAAa,YAAaspD,GAAY,OAAS,OAAO,CAC/D,EAEMC,EAA4B/+J,GAAU,CAC1C,MAAMO,GAAa,OAAOP,GAAS,EAAE,EAAE,KAAA,EAAO,YAAA,EAC9C,OAAIO,KAAe,WAAaA,KAAe,KAAa,UACxDA,KAAe,YAAcA,KAAe,KAAa,WACzDA,KAAe,WAAaA,KAAe,YAAcA,KAAe,KAAa,UAClF,cACT,EAEMy+J,EAA8BC,GAAW,CAC7C,MAAM1+J,GAAaw+J,EAAyBE,CAAM,EAClD,OAAI1+J,KAAe,WAAaA,KAAe,WAAmB,EAC9DA,KAAe,UAAkB,EAC9B,EACT,EAEM2+J,EAAuBrtJ,GAAW,CACtC,GAAI,CAACA,GAAU,OAAOA,EAAO,QAAW,SAAU,MAAO,KACzD,IAAInC,GAAM,OAAO,kBACjB,QAASxG,GAAI,EAAGA,GAAI2I,EAAO,OAAQ3I,IAAK,EAAG,CACzC,MAAM2uB,GAAI,OAAOhmB,EAAO3I,EAAC,CAAC,EACtB,OAAO,SAAS2uB,EAAC,GAAKA,GAAInoB,KAC5BA,GAAMmoB,GAEV,CACA,OAAO,OAAO,SAASnoB,EAAG,EAAIA,GAAM,GACtC,EAEMyvJ,EAAyBttJ,GAAW,CACxC,GAAI,CAACA,GAAU,OAAOA,EAAO,QAAW,SACtC,MAAO,CACL,MAAO,EACP,IAAK,IACL,IAAK,IACL,KAAM,GAAA,EAGV,IAAInK,GAAQ,EACR4C,GAAM,OAAO,kBACboF,GAAM,OAAO,kBACbkgB,GAAM,EACV,QAAS1mB,GAAI,EAAGA,GAAI2I,EAAO,OAAQ3I,IAAK,EAAG,CACzC,MAAM2uB,GAAI,OAAOhmB,EAAO3I,EAAC,CAAC,EACrB,OAAO,SAAS2uB,EAAC,IACtBnwB,IAAS,EACTkoB,IAAOiI,GACHA,GAAIvtB,KAAKA,GAAMutB,IACfA,GAAInoB,KAAKA,GAAMmoB,IACrB,CACA,MAAO,CACL,MAAAnwB,GACA,IAAKA,GAAQ,EAAI4C,GAAM,IACvB,IAAK5C,GAAQ,EAAIgI,GAAM,IACvB,KAAMhI,GAAQ,EAAIkoB,GAAMloB,GAAQ,GAAA,CAEpC,EAkDM03J,EAAwB,CAACC,EAAYlpF,GAAa,CAAA,IAAO,CAC7D,MAAMv1D,GAAQ,MAAM,KAAK,IAAI,KAAK,MAAM,QAAQu1D,EAAU,EAAIA,GAAa,CAACA,EAAU,GACnF,IAAK5zE,IAAS,OAAOA,IAAQ,EAAE,EAAE,MAAM,EACvC,OAAO,OAAO,CAAC,CAAC,EACdqe,GAAM,SACX,KAAK,uBAAuB,qBAAsB,CAChD,MAAO,UACP,WAAY,IACZ,aAAc,KACd,SAAU,CAAE,MAAO,SAAA,CAAU,CAC9B,EACD,KAAK,oBAAoB,qBAAsB,CAC7C,OAAQ,OAAOy+I,GAAc,QAAQ,EACrC,WAAYz+I,GACZ,UAAW,KAAK,IAAA,CAAI,EACnB,CACD,MAAO,UACP,OAAQ,KACR,OAAQ,WAAWy+I,GAAc,QAAQ,GACzC,WAAY,GAAA,CACb,EACD,KAAK,QAAQ,SAAS,mBAAmB,WAAWA,GAAc,QAAQ,EAAE,EAC9E,EAEMC,EAAmBruD,GAAO,CACzBA,IACLA,EAAG,UAAY,wBACfA,EAAG,MAAM,UAAY,MACrBA,EAAG,MAAM,SAAW,OACpBA,EAAG,MAAM,WAAa,MACtBA,EAAG,MAAM,WAAa,SACtBA,EAAG,MAAM,SAAW,UACpBA,EAAG,MAAM,aAAe,OACxBA,EAAG,MAAM,SAAW,OACpBA,EAAG,MAAM,SAAW,IACtB,EAEMsuD,EAAyB,CAACF,EAAYx6J,GAAO4H,GAAU,OAAS,CACpE,MAAM+yJ,GAAM36J,cAAiB,MAAQA,GAAQ,IAAI,MAAM,OAAOA,EAAK,CAAC,EAC9DlB,GAAU67J,IAAK,SAAW,OAAOA,EAAG,EACpCnzJ,GAASmzJ,IAAK,MAAQ,GAAG77J,EAAO;AAAA,EAAK67J,GAAI,KAAK,GAAK77J,GACzD,GAAI,OAAO,WAAe,KAAe,OAAO,WAAW,aAAgB,WACzE,GAAI,CACF,WAAW,YAAY67J,EAAG,CAC5B,OAASC,GAAoB,CAC3B,QAAQ,KAAK,gEAAiEA,EAAkB,CAClG,CAGF,eAAQ,MAAM,cAAcJ,CAAU,UAAW,CAAE,MAAOG,GAAK,QAAA/yJ,GAAS,EACjEJ,EACT,EAEMqzJ,EAA8B1/J,GAAU,CAC5C,MAAMO,GAAa,OAAOP,GAAS,EAAE,EAAE,KAAA,EAAO,YAAA,EAC9C,OAAIO,KAAe,OAASA,KAAe,WAAmB,MAC1DA,KAAe,MAAQA,KAAe,WAAmB,KACtD,MACT,EAEMo/J,EAA4B3/J,GAAU,CAC1C,MAAMO,GAAa,OAAOP,GAAS,EAAE,EAAE,KAAA,EAAO,YAAA,EAC9C,OAAIO,KAAe,WAAaA,KAAe,OAASA,KAAe,OAAe,UAClFA,KAAe,WAAaA,KAAe,MAAc,UACzDA,KAAe,WAAaA,KAAe,MAAc,UACtD,KACT,EAEMq/J,EAA8B5/J,GAAU,CAC5C,MAAMO,GAAa,OAAOP,GAAS,EAAE,EAAE,KAAA,EAAO,YAAA,EAC9C,OAAIO,KAAe,SAAiB,SAChCA,KAAe,UAAYA,KAAe,UAAYA,KAAe,WAAmB,SACrF,YACT,EAEMs/J,EAA2BxgJ,GAC/BA,IAASm/B,GAAAA,cAAc,OACvBn/B,IAASm/B,iBAAc,QACvBn/B,IAASm/B,GAAAA,cAAc,SACvBn/B,IAASm/B,GAAAA,cAAc,iBACvBn/B,IAASm/B,GAAAA,cAAc,YACvBn/B,IAASm/B,GAAAA,cAAc,mBAEnBshH,EAAwB,CAACC,EAAQ70B,GAAe,SAAW,CAC/D,MAAMr0B,GAAS,SAAS,cAAc,QAAQ,EAC9CA,GAAO,UAAY,mBACfkpD,IAAQlpD,GAAO,QAAQ,OAASkpD,GACpC,UAAW/xI,KAAS,CAClB,CAAE,MAAO,OAAQ,MAAO,MAAA,EACxB,CAAE,MAAO,KAAM,MAAO,IAAA,EACtB,CAAE,MAAO,MAAO,MAAO,KAAA,CAAM,EAC5B,CACD,MAAM27F,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQ37F,GAAM,MAClB27F,GAAI,YAAc37F,GAAM,MACxB6oF,GAAO,YAAY8S,EAAG,CACxB,CACA,OAAA9S,GAAO,MAAQ6oD,EAA2Bx0B,EAAY,EAC/Cr0B,EACT,EAEMmpD,EAAoB,CAAA,EACpBC,EAAyB,CAACF,EAAQ70B,GAAe,KAAO,CAC5D,MAAMr0B,GAAS,SAAS,cAAc,QAAQ,EAC9C,OAAAA,GAAO,UAAY,mBACfkpD,IAAQlpD,GAAO,QAAQ,OAASkpD,GACpClpD,GAAO,QAAQ,aAAeq0B,GAAe,OAAOA,EAAY,EAAI,GACpEr0B,GAAO,QAAQ,aAAe,QAC9BA,GAAO,iBAAiB,SAAU,IAAM,CACtCA,GAAO,QAAQ,aAAe,MAChC,CAAC,EACDmpD,EAAkB,KAAKnpD,EAAM,EACtBA,EACT,EAGMj7F,EAAS,SAAS,cAAc,KAAK,EAErCskJ,EAAwBJ,EAAsB,2BAA4Bl/J,GAAS,QAAQ,WAAa,MAAM,EAC9Gu/J,EAAqB,SAAS,cAAc,OAAO,EACzDA,EAAmB,KAAO,OAC1BA,EAAmB,UAAY,iBAC/BA,EAAmB,YAAc,SACjCA,EAAmB,MAAQ,OAAOv/J,GAAS,QAAQ,kBAAoB,QAAQ,EAC/Eu/J,EAAmB,QAAQ,OAAS,yBAEpC,MAAMC,EAAmB,SAAS,cAAc,QAAQ,EACxDA,EAAiB,KAAO,SACxBA,EAAiB,UAAY,mBAC7BA,EAAiB,YAAc,YAC/BA,EAAiB,MAAQ,mBACzBA,EAAiB,QAAQ,OAAS,sBAElC,MAAMC,EAAiB,SAAS,cAAc,KAAK,EACnDA,EAAe,QAAQ,OAAS,wBAChCA,EAAe,YAAc,GAC7Bf,EAAgBe,CAAc,EAE9BzkJ,EAAO,YAAYurG,EAAiB,CAClC,MAAO,YACP,KAAM,0CACN,SAAU+4C,CAAA,CACX,EAAE,GAAG,EACNtkJ,EAAO,YAAYurG,EAAiB,CAClC,MAAO,SACP,KAAM,oBACN,SAAUk5C,CAAA,CACX,EAAE,GAAG,EAEN,MAAMC,EAAc,SAAS,cAAc,KAAK,EAChDA,EAAY,UAAY,kBACxB,MAAMC,EAAiB7B,EAAU,GAAG,EACpC6B,EAAe,QAAQ,OAAS,qBAChC,MAAMC,EAAkB9B,EAAU,GAAG,EACrC8B,EAAgB,QAAQ,OAAS,sBACjC,MAAMC,EAAqB/B,EAAU,GAAG,EACxC+B,EAAmB,QAAQ,OAAS,yBACpCH,EAAY,YAAY3B,EAAW,MAAO4B,CAAc,EAAE,IAAI,EAC9DD,EAAY,YAAY3B,EAAW,OAAQ6B,CAAe,EAAE,IAAI,EAChEF,EAAY,YAAY3B,EAAW,UAAW8B,CAAkB,EAAE,IAAI,EACtEH,EAAY,MAAM,UAAY,MAC9BA,EAAY,MAAM,aAAe,MACjC1kJ,EAAO,YAAY0kJ,CAAW,EAE9B,MAAMI,GAAiB,SAAS,cAAc,KAAK,EACnDA,GAAe,YAAYv5C,EAAiB,CAC1C,MAAO,cACP,KAAM,kCACN,SAAUg5C,CAAA,CACX,EAAE,GAAG,EACN,MAAMQ,GAAmB,IAAIjnD,GAC7BinD,GAAiB,IAAI,CAAE,GAAI,0BAA2B,MAAO,WAAY,UAAW,GAAM,UAAW,GAAO,QAASD,EAAA,CAAgB,EACrIC,GAAiB,QAAQ,MAAM,UAAY,MAG3C,MAAM7+H,GAAW,SAAS,cAAc,KAAK,EAEvC8+H,GAA0Bd,EAAsB,6BAA8Bl/J,GAAS,UAAU,WAAa,MAAM,EACpHigK,GAAwB,SAAS,cAAc,QAAQ,EAC7DA,GAAsB,UAAY,mBAClCA,GAAsB,QAAQ,OAAS,2BACvC,UAAW7yI,IAAS,CAClB,CAAE,MAAO,MAAO,MAAO,KAAA,EACvB,CAAE,MAAO,UAAW,MAAO,SAAA,EAC3B,CAAE,MAAO,UAAW,MAAO,SAAA,EAC3B,CAAE,MAAO,UAAW,MAAO,SAAA,CAAU,EACpC,CACD,MAAM27F,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQ37F,EAAM,MAClB27F,GAAI,YAAc37F,EAAM,MACxB6yI,GAAsB,YAAYl3C,EAAG,CACvC,CACAk3C,GAAsB,MAAQlB,EAAyB/+J,GAAS,UAAU,SAAW,KAAK,EAE1F,MAAMkgK,GAAuBb,EAAuB,0BAA2Br/J,GAAS,UAAU,qBAAuB,EAAE,EACrHmgK,EAAuB,SAAS,cAAc,OAAO,EAC3DA,EAAqB,KAAO,OAC5BA,EAAqB,UAAY,iBACjCA,EAAqB,YAAc,WACnCA,EAAqB,MAAQ,OAAOngK,GAAS,UAAU,kBAAoB,UAAU,EACrFmgK,EAAqB,QAAQ,OAAS,2BAEtC,MAAMC,GAAqB,SAAS,cAAc,QAAQ,EAC1DA,GAAmB,KAAO,SAC1BA,GAAmB,UAAY,mBAC/BA,GAAmB,YAAc,YACjCA,GAAmB,MAAQ,qBAC3BA,GAAmB,QAAQ,OAAS,wBAEpC,MAAMC,EAAmB,SAAS,cAAc,KAAK,EACrDA,EAAiB,QAAQ,OAAS,0BAClCA,EAAiB,YAAc,GAC/B3B,EAAgB2B,CAAgB,EAEhCn/H,GAAS,YAAYqlF,EAAiB,CACpC,MAAO,YACP,KAAM,0CACN,SAAUy5C,EAAA,CACX,EAAE,GAAG,EACN9+H,GAAS,YAAYqlF,EAAiB,CACpC,MAAO,UACP,KAAM,yCACN,SAAU05C,EAAA,CACX,EAAE,GAAG,EACN/+H,GAAS,YAAYqlF,EAAiB,CACpC,MAAO,cACP,KAAM,iCACN,SAAU25C,EAAA,CACX,EAAE,GAAG,EACNh/H,GAAS,YAAYqlF,EAAiB,CACpC,MAAO,SACP,KAAM,oBACN,SAAU85C,CAAA,CACX,EAAE,GAAG,EAEN,MAAMC,EAAgB,SAAS,cAAc,KAAK,EAClDA,EAAc,UAAY,kBAC1B,MAAMC,GAAmBzC,EAAU,GAAG,EACtCyC,GAAiB,QAAQ,OAAS,uBAClC,MAAMC,GAAoB1C,EAAU,GAAG,EACvC0C,GAAkB,QAAQ,OAAS,wBACnC,MAAMC,GAAuB3C,EAAU,GAAG,EAC1C2C,GAAqB,QAAQ,OAAS,2BACtCH,EAAc,YAAYvC,EAAW,MAAOwC,EAAgB,EAAE,IAAI,EAClED,EAAc,YAAYvC,EAAW,OAAQyC,EAAiB,EAAE,IAAI,EACpEF,EAAc,YAAYvC,EAAW,UAAW0C,EAAoB,EAAE,IAAI,EAC1EH,EAAc,MAAM,UAAY,MAChCA,EAAc,MAAM,aAAe,MACnCp/H,GAAS,YAAYo/H,CAAa,EAElC,MAAMI,GAAmB,SAAS,cAAc,KAAK,EACrDA,GAAiB,YAAYn6C,EAAiB,CAC5C,MAAO,cACP,KAAM,oCACN,SAAU45C,CAAA,CACX,EAAE,GAAG,EACN,MAAMQ,GAAqB,IAAI7nD,GAC/B6nD,GAAmB,IAAI,CAAE,GAAI,4BAA6B,MAAO,WAAY,UAAW,GAAM,UAAW,GAAO,QAASD,EAAA,CAAkB,EAC3IC,GAAmB,QAAQ,MAAM,UAAY,MAG7C,MAAMC,EAAa,SAAS,cAAc,KAAK,EAEzCC,GAA4B3B,EAAsB,+BAAgCl/J,GAAS,YAAY,WAAa,MAAM,EAC1H8gK,GAA0B,SAAS,cAAc,QAAQ,EAC/DA,GAAwB,UAAY,mBACpCA,GAAwB,QAAQ,OAAS,6BACzC,UAAW1zI,IAAS,CAClB,CAAE,MAAO,aAAc,MAAO,YAAA,EAC9B,CAAE,MAAO,SAAU,MAAO,mBAAA,EAC1B,CAAE,MAAO,SAAU,MAAO,mBAAA,CAAoB,EAC7C,CACD,MAAM27F,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQ37F,EAAM,MAClB27F,GAAI,YAAc37F,EAAM,MACxB0zI,GAAwB,YAAY/3C,EAAG,CACzC,CACA+3C,GAAwB,MAAQ9B,EAA2Bh/J,GAAS,YAAY,SAAW,YAAY,EAEvG,MAAM+gK,GAAyB1B,EAAuB,4BAA6Br/J,GAAS,YAAY,qBAAuB,EAAE,EAC3HghK,GAAyB,SAAS,cAAc,OAAO,EAC7DA,GAAuB,KAAO,OAC9BA,GAAuB,UAAY,iBACnCA,GAAuB,YAAc,aACrCA,GAAuB,MAAQ,OAAOhhK,GAAS,YAAY,kBAAoB,YAAY,EAC3FghK,GAAuB,QAAQ,OAAS,6BAExC,MAAMC,GAAuB,SAAS,cAAc,QAAQ,EAC5DA,GAAqB,KAAO,SAC5BA,GAAqB,UAAY,mBACjCA,GAAqB,YAAc,YACnCA,GAAqB,MAAQ,6BAC7BA,GAAqB,QAAQ,OAAS,0BAEtC,MAAMC,GAAqB,SAAS,cAAc,KAAK,EACvDA,GAAmB,QAAQ,OAAS,4BACpCA,GAAmB,YAAc,GACjCxC,EAAgBwC,EAAkB,EAElCN,EAAW,YAAYr6C,EAAiB,CACtC,MAAO,UACP,KAAM,4CACN,SAAUu6C,EAAA,CACX,EAAE,GAAG,EACNF,EAAW,YAAYr6C,EAAiB,CACtC,MAAO,YACP,KAAM,0CACN,SAAUs6C,EAAA,CACX,EAAE,GAAG,EACND,EAAW,YAAYr6C,EAAiB,CACtC,MAAO,cACP,KAAM,iCACN,SAAUw6C,EAAA,CACX,EAAE,GAAG,EACNH,EAAW,YAAYr6C,EAAiB,CACtC,MAAO,SACP,KAAM,oBACN,SAAU26C,EAAA,CACX,EAAE,GAAG,EAEN,MAAMC,GAAkB,SAAS,cAAc,KAAK,EACpDA,GAAgB,UAAY,kBAC5B,MAAMC,GAAqBtD,EAAU,GAAG,EACxCsD,GAAmB,QAAQ,OAAS,yBACpC,MAAMC,GAAsBvD,EAAU,GAAG,EACzCuD,GAAoB,QAAQ,OAAS,0BACrC,MAAMC,GAAyBxD,EAAU,GAAG,EAC5CwD,GAAuB,QAAQ,OAAS,6BACxCH,GAAgB,YAAYpD,EAAW,MAAOqD,EAAkB,EAAE,IAAI,EACtED,GAAgB,YAAYpD,EAAW,OAAQsD,EAAmB,EAAE,IAAI,EACxEF,GAAgB,YAAYpD,EAAW,UAAWuD,EAAsB,EAAE,IAAI,EAC9EH,GAAgB,MAAM,UAAY,MAClCA,GAAgB,MAAM,aAAe,MACrCP,EAAW,YAAYO,EAAe,EAEtC,MAAMI,GAAqB,SAAS,cAAc,KAAK,EACvDA,GAAmB,YAAYh7C,EAAiB,CAC9C,MAAO,cACP,KAAM,6CACN,SAAUy6C,EAAA,CACX,EAAE,GAAG,EACN,MAAMQ,GAAuB,IAAI1oD,GACjC0oD,GAAqB,IAAI,CAAE,GAAI,8BAA+B,MAAO,WAAY,UAAW,GAAM,UAAW,GAAO,QAASD,EAAA,CAAoB,EACjJC,GAAqB,QAAQ,MAAM,UAAY,MAG/C,MAAMC,GAAc,SAAS,cAAc,KAAK,EAE1CC,GAA6BxC,EAAsB,0BAA2Bl/J,GAAS,aAAa,WAAa,MAAM,EACvH2hK,EAA0BtC,EAAuB,uBAAwBr/J,GAAS,aAAa,qBAAuB,EAAE,EAExH4hK,GAAgC,SAAS,cAAc,OAAO,EACpEA,GAA8B,KAAO,SACrCA,GAA8B,UAAY,mBAC1CA,GAA8B,MAAQ,OAAO5hK,GAAS,aAAa,eAAiB,GAAG,EACvF4hK,GAA8B,QAAQ,OAAS,8BAE/C,MAAMC,EAA4B,SAAS,cAAc,OAAO,EAChEA,EAA0B,KAAO,SACjCA,EAA0B,UAAY,mBACtCA,EAA0B,MAAQ,OAAO7hK,GAAS,aAAa,WAAa,IAAI,EAChF6hK,EAA0B,QAAQ,OAAS,0BAE3C,MAAMC,EAA0B,SAAS,cAAc,OAAO,EAC9DA,EAAwB,KAAO,OAC/BA,EAAwB,UAAY,iBACpCA,EAAwB,YAAc,yBACtCA,EAAwB,MAAQ,OAAO9hK,GAAS,aAAa,kBAAoB,wBAAwB,EACzG8hK,EAAwB,QAAQ,OAAS,wBAEzC,MAAMC,EAAwB,SAAS,cAAc,QAAQ,EAC7DA,EAAsB,KAAO,SAC7BA,EAAsB,UAAY,mBAClCA,EAAsB,YAAc,YACpCA,EAAsB,MAAQ,mCAC9BA,EAAsB,QAAQ,UAAY,mCAC1CA,EAAsB,QAAQ,OAAS,qBAEvC,MAAMC,EAAsB,SAAS,cAAc,KAAK,EACxDA,EAAoB,QAAQ,OAAS,uBACrCA,EAAoB,YAAc,GAClCtD,EAAgBsD,CAAmB,EAEnCP,GAAY,YAAYl7C,EAAiB,CACvC,MAAO,YACP,KAAM,0CACN,SAAUm7C,EAAA,CACX,EAAE,GAAG,EACND,GAAY,YAAYl7C,EAAiB,CACvC,MAAO,cACP,KAAM,iCACN,SAAUo7C,CAAA,CACX,EAAE,GAAG,EACN,MAAMM,GAA8B3E,EAAsB,CACxD,MAAO,iBACP,KAAM,gCACN,WAAYsE,GACZ,MAAO,CAAE,IAAK,EAAG,IAAK,IAAA,EACtB,KAAM,CAAA,CACP,EACDH,GAAY,YAAYQ,GAA4B,GAAG,EACvD,MAAMC,GAA0BxE,EAAmB,CACjD,MAAO,YACP,KAAM,oCACN,WAAYmE,EACZ,OAAQ,IACR,OAAQ,GACR,QAAS,GAAA,CACV,EACDJ,GAAY,YAAYS,GAAwB,GAAG,EACnDT,GAAY,YAAYl7C,EAAiB,CACvC,MAAO,SACP,KAAM,oBACN,SAAUy7C,CAAA,CACX,EAAE,GAAG,EAEN,MAAMG,GAA0B,SAAS,cAAc,KAAK,EAC5DA,GAAwB,MAAM,QAAU,OACxCA,GAAwB,MAAM,oBAAsB,sBACpDA,GAAwB,MAAM,UAAY,MAC1CA,GAAwB,MAAM,OAAS,MACvCA,GAAwB,MAAM,WAAa,SAC3CA,GAAwB,MAAM,MAAQ,OAEtC,MAAMC,GAAwB,SAAS,cAAc,UAAU,EAC/DA,GAAsB,UAAY,qBAClCA,GAAsB,IAAM,EAC5BA,GAAsB,MAAQ,EAC9BA,GAAsB,QAAQ,OAAS,yBAEvC,MAAMC,GAAyBvE,EAAU,IAAI,EAC7CuE,GAAuB,QAAQ,OAAS,4BACxCF,GAAwB,YAAYC,EAAqB,EACzDD,GAAwB,YAAYE,EAAsB,EAE1D,KAAM,CAAE,IAAKC,EAAA,EAA2B/7C,EAAiB,CACvD,MAAO,WACP,KAAM,mCACN,SAAU47C,EAAA,CACX,EACDV,GAAY,YAAYa,EAAsB,EAE9C,MAAMC,GAAmB,SAAS,cAAc,KAAK,EACrDA,GAAiB,UAAY,kBAC7B,MAAMC,GAAsB1E,EAAU,GAAG,EACzC0E,GAAoB,QAAQ,OAAS,oBACrC,MAAMC,GAA6B3E,EAAU,GAAG,EAChD2E,GAA2B,QAAQ,OAAS,2BAC5C,MAAMC,GAA0B5E,EAAU,GAAG,EAC7C4E,GAAwB,QAAQ,OAAS,wBACzCH,GAAiB,YAAYxE,EAAW,MAAOyE,EAAmB,EAAE,IAAI,EACxED,GAAiB,YAAYxE,EAAW,aAAc0E,EAA0B,EAAE,IAAI,EACtFF,GAAiB,YAAYxE,EAAW,UAAW2E,EAAuB,EAAE,IAAI,EAChFH,GAAiB,MAAM,UAAY,MACnCA,GAAiB,MAAM,aAAe,MACtCd,GAAY,YAAYc,EAAgB,EAExC,MAAMI,GAAsB,SAAS,cAAc,KAAK,EACxDA,GAAoB,YAAYp8C,EAAiB,CAC/C,MAAO,cACP,KAAM,6CACN,SAAUu7C,CAAA,CACX,EAAE,GAAG,EAEN,MAAMc,GAAkC,SAAS,cAAc,OAAO,EACtEA,GAAgC,KAAO,SACvCA,GAAgC,UAAY,mBAC5CA,GAAgC,MAAQ,OAAO5iK,GAAS,aAAa,iBAAmB,EAAE,EAC1F4iK,GAAgC,QAAQ,OAAS,gCACjD,MAAMC,GAAgCvF,EAAsB,CAC1D,MAAO,mBACP,KAAM,uCACN,WAAYsF,GACZ,MAAO,CAAE,IAAK,EAAG,IAAK,GAAA,EACtB,KAAM,CAAA,CACP,EACDD,GAAoB,YAAYE,GAA8B,GAAG,EAEjE,MAAMC,GAA0B,SAAS,cAAc,OAAO,EAC9DA,GAAwB,KAAO,SAC/BA,GAAwB,UAAY,mBACpCA,GAAwB,MAAQ,OAAO9iK,GAAS,aAAa,SAAW,CAAC,EACzE8iK,GAAwB,QAAQ,OAAS,wBACzC,MAAMC,GAAsBzF,EAAsB,CAChD,MAAO,aACP,KAAM,6CACN,WAAYwF,GACZ,MAAO,CAAE,IAAK,EAAG,IAAK,GAAA,EACtB,KAAM,CAAA,CACP,EACDH,GAAoB,YAAYI,GAAoB,GAAG,EACvD,MAAMC,GAAwB,IAAIlqD,GAClCkqD,GAAsB,IAAI,CAAE,GAAI,yBAA0B,MAAO,WAAY,UAAW,GAAM,UAAW,GAAO,QAASL,EAAA,CAAqB,EAC9IK,GAAsB,QAAQ,MAAM,UAAY,MAGhD,MAAMC,GAAc,SAAS,cAAc,KAAK,EAE1CC,GAA0B7D,EAAuB,6BAA8Br/J,GAAS,aAAa,qBAAuB,EAAE,EAC9HmjK,GAA+B7uD,GAAoB,CACvD,QAASt0G,GAAS,aAAa,YAAc,GAC7C,QAAS,KACT,SAAU,MACV,UAAW,8BAAA,CACZ,EACDmjK,GAA6B,QAAQ,OAAS,gCAE9C,MAAMC,GAA0B,SAAS,cAAc,OAAO,EAC9DA,GAAwB,KAAO,OAC/BA,GAAwB,UAAY,iBACpCA,GAAwB,YAAc,yBACtCA,GAAwB,MAAQ,OAAOpjK,GAAS,aAAa,kBAAoB,wBAAwB,EACzGojK,GAAwB,QAAQ,OAAS,8BAEzC,MAAMC,GAAwB,SAAS,cAAc,QAAQ,EAC7DA,GAAsB,KAAO,SAC7BA,GAAsB,UAAY,mBAClCA,GAAsB,YAAc,YACpCA,GAAsB,MAAQ,mCAC9BA,GAAsB,QAAQ,UAAY,mCAC1CA,GAAsB,QAAQ,OAAS,2BAEvC,MAAMC,GAAsB,SAAS,cAAc,KAAK,EACxDA,GAAoB,QAAQ,OAAS,6BACrCA,GAAoB,YAAc,GAClC5E,EAAgB4E,EAAmB,EAEnCL,GAAY,YAAY18C,EAAiB,CACvC,MAAO,cACP,KAAM,iCACN,SAAU28C,EAAA,CACX,EAAE,GAAG,EACND,GAAY,YAAY18C,EAAiB,CACvC,MAAO,YACP,KAAM,iCACN,SAAU48C,EAAA,CACX,EAAE,GAAG,EACNF,GAAY,YAAY18C,EAAiB,CACvC,MAAO,SACP,KAAM,oBACN,SAAU+8C,EAAA,CACX,EAAE,GAAG,EAEN,MAAMC,GAA0B,SAAS,cAAc,KAAK,EAC5DA,GAAwB,MAAM,QAAU,OACxCA,GAAwB,MAAM,oBAAsB,sBACpDA,GAAwB,MAAM,UAAY,MAC1CA,GAAwB,MAAM,OAAS,MACvCA,GAAwB,MAAM,WAAa,SAC3CA,GAAwB,MAAM,MAAQ,OAEtC,MAAMC,GAAwB,SAAS,cAAc,UAAU,EAC/DA,GAAsB,UAAY,qBAClCA,GAAsB,IAAM,EAC5BA,GAAsB,MAAQ,EAC9BA,GAAsB,QAAQ,OAAS,+BAEvC,MAAMC,EAAyB3F,EAAU,IAAI,EAC7C2F,EAAuB,QAAQ,OAAS,kCACxCF,GAAwB,YAAYC,EAAqB,EACzDD,GAAwB,YAAYE,CAAsB,EAE1D,KAAM,CAAE,IAAKC,EAAA,EAA2Bn9C,EAAiB,CACvD,MAAO,WACP,KAAM,+BACN,SAAUg9C,EAAA,CACX,EACDN,GAAY,YAAYS,EAAsB,EAE9C,MAAMC,GAAmB,SAAS,cAAc,KAAK,EACrDA,GAAiB,UAAY,kBAC7B,MAAMC,GAAsB9F,EAAU,GAAG,EACzC8F,GAAoB,QAAQ,OAAS,0BACrC,MAAMC,EAA8B/F,EAAU,GAAG,EACjD+F,EAA4B,QAAQ,OAAS,kCAC7C,MAAMC,GAA0BhG,EAAU,GAAG,EAC7CgG,GAAwB,QAAQ,OAAS,8BACzCH,GAAiB,YAAY5F,EAAW,MAAO6F,EAAmB,EAAE,IAAI,EACxED,GAAiB,YAAY5F,EAAW,UAAW8F,CAA2B,EAAE,IAAI,EACpFF,GAAiB,YAAY5F,EAAW,UAAW+F,EAAuB,EAAE,IAAI,EAChFH,GAAiB,MAAM,UAAY,MACnCA,GAAiB,MAAM,aAAe,MACtCV,GAAY,YAAYU,EAAgB,EAExC,MAAMI,GAAsB,SAAS,cAAc,KAAK,EACxDA,GAAoB,YAAYx9C,EAAiB,CAC/C,MAAO,cACP,KAAM,6CACN,SAAU68C,EAAA,CACX,EAAE,GAAG,EAEN,MAAMY,GAA8B,SAAS,cAAc,OAAO,EAClEA,GAA4B,KAAO,SACnCA,GAA4B,UAAY,mBACxCA,GAA4B,MAAQ,OAAOhkK,GAAS,aAAa,iBAAmB,EAAE,EACtFgkK,GAA4B,QAAQ,OAAS,kCAC7C,MAAMC,GAA4B3G,EAAsB,CACtD,MAAO,eACP,KAAM,6CACN,WAAY0G,GACZ,MAAO,CAAE,IAAK,EAAG,IAAK,GAAA,EACtB,KAAM,CAAA,CACP,EACDD,GAAoB,YAAYE,GAA0B,GAAG,EAE7D,MAAMC,GAA0B,SAAS,cAAc,OAAO,EAC9DA,GAAwB,KAAO,SAC/BA,GAAwB,UAAY,mBACpCA,GAAwB,MAAQ,OAAOlkK,GAAS,aAAa,SAAW,CAAC,EACzEkkK,GAAwB,QAAQ,OAAS,8BACzC,MAAMC,GAAsB7G,EAAsB,CAChD,MAAO,aACP,KAAM,8BACN,WAAY4G,GACZ,MAAO,CAAE,IAAK,EAAG,IAAK,GAAA,EACtB,KAAM,CAAA,CACP,EACDH,GAAoB,YAAYI,GAAoB,GAAG,EACvD,MAAMC,GAAwB,IAAItrD,GAClCsrD,GAAsB,IAAI,CAAE,GAAI,+BAAgC,MAAO,WAAY,UAAW,GAAM,UAAW,GAAO,QAASL,EAAA,CAAqB,EACpJK,GAAsB,QAAQ,MAAM,UAAY,MAGhD,MAAMC,GAAS,SAAS,cAAc,KAAK,EAErCC,GAAe,SAAS,cAAc,QAAQ,EACpDA,GAAa,UAAY,mBACzBA,GAAa,QAAQ,OAAS,wBAC9BA,GAAa,QAAQ,aAAe,OAAOtkK,GAAS,QAAQ,qBAAuB,EAAE,EACrFo/J,EAAkB,KAAKkF,EAAY,EAEnC,MAAMC,GAAkB,SAAS,cAAc,OAAO,EACtDA,GAAgB,KAAO,SACvBA,GAAgB,UAAY,mBAC5BA,GAAgB,MAAQ,OAAOvkK,GAAS,QAAQ,YAAc,CAAC,EAC/DukK,GAAgB,QAAQ,OAAS,4BAEjC,MAAMC,GAAY,SAAS,cAAc,OAAO,EAChDA,GAAU,KAAO,SACjBA,GAAU,UAAY,mBACtBA,GAAU,MAAQ,OAAOxkK,GAAS,QAAQ,MAAQ,CAAC,EACnDwkK,GAAU,QAAQ,OAAS,sBAE3B,MAAMC,GAAiB,SAAS,cAAc,OAAO,EACrDA,GAAe,KAAO,SACtBA,GAAe,UAAY,mBAC3BA,GAAe,MAAQ,OAAOzkK,GAAS,QAAQ,WAAa,EAAE,EAC9DykK,GAAe,QAAQ,OAAS,2BAEhC,MAAMC,GAAiB,SAAS,cAAc,OAAO,EACrDA,GAAe,KAAO,SACtBA,GAAe,UAAY,mBAC3BA,GAAe,MAAQ,OAAO1kK,GAAS,QAAQ,QAAUA,GAAS,QAAQ,WAAa,CAAC,EACxF0kK,GAAe,QAAQ,OAAS,2BAEhC,MAAMC,GAAoB,SAAS,cAAc,OAAO,EACxDA,GAAkB,KAAO,OACzBA,GAAkB,UAAY,iBAC9BA,GAAkB,YAAc,YAChCA,GAAkB,MAAQ,OAAO3kK,GAAS,QAAQ,2BAA6B,WAAW,EAC1F2kK,GAAkB,QAAQ,OAAS,yBAEnC,MAAMC,GAAa,SAAS,cAAc,QAAQ,EAClDA,GAAW,KAAO,SAClBA,GAAW,UAAY,mBACvBA,GAAW,YAAc,YACzBA,GAAW,MAAQ,iCACnBA,GAAW,QAAQ,UAAY,iCAC/BA,GAAW,QAAQ,OAAS,eAE5B,MAAMntB,GAAW,SAAS,cAAc,KAAK,EAC7CA,GAAS,UAAY,wBACrBA,GAAS,QAAQ,OAAS,iBAC1BA,GAAS,YAAc,GAEvB,KAAM,CAAE,IAAK5U,EAAA,EAActc,EAAiB,CAC1C,MAAO,cACP,KAAM,iCACN,SAAU+9C,EAAA,CACX,EACDD,GAAO,YAAYxhC,EAAS,EAE5B,MAAMgiC,GAAgBnH,EAAmB,CACvC,MAAO,aACP,KAAM,gDACN,WAAY6G,GACZ,OAAQ,GACR,OAAQ,EACR,QAAS,GAAA,CACV,EACDF,GAAO,YAAYQ,GAAc,GAAG,EAEpC,MAAMC,GAAc,SAAS,cAAc,KAAK,EAChDA,GAAY,UAAY,kBACxB,MAAMC,GAAkBjH,EAAU,GAAG,EACrCiH,GAAgB,QAAQ,OAAS,qBACjC,MAAMC,GAAiBlH,EAAU,GAAG,EACpCkH,GAAe,QAAQ,OAAS,yBAChC,MAAMC,GAAenH,EAAU,GAAG,EAClCmH,GAAa,QAAQ,OAAS,kBAE9BH,GAAY,YAAY/G,EAAW,aAAcgH,EAAe,EAAE,IAAI,EACtED,GAAY,YAAY/G,EAAW,cAAeiH,EAAc,EAAE,IAAI,EACtEF,GAAY,YAAY/G,EAAW,UAAWkH,EAAY,EAAE,IAAI,EAEhEH,GAAY,MAAM,UAAY,MAE9B,MAAMI,GAAe,SAAS,cAAc,KAAK,EACjDA,GAAa,MAAM,QAAU,OAC7BA,GAAa,MAAM,oBAAsB,sBACzCA,GAAa,MAAM,UAAY,MAC/BA,GAAa,MAAM,OAAS,MAC5BA,GAAa,MAAM,WAAa,SAChCA,GAAa,MAAM,MAAQ,OAE3B,MAAMC,GAAa,SAAS,cAAc,UAAU,EACpDA,GAAW,UAAY,qBACvBA,GAAW,IAAM,EACjBA,GAAW,MAAQ,EACnBA,GAAW,QAAQ,OAAS,mBAE5B,MAAMC,EAActH,EAAU,IAAI,EAClCsH,EAAY,QAAQ,OAAS,sBAC7BF,GAAa,YAAYC,EAAU,EACnCD,GAAa,YAAYE,CAAW,EAGpC3tB,GAAS,MAAM,WAAa,SAC5BA,GAAS,MAAM,UAAY,MAC3BA,GAAS,MAAM,SAAW,OAC1BA,GAAS,MAAM,WAAa,MAC5BA,GAAS,MAAM,WAAa,SAC5BA,GAAS,MAAM,SAAW,SAC1BA,GAAS,MAAM,aAAe,WAC9BA,GAAS,MAAM,SAAW,OAC1BA,GAAS,MAAM,SAAW,IAC1BytB,GAAa,YAAYztB,EAAQ,EAEjC,KAAM,CAAE,IAAK4tB,EAAA,EAAgB9+C,EAAiB,CAC5C,MAAO,WACP,KAAM,sCACN,SAAU2+C,EAAA,CACX,EACDb,GAAO,YAAYgB,EAAW,EAG9BhB,GAAO,YAAYS,EAAW,EAC9BA,GAAY,MAAM,aAAe,MAGjC,MAAM9vC,GAAW,SAAS,cAAc,KAAK,EAEvCswC,GAAUhI,EAAsB,CACpC,MAAO,OACP,KAAM,yBACN,WAAYkH,GACZ,MAAO,CAAE,IAAK,EAAG,IAAK,GAAA,EACtB,KAAM,CAAA,CACP,EACDxvC,GAAS,YAAYswC,GAAQ,GAAG,EAEhC,MAAMC,GAAYjI,EAAsB,CACtC,MAAO,aACP,KAAM,+BACN,WAAYmH,GACZ,MAAO,CAAE,IAAK,EAAG,IAAK,GAAA,EACtB,KAAM,CAAA,CACP,EACDzvC,GAAS,YAAYuwC,GAAU,GAAG,EAElC,MAAMC,GAAYlI,EAAsB,CACtC,MAAO,aACP,KAAM,8BACN,WAAYoH,GACZ,MAAO,CAAE,IAAK,EAAG,IAAK,EAAA,EACtB,KAAM,CAAA,CACP,EACD1vC,GAAS,YAAYwwC,GAAU,GAAG,EAElCxwC,GAAS,YAAYzO,EAAiB,CACpC,MAAO,cACP,KAAM,0CACN,SAAUo+C,EAAA,CACX,EAAE,GAAG,EAEN,MAAMc,GAAe,SAAS,cAAc,OAAO,EACnDA,GAAa,KAAO,SACpBA,GAAa,UAAY,mBACzBA,GAAa,MAAQ,OAAOzlK,GAAS,QAAQ,SAAW,CAAC,EACzDylK,GAAa,QAAQ,OAAS,kBAE9B,MAAMC,GAAiB,SAAS,cAAc,OAAO,EACrDA,GAAe,KAAO,SACtBA,GAAe,UAAY,mBAC3BA,GAAe,MAAQ,OAAO1lK,GAAS,QAAQ,WAAa,EAAE,EAC9D0lK,GAAe,QAAQ,OAAS,oBAEhC,MAAMC,GAAmB,SAAS,cAAc,OAAO,EACvDA,GAAiB,KAAO,SACxBA,GAAiB,UAAY,mBAC7BA,GAAiB,MAAQ,OAAO3lK,GAAS,QAAQ,aAAe,GAAK,EACrE2lK,GAAiB,QAAQ,OAAS,sBAElC3wC,GAAS,YAAYsoC,EAAsB,CAAE,MAAO,aAAc,KAAM,8BAA+B,WAAYmI,GAAc,MAAO,CAAE,IAAK,EAAG,IAAK,GAAA,EAAO,KAAM,EAAG,EAAE,GAAG,EAC5KzwC,GAAS,YAAYsoC,EAAsB,CAAE,MAAO,eAAgB,KAAM,wDAAyD,WAAYoI,GAAgB,MAAO,CAAE,IAAK,EAAG,IAAK,GAAA,EAAO,KAAM,EAAG,SAAU,EAAG,SAAU,KAAM,WAAY,EAAA,CAAO,EAAE,GAAG,EAC1P1wC,GAAS,YAAYsoC,EAAsB,CAAE,MAAO,eAAgB,KAAM,wBAAyB,WAAYqI,GAAkB,MAAO,CAAE,IAAK,IAAK,IAAK,GAAA,EAAW,KAAM,IAAK,EAAE,GAAG,EAEpL,MAAMC,GAAmB,IAAI9sD,GAC7B8sD,GAAiB,IAAI,CAAE,GAAI,0BAA2B,MAAO,WAAY,UAAW,GAAM,UAAW,GAAO,QAAS5wC,EAAA,CAAU,EAC/H4wC,GAAiB,QAAQ,MAAM,UAAY,MAG3C,MAAMnpH,GAAY,SAAS,cAAc,KAAK,EAExCopH,GAAwB,SAAS,cAAc,QAAQ,EAC7DA,GAAsB,UAAY,mBAClCA,GAAsB,QAAQ,OAAS,2BACvC,MAAMC,GAAuB3H,EAAyBn+J,GAAS,WAAW,QAAU,cAAc,EAClG,UAAWotB,IAAS,CAClB,CAAE,MAAO,eAAgB,MAAO,oBAAA,EAChC,CAAE,MAAO,UAAW,MAAO,0BAAA,EAC3B,CAAE,MAAO,WAAY,MAAO,0BAAA,EAC5B,CAAE,MAAO,UAAW,MAAO,yBAAA,CAA0B,EACpD,CACD,MAAM27F,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQ37F,EAAM,MAClB27F,GAAI,YAAc37F,EAAM,MACxBy4I,GAAsB,YAAY98C,EAAG,CACvC,CACA88C,GAAsB,MAAQC,GAE9B,MAAMC,GAAyB,SAAS,cAAc,OAAO,EAC7DA,GAAuB,KAAO,SAC9BA,GAAuB,UAAY,mBACnCA,GAAuB,MAAQ,OAAO/lK,GAAS,WAAW,UAAY,EAAE,EACxE+lK,GAAuB,QAAQ,OAAS,6BAExC,MAAMC,GAAsB,SAAS,cAAc,OAAO,EAC1DA,GAAoB,KAAO,SAC3BA,GAAoB,UAAY,mBAChCA,GAAoB,MAAQ,OAAOhmK,GAAS,WAAW,OAAS,CAAC,EACjEgmK,GAAoB,QAAQ,OAAS,0BAErC,MAAMC,GAA2B,SAAS,cAAc,OAAO,EAC/DA,GAAyB,KAAO,OAChCA,GAAyB,UAAY,iBACrCA,GAAyB,YAAc,gBACvCA,GAAyB,MAAQ,OAAOjmK,GAAS,WAAW,8BAAgC,eAAe,EAC3GimK,GAAyB,QAAQ,OAAS,+BAE1C,MAAMC,GAA8B,SAAS,cAAc,OAAO,EAClEA,GAA4B,KAAO,OACnCA,GAA4B,UAAY,iBACxCA,GAA4B,YAAc,mBAC1CA,GAA4B,MAAQ,OAAOlmK,GAAS,WAAW,iCAAmC,EAAE,EACpGkmK,GAA4B,QAAQ,OAAS,kCAE7C,MAAMC,GAA8B7xD,GAAoB,CACtD,QAAS,GACPt0G,GAAS,WAAW,wBACjBA,GAAS,WAAW,yBACpBA,GAAS,WAAW,iCAEzB,QAAS,KACT,SAAU,MACV,UAAW,2BAAA,CACZ,EACDmmK,GAA4B,QAAQ,OAAS,+BAE7C,MAAMC,GAAgC,SAAS,cAAc,QAAQ,EACrEA,GAA8B,UAAY,mBAC1CA,GAA8B,QAAQ,OAAS,mCAC/C,UAAWh5I,IAAS,CAClB,CAAE,MAAO,SAAU,MAAO,gBAAA,EAC1B,CAAE,MAAO,SAAU,MAAO,eAAA,CAAgB,EACzC,CACD,MAAM27F,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQ37F,EAAM,MAClB27F,GAAI,YAAc37F,EAAM,MACxBg5I,GAA8B,YAAYr9C,EAAG,CAC/C,CACA,MAAMs9C,GAAwB,OAAOrmK,GAAS,WAAW,yBAA2B,QAAQ,EAAE,KAAA,EAAO,YAAA,EACrGomK,GAA8B,MAAQC,KAA0B,SAAW,SAAW,SAEtF,MAAMC,GAAgC,SAAS,cAAc,OAAO,EACpEA,GAA8B,KAAO,SACrCA,GAA8B,UAAY,mBAC1CA,GAA8B,IAAM,IACpCA,GAA8B,IAAM,KACpCA,GAA8B,KAAO,IACrCA,GAA8B,MAAQ,OAAOtmK,GAAS,WAAW,gCAAkC,CAAC,EACpGsmK,GAA8B,QAAQ,OAAS,oCAE/C,MAAMC,GAAsB,SAAS,cAAc,QAAQ,EAC3DA,GAAoB,KAAO,SAC3BA,GAAoB,UAAY,mBAChCA,GAAoB,YAAc,YAClCA,GAAoB,MAAQ,2BAC5BA,GAAoB,QAAQ,UAAY,2BACxCA,GAAoB,QAAQ,OAAS,yBAErC,MAAMC,GAAoB,SAAS,cAAc,KAAK,EACtDA,GAAkB,UAAY,wBAC9BA,GAAkB,QAAQ,OAAS,2BACnCA,GAAkB,YAAc,GAEhC,KAAM,CAAE,IAAKC,EAAA,EAAuBlgD,EAAiB,CACnD,MAAO,SACP,KAAM,yCACN,SAAUs/C,EAAA,CACX,EACDppH,GAAU,YAAYgqH,EAAkB,EAExC,MAAMC,GAAuBpJ,EAAsB,CACjD,MAAO,YACP,KAAM,sCACN,WAAYyI,GACZ,MAAO,CAAE,IAAK,EAAG,IAAK,GAAA,EACtB,KAAM,CAAA,CACP,EACDtpH,GAAU,YAAYiqH,GAAqB,GAAG,EAE9C,MAAMC,GAAoBrJ,EAAsB,CAC9C,MAAO,QACP,KAAM,+DACN,WAAY0I,GACZ,MAAO,CAAE,IAAK,EAAG,IAAK,EAAA,EACtB,KAAM,CAAA,CACP,EACDvpH,GAAU,YAAYkqH,GAAkB,GAAG,EAE3C,MAAMC,GAAiB,SAAS,cAAc,KAAK,EACnDA,GAAe,UAAY,kBAC3B,MAAMC,GAA0B/I,EAAU,GAAG,EAC7C+I,GAAwB,QAAQ,OAAS,8BACzC,MAAMC,GAA8BhJ,EAAU,GAAG,EACjDgJ,GAA4B,QAAQ,OAAS,kCAC7C,MAAMC,GAAwBjJ,EAAU,GAAG,EAC3CiJ,GAAsB,QAAQ,OAAS,4BAEvCH,GAAe,YAAY7I,EAAW,cAAe8I,EAAuB,EAAE,IAAI,EAClFD,GAAe,YAAY7I,EAAW,QAAS+I,EAA2B,EAAE,IAAI,EAChFF,GAAe,YAAY7I,EAAW,UAAWgJ,EAAqB,EAAE,IAAI,EAC5EH,GAAe,MAAM,UAAY,MAEjC,MAAMI,GAAwB,SAAS,cAAc,KAAK,EAC1DA,GAAsB,MAAM,QAAU,OACtCA,GAAsB,MAAM,oBAAsB,sBAClDA,GAAsB,MAAM,UAAY,MACxCA,GAAsB,MAAM,OAAS,MACrCA,GAAsB,MAAM,WAAa,SACzCA,GAAsB,MAAM,MAAQ,OAEpC,MAAMC,GAAsB,SAAS,cAAc,UAAU,EAC7DA,GAAoB,UAAY,qBAChCA,GAAoB,IAAM,EAC1BA,GAAoB,MAAQ,EAC5BA,GAAoB,QAAQ,OAAS,6BAErC,MAAMC,GAAuBpJ,EAAU,IAAI,EAC3CoJ,GAAqB,QAAQ,OAAS,gCACtCF,GAAsB,YAAYC,EAAmB,EACrDD,GAAsB,YAAYE,EAAoB,EAEtDV,GAAkB,MAAM,WAAa,SACrCA,GAAkB,MAAM,UAAY,MACpCA,GAAkB,MAAM,SAAW,OACnCA,GAAkB,MAAM,WAAa,MACrCA,GAAkB,MAAM,WAAa,SACrCA,GAAkB,MAAM,SAAW,SACnCA,GAAkB,MAAM,aAAe,WACvCA,GAAkB,MAAM,SAAW,OACnCA,GAAkB,MAAM,SAAW,IACnCQ,GAAsB,YAAYR,EAAiB,EAEnD,KAAM,CAAE,IAAKW,EAAA,EAAyB5gD,EAAiB,CACrD,MAAO,WACP,KAAM,sDACN,SAAUygD,EAAA,CACX,EACDvqH,GAAU,YAAY0qH,EAAoB,EAE1C1qH,GAAU,YAAYmqH,EAAc,EACpCA,GAAe,MAAM,aAAe,MAEpC,MAAMQ,GAAoB,SAAS,cAAc,KAAK,EACtDA,GAAkB,YAAY7gD,EAAiB,CAC7C,MAAO,cACP,KAAM,yDACN,SAAU0/C,EAAA,CACX,EAAE,GAAG,EACNmB,GAAkB,YAAY7gD,EAAiB,CAC7C,MAAO,cACP,KAAM,2EACN,SAAU4/C,EAAA,CACX,EAAE,GAAG,EACNiB,GAAkB,YAAY7gD,EAAiB,CAC7C,MAAO,gBACP,KAAM,2DACN,SAAU2/C,EAAA,CACX,EAAE,GAAG,EACNkB,GAAkB,YAAY7gD,EAAiB,CAC7C,MAAO,kBACP,KAAM,4EACN,SAAU6/C,EAAA,CACX,EAAE,GAAG,EAEN,MAAMiB,GAAwB/J,EAAsB,CAClD,MAAO,mBACP,KAAM,8CACN,WAAYgJ,GACZ,MAAO,CAAE,IAAK,EAAG,IAAK,EAAA,EACtB,KAAM,CAAA,CACP,EACDc,GAAkB,YAAYC,GAAsB,GAAG,EAEvD,MAAMC,GAAwB,SAAS,cAAc,OAAO,EAC5DA,GAAsB,KAAO,SAC7BA,GAAsB,UAAY,mBAClCA,GAAsB,MAAQ,OAAOtnK,GAAS,WAAW,QAAQ,SAAWA,GAAS,QAAQ,SAAW,CAAC,EACzGsnK,GAAsB,QAAQ,OAAS,4BAEvC,MAAMC,GAA0B,SAAS,cAAc,OAAO,EAC9DA,GAAwB,KAAO,SAC/BA,GAAwB,UAAY,mBACpCA,GAAwB,MAAQ,OAAOvnK,GAAS,WAAW,QAAQ,WAAaA,GAAS,QAAQ,WAAa,EAAE,EAChHunK,GAAwB,QAAQ,OAAS,8BAEzC,MAAMC,GAA4B,SAAS,cAAc,OAAO,EAChEA,GAA0B,KAAO,SACjCA,GAA0B,UAAY,mBACtCA,GAA0B,MAAQ,OAAOxnK,GAAS,WAAW,QAAQ,aAAeA,GAAS,QAAQ,aAAe,GAAG,EACvHwnK,GAA0B,QAAQ,OAAS,gCAE3CJ,GAAkB,YAAY9J,EAAsB,CAAE,MAAO,aAAc,KAAM,6BAA8B,WAAYgK,GAAuB,MAAO,CAAE,IAAK,EAAG,IAAK,GAAA,EAAO,KAAM,EAAG,EAAE,GAAG,EAC7LF,GAAkB,YAAY9J,EAAsB,CAAE,MAAO,eAAgB,KAAM,wDAAyD,WAAYiK,GAAyB,MAAO,CAAE,IAAK,EAAG,IAAK,GAAA,EAAO,KAAM,EAAG,SAAU,EAAG,SAAU,KAAM,WAAY,EAAA,CAAO,EAAE,GAAG,EAC5QH,GAAkB,YAAY9J,EAAsB,CAAE,MAAO,eAAgB,KAAM,mCAAoC,WAAYkK,GAA2B,MAAO,CAAE,IAAK,EAAG,IAAK,GAAA,EAAU,KAAM,EAAG,EAAE,GAAG,EAE5M,MAAMC,GAAsB,IAAI3uD,GAChC2uD,GAAoB,IAAI,CAAE,GAAI,6BAA8B,MAAO,WAAY,UAAW,GAAM,UAAW,GAAO,QAASL,EAAA,CAAmB,EAC9IK,GAAoB,QAAQ,MAAM,UAAY,MAG9C,IAAIC,GAAgB,GAChBC,GAAwB,KACxBC,GAAmB,GACnBC,GAA2B,KAC3BC,GAAgB,GAChBC,GAAkB,GAClBC,GAAoB,GACpBC,GAAqB,GACrBC,GAAqB,GACrBC,GAA6B,KAC7BC,GAA6B,KAC7BC,GAAe,KAEnB,MAAMC,GAAwB,CAAC1tD,EAAW9vG,KAAU,CAClDu9J,IAAc,YAAYztD,EAAW9vG,EAAK,CAC5C,EACMy9J,GAA2B,IAAM,CACrC,UAAW/2J,IAAM,CACf,iBACA,mBACA,qBACA,gBACA,sBACA,iBACA,mBAAA,EAEA82J,GAAsB92J,EAAI,MAAM,CAEpC,EAEMg3J,GAAmBzjF,GAAS,CAChC,MAAM3lF,GAAQ2lF,GAAQ,GACtB06E,EAAe,YAAcrgK,GAC7BqgK,EAAe,MAAQrgK,EACzB,EAEMqpK,GAAoBC,GAAgB,CACxCZ,GAAgB,EAAQY,EACxB1K,EAAYwB,EAAkBsI,EAAa,EAC3C9J,EAAYsB,EAAuBwI,EAAa,EAChD9J,EAAYuB,EAAoBuI,EAAa,CAC/C,EAEMa,GAAqB5jF,GAAS,CAClC,MAAM3lF,GAAQ2lF,GAAQ,GACtBs7E,EAAiB,YAAcjhK,GAC/BihK,EAAiB,MAAQjhK,EAC3B,EAEMwpK,GAAsBF,GAAgB,CAC1CX,GAAkB,EAAQW,EAC1B1K,EAAYoC,GAAoB2H,EAAe,EAC/C/J,EAAYgC,GAAyB+H,EAAe,EACpD/J,EAAYiC,GAAuB8H,EAAe,EAClD/J,EAAYkC,GAAsB6H,EAAe,EACjD/J,EAAYmC,EAAsB4H,EAAe,CACnD,EAEMc,GAAuB9jF,GAAS,CACpC,MAAM3lF,GAAQ2lF,GAAQ,GACtBm8E,GAAmB,YAAc9hK,GACjC8hK,GAAmB,MAAQ9hK,EAC7B,EAEM0pK,GAAwBJ,GAAgB,CAC5CV,GAAoB,EAAQU,EAC5B1K,EAAYiD,GAAsB+G,EAAiB,EACnDhK,EAAY8C,GAAyBkH,EAAiB,EACtDhK,EAAY6C,GAA2BmH,EAAiB,EACxDhK,EAAY+C,GAAwBiH,IAAqBlH,GAAwB,QAAU,YAAY,EACvG9C,EAAYgD,GAAwBgH,EAAiB,CACvD,EAEMe,GAAwBhkF,GAAS,CACrC,MAAM3lF,GAAQ2lF,GAAQ,GACtBi9E,EAAoB,YAAc5iK,GAClC4iK,EAAoB,MAAQ5iK,EAC9B,EAEM4pK,GAAyB,CAACv/J,EAASwmB,KAAU,CACjD,GAAI,CAAC,OAAO,SAASA,EAAK,GAAKA,IAAS,GAAK,CAAC,OAAO,SAASxmB,CAAO,GAAKA,EAAU,EAAG,CACrF24J,GAAsB,gBAAgB,OAAO,EAC7CC,GAAuB,YAAc,IACrC,MACF,CACA,MAAM5wD,GAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGhoG,EAAUwmB,EAAK,CAAC,EACpDmyI,GAAsB,MAAQ3wD,GAC9B4wD,GAAuB,YAAc,GAAG,KAAK,MAAM5wD,GAAM,GAAG,CAAC,GAC/D,EAEMw3D,GAAyBP,GAAgB,CAC7CT,GAAqB,EAAQS,EAC7BzK,EAA6B8D,EAAuBkG,EAAkB,EACtEjK,EAAY0D,GAA4BuG,EAAkB,EAC1DjK,EAAY2D,EAAyBsG,EAAkB,EACvDjK,EAAY4D,GAA+BqG,EAAkB,EAC7DjK,EAAYiE,GAA4B,OAAQgG,EAAkB,EAClEjK,EAAY6D,EAA2BoG,EAAkB,EACzDjK,EAAYkE,GAAwB,OAAQ+F,EAAkB,EAC9DjK,EAAY8D,EAAyBmG,EAAkB,EACvDjK,EAAY4E,GAAiCqF,EAAkB,EAC/DjK,EAAY6E,GAA8B,OAAQoF,EAAkB,EACpEjK,EAAY8E,GAAyBmF,EAAkB,EACvDjK,EAAY+E,GAAoB,OAAQkF,EAAkB,CAC5D,EAEMiB,GAAwBnkF,GAAS,CACrC,MAAM3lF,GAAQ2lF,GAAQ,GACtBu+E,GAAoB,YAAclkK,GAClCkkK,GAAoB,MAAQlkK,EAC9B,EAEM+pK,GAAyB,CAAC1/J,EAASwmB,KAAU,CACjD,GAAI,CAAC,OAAO,SAASA,EAAK,GAAKA,IAAS,GAAK,CAAC,OAAO,SAASxmB,CAAO,GAAKA,EAAU,EAAG,CACrF+5J,GAAsB,gBAAgB,OAAO,EAC7CC,EAAuB,YAAc,IACrC,MACF,CACA,MAAMhyD,GAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGhoG,EAAUwmB,EAAK,CAAC,EACpDuzI,GAAsB,MAAQ/xD,GAC9BgyD,EAAuB,YAAc,GAAG,KAAK,MAAMhyD,GAAM,GAAG,CAAC,GAC/D,EAEM23D,EAAyBV,GAAgB,CAC7CR,GAAqB,EAAQQ,EAC7BzK,EAA6BoF,GAAuB6E,EAAkB,EACtElK,EAAYkF,GAAyBgF,EAAkB,EACvDlK,EAAYmF,GAA8B+E,EAAkB,EAC5DlK,EAAYoF,GAAyB8E,EAAkB,EACvDlK,EAAYgG,GAA6BkE,EAAkB,EAC3DlK,EAAYiG,GAA0B,OAAQiE,EAAkB,EAChElK,EAAYkG,GAAyBgE,EAAkB,EACvDlK,EAAYmG,GAAoB,OAAQ+D,EAAkB,CAC5D,EAEMmB,GAAmBtkF,GAAS,CAChC0yD,GAAS,YAAc1yD,GAAQ,EACjC,EAEMukF,GAAoB,CAAC7/J,EAASwmB,KAAU,CAC5C,GAAI,CAAC,OAAO,SAASA,EAAK,GAAKA,IAAS,GAAK,CAAC,OAAO,SAASxmB,CAAO,GAAKA,EAAU,EAAG,CACrF07J,GAAW,gBAAgB,OAAO,EAClCC,EAAY,YAAc,IAC1B,MACF,CACA,MAAM3zD,GAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGhoG,EAAUwmB,EAAK,CAAC,EACpDk1I,GAAW,MAAQ1zD,GACnB2zD,EAAY,YAAc,GAAG,KAAK,MAAM3zD,GAAM,GAAG,CAAC,GACpD,EAEM83D,GAAoBb,GAAgB,CACxChB,GAAgB,EAAQgB,EACxBzK,EAA6B2G,GAAY8C,EAAa,EACtD1J,EAAYsG,GAAcoD,EAAa,EACvC1J,EAAYuG,GAAiBmD,EAAa,EAC1C1J,EAAY6G,GAAc,OAAQ6C,EAAa,EAC/C1J,EAAYwG,GAAWkD,EAAa,EACpC1J,EAAYsH,GAAQ,OAAQoC,EAAa,EACzC1J,EAAYyG,GAAgBiD,EAAa,EACzC1J,EAAYuH,GAAU,OAAQmC,EAAa,EAC3C1J,EAAY0G,GAAgBgD,EAAa,EACzC1J,EAAYwH,GAAU,OAAQkC,EAAa,EAC3C1J,EAAY2G,GAAmB+C,EAAa,EAC5C1J,EAAYyH,GAAciC,EAAa,EACvC1J,EAAY0H,GAAgBgC,EAAa,EACzC1J,EAAY2H,GAAkB+B,EAAa,CAC7C,EAEM8B,GAAsBzkF,GAAS,CACnCyhF,GAAkB,YAAczhF,GAAQ,EAC1C,EAEM0kF,GAAuB,CAAChgK,EAASwmB,KAAU,CAC/C,GAAI,CAAC,OAAO,SAASA,EAAK,GAAKA,IAAS,GAAK,CAAC,OAAO,SAASxmB,CAAO,GAAKA,EAAU,EAAG,CACrFw9J,GAAoB,gBAAgB,OAAO,EAC3CC,GAAqB,YAAc,IACnC,MACF,CACA,MAAMz1D,GAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGhoG,EAAUwmB,EAAK,CAAC,EACpDg3I,GAAoB,MAAQx1D,GAC5By1D,GAAqB,YAAc,GAAG,KAAK,MAAMz1D,GAAM,GAAG,CAAC,GAC7D,EAEMi4D,GAAuBhB,GAAgB,CAC3Cd,GAAmB,EAAQc,EAC3BzK,EAA6BsI,GAAqBqB,EAAgB,EAClE5J,EAAY6H,GAAuB+B,EAAgB,EACnD5J,EAAY+H,GAAwB6B,EAAgB,EACpD5J,EAAY0I,GAAqB,OAAQkB,EAAgB,EACzD5J,EAAYgI,GAAqB4B,EAAgB,EACjD5J,EAAY2I,GAAkB,OAAQiB,EAAgB,EACtD5J,EAAYiI,GAA0B2B,EAAgB,EACtD5J,EAAYmI,GAA6ByB,EAAgB,EACzD5J,EAAYkI,GAA6B0B,IAAoB,CAACzB,GAA4B,OAAO,EACjGnI,EAAYoI,GAA+BwB,IAAoB,CAACzB,GAA4B,OAAO,EACnGnI,EAAYsI,GAA+BsB,IAAoB,CAACzB,GAA4B,SAAWC,GAA8B,QAAU,QAAQ,EACvJpI,EAAYqJ,GAAsB,OAAQO,IAAoB,CAACzB,GAA4B,SAAWC,GAA8B,QAAU,QAAQ,EACtJpI,EAAYsJ,GAAuBM,EAAgB,EACnD5J,EAAYuJ,GAAyBK,EAAgB,EACrD5J,EAAYwJ,GAA2BI,EAAgB,CACzD,EAEM+B,GAA8B,IAAM,CACxC,MAAMtL,EAASF,EAAyB0H,GAAsB,KAAK,EAC7D+D,GAAiBxL,EAA2BC,CAAM,EACxD2H,GAAoB,IAAM,OAAO4D,EAAc,EAC/CjD,GAAkB,OAAO,IAAM,OAAOiD,EAAc,EACpD,MAAMC,GAAe,KAAK,IAAI,EAAG,OAAO7D,GAAoB,KAAK,GAAK,CAAC,EACnE6D,GAAeD,GACjBjD,GAAkB,MAAMiD,EAAc,EAEtCjD,GAAkB,MAAMkD,EAAY,CAExC,EAEMC,GAAwC,IAAM,CAClD,MAAMC,EAAa,EAAQ5D,GAA4B,QACjD6D,GAAiBD,GAAc3D,GAA8B,QAAU,SAC7EpI,EAAYkI,GAA6B0B,IAAoB,CAACmC,CAAU,EACxE/L,EAAYoI,GAA+BwB,IAAoB,CAACmC,CAAU,EAC1E/L,EAAYsI,GAA+BsB,IAAoB,CAACoC,EAAc,EAC9EhM,EAAYqJ,GAAsB,OAAQO,IAAoB,CAACoC,EAAc,CAC/E,EAEAnE,GAAsB,iBAAiB,SAAU8D,EAA2B,EAC5EzD,GAA4B,iBAAiB,QAAS4D,EAAqC,EAC3F3D,GAA4B,iBAAiB,SAAU2D,EAAqC,EAC5F1D,GAA8B,iBAAiB,SAAU0D,EAAqC,EAE9F,MAAMG,GAAkC,IAAM,CAC5CjM,EAAY+C,GAAwBiH,IAAqBlH,GAAwB,QAAU,YAAY,CACzG,EAEAA,GAAwB,iBAAiB,SAAUmJ,EAA+B,EAElF,MAAMC,OAA6B,IAC7BC,GAA2B,IAAM,CACrC,MAAM7jK,EAAU8/G,EAAA,EACVpmG,GAAQ1Z,GAAW,OAAOA,EAAQ,uBAA0B,YAC7DA,EAAQ,sBAAA,GAA2B,CAAA,GAAI,OAAQ3E,IAASuhH,GAAsBvhH,EAAI,CAAC,EACpF,CAAA,EACEyoK,GAAe,CAAA,EACrB,GAAI9jK,GAAW,OAAOA,EAAQ,sBAAyB,WACrD,UAAW3E,MAAQqe,GACjB,GAAI,CACF,MAAMo1D,GAAO9uE,EAAQ,qBAAqB3E,EAAI,EAC1CyzE,IAAQ6pF,EAAwB7pF,GAAK,IAAI,GAAGg1F,GAAa,KAAKzoK,EAAI,CACxE,OAASsC,GAAO,CACTimK,GAAuB,IAAIvoK,EAAI,IAClCuoK,GAAuB,IAAIvoK,EAAI,EAC/B,QAAQ,KAAK,gDAAgDA,EAAI,oCAAqCsC,EAAK,EAE/G,CAGJ,MAAMomK,GAAqBD,GAAa,SAAS,QAAQ,EACrD,SACCA,GAAa,CAAC,GAAK,GACxB,UAAWn0D,MAAUmpD,EAAmB,CACtC,MAAM1hH,GAAWu4D,GAAO,MAClBqnC,GAAYrnC,GAAO,QAAQ,cAAgB,GAC3Cq0D,GAAer0D,GAAO,QAAQ,eAAiB,OACrDA,GAAO,YAAc,GACrB,MAAMs0D,GAAU,SAAS,cAAc,QAAQ,EAC/CA,GAAQ,MAAQ,GAChBA,GAAQ,YAAc,OACtBt0D,GAAO,YAAYs0D,EAAO,EAC1B,UAAW5oK,MAAQqe,GAAO,CACxB,MAAM+oG,GAAM,SAAS,cAAc,QAAQ,EAC3CA,GAAI,MAAQpnH,GACZonH,GAAI,YAAcpnH,GAClBs0G,GAAO,YAAY8S,EAAG,CACxB,CACA,MAAMyhD,GAAkB,IAAI,IAAI,MAAM,KAAKv0D,GAAO,QAAU3/E,IAAMA,GAAE,KAAK,CAAC,EACtEg0I,IAAgBE,GAAgB,IAAI9sH,EAAQ,GAErCA,IAAY8sH,GAAgB,IAAI9sH,EAAQ,EADjDu4D,GAAO,MAAQv4D,GAGN4/F,IAAaktB,GAAgB,IAAIltB,EAAS,EACnDrnC,GAAO,MAAQqnC,GACNrnC,KAAWiqD,IAAwBmK,IAAsB,CAACC,IAAgBE,GAAgB,IAAIH,EAAkB,EACzHp0D,GAAO,MAAQo0D,GAEfp0D,GAAO,MAAQ,EAEnB,CACF,EAEMw0D,GAAa,IAAM,CACvBN,GAAA,EACAF,GAAA,EACAN,GAAA,EACAG,GAAA,CACF,EAEMY,GAAkB,IAAM,CACvB/C,IACLA,GAAsB,MAAA,CACxB,EAEMgD,GAAqB,IAAM,CAC1B9C,IACLA,GAAyB,MAAA,CAC3B,EAEM+C,GAAuB,IAAM,CAC5BzC,IACLA,GAA2B,MAAA,CAC7B,EAEM0C,GAAuB,IAAM,CAC5BzC,IACLA,GAA2B,MAAA,CAC7B,EAEM0C,GAAY,IAAM,CACtB,MAAMxkK,EAAU8/G,EAAA,EAChB,GAAI,CAAC9/G,GAAW,OAAOA,EAAQ,eAAkB,WAAY,CAC3DkiK,GAAgB,qDAAqD,EACrEF,GAAsB,iBAAkB,OAAO,EAC/C,MACF,CACA,MAAMnzH,GAAY2pH,EAA2BQ,EAAsB,KAAK,EAClEyL,GAAmBxL,EAAmB,MAAM,KAAA,EAElDiJ,GAAgB,UAAU,EAC1BF,GAAsB,iBAAkB,SAAS,EACjD3I,EAAe,YAAc,IAC7BC,EAAgB,YAAc,IAC9BC,EAAmB,YAAc,IACjC4I,GAAiB,EAAI,EAErB,MAAMuC,GAAW,OAAO,YAAgB,KAAe,YAAY,IAAO,YAAY,IAAA,EAAQ,KAAK,IAAA,EACnG,GAAI,CACF,MAAMtmK,GAAS4B,EAAQ,cAAc,CACnC,UAAA6uC,GACA,iBAAkB41H,IAAoB,IAAA,CACvC,EACKE,GAAS,OAAO,YAAgB,KAAe,YAAY,IAAO,YAAY,IAAA,EAAQ,KAAK,IAAA,EAC3F3jG,GAAUi3F,EAAsB75J,IAAQ,QAAUA,IAAQ,YAAY,EACtEgC,GAAQ,EAAQqkK,GACtBpL,EAAe,YAAcnxE,EAAalnB,GAAQ,IAAK,CAAC,EACxDs4F,EAAgB,YAAcpxE,EAAalnB,GAAQ,KAAM,CAAC,EAC1Du4F,EAAmB,YAAc,GAAG,KAAK,MAAM,KAAK,IAAI,EAAGoL,GAAQD,EAAO,CAAC,CAAC,MAC5ExC,GAAgB9hK,GAAQ,iBAAiBqkK,EAAgB,IAAM,MAAM,EACrEzC,GAAsB,iBAAkB,SAAS,EAC7C5hK,IAAO83J,EAAsB,SAAUuM,EAAgB,EAC3DN,GAAA,EACA,KAAK,QAAQ,gBAAA,CACf,OAASxmK,GAAO,CACdukK,GAAgBvkK,IAAO,SAAW,OAAOA,EAAK,CAAC,EAC/CqkK,GAAsB,iBAAkB,OAAO,CACjD,QAAA,CACEG,GAAiB,EAAK,CACxB,CACF,EAEMyC,GAAc,IAAM,CACxB,MAAM5kK,EAAU8/G,EAAA,EAChB,GAAI,CAAC9/G,GAAW,OAAOA,EAAQ,iBAAoB,WAAY,CAC7DqiK,GAAkB,uDAAuD,EACzEL,GAAsB,mBAAoB,OAAO,EACjD,MACF,CACA,MAAMnzH,GAAY2pH,EAA2BkB,GAAwB,KAAK,EACpEmL,GAAUpM,EAAyBkB,GAAsB,KAAK,EAC9DnrJ,GAAsBorJ,GAAqB,MAAQ,OAAOA,GAAqB,KAAK,EAAI,KACxF6K,GAAmB5K,EAAqB,MAAM,KAAA,EAEpDwI,GAAkB,UAAU,EAC5BL,GAAsB,mBAAoB,SAAS,EACnD/H,GAAiB,YAAc,IAC/BC,GAAkB,YAAc,IAChCC,GAAqB,YAAc,IACnCmI,GAAmB,EAAI,EAEvB,MAAMoC,GAAW,OAAO,YAAgB,KAAe,YAAY,IAAO,YAAY,IAAA,EAAQ,KAAK,IAAA,EACnG,GAAI,CACF,MAAMtmK,GAAS4B,EAAQ,gBAAgB,CACrC,UAAA6uC,GACA,QAAAg2H,GACA,oBAAAr2J,GACA,iBAAkBi2J,IAAoB,IAAA,CACvC,EACKE,GAAS,OAAO,YAAgB,KAAe,YAAY,IAAO,YAAY,IAAA,EAAQ,KAAK,IAAA,EAC3F3jG,GAAUi3F,EAAsB75J,IAAQ,QAAUA,IAAQ,YAAY,EACtEgC,GAAQ,EAAQqkK,GACtBxK,GAAiB,YAAc/xE,EAAalnB,GAAQ,IAAK,CAAC,EAC1Dk5F,GAAkB,YAAchyE,EAAalnB,GAAQ,KAAM,CAAC,EAC5Dm5F,GAAqB,YAAc,GAAG,KAAK,MAAM,KAAK,IAAI,EAAGwK,GAAQD,EAAO,CAAC,CAAC,MAC9ErC,GAAkBjiK,GAAQ,iBAAiBqkK,EAAgB,IAAM,MAAM,EACvEzC,GAAsB,mBAAoB,SAAS,EAC/C5hK,IAAO83J,EAAsB,WAAYuM,EAAgB,EAC7DN,GAAA,EACA,KAAK,QAAQ,gBAAA,CACf,OAASxmK,GAAO,CACd0kK,GAAkB1kK,IAAO,SAAW,OAAOA,EAAK,CAAC,EACjDqkK,GAAsB,mBAAoB,OAAO,CACnD,QAAA,CACEM,GAAmB,EAAK,CAC1B,CACF,EAEMwC,GAAgB,IAAM,CAC1B,MAAM9kK,EAAU8/G,EAAA,EAChB,GAAI,CAAC9/G,GAAW,OAAOA,EAAQ,mCAAsC,WAAY,CAC/EuiK,GAAoB,+DAA+D,EACnFP,GAAsB,qBAAsB,OAAO,EACnD,MACF,CACA,MAAMnzH,GAAY2pH,EAA2B+B,GAA0B,KAAK,EACtEv9H,GAAU07H,EAA2B8B,GAAwB,KAAK,EAClEhsJ,GAAsBisJ,GAAuB,MAAQ,OAAOA,GAAuB,KAAK,EAAI,KAClG,GAAIz9H,KAAY,cAAgB,CAACxuB,GAAqB,CACpD+zJ,GAAoB,uDAAuD,EAC3EP,GAAsB,qBAAsB,OAAO,EACnD,MACF,CACA,MAAMyC,GAAmB/J,GAAuB,MAAM,KAAA,EAEtD6H,GAAoB,UAAU,EAC9BP,GAAsB,qBAAsB,SAAS,EACrDlH,GAAmB,YAAc,IACjCC,GAAoB,YAAc,IAClCC,GAAuB,YAAc,IACrCwH,GAAqB,EAAI,EAEzB,MAAMkC,GAAW,OAAO,YAAgB,KAAe,YAAY,IAAO,YAAY,IAAA,EAAQ,KAAK,IAAA,EACnG,GAAI,CACF,MAAMtmK,GAAS4B,EAAQ,kCAAkC,CACvD,UAAA6uC,GACA,QAAA7R,GACA,oBAAqBA,KAAY,aAAe,KAAOxuB,GACvD,iBAAkBi2J,IAAoB,IAAA,CACvC,EACKE,GAAS,OAAO,YAAgB,KAAe,YAAY,IAAO,YAAY,IAAA,EAAQ,KAAK,IAAA,EAC3F3jG,GAAUi3F,EAAsB75J,IAAQ,QAAUA,IAAQ,YAAY,EACtEgC,GAAQ,EAAQqkK,GACtB3J,GAAmB,YAAc5yE,EAAalnB,GAAQ,IAAK,CAAC,EAC5D+5F,GAAoB,YAAc7yE,EAAalnB,GAAQ,KAAM,CAAC,EAC9Dg6F,GAAuB,YAAc,GAAG,KAAK,MAAM,KAAK,IAAI,EAAG2J,GAAQD,EAAO,CAAC,CAAC,MAChFnC,GAAoBniK,GAAQ,iBAAiBqkK,EAAgB,IAAM,MAAM,EACzEzC,GAAsB,qBAAsB,SAAS,EACjD5hK,IAAO83J,EAAsB,mBAAoBuM,EAAgB,EACrEN,GAAA,EACA,KAAK,QAAQ,gBAAA,CACf,OAASxmK,GAAO,CACd4kK,GAAoB5kK,IAAO,SAAW,OAAOA,EAAK,CAAC,EACnDqkK,GAAsB,qBAAsB,OAAO,CACrD,QAAA,CACEQ,GAAqB,EAAK,CAC5B,CACF,EAEMuC,GAAiB,SAAY,CACjC,MAAM/kK,EAAU8/G,EAAA,EAChB,GAAI,CAAC9/G,GAAW,OAAOA,EAAQ,8BAAiC,WAAY,CAC1EyiK,GAAqB,yDAAyD,EAC9ET,GAAsB,gBAAiB,OAAO,EAC9C,MACF,CAEA,MAAMnzH,GAAY2pH,EAA2B4C,GAA2B,KAAK,EACvE5sJ,GAAsB6sJ,EAAwB,MAAQ,OAAOA,EAAwB,KAAK,EAAI,KAC9F2J,GAAgB,KAAK,IAAI,EAAG,OAAO1J,GAA8B,KAAK,GAAK,CAAC,EAC5E2J,GAAkB,KAAK,IAAI,EAAG,OAAO3I,GAAgC,KAAK,GAAK,CAAC,EAChF4I,GAAU,KAAK,IAAI,EAAG,OAAO1I,GAAwB,KAAK,GAAK,CAAC,EAChE2I,GAAe,OAAO5J,EAA0B,KAAK,EACrDl0I,GAAY,OAAO,SAAS89I,EAAY,GAAKA,GAAe,EAAIA,GAAe,KAC/EV,GAAmBjJ,EAAwB,MAAM,KAAA,EAEvDiH,GAAqB,WAAW,EAChCT,GAAsB,gBAAiB,SAAS,EAChDU,GAAuB,EAAGsC,EAAa,EACvC9I,GAAoB,YAAc,IAClCC,GAA2B,YAAc,IACzCC,GAAwB,YAAc,IACtCuG,GAAsB,EAAI,EAC1Bd,GAA6B,IAAI,gBACjC,MAAMuD,GAASvD,GAA2B,OAEpC6C,GAAW,OAAO,YAAgB,KAAe,YAAY,IAAO,YAAY,IAAA,EAAQ,KAAK,IAAA,EACnG,IAAIW,GAAsB,EACtBC,GAAgB,KAChBC,GAAa,KACjB,GAAI,CACF,KAAOF,GAAsBL,IAAe,CAC1C,GAAII,GAAO,QACT,MAAM,IAAI,MAAM,UAAU,EAE5B,MAAMI,GAAYR,GAAgBK,GAC5BI,GAAiB,KAAK,IAAI,EAAG,KAAK,IAAIR,GAAiBO,EAAS,CAAC,EACvED,GAAavlK,EAAQ,6BAA6B,CAChD,UAAA6uC,GACA,oBAAArgC,GACA,cAAei3J,GACf,UAAAp+I,GACA,cAAei+I,GACf,cAAe,gBACf,iBAAkBb,IAAoB,IAAA,CACvC,EACDa,GAAgBC,IAAY,cAAgBD,GAC5C,MAAMI,GAAW,KAAK,IAAI,EAAG,OAAOH,IAAY,YAAcE,EAAc,CAAC,EAI7E,GAHAJ,GAAsB,KAAK,IAAIL,GAAeK,GAAsBK,EAAQ,EAC5EhD,GAAuB2C,GAAqBL,EAAa,EACzDvC,GAAqB,YAAY4C,EAAmB,IAAIL,EAAa,aAAa,EAC9EO,IAAY,UAAW,MAC3B,MAAMjO,EAAM4N,EAAO,CACrB,CACA,GAAI,CAACI,GACH,MAAM,IAAI,MAAM,2CAA2C,EAE7D,MAAMX,GAAS,OAAO,YAAgB,KAAe,YAAY,IAAO,YAAY,IAAA,EAAQ,KAAK,IAAA,EAC3F3jG,GAAUi3F,EAAsBqN,EAAa,EAC7CllK,GAAQ,EAAQqkK,GAChBkB,GAAYJ,IAAY,UAAY,YAAc,yBAClDK,GAAaP,GACnB3C,GAAuB,EAAG,CAAC,EAC3BxG,GAAoB,YAAch0E,EAAalnB,GAAQ,IAAK,CAAC,EAC7Dm7F,GAA2B,YAAcj0E,EAAa,OAAOq9E,IAAY,YAAc,GAAG,EAAG,CAAC,EAC9FnJ,GAAwB,YAAc,GAAG,KAAK,MAAM,KAAK,IAAI,EAAGuI,GAAQD,EAAO,CAAC,CAAC,MACjF,MAAMmB,GAAWzlK,GAAQ,aAAaqkK,EAAgB,IAAM,GAC5DhC,GAAqB,UAAUkD,EAAS,OAAOC,EAAU,cAAcC,EAAQ,EAAE,EACjF7D,GAAsB,gBAAiB,SAAS,EAC5C5hK,IAAO83J,EAAsB,yBAA0BuM,EAAgB,EAC3EN,GAAA,EACA,KAAK,QAAQ,gBAAA,CACf,OAASxmK,GAAO,CAEd,MAAMmnF,IADUnnF,IAAO,SAAW,OAAOA,EAAK,GACxB,YAAA,EAEtB,GADgBynK,GAAO,SAAWtgF,GAAM,SAAS,SAAS,GAAKA,GAAM,SAAS,UAAU,EAEtF29E,GAAqB,UAAU,EAC/BT,GAAsB,gBAAiB,MAAM,MACxC,CACL,MAAM78J,GAASkzJ,EAAuB,yBAA0B16J,GAAO,CACrE,UAAAkxC,GACA,oBAAArgC,GACA,cAAAw2J,GACA,gBAAAC,GACA,UAAA59I,GACA,oBAAAg+I,EAAA,CACD,EACD5C,GAAqBt9J,EAAM,EAC3B68J,GAAsB,gBAAiB,OAAO,CAChD,CACF,QAAA,CACEH,GAA6B,KAC7Bc,GAAsB,EAAK,CAC7B,CACF,EAEMmD,GAAiB,SAAY,CACjC,MAAM9lK,EAAU8/G,EAAA,EAChB,GAAI,CAAC9/G,GAAW,OAAOA,EAAQ,8BAAiC,WAAY,CAC1E4iK,GAAqB,yDAAyD,EAC9EZ,GAAsB,sBAAuB,OAAO,EACpD,MACF,CACA,MAAMxzJ,GAAsBouJ,GAAwB,MAAQ,OAAOA,GAAwB,KAAK,EAAI,KAC9Fx+H,GAAY,EAAQy+H,GAA6B,QACjD4H,GAAmB3H,GAAwB,MAAM,KAAA,EAEjDiJ,GAAe,KAAK,IAAI,EAAG,OAAO/lK,EAAQ,SAAS,GAAK,CAAC,EAC/D,GAAI,CAAC+lK,GAAc,CACjBnD,GAAqB,4BAA4B,EACjDZ,GAAsB,sBAAuB,OAAO,EACpD1E,GAAoB,YAAc,IAClCC,EAA4B,YAAc,IAC1CC,GAAwB,YAAc,OACtCqF,GAAuB,EAAG,CAAC,EAC3B,MACF,CAEAD,GAAqB,WAAW,EAChCZ,GAAsB,sBAAuB,SAAS,EACtDa,GAAuB,EAAGkD,EAAY,EACtCzI,GAAoB,YAAc,IAClCC,EAA4B,YAAc,IAC1CC,GAAwB,YAAc,IACtCsF,EAAsB,EAAI,EAC1BhB,GAA6B,IAAI,gBACjC,MAAMsD,GAAStD,GAA2B,OAEpC4C,GAAW,OAAO,YAAgB,KAAe,YAAY,IAAO,YAAY,IAAA,EAAQ,KAAK,IAAA,EACnG,IAAIsB,GAAmB,EACvB,GAAI,CACF,GAAIZ,GAAO,QACT,MAAM,IAAI,MAAM,UAAU,EAE5BxC,GAAqB,YAAYmD,EAAY,IAAIA,EAAY,UAAU,EACvE,MAAM3nK,GAAS4B,EAAQ,6BAA6B,CAClD,oBAAAwO,GACA,UAAA4vB,GACA,cAAe,gBACf,iBAAkBqmI,IAAoB,IAAA,CACvC,EACKwB,GAAc7nK,IAAQ,cAAgB,KAG5C,GAFA4nK,GAAmB,KAAK,IAAI,EAAG,OAAO5nK,IAAQ,gBAAgB,GAAK2nK,EAAY,EAC/ElD,GAAuBmD,GAAkBD,EAAY,EACjD,CAACE,GACH,MAAM,IAAI,MAAM,2CAA2C,EAE7D,MAAMtB,GAAS,OAAO,YAAgB,KAAe,YAAY,IAAO,YAAY,IAAA,EAAQ,KAAK,IAAA,EAC3F3jG,GAAUi3F,EAAsBgO,EAAW,EAC3C7lK,GAAQ,EAAQqkK,GACtB5B,GAAuB,EAAG,CAAC,EAC3BvF,GAAoB,YAAcp1E,EAAalnB,GAAQ,IAAK,CAAC,EAC7Du8F,EAA4B,YAAc,OAAOyI,EAAgB,EACjExI,GAAwB,YAAc,GAAG,KAAK,MAAM,KAAK,IAAI,EAAGmH,GAAQD,EAAO,CAAC,CAAC,MACjF,MAAMmB,GAAWzlK,GAAQ,aAAaqkK,EAAgB,IAAM,GAC5D7B,GAAqB,OAAOiD,EAAQ,EAAE,EACtC7D,GAAsB,sBAAuB,SAAS,EAClD5hK,IAAO83J,EAAsB,yBAA0BuM,EAAgB,EAC3EN,GAAA,EACA,KAAK,QAAQ,gBAAA,CACf,OAASxmK,GAAO,CAEd,MAAMmnF,IADUnnF,IAAO,SAAW,OAAOA,EAAK,GACxB,YAAA,EAEtB,GADgBynK,GAAO,SAAWtgF,GAAM,SAAS,SAAS,GAAKA,GAAM,SAAS,UAAU,EAEtF89E,GAAqB,UAAU,EAC/BZ,GAAsB,sBAAuB,MAAM,MAC9C,CACL,MAAM78J,GAASkzJ,EAAuB,yBAA0B16J,GAAO,CACrE,oBAAA6Q,GACA,UAAA4vB,GACA,gBACA,iBAAA4nI,GACA,aAAAD,EAAA,CACD,EACDnD,GAAqBz9J,EAAM,EAC3B68J,GAAsB,sBAAuB,OAAO,CACtD,CACF,QAAA,CACEF,GAA6B,KAC7BgB,EAAsB,EAAK,CAC7B,CACF,EAEMoD,GAAY,SAAY,CAC5B,MAAMlmK,EAAU8/G,EAAA,EAChB,GAAI,CAAC9/G,GAAW,OAAOA,EAAQ,qBAAwB,WAAY,CACjE+iK,GAAgB,yCAAyC,EACzDf,GAAsB,iBAAkB,OAAO,EAC/C,MACF,CAEA,MAAMmE,GAAa,OAAOlI,GAAgB,OAAS,CAAC,EAC9C1sJ,GAAO,OAAO2sJ,GAAU,OAAS,CAAC,EAClCkI,GAAY,OAAOjI,GAAe,OAAS,EAAE,EAC7CkI,GAAY,OAAOjI,GAAe,OAAS,CAAC,EAC5C5vJ,GAAsBwvJ,GAAa,MAAQ,OAAOA,GAAa,KAAK,EAAI,KACxEsI,GAA4B,OAAOjI,GAAkB,OAAS,WAAW,EAEzEkI,GAAY,KAAK,IAAI,EAAG,OAAOnH,GAAe,KAAK,GAAK,CAAC,EACzDoH,GAAc,KAAK,IAAI,EAAG,OAAOnH,GAAiB,KAAK,GAAK,GAAK,EACjE6F,GAAU,KAAK,IAAI,EAAG,OAAO/F,GAAa,KAAK,GAAK,CAAC,EAE3D4D,GAAgB,WAAW,EAC3Bf,GAAsB,iBAAkB,SAAS,EACjDgB,GAAkB,EAAG,CAAC,EACtBvE,GAAgB,YAAc,IAC9BC,GAAe,YAAc,IAC7BC,GAAa,YAAc,IAC3BsE,GAAiB,EAAI,EACrB5B,GAAwB,IAAI,gBAE5B,MAAMqD,GAAW,OAAO,YAAgB,KAAe,YAAY,IAAO,YAAY,IAAA,EAAQ,KAAK,IAAA,EACnG,GAAI,CAUF,MAAMtmK,GAAS,MATC4B,EAAQ,oBAAoB,CAC1C,oBAAAwO,GACA,WAAA23J,GACA,KAAA50J,GACA,UAAA60J,GACA,UAAAC,GACA,0BAAAC,EAAA,CACD,EAE4B,UAAU,CACrC,OAAQjF,GAAsB,OAC9B,QAAA6D,GACA,YAAa,CAAE,UAAAqB,GAAW,YAAAC,EAAA,EAC1B,WAAal7I,IAAa,CACxB,GAAI,CAACA,GAAU,OACf03I,GAAkB13I,GAAS,gBAAiBA,GAAS,aAAa,EAClE,MAAMm7I,GAAQn7I,GAAS,OAAS,EAC1Bo7I,GAAQp7I,GAAS,OAAS,EAC1Bq7I,GAAOr7I,GAAS,WAAa,EAC7BvU,GAAOuU,GAAS,MAAQ,EACxBs7I,GAAOt7I,GAAS,WAAa,EAC7Bu7I,GAAcv7I,GAAS,gBAAkB,EAC/Cy3I,GAAgB,kBAAkB0D,EAAK,YAAYC,EAAK,IAAIC,EAAI,WAAW5vJ,EAAI,IAAI6vJ,EAAI,QAAQC,EAAW,EAAE,CAC9G,CAAA,CACD,EAEKlC,GAAS,OAAO,YAAgB,KAAe,YAAY,IAAO,YAAY,IAAA,EAAQ,KAAK,IAAA,EAC3FmC,GAAY,KAAK,IAAI,EAAGnC,GAAQD,EAAO,EAC7C1B,GAAkB,EAAG,CAAC,EACtBD,GAAgB,iBAAiBuD,EAAyB,GAAG,EAC7DtE,GAAsB,iBAAkB,SAAS,EACjDvD,GAAgB,YAAcv2E,EAAa9pF,IAAQ,YAAc,IAAK,CAAC,EACvEsgK,GAAe,YAAc,OAAOtgK,IAAQ,gBAAkB,GAAG,EACjEugK,GAAa,YAAc,GAAG,KAAK,MAAMmI,EAAS,CAAC,MACnD5O,EAAsB,qBAAsBoO,EAAyB,EACrEnC,GAAA,EACA,KAAK,QAAQ,gBAAA,CACf,OAASxmK,GAAO,CACd,MAAMlB,GAAUkB,IAAO,SAAW,OAAOA,EAAK,EACxCmnF,GAAQroF,GAAQ,YAAA,EACN4kK,IAAuB,QAAQ,SAAWv8E,GAAM,SAAS,SAAS,GAAKA,GAAM,SAAS,UAAU,GAE9Gi+E,GAAgB,UAAU,EAC1Bf,GAAsB,iBAAkB,MAAM,IAE9Ce,GAAgBtmK,EAAO,EACvBulK,GAAsB,iBAAkB,OAAO,EAEnD,QAAA,CACEX,GAAwB,KACxB4B,GAAiB,EAAK,CACxB,CACF,EAEM8D,GAAe,SAAY,CAC/B,MAAM/mK,EAAU8/G,EAAA,EAChB,GAAI,CAAC9/G,GAAW,OAAOA,EAAQ,wBAA2B,WAAY,CACpEkjK,GAAmB,oDAAoD,EACvElB,GAAsB,oBAAqB,OAAO,EAClD,MACF,CAEAqB,GAAA,EACA,MAAMtL,GAASF,EAAyB0H,GAAsB,KAAK,EAC7DyH,GAAW,KAAK,IAAI,EAAG,OAAOvH,GAAuB,KAAK,GAAK,CAAC,EAChE6D,GAAiBxL,EAA2BC,EAAM,EAClD7gF,GAAQ,KAAK,IAAIosF,GAAgB,KAAK,IAAI,EAAG,OAAO5D,GAAoB,KAAK,GAAK,CAAC,CAAC,EAC1FW,GAAkB,MAAMnpF,EAAK,EAE7B,MAAM+vF,GAA+BtH,GAAyB,MAAM,KAAA,GAAU,KACxE8D,GAAa,EAAQ5D,GAA4B,QACvD,IAAIqH,GAAkC,KAClCzD,KACFyD,GAAkCtH,GAA4B,MAAM,KAAA,GAAU,mBAC9EA,GAA4B,MAAQsH,IAEtC,MAAMC,GAA0BrH,GAA8B,QAAU,SAAW,SAAW,SACxFsH,GAAiC,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,OAAOpH,GAA8B,KAAK,GAAK,CAAC,CAAC,EAE3GuG,GAAY,KAAK,IAAI,EAAG,OAAOtF,GAAwB,KAAK,GAAK,CAAC,EAClEuF,GAAc,KAAK,IAAI,EAAG,OAAOtF,GAA0B,KAAK,GAAK,GAAG,EACxEgE,GAAU,KAAK,IAAI,EAAG,OAAOlE,GAAsB,KAAK,GAAK,CAAC,EAEpEkC,GAAmB,WAAW,EAC9BlB,GAAsB,oBAAqB,SAAS,EACpDmB,GAAqB,EAAG,CAAC,EACzB5C,GAAwB,YAAc,IACtCC,GAA4B,YAAc,IAC1CC,GAAsB,YAAc,IACpC2C,GAAoB,EAAI,EACxB7B,GAA2B,IAAI,gBAE/B,MAAMmD,GAAW,OAAO,YAAgB,KAAe,YAAY,IAAO,YAAY,IAAA,EAAQ,KAAK,IAAA,EACnG,IAAIvkB,GAAU,KACd,GAAI,CACFA,GAAUngJ,EAAQ,uBAAuB,CACvC,SAAAgnK,GACA,OAAAjP,GACA,MAAA7gF,GACA,6BAA8B,EAAQgwF,GACtC,6BAAAD,GACA,gCAAAC,GACA,wBAAAC,GACA,+BAAAC,EAAA,CACD,EAED,MAAMjnB,GAAQ,IAAI,CAChB,OAAQohB,GAAyB,OACjC,QAAA2D,GACA,YAAa,CAAE,UAAAqB,GAAW,YAAAC,EAAA,EAC1B,WAAal7I,IAAa,CACxB,GAAI,CAACA,GAAU,OACf63I,GAAqB73I,GAAS,gBAAiBA,GAAS,aAAa,EACrE,MAAMm7I,GAAQn7I,GAAS,OAAS,EAC1B+7I,GAAY/7I,GAAS,gBAAkBA,GAAS,iBAAmB,EACnE3B,GAAQ2B,GAAS,WAAaA,GAAS,eAAiB,EAC9D43I,GAAmB,kBAAkBuD,EAAK,MAAMY,EAAS,IAAI19I,EAAK,QAAQ,CAC5E,CAAA,CACD,EAED,MAAMvrB,GAAS+hJ,GAAQ,SAAS,CAC9B,6BAAA8mB,GACA,gCAAAC,GACA,wBAAAC,GACA,+BAAAC,EAAA,CACD,EACKzC,GAAS,OAAO,YAAgB,KAAe,YAAY,IAAO,YAAY,IAAA,EAAQ,KAAK,IAAA,EAC3FmC,GAAY,KAAK,IAAI,EAAGnC,GAAQD,EAAO,EACvC4C,GAAOtP,EAAoB55J,IAAQ,eAAe,EAElDmpK,GAAS,CAAA,EACXN,IAA8BM,GAAO,KAAK,IAAIN,EAA4B,GAAG,EAC7EC,IAAiCK,GAAO,KAAK,IAAIL,EAA+B,GAAG,EACvF/D,GAAqB,EAAG,CAAC,EACzBD,GAAmBqE,GAAO,OAAS,gBAAgBA,GAAO,KAAK,IAAI,CAAC,GAAK,MAAM,EAC/EvF,GAAsB,oBAAqB,SAAS,EACpDzB,GAAwB,YAAcr4E,EAAao/E,GAAM,CAAC,EAC1D9G,GAA4B,YAAc,OAAOpiK,IAAQ,eAAiB,GAAG,EAC7EqiK,GAAsB,YAAc,GAAG,KAAK,MAAMqG,EAAS,CAAC,MACxDS,GAAO,QAAQrP,EAAsB,YAAa,CAAC+O,GAA8BC,EAA+B,CAAC,EACrH/C,GAAA,EACA,KAAK,QAAQ,gBAAA,CACf,OAASxmK,GAAO,CACd,MAAMlB,GAAUkB,IAAO,SAAW,OAAOA,EAAK,EACxCmnF,GAAQroF,GAAQ,YAAA,EACN8kK,IAA0B,QAAQ,SAAWz8E,GAAM,SAAS,SAAS,GAAKA,GAAM,SAAS,UAAU,GAEjHo+E,GAAmB,UAAU,EAC7BlB,GAAsB,oBAAqB,MAAM,IAEjDkB,GAAmBzmK,EAAO,EAC1BulK,GAAsB,oBAAqB,OAAO,EAEtD,QAAA,CACE,GAAI7hB,IAAW,OAAOA,GAAQ,SAAY,WACxC,GAAI,CACFA,GAAQ,QAAA,CACV,MAAgB,CAEhB,CAEFohB,GAA2B,KAC3B6B,GAAoB,EAAK,CAC3B,CACF,EAEAlK,EAAiB,iBAAiB,QAAS,IAAM,CAC3CsI,IACJgD,GAAA,CACF,CAAC,EACD1K,GAAmB,iBAAiB,QAAS,IAAM,CAC7C2H,IACJmD,GAAA,CACF,CAAC,EACDjK,GAAqB,iBAAiB,QAAS,IAAM,CAC/C+G,IACJoD,GAAA,CACF,CAAC,EACDrJ,EAAsB,iBAAiB,QAAS,IAAM,CACpD,GAAIkG,GAAoB,CACtB2C,GAAA,EACA,MACF,CACAS,GAAA,CACF,CAAC,EACDhI,GAAsB,iBAAiB,QAAS,IAAM,CACpD,GAAI6E,GAAoB,CACtB2C,GAAA,EACA,MACF,CACAuB,GAAA,CACF,CAAC,EAEDxH,GAAW,iBAAiB,QAAS,IAAM,CACzC,GAAI8C,GAAe,CACjBgD,GAAA,EACA,MACF,CACA8B,GAAA,CACF,CAAC,EACDjG,GAAoB,iBAAiB,QAAS,IAAM,CAClD,GAAIqB,GAAkB,CACpB+C,GAAA,EACA,MACF,CACA0C,GAAA,CACF,CAAC,EAED5C,GAAA,EAIApC,GAAe,IAAIvvD,GACnB,MAAMskC,GAAQirB,GACdjrB,GAAM,IAAI,CACR,GAAI,iBACJ,MAAO,SACP,UAAWp9I,GAAS,iBAAmB,GACvC,UAAW,GACX,eAAgBw/J,EAChB,SAAU,IAAM,CACd,MAAMxH,EAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAQ,YAAYh9I,CAAM,EAC1Bg9I,EAAQ,YAAY+H,GAAiB,OAAO,EACrC/H,CACT,GAAA,CAAG,CACJ,EACD5a,GAAM,IAAI,CACR,GAAI,mBACJ,MAAO,WACP,UAAWp9I,GAAS,mBAAqB,GACzC,UAAW,GACX,eAAgBogK,GAChB,SAAU,IAAM,CACd,MAAMpI,EAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAQ,YAAY92H,EAAQ,EAC5B82H,EAAQ,YAAY2I,GAAmB,OAAO,EACvC3I,CACT,GAAA,CAAG,CACJ,EACD5a,GAAM,IAAI,CACR,GAAI,qBACJ,MAAO,mBACP,UAAWp9I,GAAS,qBAAuB,GAC3C,UAAW,GACX,eAAgBihK,GAChB,SAAU,IAAM,CACd,MAAMjJ,EAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAQ,YAAY4I,CAAU,EAC9B5I,EAAQ,YAAYwJ,GAAqB,OAAO,EACzCxJ,CACT,GAAA,CAAG,CACJ,EACD5a,GAAM,IAAI,CACR,GAAI,gBACJ,MAAO,yBACP,UAAWp9I,GAAS,sBAAwB,GAC5C,UAAW,GACX,eAAgB+hK,EAChB,SAAU,IAAM,CACd,MAAM/J,EAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAQ,YAAYyJ,EAAW,EAC/BzJ,EAAQ,YAAYgL,GAAsB,OAAO,EAC1ChL,CACT,GAAA,CAAG,CACJ,EACD5a,GAAM,IAAI,CACR,GAAI,sBACJ,MAAO,yBACP,UAAWp9I,GAAS,sBAAwB,GAC5C,UAAW,GACX,eAAgBqjK,GAChB,SAAU,IAAM,CACd,MAAMrL,EAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAQ,YAAYiL,EAAW,EAC/BjL,EAAQ,YAAYoM,GAAsB,OAAO,EAC1CpM,CACT,GAAA,CAAG,CACJ,EACD5a,GAAM,IAAI,CACR,GAAI,iBACJ,MAAO,uBACP,UAAWp9I,GAAS,iBAAmB,GACvC,UAAW,GACX,eAAgB4kK,GAChB,SAAU,IAAM,CACd,MAAM5M,EAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAQ,YAAYqM,EAAM,EAC1BrM,EAAQ,YAAY4N,GAAiB,OAAO,EACrC5N,CACT,GAAA,CAAG,CACJ,EACD5a,GAAM,IAAI,CACR,GAAI,oBACJ,MAAO,iBACP,UAAWp9I,GAAS,oBAAsB,GAC1C,UAAW,GACX,eAAgBumK,GAChB,SAAU,IAAM,CACd,MAAMvO,EAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAQ,YAAYv7G,EAAS,EAC7Bu7G,EAAQ,YAAYyP,GAAoB,OAAO,EACxCzP,CACT,GAAA,CAAG,CACJ,EACDuQ,GAAA,EACAlgE,EAAQ,YAAY+0C,GAAM,OAAO,EACjC,KAAK,iBAAiB,IAAI,IAAMA,GAAM,SAAS,EAC/C,KAAK,iBAAiB,IAAI,IAAM2iB,GAAiB,SAAS,EAC1D,KAAK,iBAAiB,IAAI,IAAMY,GAAmB,SAAS,EAC5D,KAAK,iBAAiB,IAAI,IAAMa,GAAqB,SAAS,EAC9D,KAAK,iBAAiB,IAAI,IAAMwB,GAAsB,SAAS,EAC/D,KAAK,iBAAiB,IAAI,IAAMoB,GAAsB,SAAS,EAC/D,KAAK,iBAAiB,IAAI,IAAMwB,GAAiB,SAAS,EAC1D,KAAK,iBAAiB,IAAI,IAAM6B,GAAoB,SAAS,EAE7D,KAAK,iBAAiB,IAAI,IAAM,CAC9B,UAAWpzD,KAAW8oD,EAAiB9oD,EAAA,EACvC8oD,EAAgB,MAAA,CAClB,CAAC,EAGD,MAAM98B,GAAoB,IAAM,CAC9BqqC,GAAA,EACAC,GAAA,EACAC,GAAA,EACAC,GAAA,EACAtC,GAAA,EACAkC,GAAA,CACF,EACA,IAAI94D,GAAQ,KACZ,OAAI,KAAK,QAAQ,GACfA,GAAQ,KAAK,OAAO,GAAG,mBAAoB0uB,EAAiB,EACnD,KAAK,QAAQ,mBACtB,KAAK,OAAO,iBAAiB,mBAAoBA,EAAiB,EAClE1uB,GAAQ,IAAM,KAAK,OAAO,oBAAoB,mBAAoB0uB,EAAiB,GAEjF1uB,IAAO,KAAK,iBAAiB,IAAIA,EAAK,EAEnC,KAAK,YAAY,CACtB,GAAI3xG,EAAQ,IAAM,oBAClB,MAAOA,EAAQ,OAAS,UACxB,SAAUA,EAAQ,UAAY,CAAE,EAAG,GAAI,EAAG,GAAA,EAC1C,KAAMA,EAAQ,MAAQ,WACtB,UAAWA,EAAQ,WAAa,GAChC,QAAAqoG,CAAA,CACD,CACH,CAUA,iBAAiBroG,EAAU,GAAI,CAC7B,MAAMqoG,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,wBACpB,MAAMylE,EAAW,OAAO,SAAS9tK,EAAQ,QAAQ,EAC7C,KAAK,IAAI,IAAM,OAAOA,EAAQ,QAAQ,CAAC,EACvC,EAAI,GAAK,IACPgsI,EAAY,OAAO,SAAShsI,EAAQ,SAAS,EAC/C,KAAK,IAAI,IAAK,OAAOA,EAAQ,SAAS,CAAC,EACvC,KAEEuxJ,EAAO,CACX,CAAC,oBAAqB,gBAAgB,EACtC,CAAC,mBAAoB,eAAe,EACpC,CAAC,gBAAiB,YAAY,EAC9B,CAAC,yBAA0B,qBAAqB,CAAA,EAChD,IAAI,CAAC,CAAChvJ,EAAKuiB,CAAK,IAAM,CACtB,MAAMw9B,EAAM,SAAS,cAAc,KAAK,EACxCA,EAAI,UAAY,6BAChB,MAAMgxE,EAAU,SAAS,cAAc,MAAM,EAC7CA,EAAQ,UAAY,+BACpBA,EAAQ,YAAcxuG,EACtB,MAAMg+H,EAAU,SAAS,cAAc,MAAM,EAC7C,OAAAA,EAAQ,UAAY,+BACpBA,EAAQ,YAAc,IACtBxgG,EAAI,OAAOgxE,EAASwvB,CAAO,EAC3Bz6C,EAAQ,YAAY/lD,CAAG,EAChB,CAAE,IAAA//C,EAAK,QAAAugJ,CAAA,CAChB,CAAC,EAEK77G,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,8BACjBohE,EAAQ,YAAYphE,CAAI,EAExB,IAAI8mI,EAAc,EAClB,MAAMxgH,EAAS,IAAM,CACnBwgH,EAAc,EACd,MAAMv+I,EAAQ,KAAK,QAAQ,SAAS,aAAa,CAC/C,SAAAs+I,EACA,cAAe,GACf,YAAa,GACb,mBAAoB,EAAA,CACrB,GACI,KAAK,QAAQ,QAAQ,aAAa,CAAE,SAAAA,EAAU,cAAe,GAAO,YAAa,EAAA,CAAO,GACxF,CAAA,EACL,UAAWxrH,KAAOivG,EAAM,CACtB,MAAMnyJ,EAAQ,OAAOowB,EAAM8yB,EAAI,GAAG,GAAK,CAAC,EAClC2qC,EAAW,OAAO,SAAS7tF,CAAK,EAAI,OAAOA,CAAK,EAAI,IACtDkjD,EAAI,QAAQ,cAAgB2qC,IAAU3qC,EAAI,QAAQ,YAAc2qC,EACtE,CACA,MAAM+gF,EAAU,KAAK,IAAI,EAAG,KAAK,MAAMF,EAAW,GAAK,CAAC,EAClDG,EAAYz+I,EAAM,UAAY,OAAOA,EAAM,SAAS,EAAI,OACxDi8H,EAAgBj8H,EAAM,cACxB,OAAOA,EAAM,aAAa,EACzBA,EAAM,aAAa,OAAS,OAAOA,EAAM,YAAY,MAAM,EAAI,UAC9DuhG,EAAW,GAAGi9C,CAAO,iBAAiBviB,CAAa,MAAMwiB,CAAS,GACpEhnI,EAAK,cAAgB8pF,IAAU9pF,EAAK,YAAc8pF,EACxD,EACMm9C,EAAiB,IAAM,CACvBH,IACA,OAAO,OAAO,uBAA0B,WAC1CA,EAAc,OAAO,sBAAsBxgH,CAAM,EAEjDwgH,EAAc,OAAO,WAAWxgH,EAAQ,EAAE,EAE9C,EACAA,EAAA,EACA,MAAM5pD,EAAW,OAAO,YAAYuqK,EAAgBliC,CAAS,EAC7D,KAAK,iBAAiB,IAAI,IAAM,CAC9B,OAAO,cAAcroI,CAAQ,EACzBoqK,IACE,OAAO,OAAO,sBAAyB,WAAY,OAAO,qBAAqBA,CAAW,EACzF,OAAO,aAAaA,CAAW,EACpCA,EAAc,EAElB,CAAC,EACD,MAAM95D,EAAmB,KAAK,QAAQ,QAAQ,YAAY,GAAIi6D,EAAgB,CAAE,UAAW,GAAO,EAElG,GADI,OAAOj6D,GAAqB,YAAY,KAAK,iBAAiB,IAAIA,CAAgB,EAClF,OAAO,KAAK,QAAQ,SAAS,kBAAqB,WAAY,CAChE,MAAMk6D,EAAkB,IAAMD,EAAA,EAC9B,KAAK,OAAO,QAAQ,iBAAiB,SAAUC,CAAe,EAC9D,KAAK,iBAAiB,IAAI,IAAM,KAAK,QAAQ,SAAS,sBAAsB,SAAUA,CAAe,CAAC,CACxG,CAEA,OAAO,KAAK,YAAY,CACtB,GAAInuK,EAAQ,IAAM,kBAClB,MAAOA,EAAQ,OAAS,QACxB,SAAUA,EAAQ,UAAY,CAAE,EAAG,GAAI,EAAG,GAAA,EAC1C,KAAMA,EAAQ,MAAQ,QACtB,MAAOA,EAAQ,OAAS,IACxB,SAAUA,EAAQ,UAAY,IAC9B,gBAAiB,GACjB,UAAWA,EAAQ,WAAa,GAChC,QAAAqoG,CAAA,CACD,CACH,CASA,SAAU,CACJ,KAAK,kCAAoC,MAAM,aAAa,KAAK,gCAAgC,EACrG,KAAK,iCAAmC,KACxC,UAAWgM,KAAW,KAAK,iBAAkBA,EAAA,EAO7C,GANA,KAAK,iBAAiB,MAAA,EACtB,KAAK,qBAAqB,MAAA,EAC1B,KAAK,0BAA4B,KACjC,KAAK,QAAQ,gBAAgB,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAA,CAAG,EACrE,KAAK,cAAc,QAAA,EACf,KAAK,QAAQ,KAAO,OAAM,KAAK,OAAO,GAAK,MAC3C,KAAK,QAAQ,QAAU,OAAO,KAAK,OAAO,OAAO,aAAgB,WAAY,CAC/E,KAAK,OAAO,OAAO,YAAY,KAAK,SAAS,EAC7C,MACF,CACA,KAAK,WAAW,SAAA,CAClB,CAUA,mBAAmBr0G,EAAU,GAAI,CAC/B,OAAO,IAAIimH,GAAa,KAAMjmH,CAAO,EAAE,OAAA,CAs9DzC,CAUA,kBAAkBA,EAAU,GAAI,CAC9B,OAAO,IAAIimI,GAAY,KAAMjmI,CAAO,EAAE,OAAA,CACxC,CAUA,mBAAmBA,EAAU,GAAI,CAC/B,OAAO,IAAIssI,GAAa,KAAMtsI,CAAO,EAAE,OAAA,CACzC,CAUA,kBAAkBA,EAAU,GAAI,CAC9B,OAAO,IAAIwuI,GAAY,KAAMxuI,CAAO,EAAE,OAAA,CACxC,CAUA,qBAAqBA,EAAU,GAAI,CACjC,OAAO,IAAIm2I,GAAe,KAAMn2I,CAAO,EAAE,OAAA,CAC3C,CACF,CC1sSA,SAASouK,GAAkB3vJ,EAAMhT,EAAQ,CACvC,GAAI,OAAO,aAAgB,WAAY,OAAO,IAAI,YAAYgT,EAAM,CAAE,OAAAhT,EAAQ,EAC9E,GAAI,OAAO,OAAU,WAAY,CAC/B,MAAMhK,EAAQ,IAAI,MAAMgd,CAAI,EAC5B,OAAAhd,EAAM,OAASgK,EACRhK,CACT,CACA,MAAO,CAAE,KAAAgd,EAAM,OAAAhT,CAAM,CACvB,CAwBO,MAAM4iK,WAAiB,WAAY,CACxC,OAAO,GAAK,KAEZ,YAAYruK,EAAU,GAAI,CACxB,MAAK,EACL,KAAK,QAAUA,GAAW,OAAOA,GAAY,SAAW,CAAE,GAAGA,CAAO,EAAK,CAAA,EACzE,KAAK,QAAU,KACf,KAAK,GAAK,KAAK,YAAY,IAAM,KACjC,KAAK,UAAY,IAAI,GACvB,CAEA,OAAO6L,EAAS,CACd,YAAK,QAAUA,GAAW,KACnB,IACT,CAEA,QAAS,CACP,UAAWwoG,KAAW,KAAK,UACzB,GAAI,CACFA,IAAO,CACT,OAASpwG,EAAO,CACd,QAAQ,KAAK,oBAAoB,KAAK,IAAM,KAAK,YAAY,IAAI,kCAAmCA,CAAK,CAC3G,CAEF,YAAK,UAAU,MAAK,EACpB,KAAK,QAAU,KACR,IACT,CAEA,OAAOjE,EAAU,GAAI,CACnB,OAAIA,GAAW,OAAOA,GAAY,WAChC,KAAK,QAAU,CAAE,GAAG,KAAK,QAAS,GAAGA,CAAO,GAEvC,IACT,CAEA,WAAY,CACV,MAAO,CAAE,QAAS,CAAE,GAAG,KAAK,OAAO,CAAE,CACvC,CAEA,QAAQyG,EAAW,GAAI,CACrB,OAAIA,GAAU,SAAW,OAAOA,EAAS,SAAY,UACnD,KAAK,OAAOA,EAAS,OAAO,EAEvB,IACT,CAEA,WAAW4tG,EAAS,CAClB,OAAI,OAAOA,GAAY,YACvB,KAAK,UAAU,IAAIA,CAAO,EACnBA,CACT,CAEA,cAAcA,EAAS,CACrB,YAAK,UAAU,OAAOA,CAAO,EACtB,IACT,CAEA,KAAK51F,EAAMhT,EAAQ,CACjB,YAAK,cAAc2iK,GAAkB3vJ,EAAMhT,CAAM,CAAC,EAC3C,IACT,CAEA,GAAGgT,EAAMhb,EAASzD,EAAS,CACzB,YAAK,iBAAiBye,EAAMhb,EAASzD,CAAO,EACrC,IAAM,KAAK,oBAAoBye,EAAMhb,EAASzD,CAAO,CAC9D,CACF,CCjGA,MAAMsuK,GAAiB,OAAO,OAAO,CACnC,aACA,aACA,uBACA,gBACA,eACA,mBACA,kBACA,wBACA,uBACA,uBACA,iBACA,gBACA,mBACA,kBACA,mBACA,qBACA,+BACA,iBACA,oBACA,sBACA,6BACA,0CACA,gDACA,qCACA,uCACA,sCACA,sCACA,gBACA,cACA,cACA,uBACA,wBACA,wBACA,wBACA,mBACA,wBACA,2BACA,wBACA,wBACA,sBACA,yBACA,kBACA,0BACA,wBACA,wBACA,2BACA,yBACA,uBACA,uBACA,iCACA,iCACA,0BACA,eACF,CAAC,EAEKC,GAAoB,IAAI,IAAID,EAAc,EAC1CE,GAAqB,IAAI,IAAI,CACjC,aACA,GAAGF,EACL,CAAC,EAEKG,GAA0B,OAAO,OAAO,CAC5C,WAAY,wBACZ,WAAY,wBACZ,qBAAsB,kCACtB,cAAe,2BACf,cAAe,iCACf,aAAc,gCACd,iBAAkB,oCAClB,gBAAiB,mCACjB,sBAAuB,yCACvB,qBAAsB,wCACtB,qBAAsB,4CACtB,mBAAoB,sCACpB,eAAgB,kCAChB,cAAe,iCACf,iBAAkB,oCAClB,gBAAiB,mCACjB,iBAAkB,oCAClB,eAAgB,kCAChB,kBAAmB,qCACnB,6BAA8B,2CAC9B,oBAAqB,uCACrB,2BAA4B,+CAC5B,wCAAyC,4DACzC,8CAA+C,kEAC/C,mCAAoC,uDACpC,qCAAsC,yDACtC,oCAAqC,wDACrC,oCAAqC,wDACrC,cAAe,4BACf,YAAa,0BACb,YAAa,0BACb,qBAAsB,mCACtB,sBAAuB,qCACvB,sBAAuB,qCACvB,sBAAuB,qCACvB,iBAAkB,+BAClB,sBAAuB,oCACvB,yBAA0B,uCAC1B,sBAAuB,oCACvB,sBAAuB,oCACvB,oBAAqB,kCACrB,uBAAwB,qCACxB,gBAAiB,8BACjB,wBAAyB,sCACzB,sBAAuB,oCACvB,sBAAuB,oCACvB,yBAA0B,uCAC1B,uBAAwB,qCACxB,qBAAsB,mCACtB,qBAAsB,mCACtB,+BAAgC,6CAChC,+BAAgC,6CAChC,wBAAyB,qCAC3B,CAAC,EAED,SAASvpC,GAAiBz5H,EAAS,GAAI,CACrC,MAAMkC,EAAO,CAAA,EAGb,GAFI,OAAOlC,EAAO,YAAe,UAAUkC,EAAK,KAAKlC,EAAO,UAAU,EAClE,OAAOA,EAAO,UAAa,UAAUkC,EAAK,KAAKlC,EAAO,QAAQ,EAC9D,MAAM,QAAQA,EAAO,WAAW,EAClC,UAAWlJ,KAAOkJ,EAAO,YAAiB,OAAOlJ,GAAQ,UAAUoL,EAAK,KAAKpL,CAAG,EAElF,GAAI,MAAM,QAAQkJ,EAAO,SAAS,EAChC,UAAWlJ,KAAOkJ,EAAO,UAAe,OAAOlJ,GAAQ,UAAUoL,EAAK,KAAKpL,CAAG,EAEhF,OAAOoL,CACT,CAEA,SAAS+gK,GAAiBnsK,EAAKrB,EAAQ,CACrC,MAAI,CAACqB,GAAO,CAACrB,EAAe,GACrBqB,IAAQrB,GAAUqB,EAAI,WAAW,GAAGrB,CAAM,GAAG,GAAKA,EAAO,WAAW,GAAGqB,CAAG,GAAG,CACtF,CAEA,SAASosK,GAA4BljK,EAAS,CAAA,EAAImjK,EAAW,GAAIC,EAAc,GAAI,CACjF,MAAM98D,EAAY,OAAOtmG,EAAO,MAAS,SAAWA,EAAO,KAAO,GAC5DqjK,EAAYL,GAAwB18D,CAAS,GAAK,GAClD8xC,EAAagrB,GAAeJ,GAAwBG,CAAQ,GAAK,GACvE,GAAI78D,IAAcA,IAAc68D,GAAaE,GAAaJ,GAAiBI,EAAWjrB,CAAU,GAAK,MAAO,GAC5G,MAAMl2I,EAAOu3H,GAAiBz5H,CAAM,EACpC,GAAI,CAACkC,EAAK,OAAQ,MAAO,GACzB,MAAMohK,EAAeH,EAAW,wBAAwBA,CAAQ,GAAK,GACrE,OAAOjhK,EAAK,KAAMpL,GAChBmsK,GAAiBnsK,EAAKshJ,CAAU,GAC7B6qB,GAAiBnsK,EAAKwsK,CAAY,CACtC,CACH,CAEA,MAAMC,GAA4B,OAAO,OAAO,CAC9C,oBAAqB,wBACrB,2BAA4B,iBAC5B,wCAAyC,uBACzC,8CAA+C,mBAC/C,mCAAoC,iBACpC,qCAAsC,mBACtC,oCAAqC,qBACrC,oCAAqC,qBACrC,cAAe,SACf,YAAa,QACb,YAAa,QACb,qBAAsB,kBACtB,sBAAuB,UACvB,sBAAuB,UACvB,sBAAuB,UACvB,iBAAkB,cAClB,sBAAuB,cACvB,yBAA0B,iBAC1B,sBAAuB,UACvB,sBAAuB,UACvB,oBAAqB,iBACrB,uBAAwB,WACxB,gBAAiB,YACjB,wBAAyB,oBACzB,sBAAuB,QACvB,sBAAuB,QACvB,yBAA0B,WAC1B,uBAAwB,SACxB,qBAAsB,OACtB,qBAAsB,OACtB,+BAAgC,aAChC,+BAAgC,aAChC,wBAAyB,UACzB,cAAe,kBACf,aAAc,iBACd,iBAAkB,qBAClB,gBAAiB,oBACjB,sBAAuB,sBACvB,qBAAsB,qBACtB,qBAAsB,qBACtB,mBAAoB,cACpB,eAAgB,mBAChB,cAAe,kBACf,iBAAkB,qBAClB,gBAAiB,oBACjB,iBAAkB,qBAClB,eAAgB,mBAChB,kBAAmB,kBACnB,6BAA8B,mBAChC,CAAC,EAED,SAASC,GAAqB7vK,EAAO,CACnC,OAAO,OAAOA,GAAS,EAAE,EACtB,QAAQ,UAAW,GAAG,EACtB,QAAQ,sBAAuB,OAAO,EACtC,QAAQ,yBAA0B,OAAO,EACzC,QAAQ,QAAS,GAAG,EACpB,KAAI,EACJ,QAAQ,SAAW8vK,GAAUA,EAAM,YAAW,CAAE,CACrD,CAEA,SAASC,GAAuB5sK,EAAK,CACnC,OAAOysK,GAA0BzsK,CAAG,GAAK0sK,GAAqB1sK,CAAG,CACnE,CAEA,SAAS6sK,GAAkBhwK,EAAO,CAChC,GAAI,MAAM,QAAQA,CAAK,EAAG,OAAOA,EAAM,IAAKguB,GAAUgiJ,GAAkBhiJ,CAAK,CAAC,EAC9E,GAAI,YAAY,OAAOhuB,CAAK,EAAG,OAAO,MAAM,KAAKA,EAAQguB,GAAUgiJ,GAAkBhiJ,CAAK,CAAC,EAC3F,GAAI,CAAChuB,GAAS,OAAOA,GAAU,SAAU,OAAOA,EAChD,MAAMwC,EAAO,CAAA,EACb,SAAW,CAACW,EAAK6qB,CAAK,IAAK,OAAO,QAAQhuB,CAAK,EACzC,OAAOguB,GAAU,aACrBxrB,EAAKW,CAAG,EAAI6sK,GAAkBhiJ,CAAK,GAErC,OAAOxrB,CACT,CAEA,SAASytK,GAAyB9sK,EAAKuI,EAAQ,GAAI,CACjD,MAAMwkK,EAAYxkK,EAAM,WAAa,CAAA,EAC/BykK,EAAYzkK,EAAM,WAAa,CAAA,EAC/B0kK,EAAkBD,EAAU,iBAAmB,CAAA,EAC/CE,EAAS3kK,EAAM,QAAU,CAAA,EACzB4kK,EAAmB5kK,EAAM,kBAAoB,CAAA,EAwDnD,MAvDe,CACb,WAAYA,EAAM,WAClB,WAAYA,EAAM,WAClB,qBAAsBA,EAAM,qBAC5B,cAAeA,EAAM,cACrB,cAAewkK,EAAU,UACzB,aAAcA,EAAU,SACxB,iBAAkBA,EAAU,aAC5B,gBAAiBA,EAAU,YAC3B,sBAAuBA,EAAU,kBACjC,qBAAsBA,EAAU,iBAChC,qBAAsBA,EAAU,qBAChC,mBAAoBA,EAAU,eAC9B,eAAgBC,EAAU,WAC1B,cAAeA,EAAU,UACzB,iBAAkBA,EAAU,aAC5B,gBAAiBA,EAAU,YAC3B,iBAAkBA,EAAU,aAC5B,6BAA8BA,EAAU,oBACxC,eAAgBA,EAAU,WAC1B,kBAAmBA,EAAU,cAC7B,oBAAqBA,EAAU,gBAC/B,2BAA4BC,EAAgB,QAC5C,wCAAyCA,EAAgB,qBACzD,8CAA+CA,EAAgB,2BAC/D,mCAAoCA,EAAgB,gBACpD,qCAAsCA,EAAgB,kBACtD,oCAAqCA,EAAgB,iBACrD,oCAAqCA,EAAgB,iBACrD,cAAeC,EAAO,QACtB,YAAaA,EAAO,MACpB,YAAaA,EAAO,MACpB,qBAAsBA,EAAO,eAC7B,sBAAuB,MAAM,QAAQA,EAAO,cAAc,EAAIA,EAAO,eAAe,CAAC,EAAI,OACzF,sBAAuB,MAAM,QAAQA,EAAO,cAAc,EAAIA,EAAO,eAAe,CAAC,EAAI,OACzF,sBAAuB,MAAM,QAAQA,EAAO,cAAc,EAAIA,EAAO,eAAe,CAAC,EAAI,OACzF,iBAAkBA,EAAO,WACzB,sBAAuBA,EAAO,gBAC9B,yBAA0BA,EAAO,mBACjC,sBAAuBA,EAAO,gBAC9B,sBAAuBA,EAAO,gBAC9B,oBAAqBA,EAAO,cAC5B,uBAAwBA,EAAO,iBAC/B,gBAAiBA,EAAO,UACxB,wBAAyBC,EAAiB,QAC1C,sBAAuBA,EAAiB,MACxC,sBAAuBA,EAAiB,MACxC,yBAA0BA,EAAiB,SAC3C,uBAAwBA,EAAiB,OACzC,qBAAsBA,EAAiB,KACvC,qBAAsBA,EAAiB,KACvC,+BAAgCA,EAAiB,eACjD,+BAAgCA,EAAiB,eACjD,wBAAyBA,EAAiB,OAC9C,EACgBntK,CAAG,CACnB,CAEA,SAASi4J,GAAyB7vJ,EAAQ,CACxC,MAAM8T,EAAO,OAAO9T,GAAQ,UAAU,QAAQ,MAAQ,EAAE,EAAE,YAAW,EACrE,OAAO8T,IAAS,UAAYA,IAAS,QACvC,CAEA,SAASkxJ,GAAyB3vK,EAAU,GAAI,CAC9C,MAAM4B,EAAO,CAAA,EACb,GAAI,CAAC5B,GAAW,OAAOA,GAAY,SAAU,OAAO4B,EAEpD,UAAWD,KAAQ2sK,GACb,OAAO,UAAU,eAAe,KAAKtuK,EAAS2B,CAAI,IACpDC,EAAKD,CAAI,EAAIytK,GAAkBpvK,EAAQ2B,CAAI,CAAC,GAI5C,OAAO,UAAU,eAAe,KAAK3B,EAAS,YAAY,IAC5D4B,EAAK,WAAawtK,GAAkBpvK,EAAQ,UAAU,GAEpD,OAAO,UAAU,eAAe,KAAKA,EAAS,YAAY,GAAK,CAAC,OAAO,UAAU,eAAe,KAAK4B,EAAM,YAAY,IACzHA,EAAK,WAAawtK,GAAkBpvK,EAAQ,UAAU,GAGxD,MAAMsvK,EAAYtvK,EAAQ,UACtBsvK,GAAa,OAAOA,GAAc,WAChC,OAAO,UAAU,eAAe,KAAKA,EAAW,WAAW,IAAG1tK,EAAK,cAAgBwtK,GAAkBE,EAAU,SAAS,GACxH,OAAO,UAAU,eAAe,KAAKA,EAAW,UAAU,IAAG1tK,EAAK,aAAewtK,GAAkBE,EAAU,QAAQ,GACrH,OAAO,UAAU,eAAe,KAAKA,EAAW,cAAc,IAAG1tK,EAAK,iBAAmBwtK,GAAkBE,EAAU,YAAY,GACjI,OAAO,UAAU,eAAe,KAAKA,EAAW,aAAa,IAAG1tK,EAAK,gBAAkBwtK,GAAkBE,EAAU,WAAW,GAC9H,OAAO,UAAU,eAAe,KAAKA,EAAW,mBAAmB,IAAG1tK,EAAK,sBAAwBwtK,GAAkBE,EAAU,iBAAiB,GAChJ,OAAO,UAAU,eAAe,KAAKA,EAAW,kBAAkB,IAAG1tK,EAAK,qBAAuBwtK,GAAkBE,EAAU,gBAAgB,GAC7I,OAAO,UAAU,eAAe,KAAKA,EAAW,sBAAsB,IAAG1tK,EAAK,qBAAuBwtK,GAAkBE,EAAU,oBAAoB,GACrJ,OAAO,UAAU,eAAe,KAAKA,EAAW,gBAAgB,IAAG1tK,EAAK,mBAAqB0tK,EAAU,iBAAmB,KAGhI,MAAMC,EAAYvvK,EAAQ,UACtBuvK,GAAa,OAAOA,GAAc,WAChC,OAAO,UAAU,eAAe,KAAKA,EAAW,YAAY,IAAG3tK,EAAK,eAAiBwtK,GAAkBG,EAAU,UAAU,GAC3H,OAAO,UAAU,eAAe,KAAKA,EAAW,WAAW,IAAG3tK,EAAK,cAAgBwtK,GAAkBG,EAAU,SAAS,GACxH,OAAO,UAAU,eAAe,KAAKA,EAAW,cAAc,IAAG3tK,EAAK,iBAAmBwtK,GAAkBG,EAAU,YAAY,GACjI,OAAO,UAAU,eAAe,KAAKA,EAAW,aAAa,IAAG3tK,EAAK,gBAAkBwtK,GAAkBG,EAAU,WAAW,GAC9H,OAAO,UAAU,eAAe,KAAKA,EAAW,cAAc,IAAG3tK,EAAK,iBAAmBwtK,GAAkBG,EAAU,YAAY,GACjI,OAAO,UAAU,eAAe,KAAKA,EAAW,eAAe,IAAG3tK,EAAK,kBAAoB2tK,EAAU,gBAAkB,IACvH,OAAO,UAAU,eAAe,KAAKA,EAAW,YAAY,IAAG3tK,EAAK,eAAiB2tK,EAAU,aAAe,IAC9G,OAAO,UAAU,eAAe,KAAKA,EAAW,qBAAqB,IACvE3tK,EAAK,6BAA+B2tK,EAAU,sBAAwB,IAEpE,OAAO,UAAU,eAAe,KAAKA,EAAW,iBAAiB,IACnE3tK,EAAK,oBAAsBwtK,GAAkBG,EAAU,eAAe,IAI1E,MAAME,EAASzvK,EAAQ,OACnByvK,GAAU,OAAOA,GAAW,WAC1B,OAAO,UAAU,eAAe,KAAKA,EAAQ,SAAS,IAAG7tK,EAAK,cAAgB6tK,EAAO,UAAY,IACjG,OAAO,UAAU,eAAe,KAAKA,EAAQ,OAAO,IAAG7tK,EAAK,YAAc6tK,EAAO,QAAU,IAC3F,OAAO,UAAU,eAAe,KAAKA,EAAQ,OAAO,IAAG7tK,EAAK,YAAc6tK,EAAO,QAAU,IAC3F,OAAO,UAAU,eAAe,KAAKA,EAAQ,gBAAgB,IAAG7tK,EAAK,qBAAuBwtK,GAAkBK,EAAO,cAAc,GACnI,OAAO,UAAU,eAAe,KAAKA,EAAQ,YAAY,IAAG7tK,EAAK,iBAAmBwtK,GAAkBK,EAAO,UAAU,GACvH,OAAO,UAAU,eAAe,KAAKA,EAAQ,iBAAiB,IAAG7tK,EAAK,sBAAwBwtK,GAAkBK,EAAO,eAAe,GACtI,OAAO,UAAU,eAAe,KAAKA,EAAQ,oBAAoB,IAAG7tK,EAAK,yBAA2BwtK,GAAkBK,EAAO,kBAAkB,GAC/I,OAAO,UAAU,eAAe,KAAKA,EAAQ,iBAAiB,IAAG7tK,EAAK,sBAAwBwtK,GAAkBK,EAAO,eAAe,GACtI,OAAO,UAAU,eAAe,KAAKA,EAAQ,iBAAiB,IAAG7tK,EAAK,sBAAwBwtK,GAAkBK,EAAO,eAAe,GACtI,OAAO,UAAU,eAAe,KAAKA,EAAQ,eAAe,IAAG7tK,EAAK,oBAAsBwtK,GAAkBK,EAAO,aAAa,GAChI,OAAO,UAAU,eAAe,KAAKA,EAAQ,kBAAkB,IAAG7tK,EAAK,uBAAyBwtK,GAAkBK,EAAO,gBAAgB,GACzI,OAAO,UAAU,eAAe,KAAKA,EAAQ,WAAW,IAAG7tK,EAAK,gBAAkBwtK,GAAkBK,EAAO,SAAS,IAG1H,MAAMC,EAAmB1vK,EAAQ,iBACjC,OAAI0vK,GAAoB,OAAOA,GAAqB,WAC9C,OAAO,UAAU,eAAe,KAAKA,EAAkB,SAAS,IAAG9tK,EAAK,wBAA0B8tK,EAAiB,UAAY,IAC/H,OAAO,UAAU,eAAe,KAAKA,EAAkB,OAAO,IAAG9tK,EAAK,sBAAwB8tK,EAAiB,QAAU,IACzH,OAAO,UAAU,eAAe,KAAKA,EAAkB,OAAO,IAAG9tK,EAAK,sBAAwB8tK,EAAiB,QAAU,IACzH,OAAO,UAAU,eAAe,KAAKA,EAAkB,UAAU,IAAG9tK,EAAK,yBAA2BwtK,GAAkBM,EAAiB,QAAQ,GAC/I,OAAO,UAAU,eAAe,KAAKA,EAAkB,QAAQ,IAAG9tK,EAAK,uBAAyBwtK,GAAkBM,EAAiB,MAAM,GACzI,OAAO,UAAU,eAAe,KAAKA,EAAkB,MAAM,IAAG9tK,EAAK,qBAAuBwtK,GAAkBM,EAAiB,IAAI,GACnI,OAAO,UAAU,eAAe,KAAKA,EAAkB,MAAM,IAAG9tK,EAAK,qBAAuBwtK,GAAkBM,EAAiB,IAAI,GACnI,OAAO,UAAU,eAAe,KAAKA,EAAkB,gBAAgB,IAAG9tK,EAAK,+BAAiCwtK,GAAkBM,EAAiB,cAAc,GACjK,OAAO,UAAU,eAAe,KAAKA,EAAkB,gBAAgB,IAAG9tK,EAAK,+BAAiCwtK,GAAkBM,EAAiB,cAAc,GACjK,OAAO,UAAU,eAAe,KAAKA,EAAkB,SAAS,IAAG9tK,EAAK,wBAA0BwtK,GAAkBM,EAAiB,OAAO,IAG3I9tK,CACT,CAEA,SAASguK,GAAwBjlK,EAAQtL,EAAW,GAAI,CACtD,MAAM+uB,EAAO,CAACzsB,EAAMqiE,EAAe,SAAc,CAC/C,GAAI,OAAOr5D,IAAShJ,CAAI,GAAM,WAAY,CACxC,MAAMvC,EAAQuL,EAAOhJ,CAAI,EAAC,EAC1B,GAAIvC,IAAU,SAAcA,IAAU,MAAQ4kE,GAAgB,MAC5D,OAAOorG,GAAkBhwK,CAAK,CAElC,CACA,GAAI,OAAO,UAAU,eAAe,KAAKC,EAAUsC,CAAI,EAAG,CACxD,MAAMvC,EAAQC,EAASsC,CAAI,EAC3B,GAAIvC,IAAU,SAAcA,IAAU,MAAQ4kE,GAAgB,MAC5D,OAAOorG,GAAkBhwK,CAAK,CAElC,CACA,OAAO4kE,CACT,EAEA,MAAO,CACL,WAAY51C,EAAK,aAAc,IAAI,EACnC,qBAAsBA,EAAK,uBAAwB,UAAU,EAC7D,cAAeA,EAAK,gBAAiB,MAAM,EAC3C,UAAW,CACT,UAAWA,EAAK,gBAAiB,CAAC,EAClC,SAAUA,EAAK,eAAgB,CAAC,EAChC,aAAcA,EAAK,mBAAoB,CAAC,EACxC,YAAaA,EAAK,kBAAmB,CAAC,EACtC,kBAAmBA,EAAK,wBAAyB,CAAC,EAClD,iBAAkBA,EAAK,uBAAwB,CAAC,EAChD,qBAAsBA,EAAK,uBAAwB,CAAC,EACpD,eAAgBA,EAAK,qBAAsB,EAAK,CACtD,EACI,UAAW,CACT,WAAYA,EAAK,iBAAkB,CAAC,EACpC,UAAWA,EAAK,gBAAiB,CAAC,EAClC,aAAcA,EAAK,mBAAoB,CAAC,EACxC,YAAaA,EAAK,kBAAmB,CAAC,EACtC,aAAcA,EAAK,mBAAoB,EAAG,EAC1C,oBAAqBA,EAAK,+BAAgC,EAAI,EAC9D,WAAYA,EAAK,iBAAkB,EAAK,EACxC,cAAeA,EAAK,oBAAqB,EAAK,EAC9C,gBAAiBA,EAAK,sBAAuB,IAAI,CACvD,EACI,OAAQ,CACN,QAASA,EAAK,gBAAiB,EAAK,EACpC,MAAOA,EAAK,cAAe,EAAI,EAC/B,MAAOA,EAAK,cAAe,EAAK,EAChC,eAAgBA,EAAK,uBAAwB,IAAI,EACjD,WAAYA,EAAK,mBAAoB,IAAI,EACzC,gBAAiBA,EAAK,wBAAyB,IAAI,EACnD,mBAAoBA,EAAK,2BAA4B,IAAI,EACzD,gBAAiBA,EAAK,wBAAyB,IAAI,EACnD,gBAAiBA,EAAK,wBAAyB,IAAI,EACnD,cAAeA,EAAK,sBAAuB,IAAI,EAC/C,iBAAkBA,EAAK,yBAA0B,IAAI,EACrD,UAAWA,EAAK,kBAAmB,IAAI,CAC7C,EACI,iBAAkB,CAChB,UAAWosI,GAAyB7vJ,CAAM,EAC1C,QAASyjB,EAAK,0BAA2B,EAAK,EAC9C,MAAOA,EAAK,wBAAyB,EAAI,EACzC,MAAOA,EAAK,wBAAyB,EAAK,EAC1C,SAAUA,EAAK,2BAA4B,IAAI,EAC/C,OAAQA,EAAK,yBAA0B,IAAI,EAC3C,KAAMA,EAAK,uBAAwB,IAAI,EACvC,KAAMA,EAAK,uBAAwB,IAAI,EACvC,eAAgBA,EAAK,iCAAkC,IAAI,EAC3D,eAAgBA,EAAK,iCAAkC,IAAI,EAC3D,QAASA,EAAK,0BAA2B,IAAI,CACnD,CACA,CACA,CAcO,MAAMyhJ,WAA2BxB,EAAS,CAC/C,OAAO,GAAK,aAEZ,YAAYruK,EAAU,GAAI,CACxB,MAAMA,CAAO,EACb,KAAK,cAAgB2vK,GAAyB3vK,CAAO,EACrD,KAAK,kBAAoB,EACzB,KAAK,MAAQ4vK,GAAwB,KAAM,KAAK,aAAa,CAC/D,CAEA,OAAO/jK,EAAS,CACd,aAAM,OAAOA,CAAO,EACpB,KAAK,WAAW,KAAK,QAAQ,UAAU,KAAK,SAAS,OAAQ,oBAAsBpK,GAAU,CAC3F,MAAME,EAAO,OAAOF,GAAO,QAAQ,MAAQ,EAAE,EAC7C,GAAI,KAAK,kBAAoB,GAAK,CAAC+sK,GAAmB,IAAI7sK,CAAI,EAAG,OACjE,MAAMmuK,EAAarB,GAAwB9sK,CAAI,GAAK,KACpD,KAAK,WAAW,iBAAkB,CAChC,KAAAA,EACA,MAAOytK,GAAkB3tK,GAAO,QAAQ,KAAK,EAC7C,OAAQA,GAAO,QAAQ,OACvB,cAAeA,GAAO,QAAQ,gBAAkB,GAChD,YAAaquK,EAAa,CAACA,CAAU,EAAI,CAAA,CACjD,CAAO,CACH,CAAC,CAAC,EACE,OAAO,KAAK,KAAK,aAAa,EAAE,OAAS,GAC3C,KAAK,YAAY,KAAK,cAAe,CAAE,OAAQ,GAAM,EAEvD,KAAK,WAAW,SAAU,CAAE,OAAQ,UAAW,cAAe,GAAO,EAC9D,IACT,CAEA,OAAO9vK,EAAU,GAAI,CACnB,MAAM,OAAOA,CAAO,EACpB,MAAMotD,EAAQuiH,GAAyB3vK,CAAO,EAC9C,OAAK,OAAO,KAAKotD,CAAK,EAAE,QACxB,KAAK,cAAgB,CAAE,GAAG,KAAK,cAAe,GAAGA,CAAK,EACtD,KAAK,YAAYA,EAAO,CAAE,OAAQ,EAAI,CAAE,EACxC,KAAK,WAAW,UAAW,CAAE,OAAQ,UAAW,cAAe,GAAO,EAC/D,MAJgC,IAKzC,CAEA,WAAY,CACV,MAAO,CACL,QAAS,KAAK,eAAc,CAClC,CACE,CAEA,cAAe,CACb,MAAM2iH,EAAoB,CAACnB,EAAUC,IAAiB9lC,GAAW,KAAK,GAAG,SAAWtnI,GAAU,CAC5F,MAAMgK,EAAShK,GAAO,QAAUA,GAAS,CAAA,EACpCktK,GAA4BljK,EAAQmjK,EAAUC,CAAW,GAC9D9lC,EAAO,OAAWt9H,CAAM,CAC1B,CAAC,EACKX,EAAQ,KAAK,eAAc,EAC3BklK,EAAa5wK,GACb,MAAM,QAAQA,CAAK,EAAU,QAC7B,OAAOA,GAAU,UAAkB,UACnC,OAAOA,GAAU,SAAiB,SAClC,OAAOA,GAAU,SAAiB,SAC/B,SAEH6wK,EAAiB1tK,GAAQ,CAC7B,MAAM2tK,EAAc,KAAK,eAAc,EACjC9jH,EAAgBijH,GAAyB9sK,EAAK2tK,CAAW,EACzD9gD,EAAW,OAAO,KAAK7sH,CAAG,GAAM,WAClC,KAAKA,CAAG,EAAC,EACT6pD,EACEhtD,EAAkCgwH,GAA+BhjE,EACvE,MAAO,CACL,YAAa,cAAc7pD,CAAG,YAC9B,QAAS6sK,GAAkBhwK,CAAK,EAChC,KAAM4wK,EAAU5wK,CAAK,EACrB,MAAO,YACP,QAASqvK,GAAwBlsK,CAAG,EAAI,CAACksK,GAAwBlsK,CAAG,CAAC,EAAI,CAAA,EACzE,GAAI,CAAE,MAAO4sK,GAAuB5sK,CAAG,EAAG,WAAYytK,EAAU5wK,CAAK,IAAM,UAAY,SAAW,MAAM,EACxG,OAAQ,IAAO,OAAO,KAAKmD,CAAG,GAAM,WAChC6sK,GAAkB,KAAK7sK,CAAG,EAAC,GAAM8sK,GAAyB9sK,EAAK,KAAK,gBAAgB,CAAC,EACrF6sK,GAAkBC,GAAyB9sK,EAAK,KAAK,eAAc,CAAE,CAAC,EAC1E,OAASsvG,GAAc,KAAK,sBAAsBtvG,EAAKsvG,CAAS,EAChE,UAAWk+D,EAAkBxtK,EAAKksK,GAAwBlsK,CAAG,CAAC,CACtE,CACI,EACM4tK,EAAe,CAAC5tK,EAAKuiB,KAAW,CACpC,YAAa,cAAcA,EAAM,YAAW,CAAE,aAC9C,QAASsqJ,GAAkBtkK,EAAMvI,CAAG,CAAC,EACrC,KAAM,SACN,MAAO,YACP,QAAS,CAAC,cAAcA,CAAG,EAAE,EAC7B,GAAI,CAAE,MAAAuiB,EAAO,WAAY,QAAQ,EACjC,OAAQ,IAAMsqJ,GAAkB,KAAK,eAAc,EAAG7sK,CAAG,CAAC,EAC1D,OAASnD,GAAU,KAAK,OAAO,CAAE,CAACmD,CAAG,EAAGnD,EAAO,EAC/C,UAAW2wK,EAAkBxtK,EAAK,cAAcA,CAAG,EAAE,CAC3D,GACI,MAAO,CACL,MAAO,CACL,YAAa,0CACb,QAAS,KAAK,UAAS,EACvB,KAAM,SACN,MAAO,YACP,QAAS,CAAC,kBAAkB,EAC5B,OAAQ,IAAM,KAAK,UAAS,EAC5B,OAASnD,GAAU,KAAK,QAAQA,CAAK,EACrC,UAAW,IAAM,IAAM,CAAC,CAChC,EACM,WAAY,CACV,YAAa,0BACb,QAASgwK,GAAkBtkK,EAAM,UAAU,EAC3C,KAAM,QACN,MAAO,YACP,QAAS,CAAC,uBAAuB,EACjC,GAAI,CAAE,MAAO,aAAc,WAAY,OAAO,EAC9C,OAAQ,IAAMskK,GAAkB,KAAK,eAAc,EAAG,UAAU,EAChE,OAAShwK,GAAU,KAAK,sBAAsB,aAAcA,CAAK,EACjE,UAAW2wK,EAAkB,aAAc,uBAAuB,CAC1E,EACM,qBAAsB,CACpB,YAAa,0BACb,QAASjlK,EAAM,qBACf,KAAM,SACN,MAAO,YACP,QAAS,CAAC,iCAAiC,EAC3C,GAAI,CACF,MAAO,oBACP,WAAY,SACZ,QAAS,CAAC,WAAY,QAAS,KAAK,CAC9C,EACQ,OAAQ,IAAM,KAAK,eAAc,EAAG,qBACpC,OAAS1L,GAAU,KAAK,sBAAsB,uBAAwBA,CAAK,EAC3E,UAAW2wK,EAAkB,uBAAwB,iCAAiC,CAC9F,EACM,cAAe,CACb,YAAa,iCACb,QAASjlK,EAAM,cACf,KAAM,SACN,MAAO,YACP,QAAS,CAAC,0BAA0B,EACpC,GAAI,CACF,MAAO,gBACP,WAAY,SACZ,QAAS,CAAC,OAAQ,MAAO,IAAI,CACvC,EACQ,OAAQ,IAAM,KAAK,eAAc,EAAG,cACpC,OAAS1L,GAAU,KAAK,sBAAsB,gBAAiBA,CAAK,EACpE,UAAW2wK,EAAkB,gBAAiB,0BAA0B,CAChF,EACM,UAAWI,EAAa,YAAa,YAAY,EACjD,UAAWA,EAAa,YAAa,YAAY,EACjD,OAAQA,EAAa,SAAU,SAAS,EACxC,iBAAkBA,EAAa,mBAAoB,mBAAmB,EACtE,GAAG,OAAO,YAAY7B,GACnB,OAAQ/rK,GAAQ,CAAC,CAAC,aAAc,uBAAwB,eAAe,EAAE,SAASA,CAAG,CAAC,EACtF,IAAKA,GAAQ,CAACA,EAAK0tK,EAAc1tK,CAAG,CAAC,CAAC,CAAC,CAChD,CACE,CAEA,QAAQkE,EAAW,GAAI,CACrB,MAAMzG,EAAUyG,GAAU,SAAW,OAAOA,EAAS,SAAY,SAAWA,EAAS,QAAU,CAAA,EAC/F,YAAK,OAAOzG,CAAO,EACnB,KAAK,WAAW,UAAW,CAAE,OAAQ,UAAW,cAAe,GAAO,EAC/D,IACT,CAEA,WAAWA,EAAS,CAClB,OAAI,UAAU,SAAW,EAAU,KAAK,eAAc,EAC/C,KAAK,OAAOA,CAAO,CAC5B,CAEA,0BAA2B,CACzB,OAAOw6J,GAAyB,KAAK,SAAS,QAAU,IAAI,CAC9D,CAEA,gBAAiB,CACf,OAAOoV,GAAwB,KAAK,SAAS,QAAU,KAAM,KAAK,aAAa,CACjF,CAEA,WAAWxsK,EAAQqI,EAAS,GAAI,CAC9B,YAAK,MAAQ,KAAK,eAAc,EAChC,KAAK,KAAK,SAAU,CAAE,OAAArI,EAAQ,MAAO,KAAK,MAAO,GAAGqI,EAAQ,EACrD,IACT,CAEA,YAAY2hD,EAAQ,CAAA,EAAI,CAAE,OAAAgjH,EAAS,EAAK,EAAK,GAAI,CAC/C,MAAMzlK,EAAS,KAAK,SAAS,QAAU,KACvC,GAAI,CAACA,EACH,YAAK,MAAQilK,GAAwB,KAAM,CAAE,GAAG,KAAK,cAAe,GAAGxiH,EAAO,EACvE,KAET,KAAK,mBAAqB,EAC1B,GAAI,CACF,SAAW,CAACzrD,EAAMvC,CAAK,IAAK,OAAO,QAAQguD,CAAK,EAAG,CACjD,MAAMo+B,EAAW7pF,IAAS,aAAe,aAAeA,EACpD,CAAC4sK,GAAkB,IAAI/iF,CAAQ,GAAKA,IAAa,cACjD,OAAO7gF,IAAS6gF,CAAQ,GAAM,YAClC7gF,EAAO6gF,CAAQ,EAAE4jF,GAAkBhwK,CAAK,CAAC,CAC3C,CACF,QAAC,CACC,KAAK,kBAAoB,KAAK,IAAI,EAAG,KAAK,kBAAoB,CAAC,CACjE,CACA,YAAK,MAAQ,KAAK,eAAc,EAC3BgxK,GAAQ,KAAK,WAAW,OAAO,EAC7B,IACT,CAEA,sBAAsB7tK,EAAKnD,EAAO,CAChC,MAAMguD,EAAQuiH,GAAyB,CAAE,CAACptK,CAAG,EAAGnD,CAAK,CAAE,EACvD,GAAI,CAAC,OAAO,KAAKguD,CAAK,EAAE,OAAQ,OAAO,KACvC,KAAK,cAAgB,CAAE,GAAG,KAAK,cAAe,GAAGA,CAAK,EACtD,MAAMziD,EAAS,KAAK,SAAS,QAAU,KACvC,GAAI,CAACA,EACH,YAAK,MAAQilK,GAAwB,KAAM,KAAK,aAAa,EACtD,KAET,KAAK,mBAAqB,EAC1BjlK,EAAO,8BAAgCA,EAAO,8BAAgC,GAAK,EACnF,GAAI,CACF,SAAW,CAAChJ,EAAMkwG,CAAS,IAAK,OAAO,QAAQzkD,CAAK,EAAG,CACrD,MAAMo+B,EAAW7pF,IAAS,aAAe,aAAeA,EACpD,CAAC4sK,GAAkB,IAAI/iF,CAAQ,GAAKA,IAAa,cACjD,OAAO7gF,IAAS6gF,CAAQ,GAAM,YAClC7gF,EAAO6gF,CAAQ,EAAEqmB,CAAS,CAC5B,CACF,QAAC,CACClnG,EAAO,6BAA+B,KAAK,IAAI,GAAIA,EAAO,8BAAgC,GAAK,CAAC,EAChG,KAAK,kBAAoB,KAAK,IAAI,EAAG,KAAK,kBAAoB,CAAC,CACjE,CACA,OAAO,IACT,CACF,CAEA,UAAWs9I,KAAgBqmB,GACzBuB,GAAmB,UAAU5nB,CAAY,EAAI,SAAkB7oJ,EAAO,CACpE,MAAMuL,EAAS,KAAK,SAAS,QAAU,KACvC,GAAI,UAAU,SAAW,EACvB,OAAI,OAAOA,IAASs9I,CAAY,GAAM,WAC7BmnB,GAAkBzkK,EAAOs9I,CAAY,GAAG,EAE1CmnB,GAAkB,KAAK,cAAcnnB,CAAY,CAAC,EAG3D,GAAI,CAACt9I,GAAU,OAAOA,IAASs9I,CAAY,GAAM,WAC/C,YAAK,cAAcA,CAAY,EAAImnB,GAAkBhwK,CAAK,EAC1D,KAAK,WAAW,eAAgB,CAC9B,KAAM6oJ,EACN,OAAQ,UACR,cAAe,GACf,YAAa,CAACwmB,GAAwBxmB,CAAY,CAAC,EAAE,OAAO,OAAO,CAC3E,CAAO,EACM,KAGT,KAAK,mBAAqB,EAC1B,GAAI,CACFt9I,EAAOs9I,CAAY,EAAEmnB,GAAkBhwK,CAAK,CAAC,CAC/C,QAAC,CACC,KAAK,kBAAoB,KAAK,IAAI,EAAG,KAAK,kBAAoB,CAAC,CACjE,CACA,YAAK,WAAW,UAAW,CACzB,KAAM6oJ,EACN,OAAQ,UACR,cAAe,GACf,YAAa,CAACwmB,GAAwBxmB,CAAY,CAAC,EAAE,OAAO,OAAO,CACzE,CAAK,EACM,IACT,EAGF4nB,GAAmB,UAAU,WAAa,SAAoBzwK,EAAO,CACnE,OAAI,UAAU,SAAW,EAAU,KAAK,WAAU,EAC3C,KAAK,WAAWA,CAAK,CAC9B,EC3tBA,SAAS4mI,GAAU9kI,EAAQ6wG,EAAWtuG,EAASzD,EAAS,CACtD,MAAI,CAACkB,GAAU,OAAOuC,GAAY,WAAmB,IAAM,CAAC,EACxD,OAAOvC,EAAO,IAAO,WAChBA,EAAO,GAAG6wG,EAAWtuG,EAASzD,CAAO,IAAM,IAAM,CAAC,GAEvD,OAAOkB,EAAO,kBAAqB,YACrCA,EAAO,iBAAiB6wG,EAAWtuG,EAASzD,CAAO,EAC5C,IAAMkB,EAAO,oBAAoB6wG,EAAWtuG,EAASzD,CAAO,GAE9D,IAAM,CAAC,CAChB,CAEO,MAAMqwK,EAAgB,CAC3B,YAAYxpB,EAAS,CACnB,KAAK,QAAUA,CACjB,CAEA,IAAI,QAAS,CACX,OAAO,KAAK,QAAQ,QAAU,IAChC,CAEA,IAAI,SAAU,CACZ,OAAO,KAAK,QAAQ,SAAW,IACjC,CAEA,IAAI,IAAK,CACP,OAAO,KAAK,QAAQ,IAAM,IAC5B,CAEA,IAAI,WAAY,CACd,OAAO,KAAK,OACd,CAEA,UAAU3lJ,EAAQ6wG,EAAWtuG,EAASzD,EAAS,CAC7C,OAAOgmI,GAAU9kI,EAAQ6wG,EAAWtuG,EAASzD,CAAO,CACtD,CAEA,YAAYwR,EAAI,CACd,OAAO,KAAK,QAAQ,IAAIA,CAAE,CAC5B,CACF,CCxBO,MAAM8+J,EAAgB,CAC3B,YAAY3lK,EAAQ4oE,EAAU,CAC5B,KAAK,OAAS5oE,GAAU,KACxB,KAAK,SAAW4oE,EAChB,KAAK,GAAK,KACV,KAAK,UAAY,IAAI,IACrB,KAAK,iBAAmB,IAAI,GAC9B,CAEA,MAAM2yC,EAAI,CACR,YAAK,GAAKA,GAAM,KACT,IACT,CAEA,IAAI10G,EAAI,CACN,OAAO,KAAK,UAAU,IAAI,OAAOA,GAAM,EAAE,EAAE,MAAM,CACnD,CAEA,IAAIA,EAAI,CACN,OAAO,KAAK,UAAU,IAAI,OAAOA,GAAM,EAAE,EAAE,KAAI,CAAE,GAAK,IACxD,CAEA,SAAU,CACR,OAAO,MAAM,KAAK,KAAK,UAAU,QAAO,CAAE,CAC5C,CAEA,QAAS,CACP,OAAO,MAAM,KAAK,KAAK,UAAU,OAAM,CAAE,CAC3C,CAEA,IAAI++J,EAAcvwK,EAAU,GAAI,CAC9B,GAAI,OAAOuwK,GAAiB,SAAU,CACpC,MAAM7yH,EAAW,KAAK,IAAI6yH,CAAY,EACtC,GAAI7yH,EACF,OAAAA,EAAS,OAAO19C,CAAO,EAChB09C,EAET,MAAM14B,EAAU,KAAK,SAAS,OAAOurJ,EAAcvwK,CAAO,EAC1D,OAAO,KAAK,QAAQglB,CAAO,CAC7B,CAEA,MAAMojI,EAAWmoB,EACjB,GAAI,EAAEnoB,aAAoBimB,MAAc,CAACjmB,GAAY,OAAOA,EAAS,QAAW,YAC9E,MAAM,IAAI,UAAU,8EAA8E,EAEpG,OAAIpoJ,GAAW,OAAOA,GAAY,UAAY,OAAO,KAAKA,CAAO,EAAE,OAAS,GAC1EooJ,EAAS,SAASpoJ,CAAO,EAEpB,KAAK,QAAQooJ,CAAQ,CAC9B,CAEA,OAAO52I,EAAI,CACT,MAAMjP,EAAM,OAAOiP,GAAM,EAAE,EAAE,KAAI,EAC3BksC,EAAW,KAAK,UAAU,IAAIn7C,CAAG,EACvC,OAAKm7C,GACL,KAAK,iBAAiB,IAAIn7C,CAAG,IAAC,EAC9B,KAAK,iBAAiB,OAAOA,CAAG,EAChCm7C,EAAS,SAAM,EACf,KAAK,UAAU,OAAOn7C,CAAG,EAClB,IALe,EAMxB,CAEA,WAAY,CACV,SAAW,CAACiP,EAAI42I,CAAQ,IAAK,KAAK,UAAU,UAC1C,GAAI,CACF,KAAK,iBAAiB,IAAI52I,CAAE,IAAC,EAC7B,KAAK,iBAAiB,OAAOA,CAAE,EAC/B42I,EAAS,SAAM,CACjB,QAAC,CACC,KAAK,UAAU,OAAO52I,CAAE,CAC1B,CAEF,OAAO,IACT,CAEA,SAAU,CACR,KAAK,UAAS,EACd,KAAK,GAAK,KACV,KAAK,OAAS,IAChB,CAEA,WAAY,CACV,MAAM/K,EAAW,CAAA,EACjB,SAAW,CAAC+K,EAAI42I,CAAQ,IAAK,KAAK,UAAU,UACtC,OAAOA,EAAS,WAAc,aAClC3hJ,EAAS+K,CAAE,EAAI42I,EAAS,UAAS,GAEnC,OAAO3hJ,CACT,CAEA,QAAQA,EAAW,GAAI,CACrB,GAAI,CAACA,GAAY,OAAOA,GAAa,SAAU,OAAO,KACtD,SAAW,CAAC+K,EAAI1G,CAAK,IAAK,OAAO,QAAQrE,CAAQ,GAC9B,KAAK,IAAI+K,CAAE,IAAM,KAAK,SAAS,IAAIA,CAAE,EAAI,KAAK,IAAIA,CAAE,EAAI,QAC/D,UAAU1G,CAAK,EAE3B,OAAO,IACT,CAEA,QAAQs9I,EAAU,CAChB,MAAM52I,EAAK,OAAO42I,GAAU,IAAMA,GAAU,aAAa,IAAM,EAAE,EAAE,KAAI,EACvE,GAAI,CAAC52I,EAAI,MAAM,IAAI,MAAM,sCAAsC,EAC/D,MAAMksC,EAAW,KAAK,UAAU,IAAIlsC,CAAE,EAClCksC,GAAYA,IAAa0qG,IAC3B,KAAK,iBAAiB,IAAI52I,CAAE,IAAC,EAC7B,KAAK,iBAAiB,OAAOA,CAAE,EAC/BksC,EAAS,SAAM,GAEjB0qG,EAAS,GAAK52I,EACd,KAAK,UAAU,IAAIA,EAAI42I,CAAQ,EAC/B,GAAI,CACFA,EAAS,SAAS,IAAIioB,GAAgB,IAAI,CAAC,CAC7C,OAASpsK,EAAO,CACd,WAAK,UAAU,OAAOuN,CAAE,EAClBvN,CACR,CACA,MAAMmvG,EAAe,KAAK,QAAQ,QAAU,KAAK,QAAQ,QACzD,GAAI,OAAOg1C,EAAS,cAAiB,YAAc,OAAOh1C,GAAc,UAAa,WAAY,CAC/F,MAAM1uF,EAAU0jI,EAAS,aAAY,EACrC,GAAI1jI,GAAW,OAAOA,GAAY,SAAU,CAC1C,MAAM2vF,EAAUjB,EAAa,SAASg1C,EAAU,aAAa52I,CAAE,GAAIkT,CAAO,EACtE,OAAO2vF,GAAY,YAAY,KAAK,iBAAiB,IAAI7iG,EAAI6iG,CAAO,CAC1E,CACF,CACA,OAAO+zC,CACT,CACF,CClIO,MAAMooB,EAAiB,CAC5B,aAAc,CACZ,KAAK,SAAW,IAAI,GACtB,CAEA,SAASh/J,EAAI42I,EAAU,CACrB,MAAM7lJ,EAAM,OAAOiP,GAAM,EAAE,EAAE,KAAI,EACjC,GAAI,CAACjP,EAAK,MAAM,IAAI,MAAM,iEAAiE,EAC3F,GAAI,OAAO6lJ,GAAa,WACtB,MAAM,IAAI,UAAU,+BAA+B7lJ,CAAG,oCAAoC,EAE5F,YAAK,SAAS,IAAIA,EAAK6lJ,CAAQ,EACxB,IACT,CAEA,IAAI52I,EAAI,CACN,OAAO,KAAK,SAAS,IAAI,OAAOA,GAAM,EAAE,EAAE,MAAM,CAClD,CAEA,OAAOA,EAAIxR,EAAS,CAClB,MAAMuC,EAAM,OAAOiP,GAAM,EAAE,EAAE,KAAI,EAC3B4b,EAAQ,KAAK,SAAS,IAAI7qB,CAAG,EACnC,GAAI,CAAC6qB,EAAO,MAAM,IAAI,MAAM,qBAAqB7qB,CAAG,GAAG,EACvD,MAAMkuK,EAAWrjJ,EAAM,UAAY,IAAIA,EAAMptB,CAAO,EAAIotB,EAAMptB,CAAO,EACrE,GAAI,CAACywK,GAAY,OAAOA,GAAa,SACnC,MAAM,IAAI,MAAM,yBAAyBluK,CAAG,8BAA8B,EAE5E,OAAAkuK,EAAS,GAAKluK,EACPkuK,CACT,CACF,CC9BA,MAAMC,GAAqB,OAAO,OAAO,CACvC,WACA,SACA,SACA,QACA,SACA,gBACA,gBACA,iBACA,mBACA,cACA,wBACA,WACF,CAAC,EAED,SAASC,GAAiBvxK,EAAOC,EAAW,KAAM,CAChD,GAAID,GAAS,MAAQA,IAAU,GAAI,OAAOC,EAC1C,MAAMC,EAAU,OAAOF,CAAK,EAC5B,MAAI,CAAC,OAAO,SAASE,CAAO,GAAKA,GAAW,EAAUD,EAC/C,KAAK,IAAI,EAAG,KAAK,MAAMC,CAAO,CAAC,CACxC,CAEA,SAAS8vK,GAAkBhwK,EAAO,CAChC,GAAI,MAAM,QAAQA,CAAK,EAAG,OAAOA,EAAM,IAAKguB,GAAUgiJ,GAAkBhiJ,CAAK,CAAC,EAC9E,GAAI,YAAY,OAAOhuB,CAAK,EAAG,OAAO,MAAM,KAAKA,EAAQguB,GAAUgiJ,GAAkBhiJ,CAAK,CAAC,EAC3F,GAAI,CAAChuB,GAAS,OAAOA,GAAU,SAAU,OAAOA,EAChD,MAAMwC,EAAO,CAAA,EACb,SAAW,CAACW,EAAK6qB,CAAK,IAAK,OAAO,QAAQhuB,CAAK,EACzC,OAAOguB,GAAU,aACrBxrB,EAAKW,CAAG,EAAI6sK,GAAkBhiJ,CAAK,GAErC,OAAOxrB,CACT,CAEA,SAASgvK,GAAgBxxK,EAAOC,EAAW,KAAM,CAC/C,OAAID,GAAS,MAAQA,IAAU,GAAWC,EACnC,OAAOD,CAAK,EAAE,KAAI,EAAG,YAAW,GAAMC,CAC/C,CAEA,SAASwxK,GAAqB7wK,EAAU,GAAI,CAC1C,MAAM4B,EAAO,CAAA,EACb,MAAI,CAAC5B,GAAW,OAAOA,GAAY,WAE/B,OAAO,UAAU,eAAe,KAAKA,EAAS,UAAU,EAC1D4B,EAAK,SAAWw8I,GAA6Bp+I,EAAQ,SAAU,QAAQ,EAC9D,OAAO,UAAU,eAAe,KAAKA,EAAS,MAAM,EAC7D4B,EAAK,SAAWw8I,GAA6Bp+I,EAAQ,KAAM,QAAQ,EAC1D,OAAO,UAAU,eAAe,KAAKA,EAAS,UAAU,IACjE4B,EAAK,SAAWw8I,GAA6B,OAAOp+I,EAAQ,QAAQ,EAAE,QAAQ,YAAa,EAAE,EAAG,QAAQ,GAGtG,OAAO,UAAU,eAAe,KAAKA,EAAS,QAAQ,IACxD4B,EAAK,OAASy8I,GAA4Br+I,EAAQ,OAAQ,KAAK,GAE7D,OAAO,UAAU,eAAe,KAAKA,EAAS,QAAQ,IACxD4B,EAAK,OAASgvK,GAAgB5wK,EAAQ,OAAQ,IAAI,GAEhD,OAAO,UAAU,eAAe,KAAKA,EAAS,OAAO,IACvD4B,EAAK,MAAQ+uK,GAAiB3wK,EAAQ,MAAO,IAAI,GAE/C,OAAO,UAAU,eAAe,KAAKA,EAAS,QAAQ,IACxD4B,EAAK,OAAS+uK,GAAiB3wK,EAAQ,OAAQ,IAAI,GAEjD,OAAO,UAAU,eAAe,KAAKA,EAAS,YAAY,GAAKA,EAAQ,YAAc,OAAOA,EAAQ,YAAe,WACjH,OAAO,UAAU,eAAe,KAAKA,EAAQ,WAAY,OAAO,IAClE4B,EAAK,MAAQ+uK,GAAiB3wK,EAAQ,WAAW,MAAO,IAAI,GAE1D,OAAO,UAAU,eAAe,KAAKA,EAAQ,WAAY,QAAQ,IACnE4B,EAAK,OAAS+uK,GAAiB3wK,EAAQ,WAAW,OAAQ,IAAI,IAG9D,OAAO,UAAU,eAAe,KAAKA,EAAS,eAAe,IAC/D4B,EAAK,cAAgBi9I,GAAiC7+I,EAAQ,cAAe,CAAC,GAE5E,OAAO,UAAU,eAAe,KAAKA,EAAS,eAAe,IAC/D4B,EAAK,cAAgB5B,EAAQ,gBAAkB,IAE7C,OAAO,UAAU,eAAe,KAAKA,EAAS,gBAAgB,IAChE4B,EAAK,eAAiB5B,EAAQ,iBAAmB,IAE/C,OAAO,UAAU,eAAe,KAAKA,EAAS,kBAAkB,IAClE4B,EAAK,iBAAmB5B,EAAQ,mBAAqB,IAEnD,OAAO,UAAU,eAAe,KAAKA,EAAS,aAAa,IAC7D4B,EAAK,YAAck9I,GAAyB9+I,EAAQ,YAAa,CAAC,GAEhE,OAAO,UAAU,eAAe,KAAKA,EAAS,uBAAuB,IACvE4B,EAAK,sBAAwBw9I,GAAmCp/I,EAAQ,sBAAuB,EAAK,GAElG,OAAO,UAAU,eAAe,KAAKA,EAAS,WAAW,IAC3D4B,EAAK,UAAYy9I,GAA6Br/I,EAAQ,UAAW,UAAU,GAEzE,OAAO,UAAU,eAAe,KAAKA,EAAS,WAAW,IAC3D4B,EAAK,UAAY5B,EAAQ,YAAc,KAGlC4B,CACT,CAEA,SAASkvK,GAAiBjuK,EAAS,GAAI,CACrC,MAAMjB,EAAO,CAAA,EACb,UAAWW,KAAOmuK,GACX,OAAO,UAAU,eAAe,KAAK7tK,EAAQN,CAAG,IACrDX,EAAKW,CAAG,EAAI6sK,GAAkBvsK,EAAON,CAAG,CAAC,GAE3C,OAAOX,CACT,CAEA,SAASmvK,GAAuB3oB,EAAU4oB,EAAkB,KAAM,CAChE,MAAMlmK,EAAQs9I,GAAU,iBAAc,GAAQA,GAAU,OAAS,KACjE,MAAI,CAACt9I,GAAS,OAAOA,GAAU,SAAiB,CAAE,SAAU,GAAO,QAASkmK,CAAe,EAIpF,CAAE,SAAU,GAAM,QAHT,OAAO,UAAU,eAAe,KAAKlmK,EAAO,SAAS,EACjEA,EAAM,UAAY,GAClBkmK,CAC4B,CAClC,CAEA,SAASC,GAAmBtmK,EAAQ,CAClC,MAAMkrB,EAASlrB,GAAQ,UAAU,QAAU,KAC3C,MAAO,CACL,MAAO,OAAOA,GAAQ,QAAQ,MAAM,OAASA,GAAQ,MAAM,OAAS,CAAC,EACrE,OAAQ,OAAOA,GAAQ,QAAQ,MAAM,QAAUA,GAAQ,MAAM,QAAU,CAAC,EACxE,KAAMkrB,GAAQ,MAAQ,KACtB,WAAYA,GAAQ,YAAc,IACtC,CACA,CAeO,MAAMq7I,WAAyB7C,EAAS,CAC7C,OAAO,GAAK,WAEZ,YAAYruK,EAAU,GAAI,CACxB,MAAMA,CAAO,EACb,KAAK,OAAS,CACZ,SAAU,SACV,OAAQ,MACR,OAAQ,KACR,MAAO,KACP,OAAQ,KACR,cAAe,EACf,cAAe,GACf,eAAgB,GAChB,iBAAkB,GAClB,YAAa,EACb,sBAAuB,GACvB,UAAW,WACX,UAAW,GACX,GAAG6wK,GAAqB7wK,CAAO,CACrC,EACI,KAAK,MAAQ,KAAK,cAAa,CACjC,CAEA,OAAO6L,EAAS,CACd,MAAM,OAAOA,CAAO,EACpB,UAAW2F,IAAM,CAAC,aAAc,SAAU,UAAW,UAAW,QAAQ,EAAG,CACzE,MAAM2/J,EAAa,KAAK,SAAS,YAAY3/J,CAAE,EAC1C2/J,GAAY,IACjB,KAAK,WAAWA,EAAW,GAAG,SAAU,IAAM,CAC5C,KAAK,WAAW,GAAG3/J,CAAE,WAAW,CAClC,CAAC,CAAC,CACJ,CACA,YAAK,WAAW,KAAK,QAAQ,UAAU,KAAK,SAAS,OAAQ,mBAAoB,IAAM,CACrF,KAAK,WAAW,kBAAkB,CACpC,CAAC,CAAC,EACF,KAAK,WAAW,KAAK,QAAQ,UAAU,KAAK,SAAS,OAAQ,mBAAoB,IAAM,CACrF,KAAK,WAAW,kBAAkB,CACpC,CAAC,CAAC,EACF,KAAK,MAAQ,KAAK,cAAa,EAC/B,KAAK,WAAW,QAAQ,EACjB,IACT,CAEA,OAAOxR,EAAU,GAAI,CACnB,MAAM,OAAOA,CAAO,EACpB,MAAMotD,EAAQyjH,GAAqB7wK,CAAO,EAC1C,OAAI,OAAO,KAAKotD,CAAK,EAAE,SAAW,EAAU,MAC5C,KAAK,OAAS,CACZ,GAAG,KAAK,OACR,GAAGA,CACT,EACI,KAAK,MAAQ,KAAK,cAAa,EAC/B,KAAK,WAAW,SAAS,EAClB,KACT,CAEA,WAAY,CACV,MAAO,CACL,QAAS0jH,GAAiB,KAAK,MAAM,CAC3C,CACE,CAEA,QAAQrqK,EAAW,GAAI,CACrB,MAAMzG,EAAUyG,GAAU,SAAW,OAAOA,EAAS,SAAY,SAAWA,EAAS,QAAU,CAAA,EAC/F,YAAK,OAAOzG,CAAO,EACnB,KAAK,WAAW,SAAS,EAClB,IACT,CAEA,gBAAiB,CACf,YAAK,MAAQ,KAAK,cAAa,EACxBovK,GAAkB,KAAK,KAAK,CACrC,CAEA,WAAWhsK,EAAQqI,EAAS,GAAI,CAC9B,KAAK,MAAQ,KAAK,cAAa,EAC/B,KAAK,KAAK,SAAU,CAAE,OAAArI,EAAQ,MAAOgsK,GAAkB,KAAK,KAAK,EAAG,GAAG3jK,CAAM,CAAE,CACjF,CAEA,SAASzL,EAAS,CAChB,OAAI,UAAU,SAAW,EAAU,KAAK,eAAc,EAC/C,KAAK,OAAOA,CAAO,CAC5B,CAEA,SAASZ,EAAO,CACd,OAAI,UAAU,SAAW,EAAU,KAAK,OAAO,SACxC,KAAK,OAAO,CAAE,SAAUA,CAAK,CAAE,CACxC,CAEA,OAAOA,EAAO,CACZ,OAAI,UAAU,SAAW,EAAU,KAAK,OAAO,OACxC,KAAK,OAAO,CAAE,OAAQA,CAAK,CAAE,CACtC,CAEA,OAAOA,EAAO,CACZ,OAAI,UAAU,SAAW,EAAU,KAAK,OAAO,OACxC,KAAK,OAAO,CAAE,OAAQA,CAAK,CAAE,CACtC,CAEA,WAAWA,EAAO,CAChB,OAAI,UAAU,SAAW,EAChB,CACL,MAAO,KAAK,OAAO,MACnB,OAAQ,KAAK,OAAO,MAC5B,EAEW,KAAK,OAAO,CAAE,WAAYA,CAAK,CAAE,CAC1C,CAEA,cAAcA,EAAO,CACnB,OAAI,UAAU,SAAW,EAAU,KAAK,OAAO,cACxC,KAAK,OAAO,CAAE,cAAeA,CAAK,CAAE,CAC7C,CAEA,cAAcA,EAAO,CACnB,OAAI,UAAU,SAAW,EAAU,KAAK,OAAO,gBAAkB,GAC1D,KAAK,OAAO,CAAE,cAAeA,IAAU,EAAI,CAAE,CACtD,CAEA,eAAeA,EAAO,CACpB,OAAI,UAAU,SAAW,EAAU,KAAK,OAAO,iBAAmB,GAC3D,KAAK,OAAO,CAAE,eAAgBA,IAAU,EAAK,CAAE,CACxD,CAEA,iBAAiBA,EAAO,CACtB,OAAI,UAAU,SAAW,EAAU,KAAK,OAAO,mBAAqB,GAC7D,KAAK,OAAO,CAAE,iBAAkBA,IAAU,EAAI,CAAE,CACzD,CAEA,YAAYA,EAAO,CACjB,OAAI,UAAU,SAAW,EAAU,KAAK,OAAO,YACxC,KAAK,OAAO,CAAE,YAAaA,CAAK,CAAE,CAC3C,CAEA,sBAAsBA,EAAO,CAC3B,OAAI,UAAU,SAAW,EAAU,KAAK,OAAO,wBAA0B,GAClE,KAAK,OAAO,CAAE,sBAAuBA,IAAU,EAAI,CAAE,CAC9D,CAEA,UAAUA,EAAO,CACf,OAAI,UAAU,SAAW,EAAU,KAAK,OAAO,UACxC,KAAK,OAAO,CAAE,UAAWA,CAAK,CAAE,CACzC,CAEA,UAAUA,EAAO,CACf,OAAI,UAAU,SAAW,EAAU,KAAK,OAAO,YAAc,GACtD,KAAK,OAAO,CAAE,UAAWA,IAAU,EAAI,CAAE,CAClD,CAEA,gBAAgBY,EAAU,GAAI,CAC5B,MAAM2K,EAAS,KAAK,SAAS,QAAU,KACjC5I,EAAgB,OAAO,UAAU,eAAe,KAAK/B,EAAS,eAAe,EAC/E6+I,GAAiC7+I,EAAQ,cAAe,KAAK,OAAO,aAAa,EACjF,KAAK,OAAO,cAChB,OAAO2K,GAAQ,8BAA8B,CAAE,cAAA5I,CAAa,CAAE,GAAK,CACjE,cAAAA,EACA,mBAAoB,KACpB,uBAAwB,WAAW,QAAQ,kBAAoB,EAC/D,cAAe,SACf,QAASs/I,GACP12I,GAAQ,QAAQ,MAAQA,GAAQ,MAAQ,CAAE,MAAO,EAAG,OAAQ,CAAC,EAC7D,CAAE,mBAAoB,KAAM,uBAAwB,WAAW,QAAQ,kBAAoB,CAAC,EAC5F5I,CACR,CACA,CACE,CAEA,mBAAmB0hJ,EAAY,GAAI,CACjC,MAAM94I,EAAS,KAAK,SAAS,QAAU,KACjCyiD,EAAQyjH,GAAqBptB,CAAS,EACtC2tB,EAAa,CACjB,GAAG,KAAK,OACR,GAAGhkH,CACT,EACUikH,EAAU,CACd,SAAUD,EAAW,SACrB,SAAUA,EAAW,SACrB,OAAQA,EAAW,OACnB,OAAQA,EAAW,OACnB,MAAOA,EAAW,MAClB,OAAQA,EAAW,OACnB,cAAeA,EAAW,cAC1B,cAAeA,EAAW,cAC1B,eAAgBA,EAAW,eAC3B,iBAAkBA,EAAW,iBAC7B,YAAaA,EAAW,YACxB,sBAAuBA,EAAW,sBAClC,UAAWA,EAAW,SAC5B,EACI,OAAI,OAAOzmK,GAAQ,6BAAgC,WAC1CA,EAAO,4BAA4B0mK,CAAO,EAE5C1xB,GAA2B0xB,EAAS,CACzC,SAAU1mK,GAAQ,SAClB,WAAY,KAAK,gBAAgB,CAAE,cAAe0mK,EAAQ,cAAe,EACzE,WAAY1mK,GAAQ,QAAQ,MAAQA,GAAQ,MAAQ,CAAE,MAAO,EAAG,OAAQ,CAAC,EACzE,uBAAwB,WAAW,QAAQ,kBAAoB,CACrE,CAAK,CACH,CAEA,MAAM,WAAW3K,EAAU,GAAI,CAC7B,MAAM2K,EAAS,KAAK,SAAS,QAAU,KACvC,GAAI,OAAOA,GAAQ,kBAAqB,WACtC,MAAM,IAAI,MAAM,wDAAwD,EAE1E,MAAM4f,EAAW,KAAK,mBAAmBvqB,CAAO,EAChD,OAAO,MAAM2K,EAAO,iBAAiB4f,CAAQ,CAC/C,CAEA,MAAM,kBAAkBvqB,EAAU,GAAImhJ,EAAiB,CAAA,EAAI,CACzD,MAAMx2I,EAAS,KAAK,SAAS,QAAU,KACvC,GAAI,OAAOA,GAAQ,yBAA4B,WAC7C,MAAM,IAAI,MAAM,+DAA+D,EAEjF,MAAM4f,EAAW,KAAK,mBAAmBvqB,CAAO,EAChD,OAAO,MAAM2K,EAAO,wBAAwB4f,EAAU42H,CAAc,CACtE,CAEA,MAAM,OAAOnhJ,EAAU,GAAI,CACzB,MAAM2K,EAAS,KAAK,SAAS,QAAU,KACvC,GAAI,OAAOA,GAAQ,cAAiB,WAClC,MAAM,IAAI,MAAM,oDAAoD,EAEtE,MAAM4f,EAAW,KAAK,mBAAmBvqB,CAAO,EAChD,OAAO,MAAM2K,EAAO,aAAa4f,CAAQ,CAC3C,CAEA,eAAgB,CACd,MAAM5f,EAAS,KAAK,SAAS,QAAU,KACjCs1I,EAAa,KAAK,gBAAe,EACjC11H,EAAW,KAAK,mBAAkB,EAClCuqF,EAASi8D,GAAuB,KAAK,SAAS,YAAY,QAAQ,EAAG,EAAK,EAC1EO,EAAUP,GAAuB,KAAK,SAAS,YAAY,SAAS,EAAG,EAAI,EAC3ElxD,EAAUkxD,GAAuB,KAAK,SAAS,YAAY,SAAS,EAAG,EAAK,EAC5E7qC,EAAiB,KAAK,SAAS,YAAY,QAAQ,EACzD,MAAO,CACL,GAAGkpC,GAAkB,KAAK,MAAM,EAChC,SAAU7kJ,EAAS,SACnB,eAAgBA,EAAS,iBAAmB,GAC5C,SAAU6kJ,GAAkB7kJ,CAAQ,EACpC,WAAY6kJ,GAAkBnvB,CAAU,EACxC,aAAc,CACZ,OAAAnrC,EACA,QAAAw8D,EACA,QAAAzxD,EACA,OAAQ,CACN,SAAU,EAAQqmB,EAClB,QAASA,GAAgB,OAAO,UAAY,EACtD,CACA,EACM,KAAM+qC,GAAmBtmK,CAAM,CACrC,CACE,CACF,CCnZA,SAAS4mK,GAAWpqD,EAAQ,GAAI,CAC9B,OAAO,MAAM,QAAQA,CAAK,EACtBA,EAAM,IAAKvuC,IAAU,CACrB,GAAGA,EACH,OAAQ,MAAM,QAAQA,GAAM,MAAM,EAAI,CAAC,GAAGA,EAAK,MAAM,EAAIA,GAAM,MACrE,EAAM,EACA,CAAA,CACN,CAEA,SAAS44F,GAAkBxxK,EAAU,GAAI,CACvC,OAAIA,aAAmBo9F,GAAqBp9F,EAAQ,MAAK,EAClD,IAAIo9F,GAAa,CACtB,GAAIp9F,EAAQ,GACZ,KAAMA,EAAQ,KACd,MAAOA,EAAQ,MACf,MAAOuxK,GAAWvxK,EAAQ,KAAK,CACnC,CAAG,CACH,CAEA,SAASyxK,GAA0BryK,EAAO,CACxC,MAAME,EAAU,KAAK,MAAM,OAAOF,CAAK,CAAC,EACxC,OAAO,OAAO,SAASE,CAAO,GAAKA,EAAU,EAAIA,EAAU,CAC7D,CAEA,SAASoyK,GAAgB/mK,EAAQwlB,EAAO,CACtC,MAAMwhJ,EAAchnK,GAAQ,iBAAc,GAAQ,KAClD,MAAO,CACL,QAASgnK,GAAa,UAAY,GAClC,MAAOxhJ,GAAO,WAAQ,GAAQwhJ,GAAa,OAAS,SACpD,MAAOJ,GAAWphJ,GAAO,WAAQ,GAAQ,CAAA,CAAE,EAC3C,iBAAkBshJ,GAA0BE,GAAa,SAAS,gBAAgB,EAClF,QAASA,GAAa,QAAU,CAAE,GAAGA,EAAY,OAAO,EAAK,KAC7D,UAAWA,GAAa,WAAa,KACrC,UAAWA,GAAa,WAAa,KACrC,cAAeA,GAAa,eAAiB,KAC7C,cAAeA,GAAa,eAAiB,KAC7C,MAAOA,GAAa,OAAS,IACjC,CACA,CAcO,MAAMC,WAAuBvD,EAAS,CAC3C,OAAO,GAAK,UAEZ,YAAYruK,EAAU,GAAI,CACxB,MAAMA,CAAO,EACb,KAAK,eAAiB,EACtB,KAAK,iBAAmByxK,GAA0BzxK,EAAQ,gBAAgB,EAC1E,KAAK,YAAcwxK,GAAkBxxK,EAAQ,aAAeA,CAAO,EACnE,KAAK,MAAQ0xK,GAAgB,KAAM,KAAK,WAAW,CACrD,CAEA,OAAO7lK,EAAS,CACd,aAAM,OAAOA,CAAO,EACpB,KAAK,eAAe,CAAE,kBAAmB,GAAM,OAAQ,GAAM,EAC7D,KAAK,WAAW,KAAK,QAAQ,UAAU,KAAK,SAAS,OAAQ,uBAAwB,IAAM,CACrF,KAAK,eAAiB,IAC1B,KAAK,eAAe,CAAE,kBAAmB,GAAM,OAAQ,GAAM,EAC7D,KAAK,WAAW,cAAc,EAChC,CAAC,CAAC,EACF,KAAK,WAAW,KAAK,QAAQ,UAAU,KAAK,SAAS,OAAQ,mBAAoB,IAAM,CACrF,KAAK,eAAe,CAAE,kBAAmB,GAAM,OAAQ,GAAM,EAC7D,KAAK,WAAW,mBAAoB,CAAE,OAAQ,UAAW,cAAe,GAAO,CACjF,CAAC,CAAC,EACK,IACT,CAEA,OAAO7L,EAAU,GAAI,CAEnB,GADA,MAAM,OAAOA,CAAO,EAChB,CAACA,GAAW,OAAOA,GAAY,SAAU,OAAO,KACpD,GAAIA,EAAQ,uBAAuBo9F,GACjC,OAAO,KAAK,eAAep9F,EAAQ,WAAW,EAEhD,MAAM6xK,EAAYL,GAAkB,CAClC,GAAIxxK,EAAQ,IAAM,KAAK,aAAa,GACpC,KAAMA,EAAQ,MAAQ,KAAK,aAAa,KACxC,MAAOA,EAAQ,OAAS,KAAK,aAAa,WAAQ,EAClD,MAAO,OAAO,UAAU,eAAe,KAAKA,EAAS,OAAO,EACxDA,EAAQ,MACR,KAAK,aAAa,WAAQ,CACpC,CAAK,EACD,OAAI,OAAO,UAAU,eAAe,KAAKA,EAAS,kBAAkB,IAClE,KAAK,iBAAmByxK,GAA0BzxK,EAAQ,gBAAgB,GAErE,KAAK,eAAe6xK,EAAW,CAAE,OAAQ,SAAS,CAAE,CAC7D,CAEA,WAAY,CACV,MAAO,CACL,QAAS,CACP,GAAI,KAAK,aAAa,IAAM,KAC5B,KAAM,KAAK,aAAa,MAAQ,EACxC,EACM,OAAQ,CACN,MAAO,KAAK,aAAa,WAAQ,GAAQ,SACzC,MAAON,GAAW,KAAK,aAAa,WAAQ,GAAQ,CAAA,CAAE,EACtD,iBAAkB,KAAK,gBAC/B,CACA,CACE,CAEA,cAAe,CACb,MAAMvrC,EAAa+C,GAAW,KAAK,GAAG,SAAWtnI,GAAUsnI,EAAO,OAAWtnI,GAAO,QAAUA,CAAK,CAAC,EACpG,MAAO,CACL,QAAS,CACP,YAAa,oCACb,QAAS,KAAK,MAAM,UAAY,GAChC,KAAM,UACN,MAAO,YACP,QAAS,CAAC,iBAAiB,EAC3B,GAAI,CACF,MAAO,UACP,WAAY,QACtB,EACQ,OAAQ,IAAM,KAAK,MAAM,UAAY,GACrC,OAASrC,GAAU,CACbA,IAAU,GAAO,KAAK,MAAK,GACtB,KAAK,aAAa,cAAW,GAAQ,KAAK,iBAAmB,IAAG,KAAK,eAAe,KAAK,YAAa,CAAE,OAAQ,SAAS,CAAE,CACtI,EACA,UAAA4mI,CACR,EACM,MAAO,CACL,YAAa,gBACb,QAAS,KAAK,aAAa,WAAQ,GAAQ,SAC3C,KAAM,SACN,MAAO,YACP,QAAS,CAAC,eAAe,EACzB,GAAI,CACF,MAAO,QACP,WAAY,SACZ,QAAS,CAAC,SAAU,eAAe,CAC7C,EACQ,OAAQ,IAAM,KAAK,aAAa,WAAQ,GAAQ,SAChD,OAAS5mI,GAAU,KAAK,SAASA,CAAK,EACtC,UAAA4mI,CACR,EACM,MAAO,CACL,YAAa,6BACb,QAASurC,GAAW,KAAK,aAAa,WAAQ,GAAQ,CAAA,CAAE,EACxD,KAAM,QACN,MAAO,YACP,QAAS,CAAC,eAAe,EACzB,GAAI,CACF,MAAO,QACP,WAAY,QACtB,EACQ,OAAQ,IAAMA,GAAW,KAAK,aAAa,WAAQ,GAAQ,EAAE,EAC7D,OAASnyK,GAAU,KAAK,aAAa,CACnC,UAAWmyK,GAAWnyK,CAAK,EAAE,OAAQw5E,GAASA,GAAM,QAAU,MAAM,EACpE,UAAW24F,GAAWnyK,CAAK,EAAE,OAAQw5E,GAASA,GAAM,QAAU,MAAM,EACpE,MAAO,KAAK,aAAa,WAAQ,GAAQ,QACnD,CAAS,EACD,UAAAotD,CACR,EACM,iBAAkB,CAChB,YAAa,uEACb,QAAS,KAAK,iBACd,KAAM,SACN,MAAO,YACP,QAAS,CAAC,0BAA0B,EACpC,GAAI,CACF,MAAO,qBACP,WAAY,QACtB,EACQ,OAAQ,IAAM,KAAK,iBACnB,OAAS5mI,GAAU,KAAK,oBAAoBA,CAAK,EACjD,UAAA4mI,CACR,CACA,CACE,CAEA,QAAQv/H,EAAW,GAAI,CACrB,MAAM25B,EAAS35B,GAAU,QAAU,OAAOA,EAAS,QAAW,SAAWA,EAAS,OAAS,CAAA,EACrFzG,EAAUyG,GAAU,SAAW,OAAOA,EAAS,SAAY,SAAWA,EAAS,QAAU,CAAA,EACzFyiI,EAAWsoC,GAAkB,CACjC,GAAIxxK,EAAQ,IAAM,KAAK,aAAa,GACpC,KAAMA,EAAQ,MAAQ,KAAK,aAAa,KACxC,MAAOogC,EAAO,OAAS,KAAK,aAAa,WAAQ,EACjD,MAAOA,EAAO,OAAS,CAAA,CAC7B,CAAK,EACD,YAAK,iBAAmBqxI,GAA0BrxI,EAAO,gBAAgB,EACzE,KAAK,eAAe8oG,EAAU,CAAE,OAAQ,UAAW,cAAe,GAAO,EACzE,KAAK,WAAW,UAAW,CAAE,OAAQ,UAAW,cAAe,GAAO,EAC/D,IACT,CAEA,WAAW9lI,EAAQqI,EAAS,GAAI,CAC9B,KAAK,KAAK,SAAU,CAAE,OAAArI,EAAQ,MAAO,KAAK,eAAc,EAAI,GAAGqI,EAAQ,CACzE,CAEA,gBAAiB,CACf,MAAO,CACL,GAAG,KAAK,MACR,MAAO8lK,GAAW,KAAK,MAAM,KAAK,EAClC,QAAS,KAAK,MAAM,QAAU,CAAE,GAAG,KAAK,MAAM,OAAO,EAAK,IAChE,CACE,CAEA,UAAW,CACT,OAAO,KAAK,aAAa,QAAK,GAAQC,GAAiB,CACzD,CAEA,QAAQxxK,EAAS,CACf,OAAI,UAAU,SAAW,EAAU,KAAK,eAAc,EAClDA,GAAW,MAAQA,IAAY,IAASA,GAAS,UAAY,GAAc,KAAK,MAAK,EACrFA,aAAmBo9F,GAAqB,KAAK,eAAep9F,CAAO,EAChE,KAAK,OAAOA,CAAO,CAC5B,CAEA,SAASolC,EAAO,CACd,MAAMxjC,EAAO,KAAK,SAAQ,EAC1B,OAAAA,EAAK,SAASwjC,CAAK,EACZ,KAAK,eAAexjC,EAAM,CAAE,OAAQ,OAAO,CAAE,CACtD,CAEA,oBAAoBxC,EAAO,CACzB,YAAK,iBAAmBqyK,GAA0BryK,CAAK,EAChD,KAAK,eAAe,KAAK,YAAa,CAAE,OAAQ,qBAAsB,CAC/E,CAeA,aAAa,CAAE,UAAA0yK,EAAY,GAAI,UAAAC,EAAY,CAAA,EAAI,MAAA3sI,EAAO,iBAAA03H,CAAgB,EAAK,GAAI,CAC7E,MAAMl7J,EAAO4vK,GAAkB,CAC7B,GAAI,KAAK,aAAa,GACtB,KAAM,KAAK,aAAa,KACxB,MAAOpsI,GAAS,KAAK,aAAa,WAAQ,EAC1C,MAAO,CAAC,GAAGmsI,GAAWO,CAAS,EAAG,GAAGP,GAAWQ,CAAS,CAAC,CAChE,CAAK,EACD,OAAIjV,GAAoB,OACtB,KAAK,iBAAmB2U,GAA0B3U,CAAgB,GAE7D,KAAK,eAAel7J,EAAM,CAAE,OAAQ,OAAO,CAAE,CACtD,CASA,OAAQ,CACN,MAAM+I,EAAS,KAAK,SAAS,QAAU,KAQvC,GAPA,KAAK,YAAc6mK,GAAkB,CACnC,GAAI,KAAK,aAAa,GACtB,KAAM,KAAK,aAAa,KACxB,MAAO,SACP,MAAO,CAAA,CACb,CAAK,EACD,KAAK,iBAAmB,EACpB7mK,GAAQ,iBAAkB,CAC5B,KAAK,gBAAkB,EACvB,GAAI,CACFA,EAAO,iBAAgB,CACzB,QAAC,CACC,KAAK,gBAAkB,CACzB,CACF,CACA,YAAK,MAAQ+mK,GAAgB/mK,EAAQ,KAAK,WAAW,EACrD,KAAK,WAAW,OAAO,EAChB,IACT,CAEA,eAAewlB,EAAO,CAAE,OAAA/sB,EAAS,QAAS,cAAA8gJ,EAAgB,EAAI,EAAK,GAAI,CACrE,KAAK,YAAcstB,GAAkBrhJ,CAAK,EAC1C,MAAMxlB,EAAS,KAAK,SAAS,QAAU,KACjCqnK,EAAe,KAAK,YAAY,qBAAoB,EAI1D,GAHI,KAAK,iBAAmB,IAC1BA,EAAa,iBAAmB,KAAK,kBAEnCrnK,GAAQ,eAAgB,CAC1B,KAAK,gBAAkB,EACvB,GAAI,CACE,KAAK,YAAY,eAAiB,KAAK,iBAAmB,EAAGA,EAAO,eAAeqnK,CAAY,EAC9FrnK,EAAO,mBAAgB,CAC9B,QAAC,CACC,KAAK,gBAAkB,CACzB,CACF,CACA,YAAK,MAAQ+mK,GAAgB/mK,EAAQ,KAAK,WAAW,EACrD,KAAK,WAAWvH,EAAQ,CACtB,cAAe8gJ,IAAkB,GACjC,YAAa,CAAC,kBAAmB,gBAAiB,gBAAiB,0BAA0B,CACnG,CAAK,EACM,IACT,CAEA,eAAe,CAAE,kBAAA+tB,EAAoB,GAAO,OAAA7B,EAAS,EAAK,EAAK,GAAI,CACjE,MAAMzlK,EAAS,KAAK,SAAS,QAAU,KACjCunK,EAAcD,EAAqBtnK,GAAQ,wBAAqB,GAAQ,KAAQ,KAClFunK,aAAuB90E,GACzB,KAAK,YAAc80E,EAAY,MAAK,EAC1B,KAAK,cACf,KAAK,YAAcV,GAAiB,GAEtC,MAAMG,EAAchnK,GAAQ,iBAAc,GAAQ,KAClD,OAAI,OAAO,UAAU,eAAe,KAAKgnK,GAAa,SAAW,GAAI,kBAAkB,EACrF,KAAK,iBAAmBF,GAA0BE,EAAY,QAAQ,gBAAgB,GAC7EA,GAAa,UAAY,IAASA,GAAa,WACxD,KAAK,iBAAmB,GAE1B,KAAK,MAAQD,GAAgB/mK,EAAQ,KAAK,WAAW,EAChDylK,GAAQ,KAAK,WAAW,MAAM,EAC5B,IACT,CACF,CCzUO,MAAM17B,GAA8B,OAAO,OAAO,CACvD,QAAS,EACT,WAAY,EACZ,WAAY,EACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,IAAM,IAAM,IAAM,CAAC,CAChC,CAAC,EAEYC,GAA+B,OAAO,OAAO,CACxD,QAAS,IACT,WAAY,EACZ,WAAY,KACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,IAAM,IAAM,IAAM,CAAC,CAChC,CAAC,EAEYC,GAA2B,OAAO,OAAO,CACpD,QAAS,KACT,WAAY,EACZ,WAAY,IACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,IAAM,IAAM,IAAM,CAAC,CAChC,CAAC,EAEYC,GAA8B,OAAO,OAAO,CACvD,SAAU,IACV,WAAY,EACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,GAAK,IAAM,IAAM,CAAC,CAC/B,CAAC,EAEYC,GAA+B,OAAO,OAAO,CACxD,SAAU,KACV,WAAY,GACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,IAAM,IAAM,IAAM,CAAC,CAChC,CAAC,EAEYC,GAA2B,OAAO,OAAO,CACpD,SAAU,KACV,WAAY,GACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,IAAM,IAAM,IAAM,CAAC,CAChC,CAAC,EAEYo9B,GAA8B,OAAO,OAAO,CACvD,QAAS,EACT,WAAY,EACZ,WAAY,EACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,CACvB,CAAC,EAEYC,GAA8B,OAAO,OAAO,CACvD,SAAU,EACV,WAAY,EACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,CACvB,CAAC,EAEYp9B,GAAoC,OAAO,OAAO,CAC7D,QAAS,IACT,WAAY,EACZ,WAAY,IACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,CACvB,CAAC,EAEYC,GAAoC,OAAO,OAAO,CAC7D,SAAU,IACV,WAAY,IACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,CACvB,CAAC,EAEYC,GAAqC,OAAO,OAAO,CAC9D,QAAS,GACT,WAAY,EACZ,WAAY,GACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,CACvB,CAAC,EAEYC,GAAqC,OAAO,OAAO,CAC9D,SAAU,GACV,WAAY,GACZ,QAAS,GACT,cAAe,GACf,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EACrB,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,CACvB,CAAC,EAEYC,GAAwC,OAAO,OAAO,CACjE,QAAS,GACT,OAAQ,GACV,CAAC,EAEYC,GAAwC,OAAO,OAAO,CACjE,QAAS,GACT,OAAQ,EACV,CAAC,EAEYg9B,GAAmC,EACnCC,GAAuC,IACvCC,GAAyC,IACzCj9B,GAA0B,wBAEhC,SAAS5yB,GAAYtjH,EAAO,CAAE,IAAAsK,EAAM,OAAO,kBAAmB,IAAAoF,EAAM,OAAO,iBAAiB,EAAK,GAAI,CAC1G,MAAMxP,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,IAAIwP,EAAK,KAAK,IAAIpF,EAAKpK,CAAO,CAAC,EADL,IAExC,CAEO,SAASk2I,GAAUp2I,EAAOC,EAAU,CACzC,MAAMwY,EAAO,MAAM,QAAQxY,CAAQ,EAAIA,EAAW,CAAC,EAAG,EAAG,EAAG,CAAC,EAC7D,MAAI,CAAC,MAAM,QAAQD,CAAK,GAAK,CAAC,YAAY,OAAOA,CAAK,EAAU,CAAC,GAAGyY,CAAI,EACjE,CAAC,EAAG,EAAG,EAAG,CAAC,EAAE,IAAKnF,GAAU,CACjC,MAAMpT,EAAU,OAAOF,EAAMsT,CAAK,CAAC,EACnC,OAAO,OAAO,SAASpT,CAAO,EAAIA,EAAUuY,EAAKnF,CAAK,CACxD,CAAC,CACH,CAEO,SAASijI,GAAsBv2I,EAAOC,EAAU,CACrD,GAAID,GAAS,MAAQ,GAAGA,CAAK,GAAG,KAAI,IAAO,GAAI,OAAOC,EACtD,MAAMC,EAAU,OAAOF,CAAK,EAC5B,OAAO,OAAO,SAASE,CAAO,EAAIA,EAAUD,CAC9C,CAEO,SAASu2I,GAA2Bx2I,EAAOC,EAAU,CAC1D,OAAOqjH,GAAYizB,GAAsBv2I,EAAO,IAAI,EAAG,CAAE,IAAK,CAAC,CAAE,GAAKC,CACxE,CAEO,SAASw2I,GAAmB7+G,EAAO33B,EAAU,CAClD,MAAMwY,EAAOxY,GAAYq1I,GACnB9yI,EAAOo1B,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EAC1D,MAAO,CACL,QAAS4+G,GAA2Bh0I,EAAK,SAAWiW,EAAK,QAASA,EAAK,OAAO,EAC9E,WAAY+9H,GAA2Bh0I,EAAK,YAAciW,EAAK,WAAYA,EAAK,UAAU,EAC1F,WAAY+9H,GAA2Bh0I,EAAK,YAAciW,EAAK,WAAYA,EAAK,UAAU,EAC1F,QAASjW,EAAK,UAAY,GAC1B,cAAeA,EAAK,gBAAkB,GACtC,SAAU4zI,GAAU5zI,EAAK,SAAUiW,EAAK,QAAQ,EAChD,SAAU29H,GAAU5zI,EAAK,SAAUiW,EAAK,QAAQ,CACpD,CACA,CAEO,SAASi+H,GAAmB9+G,EAAO33B,EAAU,CAClD,MAAMwY,EAAOxY,GAAYw1I,GACnBjzI,EAAOo1B,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EAC1D,MAAO,CACL,SAAU4+G,GAA2Bh0I,EAAK,UAAYiW,EAAK,SAAUA,EAAK,QAAQ,EAClF,WAAY+9H,GAA2Bh0I,EAAK,YAAciW,EAAK,WAAYA,EAAK,UAAU,EAC1F,QAASjW,EAAK,UAAY,GAC1B,cAAeA,EAAK,gBAAkB,GACtC,SAAU4zI,GAAU5zI,EAAK,SAAUiW,EAAK,QAAQ,EAChD,SAAU29H,GAAU5zI,EAAK,SAAUiW,EAAK,QAAQ,CACpD,CACA,CAEO,SAAS26J,GAAoBxuI,EAAO,CACzC,MAAM5B,EAAOozG,GAAUxxG,EAAO,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,EAC1C,OAAQ5B,EAAK,CAAC,EAAI,MAAWA,EAAK,CAAC,EAAI,MAAWA,EAAK,CAAC,EAAI,KAC9D,CAEO,SAASqwI,GAAuB9nK,EAAQ,CAC7C,OAAOA,GAAQ,aAAU,GAAQA,GAAQ,gBAAkB,CAAC,EAAG,EAAG,EAAG,CAAC,CACxE,CAEO,SAASorI,GAA4BC,EAAM32I,EAAW+1I,GAAuC,CAClG,MAAMv9H,EAAOxY,GAAY,OAAOA,GAAa,SAAWA,EAAW+1I,GAC7DxzI,EAAOo0I,GAAQ,OAAOA,GAAS,SAAWA,EAAO,CAAA,EACvD,MAAO,CACL,QAASp0I,EAAK,SAAW,KAAOiW,EAAK,UAAY,GAAOjW,EAAK,UAAY,GACzE,OAAQ8gH,GAAY9gH,EAAK,QAAUiW,EAAK,OAAQ,CAAE,IAAK,EAAG,IAAK,CAAC,CAAE,GAAKA,EAAK,MAChF,CACA,CAEO,SAAS66J,GAAwB17I,EAAO27I,EAAiB38B,EAAM,CACpE,MAAMvsI,EAAU,CACd,GAAGutB,EACH,SAAUw+G,GAAUx+G,GAAO,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,EACjD,SAAUw+G,GAAUx+G,GAAO,SAAU,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,CACrD,EACQ47I,EAAe78B,GAA4BC,CAAI,EACrD,GAAI,CAAC48B,EAAa,QAAS,OAAOnpK,EAClC,MAAMopK,EAAYD,EAAa,OACzB18E,EAAas/C,GAAUm9B,EAAiB,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,EAC1D,OAAIH,GAAoBt8E,CAAU,EAAI,IACpCzsF,EAAQ,SAAW,CACjB,EAAKopK,GAAa,EAAI38E,EAAW,CAAC,GAClC,EAAK28E,GAAa,EAAI38E,EAAW,CAAC,GAClC,EAAK28E,GAAa,EAAI38E,EAAW,CAAC,GAClC,CACN,EACIzsF,EAAQ,SAAW,CAAC,EAAG,EAAG,EAAG,CAAC,EACvBA,IAETA,EAAQ,SAAW,CAAC,EAAG,EAAG,EAAG,CAAC,EAC9BA,EAAQ,SAAW,CACjBysF,EAAW,CAAC,EAAI28E,EAAY,IAC5B38E,EAAW,CAAC,EAAI28E,EAAY,IAC5B38E,EAAW,CAAC,EAAI28E,EAAY,IAC5B,CACJ,EACSppK,EACT,CAEO,SAASqpK,GAAwB97I,EAAO,CAC7C,MAAMvtB,EAAUosI,GAAmB7+G,EAAO09G,EAA2B,EACrE,OAAOjrI,EAAQ,UAAY,GACtBA,EAAQ,aAAe,GACvBA,EAAQ,aAAe,GACvBA,EAAQ,UAAY,IACpBA,EAAQ,gBAAkB,IAC1BA,EAAQ,SAAS,MAAM,CAACrK,EAAOsT,IAAUtT,IAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EAAEsT,CAAK,CAAC,GACtEjJ,EAAQ,SAAS,MAAOrK,GAAUA,IAAU,CAAC,CACpD,CAEO,SAAS2zK,GAAwB/7I,EAAO,CAC7C,MAAMvtB,EAAUqsI,GAAmB9+G,EAAO69G,EAA2B,EACrE,OAAOprI,EAAQ,WAAa,GACvBA,EAAQ,aAAe,GACvBA,EAAQ,UAAY,IACpBA,EAAQ,gBAAkB,IAC1BA,EAAQ,SAAS,MAAM,CAACrK,EAAOsT,IAAUtT,IAAU,CAAC,EAAG,EAAG,EAAG,CAAC,EAAEsT,CAAK,CAAC,GACtEjJ,EAAQ,SAAS,MAAOrK,GAAUA,IAAU,CAAC,CACpD,CAcO,SAAS4zK,GAA6B1sK,EAAS8+B,EAAQ,OAAQ,CACpE,GAAI,CAAC9+B,EAAS,MAAO,CAAA,EACrB,MAAMgiH,EAAWljF,IAAU,OACvB9+B,EAAQ,uBAAuB,KAAKA,CAAO,EAC3CA,EAAQ,uBAAuB,KAAKA,CAAO,EACzC6rI,EAAU/sG,IAAU,OACtB9+B,EAAQ,sBAAsB,KAAKA,CAAO,EAC1CA,EAAQ,sBAAsB,KAAKA,CAAO,EACxCoe,EAAU,CAAA,EAChB,UAAW/iB,KAAQ2mH,IAAQ,GAAQ,GAAI,CACrC,MAAMlzC,EAAO+8D,IAAUxwI,CAAI,EACvByzE,GAAM,OAASx3B,GAAAA,cAAc,SAAWw3B,GAAM,YAAc,GAChE1wD,EAAQ,KAAK,OAAO/iB,CAAI,CAAC,CAC3B,CACA,OAAA+iB,EAAQ,KAAK,CAACzK,EAAGC,IAAMD,EAAE,cAAcC,CAAC,CAAC,EAClCwK,CACT,CAEO,SAASwxH,GAAiC5vI,EAAS,CACxD,GAAI,CAACA,EAAS,MAAO,MACrB,MAAM0Z,EAAQ,IAAI,KAAK1Z,EAAQ,wBAAqB,GAAQ,CAAA,GAAI,IAAK3E,GAAS,CAAC,OAAOA,CAAI,EAAE,YAAW,EAAI,OAAOA,CAAI,CAAC,CAAC,CAAC,EACzH,UAAWY,IAAO,CAAC,QAAS,OAAQ,OAAO,EAAG,CAC5C,MAAM6P,EAAQ4N,EAAM,IAAIzd,CAAG,EAC3B,GAAI,CAAC6P,EAAO,SAEZ,GADa9L,EAAQ,uBAAuB8L,CAAK,GACvC,OAASwrC,iBAAc,OAAQ,OAAOxrC,CAClD,CACA,MAAO,KACT,CAEO,SAAS6gK,GAAuB3sK,EAAS3D,EAAQ6O,EAAI,CAC1D,GAAI,CAAClL,GAAW,CAAC,OAAO,UAAUkL,CAAE,GAAKA,EAAK,EAAG,OAAO,KACxD,MAAM0hK,EAAiBvwK,IAAW,OAASuzI,GAAiC5vI,CAAO,EAAI3D,EACvF,GAAI,CAACuwK,GAAkBA,IAAmB,MAAO,OAAO,OAAO1hK,CAAE,EACjE,MAAM4jE,EAAO9uE,EAAQ,uBAAuB4sK,CAAc,EAC1D,GAAI,CAAC99F,EAAM,OAAO,OAAO5jE,CAAE,EAC3B,GAAI4jE,EAAK,OAASx3B,GAAAA,cAAc,OAAQ,CACtC,MAAMx+C,EAAQkH,EAAQ,yBAAyB4sK,EAAgB1hK,CAAE,EACjE,OAAOpS,GAAS,MAAQA,IAAU,GAAK,OAAOoS,CAAE,EAAI,OAAOpS,CAAK,CAClE,CACA,OAAO,OAAOoS,CAAE,CAClB,CChSO,MAAM2hK,GAA0B,OAAO,OAAO,CACnD,gBAAiB,IACjB,WAAY,GACZ,OAAQ,EACV,CAAC,EAED,SAASC,GAAkBvnK,EAAS,CAClC,OAAOA,GAAS,cAAc,WAAW,GAAG,OAAS,IACvD,CAEA,SAASwnK,GAAcxnK,EAAS,CAC9B,OAAOA,GAAS,cAAc,OAAO,GAAG,OAAS,IACnD,CAEO,SAASynK,GAAoC3oK,EAAQ,CAC1D,GAAI,CAACA,EAAQ,OACb,MAAM4oK,EAAoB5oK,EAAO,iBAAiB,UAAU,GAAK,KAC3D6oK,EAAuB7oK,EAAO,iBAAiB,aAAa,GAAK,KACjE8oK,EAAoB9oK,EAAO,iBAAiB,UAAU,GAAK,KAC3D+oK,EAAuB/oK,EAAO,iBAAiB,aAAa,GAAK,MACnE,CAAC4oK,GAAqBT,GAAwBS,CAAiB,IACjE5oK,EAAO,iBAAiB,WAAY,CAAE,GAAG+pI,EAA2B,CAAE,GAEpE,CAAC8+B,GAAwBV,GAAwBU,CAAoB,IACvE7oK,EAAO,iBAAiB,cAAe,CAAE,GAAGgqI,EAA4B,CAAE,GAExE,CAAC8+B,GAAqBV,GAAwBU,CAAiB,IACjE9oK,EAAO,iBAAiB,WAAY,CAAE,GAAGkqI,EAA2B,CAAE,GAEpE,CAAC6+B,GAAwBX,GAAwBW,CAAoB,IACvE/oK,EAAO,iBAAiB,cAAe,CAAE,GAAGmqI,EAA4B,CAAE,EAEvEnqI,EAAO,oBACVA,EAAO,iBAAiB,CAAE,GAAGiqI,GAA0B,EAEpDjqI,EAAO,oBACVA,EAAO,iBAAiB,CAAE,GAAGoqI,GAA0B,CAE3D,CAEO,SAAS4+B,GAAyB9nK,EAAS,CAChD,MAAM0qI,EAAiB68B,GAAkBvnK,CAAO,EAChD,GAAI0qI,IAAmBA,EAAe,cAAc,KAAO,GAAKA,EAAe,cAAc,KAAO,GAClG,MAAO,WAGT,MAAMq9B,GADS/nK,GAAS,QAAU,OACH,iBAAmB,KAClD,GAAI+nK,KAAoBA,EAAe,OAAO,MAAQ,GAAK,IAAMA,EAAe,OAAO,MAAQ,GAAK,GAClG,MAAO,cAET,MAAMp9B,EAAa68B,GAAcxnK,CAAO,EACxC,OAAI2qI,GAAY,4BAA8B,KAC3CA,EAAW,WAAaA,EAAW,aAAe,GAC/CA,EAAW,WAAaA,EAAW,aAAe,GAE/C,cAEF,SACT,CAEA,SAASq9B,GAA0BhoK,EAAS3L,EAAM,CAChD,MAAMyK,EAASkB,GAAS,QAAU,KAC5BqqF,EAAau8E,GAAuB9nK,CAAM,EAC1C4rI,EAAiB68B,GAAkBvnK,CAAO,EAC1C2qI,EAAa68B,GAAcxnK,CAAO,EACxC,OAAI3L,IAAS,YAAcq2I,EAClB,CACL,KAAMm8B,GAAwBn8B,EAAe,uBAAwBrgD,EAAYqgD,EAAe,qBAAqB,EACrH,KAAMm8B,GAAwBn8B,EAAe,uBAAwBrgD,EAAYqgD,EAAe,qBAAqB,CAC3H,EAEMr2I,IAAS,eAAiBs2I,EACrB,CACL,KAAMk8B,GAAwBl8B,EAAW,wBAAyBtgD,EAAYsgD,EAAW,sBAAsB,EAC/G,KAAMk8B,GAAwBl8B,EAAW,wBAAyBtgD,EAAYsgD,EAAW,sBAAsB,CACrH,EAES,CACL,KAAM,CAAE,GAAG27B,EAA2B,EACtC,KAAM,CAAE,GAAGC,EAA2B,CAC1C,CACA,CAEO,SAAS0B,GAAwBjoK,EAAS,CAC/C,MAAMlB,EAASkB,GAAS,QAAU,KAClC,GAAI,CAAClB,EAAQ,OACb,MAAMzK,EAAOyzK,GAAyB9nK,CAAO,EACvCkoK,EAASF,GAA0BhoK,EAAS3L,CAAI,EAChDi3D,EAAaxsD,EAAO,UAAU,YAAc,KAGlD,GAFAA,EAAO,mBAAmBopK,EAAO,IAAI,EACrCppK,EAAO,mBAAmBopK,EAAO,IAAI,EACjC58G,EAAY,CACd,MAAM7zD,EAAUpD,IAAS,UACzBi3D,EAAW,wBAA0B7zD,EACrC6zD,EAAW,wBAA0B7zD,CACvC,CACAqH,EAAO,gBAAa,CACtB,CAEO,SAASqpK,GAAyBnoK,EAAS,CAChD,MAAMlB,EAASkB,GAAS,QAAU,KAC5BsrD,EAAaxsD,GAAQ,UAAU,YAAc,KAC7C6rI,EAAa68B,GAAcxnK,CAAO,EACpCsrD,IACFA,EAAW,4BAA8Bq/E,GAAY,sBAAwB,IAE3Er/E,GAAY,8BAAgC,IAAQ,OAAO,UAAUq/E,GAAY,WAAW,GAAKA,EAAW,aAAe,IAC7H7rI,GAAQ,2BAA2B,CAAC6rI,EAAW,WAAW,EAAG,CAAE,eAAgB,GAAM,EACrF7rI,GAAQ,gDAA6C,GAEvDA,GAAQ,gBAAa,CACvB,CAEO,SAASspK,GAA4BpoK,EAAS,CACnD,MAAMlB,EAASkB,GAAS,QAAU,KAC5BsrD,EAAaxsD,GAAQ,UAAU,YAAc,KAC7C4rI,EAAiB68B,GAAkBvnK,CAAO,EAC5CsrD,IACFA,EAAW,8BAAgCo/E,GAAgB,yBAA2B,IAEpFp/E,GAAY,gCAAkC,IAChDxsD,GAAQ,gDAA6C,EAEvDA,GAAQ,gBAAa,CACvB,CAEO,SAASupK,GAAuBroK,EAAS,CAC9C,MAAM2qI,EAAa68B,GAAcxnK,CAAO,EACxC,OAAO2qI,EACFA,EAAW,WAAaA,EAAW,YAAcA,EAAW,oBAC7D,EACN,CAEO,SAAS29B,GAAuBtoK,EAAS,CAC9C,OAAOwnK,GAAcxnK,CAAO,GAAG,YAAc,EAC/C,CAEO,SAASuoK,GAAYvoK,EAAS7L,EAAU,GAAI,CACjD,MAAM2K,EAASkB,GAAS,QAAU,KAClC,GAAI,CAAClB,EAAQ,OACb,MAAM4rI,EAAiB68B,GAAkBvnK,CAAO,EAC1CwoK,EAAoB99B,GAAgB,YAAc,IAAS29B,GAAuBroK,CAAO,EACzFyoK,EAAoB/9B,GAAgB,YAAc,IAAS49B,GAAuBtoK,CAAO,EACzF0oK,EAAiB,CACrB,GAAGpB,GACH,gBAAiBnzK,EAAQ,wBAA0BmzK,GAAwB,gBAC3E,WAAYnzK,EAAQ,oBAAsB,GAC1C,OAAQA,EAAQ,eAAiBmzK,GAAwB,MAC7D,EACMkB,EAAkB1pK,EAAO,oBAAoB,CAAE,GAAG4pK,EAAgB,aAAcL,GAAuBroK,CAAO,EAAG,EAChHlB,EAAO,qBAAkB,EAC1B2pK,EAAkB3pK,EAAO,oBAAoB,CAAE,GAAG4pK,EAAgB,aAAcJ,GAAuBtoK,CAAO,EAAG,EAChHlB,EAAO,qBAAkB,CAChC,CAEO,SAAS6pK,GAAsB3oK,EAAS,CAC7C,MAAMlB,EAASkB,GAAS,QAAU,KAC5BwqI,EAAgBxqI,GAAS,cAAc,OAAO,GAAK,KACnDyqI,EAAiBzqI,GAAS,cAAc,QAAQ,GAAK,KAC3D,GAAI,GAAClB,GAAU,CAAC0rI,GAChB,IAAIC,GAAgB,eAAgB,CAClCA,EAAe,eAAe,CAC5B,QAASD,EAAc,MAAM,WAC7B,OAAQA,EAAc,MAAM,WACvB,CAAC7kI,EAAIlL,IAAY+vI,EAAc,uBAAuB7kI,EAAIlL,CAAO,EAClE,IACV,CAAK,EACD,MACF,CACAqE,EAAO,SAAS,CACd,mBAAoB0rI,EAAc,MAAM,WACxC,kBAAmBA,EAAc,MAAM,WAClC,CAAC7kI,EAAIlL,IAAY+vI,EAAc,uBAAuB7kI,EAAIlL,CAAO,EAClE,IACR,CAAG,EACH,CC/JO,MAAMmuK,WAAsBpG,EAAS,CAC1C,OAAO,GAAK,QAEZ,YAAYruK,EAAU,GAAI,CACxB,MAAMA,CAAO,EACb,KAAK,MAAQ,CACX,UAAW,GACX,UAAW,GACX,WAAY,GACZ,iBAAkB,OAClB,oBAAqB,GACrB,wBAAyB,GACzB,0BAA2B,GAC3B,wBAAyB,GACzB,YAAa,GACb,YAAa,GACb,wBAAyB61I,GAAmBX,GAAoCA,EAAkC,EAClH,wBAAyBY,GAAmBX,GAAoCA,EAAkC,EAClH,uBAAwBY,GAA4BX,GAAuCA,EAAqC,EAChI,uBAAwBW,GAA4BX,GAAuCA,EAAqC,EAChI,wBAAyB,CACvB,mBAAoB,GACpB,kBAAmB,IAC3B,CACA,EACI,KAAK,OAAOp1I,CAAO,CACrB,CAEA,OAAO6L,EAAS,CACd,MAAM,OAAOA,CAAO,EACpB,MAAMlB,EAAS,KAAK,SAAS,QAAU,KAEvC,GAAI,EADmB,KAAK,SAAS,cAAc,QAAQ,GAAK,MAC3C,CACnB,MAAM+pK,EAAsB/pK,GAAQ,SAAM,GAAQ,CAAiB,EACnE,KAAK,MAAM,wBAA0B,CACnC,mBAAoB+pK,EAAoB,qBAAuB,GAC/D,kBAAmBA,EAAoB,mBAAqB,IACpE,CACI,CACA,YAAK,yBAAwB,EAC7B,KAAK,sBAAqB,EAC1B,KAAK,sBAAqB,EAC1B,KAAK,yBAAwB,EAC7B,KAAK,6BAA4B,EACjC,KAAK,YAAW,EAChB,KAAK,wBAAuB,EAE5B,KAAK,WAAW,KAAK,QAAQ,UAAU/pK,EAAQ,aAAelJ,GAAU,KAAK,gBAAgBA,CAAK,CAAC,CAAC,EACpG,KAAK,WAAW,KAAK,QAAQ,UAAUkJ,EAAQ,aAAelJ,GAAU,KAAK,gBAAgBA,CAAK,CAAC,CAAC,EACpG,KAAK,WAAW,KAAK,QAAQ,UAAUkJ,EAAQ,mBAAoB,IAAM,KAAK,sBAAqB,CAAE,CAAC,EACtG,KAAK,WAAW,KAAK,QAAQ,UAAUA,EAAQ,mBAAoB,IAAM,KAAK,sBAAqB,CAAE,CAAC,EACtG,KAAK,WAAW,KAAK,QAAQ,UAAUA,EAAQ,oBAAsBlJ,GAAU,KAAK,sBAAsBA,CAAK,CAAC,CAAC,EAC1G,IACT,CAEA,QAAS,CACP,MAAM60I,EAAiB,KAAK,SAAS,cAAc,QAAQ,GAAK,KAC5DA,GAAgB,iBAAkBA,EAAe,iBAAiB,CAAE,OAAQ,GAAM,EACjF,KAAK,SAAS,QAAQ,SAAS,KAAK,MAAM,uBAAuB,EACtE,KAAK,eAAe,CAAE,OAAQ,EAAI,CAAE,EACpC,KAAK,eAAe,CAAE,OAAQ,EAAI,CAAE,EACpC,MAAMn/E,EAAa,KAAK,SAAS,QAAQ,UAAU,YAAc,KACjE,OAAIA,IAAYA,EAAW,4BAA8B,IACzD,KAAK,YAAW,EAChB,KAAK,wBAAuB,EACrB,MAAM,OAAM,CACrB,CAEA,OAAOn3D,EAAU,GAAI,CAEnB,GADA,MAAM,OAAOA,CAAO,EAChB,CAACA,GAAW,OAAOA,GAAY,SAAU,OAAO,KACpD,MAAM8K,EAAQ,KAAK,MACnB,OAAI,OAAO,UAAU,eAAe,KAAK9K,EAAS,iBAAiB,IAAG8K,EAAM,UAAY9K,EAAQ,kBAAoB,IAChH,OAAO,UAAU,eAAe,KAAKA,EAAS,WAAW,IAAG8K,EAAM,UAAY9K,EAAQ,YAAc,IACpG,OAAO,UAAU,eAAe,KAAKA,EAAS,iBAAiB,IAAG8K,EAAM,UAAY9K,EAAQ,kBAAoB,IAChH,OAAO,UAAU,eAAe,KAAKA,EAAS,WAAW,IAAG8K,EAAM,UAAY9K,EAAQ,YAAc,IACpG,OAAO,UAAU,eAAe,KAAKA,EAAS,mBAAmB,IAAG8K,EAAM,WAAa9K,EAAQ,oBAAsB,IACrH,OAAO,UAAU,eAAe,KAAKA,EAAS,YAAY,IAAG8K,EAAM,WAAa9K,EAAQ,aAAe,IACvG,OAAO,UAAU,eAAe,KAAKA,EAAS,kBAAkB,GAAK,OAAOA,EAAQ,kBAAqB,WAC3G8K,EAAM,iBAAmB9K,EAAQ,kBAAoB,QAEnD,OAAO,UAAU,eAAe,KAAKA,EAAS,qBAAqB,IAAG8K,EAAM,oBAAsB9K,EAAQ,sBAAwB,IAClI,OAAO,UAAU,eAAe,KAAKA,EAAS,yBAAyB,IAAG8K,EAAM,wBAA0B9K,EAAQ,0BAA4B,IAC9I,OAAO,UAAU,eAAe,KAAKA,EAAS,2BAA2B,IAAG8K,EAAM,0BAA4B9K,EAAQ,4BAA8B,IACpJ,OAAO,UAAU,eAAe,KAAKA,EAAS,yBAAyB,IACzE8K,EAAM,wBAA0B9K,EAAQ,0BAA4B,IAElE,OAAO,UAAU,eAAe,KAAKA,EAAS,yBAAyB,IACzE8K,EAAM,wBAA0B+qI,GAAmB71I,EAAQ,wBAAyBk1I,EAAkC,GAEpH,OAAO,UAAU,eAAe,KAAKl1I,EAAS,yBAAyB,IACzE8K,EAAM,wBAA0BgrI,GAAmB91I,EAAQ,wBAAyBm1I,EAAkC,GAEpH,OAAO,UAAU,eAAe,KAAKn1I,EAAS,wBAAwB,IACxE8K,EAAM,uBAAyBirI,GAA4B/1I,EAAQ,uBAAwBo1I,EAAqC,GAE9H,OAAO,UAAU,eAAe,KAAKp1I,EAAS,wBAAwB,IACxE8K,EAAM,uBAAyBirI,GAA4B/1I,EAAQ,uBAAwBo1I,EAAqC,GAE9H,KAAK,UACF8+B,GAAuB,KAAK,OAAO,GAAG,KAAK,eAAe,CAAE,OAAQ,GAAM,EAC1EC,GAAuB,KAAK,OAAO,GAAG,KAAK,eAAe,CAAE,OAAQ,GAAM,EAC/E,KAAK,sBAAqB,EAC1B,KAAK,yBAAwB,EAC7B,KAAK,6BAA4B,EACjC,KAAK,SAAS,QAAQ,0BAA0BrpK,EAAM,uBAAuB,EAC7E,KAAK,YAAW,EAChB,KAAK,wBAAuB,GAE9B,KAAK,WAAW,SAAS,EAClB,IACT,CAEA,WAAY,CACV,MAAO,CACL,QAAS,CACP,UAAW,KAAK,MAAM,UACtB,UAAW,KAAK,MAAM,UACtB,WAAY,KAAK,MAAM,WACvB,iBAAkB,KAAK,MAAM,iBAC7B,oBAAqB,KAAK,MAAM,oBAChC,wBAAyB,KAAK,MAAM,wBACpC,0BAA2B,KAAK,MAAM,0BACtC,wBAAyB,KAAK,MAAM,wBACpC,wBAAyB,CAAE,GAAG,KAAK,MAAM,uBAAuB,EAChE,wBAAyB,CAAE,GAAG,KAAK,MAAM,uBAAuB,EAChE,uBAAwB,CAAE,GAAG,KAAK,MAAM,sBAAsB,EAC9D,uBAAwB,CAAE,GAAG,KAAK,MAAM,sBAAsB,CACtE,CACA,CACE,CAEA,QAAQrE,EAAW,GAAI,CACrB,MAAMzG,EAAUyG,GAAU,SAAW,OAAOA,EAAS,SAAY,SAAWA,EAAS,QAAU,CAAA,EAC/F,YAAK,OAAOzG,CAAO,EACnB,KAAK,eAAe,CAAE,OAAQ,EAAI,CAAE,EACpC,KAAK,eAAe,CAAE,OAAQ,EAAI,CAAE,EACpC,KAAK,WAAW,SAAS,EAClB,IACT,CAEA,WAAWoD,EAAQqI,EAAS,GAAI,CAC9B,KAAK,KAAK,SAAU,CAAE,OAAArI,EAAQ,MAAO,KAAK,eAAc,EAAI,GAAGqI,EAAQ,CACzE,CAEA,gBAAiB,CACf,MAAO,CAAE,GAAG,KAAK,KAAK,CACxB,CAEA,0BAA2B,CACzB6nK,GAAoC,KAAK,SAAS,QAAU,IAAI,CAClE,CAEA,uBAAwB,CACtBkB,GAAsB,KAAK,OAAO,CACpC,CAEA,0BAA2B,CACzBR,GAAyB,KAAK,OAAO,CACvC,CAEA,8BAA+B,CAC7B,KAAK,SAAS,QAAQ,0BAA0B,KAAK,MAAM,uBAAuB,CACpF,CAEA,uBAAwB,CACtB,KAAK,SAAS,QAAQ,0BAA0B,KAAK,MAAM,uBAAuB,CACpF,CAEA,yBAA0B,CACxBF,GAAwB,KAAK,OAAO,CACtC,CAEA,aAAc,CACZM,GAAY,KAAK,QAAS,KAAK,OAAO,CACxC,CAEA,uBAAuB1hK,EAAOpM,EAAU,KAAK,SAAS,SAAW,KAAM,CACrE,OAAO2sK,GAAuB3sK,EAAS,KAAK,MAAM,iBAAkBoM,CAAK,CAC3E,CAEA,eAAe1S,EAAU,GAAI,CACvB,KAAK,MAAM,YAAc,GAAKA,EAAQ,QAAU,KACpD,KAAK,MAAM,YAAc,GACzB,KAAK,SAAS,QAAQ,iBAAiB,KAAM,CAAC,EAC9C,KAAK,wBAAuB,EACxBA,EAAQ,SAAW,IAAM,KAAK,WAAW,kBAAkB,EACjE,CAEA,eAAeA,EAAU,GAAI,CACvB,KAAK,MAAM,YAAc,GAAKA,EAAQ,QAAU,KACpD,KAAK,MAAM,YAAc,GACzB,KAAK,SAAS,QAAQ,iBAAiB,KAAM,CAAC,EAC9C,KAAK,wBAAuB,EACxBA,EAAQ,SAAW,IAAM,KAAK,WAAW,kBAAkB,EACjE,CAEA,gBAAgByB,EAAO,CACrB,MAAMgK,EAAShK,GAAO,OAClB,CAACgK,GAAU,CAACyoK,GAAuB,KAAK,OAAO,IAC/CzoK,EAAO,QAAU,MACnB,KAAK,MAAM,YAAcA,EAAO,MAC5B,KAAK,MAAM,WAAW,KAAK,SAAS,QAAQ,iBAAiBA,EAAO,MAAO,OAAO,GAC7EA,EAAO,QAAU,OAAS,KAAK,MAAM,cAAgBA,EAAO,OACrE,KAAK,eAAe,CAAE,OAAQ,EAAI,CAAE,EAEtC,KAAK,wBAAuB,EAC5B,KAAK,WAAW,YAAY,EAC9B,CAEA,gBAAgBhK,EAAO,CACrB,MAAMgK,EAAShK,GAAO,OAClB,CAACgK,GAAU,CAAC0oK,GAAuB,KAAK,OAAO,IAC/C1oK,EAAO,QAAU,MACnB,KAAK,MAAM,YAAcA,EAAO,MAC5B,KAAK,MAAM,WAAW,KAAK,SAAS,QAAQ,iBAAiBA,EAAO,MAAO,OAAO,GAC7EA,EAAO,QAAU,OAAS,KAAK,MAAM,cAAgBA,EAAO,OACrE,KAAK,eAAe,CAAE,OAAQ,EAAI,CAAE,EAEtC,KAAK,wBAAuB,EAC5B,KAAK,WAAW,YAAY,EAC9B,CAEA,uBAAwB,CAEtB,GAAI,EADmB,KAAK,SAAS,cAAc,QAAQ,GAAK,MAC3C,CACnB,MAAMkpK,EAAe,KAAK,SAAS,QAAQ,SAAM,GAAQ,CAAiB,EAC1E,KAAK,MAAM,wBAA0B,CACnC,mBAAoBA,EAAa,qBAAuB,GACxD,kBAAmBA,EAAa,mBAAqB,IAC7D,CACI,CACA,KAAK,eAAe,CAAE,OAAQ,GAAM,MAAO,GAAM,EACjD,KAAK,eAAe,CAAE,OAAQ,GAAM,MAAO,GAAM,EACjD,KAAK,yBAAwB,EAC7B,KAAK,yBAAwB,EAC7B,KAAK,6BAA4B,EACjC,KAAK,wBAAuB,EAC5B,KAAK,sBAAqB,EAC1B,KAAK,YAAW,EAChB,KAAK,WAAW,kBAAkB,CACpC,CAEA,sBAAsBlzK,EAAO,CAC3B,MAAMmzK,EAAcnzK,GAAO,QAAQ,MAAQ,KACvCmzK,IAAgB,cAAgBA,IAAgB,eACpD,KAAK,wBAAuB,EAC5B,KAAK,WAAW,YAAY,EAC9B,CAEA,uBAAwB,CACtB,KAAK,wBAAuB,EAC5B,KAAK,WAAW,WAAW,CAC7B,CACF,CC7RA,MAAM7rK,GAAkB,OAAO,OAAO,CACpC,kBAAmB,KACnB,qBAAsB,IACtB,kBAAmB,OACnB,cAAe,EACjB,CAAC,EAED,SAASqmK,GAAkBhwK,EAAO,CAChC,GAAI,MAAM,QAAQA,CAAK,EAAG,OAAOA,EAAM,IAAKguB,GAAUgiJ,GAAkBhiJ,CAAK,CAAC,EAC9E,GAAIhuB,GAAS,OAAOA,GAAU,SAAU,CACtC,MAAMwC,EAAO,CAAA,EACb,SAAW,CAACW,EAAK6qB,CAAK,IAAK,OAAO,QAAQhuB,CAAK,EAAGwC,EAAKW,CAAG,EAAI6sK,GAAkBhiJ,CAAK,EACrF,OAAOxrB,CACT,CACA,OAAOxC,CACT,CAEA,SAASy1K,GAAkBz1K,EAAOC,EAAW0J,GAAgB,kBAAmB,CAC9E,OAAI3J,IAAU,QAAUA,IAAU,QAAgBA,EAC3CC,CACT,CAEA,SAASm/E,GAAgBp/E,EAAOC,EAAU,CACxC,MAAMC,EAAU,OAAOF,CAAK,EAC5B,OAAO,OAAO,SAASE,CAAO,EAAIA,EAAUD,CAC9C,CAEA,SAASy1K,GAAsB11K,EAAQ,GAAI,CACzC,GAAI,CAACA,GAAS,OAAOA,GAAU,SAAU,OAAO,KAChD,MAAM6uK,EAAY,OAAO7uK,EAAM,WAAc,SAAWA,EAAM,UAAY,KAC1E,OAAK6uK,EACE,CACL,QAAS7uK,EAAM,UAAY,GAC3B,UAAA6uK,EACA,OAAQ,OAAO7uK,EAAM,QAAW,SAAWA,EAAM,OAAS,SAC1D,UAAW,OAAO,SAASA,EAAM,SAAS,EAAI,OAAOA,EAAM,SAAS,EAAI,KACxE,cAAeA,EAAM,eAAiB,OAAOA,EAAM,eAAkB,SACjEgwK,GAAkBhwK,EAAM,aAAa,EACrC,IACR,EATyB,IAUzB,CAEA,SAAS21K,GAA2B31K,EAAQ,GAAI,CAC9C,MAAMuD,EAASvD,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EAC5D,MAAO,CACL,SAAUy1K,GAAkBlyK,EAAO,SAAUoG,GAAgB,iBAAiB,EAC9E,cAAe,OAAO,SAASpG,EAAO,aAAa,EAAI,OAAOA,EAAO,aAAa,EAAI,KACtF,KAAM,OAAOA,EAAO,MAAS,SAAWA,EAAO,KAAO,UACtD,aAAcA,EAAO,eAAiB,GACtC,cAAe,OAAOA,EAAO,eAAkB,SAAWA,EAAO,cAAgB,KACjF,QAASA,EAAO,UAAY,GAC5B,iBAAkBA,EAAO,mBAAqB,GAC9C,aAAcmyK,GAAsBnyK,EAAO,YAAY,CAC3D,CACA,CAEA,SAASqyK,GAAY/yK,EAAOjC,EAAS,CACnC,MAAMi1K,EAAe,OAAOhzK,CAAK,EACjC,OAAK,OAAO,SAASgzK,CAAY,EAC7BA,GAAgB,OAAOj1K,EAAQ,oBAAoB,EAAU,aAC7Di1K,GAAgB,OAAOj1K,EAAQ,iBAAiB,EAAU,UACvD,UAHoC,SAI7C,CAaO,MAAMk1K,WAA0B7G,EAAS,CAC9C,OAAO,GAAK,YAEZ,YAAYruK,EAAU,GAAI,CACxB,MAAM,CAAE,GAAG+I,GAAiB,GAAI/I,GAAW,OAAOA,GAAY,SAAWA,EAAU,CAAA,EAAK,EACxF,KAAK,mBAAqB,GAC1B,KAAK,kBAAoB,KACzB,KAAK,SAAW,GAChB,KAAK,MAAQ+0K,GAA2B,CACtC,SAAUF,GAAkB70K,GAAS,kBAAmB+I,GAAgB,iBAAiB,EACzF,KAAM,UACN,aAAc,GACd,QAAS,GACT,iBAAkB,EACxB,CAAK,CACH,CAEA,OAAO8C,EAAS,CACd,aAAM,OAAOA,CAAO,EACpB,KAAK,WAAU,EACf,KAAK,uBAAsB,EAC3B,KAAK,WAAW,QAAQ,EACjB,IACT,CAEA,OAAO7L,EAAU,GAAI,CACnB,aAAM,OAAOA,CAAO,EACpB,KAAK,QAAU,CACb,GAAG+I,GACH,GAAG,KAAK,QACR,GAAI/I,GAAW,OAAOA,GAAY,SAAWA,EAAU,CAAA,EACvD,kBAAmB60K,GACjB70K,GAAS,mBAAqB,KAAK,SAAS,mBAAqB,KAAK,MAAM,SAC5E,KAAK,MAAM,QACnB,CACA,EACQ,OAAO,UAAU,eAAe,KAAKA,GAAW,CAAA,EAAI,mBAAmB,IACzE,KAAK,MAAQ,CACX,GAAG,KAAK,MACR,SAAU60K,GAAkB70K,EAAQ,kBAAmB,KAAK,MAAM,QAAQ,CAClF,EACM,KAAK,6BAA4B,GAEnC,KAAK,cAAc,CAAE,OAAQ,EAAI,CAAE,EACnC,KAAK,WAAU,EACf,KAAK,WAAW,SAAS,EAClB,IACT,CAEA,OAAOkmH,EAAK,KAAM,CAChB,YAAK,SAAW,EAAQA,EACxB,KAAK,WAAU,EACR,IACT,CAEA,kBAAkB9mH,EAAO,CACvB,OAAI,UAAU,SAAW,EAAUo/E,GAAgB,KAAK,QAAQ,kBAAmBz1E,GAAgB,iBAAiB,GACpH,KAAK,OAAO,CAAE,kBAAmBy1E,GAAgBp/E,EAAO,KAAK,QAAQ,iBAAiB,EAAG,EAClF,KACT,CAEA,qBAAqBA,EAAO,CAC1B,OAAI,UAAU,SAAW,EAAUo/E,GAAgB,KAAK,QAAQ,qBAAsBz1E,GAAgB,oBAAoB,GAC1H,KAAK,OAAO,CAAE,qBAAsBy1E,GAAgBp/E,EAAO,KAAK,QAAQ,oBAAoB,EAAG,EACxF,KACT,CAEA,SAASA,EAAO,CACd,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,MAAM,SAC9C,MAAMwC,EAAOizK,GAAkBz1K,EAAO,KAAK,MAAM,QAAQ,EACzD,OAAIwC,IAAS,KAAK,MAAM,SAAiB,MACzC,KAAK,MAAQ,CAAE,GAAG,KAAK,MAAO,SAAUA,CAAI,EAC5C,KAAK,6BAA4B,EACjC,KAAK,WAAU,EACf,KAAK,WAAW,YAAa,CAAE,SAAUA,CAAI,CAAE,EACxC,KACT,CAEA,gBAAiB,CACf,OAAO,KAAK,SAAS,KAAK,MAAM,WAAa,OAAS,QAAU,MAAM,CACxE,CAEA,MAAO,CACL,OAAO,KAAK,MAAM,IACpB,CAEA,WAAY,CACV,OAAO,KAAK,MAAM,OAAS,WAAa,KAAK,MAAM,OAAS,YAC9D,CAEA,cAAe,CACb,OAAO,KAAK,MAAM,OAAS,YAC7B,CAEA,eAAgB,CACd,OAAO,KAAK,MAAM,aACpB,CAEA,iBAAiBK,EAAOjC,EAAU,GAAI,CACpC,MAAMi1K,EAAe,OAAOhzK,CAAK,EAC3ByoG,EAAY,OAAO,SAASuqE,CAAY,EAAIA,EAAe,KAC3DE,EAAe,KAAK,MAAM,KAC1BnqK,EAAWgqK,GAAYtqE,EAAW,KAAK,OAAO,EAC9C0qE,EAAkBD,IAAiB,WAAanqK,IAAa,UAC7DqqK,EAAqBF,IAAiB,cAAgBnqK,IAAa,aACnEsqK,EAAoBH,IAAiB,cAAgBnqK,IAAa,aAClE0oG,EAAY,CAChB,GAAG,KAAK,MACR,cAAehJ,EACf,KAAM1/F,CACZ,EAEI,OAAIoqK,GAIOpqK,IAAa,WAIbqqK,GAIAC,GAAqBtqK,IAAa,aAC3C0oG,EAAU,aAAe,GACzBA,EAAU,cAAgB,KAC1BA,EAAU,QAAU,IAGtB,KAAK,MAAQA,EACb,KAAK,6BAA6B,CAAE,qBAAsB,EAAI,CAAE,EAChE,KAAK,WAAU,GACX1zG,EAAQ,SAAW,IAAQm1K,IAAiBnqK,IAC9C,KAAK,WAAW,WAAY,CAC1B,cAAe0/F,EACf,KAAM1/F,EACN,aAAAmqK,CACR,CAAO,EAEI,IACT,CAEA,cAAcn1K,EAAU,GAAI,CAC1B,OAAO,KAAK,iBAAiB,KAAK,SAAS,IAAI,mBAAgB,GAAQ,KAAK,MAAM,cAAeA,CAAO,CAC1G,CAEA,aAAaZ,EAAO,CAClB,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,MAAM,aAC9C,MAAMwC,EAAOxC,IAAU,GACvB,OAAI,KAAK,MAAM,OAAS,aAAqB,MAC7C,KAAK,MAAQ,CACX,GAAG,KAAK,MACR,aAAcwC,EACd,cAAeA,EAAO,KAAK,MAAM,cAAgB,KACjD,QAASA,EAAO,KAAK,MAAM,QAAU,EAC3C,EACI,KAAK,WAAU,EACf,KAAK,WAAW,gBAAiB,CAAE,KAAMA,CAAI,CAAE,EACxC,KACT,CAEA,qBAAsB,CACpB,OAAO,KAAK,aAAa,EAAI,CAC/B,CAEA,sBAAuB,CACrB,OAAO,KAAK,aAAa,EAAK,CAChC,CAEA,gBAAgBumG,EAAS,CACvB,GAAI,KAAK,MAAM,OAAS,aAAc,OAAO,KAC7C,MAAM32F,EAAK,OAAO22F,GAAY,UAAYA,EAAQ,OAASA,EAAQ,KAAI,EAAK,KAC5E,GAAI,CAAC32F,EAAI,OAAO,KAChB,MAAMkiG,EAAY,CAChB,GAAG,KAAK,MACR,aAAc,GACd,cAAeliG,EACf,QAAS,EACf,EACI,YAAK,MAAQkiG,EACb,KAAK,WAAU,EACf,KAAK,WAAW,iBAAkB,CAAE,QAASliG,EAAI,QAASkiG,EAAU,QAAS,EACtE,IACT,CAEA,oBAAqB,CACnB,MAAI,CAAC,KAAK,MAAM,eAAiB,CAAC,KAAK,MAAM,QAAgB,MAC7D,KAAK,MAAQ,CACX,GAAG,KAAK,MACR,cAAe,KACf,QAAS,EACf,EACI,KAAK,WAAU,EACf,KAAK,WAAW,yBAA0B,EAAE,EACrC,KACT,CAEA,iBAAiBt0G,EAAO,CACtB,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,MAAM,iBAC9C,MAAMwC,EAAOxC,IAAU,GACvB,OAAIwC,IAAS,KAAK,MAAM,iBAAyB,MACjD,KAAK,MAAQ,CAAE,GAAG,KAAK,MAAO,iBAAkBA,CAAI,EACpD,KAAK,WAAU,EACf,KAAK,WAAW,oBAAqB,CAAE,QAASA,CAAI,CAAE,EAC/C,KACT,CAEA,WAAY,CACV,MAAO,CACL,QAAS,CACP,kBAAmB,KAAK,kBAAiB,EACzC,qBAAsB,KAAK,qBAAoB,EAC/C,kBAAmB,KAAK,MAAM,SAC9B,cAAe,KAAK,QAAQ,gBAAkB,EACtD,EACM,MAAO,CACL,SAAU,KAAK,MAAM,SACrB,iBAAkB,KAAK,MAAM,gBACrC,CACA,CACE,CAEA,QAAQ6E,EAAW,GAAI,CACrB,MAAM,QAAQA,CAAQ,EACtB,MAAM9D,EAAS8D,GAAY,OAAOA,GAAa,SAAWA,EAAW,CAAA,EAC/D8uK,EAAe5yK,EAAO,OAAO,UAAYA,EAAO,SAAS,mBAAqB,KAAK,MAAM,SACzFgmF,EAAchmF,EAAO,OAAO,kBAAoB,KAAK,MAAM,iBACjE,YAAK,MAAQ,CACX,GAAG,KAAK,MACR,SAAUkyK,GAAkBU,EAAc,KAAK,MAAM,QAAQ,EAC7D,iBAAkB5sF,IAAgB,EACxC,EACI,KAAK,cAAc,CAAE,OAAQ,EAAI,CAAE,EACnC,KAAK,WAAU,EACR,IACT,CAEA,wBAAwB3oF,EAAU,GAAI,CACpC,MAAMw1K,EAAsBx1K,EAAQ,sBAAwB,GAC5D,MAAO,CACL,SAAU,KAAK,MAAM,SACrB,KAAM,KAAK,MAAM,KACjB,iBAAkB,KAAK,MAAM,iBAC7B,aAAc,KAAK,MAAM,OAAS,aAAe,KAAK,MAAM,aAAe,GAC3E,cAAe,KAAK,MAAM,OAAS,aAAe,KAAK,MAAM,cAAgB,KAC7E,QAAS,KAAK,MAAM,OAAS,aAAe,KAAK,MAAM,QAAU,GACjE,aAAcw1K,EAAsB,KAAK,aAAY,EAAK,IAChE,CACE,CAEA,sBAAsB/uK,EAAW,GAAIzG,EAAU,CAAA,EAAI,CACjD,MAAM4B,EAAOmzK,GAA2B,CACtC,GAAG,KAAK,MACR,GAAItuK,GAAY,OAAOA,GAAa,SAAWA,EAAW,CAAA,CAChE,CAAK,EACKwyC,EAAU,KAAK,SAAS,QAAQ,SAAW,KAG3Cw8H,EAF0Bx8H,GAAS,cAAc,WAAa,IAC/D,CAACA,EAAQ,mBACmCr3C,EAAK,aAAe,KAC/D8zK,EAAmBV,GAAY,KAAK,SAAS,IAAI,mBAAgB,GAAQpzK,EAAK,cAAe,KAAK,OAAO,EAC/G,YAAK,MAAQ,CACX,GAAGA,EACH,KAAM5B,EAAQ,iBAAmB,GAAO4B,EAAK,KAAO8zK,EACpD,aAAcA,IAAqB,aAAe9zK,EAAK,aAAe,GACtE,cAAe8zK,IAAqB,aAAe9zK,EAAK,cAAgB,KACxE,QAAS8zK,IAAqB,aAAe9zK,EAAK,QAAU,GAC5D,aAAc6zK,CACpB,EACI,KAAK,WAAU,EACf,KAAK,WAAW,oBAAqB,KAAK,wBAAuB,CAAE,EAC5D,IACT,CAEA,MAAM,wBAAyB,CAC7B,OAAI,KAAK,kBAA0B,KAAK,mBACxC,KAAK,kBAAoB,KAAK,sBAAqB,EAC5C,KAAK,kBACd,CAEA,MAAM,uBAAwB,CAC5B,MAAMx8H,EAAU,KAAK,SAAS,QAAQ,SAAW,KACjD,GAAI,CAACA,EAAS,OAAO,KAErB,GAAI,CAAC,KAAK,oBAAsB,OAAOA,GAAS,iBAAoB,WAAY,CAC9E,MAAM08H,EAAc,MAAM18H,EAAQ,gBAAe,EACjD,KAAK,mBAAqB,GAC1B,MAAM28H,EAAoBD,GAAa,YAAY,iBAC/CC,IAAsB,QAAUA,IAAsB,WACxD,KAAK,MAAQ,CAAE,GAAG,KAAK,MAAO,SAAUA,CAAiB,EAE7D,CAEA,MAAMC,EAA0B58H,GAAS,cAAc,WAAa,IAC/D,CAACA,EAAQ,mBACV,CAAC48H,GAA2B,KAAK,MAAM,eACzC,KAAK,MAAQ,CACX,GAAG,KAAK,MACR,aAAc,IACtB,GAEI,MAAMC,EAAe78H,EACrB,GAAI48H,GAA2B,KAAK,QAAQ,gBAAkB,IAAS,OAAOC,GAAc,iBAAoB,WAAY,CAC1H,MAAM1vB,EAAS,MAAM0vB,EAAa,gBAAgB,CAAE,MAAO,KAAK,QAAQ,oBAAsB,EAAG,EAC7F1vB,GAAQ,YACV,KAAK,MAAQ,CACX,GAAG,KAAK,MACR,aAAcgpB,GAAkBhpB,CAAM,CAChD,EAEI,CAEA,YAAK,WAAU,EACf,KAAK,WAAW,oBAAqB,CACnC,SAAU,KAAK,MAAM,SACrB,aAAcgpB,GAAkB,KAAK,MAAM,YAAY,CAC7D,CAAK,EACM,EACT,CAEA,MAAM,6BAA6BpvK,EAAU,GAAI,CAC/C,MAAMi5C,EAAU,KAAK,SAAS,QAAQ,SAAW,KACjD,GAAI,CAACA,GAAS,kBAAmB,OAAO,KACxC,MAAMmU,EAAQ,CACZ,WAAY,CACV,gBAAiB,KAAK,MAAM,QACpC,CACA,EACQptD,EAAQ,uBAAyB,KACnCotD,EAAM,WAAW,kBAAoB,KAAK,MAAM,KAChDA,EAAM,WAAW,cAAgB,KAAK,MAAM,OAAS,UAAY,KAAO,KAAK,MAAM,MAErF,GAAI,CACF,OAAO,MAAMnU,EAAQ,kBAAkBmU,CAAK,CAC9C,OAASnpD,EAAO,CACd,eAAQ,KAAK,kDAAmDA,CAAK,EAC9D,IACT,CACF,CAEA,cAAe,CACb,OAAO,KAAK,MAAM,aAAemrK,GAAkB,KAAK,MAAM,YAAY,EAAI,IAChF,CAEA,MAAM,cAAcpvK,EAAU,GAAI,CAChC,MAAMomJ,EAAS,KAAK,MAAM,aACpBntG,EAAU,KAAK,SAAS,QAAQ,SAAW,KAC3Cg1H,EAAYjuK,EAAQ,WAAaomJ,GAAQ,WAAa,KACtDiK,EAAgBp3G,EACtB,GAAI,CAACg1H,GAAc,CAAC5d,GAAe,eAAiB,CAACA,GAAe,eAAiB,OAAO,KAC5F,KAAK,MAAQ,CACX,GAAG,KAAK,MACR,aAAc,IACpB,EACI,KAAK,WAAU,EACf,MAAMnnB,EAAW,MAAOmnB,EAAc,gBAAgB4d,EAAWjuK,CAAO,GACnEqwJ,EAAc,iBAAiB4d,EAAWjuK,CAAO,GACtD,YAAK,WAAW,iBAAkB,CAChC,UAAAiuK,EACA,SAAU/kC,GAAY,IAC5B,CAAK,EACMA,CACT,CAEA,MAAM,WAAWlpI,EAAU,GAAI,CAC7B,MAAMomJ,EAAS,KAAK,MAAM,aACpBntG,EAAU,KAAK,SAAS,QAAQ,SAAW,KAEjD,GADA,KAAK,kBAAoB,QAAQ,QAAQ,EAAI,EACzCmtG,GAAQ,WAAantG,EAAS,CAChC,MAAMo3G,EAAgBp3G,EACjBj5C,EAAQ,SAAW,IAAQA,EAAQ,uBAAyB,GAC/D,MAAMqwJ,GAAe,gBAAgBjK,EAAO,SAAS,EAC5CpmJ,EAAQ,eAAiB,IAClC,MAAMqwJ,GAAe,sBAAsBjK,EAAO,SAAS,CAE/D,CACA,YAAK,MAAQ,CACX,GAAG,KAAK,MACR,aAAc,IACpB,EACI,KAAK,WAAU,EACf,KAAK,WAAW,cAAe,CAC7B,UAAWA,GAAQ,WAAa,IACtC,CAAK,EACM,EACT,CAEA,qBAAsB,CACpB,OAAK,KAAK,MAAM,cAChB,KAAK,MAAQ,CACX,GAAG,KAAK,MACR,aAAc,IACpB,EACI,KAAK,WAAU,EACf,KAAK,WAAW,wBAAyB,EAAE,EACpC,MAP8B,IAQvC,CAEA,YAAa,CACX,MAAMlgC,EAAK,KAAK,SAAS,IAAM,KAC3B,CAACA,GAAM,OAAOA,EAAG,6BAAgC,YACrDA,EAAG,4BAA4B,CAC7B,SAAU,KAAK,MAAM,SACrB,KAAM,KAAK,MAAM,KACjB,QAAS,KAAK,UAAS,EACvB,WAAY,KAAK,aAAY,EAC7B,aAAc,KAAK,MAAM,aACzB,cAAe,KAAK,MAAM,cAC1B,QAAS,KAAK,MAAM,QACpB,iBAAkB,KAAK,MAAM,iBAC7B,aAAc,KAAK,aAAY,CACrC,CAAK,CACH,CAEA,WAAW9iH,EAAQqI,EAAS,GAAI,CAC9B,YAAK,KAAK,SAAU,CAClB,OAAArI,EACA,GAAGgsK,GAAkB3jK,CAAM,EAC3B,MAAO,KAAK,wBAAuB,CACzC,CAAK,EACM,IACT,CACF,CC9eA,MAAMk5H,GAA6B,2BAC7BoxC,GAAgC,UAChCC,GAAoB,cACpBC,GAAkC,IAClCC,GAAuC,IAE7C,SAAS9G,GAAkBhwK,EAAO,CAChC,GAAI,MAAM,QAAQA,CAAK,EAAG,OAAOA,EAAM,IAAKguB,GAAUgiJ,GAAkBhiJ,CAAK,CAAC,EAC9E,GAAI,CAAChuB,GAAS,OAAOA,GAAU,SAAU,OAAOA,EAChD,MAAMwC,EAAO,CAAA,EACb,SAAW,CAACW,EAAK6qB,CAAK,IAAK,OAAO,QAAQhuB,CAAK,EACzC,OAAOguB,GAAU,YACjB7qB,IAAQ,WACZX,EAAKW,CAAG,EAAI6sK,GAAkBhiJ,CAAK,GAErC,OAAOxrB,CACT,CAEA,SAASsjI,GAAiBz5H,EAAS,GAAI,CACrC,MAAMkC,EAAO,CAAA,EAGb,GAFI,OAAOlC,EAAO,YAAe,UAAUkC,EAAK,KAAKlC,EAAO,UAAU,EAClE,OAAOA,EAAO,UAAa,UAAUkC,EAAK,KAAKlC,EAAO,QAAQ,EAC9D,MAAM,QAAQA,EAAO,WAAW,EAClC,UAAWlJ,KAAOkJ,EAAO,YAAiB,OAAOlJ,GAAQ,UAAUoL,EAAK,KAAKpL,CAAG,EAElF,GAAI,MAAM,QAAQkJ,EAAO,SAAS,EAChC,UAAWlJ,KAAOkJ,EAAO,UAAe,OAAOlJ,GAAQ,UAAUoL,EAAK,KAAKpL,CAAG,EAEhF,OAAOoL,CACT,CAEA,SAAS+gK,GAAiBnsK,EAAKrB,EAAQ,CACrC,MAAI,CAACqB,GAAO,CAACrB,EAAe,GACrBqB,IAAQrB,GAAUqB,EAAI,WAAW,GAAGrB,CAAM,GAAG,GAAKA,EAAO,WAAW,GAAGqB,CAAG,GAAG,CACtF,CAEA,SAAS6iI,GAAuB35H,EAAS,GAAIq8F,EAAO,GAAI,CACtD,MAAMn6F,EAAOu3H,GAAiBz5H,CAAM,EACpC,OAAKkC,EAAK,OACHA,EAAK,KAAMpL,GAAQmsK,GAAiBnsK,EAAKulG,CAAI,GAAK4mE,GAAiBnsK,EAAK,aAAaulG,CAAI,EAAE,CAAC,EAD1E,EAE3B,CAEA,SAASquE,GAAoB9yK,EAAQ,CACnC,MAAMotB,EAAa,OAAOptB,GAAQ,sBAAyB,WACtDA,EAAO,qBAAoB,GAAM,KAClC,KACJ,OAAIotB,GAAc,OAAOA,GAAe,SAAiBA,EAClD,CACL,IAAK,SACL,MAAOptB,GAAQ,aAAa,MAAQ,SACpC,QAAS,GACT,SAAU,CAAA,CACd,CACA,CAEA,SAAS+yK,GAAiBzrK,EAAQ,CAChC,MAAM8T,EAAO,OAAO9T,GAAQ,UAAU,QAAQ,MAAQ,EAAE,EAAE,YAAW,EACrE,OAAI8T,IAAS,SAAiB,aAC1BA,IAAS,UAAYA,IAAS,QAAgB,aAC3C,KACT,CAEA,SAAS43J,GAAiB1rK,EAAQ,CAChC,MAAO,CACL,CAAE,MAAO,iBAAkB,MAAO,gBAAgB,EAClD,CAAE,MAAO,YAAa,MAAO,UAAUyrK,GAAiBzrK,CAAM,CAAC,GAAG,EAClE,CAAE,MAAO,YAAa,MAAO,sBAAsB,EACnD,CAAE,MAAO,gBAAiB,MAAO,iBAAiB,EAClD,CAAE,MAAO,SAAU,MAAO,oBAAoB,CAClD,CACA,CAEA,SAAS2rK,GAAkB3rK,EAAQ,CACjC,MAAME,EAAYF,GAAQ,WAAa,KACvC,OAAKE,EACD,OAAOA,EAAU,gBAAmB,WAC/BA,EAAU,eAAc,EAE1BA,EAAU,gBAAkB,GAAQ,UAAY,UAJhC,SAKzB,CAEA,SAAS0rK,GAA6B5rK,EAAQ,CAC5C,MAAMrE,EAAUqE,GAAQ,SAAW,KAC7B8N,EAAY,OAAOnS,GAAS,SAAS,EACrCwN,EAAe,OAAOxN,GAAS,YAAY,EACjD,OAAO,KAAK,IACV,OAAO,SAASmS,CAAS,EAAIA,EAAY,EACzC,OAAO,SAAS3E,CAAY,EAAIA,EAAe,CACnD,CACA,CAEA,SAAS0iK,GAA0B7rK,EAAQ,CACzC,OAAO4rK,GAA6B5rK,CAAM,GAAKsrK,EACjD,CAEA,SAASQ,GAAyBr3K,EAAO,CACvC,OAAIA,IAAU,GAAa,GACvBA,IAAU,GAAc,GACrB,IACT,CAEA,SAASw2I,GAA2Bx2I,EAAOC,EAAUyP,EAAM,OAAO,kBAAmB,CACnF,MAAMxP,EAAU,OAAOF,CAAK,EAC5B,MAAI,CAAC,OAAO,SAASE,CAAO,GAAKA,EAAU,EAAUD,EAC9C,KAAK,IAAIC,EAASwP,CAAG,CAC9B,CAEA,SAAS4nK,IAAiB,CACxB,OAAO,OAAO,YAAgB,KAAe,OAAO,YAAY,KAAQ,WACpE,YAAY,IAAG,EACf,KAAK,IAAG,CACd,CAEA,SAASC,GAAmBlrK,EAAS,GAAI,CAEvC,OADe,OAAOA,GAAQ,QAAUA,GAAQ,QAAU,EAAE,EAAE,YAAW,IAC1D,cAAsB,GAC9BA,GAAQ,SAAW,IAAQA,GAAQ,QAAQ,SAAW,EAC/D,CAEA,SAASmrK,GAAoBjsK,EAAQvL,EAAO,CAC1C,MAAMc,EAAOyK,GAAQ,SAAS,OAAS,KAAO,KAAO,KAC/C8N,EAAY,KAAK,IAAI,EAAG,OAAO9N,GAAQ,SAAS,WAAaA,GAAQ,SAAS,cAAgB,GAAI,CAAC,EACnGxB,EAAS,IAAM,KAAK,KAAKsP,EAAY,GAAI,EACzCrP,EAAQlJ,IAAS,KAAO,IAAM,EAEpC,OAAId,IAAU,SACLuL,EAAO,aAAa,CACzB,KAAM,SACN,QAAS,CAAE,OAAQ,CAAC,KAAM,KAAM,IAAK,GAAG,CAAC,CAC/C,CAAK,EAGCvL,IAAU,YACLuL,EAAO,aAAa,CACzB,KAAM,YACN,QAAS,CACP,SAAU,CACR,MAAOzK,IAAS,KAChB,WAAY,IACtB,CACA,CACA,CAAK,EAGCd,IAAU,YACLuL,EAAO,aAAa,CACzB,KAAM,YACN,QAAS,CACP,KAAAzK,EACA,OAAQ,CAAC,EAAG,EAAG,CAAC,EAChB,OAAAiJ,EACA,MAAAC,EACA,IAAK,GACL,QAAS,IACT,QAAS,GACjB,CACA,CAAK,EAGChK,IAAU,gBACLuL,EAAO,aAAa,CACzB,KAAM,SACN,QAAS,CACP,OAAQ,SACR,KAAAzK,EACA,OAAQ,CAAC,EAAG,EAAG,CAAC,EAChB,OAAAiJ,EACA,MAAAC,EACA,OAAQ,CAChB,CACA,CAAK,EAGIuB,EAAO,aAAa,CACzB,KAAM,SACN,QAAS,CACP,OAAQ,UACR,KAAAzK,EACA,OAAQ,CAAC,EAAG,EAAG,CAAC,EAChB,OAAAiJ,EACA,MAAAC,EACA,WAAY,EACZ,YAAa,KACb,SAAU,KACV,kBAAmB,aACnB,iBAAkB,GAClB,iBAAkB,EACxB,CACA,CAAG,CACH,CAEA,SAASytK,GAA4BxzK,EAAQ,CAC3C,MAAMotB,EAAa0lJ,GAAoB9yK,CAAM,EACvCmtB,EAAa,CAAA,EACnB,UAAWrqB,KAAWsqB,EAAW,UAAY,CAAA,EACvC,CAACtqB,GAAWA,EAAQ,OAAS,WAAa,OAAOA,EAAQ,KAAQ,aACrEqqB,EAAWrqB,EAAQ,GAAG,EAAIipK,GAAkBjpK,EAAQ,KAAK,GAE3D,OAAOqqB,CACT,CAEA,SAASsmJ,GAAsB3wK,EAAS,CACtC,MAAMsY,EAAO,OAAOtY,GAAS,MAAQ,EAAE,EAAE,KAAI,EAC7C,OAAIsY,IAAS,UAAkB,UAC3BA,IAAS,SAAiB,SAC1BA,IAAS,SAAiB,SAC1BA,IAAS,SAAiB,SACvB,QACT,CAEA,MAAMs4J,GAA0B,OAAO,OAAO,CAC5C,OAAQ,SACR,WAAY,YACZ,YAAa,aACb,SAAU,UACV,IAAK,YACL,QAAS,qBACT,QAAS,WACT,MAAO,QACP,kBAAmB,YACnB,iBAAkB,kBAClB,iBAAkB,mBAClB,mBAAoB,uBACpB,oBAAqB,wBACrB,oBAAqB,mBACrB,YAAa,eACb,gBAAiB,mBACjB,YAAa,eACb,SAAU,YACV,SAAU,WACZ,CAAC,EAED,SAAS9H,GAAqB7vK,EAAO,CACnC,OAAO,OAAOA,GAAS,EAAE,EACtB,QAAQ,UAAW,GAAG,EACtB,QAAQ,sBAAuB,OAAO,EACtC,QAAQ,yBAA0B,OAAO,EACzC,QAAQ,QAAS,GAAG,EACpB,KAAI,EACJ,QAAQ,SAAW8vK,GAAUA,EAAM,YAAW,CAAE,CACrD,CAEA,SAAS8H,GAAqB7wK,EAAS,CACrC,MAAMuS,EAAW,OAAOvS,GAAS,OAAU,SAAWA,EAAQ,MAAM,KAAI,EAAK,GAC7E,GAAIuS,EAAU,OAAOA,EACrB,MAAMnW,EAAM,OAAO4D,GAAS,KAAQ,SAAWA,EAAQ,IAAI,KAAI,EAAK,GACpE,OAAO4wK,GAAwBx0K,CAAG,GAAK0sK,GAAqB1sK,CAAG,CACjE,CAEA,SAAS00K,GAAoB9wK,EAAS,CACpC,MAAMgnI,EAAahnI,GAAS,OAAS,SACjC,SACCA,GAAS,OAAS,UAAY,SAAYA,GAAS,OAAS,SAAW,SAAW,OACvF,MAAO,CACL,MAAO6wK,GAAqB7wK,CAAO,EACnC,WAAAgnI,EACA,IAAKhnI,GAAS,KAAOA,GAAS,WAAa,KAC3C,IAAKA,GAAS,KAAOA,GAAS,WAAa,KAC3C,KAAMA,GAAS,MAAQA,GAAS,WAAa,KAC7C,SAAUA,GAAS,UAAY,KAC/B,SAAU,OAAO,UAAU,eAAe,KAAKA,GAAW,CAAA,EAAI,UAAU,EAAIA,EAAQ,SAAW,KAC/F,UAAWA,GAAS,WAAa,KACjC,UAAWA,GAAS,WAAa,KACjC,MAAOA,GAAS,OAAS,KACzB,QAASA,GAAS,SAAW,KAC7B,WAAY,GAChB,CACA,CAEA,SAAS+wK,GAA4BhxC,EAAgB,CACnD,MAAMxhH,EAAU,CAAA,EAChB,UAAWve,KAAW+/H,EAAe,SAAQ,GAAM,CAAA,EAAI,CACrD,MAAM3jI,EAAM,OAAO4D,GAAS,KAAQ,SAAWA,EAAQ,IAAI,KAAI,EAAK,GAChE,CAAC5D,GAAO4D,EAAQ,OAAS,WAAa,OAAOA,EAAQ,KAAQ,aACjEue,EAAQ,cAAcniB,CAAG,EAAE,EAAI,CAC7B,YAAa4D,EAAQ,MAAQ,oBAAoB5D,CAAG,IACpD,QAAS6sK,GAAkBjpK,EAAQ,KAAK,EACxC,KAAM2wK,GAAsB3wK,CAAO,EACnC,MAAO,YACP,QAAS,CAAC,qBAAqB5D,CAAG,EAAE,EACpC,GAAI00K,GAAoB9wK,CAAO,EAC/B,OAAQ,IAAMipK,GAAkBlpC,EAAe,UAAU3jI,CAAG,CAAC,EAC7D,OAASnD,GAAU8mI,EAAe,UAAU3jI,EAAKnD,EAAO,CAAE,OAAQ,GAAM,EACxE,UAAY2pI,GAAW7C,EAAe,GAAG,SAAWzkI,GAAU,CAC1D,MAAMgK,EAAShK,GAAO,QAAUA,GAAS,CAAA,EACnCunI,EAAav9H,EAAO,KAAO,KAC3Bw9H,EAAc,MAAM,QAAQx9H,EAAO,IAAI,EAAIA,EAAO,KAAO,CAAA,EAC3Du9H,GAAcA,IAAezmI,GAC7B0mI,EAAY,QAAU,CAACA,EAAY,SAAS1mI,CAAG,GAC/C,CAACymI,GAAc,CAACC,EAAY,QAAU,CAAC7D,GAAuB35H,EAAQ,qBAAqBlJ,CAAG,EAAE,GACpGwmI,EAAO,OAAWt9H,CAAM,CAC1B,CAAC,CACT,EACE,CACA,OAAOiZ,CACT,CAEA,SAASyyJ,GAA6B9zK,EAAQ,CAC5C,OAAKA,EACDA,aAAkBmvB,GACb,CAAE,KAAM,YAAa,QAAS48I,GAAkB/rK,EAAO,OAAO,CAAC,EAEpEA,aAAkBuG,GACb,CACL,KAAM,YACN,QAAS,CACP,GAAGwlK,GAAkB/rK,EAAO,OAAO,EACnC,SAAU+rK,GAAkB/rK,EAAO,QAAQ,CACnD,CACA,EAEMA,aAAkB4E,GACb,CAAE,KAAM,SAAU,QAASmnK,GAAkB/rK,EAAO,OAAO,CAAC,EAEjEA,aAAkBiE,GACb,CAAE,KAAM,SAAU,QAAS,CAAE,OAAQ8nK,GAAkB/rK,EAAO,MAAM,EAAG,EAEzE,KAnBa,IAoBtB,CAcO,MAAM+zK,WAAuB/I,EAAS,CAC3C,OAAO,GAAK,SAEZ,YAAYruK,EAAU,GAAI,CACxB,MAAMA,CAAO,EACb,KAAK,MAAQ,CACX,kBAAmB2kI,GACnB,mBAAoB,EAC1B,EACI,KAAK,4BAA8B,OAAO,UAAU,eAAe,KAAK3kI,EAAS,oBAAoB,GAChGy2K,GAAyBz2K,EAAQ,kBAAkB,IAAM,KAC9D,KAAK,iCAAmCk2K,GACxC,KAAK,uBAAyB,KAC9B,KAAK,wBAA0B,GAC/B,KAAK,uBAAyB,IAAI,IAClC,KAAK,mBAAqB,EAC1B,KAAK,OAAOl2K,CAAO,CACrB,CAEA,OAAO6L,EAAS,CACd,MAAM,OAAOA,CAAO,EACpB,MAAMlB,EAAS,KAAK,SAAS,QAAU,KACvC,YAAK,kCAAkC,CAAE,KAAM,GAAO,WAAY,GAAO,EACzE,KAAK,WAAW,IAAM,CACpB,KAAK,4BAA2B,EAChC,KAAK,8BAA6B,CACpC,CAAC,EACD,KAAK,oCAAoCA,CAAM,EAC/C,KAAK,WAAW,KAAK,QAAQ,UAAUA,EAAQ,iBAAkB,IAAM,KAAK,WAAW,iBAAkB,CAAE,OAAQ,UAAW,cAAe,EAAK,CAAE,CAAC,CAAC,EACtJ,KAAK,WAAW,KAAK,QAAQ,UAAUA,EAAQ,eAAgB,IAAM,KAAK,WAAW,eAAgB,CAAE,OAAQ,UAAW,cAAe,EAAK,CAAE,CAAC,CAAC,EAClJ,KAAK,WAAW,KAAK,QAAQ,UAAUA,EAAQ,cAAe,IAAM,KAAK,WAAW,cAAe,CAAE,OAAQ,UAAW,cAAe,EAAK,CAAE,CAAC,CAAC,EAChJ,KAAK,WAAW,KAAK,QAAQ,UAAUA,EAAQ,mBAAoB,IAAM,CACvE,KAAK,kCAAkC,CAAE,KAAM,EAAI,CAAE,EACrD,KAAK,6BAA4B,EACjC,KAAK,WAAW,mBAAoB,CAAE,cAAe,EAAK,CAAE,CAC9D,CAAC,CAAC,EACF,KAAK,WAAW,KAAK,QAAQ,UAAUA,EAAQqrK,GAAoBv0K,GAAU,CAC3E,KAAK,gCAAgCA,GAAO,QAAUA,GAAS,CAAA,CAAE,CACnE,CAAC,CAAC,EACF,KAAK,WAAW,SAAU,CAAE,OAAQ,UAAW,cAAe,GAAO,EAC9D,IACT,CAEA,OAAOzB,EAAU,GAAI,CAEnB,GADA,MAAM,OAAOA,CAAO,EAChB,CAACA,GAAW,OAAOA,GAAY,SAAU,OAAO,KACpD,GAAI,OAAO,UAAU,eAAe,KAAKA,EAAS,mBAAmB,EAAG,CACtE,MAAMZ,EAAQY,EAAQ,kBACtB,KAAK,MAAM,kBAAoB,OAAOZ,GAAU,UAAYA,EAAM,KAAI,EAClEA,EAAM,KAAI,EACVulI,EACN,CACA,GAAI,OAAO,UAAU,eAAe,KAAK3kI,EAAS,oBAAoB,EAAG,CACvE,MAAMZ,EAAQq3K,GAAyBz2K,EAAQ,kBAAkB,EAC7DZ,IAAU,OACZ,KAAK,MAAM,mBAAqBA,EAChC,KAAK,4BAA8B,GAEvC,CACA,OAAI,OAAO,UAAU,eAAe,KAAKY,EAAS,iCAAiC,IACjF,KAAK,iCAAmC41I,GACtC51I,EAAQ,gCACRk2K,GACA,GACR,GAEQ,OAAO,UAAU,eAAe,KAAKl2K,EAAS,YAAY,GAC5D,KAAK,KAAKA,EAAQ,WAAY,CAAE,iBAAkBA,EAAQ,mBAAqB,GAAO,EAEpFA,EAAQ,YAAc,OAAOA,EAAQ,YAAe,UACtD,KAAK,WAAWA,EAAQ,WAAY,CAAE,OAAQ,GAAM,EAElD,OAAO,UAAU,eAAe,KAAKA,EAAS,SAAS,IACrDA,EAAQ,UAAY,GAAM,KAAK,MAAK,EACnC,KAAK,KAAK,yBAAyB,GAE1C,KAAK,WAAW,SAAS,EAClB,IACT,CAEA,WAAY,CACV,MAAMqD,EAAS,KAAK,SAAS,QAAQ,SAAM,GAAQ,KACnD,MAAO,CACL,QAAS,CACP,WAAY,KAAK,KAAI,EACrB,WAAYwzK,GAA4BxzK,CAAM,EAC9C,QAAS,KAAK,SAAQ,IAAO,UAC7B,mBAAoB,KAAK,mBAAkB,CACnD,CACA,CACE,CAEA,cAAe,CACb,MAAO,CACL,MAAO,CACL,YAAa,sCACb,QAAS,KAAK,UAAS,EACvB,KAAM,SACN,MAAO,YACP,QAAS,CAAC,cAAc,EACxB,OAAQ,IAAM,KAAK,UAAS,EAC5B,OAASjE,GAAU,KAAK,QAAQA,CAAK,EACrC,UAAY2pI,GAAW,KAAK,GAAG,SAAWtnI,GAAU,CAClD,MAAMgK,EAAShK,GAAO,QAAUA,GAAS,CAAA,EACnC2B,EAASqI,EAAO,QAAU,KAC5BrI,IAAW,aAAeA,IAAW,cACpCgiI,GAAuB35H,EAAQ,cAAc,GAClDs9H,EAAO,OAAWt9H,CAAM,CAC1B,CAAC,CACT,EACM,WAAY,CACV,YAAa,gCACb,QAAS,KAAK,KAAI,EAClB,KAAM,SACN,MAAO,YACP,QAAS,CAAC,mBAAmB,EAC7B,GAAI,CACF,MAAO,SACP,WAAY,SACZ,QAAS,IAAM,KAAK,QAAO,CACrC,EACQ,OAAQ,IAAM,KAAK,KAAI,EACvB,OAASrM,GAAU,KAAK,KAAKA,EAAO,CAAE,iBAAkB,GAAO,EAC/D,UAAY2pI,GAAW,KAAK,GAAG,SAAWtnI,GAAU,CAClD,MAAMgK,EAAShK,GAAO,QAAUA,GAAS,CAAA,EACpC2jI,GAAuB35H,EAAQ,mBAAmB,GACvDs9H,EAAO,OAAWt9H,CAAM,CAC1B,CAAC,CACT,EACM,QAAS,CACP,YAAa,gDACb,QAAS,KAAK,SAAQ,IAAO,UAC7B,KAAM,UACN,MAAO,UACP,QAAS,CAAC,gBAAgB,EAC1B,GAAI,CACF,MAAO,UACP,WAAY,QACtB,EACQ,OAAQ,IAAM,KAAK,SAAQ,IAAO,UAClC,OAASrM,GAAU,CACbA,IAAU,GAAM,KAAK,MAAK,EACzB,KAAK,KAAK,SAAS,CAC1B,EACA,UAAY2pI,GAAW,KAAK,GAAG,SAAWtnI,GAAU,CAClD,MAAMgK,EAAShK,GAAO,QAAUA,GAAS,CAAA,EACpC2jI,GAAuB35H,EAAQ,gBAAgB,GACpDs9H,EAAO,OAAWt9H,CAAM,CAC1B,CAAC,CACT,EACM,mBAAoB,KAAK,8BAA6B,EACtD,WAAY,CACV,YAAa,kCACb,QAAS,KAAK,WAAU,EACxB,KAAM,SACN,MAAO,YACP,QAAS,CAAC,mBAAmB,EAC7B,GAAI,CACF,MAAO,aACP,WAAY,SACZ,WAAY,GACtB,EACQ,OAAQ,IAAM,KAAK,WAAU,EAC7B,OAASrM,GAAU,KAAK,WAAWA,EAAO,CAAE,OAAQ,GAAO,EAC3D,UAAW,IAAM,IAAM,CAAC,CAChC,EACM,GAAG83K,GAA4B,IAAI,CACzC,CACE,CAEA,8BAA+B,CAC7B,MAAM9jE,EAAe,KAAK,SAAS,QAAQ,QAAU,KAAK,SAAS,QAAQ,SAAW,KACtF,GAAI,OAAOA,GAAc,UAAa,WAAY,OAAO,KACzD,MAAM1uF,EAAUwyJ,GAA4B,IAAI,EAChD,OAAI,OAAO,KAAKxyJ,CAAO,EAAE,OAAS,GAChC0uF,EAAa,SAAS,KAAM,mBAAoB1uF,CAAO,EAElD,IACT,CAEA,qCAAsC,CACpC,MAAM0uF,EAAe,KAAK,SAAS,QAAQ,QAAU,KAAK,SAAS,QAAQ,SAAW,KACtF,OAAI,OAAOA,GAAc,UAAa,WAAmB,MACzDA,EAAa,SAAS,KAAM,mBAAoB,CAC9C,mBAAoB,KAAK,8BAA6B,CAC5D,CAAK,EACM,KACT,CAEA,QAAQ3sG,EAAW,GAAI,CACrB,MAAMzG,EAAUyG,GAAU,SAAW,OAAOA,EAAS,SAAY,SAAWA,EAAS,QAAU,CAAA,EAO/F,GANIzG,EAAQ,YACV,KAAK,KAAKA,EAAQ,WAAY,CAAE,iBAAkB,GAAO,WAAY,GAAO,EAE1EA,EAAQ,YAAc,OAAOA,EAAQ,YAAe,UACtD,KAAK,WAAWA,EAAQ,WAAY,CAAE,OAAQ,GAAM,EAElD,OAAO,UAAU,eAAe,KAAKA,EAAS,oBAAoB,EAAG,CACvE,MAAMZ,EAAQq3K,GAAyBz2K,EAAQ,kBAAkB,EAC7DZ,IAAU,OACZ,KAAK,MAAM,mBAAqBA,EAChC,KAAK,4BAA8B,GAEvC,CACA,OAAIY,EAAQ,UAAY,IAAQ,KAAK,UAAS,EAC5C,KAAK,MAAK,GACDA,EAAQ,UAAY,IAAS,CAAC,KAAK,cAC5C,KAAK,KAAK,SAAS,EAErB,KAAK,WAAW,UAAW,CAAE,OAAQ,UAAW,cAAe,GAAO,EAC/D,IACT,CAEA,+BAAgC,CAC9B,MAAO,CACL,YAAa,oEACb,QAAS,KAAK,mBAAkB,EAChC,KAAM,UACN,MAAO,YACP,QAAS,CAAC,2BAA2B,EACrC,GAAI,CACF,MAAO,iBACP,WAAY,QACpB,EACM,OAAQ,IAAM,KAAK,mBAAkB,EACrC,OAASZ,GAAU,KAAK,mBAAmBA,CAAK,EAChD,UAAY2pI,GAAW,KAAK,GAAG,SAAWtnI,GAAU,CAClD,MAAMgK,EAAShK,GAAO,QAAUA,GAAS,CAAA,EACpC2jI,GAAuB35H,EAAQ,2BAA2B,GAC/Ds9H,EAAO,OAAWt9H,CAAM,CAC1B,CAAC,CACP,CACE,CAEA,WAAWrI,EAAQqI,EAAS,GAAI,CAC9B,YAAK,KAAK,SAAU,CAAE,OAAArI,EAAQ,MAAO,KAAK,eAAc,EAAI,GAAGqI,EAAQ,EAChE,IACT,CAEA,gBAAiB,CACf,MAAMglB,EAAa,KAAK,WAAU,EAC5Bg6G,EAAW,KAAK,SAAQ,EACxBT,EAAUv5G,EAAW,UAAY,GACvC,MAAO,CACL,WAAYA,EAAW,IACvB,YAAaA,EAAW,MACxB,QAAAu5G,EACA,SAAAS,EACA,QAASA,IAAa,UACtB,mBAAoB,KAAK,mBAAkB,EAC3C,uBAAwB,KAAK,8BAAgC,GAC7D,kBAAmB,KAAK,MAAM,kBAC9B,2BAA4BT,GAAWS,IAAa,UAChD9F,GACA,KAAK,MAAM,kBACf,cAAe,KAAK,QAAO,EAC3B,eAAgBwyC,GAA6B,KAAK,SAAS,QAAQ,SAAM,GAAQ,IAAI,CAC3F,CACE,CAEA,YAAa,CACX,OAAOhB,GAAoB,KAAK,SAAS,QAAQ,SAAM,GAAQ,IAAI,CACrE,CAEA,SAAU,CACR,OAAOE,GAAiB,KAAK,SAAS,QAAU,IAAI,CACtD,CAEA,UAAW,CACT,OAAO,KAAK,aAAa,UAAY,CAAA,CACvC,CAEA,UAAW,CACT,OAAOC,GAAkB,KAAK,SAAS,QAAU,IAAI,CACvD,CAEA,WAAY,CACV,OAAO,KAAK,aAAa,UAAY,EACvC,CAEA,KAAKl3K,EAAOY,EAAU,GAAI,CACxB,MAAM2K,EAAS,KAAK,SAAS,QAAU,KACvC,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,WAAU,EAAG,IACrD,GAAI,CAACA,GAAU,OAAOA,EAAO,cAAiB,YAAc,OAAOA,EAAO,QAAW,WAAY,OAAO,KACxG,MAAM0sK,EAAmB,KAAK,SAAQ,EAChC/zE,EAAaszE,GAAoBjsK,EAAQ,OAAOvL,GAAS,EAAE,EAAE,KAAI,GAAM,QAAQ,EACrF,OAAAuL,EAAO,OAAO24F,CAAU,EACxB,KAAK,6BAA4B,EAC7B,KAAK,KAAI,IAAO,SAClB34F,EAAO,aAAa3K,EAAQ,QAAU,sBAAsB,EACnDA,EAAQ,mBAAqB,IAASq3K,IAAqB,YACpE/zE,GAAY,SAAStjG,EAAQ,QAAU,sBAAsB,EAC7D2K,EAAO,cAAW,GAEhB3K,EAAQ,aAAe,IAAO,KAAK,WAAW,OAAQ,CACxD,cAAeA,EAAQ,gBAAkB,GACzC,YAAa,CAAC,mBAAmB,CACvC,CAAK,EACM,IACT,CAEA,UAAUuC,EAAKnD,EAAOY,EAAU,CAAA,EAAI,CAClC,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMmG,EAAU,KAAK,WAAW,KAAMinB,GAAUA,GAAO,MAAQ7qB,CAAG,EAClE,OAAO,OAAO4D,GAAS,KAAQ,WAAaA,EAAQ,IAAG,EAAK,MAC9D,CACA,MAAMA,EAAU,KAAK,WAAW,KAAMinB,GAAUA,GAAO,MAAQ7qB,CAAG,EAClE,OAAI,OAAO4D,GAAS,KAAQ,WAAmB,MAC/CA,EAAQ,IAAI/G,CAAK,EACbY,EAAQ,SAAW,IAAM,KAAK,WAAW,YAAa,CACxD,IAAAuC,EACA,MAAAnD,EACA,cAAeY,EAAQ,gBAAkB,GACzC,YAAa,CAAC,qBAAqBuC,CAAG,EAAE,CAC9C,CAAK,EACM,KACT,CAEA,WAAW6qD,EAAQ,GAAIptD,EAAU,CAAA,EAAI,CACnC,GAAI,UAAU,SAAW,EAAG,OAAO62K,GAA4B,KAAK,SAAS,QAAQ,SAAM,GAAQ,IAAI,EACvG,MAAMlpK,EAAO,CAAA,EACb,SAAW,CAACpL,EAAKnD,CAAK,IAAK,OAAO,QAAQguD,GAAS,CAAA,CAAE,EACnDz/C,EAAK,KAAKpL,CAAG,EACb,KAAK,UAAUA,EAAKnD,EAAO,CAAE,OAAQ,GAAM,EAE7C,OAAIY,EAAQ,SAAW,IAAM,KAAK,WAAW,aAAc,CACzD,KAAA2N,EACA,cAAe3N,EAAQ,gBAAkB,GACzC,YAAa2N,EAAK,IAAKpL,GAAQ,qBAAqBA,CAAG,EAAE,CAC/D,CAAK,EACM,IACT,CAEA,mBAAmBnD,EAAOY,EAAU,GAAI,CACtC,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,MAAM,qBAAuB,GACrE,MAAML,EAAa82K,GAAyBr3K,CAAK,EACjD,GAAIO,IAAe,KAAM,OAAO,KAChC,MAAM8E,EAAU,KAAK,MAAM,qBAAuB9E,EAClD,YAAK,MAAM,mBAAqBA,EAChC,KAAK,4BAA8B,GAC/BA,IAAe,KACjB,KAAK,4BAA2B,EAChC,KAAK,8BAA8B,CAAE,MAAO,EAAI,CAAE,IAEhD8E,GAAWzE,EAAQ,YAAc,KACnC,KAAK,WAAW,uBAAwB,CACtC,cAAeA,EAAQ,gBAAkB,GACzC,YAAa,CAAC,2BAA2B,CACjD,CAAO,EAEI,IACT,CAEA,kCAAkCA,EAAU,GAAI,CAC9C,GAAI,KAAK,8BAAgC,GAAM,OAAO,KACtD,MAAM4B,EAAO40K,GAA0B,KAAK,SAAS,QAAU,IAAI,EACnE,OAAI,KAAK,MAAM,qBAAuB50K,EAAa,MACnD,KAAK,MAAM,mBAAqBA,EAC5B5B,EAAQ,aAAe,IACzB,KAAK,oCAAmC,EAEtCA,EAAQ,OAAS,IACnB,KAAK,WAAW,+BAAgC,CAC9C,OAAQ,UACR,cAAe,EACvB,CAAO,EAEI,KACT,CAEA,6BAA8B,CAC5B,OAAI,KAAK,wBAA0B,KAAa,MAChD,aAAa,KAAK,sBAAsB,EACxC,KAAK,uBAAyB,KACvB,KACT,CAEA,oCAAoC2K,EAAS,KAAM,CACjD,MAAMo1C,EAASp1C,GAAQ,QAAQ,QAAUA,GAAQ,UAAU,QAAU,KACrE,GAAI,CAACo1C,GAAU,OAAOA,EAAO,kBAAqB,WAAY,OAAO,KACrE,MAAMu4D,EAAiB72G,GAAU,CAC/B,MAAMkrG,EAAYlrG,GAAO,UACrBkrG,GAAa,MAAM,KAAK,uBAAuB,IAAIA,CAAS,EAChE,KAAK,iCAAgC,CACvC,EACM4L,EAAiB92G,GAAU,CAC/B,MAAMkrG,EAAYlrG,GAAO,UACrBkrG,GAAa,MAAQ,CAAC,KAAK,uBAAuB,IAAIA,CAAS,GACnE,KAAK,iCAAgC,CACvC,EACM2qE,EAAgB71K,GAAU,CAC9B,MAAMkrG,EAAYlrG,GAAO,UACrBkrG,GAAa,MAAM,KAAK,uBAAuB,OAAOA,CAAS,EACnE,KAAK,iCAAgC,EACjC,KAAK,yBAAyB,KAAK,2BAA0B,CACnE,EACMqE,EAAkBvvG,GAAU,CAChC,GAAIA,GAAO,SAAW,MAAQA,EAAM,UAAY,EAAG,OACnD,MAAMkrG,EAAYlrG,GAAO,UACrBkrG,GAAa,MAAM,KAAK,uBAAuB,OAAOA,CAAS,EACnE,KAAK,iCAAgC,EACjC,KAAK,yBAAyB,KAAK,2BAA0B,CACnE,EACM4qE,EAAU,IAAM,CACpB,KAAK,iCAAgC,EACjC,KAAK,yBAAyB,KAAK,2BAA0B,CACnE,EACA,OAAAx3H,EAAO,iBAAiB,cAAeu4D,EAAe,CAAE,QAAS,GAAM,EACvEv4D,EAAO,iBAAiB,cAAew4D,EAAe,CAAE,QAAS,GAAM,EACvEx4D,EAAO,iBAAiB,YAAau3H,EAAc,CAAE,QAAS,GAAM,EACpEv3H,EAAO,iBAAiB,gBAAiBu3H,EAAc,CAAE,QAAS,GAAM,EACxEv3H,EAAO,iBAAiB,eAAgBixD,EAAgB,CAAE,QAAS,GAAM,EACzEjxD,EAAO,iBAAiB,QAASw3H,EAAS,CAAE,QAAS,GAAM,EAC3D,KAAK,WAAW,IAAM,CACpBx3H,EAAO,sBAAsB,cAAeu4D,CAAa,EACzDv4D,EAAO,sBAAsB,cAAew4D,CAAa,EACzDx4D,EAAO,sBAAsB,YAAau3H,CAAY,EACtDv3H,EAAO,sBAAsB,gBAAiBu3H,CAAY,EAC1Dv3H,EAAO,sBAAsB,eAAgBixD,CAAc,EAC3DjxD,EAAO,sBAAsB,QAASw3H,CAAO,EAC7C,KAAK,uBAAuB,MAAK,CACnC,CAAC,EACM,IACT,CAEA,kCAAmC,CACjC,YAAK,mBAAqBb,GAAc,EACpC,KAAK,yBAA2B,KAAK,uBAAuB,KAAO,GACrE,KAAK,4BAA2B,EAE3B,IACT,CAEA,4BAA6B,CAE3B,GADA,KAAK,4BAA2B,EAC5B,KAAK,uBAAuB,KAAO,EAAG,OAAO,KACjD,MAAMhpC,EAAU,KAAK,iCACrB,YAAK,uBAAyB,WAAW,IAAM,CAG7C,GAFA,KAAK,uBAAyB,KACdgpC,KAAmB,KAAK,mBAC1BhpC,GAAW,KAAK,uBAAuB,KAAO,EAAG,CAC7D,KAAK,2BAA0B,EAC/B,MACF,CACA,KAAK,8BAA6B,CACpC,EAAGA,CAAO,EACH,IACT,CAEA,kCAAmC,CAEjC,MAAM7iI,GADS,KAAK,SAAS,QAAU,OACb,WAAa,KACvC,MAAI,CAACA,GAAa,OAAOA,EAAU,kBAAqB,WAAmB,IAC3EA,EAAU,iBAAiB,GAAO,MAAM,EACxCA,EAAU,gBAAa,EACvB,KAAK,wBAA0B,GAC/B,KAAK,WAAW,oBAAqB,CACnC,OAAQ,cACR,cAAe,EACrB,CAAK,EACM,GACT,CAEA,8BAA8B7K,EAAU,GAAI,CAK1C,GAJI,CAAC,KAAK,0BACV,KAAK,wBAA0B,GAC3BA,EAAQ,QAAU,IAAQ,KAAK,mBAAkB,IAAO,KACxD,CAAC,KAAK,UAAS,GACf,KAAK,aAAe,OAAQ,MAAO,GACvC,MAAM6K,EAAY,KAAK,SAAS,QAAQ,WAAa,KACrD,MAAI,CAACA,GAAa,OAAOA,EAAU,kBAAqB,WAAmB,IAC3EA,EAAU,iBAAiB,GAAM,oBAAoB,EACrDA,EAAU,gBAAgB,oBAAoB,EAC9C,KAAK,WAAW,qBAAsB,CACpC,OAAQ,cACR,cAAe,EACrB,CAAK,EACM,GACT,CAEA,gCAAgCY,EAAS,GAAI,CAG3C,GAFI,KAAK,uBAAyB,IAC9B,CAACkrK,GAAmBlrK,CAAM,GAC1B,CAAC,KAAK,UAAS,EAAI,MAAO,GAC9B,KAAK,iCAAgC,EACrC,MAAMX,EAAQ,KAAK,SAAQ,EAC3B,OAAIA,IAAU,UAAkB,IAC5BA,IAAU,WACZ,KAAK,iCAAgC,EAEvC,KAAK,2BAA0B,EACxB,KAAK,wBACd,CAEA,kBAAkB1L,EAAOY,EAAU,GAAI,CACrC,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,MAAM,kBAC9C,MAAM4B,EAAO,OAAOxC,GAAU,UAAYA,EAAM,OAASA,EAAM,KAAI,EAAKulI,GACxE,YAAK,MAAM,kBAAoB/iI,EAC/B,KAAK,WAAW,qBAAsB,CACpC,cAAe5B,EAAQ,gBAAkB,EAC/C,CAAK,EACM,IACT,CAEA,0BAA2B,CACzB,OAAO,KAAK,SAAS,QAAQ,oCAAiC,GAAQ,CACpE,CAAE,MAAO2kI,GAA4B,MAAO,oBAAqB,UAAW,CAAC,EAC7E,CAAE,MAAOoxC,GAA+B,MAAO,mBAAoB,UAAW,CAAC,CACrF,CACE,CAEA,uBAAuB32K,EAAQ,KAAK,MAAM,kBAAmBY,EAAU,GAAI,CACzE,MAAM2K,EAAS,KAAK,SAAS,QAAU,KACvC,GAAI,CAACA,GAAQ,oCAAqC,MAAO,GACzD,MAAM28E,EAAW,OAAOloF,GAAU,UAAYA,EAAM,OAASA,EAAM,KAAI,EAAKulI,GAG5E,GAFA,KAAK,MAAM,kBAAoBr9C,EAE3B,CADU38E,EAAO,oCAAoC28E,CAAQ,EAE/D,OAAItnF,EAAQ,SAAW,IAAM,KAAK,WAAW,4BAA6B,CAAE,kBAAmBsnF,EAAU,EAClG,GAET,MAAMjkF,EAASsH,EAAO,SAAM,GAAQ,KACpC,OAAAtH,GAAQ,2BAAwB,EAC5B,KAAK,UAAS,GAAM,KAAK,SAAQ,IAAO,YAC1CA,GAAQ,SAASrD,EAAQ,QAAU,oCAAoC,EACvE2K,EAAO,cAAW,GAEhB3K,EAAQ,SAAW,IAAM,KAAK,WAAW,6BAA8B,CAAE,kBAAmBsnF,EAAU,EACnG,EACT,CAEA,OAAQ,CACN,OAAK,KAAK,UAAS,GACnB,KAAK,SAAS,QAAQ,cAAW,EACjC,KAAK,WAAW,OAAO,EAChB,MAHuB,IAIhC,CAEA,KAAKlkF,EAAS,kBAAmB,CAC/B,YAAK,SAAS,QAAQ,aAAaA,CAAM,EACzC,KAAK,WAAW,OAAQ,CAAE,WAAYA,CAAM,CAAE,EACvC,IACT,CAEA,OAAOA,EAAS,kBAAmB,CACjC,MAAMuH,EAAS,KAAK,SAAS,QAAU,KAEvC,OADeA,GAAQ,SAAM,GAAQ,OAC7B,SAASvH,CAAM,EACnB,KAAK,UAAS,GAAM,KAAK,SAAQ,IAAO,WAC1CuH,GAAQ,cAAW,EAErB,KAAK,WAAW,SAAU,CAAE,aAAcvH,CAAM,CAAE,EAC3C,IACT,CAEA,MAAMpD,EAAU,GAAI,CAClB,MAAM2K,EAAS,KAAK,SAAS,QAAU,KACjC28E,EAAWtnF,EAAQ,mBAAqB,KAAK,MAAM,kBAEzD,GAAI,CADU2K,GAAQ,sCAAsC28E,CAAQ,EAElE,YAAK,WAAW,cAAc,EACvB,GAET,KAAK,MAAM,kBAAoBA,EAC/B,MAAMjkF,EAASsH,GAAQ,SAAM,GAAQ,KACrC,OAAAtH,GAAQ,2BAAwB,EAC5BrD,EAAQ,SAAW,IACrBqD,GAAQ,SAASrD,EAAQ,QAAU,uBAAuB,GAExDA,EAAQ,QAAU,IAAS,KAAK,UAAS,GAAM,KAAK,aAAe,YACrE2K,GAAQ,cAAW,EAErB,KAAK,WAAW,OAAO,EAChB,EACT,CACF,CC94BA,MAAM6sK,GAAe,IAAI,IAAI,CAAC,YAAa,UAAW,YAAa,WAAY,WAAW,CAAC,EAE3F,SAASC,GAAYxmF,EAAS,GAAI,CAChC,MAAMrvF,EAAO,CAAA,EACb,GAAI,CAACqvF,GAAU,OAAOA,GAAW,SAAU,OAAOrvF,EAClD,SAAW,CAACW,EAAKnD,CAAK,IAAK,OAAO,QAAQ6xF,CAAM,EACzCumF,GAAa,IAAIj1K,CAAG,IACzBX,EAAKW,CAAG,EAAInD,GAAS,KAAO,KAAO,OAAOA,CAAK,GAEjD,OAAOwC,CACT,CAEA,SAAS81K,GAAgBzlF,EAAa,GAAI,CACxC,MAAMrwF,EAAO,CAAA,EACb,GAAI,CAACqwF,GAAc,OAAOA,GAAe,SAAU,OAAOrwF,EAC1D,SAAW,CAACW,EAAKnD,CAAK,IAAK,OAAO,QAAQ6yF,CAAU,EAClD,GAAKulF,GAAa,IAAIj1K,CAAG,EACzB,IAAInD,GAAS,OAAOA,GAAU,UAAY,CAAC,MAAM,QAAQA,CAAK,EAAG,CAC/DwC,EAAKW,CAAG,EAAI,CACV,EAAG,OAAOnD,EAAM,GAAK,CAAC,EACtB,EAAG,OAAOA,EAAM,GAAK,CAAC,CAC9B,EACM,QACF,CACAwC,EAAKW,CAAG,EAAInD,GAAS,KAAO,OAAS,OAAOA,CAAK,EAAE,KAAI,EAEzD,OAAOwC,CACT,CAEA,SAAS+1K,GAAW7sK,EAAQ,GAAI,CAC9B,MAAO,CACL,GAAGA,EACH,OAAQ2sK,GAAY3sK,EAAM,MAAM,EAChC,WAAY4sK,GAAgB5sK,EAAM,UAAU,CAChD,CACA,CAEA,SAAS+lK,GAAqB7wK,EAAU,GAAI,CAC1C,MAAM4B,EAAO,CAAA,EACb,GAAI,CAAC5B,GAAW,OAAOA,GAAY,SAAU,OAAO4B,EAEpD,MAAMg2K,EAAc,CAClB,UACA,oBACA,wBACA,oBACA,YACA,cACA,gBACA,cACA,gBACA,eACA,gBACA,sBACA,yBACA,uBACA,mBACJ,EACE,UAAWr1K,KAAOq1K,EACZ,OAAO,UAAU,eAAe,KAAK53K,EAASuC,CAAG,IAAGX,EAAKW,CAAG,EAAIvC,EAAQuC,CAAG,IAAM,IAGvF,MAAMs1K,EAAa,CACjB,SACA,MACA,WACA,UACA,WACA,QACA,mBACA,eACA,mBACA,UACJ,EACE,UAAWt1K,KAAOs1K,EACZ,OAAO,UAAU,eAAe,KAAK73K,EAASuC,CAAG,IAAGX,EAAKW,CAAG,EAAIvC,EAAQuC,CAAG,GAMjF,GAHI,OAAO,UAAU,eAAe,KAAKvC,EAAS,YAAY,IAC5D4B,EAAK,WAAa,OAAO5B,EAAQ,YAAe,SAAWA,EAAQ,WAAW,OAASA,EAAQ,YAE7F,OAAO,UAAU,eAAe,KAAKA,EAAS,mBAAmB,EAAG,CACtE,MAAMupD,EAAS,OAAOvpD,EAAQ,mBAAqB,EAAE,EAAE,KAAI,EAAG,YAAW,GACrEupD,IAAW,aAAeA,IAAW,YAAU3nD,EAAK,kBAAoB2nD,EAC9E,CACA,OAAI,OAAO,UAAU,eAAe,KAAKvpD,EAAS,QAAQ,IACxD4B,EAAK,OAAS61K,GAAYz3K,EAAQ,MAAM,GAEtC,OAAO,UAAU,eAAe,KAAKA,EAAS,YAAY,IAC5D4B,EAAK,WAAa81K,GAAgB13K,EAAQ,UAAU,GAG/C4B,CACT,CAaO,MAAMk2K,WAAwBzJ,EAAS,CAC5C,OAAO,GAAK,UAEZ,YAAYruK,EAAU,GAAI,CACxB,MAAMA,CAAO,EACb,KAAK,MAAQ,CACX,QAAS,GACT,OAAQ,CAAA,EACR,WAAY,CAAA,EACZ,GAAG6wK,GAAqB7wK,CAAO,CACrC,CACE,CAEA,OAAO6L,EAAS,CACd,MAAM,OAAOA,CAAO,EACpB,MAAMpC,EAAU,KAAK,SAAS,QAAQ,iCAAmC,CAAE,QAAS,EAAI,EACxF,YAAK,MAAQ,CACX,GAAGkuK,GAAWluK,CAAO,EACrB,GAAGkuK,GAAW,KAAK,KAAK,EACxB,OAAQ,CACN,GAAGF,GAAYhuK,GAAS,MAAM,EAC9B,GAAGguK,GAAY,KAAK,OAAO,MAAM,CACzC,EACM,WAAY,CACV,GAAGC,GAAgBjuK,GAAS,UAAU,EACtC,GAAGiuK,GAAgB,KAAK,OAAO,UAAU,CACjD,CACA,EACI,KAAK,YAAY,CAAE,OAAQ,GAAM,OAAQ,SAAU,EACnD,KAAK,WAAW,KAAK,QAAQ,UAAU,KAAK,SAAS,OAAQ,mBAAoB,IAAM,CACrF,KAAK,WAAW,mBAAoB,CAAE,OAAQ,UAAW,cAAe,GAAO,CACjF,CAAC,CAAC,EACK,IACT,CAEA,OAAO13K,EAAU,GAAI+3K,EAAgB,CAAA,EAAI,CACvC,MAAM,OAAO/3K,CAAO,EACpB,MAAMotD,EAAQyjH,GAAqB7wK,CAAO,EAC1C,OAAK,OAAO,KAAKotD,CAAK,EAAE,QACxB,KAAK,MAAQ,CACX,GAAG,KAAK,MACR,GAAGA,EACH,OAAQ,OAAO,UAAU,eAAe,KAAKA,EAAO,QAAQ,EACxD,CAAE,GAAGqqH,GAAY,KAAK,MAAM,MAAM,EAAG,GAAGA,GAAYrqH,EAAM,MAAM,CAAC,EACjEqqH,GAAY,KAAK,MAAM,MAAM,EACjC,WAAY,OAAO,UAAU,eAAe,KAAKrqH,EAAO,YAAY,EAChE,CAAE,GAAGsqH,GAAgB,KAAK,MAAM,UAAU,EAAG,GAAGA,GAAgBtqH,EAAM,UAAU,CAAC,EACjFsqH,GAAgB,KAAK,MAAM,UAAU,CAC/C,EACI,KAAK,YAAY,CAAE,OAAQ,GAAM,OAAQ,UAAW,EACpD,KAAK,WAAW,UAAW,CACzB,cAAeK,EAAc,gBAAkB,GAC/C,YAAa,OAAO,KAAK3qH,CAAK,EAAE,IAAK7qD,GAAQ,WAAWA,CAAG,EAAE,CACnE,CAAK,EACM,MAhBgC,IAiBzC,CAEA,WAAY,CACV,MAAO,CACL,QAASo1K,GAAW,KAAK,KAAK,CACpC,CACE,CAEA,cAAe,CACb,MAAM3xC,EAAa+C,GAAW,KAAK,GAAG,SAAWtnI,GAAUsnI,EAAO,OAAWtnI,GAAO,QAAUA,CAAK,CAAC,EAC9Fu2K,EAAY,IAAI,IAAI,CACxB,UACA,oBACA,gBACA,cACA,eACN,CAAK,EACKC,EAAe11K,GAASy1K,EAAU,IAAIz1K,CAAG,EAC3C,KAAK,MAAMA,CAAG,IAAM,GACpB,KAAK,MAAMA,CAAG,IAAM,GAClB21K,EAAiB,CACrB,SAAU,GACV,QAAS,EACT,MAAO,EACP,iBAAkB,GACxB,EACUC,EAAc51K,GAAQ,CAC1B,MAAMjD,EAAU,OAAO,KAAK,MAAMiD,CAAG,CAAC,EACtC,OAAI,OAAO,SAASjD,CAAO,EAAUA,EAC9B44K,EAAe31K,CAAG,GAAK,KAAK,MAAMA,CAAG,CAC9C,EACM61K,EAAe,CAAC71K,EAAKuiB,KAAW,CACpC,YAAa,UAAUA,EAAM,YAAW,CAAE,YAC1C,QAASmzJ,EAAY11K,CAAG,EACxB,KAAM,UACN,MAAO,YACP,QAAS,CAAC,WAAWA,CAAG,EAAE,EAC1B,GAAI,CAAE,MAAAuiB,EAAO,WAAY,QAAQ,EACjC,OAAQ,IAAMmzJ,EAAY11K,CAAG,EAC7B,OAASnD,GAAU,KAAK,OAAO,CAAE,CAACmD,CAAG,EAAGnD,IAAU,EAAI,EAAI,CAAE,cAAe,EAAK,CAAE,EAClF,UAAA4mI,CACN,GACUqyC,EAAc,CAAC91K,EAAKuiB,EAAOohG,EAAK,CAAA,KAAQ,CAC5C,YAAa,UAAUphG,EAAM,YAAW,CAAE,YAC1C,QAASqzJ,EAAW51K,CAAG,EACvB,KAAM,SACN,MAAO,YACP,QAAS,CAAC,WAAWA,CAAG,EAAE,EAC1B,GAAI,CAAE,MAAAuiB,EAAO,WAAY,SAAU,GAAGohG,CAAE,EACxC,OAAQ,IAAMiyD,EAAW51K,CAAG,EAC5B,OAASnD,GAAU,KAAK,OAAO,CAAE,CAACmD,CAAG,EAAGnD,CAAK,EAAI,CAAE,cAAe,EAAK,CAAE,EACzE,UAAA4mI,CACN,GACI,MAAO,CACL,MAAO,CACL,YAAa,sCACb,QAAS,KAAK,UAAS,EACvB,KAAM,SACN,MAAO,YACP,QAAS,CAAC,eAAe,EACzB,OAAQ,IAAM,KAAK,UAAS,EAC5B,OAAS5mI,GAAU,KAAK,QAAQA,CAAK,EACrC,UAAA4mI,CACR,EACM,QAASoyC,EAAa,UAAW,SAAS,EAC1C,kBAAmBA,EAAa,oBAAqB,YAAY,EACjE,cAAeA,EAAa,gBAAiB,aAAa,EAC1D,YAAaA,EAAa,cAAe,SAAS,EAClD,cAAeA,EAAa,gBAAiB,aAAa,EAC1D,aAAcA,EAAa,eAAgB,YAAY,EACvD,cAAeA,EAAa,gBAAiB,aAAa,EAC1D,SAAUC,EAAY,WAAY,YAAa,CAAE,IAAK,EAAG,IAAK,GAAI,KAAM,CAAC,CAAE,EAC3E,QAASA,EAAY,UAAW,WAAY,CAAE,IAAK,EAAG,IAAK,EAAG,KAAM,CAAC,CAAE,EACvE,MAAOA,EAAY,QAAS,QAAS,CAAE,IAAK,IAAM,IAAK,EAAG,KAAM,GAAI,CAAE,EACtE,iBAAkBA,EAAY,mBAAoB,aAAc,CAAE,IAAK,GAAI,IAAK,IAAK,KAAM,CAAC,CAAE,EAC9F,OAAQ,CACN,YAAa,wBACb,QAASZ,GAAY,KAAK,MAAM,MAAM,EACtC,KAAM,SACN,MAAO,YACP,QAAS,CAAC,gBAAgB,EAC1B,OAAQ,IAAMA,GAAY,KAAK,MAAM,MAAM,EAC3C,OAASr4K,GAAU,KAAK,OAAO,CAAE,OAAQA,GAAS,CAAE,cAAe,GAAO,EAC1E,UAAA4mI,CACR,EACM,WAAY,CACV,YAAa,4BACb,QAAS0xC,GAAgB,KAAK,MAAM,UAAU,EAC9C,KAAM,SACN,MAAO,YACP,QAAS,CAAC,oBAAoB,EAC9B,OAAQ,IAAMA,GAAgB,KAAK,MAAM,UAAU,EACnD,OAASt4K,GAAU,KAAK,OAAO,CAAE,WAAYA,GAAS,CAAE,cAAe,GAAO,EAC9E,UAAA4mI,CACR,CACA,CACE,CAEA,QAAQv/H,EAAW,GAAI,CACrB,MAAMzG,EAAUyG,GAAU,SAAW,OAAOA,EAAS,SAAY,SAAWA,EAAS,QAAU,CAAA,EAC/F,YAAK,OAAOzG,EAAS,CAAE,cAAe,EAAK,CAAE,EAC7C,KAAK,WAAW,UAAW,CAAE,cAAe,EAAK,CAAE,EAC5C,IACT,CAEA,gBAAiB,CACf,OAAO23K,GAAW,KAAK,KAAK,CAC9B,CAEA,WAAWv0K,EAAQqI,EAAS,GAAI,CAC9B,KAAK,KAAK,SAAU,CAAE,OAAArI,EAAQ,MAAO,KAAK,eAAc,EAAI,GAAGqI,EAAQ,CACzE,CAEA,QAAQzL,EAAS,CACf,OAAI,UAAU,SAAW,EAAU,KAAK,eAAc,EAClDA,IAAY,IAASA,GAAW,KAAa,KAAK,OAAO,CAAE,QAAS,GAAO,EACxE,KAAK,OAAOA,CAAO,CAC5B,CAEA,QAAQZ,EAAO,CACb,OAAI,UAAU,SAAW,EAAU,KAAK,MAAM,UAAY,GACnD,KAAK,OAAO,CAAE,QAASA,IAAU,EAAI,CAAE,CAChD,CAEA,OAAOA,EAAO,CACZ,OAAI,UAAU,SAAW,EAAUq4K,GAAY,KAAK,MAAM,MAAM,EACzD,KAAK,OAAO,CAAE,OAAQr4K,CAAK,CAAE,CACtC,CAEA,WAAWA,EAAO,CAChB,OAAI,UAAU,SAAW,EAAUs4K,GAAgB,KAAK,MAAM,UAAU,EACjE,KAAK,OAAO,CAAE,WAAYt4K,CAAK,CAAE,CAC1C,CAEA,eAAeY,EAAU,GAAI,CAC3B,OAAO,KAAK,SAAS,QAAQ,kBAAkB,CAC7C,OAAQ,CACN,GAAG23K,GAAW,KAAK,KAAK,EACxB,GAAI33K,GAAS,QAAU,OAAOA,EAAQ,QAAW,SAAW23K,GAAW33K,EAAQ,MAAM,EAAI,EACjG,EACM,KAAMA,GAAS,KACf,eAAgBA,GAAS,eACzB,WAAYA,GAAS,WACrB,KAAMA,GAAS,KACf,SAAUA,GAAS,QACzB,CAAK,GAAK,CAAA,CACR,CAEA,YAAY,CAAE,OAAAowK,EAAS,EAAK,EAAK,CAAA,EAAI,CACnC,MAAMzlK,EAAS,KAAK,SAAS,QAAU,KACvCA,GAAQ,gCAAgCgtK,GAAW,KAAK,KAAK,EAAG,CAAE,OAAAvH,EAAQ,EAC1E,MAAMkI,EAAU3tK,GAAQ,8BAA2B,GAAQ,KAC3D,OAAI2tK,IAAS,KAAK,MAAQX,GAAWW,CAAO,GACrC,IACT,CACF,CC5TA,SAASC,GAAcn5K,EAAOC,EAAW,MAAO,CAC9C,MAAMo2B,EAAM,OAAOr2B,GAASC,CAAQ,EAAE,KAAI,EAAG,YAAW,EACxD,OAAIo2B,IAAQ,YAAcA,IAAQ,iBAAmBA,IAAQ,gBAAwB,gBACjFA,IAAQ,OAASA,IAAQ,QAAUA,IAAQ,YAAcA,IAAQ,QAAgB,MAC9E,MACT,CAEA,SAASo7I,GAAqB7wK,EAAU,GAAI,CAC1C,MAAM4B,EAAO,CAAA,EACb,GAAI,CAAC5B,GAAW,OAAOA,GAAY,SAAU,OAAO4B,EAEpD,GADI,OAAO,UAAU,eAAe,KAAK5B,EAAS,SAAS,IAAG4B,EAAK,QAAU5B,EAAQ,UAAY,IAC7F,OAAO,UAAU,eAAe,KAAKA,EAAS,QAAQ,EAAG,CAC3D,MAAMZ,EAAQY,EAAQ,OACtB4B,EAAK,OAAS,OAAOxC,GAAU,WAC3BA,EACCA,GAAS,MAAQ,OAAOA,CAAK,EAAE,KAAI,IAAO,GAAK,KAAO,OAAOA,CAAK,EAAE,KAAI,CAC/E,CACI,OAAO,UAAU,eAAe,KAAKY,EAAS,eAAe,IAC/D4B,EAAK,cAAgB22K,GAAcv4K,EAAQ,cAAe,MAAM,IAAM,gBAAkB,gBAAkB,UAExG,OAAO,UAAU,eAAe,KAAKA,EAAS,wBAAwB,IACxE4B,EAAK,uBAAyB5B,EAAQ,yBAA2B,IAE/D,OAAO,UAAU,eAAe,KAAKA,EAAS,iBAAiB,GAAK,MAAM,QAAQA,EAAQ,eAAe,IAC3G4B,EAAK,gBAAkB5B,EAAQ,gBAAgB,IAAKotB,GAAU,OAAOA,GAAS,EAAE,EAAE,KAAI,CAAE,EAAE,OAAO,OAAO,GAEtG,OAAO,UAAU,eAAe,KAAKptB,EAAS,aAAa,IAC7D4B,EAAK,YAAc,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK5B,EAAQ,aAAe,CAAA,EAAKotB,GAAU,OAAOA,CAAK,CAAC,EACjG,OAAQA,GAAU,OAAO,UAAUA,CAAK,GAAKA,GAAS,CAAC,CAAC,CAAC,GAE9D,MAAMyqJ,EAAa,CACjB,aACA,oBACA,gBACA,eACA,qBACA,WACA,WACA,UACA,eACA,YACA,gBACA,eACA,yBACA,qBACA,iBACJ,EACE,UAAWt1K,KAAOs1K,EACZ,OAAO,UAAU,eAAe,KAAK73K,EAASuC,CAAG,IAAGX,EAAKW,CAAG,EAAIvC,EAAQuC,CAAG,GAEjF,MAAMi2K,EAAa,CAAC,OAAQ,eAAgB,YAAY,EACxD,UAAWj2K,KAAOi2K,EAAY,CAC5B,GAAI,CAAC,OAAO,UAAU,eAAe,KAAKx4K,EAASuC,CAAG,EAAG,SACzD,MAAMnD,EAAQY,EAAQuC,CAAG,EACzBX,EAAKW,CAAG,EAAI,OAAOnD,GAAU,SAAWA,EAAM,KAAI,EAAKA,CACzD,CACA,OAAI,OAAO,UAAU,eAAe,KAAKY,EAAS,uBAAuB,IACvE4B,EAAK,sBAAwB5B,EAAQ,wBAA0B,IAE1D4B,CACT,CAEA,SAAS62K,GAAkBhtK,EAAS,GAAIq8F,EAAO,GAAI,CACjD,MAAMn6F,EAAO,CAAA,EAGb,GAFI,OAAOlC,EAAO,YAAe,UAAUkC,EAAK,KAAKlC,EAAO,UAAU,EAClE,OAAOA,EAAO,UAAa,UAAUkC,EAAK,KAAKlC,EAAO,QAAQ,EAC9D,MAAM,QAAQA,EAAO,WAAW,EAClC,UAAWlJ,KAAOkJ,EAAO,YAAiB,OAAOlJ,GAAQ,UAAUoL,EAAK,KAAKpL,CAAG,EAElF,GAAI,MAAM,QAAQkJ,EAAO,SAAS,EAChC,UAAWlJ,KAAOkJ,EAAO,UAAe,OAAOlJ,GAAQ,UAAUoL,EAAK,KAAKpL,CAAG,EAEhF,OAAKoL,EAAK,OACHA,EAAK,KAAMpL,GAAQA,IAAQulG,GAAQvlG,EAAI,WAAW,GAAGulG,CAAI,GAAG,GAAKA,EAAK,WAAW,GAAGvlG,CAAG,GAAG,CAAC,EADzE,EAE3B,CAEA,SAASm2K,GAAqBtwB,EAAUtgD,EAAM,CAC5C,OAAQihC,GACF,OAAOA,GAAW,WAAmB,IAAM,CAAC,EACzCqf,EAAS,GAAG,SAAW3mJ,GAAU,CACtC,MAAMgK,EAAShK,GAAO,QAAUA,GAAS,CAAA,EACpCg3K,GAAkBhtK,EAAQq8F,CAAI,GACnCihC,EAAO,OAAWt9H,CAAM,CAC1B,CAAC,CAEL,CAoBO,MAAMktK,WAAuBtK,EAAS,CAC3C,OAAO,GAAK,SAEZ,YAAYruK,EAAU,GAAI,CACxB,MAAMA,CAAO,EACb,KAAK,MAAQ,CACX,QAAS,GACT,GAAG6wK,GAAqB7wK,CAAO,CACrC,EACI,KAAK,aAAe,CAClB,QAAS,GACT,OAAQ,IACd,CACE,CAEA,OAAO6L,EAAS,CACd,MAAM,OAAOA,CAAO,EACpB,MAAMpC,EAAU,KAAK,SAAS,QAAQ,gCAAkC,CAAE,QAAS,EAAK,EACxF,YAAK,MAAQ,CAAE,GAAGA,EAAS,GAAG,KAAK,KAAK,EACxC,KAAK,YAAY,CAAE,OAAQ,GAAM,OAAQ,SAAU,EACnD,KAAK,WAAW,KAAK,QAAQ,UAAU,KAAK,SAAS,OAAQ,mBAAoB,IAAM,CACrF,KAAK,YAAY,CAAE,OAAQ,GAAM,OAAQ,mBAAoB,EAC7D,KAAK,WAAW,kBAAkB,CACpC,CAAC,CAAC,EACK,IACT,CAEA,OAAOzJ,EAAU,GAAI+3K,EAAgB,CAAA,EAAI,CACvC,MAAM,OAAO/3K,CAAO,EACpB,MAAMotD,EAAQyjH,GAAqB7wK,CAAO,EAC1C,GAAI,OAAO,KAAKotD,CAAK,EAAE,SAAW,EAAG,OAAO,KAC5C,KAAK,MAAQ,CAAE,GAAG,KAAK,MAAO,GAAGA,CAAK,EACtC,KAAK,YAAY,CAAE,OAAQ,GAAM,OAAQ,UAAW,EACpD,MAAMwrH,EAAc,IAAI,IAAI,OAAO,KAAKxrH,CAAK,EAAE,IAAK7qD,GAAQ,UAAUA,CAAG,EAAE,CAAC,EAC5E,OAAI,OAAO,UAAU,eAAe,KAAK6qD,EAAO,SAAS,GAAK,OAAO,UAAU,eAAe,KAAKA,EAAO,eAAe,KACvHwrH,EAAY,IAAI,gBAAgB,EAChCA,EAAY,IAAI,aAAa,GAE/B,KAAK,WAAW,UAAW,CACzB,cAAeb,EAAc,gBAAkB,GAC/C,YAAa,MAAM,KAAKa,CAAW,CACzC,CAAK,EACM,IACT,CAEA,WAAY,CACV,MAAO,CACL,QAAS,CAAE,GAAG,KAAK,KAAK,CAC9B,CACE,CAEA,cAAe,CACb,MAAM5yC,EAAazjI,GAAQm2K,GAAqB,KAAM,UAAUn2K,CAAG,EAAE,EACrE,MAAO,CACL,MAAO,CACL,YAAa,qCACb,QAAS,KAAK,UAAS,EACvB,KAAM,SACN,MAAO,YACP,QAAS,CAAC,cAAc,EACxB,OAAQ,IAAM,KAAK,UAAS,EAC5B,OAASnD,GAAU,KAAK,QAAQA,CAAK,EACrC,UAAW,IAAM,IAAM,CAAC,CAChC,EACM,QAAS,CACP,YAAa,8BACb,QAAS,KAAK,MAAM,UAAY,GAChC,KAAM,UACN,MAAO,YACP,QAAS,CAAC,gBAAgB,EAC1B,GAAI,CAAE,MAAO,UAAW,WAAY,QAAQ,EAC5C,OAAQ,IAAM,KAAK,MAAM,UAAY,GACrC,OAASA,GAAU,KAAK,QAAQA,IAAU,GAAM,CAAE,cAAe,GAAO,EACxE,UAAW4mI,EAAU,SAAS,CACtC,EACM,KAAM,CACJ,YAAa,wBACb,QAAS,KAAK,KAAI,EAClB,KAAM,SACN,MAAO,YACP,QAAS,CAAC,aAAa,EACvB,GAAI,CACF,MAAO,OACP,WAAY,SACZ,QAAS,CAAC,MAAO,OAAQ,eAAe,CAClD,EACQ,OAAQ,IAAM,KAAK,KAAI,EACvB,OAAS5mI,GAAU,KAAK,KAAKA,EAAO,CAAE,cAAe,GAAO,EAC5D,UAAW4mI,EAAU,MAAM,CACnC,EACM,OAAQ,CACN,YAAa,4CACb,QAAS,KAAK,MAAM,QAAU,KAC9B,KAAM,SACN,MAAO,YACP,QAAS,CAAC,eAAe,EACzB,GAAI,CAAE,MAAO,SAAU,WAAY,MAAM,EACzC,OAAQ,IAAM,KAAK,OAAM,EACzB,OAAS5mI,GAAU,KAAK,OAAOA,CAAK,EACpC,UAAW4mI,EAAU,QAAQ,CACrC,EACM,WAAY,CACV,YAAa,0BACb,QAAS,KAAK,WAAU,EACxB,KAAM,SACN,MAAO,YACP,QAAS,CAAC,mBAAmB,EAC7B,GAAI,CAAE,MAAO,cAAe,WAAY,SAAU,IAAK,EAAG,IAAK,IAAM,KAAM,CAAC,EAC5E,OAAQ,IAAM,KAAK,WAAU,EAC7B,OAAS5mI,GAAU,KAAK,WAAWA,CAAK,EACxC,UAAW4mI,EAAU,YAAY,CACzC,EACM,uBAAwB,CACtB,YAAa,gFACb,QAAS,KAAK,uBAAsB,EACpC,KAAM,UACN,MAAO,YACP,QAAS,CAAC,+BAA+B,EACzC,GAAI,CAAE,MAAO,sBAAuB,WAAY,QAAQ,EACxD,OAAQ,IAAM,KAAK,uBAAsB,EACzC,OAAS5mI,GAAU,KAAK,uBAAuBA,IAAU,EAAI,EAC7D,UAAW4mI,EAAU,wBAAwB,CACrD,EACM,cAAe,CACb,YAAa,yBACb,QAAS,KAAK,cAAa,EAC3B,KAAM,SACN,MAAO,YACP,QAAS,CAAC,sBAAsB,EAChC,GAAI,CAAE,MAAO,kBAAmB,WAAY,SAAU,IAAK,IAAM,IAAK,EAAG,KAAM,GAAI,EACnF,OAAQ,IAAM,KAAK,cAAa,EAChC,OAAS5mI,GAAU,KAAK,cAAcA,CAAK,EAC3C,UAAW4mI,EAAU,eAAe,CAC5C,EACM,kBAAmB,CACjB,YAAa,yCACb,QAAS,KAAK,gBAAe,EAC7B,KAAM,SACN,MAAO,YACP,QAAS,CAAC,wBAAwB,EAClC,GAAI,CAAE,MAAO,oBAAqB,WAAY,SAAU,IAAK,EAAG,IAAK,GAAI,KAAM,EAAG,EAClF,OAAQ,IAAM,KAAK,gBAAe,EAClC,OAAS5mI,GAAU,KAAK,gBAAgBA,CAAK,EAC7C,UAAW4mI,EAAU,mBAAmB,CAChD,EACM,aAAc,CACZ,YAAa,iCACb,QAAS,KAAK,aAAY,EAC1B,KAAM,SACN,MAAO,YACP,QAAS,CAAC,qBAAqB,EAC/B,GAAI,CAAE,MAAO,gBAAiB,WAAY,SAAU,IAAK,EAAG,IAAK,GAAI,KAAM,GAAI,EAC/E,OAAQ,IAAM,KAAK,aAAY,EAC/B,OAAS5mI,GAAU,KAAK,aAAaA,CAAK,EAC1C,UAAW4mI,EAAU,cAAc,CAC3C,EACM,mBAAoB,CAClB,YAAa,8BACb,QAAS,KAAK,mBAAkB,EAChC,KAAM,SACN,MAAO,YACP,QAAS,CAAC,2BAA2B,EACrC,GAAI,CAAE,MAAO,uBAAwB,WAAY,SAAU,IAAK,GAAI,IAAK,EAAG,KAAM,GAAI,EACtF,OAAQ,IAAM,KAAK,mBAAkB,EACrC,OAAS5mI,GAAU,KAAK,mBAAmBA,CAAK,EAChD,UAAW4mI,EAAU,oBAAoB,CACjD,EACM,SAAU,CACR,YAAa,sBACb,QAAS,KAAK,SAAQ,EACtB,KAAM,SACN,MAAO,YACP,QAAS,CAAC,iBAAiB,EAC3B,GAAI,CAAE,MAAO,SAAU,WAAY,SAAU,IAAK,IAAK,IAAK,GAAI,KAAM,EAAG,EACzE,OAAQ,IAAM,KAAK,SAAQ,EAC3B,OAAS5mI,GAAU,KAAK,SAASA,CAAK,EACtC,UAAW4mI,EAAU,UAAU,CACvC,EACM,SAAU,CACR,YAAa,oCACb,QAAS,KAAK,SAAQ,EACtB,KAAM,SACN,MAAO,YACP,QAAS,CAAC,iBAAiB,EAC3B,GAAI,CAAE,MAAO,YAAa,WAAY,SAAU,IAAK,EAAG,IAAK,IAAK,KAAM,CAAC,EACzE,OAAQ,IAAM,KAAK,SAAQ,EAC3B,OAAS5mI,GAAU,KAAK,SAASA,CAAK,EACtC,UAAW4mI,EAAU,UAAU,CACvC,EACM,QAAS,CACP,YAAa,sBACb,QAAS,KAAK,QAAO,EACrB,KAAM,SACN,MAAO,YACP,QAAS,CAAC,gBAAgB,EAC1B,GAAI,CAAE,MAAO,WAAY,WAAY,SAAU,IAAK,EAAG,IAAK,EAAG,KAAM,CAAC,EACtE,OAAQ,IAAM,KAAK,QAAO,EAC1B,OAAS5mI,GAAU,KAAK,QAAQA,CAAK,EACrC,UAAW4mI,EAAU,SAAS,CACtC,EACM,KAAM,CACJ,YAAa,oBACb,QAAS,KAAK,KAAI,EAClB,KAAM,SACN,MAAO,YACP,QAAS,CAAC,aAAa,EACvB,GAAI,CAAE,MAAO,OAAQ,WAAY,OAAO,EACxC,OAAQ,IAAM,KAAK,KAAI,EACvB,OAAS5mI,GAAU,KAAK,KAAKA,CAAK,EAClC,UAAW4mI,EAAU,MAAM,CACnC,EACM,aAAc,CACZ,YAAa,uBACb,QAAS,KAAK,aAAY,EAC1B,KAAM,SACN,MAAO,YACP,QAAS,CAAC,qBAAqB,EAC/B,GAAI,CAAE,MAAO,UAAW,WAAY,OAAO,EAC3C,OAAQ,IAAM,KAAK,aAAY,EAC/B,OAAS5mI,GAAU,KAAK,aAAaA,CAAK,EAC1C,UAAW4mI,EAAU,cAAc,CAC3C,EACM,WAAY,CACV,YAAa,qBACb,QAAS,KAAK,WAAU,EACxB,KAAM,SACN,MAAO,YACP,QAAS,CAAC,mBAAmB,EAC7B,GAAI,CAAE,MAAO,cAAe,WAAY,MAAM,EAC9C,OAAQ,IAAM,KAAK,WAAU,EAC7B,OAAS5mI,GAAU,KAAK,WAAWA,CAAK,EACxC,UAAW4mI,EAAU,YAAY,CACzC,CACA,CACE,CAEA,QAAQv/H,EAAW,GAAI,CACrB,MAAMzG,EAAUyG,GAAU,SAAW,OAAOA,EAAS,SAAY,SAAWA,EAAS,QAAU,CAAA,EAC/F,YAAK,OAAOzG,EAAS,CAAE,cAAe,EAAK,CAAE,EAC7C,KAAK,WAAW,UAAW,CAAE,cAAe,EAAK,CAAE,EAC5C,IACT,CAEA,gBAAiB,CACf,MAAO,CACL,GAAG,KAAK,MACR,YAAa,MAAM,KAAK,KAAK,MAAM,aAAe,EAAE,EACpD,mBAAoB,KAAK,aAAa,QACtC,kBAAmB,KAAK,aAAa,QAAU,KAAK,aAAa,OAAS,IAChF,CACE,CAEA,WAAWoD,EAAQqI,EAAS,GAAI,CAC9B,KAAK,KAAK,SAAU,CAAE,OAAArI,EAAQ,MAAO,KAAK,eAAc,EAAI,GAAGqI,EAAQ,CACzE,CAEA,OAAOzL,EAAS,CACd,OAAI,UAAU,SAAW,EAAU,KAAK,eAAc,EAClDA,GAAW,MACb,KAAK,MAAQ,CAAE,GAAG,KAAK,MAAO,QAAS,EAAK,EAC5C,KAAK,iBAAiB,CAAE,OAAQ,EAAI,CAAE,EACtC,KAAK,YAAY,CAAE,OAAQ,GAAM,OAAQ,UAAW,EACpD,KAAK,WAAW,SAAS,EAClB,MAELA,GAAW,OAAOA,GAAY,UAAYA,EAAQ,UAAY,IAC7D,CAAC,OAAO,UAAU,eAAe,KAAKA,EAAS,eAAe,EAC1D,KAAK,OAAO,CAAE,cAAe,SAAU,GAAGA,EAAS,EAErD,KAAK,OAAOA,CAAO,CAC5B,CAEA,QAAQZ,EAAOY,EAAU,GAAI,CAC3B,OAAI,UAAU,SAAW,EAAU,KAAK,KAAI,IAAO,MAC5C,KAAK,KAAKZ,IAAU,GAAO,OAAS,MAAOY,CAAO,CAC3D,CAEA,KAAKZ,EAAOY,EAAU,GAAI,CACxB,GAAI,UAAU,SAAW,EACvB,OAAI,KAAK,MAAM,UAAY,GAAa,MACjC,KAAK,MAAM,gBAAkB,gBAAkB,gBAAkB,OAE1E,MAAM4B,EAAO22K,GAAcn5K,EAAO,KAAK,KAAI,CAAE,EAC7C,OAAIwC,IAAS,MAAc,KAAK,OAAO,CAAE,QAAS,EAAK,EAAI5B,CAAO,EAC3D,KAAK,OAAO,CACjB,QAAS,GACT,cAAe4B,IAAS,gBAAkB,gBAAkB,QAClE,EAAO5B,CAAO,CACZ,CAEA,uBAAuBZ,EAAO,CAC5B,OAAI,UAAU,SAAW,EAAU,KAAK,MAAM,yBAA2B,GAClE,KAAK,OAAO,CAAE,uBAAwBA,IAAU,EAAI,CAAE,CAC/D,CAEA,WAAWA,EAAO,CAChB,OAAI,UAAU,SAAW,EAAU,OAAO,KAAK,MAAM,YAAc,CAAC,EAC7D,KAAK,OAAO,CAAE,WAAY,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOA,CAAK,GAAK,CAAC,CAAC,CAAC,CAAE,CAChF,CAEA,cAAcA,EAAO,CACnB,GAAI,UAAU,SAAW,EAAG,OAAO,OAAO,KAAK,MAAM,eAAiB,CAAC,EACvE,MAAME,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,OAAO,CAAE,cAAe,KAAK,IAAI,IAAMA,CAAO,EAAG,EADvB,IAExC,CAEA,gBAAgBF,EAAO,CACrB,GAAI,UAAU,SAAW,EAAG,OAAO,OAAO,KAAK,MAAM,mBAAqB,CAAC,EAC3E,MAAME,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,OAAO,CAAE,kBAAmB,KAAK,IAAI,EAAGA,CAAO,EAAG,EADxB,IAExC,CAEA,aAAaF,EAAO,CAClB,GAAI,UAAU,SAAW,EAAG,OAAO,OAAO,KAAK,MAAM,cAAgB,CAAC,EACtE,MAAME,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,OAAO,CAAE,aAAc,KAAK,IAAI,EAAGA,CAAO,EAAG,EADnB,IAExC,CAEA,mBAAmBF,EAAO,CACxB,GAAI,UAAU,SAAW,EAAG,OAAO,OAAO,KAAK,MAAM,oBAAsB,CAAC,EAC5E,MAAME,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,OAAO,CAAE,mBAAoBA,CAAO,CAAE,EADZ,IAExC,CAEA,SAASF,EAAO,CACd,GAAI,UAAU,SAAW,EAAG,OAAO,OAAO,KAAK,MAAM,UAAY,CAAC,EAClE,MAAME,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,OAAO,CAAE,SAAUA,CAAO,CAAE,EADF,IAExC,CAEA,SAASF,EAAO,CACd,GAAI,UAAU,SAAW,EAAG,OAAO,OAAO,KAAK,MAAM,UAAY,CAAC,EAClE,MAAME,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,OAAO,CAAE,SAAU,KAAK,IAAI,EAAG,KAAK,MAAMA,CAAO,CAAC,CAAC,CAAE,EAD3B,IAExC,CAEA,QAAQF,EAAO,CACb,GAAI,UAAU,SAAW,EAAG,OAAO,OAAO,KAAK,MAAM,SAAW,CAAC,EACjE,MAAME,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,OAAO,CAAE,QAAS,KAAK,IAAI,EAAG,KAAK,MAAMA,CAAO,CAAC,CAAC,CAAE,EAD1B,IAExC,CAEA,KAAKF,EAAO,CACV,OAAI,UAAU,SAAW,EAAU,KAAK,MAAM,MAAQ,KAC/C,KAAK,OAAO,CAAE,KAAMA,CAAK,CAAE,CACpC,CAEA,aAAaA,EAAO,CAClB,OAAI,UAAU,SAAW,EAAU,KAAK,MAAM,cAAgB,KACvD,KAAK,OAAO,CAAE,aAAcA,CAAK,CAAE,CAC5C,CAEA,WAAWA,EAAO,CAChB,OAAI,UAAU,SAAW,EAAU,KAAK,MAAM,YAAc,GACrD,KAAK,OAAO,CAAE,WAAY,OAAOA,GAAS,EAAE,EAAE,KAAI,EAAI,CAC/D,CAEA,OAAOA,EAAO,CACZ,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,MAAM,QAAU,KACxD,GAAI,OAAOA,GAAU,WAAY,OAAO,KAAK,OAAO,CAAE,OAAQA,EAAO,EACrE,MAAMwC,EAAOxC,GAAS,KAAO,KAAO,OAAOA,CAAK,EAAE,KAAI,EACtD,OAAO,KAAK,OAAO,CAAE,OAAQwC,GAAQ,IAAI,CAAE,CAC7C,CAEA,wBAAyB,CACvB,GAAI,KAAK,QAAQ,wBAA0B,GAAO,OAAO,KACzD,MAAMoJ,EAAW,KAAK,MAAM,UAAY,IAAQ,KAAK,MAAM,gBAAkB,SACzE,OACA,gBACJ,OAAO,KAAK,KAAKA,EAAU,CAAE,cAAe,EAAK,CAAE,CACrD,CAEA,eAAe,CAAE,QAAA1H,EAAU,GAAO,OAAAX,EAAS,IAAI,EAAK,GAAI,CACtD,YAAK,aAAe,CAClB,QAASW,IAAY,GACrB,OAAQA,IAAY,GAAQX,GAAU,KAAQ,IACpD,EACI,KAAK,YAAY,CAAE,OAAQ,GAAM,OAAQ,eAAgB,EACzD,KAAK,WAAW,cAAc,EACvB,IACT,CAEA,iBAAiB3C,EAAU,GAAI,CAC7B,YAAK,aAAe,CAAE,QAAS,GAAO,OAAQ,IAAI,EAClD,KAAK,YAAY,CAAE,OAAQ,GAAM,OAAQ,qBAAsB,EAC3DA,EAAQ,SAAW,IAAM,KAAK,WAAW,oBAAoB,EAC1D,IACT,CAEA,YAAY,CAAE,OAAAowK,EAAS,EAAK,EAAK,CAAA,EAAI,CAEnC,OADe,KAAK,SAAS,QAAU,OAC/B,+BAA+B,CACrC,GAAG,KAAK,MACR,mBAAoB,KAAK,aAAa,QACtC,kBAAmB,KAAK,aAAa,QAAU,KAAK,aAAa,OAAS,IAChF,EAAO,CAAE,OAAAA,CAAM,CAAE,EACN,IACT,CACF,CC7fA,SAAShB,GAAkBhwK,EAAO,CAChC,GAAI,MAAM,QAAQA,CAAK,EAAG,OAAOA,EAAM,IAAKguB,GAAUgiJ,GAAkBhiJ,CAAK,CAAC,EAC9E,GAAI,YAAY,OAAOhuB,CAAK,EAAG,OAAO,MAAM,KAAKA,EAAQguB,GAAUgiJ,GAAkBhiJ,CAAK,CAAC,EAC3F,GAAI,CAAChuB,GAAS,OAAOA,GAAU,SAAU,OAAOA,EAChD,MAAMwC,EAAO,CAAA,EACb,SAAW,CAACW,EAAK6qB,CAAK,IAAK,OAAO,QAAQhuB,CAAK,EACzC,OAAOguB,GAAU,aACrBxrB,EAAKW,CAAG,EAAI6sK,GAAkBhiJ,CAAK,GAErC,OAAOxrB,CACT,CAEA,SAAS0sH,GAAqBr3C,EAAQ,CAEpC,GADIA,GAAU,MACV,OAAOA,GAAW,SAAU,OAAOA,EACvC,GAAI,MAAM,QAAQA,CAAM,GAAK,YAAY,OAAOA,CAAM,EAAG,OAAOA,EAAO,CAAC,EACxE,GAAI,OAAOA,GAAW,SAAU,CAC9B,MAAMtpE,EAAO,OAAO,KAAKspE,CAAM,EAC/B,GAAItpE,EAAK,OAAQ,OAAOspE,EAAOtpE,EAAK,CAAC,CAAC,CACxC,CACA,OAAOspE,CACT,CAEO,SAAS4hG,GAAyBz+H,EAAO,GAAI,CAClD,MAAMo0E,EAAKp0E,GAAM,IAAM,KACjBq0E,EAASr0E,GAAM,IACfs0E,EAAMD,GAAU,KAAO,OAAOA,CAAM,EAAI,OAC9C,OAAQx3C,GAAW,CACjB,MAAM6hG,EAAWxqD,GAAqBr3C,CAAM,EAC5C,GAAIu3C,IAAO,UAAW,OAAOsqD,GAAY,KACzC,GAAItqD,IAAO,MAAO,OAAOsqD,GAAY,MAAQ,OAAO,MAAM,OAAOA,CAAQ,CAAC,EAC1E,MAAM15K,EAAQ,OAAO05K,CAAQ,EAC7B,OAAK,OAAO,SAAS15K,CAAK,EACtBovH,IAAO,KAAaE,GAAO,MAAQtvH,IAAUsvH,EAC7CF,IAAO,KAAaE,GAAO,MAAQtvH,EAAQsvH,EAC3CF,IAAO,MAAcE,GAAO,MAAQtvH,GAASsvH,EAC7CF,IAAO,KAAaE,GAAO,MAAQtvH,EAAQsvH,EAC3CF,IAAO,MAAcE,GAAO,MAAQtvH,GAASsvH,EAC1C,GAN6B,EAOtC,CACF,CAEA,SAASqqD,GAAmBngG,EAAM,CAGhC,MADI,EADOA,GAAM,MAAQ,OAAOA,EAAK,MAAS,SAAWA,EAAK,KAAO,OAEjE,OAAOA,GAAM,MAAS,WAAmB,GACtCA,GAAM,QAAU,MACzB,CAEA,SAASogG,GAAcpgG,EAAM,CAC3B,OAAKmgG,GAAmBngG,CAAI,EAMrB,CACL,KAAMw2F,GAAkBx2F,EAAK,IAAI,EACjC,MAAOw2F,GAAkBx2F,EAAK,KAAK,EACnC,aAAcw2F,GAAkBx2F,EAAK,YAAY,EACjD,KAAM,OAAOA,EAAK,MAAS,SAAWA,EAAK,KAAO,OAClD,KAAMw2F,GAAkBx2F,EAAK,IAAI,CACrC,EAXW,CACL,YAAa,GACb,KAAMw2F,GAAkBx2F,GAAM,MAAQ,IAAI,CAChD,CASA,CAEA,SAASqgG,GAAYxyK,EAAU,CAC7B,GAAI,CAACA,GAAYA,EAAS,cAAgB,GAAM,OAAO,KACvD,MAAM2zC,EAAO3zC,EAAS,MAAQ,OAAOA,EAAS,MAAS,SAAW2oK,GAAkB3oK,EAAS,IAAI,EAAI,KACrG,OAAK2zC,EACE,CACL,KAAMA,EACN,KAAMy+H,GAAyBz+H,CAAI,EACnC,MAAOg1H,GAAkB3oK,EAAS,KAAK,EACvC,aAAc2oK,GAAkB3oK,EAAS,YAAY,EACrD,KAAM,OAAOA,EAAS,MAAS,SAAWA,EAAS,KAAO,OAC1D,KAAM2oK,GAAkB3oK,EAAS,IAAI,CACzC,EARoB,IASpB,CAEO,SAASyyK,GAA4Br2K,EAAQ,CAClD,GAAI,CAACA,GAAU,OAAOA,GAAW,SAAU,MAAO,GAClD,MAAM4b,EAAO5b,EAAO,MAAQA,EAAO,MAAQ,KAE3C,OADI,OAAOA,EAAO,OAAU,YACxB,OAAOA,EAAO,WAAc,YAAc,CAACA,EAAO,cAAsB,GACxE4b,IAAS,UACTA,IAAS,YACTA,IAAS,eACTA,IAAS,UACTA,IAAS,iBACTA,IAAS,cACTA,IAAS,cAAsB,GAC/BA,IAAS,YAAc5b,EAAO,SACzB,OAAQA,EAAO,UAAYA,EAAO,OAASA,EAAO,QAAW,SAE/D,EACT,CAEO,SAASs2K,GAAuBt2K,EAAQ,CAC7C,MAAMo5E,EAASknC,GAA0BtgH,CAAM,EAC/C,GAAI,CAACo5E,EAAQ,OAAO,KACpB,MAAMm9F,EAAeF,GAA4Bj9F,CAAM,EACjDx1E,EAAW,CACf,aAAA2yK,EACA,KAAM,OAAOn9F,EAAO,MAAS,SAAWA,EAAO,KAAQ,OAAOA,EAAO,MAAS,SAAWA,EAAO,KAAO,OACvG,WAAYmzF,GAAkBnzF,EAAO,UAAU,EAC/C,cAAeA,EAAO,cACtB,eAAgBmzF,GAAkBnzF,EAAO,cAAc,EACvD,SAAUmzF,GAAkBnzF,EAAO,QAAQ,EAC3C,MAAOmzF,GAAkBnzF,EAAO,KAAK,EACrC,MAAOmzF,GAAkBnzF,EAAO,KAAK,EACrC,UAAWA,EAAO,YAAc,GAChC,UAAWmzF,GAAkBnzF,EAAO,SAAS,EAC7C,cAAemzF,GAAkBnzF,EAAO,aAAa,EACrD,OAAQmzF,GAAkBnzF,EAAO,MAAM,EACvC,MAAOmzF,GAAkBnzF,EAAO,KAAK,EACrC,MAAOmzF,GAAkBnzF,EAAO,KAAK,EACrC,aAAcmzF,GAAkBnzF,EAAO,YAAY,EACnD,KAAMmzF,GAAkBnzF,EAAO,IAAI,EACnC,KAAMmzF,GAAkBnzF,EAAO,IAAI,EACnC,MAAO,MAAM,QAAQA,EAAO,KAAK,EAAIA,EAAO,MAAM,IAAKrD,GAASogG,GAAcpgG,CAAI,CAAC,EAAI,CAAA,CAC3F,EACE,OAAKwgG,IACH3yK,EAAS,YAAc,GACvB,OAAOA,EAAS,WAChB,OAAOA,EAAS,cAChB,OAAOA,EAAS,eAChB,OAAOA,EAAS,SAChB,OAAOA,EAAS,MAChB,OAAOA,EAAS,MAChB,OAAOA,EAAS,UAChB,OAAOA,EAAS,UAChB,OAAOA,EAAS,cAChB,OAAOA,EAAS,OAChB,OAAOA,EAAS,MAChB,OAAOA,EAAS,MAChB,OAAOA,EAAS,aAChB,OAAOA,EAAS,KAChB,OAAOA,EAAS,OAEXA,CACT,CAEO,SAAS4yK,GAAqB5yK,EAAU,CAC7C,MAAI,CAACA,GAAYA,EAAS,cAAgB,GAAa,KAC1C,CACX,KAAMA,EAAS,KACf,WAAY2oK,GAAkB3oK,EAAS,UAAU,EACjD,cAAeA,EAAS,cACxB,eAAgB2oK,GAAkB3oK,EAAS,cAAc,EACzD,SAAU2oK,GAAkB3oK,EAAS,QAAQ,EAC7C,MAAO2oK,GAAkB3oK,EAAS,KAAK,EACvC,MAAO2oK,GAAkB3oK,EAAS,KAAK,EACvC,UAAWA,EAAS,YAAc,GAClC,UAAW2oK,GAAkB3oK,EAAS,SAAS,EAC/C,cAAe2oK,GAAkB3oK,EAAS,aAAa,EACvD,OAAQ2oK,GAAkB3oK,EAAS,MAAM,EACzC,MAAO2oK,GAAkB3oK,EAAS,KAAK,EACvC,MAAO2oK,GAAkB3oK,EAAS,KAAK,EACvC,aAAc2oK,GAAkB3oK,EAAS,YAAY,EACrD,KAAM2oK,GAAkB3oK,EAAS,IAAI,EACrC,KAAM2oK,GAAkB3oK,EAAS,IAAI,EACrC,MAAO,MAAM,QAAQA,EAAS,KAAK,EAC/BA,EAAS,MAAM,IAAKmyE,GAASqgG,GAAYrgG,CAAI,CAAC,EAAE,OAAO,OAAO,EAC9D,CAAA,CACR,CAEA,CAEA,SAAS0gG,GAAYhhG,EAAQ,CAC3B,GAAKA,GAAQ,SACb,WAAWz1E,KAAUy1E,EAAO,SAAS,OAAM,EACzCA,EAAO,oBAAoBz1E,CAAM,EAEnCy1E,EAAO,SAAS,MAAK,EACvB,CAEA,SAASihG,GAAyB1nF,EAAY,CAC5C,MAAMn0C,EAAW,IAAI,IACrB,SAAW,CAAClsC,EAAI8mE,CAAM,IAAKuZ,GAAY,SAAS,UAAO,GAAQ,GAAI,CACjE,MAAMvoB,EAAW,IAAI,IACrB,SAAW,CAACgQ,EAAaz2E,CAAM,IAAKy1E,GAAQ,UAAU,UAAO,GAAQ,GAAI,CACvE,MAAM7xE,EAAW0yK,GAAuBt2K,CAAM,EAC1C4D,GAAYA,EAAS,cAAgB,IAAM6iE,EAAS,IAAIgQ,EAAa7yE,CAAQ,CACnF,CACAi3C,EAAS,IAAIlsC,EAAI83D,CAAQ,CAC3B,CACA,OAAO5rB,CACT,CAEA,SAAS87H,GAAuBC,EAAiBC,EAAmB,KAAM,CACxE,OAAOL,GAAqBI,CAAe,GACtCJ,GAAqBK,CAAgB,CAC5C,CAEO,SAASC,GAA0B9nF,EAAY,CACpD,MAAM+nF,EAAU,CAAA,EAChB,SAAW,CAACpoK,EAAI8mE,CAAM,IAAKuZ,GAAY,SAAS,UAAO,GAAQ,GAAI,CACjE,MAAMvoB,EAAW,CAAA,EACjB,SAAW,CAACgQ,EAAaz2E,CAAM,IAAKy1E,GAAQ,UAAU,UAAO,GAAQ,GACnEhP,EAASgQ,CAAW,EAAI6/F,GAAuBt2K,CAAM,EAEvD+2K,EAAQpoK,CAAE,EAAI,CAAE,SAAA83D,CAAQ,CAC1B,CACA,IAAIuwG,EAAY,KAChB,SAAW,CAACroK,EAAI8mE,CAAM,IAAKuZ,GAAY,SAAS,UAAO,GAAQ,GAC7D,GAAIvZ,IAAWuZ,GAAY,cAAe,CACxCgoF,EAAYroK,EACZ,KACF,CAEF,MAAO,CACL,KAAMqgF,GAAY,MAAQ,KAC1B,UAAAgoF,EACA,QAAAD,CACJ,CACA,CAEO,SAASE,GAAwBjoF,EAAYprF,EAAU,CAC5D,GAAI,CAACorF,GAAc,CAACprF,GAAY,OAAOA,GAAa,SAAU,OAAOorF,EACrE,MAAMkoF,EAAmBR,GAAyB1nF,CAAU,EAC5D,UAAWvZ,KAAUuZ,EAAW,SAAS,SAAM,GAAQ,CAAA,EACrDynF,GAAYhhG,CAAM,EAEpBuZ,EAAW,QAAQ,MAAK,EACxB,MAAMq3C,EAAW,CAAA,EACjB,SAAW,CAAC13H,EAAIwoK,CAAc,IAAK,OAAO,QAAQvzK,EAAS,SAAW,CAAA,CAAE,EAAG,CACzE,MAAM6xE,EAAS,IAAI6B,GAAO,CAAE,KAAM0X,EAAW,KAAM,QAASA,EAAW,QAAS,EAC1EooF,EAAmBF,EAAiB,IAAIvoK,CAAE,IAAMA,IAAO,UAAYuoK,EAAiB,IAAItzK,EAAS,SAAS,EAAI,MACpH,SAAW,CAAC6yE,EAAamgG,CAAe,IAAK,OAAO,QAAQO,GAAgB,UAAY,CAAA,CAAE,EAAG,CAC3F,MAAMN,EAAmBO,GAAkB,MAAM3gG,CAAW,GAAK,KAC3Dz2E,EAAS22K,GAAuBC,EAAiBC,CAAgB,EAClE72K,GACLy1E,EAAO,WAAWgB,EAAaz2E,CAAM,CACvC,CACAgvF,EAAW,QAAQ,IAAIrgF,EAAI8mE,CAAM,EACjC4wD,EAAS,KAAK,CAAC13H,EAAI8mE,CAAM,CAAC,CAC5B,CACA,GAAI,CAAC4wD,EAAS,OAAQ,CACpB,MAAM5wD,EAASuZ,EAAW,yBAAyB1X,GAC/C0X,EAAW,cACX,IAAI1X,GAAO,CAAE,KAAM0X,EAAW,KAAM,QAASA,EAAW,QAAS,EACrE,OAAAynF,GAAYhhG,CAAM,EAClBuZ,EAAW,QAAQ,IAAI,UAAWvZ,CAAM,EACxCuZ,EAAW,cAAgBvZ,EAC3BuZ,EAAW,QAAK,EACTA,CACT,CACA,MAAMqoF,EAAmB,OAAOzzK,EAAS,WAAc,SAAWA,EAAS,UAAY,KACvF,OAAAorF,EAAW,cAAiBqoF,GAAoBroF,EAAW,QAAQ,IAAIqoF,CAAgB,GAClFroF,EAAW,QAAQ,IAAI,SAAS,GAChCq3C,EAAS,CAAC,EAAE,CAAC,GACb,KACLr3C,EAAW,QAAK,EACTA,CACT,CAEO,SAASsoF,GAAoB1zK,EAAU,CAC5C,OAAO2oK,GAAkB3oK,CAAQ,CACnC,CC3PA,SAAS2zK,GAAczvK,EAAQ,CAC7B,MAAO,CACL,KAAMgvK,GAA0BhvK,GAAQ,UAAU,EAClD,KAAMgvK,GAA0BhvK,GAAQ,UAAU,CACtD,CACA,CAEA,SAAS0vK,GAAwB5zK,EAAU,CACzC,OAAOA,EAAW0zK,GAAoB1zK,CAAQ,EAAI,CAAE,KAAM,KAAM,UAAW,KAAM,QAAS,EAAE,CAC9F,CAEA,SAAS6zK,GAAmBxvK,EAAO,CACjC,MAAO,CACL,KAAMuvK,GAAwBvvK,GAAO,IAAI,EACzC,KAAMuvK,GAAwBvvK,GAAO,IAAI,CAC7C,CACA,CAEA,SAASyvK,GAAc5vK,EAAQzK,EAAM,CACnC,OAAOA,IAAS,OAASyK,GAAQ,YAAc,KAAOA,GAAQ,YAAc,IAC9E,CAEA,MAAM6vK,GAAyB,OAAO,OAAO,CAC3C,KAAM,OAAO,OAAO,CAClB,MAAO,aACP,KAAM,YACN,QAAS,eACT,QAAS,eACT,aAAc,qBACd,SAAU,eACd,CAAG,EACD,KAAM,OAAO,OAAO,CAClB,MAAO,aACP,MAAO,aACP,QAAS,cACb,CAAG,CACH,CAAC,EAED,SAASC,GAA4BryB,EAAU,CAC7C,MAAMsyB,EAAY,IAAI,IACtB,IAAIrmE,EAAU,KACd,OAAQ00B,GACF,OAAOA,GAAW,WAAmB,IAAM,CAAC,GAChD2xC,EAAU,IAAI3xC,CAAM,EACf10B,IACHA,EAAU+zC,EAAS,GAAG,SAAW3mJ,GAAU,CACzC,MAAMgK,EAAShK,GAAO,QAAUA,GAAS,CAAA,EACzC,UAAWU,KAAYu4K,EAAWv4K,EAAS,OAAW,CAAE,GAAGsJ,EAAQ,cAAe,GAAO,CAC3F,CAAC,GAEI,IAAM,CACXivK,EAAU,OAAO3xC,CAAM,EACnB2xC,EAAU,OAAS,IACrBrmE,IAAO,EACPA,EAAU,KAEd,EAEJ,CAqBO,MAAMsmE,WAAwBtM,EAAS,CAC5C,OAAO,GAAK,UAEZ,YAAYruK,EAAU,GAAI,CACxB,MAAMA,CAAO,EACb,KAAK,kBAAoB,EACzB,KAAK,MAAQs6K,GAAmBt6K,EAAQ,KAAK,CAC/C,CAEA,OAAO6L,EAAS,CACd,aAAM,OAAOA,CAAO,EACpB,KAAK,eAAe,CAAE,OAAQ,EAAI,CAAE,EACpC,KAAK,WAAW,KAAK,QAAQ,UAAU,KAAK,SAAS,OAAQ,kBAAmB,IAAM,CAChF,KAAK,kBAAoB,IAC7B,KAAK,eAAe,CAAE,OAAQ,EAAI,CAAE,EACpC,KAAK,WAAW,SAAS,EAC3B,CAAC,CAAC,EACF,KAAK,WAAW,KAAK,QAAQ,UAAU,KAAK,SAAS,OAAQ,mBAAoB,IAAM,CACrF,KAAK,eAAe,CAAE,OAAQ,EAAI,CAAE,EACpC,KAAK,WAAW,kBAAkB,CACpC,CAAC,CAAC,EACE+uK,GAAuB,KAAK,OAAO,GACrC,KAAK,OAAO,KAAK,OAAO,EAEnB,IACT,CAEA,OAAO56K,EAAU,GAAI,CAEnB,OADA,MAAM,OAAOA,CAAO,EACf46K,GAAuB56K,CAAO,GAC/BA,EAAQ,MAAM,KAAK,gBAAgB,OAAQA,EAAQ,KAAM,CAAE,OAAQ,UAAW,EAC9EA,EAAQ,MAAM,KAAK,gBAAgB,OAAQA,EAAQ,KAAM,CAAE,OAAQ,UAAW,EAC9EA,EAAQ,cAAc,KAAK,uBAAuB,OAAQA,EAAQ,aAAc,CAAE,OAAQ,UAAW,EACrGA,EAAQ,cAAc,KAAK,uBAAuB,OAAQA,EAAQ,aAAc,CAAE,OAAQ,UAAW,EAClG,MALsC,IAM/C,CAEA,WAAY,CACV,MAAO,CACL,QAAS,KAAK,eAAc,CAClC,CACE,CAEA,cAAe,CACb,MAAMgmI,EAAYy0C,GAA4B,IAAI,EAC5C/1J,EAAU,CACd,KAAM,CACJ,YAAa,mCACb,QAAS21J,GAAwB,KAAK,MAAM,IAAI,EAChD,KAAM,SACN,MAAO,YACP,QAAS,CAAC,cAAc,EACxB,GAAI,CACF,MAAO,eACP,WAAY,QACtB,EACQ,OAAQ,IAAMA,GAAwB,KAAK,MAAM,IAAI,EACrD,OAASj7K,GAAU,KAAK,gBAAgB,OAAQA,EAAO,CAAE,OAAQ,UAAW,EAC5E,UAAA4mI,CACR,EACM,KAAM,CACJ,YAAa,mCACb,QAASq0C,GAAwB,KAAK,MAAM,IAAI,EAChD,KAAM,SACN,MAAO,YACP,QAAS,CAAC,cAAc,EACxB,GAAI,CACF,MAAO,eACP,WAAY,QACtB,EACQ,OAAQ,IAAMA,GAAwB,KAAK,MAAM,IAAI,EACrD,OAASj7K,GAAU,KAAK,gBAAgB,OAAQA,EAAO,CAAE,OAAQ,UAAW,EAC5E,UAAA4mI,CACR,CACA,EACI,SAAW,CAAC9lI,EAAMopE,CAAQ,IAAK,OAAO,QAAQkxG,EAAsB,EAClE,SAAW,CAACvhJ,EAASnU,CAAK,IAAK,OAAO,QAAQwkD,CAAQ,EACpD5kD,EAAQ,GAAGxkB,CAAI,IAAI+4B,CAAO,EAAE,EAAI,CAC9B,YAAa,GAAGnU,CAAK,iCACrB,QAAS,KAAK,2BAA2B5kB,EAAM+4B,CAAO,EACtD,KAAM,SACN,MAAO,YACP,QAAS,CAAC,WAAW/4B,CAAI,IAAI+4B,CAAO,EAAE,EACtC,GAAI,CACF,MAAAnU,EACA,WAAY,QACxB,EACU,OAAQ,IAAM,KAAK,2BAA2B5kB,EAAM+4B,CAAO,EAC3D,OAAS75B,GAAU,CACb,CAACA,GAAS,OAAOA,GAAU,UAC/B,KAAK,iBAAiBc,EAAM+4B,EAAS75B,CAAK,CAC5C,EACA,UAAY2pI,GAAW,KAAK,GAAG,SAAWtnI,GAAU,CAClD,MAAMgK,EAAShK,GAAO,QAAUA,GAAS,CAAA,EAClBgK,EAAO,SAAW,WAAaA,EAAO,OAASvL,GAAQuL,EAAO,UAAYwtB,GAEjG8vG,EAAO,OAAWt9H,CAAM,CAC1B,CAAC,CACX,EAGI,OAAOiZ,CACT,CAEA,QAAQje,EAAW,GAAI,CACrB,MAAMzG,EAAUyG,GAAU,SAAW,OAAOA,EAAS,SAAY,SAAWA,EAAS,QAAU,CAAA,EAC/F,OAAIzG,EAAQ,MAAM,KAAK,gBAAgB,OAAQA,EAAQ,KAAM,CAAE,OAAQ,UAAW,cAAe,EAAK,CAAE,EACpGA,EAAQ,MAAM,KAAK,gBAAgB,OAAQA,EAAQ,KAAM,CAAE,OAAQ,UAAW,cAAe,EAAK,CAAE,EACxG,KAAK,eAAe,CAAE,OAAQ,EAAI,CAAE,EACpC,KAAK,WAAW,SAAS,EAClB,IACT,CAEA,WAAWoD,EAAQqI,EAAS,GAAI,CAC9B,KAAK,KAAK,SAAU,CAAE,OAAArI,EAAQ,MAAO,KAAK,eAAc,EAAI,GAAGqI,EAAQ,CACzE,CAEA,gBAAiB,CACf,OAAO6uK,GAAmB,KAAK,KAAK,CACtC,CAEA,QAAQt6K,EAAS,CACf,OAAI,UAAU,SAAW,EAAU,KAAK,eAAc,EAC/C,KAAK,OAAOA,CAAO,CAC5B,CAEA,iBAAiBE,EAAM+4B,EAAS,CAE9B,MAAMq/C,EADaiiG,GAAc,KAAK,SAAS,OAAQr6K,CAAI,GAChC,eAAiB,KAC5C,MAAI,CAACo4E,GAAU,OAAOA,EAAO,YAAe,WAAmB,KACxD6qC,GAA0B7qC,EAAO,WAAWr/C,CAAO,CAAC,CAC7D,CAaA,2BAA2B/4B,EAAM+4B,EAAS,CACxC,OAAOkgJ,GAAuB,KAAK,iBAAiBj5K,EAAM+4B,CAAO,CAAC,CACpE,CAqBA,iBAAiB/4B,EAAM+4B,EAASp2B,EAAQ7C,EAAU,CAAA,EAAI,CACpD,MAAM6xF,EAAa0oF,GAAc,KAAK,SAAS,OAAQr6K,CAAI,EACrDo4E,EAASuZ,GAAY,eAAiB,KAC5C,GAAI,CAACA,GAAc,CAACvZ,GAAU,OAAOA,EAAO,YAAe,WAAY,MAAO,GAC9E,KAAK,mBAAqB,EAC1B,GAAI,CACFA,EAAO,WAAWr/C,EAASp2B,CAAM,EACjCgvF,EAAW,QAAK,CAClB,QAAC,CACC,KAAK,mBAAqB,CAC5B,CACA,YAAK,eAAe,CAAE,OAAQ,EAAI,CAAE,EACpC,KAAK,WAAW,UAAW,CACzB,KAAA3xF,EACA,QAAA+4B,EACA,cAAej5B,EAAQ,gBAAkB,GACzC,YAAa,CAAC,WAAWE,CAAI,IAAI+4B,CAAO,EAAE,CAChD,CAAK,EACM,EACT,CAEA,uBAAuB/4B,EAAMopE,EAAW,GAAI,CAAE,OAAAlmE,EAAS,WAAY,cAAA8gJ,EAAgB,EAAI,EAAK,GAAI,CAC9F,MAAMryD,EAAa0oF,GAAc,KAAK,SAAS,OAAQr6K,CAAI,EACrDo4E,EAASuZ,GAAY,eAAiB,KAC5C,GAAI,CAACA,GAAc,CAACvZ,EAAQ,OAAO,KACnC,KAAK,mBAAqB,EAC1B,GAAI,CACF,UAAWz1E,KAAUy1E,EAAO,SAAS,OAAM,EAAIA,EAAO,oBAAoBz1E,CAAM,EAChFy1E,EAAO,SAAS,MAAK,EACrB,SAAW,CAACgB,EAAauhG,CAAa,IAAK,OAAO,QAAQvxG,GAAY,CAAA,CAAE,EAAG,CACzE,MAAM4/D,EAAWmwC,GAAqBwB,CAAa,GAAKA,EACnD3xC,GACL5wD,EAAO,WAAWgB,EAAa4vD,CAAQ,CACzC,CACAr3C,EAAW,QAAK,CAClB,QAAC,CACC,KAAK,mBAAqB,CAC5B,CACA,YAAK,eAAe,CAAE,OAAQ,EAAI,CAAE,EACpC,KAAK,WAAWzuF,EAAQ,CAAE,KAAAlD,EAAM,cAAegkJ,IAAkB,GAAO,EACjE,IACT,CAEA,gBAAgBhkJ,EAAMuG,EAAU,CAAE,OAAArD,EAAS,OAAQ,cAAA8gJ,EAAgB,EAAI,EAAK,GAAI,CAC9E,MAAMryD,EAAa0oF,GAAc,KAAK,SAAS,OAAQr6K,CAAI,EAC3D,GAAI,CAAC2xF,EAAY,OAAO,KACxB,KAAK,mBAAqB,EAC1B,GAAI,CACFioF,GAAwBjoF,EAAYprF,CAAQ,CAC9C,QAAC,CACC,KAAK,mBAAqB,CAC5B,CACA,YAAK,eAAe,CAAE,OAAQ,EAAI,CAAE,EACpC,KAAK,WAAWrD,EAAQ,CAAE,KAAAlD,EAAM,cAAegkJ,IAAkB,GAAO,EACjE,IACT,CAEA,eAAe,CAAE,OAAAksB,EAAS,EAAK,EAAK,CAAA,EAAI,CACtC,YAAK,MAAQgK,GAAc,KAAK,SAAS,MAAM,EAC1ChK,GAAQ,KAAK,WAAW,MAAM,EAC5B,IACT,CACF,CAEA,SAASwK,GAAuB56K,EAAS,CACvC,MAAO,GACLA,GACG,OAAOA,GAAY,WAEpBA,EAAQ,MACLA,EAAQ,MACRA,EAAQ,cACRA,EAAQ,cAGjB,CCpTA,SAAS86K,GAAY7pK,EAAQ,CAC3B,OAAO,MAAM,KAAKA,GAAU,EAAE,EAAE,KAAK,CAACgJ,EAAGC,IAAMD,EAAIC,CAAC,CACtD,CAEA,SAAS6gK,GAAqBl2I,EAAS,CACrC,MAAMjjC,EAAO,CAAA,EACPwlF,EAAO,IAAI,IACjB,UAAW3xD,KAAOoP,GAAW,GAAI,CAC/B,MAAMnyB,EAAQ,OAAO+iB,CAAG,EACpB,CAAC,OAAO,UAAU/iB,CAAK,GAAKA,EAAQ,GAAK00E,EAAK,IAAI10E,CAAK,IAC3D00E,EAAK,IAAI10E,CAAK,EACd9Q,EAAK,KAAK8Q,CAAK,EACjB,CACA,OAAO9Q,CACT,CAEA,SAAS2vK,GAAWpqD,EAAQ,GAAI,CAC9B,OAAO,MAAM,QAAQA,CAAK,EACtBA,EAAM,IAAKvuC,IAAU,CACrB,GAAGA,EACH,OAAQ,MAAM,QAAQA,GAAM,MAAM,EAAI,CAAC,GAAGA,EAAK,MAAM,EAAIA,GAAM,MACrE,EAAM,EACA,CAAA,CACN,CAEA,SAASoiG,GAA2Bh7K,EAAU,GAAI,CAChD,MAAM2N,EAAO,IAAI,KACb,OAAO,UAAU,eAAe,KAAK3N,EAAS,qBAAqB,GAAK,OAAO,UAAU,eAAe,KAAKA,EAAS,WAAW,IACnI2N,EAAK,IAAI,qBAAqB,GAE5B,OAAO,UAAU,eAAe,KAAK3N,EAAS,qBAAqB,GAAK,OAAO,UAAU,eAAe,KAAKA,EAAS,WAAW,IACnI2N,EAAK,IAAI,qBAAqB,EAEhC,UAAWpL,IAAO,CAChB,yBACA,yBACA,yBACA,wBACA,uBACJ,EACQ,OAAO,UAAU,eAAe,KAAKvC,EAASuC,CAAG,GAAGoL,EAAK,IAAI,aAAapL,CAAG,EAAE,EAErF,OAAO,MAAM,KAAKoL,CAAI,CACxB,CAEA,SAAS8qK,GAAkBhtK,EAAS,GAAIq8F,EAAO,GAAI,CACjD,MAAMn6F,EAAO,CAAA,EAGb,GAFI,OAAOlC,EAAO,YAAe,UAAUkC,EAAK,KAAKlC,EAAO,UAAU,EAClE,OAAOA,EAAO,UAAa,UAAUkC,EAAK,KAAKlC,EAAO,QAAQ,EAC9D,MAAM,QAAQA,EAAO,WAAW,EAClC,UAAWlJ,KAAOkJ,EAAO,YAAiB,OAAOlJ,GAAQ,UAAUoL,EAAK,KAAKpL,CAAG,EAElF,GAAI,MAAM,QAAQkJ,EAAO,SAAS,EAChC,UAAWlJ,KAAOkJ,EAAO,UAAe,OAAOlJ,GAAQ,UAAUoL,EAAK,KAAKpL,CAAG,EAEhF,OAAKoL,EAAK,OACHA,EAAK,KAAMpL,GAAQA,IAAQulG,GAAQvlG,EAAI,WAAW,GAAGulG,CAAI,GAAG,GAAKA,EAAK,WAAW,GAAGvlG,CAAG,GAAG,CAAC,EADzE,EAE3B,CAEA,SAASm2K,GAAqBtwB,EAAUtgD,EAAM,CAC5C,OAAQihC,GACF,OAAOA,GAAW,WAAmB,IAAM,CAAC,EACzCqf,EAAS,GAAG,SAAW3mJ,GAAU,CACtC,MAAMgK,EAAShK,GAAO,QAAUA,GAAS,CAAA,EACpCg3K,GAAkBhtK,EAAQq8F,CAAI,GACnCihC,EAAO,OAAWt9H,CAAM,CAC1B,CAAC,CAEL,CAgBO,MAAMwvK,WAA0B5M,EAAS,CAC9C,OAAO,GAAK,YAEZ,YAAYruK,EAAU,GAAI,CACxB,MAAMA,CAAO,EACb,KAAK,MAAQ,CACX,UAAW,GACX,UAAW,GACX,uBAAwB,GACxB,cAAe,IAAI,IACnB,cAAe,IAAI,IACnB,wBAAyBs1I,GACzB,4BAA6B,GAC7B,cAAe,CAAA,EACf,uBAAwBO,GAAmBb,GAAmCA,EAAiC,EAC/G,uBAAwBc,GAAmBb,GAAmCA,EAAiC,EAC/G,sBAAuBc,GAA4BV,GAAuCA,EAAqC,EAC/H,sBAAuBU,GAA4BV,GAAuCA,EAAqC,CACrI,EACI,KAAK,qBAAuB,IAAIj4C,GAAa,CAC3C,GAAI,kCACJ,KAAM,kBACN,MAAO,QACb,CAAK,EACD,KAAK,uBAAyB,KAC9B,KAAK,OAAOp9F,CAAO,CACrB,CAEA,OAAO6L,EAAS,CACd,MAAM,OAAOA,CAAO,EACpB,MAAMlB,EAAS,KAAK,SAAS,QAAU,KACvC,YAAK,yBAAwB,EAC7B,KAAK,4BAA2B,EAChC,KAAK,4BAA2B,EAChC,KAAK,YAAW,EAChB,KAAK,wBAAuB,EAC5B,KAAK,gCAA+B,EAEpC,KAAK,WAAW,KAAK,QAAQ,UAAUA,EAAQ,cAAgBlJ,GAAU,KAAK,iBAAiBA,CAAK,CAAC,CAAC,EACtG,KAAK,WAAW,KAAK,QAAQ,UAAUkJ,EAAQ,iBAAmBlJ,GAAU,KAAK,uBAAuBA,CAAK,CAAC,CAAC,EAC/G,KAAK,WAAW,KAAK,QAAQ,UAAUkJ,EAAQ,mBAAoB,IAAM,KAAK,sBAAqB,CAAE,CAAC,EACtG,KAAK,WAAW,KAAK,QAAQ,UAAUA,EAAQ,oBAAsBlJ,GAAU,KAAK,sBAAsBA,CAAK,CAAC,CAAC,EAC1G,IACT,CAEA,QAAS,CACP,KAAK,eAAe,CAAE,gBAAiB,GAAM,qBAAsB,GAAO,OAAQ,GAAM,EACxF,MAAM01D,EAAa,KAAK,SAAS,QAAQ,UAAU,YAAc,KACjE,OAAIA,IAAYA,EAAW,8BAAgC,IAC3D,KAAK,SAAS,QAAQ,gBAAa,EACnC,KAAK,yBAAsB,EAC3B,KAAK,uBAAyB,KACvB,MAAM,OAAM,CACrB,CAEA,OAAOn3D,EAAU,GAAI,CAEnB,GADA,MAAM,OAAOA,CAAO,EAChB,CAACA,GAAW,OAAOA,GAAY,SAAU,OAAO,KACpD,MAAM8K,EAAQ,KAAK,MACnB,OAAI,OAAO,UAAU,eAAe,KAAK9K,EAAS,qBAAqB,IAAG8K,EAAM,UAAY9K,EAAQ,sBAAwB,IACxH,OAAO,UAAU,eAAe,KAAKA,EAAS,WAAW,IAAG8K,EAAM,UAAY9K,EAAQ,YAAc,IACpG,OAAO,UAAU,eAAe,KAAKA,EAAS,qBAAqB,IAAG8K,EAAM,UAAY9K,EAAQ,sBAAwB,IACxH,OAAO,UAAU,eAAe,KAAKA,EAAS,WAAW,IAAG8K,EAAM,UAAY9K,EAAQ,YAAc,IACpG,OAAO,UAAU,eAAe,KAAKA,EAAS,wBAAwB,IAAG8K,EAAM,uBAAyB9K,EAAQ,yBAA2B,IAC3I,OAAO,UAAU,eAAe,KAAKA,EAAS,wBAAwB,IACxE8K,EAAM,uBAAyB+qI,GAAmB71I,EAAQ,uBAAwBg1I,EAAiC,GAEjH,OAAO,UAAU,eAAe,KAAKh1I,EAAS,wBAAwB,IACxE8K,EAAM,uBAAyBgrI,GAAmB91I,EAAQ,uBAAwBi1I,EAAiC,GAEjH,OAAO,UAAU,eAAe,KAAKj1I,EAAS,uBAAuB,IACvE8K,EAAM,sBAAwBirI,GAA4B/1I,EAAQ,sBAAuBq1I,EAAqC,GAE5H,OAAO,UAAU,eAAe,KAAKr1I,EAAS,uBAAuB,IACvE8K,EAAM,sBAAwBirI,GAA4B/1I,EAAQ,sBAAuBq1I,EAAqC,GAE5H,KAAK,UACP,KAAK,4BAA2B,EAChC,KAAK,YAAW,EAChB,KAAK,wBAAuB,GAE9B,KAAK,WAAW,UAAW,CACzB,YAAa2lC,GAA2Bh7K,CAAO,EAC/C,cAAe,EACrB,CAAK,EACM,IACT,CAEA,WAAY,CACV,MAAO,CACL,QAAS,CACP,UAAW,KAAK,MAAM,UACtB,UAAW,KAAK,MAAM,UACtB,uBAAwB,KAAK,MAAM,uBACnC,uBAAwB,CAAE,GAAG,KAAK,MAAM,sBAAsB,EAC9D,uBAAwB,CAAE,GAAG,KAAK,MAAM,sBAAsB,EAC9D,sBAAuB,CAAE,GAAG,KAAK,MAAM,qBAAqB,EAC5D,sBAAuB,CAAE,GAAG,KAAK,MAAM,qBAAqB,CACpE,EACM,cAAe86K,GAAY,KAAK,MAAM,aAAa,EACnD,cAAeA,GAAY,KAAK,MAAM,aAAa,EACnD,wBAAyB,KAAK,MAAM,wBACpC,4BAA6B,KAAK,MAAM,4BACxC,cAAevJ,GAAW,KAAK,MAAM,aAAa,CACxD,CACE,CAEA,cAAe,CACb,MAAMvrC,EAAazjI,GAAQm2K,GAAqB,KAAM,aAAan2K,CAAG,EAAE,EACxE,MAAO,CACL,cAAe,CACb,YAAa,yBACb,QAASu4K,GAAY,KAAK,MAAM,aAAa,EAC7C,KAAM,QACN,MAAO,UACP,QAAS,CAAC,yBAAyB,EACnC,GAAI,CACF,MAAO,iBACP,WAAY,QACtB,EACQ,OAAQ,IAAMA,GAAY,KAAK,MAAM,aAAa,EAClD,OAAS17K,GAAU,KAAK,sBAAsBA,GAAS,CAAA,EAAI,UAAW,CAAE,gBAAiB,GAAM,EAC/F,UAAW4mI,EAAU,eAAe,CAC5C,EACM,cAAe,CACb,YAAa,yBACb,QAAS80C,GAAY,KAAK,MAAM,aAAa,EAC7C,KAAM,QACN,MAAO,UACP,QAAS,CAAC,yBAAyB,EACnC,GAAI,CACF,MAAO,iBACP,WAAY,QACtB,EACQ,OAAQ,IAAMA,GAAY,KAAK,MAAM,aAAa,EAClD,OAAS17K,GAAU,KAAK,sBAAsBA,GAAS,CAAA,EAAI,UAAW,CAAE,gBAAiB,GAAM,EAC/F,UAAW4mI,EAAU,eAAe,CAC5C,EACM,uBAAwB,CACtB,YAAa,+CACb,QAAS,KAAK,MAAM,yBAA2B,GAC/C,KAAM,UACN,MAAO,YACP,QAAS,CAAC,kCAAkC,EAC5C,GAAI,CACF,MAAO,kBACP,WAAY,QACtB,EACQ,OAAQ,IAAM,KAAK,MAAM,yBAA2B,GACpD,OAAS5mI,GAAU,KAAK,OAAO,CAAE,uBAAwBA,IAAU,GAAM,EACzE,UAAW4mI,EAAU,wBAAwB,CACrD,EACM,wBAAyB,CACvB,YAAa,4CACb,QAAS,KAAK,MAAM,wBACpB,KAAM,SACN,MAAO,YACP,QAAS,CAAC,mCAAmC,EAC7C,GAAI,CACF,MAAO,4BACP,WAAY,MACtB,EACQ,OAAQ,IAAM,KAAK,MAAM,wBACzB,OAAS5mI,GAAU,KAAK,oBAAoBA,CAAK,EACjD,UAAW4mI,EAAU,yBAAyB,CACtD,EACM,UAAW,CACT,YAAa,oDACb,QAAS,KAAK,MAAM,YAAc,GAClC,KAAM,UACN,MAAO,YACP,QAAS,CAAC,qBAAqB,EAC/B,GAAI,CAAE,MAAO,uBAAwB,WAAY,QAAQ,EACzD,OAAQ,IAAM,KAAK,MAAM,YAAc,GACvC,OAAS5mI,GAAU,KAAK,OAAO,CAAE,UAAWA,IAAU,GAAM,EAC5D,UAAW4mI,EAAU,WAAW,CACxC,EACM,UAAW,CACT,YAAa,oDACb,QAAS,KAAK,MAAM,YAAc,GAClC,KAAM,UACN,MAAO,YACP,QAAS,CAAC,qBAAqB,EAC/B,GAAI,CAAE,MAAO,uBAAwB,WAAY,QAAQ,EACzD,OAAQ,IAAM,KAAK,MAAM,YAAc,GACvC,OAAS5mI,GAAU,KAAK,OAAO,CAAE,UAAWA,IAAU,GAAM,EAC5D,UAAW4mI,EAAU,WAAW,CACxC,EACM,uBAAwB,CACtB,YAAa,mDACb,QAASurC,GAAW,KAAK,MAAM,aAAa,EAC5C,KAAM,QACN,MAAO,UACP,QAAS,CAAC,gCAAgC,EAC1C,GAAI,CACF,MAAO,sBACP,WAAY,QACtB,EACQ,OAAQ,IAAMA,GAAW,KAAK,MAAM,aAAa,EACjD,OAASnyK,GAAU,KAAK,iBAAiBA,EAAO,CAAE,OAAQ,GAAM,EAChE,UAAW4mI,EAAU,sBAAsB,CACnD,EACM,uBAAwB,CACtB,YAAa,gEACb,QAAS,CAAE,GAAG,KAAK,MAAM,sBAAsB,EAC/C,KAAM,SACN,MAAO,YACP,QAAS,CAAC,kCAAkC,EAC5C,GAAI,CAAE,MAAO,4BAA6B,WAAY,QAAQ,EAC9D,OAAQ,KAAO,CAAE,GAAG,KAAK,MAAM,sBAAsB,GACrD,OAAS5mI,GAAU,KAAK,OAAO,CAAE,uBAAwBA,EAAO,EAChE,UAAW4mI,EAAU,wBAAwB,CACrD,EACM,uBAAwB,CACtB,YAAa,yEACb,QAAS,CAAE,GAAG,KAAK,MAAM,sBAAsB,EAC/C,KAAM,SACN,MAAO,YACP,QAAS,CAAC,kCAAkC,EAC5C,GAAI,CAAE,MAAO,4BAA6B,WAAY,QAAQ,EAC9D,OAAQ,KAAO,CAAE,GAAG,KAAK,MAAM,sBAAsB,GACrD,OAAS5mI,GAAU,KAAK,OAAO,CAAE,uBAAwBA,EAAO,EAChE,UAAW4mI,EAAU,wBAAwB,CACrD,EACM,sBAAuB,CACrB,YAAa,wDACb,QAAS,CAAE,GAAG,KAAK,MAAM,qBAAqB,EAC9C,KAAM,SACN,MAAO,YACP,QAAS,CAAC,iCAAiC,EAC3C,GAAI,CAAE,MAAO,2BAA4B,WAAY,QAAQ,EAC7D,OAAQ,KAAO,CAAE,GAAG,KAAK,MAAM,qBAAqB,GACpD,OAAS5mI,GAAU,KAAK,OAAO,CAAE,sBAAuBA,EAAO,EAC/D,UAAW4mI,EAAU,uBAAuB,CACpD,EACM,sBAAuB,CACrB,YAAa,wDACb,QAAS,CAAE,GAAG,KAAK,MAAM,qBAAqB,EAC9C,KAAM,SACN,MAAO,YACP,QAAS,CAAC,iCAAiC,EAC3C,GAAI,CAAE,MAAO,2BAA4B,WAAY,QAAQ,EAC7D,OAAQ,KAAO,CAAE,GAAG,KAAK,MAAM,qBAAqB,GACpD,OAAS5mI,GAAU,KAAK,OAAO,CAAE,sBAAuBA,EAAO,EAC/D,UAAW4mI,EAAU,uBAAuB,CACpD,CACA,CACE,CAEA,QAAQv/H,EAAW,GAAI,CACrB,MAAMzG,EAAUyG,GAAU,SAAW,OAAOA,EAAS,SAAY,SAAWA,EAAS,QAAU,CAAA,EAC/F,YAAK,OAAOzG,CAAO,EACnB,KAAK,eAAe,CAAE,gBAAiB,GAAM,qBAAsB,GAAM,OAAQ,GAAM,EACvF,KAAK,sBAAsByG,GAAU,eAAiB,CAAA,EAAI,UAAW,CAAE,gBAAiB,GAAM,OAAQ,EAAI,CAAE,EAC5G,KAAK,sBAAsBA,GAAU,eAAiB,CAAA,EAAI,UAAW,CAAE,gBAAiB,GAAM,OAAQ,EAAI,CAAE,EAC5G,KAAK,MAAM,wBAA0BA,GAAU,yBAA2B6uI,GAC1E,KAAK,MAAM,4BAA8B7uI,GAAU,6BAA+B,GAClF,KAAK,MAAM,cAAgB8qK,GAAW9qK,GAAU,eAAiB,EAAE,EACnE,KAAK,wBAAuB,EAC5B,KAAK,WAAW,SAAS,EAClB,IACT,CAEA,WAAWrD,EAAQqI,EAAS,GAAI,CAC9B,KAAK,KAAK,SAAU,CAAE,OAAArI,EAAQ,MAAO,KAAK,eAAc,EAAI,GAAGqI,EAAQ,CACzE,CAEA,gBAAiB,CACf,MAAO,CACL,GAAG,KAAK,MACR,cAAe,KAAK,MAAM,cAC1B,cAAe,KAAK,MAAM,aAChC,CACE,CAEA,0BAA2B,CACzB6nK,GAAoC,KAAK,SAAS,QAAU,IAAI,CAClE,CAEA,yBAA0B,CACxBQ,GAAwB,KAAK,OAAO,CACtC,CAEA,6BAA8B,CAC5BG,GAA4B,KAAK,OAAO,CAC1C,CAEA,aAAc,CACZG,GAAY,KAAK,QAAS,KAAK,OAAO,CACxC,CAEA,oBAAoBh1K,EAAQk2I,GAAyB,CACnD,KAAK,MAAM,wBAA0Bl2I,GAASk2I,GAC9C,KAAK,WAAW,UAAW,CACzB,YAAa,CAAC,mCAAmC,EACjD,cAAe,EACrB,CAAK,CACH,CAEA,iBAAiBnuB,EAAQ,GAAInnH,EAAU,CAAA,EAAI,CACzC,YAAK,MAAM,cAAgBuxK,GAAWpqD,CAAK,EACvCnnH,EAAQ,SAAW,IAAM,KAAK,WAAW,iBAAkB,CAC7D,cAAeA,EAAQ,gBAAkB,GACzC,YAAa,CAAC,gCAAgC,CACpD,CAAK,EACM,IACT,CAEA,6BAA8B,CAC5B,GAAI,KAAK,QAAQ,wBAA0B,GAAO,OAClD,MAAMs2I,EAAiB,KAAK,SAAS,cAAc,QAAQ,GAAK,KAChE,GAAIA,GAAgB,uBAAwB,CAC1CA,EAAe,uBAAsB,EACrC,MACF,CACA,MAAM3rI,EAAS,KAAK,SAAS,QAAU,KACjClB,EAAUkB,GAAQ,SAAM,GAAQ,CAAA,EACtCA,GAAQ,SAAS,CACf,QAASlB,EAAQ,UAAY,GAAOA,EAAQ,QAAU,GACtD,cAAeA,EAAQ,UAAY,IAAQA,EAAQ,gBAAkB,SAAW,SAAW,eACjG,CAAK,CACH,CAEA,gBAAgBiJ,EAAO40E,EAAUtnF,EAAU,CAAA,EAAI,CAC7C,MAAM2K,EAAS,KAAK,SAAS,QAAU,KACvC,GAAI,GAAC,OAAO,UAAU+H,CAAK,GAAKA,EAAQ,GAAK,CAAC/H,GAC9C,IAAI28E,EAAU,CACZ,GAAI,KAAK,MAAM,cAAc,IAAI50E,CAAK,EAAG,OACzC,KAAK,MAAM,cAAc,IAAIA,CAAK,CACpC,KAAO,CACL,GAAI,CAAC,KAAK,MAAM,cAAc,IAAIA,CAAK,EAAG,OAC1C,KAAK,MAAM,cAAc,OAAOA,CAAK,CACvC,CACA/H,EAAO,YAAY,CAAC+H,CAAK,EAAG,WAAY,CAAE,KAAM40E,EAAW,MAAQ,SAAU,EACxE,KAAK,MAAM,cAAc,MAC5B38E,EAAO,oBAAoB,CAAA,EAAI,CAAE,MAAO,EAAK,CAAE,EAEjD,KAAK,wBAAuB,EACxB3K,EAAQ,kBAAoB,IAAM,KAAK,oBAAoBs1I,EAAuB,EAClFt1I,EAAQ,SAAW,IAAM,KAAK,WAAW,iBAAkB,CAC7D,cAAeA,EAAQ,gBAAkB,GACzC,YAAa,CAAC,yBAAyB,CAC7C,CAAK,EACH,CAEA,gBAAgB0S,EAAO40E,EAAUtnF,EAAU,CAAA,EAAI,CAC7C,MAAM2K,EAAS,KAAK,SAAS,QAAU,KACvC,GAAI,GAAC,OAAO,UAAU+H,CAAK,GAAKA,EAAQ,GAAK,CAAC/H,GAC9C,IAAI28E,EAAU,CACZ,GAAI,KAAK,MAAM,cAAc,IAAI50E,CAAK,EAAG,OACzC,KAAK,MAAM,cAAc,IAAIA,CAAK,CACpC,KAAO,CACL,GAAI,CAAC,KAAK,MAAM,cAAc,IAAIA,CAAK,EAAG,OAC1C,KAAK,MAAM,cAAc,OAAOA,CAAK,CACvC,CACA/H,EAAO,YAAY,CAAC+H,CAAK,EAAG,WAAY,CAAE,KAAM40E,EAAW,MAAQ,SAAU,EAC7E,KAAK,wBAAuB,EACxBtnF,EAAQ,kBAAoB,IAAM,KAAK,oBAAoBs1I,EAAuB,EAClFt1I,EAAQ,SAAW,IAAM,KAAK,WAAW,iBAAkB,CAC7D,cAAeA,EAAQ,gBAAkB,GACzC,YAAa,CAAC,yBAAyB,CAC7C,CAAK,EACH,CAEA,eAAeA,EAAU,GAAI,CAC3B,MAAM2K,EAAS,KAAK,SAAS,QAAU,KAClCA,IACD,KAAK,MAAM,cAAc,OAC3BA,EAAO,YAAY,MAAM,KAAK,KAAK,MAAM,aAAa,EAAG,WAAY,CAAE,KAAM,QAAQ,CAAE,EACvF,KAAK,MAAM,cAAc,MAAK,GAE5B,KAAK,MAAM,cAAc,OAC3BA,EAAO,YAAY,MAAM,KAAK,KAAK,MAAM,aAAa,EAAG,WAAY,CAAE,KAAM,QAAQ,CAAE,EACvF,KAAK,MAAM,cAAc,MAAK,GAEhC,KAAK,wBAAuB,EACxB3K,EAAQ,kBAAoB,IAAM,KAAK,oBAAoBs1I,EAAuB,EAClFt1I,EAAQ,uBAAyB,IACnC2K,EAAO,oBAAoB,CAAA,EAAI,CAAE,MAAO,EAAK,CAAE,EAE7C3K,EAAQ,SAAW,IAAM,KAAK,WAAW,QAAS,CACpD,cAAeA,EAAQ,gBAAkB,GACzC,YAAa,CAAC,0BAA2B,yBAAyB,CACxE,CAAK,EACH,CAEA,WAAWwM,EAAMkG,EAAO1S,EAAU,CAAA,EAAI,CACpC,MAAMinF,EAAgB,MAAM,KAAK,KAAK,MAAM,aAAa,EACnDi0F,EAAgB,MAAM,KAAK,KAAK,MAAM,aAAa,EACzD,UAAWtmI,KAAaqyC,EAChBz6E,IAAS,QAAUooC,IAAcliC,GAAQ,KAAK,gBAAgBkiC,EAAW,GAAO50C,CAAO,EAE/F,UAAW80C,KAAaomI,EAChB1uK,IAAS,QAAUsoC,IAAcpiC,GAAQ,KAAK,gBAAgBoiC,EAAW,GAAO90C,CAAO,EAE3FwM,IAAS,QAAQ,KAAK,gBAAgBkG,EAAO,GAAM1S,CAAO,EAC1DwM,IAAS,QAAQ,KAAK,gBAAgBkG,EAAO,GAAM1S,CAAO,CAChE,CAEA,gBAAgBwM,EAAMkG,EAAO1S,EAAU,CAAA,EAAI,CACrCwM,IAAS,QAAQ,KAAK,gBAAgBkG,EAAO,CAAC,KAAK,MAAM,cAAc,IAAIA,CAAK,EAAG1S,CAAO,EAC1FwM,IAAS,QAAQ,KAAK,gBAAgBkG,EAAO,CAAC,KAAK,MAAM,cAAc,IAAIA,CAAK,EAAG1S,CAAO,CAChG,CAEA,sBAAsB6kC,EAAS3kC,EAAO,MAAOF,EAAU,CAAA,EAAI,CACzD,MAAM2K,EAAS,KAAK,SAAS,QAAU,KACvC,GAAI,CAACA,EAAQ,MAAO,CAAE,MAAO,EAAG,QAAS,EAAG,MAAO,CAAC,EACpD,MAAMwwK,EAAcJ,GAAqBl2I,CAAO,EAC1Cu2I,EAAe,IAAI,IAAID,CAAW,EAClCE,EAAQ,CAAA,EACRC,EAAW,CAAA,EACjB,GAAIp7K,IAAS,UACX,UAAWwS,KAAS,KAAK,MAAM,cACxB0oK,EAAa,IAAI1oK,CAAK,GAAG4oK,EAAS,KAAK5oK,CAAK,UAE1CxS,IAAS,SAClB,UAAWwS,KAASyoK,EACd,KAAK,MAAM,cAAc,IAAIzoK,CAAK,GAAG4oK,EAAS,KAAK5oK,CAAK,EAGhE,GAAIxS,IAAS,SACX,UAAWwS,KAASyoK,EACb,KAAK,MAAM,cAAc,IAAIzoK,CAAK,GAAG2oK,EAAM,KAAK3oK,CAAK,EAG9D,GAAI4oK,EAAS,OAAQ,CACnB3wK,EAAO,YAAY2wK,EAAU,WAAY,CAAE,KAAM,SAAU,EAC3D,UAAW5oK,KAAS4oK,EAAU,KAAK,MAAM,cAAc,OAAO5oK,CAAK,CACrE,CACA,GAAI2oK,EAAM,OAAQ,CAChB1wK,EAAO,YAAY0wK,EAAO,WAAY,CAAE,KAAM,MAAO,EACrD,UAAW3oK,KAAS2oK,EAAO,KAAK,MAAM,cAAc,IAAI3oK,CAAK,CAC/D,CACA,YAAK,wBAAuB,EACxB1S,EAAQ,kBAAoB,IAAM,KAAK,oBAAoBs1I,EAAuB,EAClFt1I,EAAQ,SAAW,IAAM,KAAK,WAAW,qBAAsB,CACjE,cAAeA,EAAQ,gBAAkB,GACzC,YAAa,CAAC,yBAAyB,CAC7C,CAAK,EACM,CAAE,MAAOq7K,EAAM,OAAQ,QAASC,EAAS,OAAQ,MAAO,KAAK,MAAM,cAAc,IAAI,CAC9F,CAEA,sBAAsBz2I,EAAS3kC,EAAO,MAAOF,EAAU,CAAA,EAAI,CACzD,MAAM2K,EAAS,KAAK,SAAS,QAAU,KACvC,GAAI,CAACA,EAAQ,MAAO,CAAE,MAAO,EAAG,QAAS,EAAG,MAAO,CAAC,EACpD,MAAMwwK,EAAcJ,GAAqBl2I,CAAO,EAC1Cu2I,EAAe,IAAI,IAAID,CAAW,EAClCE,EAAQ,CAAA,EACRC,EAAW,CAAA,EACjB,GAAIp7K,IAAS,UACX,UAAWwS,KAAS,KAAK,MAAM,cACxB0oK,EAAa,IAAI1oK,CAAK,GAAG4oK,EAAS,KAAK5oK,CAAK,UAE1CxS,IAAS,SAClB,UAAWwS,KAASyoK,EACd,KAAK,MAAM,cAAc,IAAIzoK,CAAK,GAAG4oK,EAAS,KAAK5oK,CAAK,EAGhE,GAAIxS,IAAS,SACX,UAAWwS,KAASyoK,EACb,KAAK,MAAM,cAAc,IAAIzoK,CAAK,GAAG2oK,EAAM,KAAK3oK,CAAK,EAG9D,GAAI4oK,EAAS,OAAQ,CACnB3wK,EAAO,YAAY2wK,EAAU,WAAY,CAAE,KAAM,SAAU,EAC3D,UAAW5oK,KAAS4oK,EAAU,KAAK,MAAM,cAAc,OAAO5oK,CAAK,CACrE,CACA,GAAI2oK,EAAM,OAAQ,CAChB1wK,EAAO,YAAY0wK,EAAO,WAAY,CAAE,KAAM,MAAO,EACrD,UAAW3oK,KAAS2oK,EAAO,KAAK,MAAM,cAAc,IAAI3oK,CAAK,CAC/D,CACA,YAAK,wBAAuB,EACxB1S,EAAQ,kBAAoB,IAAM,KAAK,oBAAoBs1I,EAAuB,EAClFt1I,EAAQ,SAAW,IAAM,KAAK,WAAW,qBAAsB,CACjE,cAAeA,EAAQ,gBAAkB,GACzC,YAAa,CAAC,yBAAyB,CAC7C,CAAK,EACM,CAAE,MAAOq7K,EAAM,OAAQ,QAASC,EAAS,OAAQ,MAAO,KAAK,MAAM,cAAc,IAAI,CAC9F,CAEA,YAAYz2I,EAAS7kC,EAAU,GAAI,CACjC,OAAO,KAAK,sBAAsB6kC,EAAS7kC,EAAQ,MAAQ,MAAOA,CAAO,CAC3E,CAEA,YAAY6kC,EAAS7kC,EAAU,GAAI,CACjC,OAAO,KAAK,sBAAsB6kC,EAAS7kC,EAAQ,MAAQ,MAAOA,CAAO,CAC3E,CAEA,wBAAwBmnH,EAAQ,GAAI,CAClC,KAAK,qBAAqB,MAAM,MAAM,EACtC,KAAK,qBAAqB,MAAM,MAAM,EACtC,UAAWvuC,KAAQuuC,GAAS,GAC1B,KAAK,qBAAqB,QAAQvuC,CAAI,EAExC,OAAO,KAAK,qBAAqB,kBAAkB,MAAM,CAC3D,CAEA,wBAAwBuuC,EAAOjnH,EAAO,MAAO,CAC3C,KAAK,iBAAiBinH,EAAO,CAAE,OAAQ,EAAI,CAAE,EAC7C,MAAM1pB,EAAQ,KAAK,wBAAwB0pB,CAAK,EAChD,GAAI,CAAC1pB,EAAO,MAAO,CAAE,MAAO,EAAG,QAAS,EAAG,MAAO,KAAK,MAAM,cAAc,IAAI,EAC/E,MAAM1F,EAAU,KAAK,SAAS,SAAS,cAAc0F,CAAK,GAAK,IAAI,YACnE,OAAO,KAAK,sBAAsB1F,EAAS73F,CAAI,CACjD,CAEA,4BAA6B,CAC3B,GAAI,CAAC,KAAK,MAAM,cAAc,KAAM,MAAO,CAAE,MAAO,EAAG,QAAS,EAAG,MAAO,CAAC,EAC3E,MAAM2V,EAAY,KAAK,SAAS,SAAS,uBAAuB,MAAM,KAAK,KAAK,MAAM,aAAa,EAAG,CACpG,UAAW,OACX,aAAc,GACd,mBAAoB,EAC1B,CAAK,GAAK,IAAI,YACV,OAAO,KAAK,sBAAsBA,EAAW,KAAK,CACpD,CAEA,6BAA6B7V,EAAU,GAAI,CACzC,MAAM2K,EAAS,KAAK,SAAS,QAAU,KACjCs8E,EAAgB,MAAM,KAAK,KAAK,MAAM,aAAa,EACzD,OAAIA,EAAc,QAChBt8E,GAAQ,oBAAoBs8E,EAAe,CACzC,QAASjnF,EAAQ,SAAW,GAC5B,WAAYA,EAAQ,WACpB,uBAAwBA,EAAQ,wBAA0B,IAC1D,UAAWA,EAAQ,WAAa,KAChC,aAAcA,EAAQ,cAAgBqyK,GACtC,iBAAkBryK,EAAQ,kBAAoBsyK,GAC9C,mBAAoBtyK,EAAQ,oBAAsBuyK,EAC1D,CAAO,EACM,KAET5nK,GAAQ,oBAAoB,GAAI,CAC9B,QAAS3K,EAAQ,SAAW,GAC5B,WAAYA,EAAQ,WACpB,iBAAkB,EACxB,CAAK,EACM,GACT,CAEA,iCAAkC,CAChC,MAAMsG,EAAU,KAAK,SAAS,SAAW,KACnCk5G,EAAU,IAAI,IACpB,UAAW79G,KAAQqxK,GAA6B1sK,EAAS,MAAM,EAAG,CAChE,MAAM8mB,EAAQoyF,EAAQ,IAAI79G,CAAI,GAAK,CAAE,KAAAA,EAAM,KAAM,GAAO,KAAM,EAAK,EACnEyrB,EAAM,KAAO,GACboyF,EAAQ,IAAI79G,EAAMyrB,CAAK,CACzB,CACA,UAAWzrB,KAAQqxK,GAA6B1sK,EAAS,MAAM,EAAG,CAChE,MAAM8mB,EAAQoyF,EAAQ,IAAI79G,CAAI,GAAK,CAAE,KAAAA,EAAM,KAAM,GAAO,KAAM,EAAK,EACnEyrB,EAAM,KAAO,GACboyF,EAAQ,IAAI79G,EAAMyrB,CAAK,CACzB,CACA,OAAO,MAAM,KAAKoyF,EAAQ,OAAM,CAAE,EAAE,KAAK,CAACvlG,EAAGC,IAAMD,EAAE,KAAK,cAAcC,EAAE,IAAI,CAAC,CACjF,CAEA,gCAAgC5T,EAAS8+B,EAAOzjC,EAAM,CACpD,MAAMi0E,EAAU,OAAOj0E,GAAQ,EAAE,EAAE,KAAI,EACvC,GAAI,CAACi0E,EAAS,MAAM,IAAI,MAAM,uCAAuC,EACrE,MAAMu8D,EAAU/sG,IAAU,OACtB9+B,EAAQ,sBAAsB,KAAKA,CAAO,EAC1CA,EAAQ,sBAAsB,KAAKA,CAAO,EACxCi1K,EAAkBn2I,IAAU,OAC9B9+B,EAAQ,qBAAqB,KAAKA,CAAO,EACzCA,EAAQ,qBAAqB,KAAKA,CAAO,EACvC8uE,EAAO+8D,IAAUv8D,CAAO,GAAK,KACnC,GAAIR,EAAM,CACR,GAAIA,EAAK,OAASx3B,GAAAA,cAAc,SAAWw3B,EAAK,YAAc,EAC5D,MAAM,IAAI,MAAM,cAAcQ,CAAO,uBAAuBxwC,CAAK,gCAAgC,EAEnG,OAAOwwC,CACT,CACA,OAAA2lG,IAAkB3lG,EAASh4B,iBAAc,QAAS,CAAC,EAC5Cg4B,CACT,CAEA,yBAAyBj0E,EAAM,CAC7B,MAAM2E,EAAU,KAAK,SAAS,SAAW,KACzC,GAAI,CAACA,EAAS,MAAM,IAAI,MAAM,4CAA4C,EAC1E,MAAMsvE,EAAU,KAAK,gCAAgCtvE,EAAS,OAAQ3E,CAAI,EAC1E,YAAK,gCAAgC2E,EAAS,OAAQsvE,CAAO,EACzD,OAAOtvE,EAAQ,kBAAqB,YACtCA,EAAQ,iBAAiB,IAAM,CAC7B,MAAMk1K,EAAWl1K,EAAQ,uBAAuBsvE,CAAO,EAAE,KACnD6lG,EAAWn1K,EAAQ,uBAAuBsvE,CAAO,EAAE,KACzD4lG,EAAS,KAAK,CAAC,EACfC,EAAS,KAAK,CAAC,EACf,UAAW/oK,KAAS,KAAK,MAAM,cAAe8oK,EAAS9oK,CAAK,EAAI,EAChE,UAAWA,KAAS,KAAK,MAAM,cAAe+oK,EAAS/oK,CAAK,EAAI,CAClE,CAAC,EAEHpM,EAAQ,2BAA2BsvE,CAAO,EAC1CtvE,EAAQ,2BAA2BsvE,CAAO,EAC1C,KAAK,MAAM,wBAA0BA,EACrC,KAAK,MAAM,4BAA8BA,EACzC,KAAK,WAAW,MAAM,EACfA,CACT,CAEA,iCAAiCxwC,EAAOzjC,EAAM,CAC5C,MAAM2E,EAAU,KAAK,SAAS,SAAW,KACzC,GAAI,CAACA,GAAW,OAAOA,EAAQ,kBAAqB,WAAY,MAAO,CAAA,EACvE,MAAMsvE,EAAU,OAAOj0E,GAAQ,EAAE,EAAE,KAAI,EACvC,GAAI,CAACi0E,EAAS,MAAO,CAAA,EAIrB,MAAMR,GAHUhwC,IAAU,OACtB9+B,EAAQ,sBAAsB,KAAKA,CAAO,EAC1CA,EAAQ,sBAAsB,KAAKA,CAAO,KACvBsvE,CAAO,GAAK,KACnC,MAAI,CAACR,GAAQA,EAAK,OAASx3B,GAAAA,cAAc,SAAWw3B,EAAK,YAAc,EAAU,CAAA,EAC1E9uE,EAAQ,iBAAiB,IAAM,CACpC,MAAM8K,EAAMg0B,IAAU,OAAU9+B,EAAQ,aAAe,GAAOA,EAAQ,aAAe,GAC/EO,EAAOu+B,IAAU,OACnB9+B,EAAQ,uBAAuBsvE,CAAO,EAAE,KACxCtvE,EAAQ,uBAAuBsvE,CAAO,EAAE,KACtCmiB,EAAU,CAAA,EAChB,QAASrlF,EAAQ,EAAGA,EAAQtB,EAAI,OAAQsB,GAAS,EAAG,CAClD,MAAMlB,EAAK,OAAOJ,EAAIsB,CAAK,CAAC,EACxB,OAAO7L,EAAK2K,CAAE,CAAC,IAAM,GAAGumF,EAAQ,KAAKvmF,CAAE,CAC7C,CACA,OAAOumF,CACT,EAAG,CACD,YAAa3yD,IAAU,OACvB,YAAaA,IAAU,MAC7B,CAAK,CACH,CAEA,8BAA8BzjC,EAAM,CAClC,MAAMi0E,EAAU,OAAOj0E,GAAQ,EAAE,EAAE,KAAI,EACvC,GAAI,CAACi0E,EAAS,MAAM,IAAI,MAAM,4CAA4C,EAC1E,MAAM8lG,EAAc,KAAK,iCAAiC,OAAQ9lG,CAAO,EACnE+lG,EAAc,KAAK,iCAAiC,OAAQ/lG,CAAO,EACzE,KAAK,sBAAsB8lG,EAAa,UAAW,CAAE,gBAAiB,GAAM,EAC5E,KAAK,sBAAsBC,EAAa,UAAW,CAAE,gBAAiB,GAAM,EAC5E,KAAK,oBAAoB/lG,CAAO,EAChC,KAAK,WAAW,mBAAmB,CACrC,CAEA,iCAAkC,CAChC,KAAK,yBAAsB,EAC3B,KAAK,uBAAyB,KAC9B,MAAMtvE,EAAU,KAAK,SAAS,SAAW,KACzC,GAAI,CAACA,EAAS,OACd,MAAM7C,EAAU,IAAM,KAAK,WAAW,YAAY,EAC5C28H,EAAS,CACb,KAAK,QAAQ,UAAU95H,EAAS,oBAAqB7C,CAAO,EAC5D,KAAK,QAAQ,UAAU6C,EAAS,oBAAqB7C,CAAO,EAC5D,KAAK,QAAQ,UAAU6C,EAAS,oBAAqB7C,CAAO,CAClE,EACI,KAAK,uBAAyB,IAAM,CAClC,UAAWk1G,KAAeynB,EAAQznB,IAAW,CAC/C,CACF,CAEA,iBAAiBl3G,EAAO,CACtB,MAAMgK,EAAShK,GAAO,OACtB,GAAI,CAACgK,EAAQ,OACb,MAAMmwK,EAAWnwK,EAAO,WAAW,WAAa,GAC1CowK,EAAYpwK,EAAO,OAAS,QAAUA,EAAO,OAAS,EACtDqwK,EAAYrwK,EAAO,OAAS,QAAUA,EAAO,OAAS,EAC5D,GAAIowK,GAAa,KAAK,MAAM,UAAW,CACjCD,EAAU,KAAK,gBAAgB,OAAQnwK,EAAO,KAAK,EAClD,KAAK,WAAW,OAAQA,EAAO,KAAK,EACzC,MACF,CACA,GAAIqwK,GAAa,KAAK,MAAM,UAAW,CACjCF,EAAU,KAAK,gBAAgB,OAAQnwK,EAAO,KAAK,EAClD,KAAK,WAAW,OAAQA,EAAO,KAAK,EACzC,MACF,CACKmwK,GACH,KAAK,eAAc,CAEvB,CAEA,uBAAuBn6K,EAAO,CAC5B,MAAMgK,EAAShK,GAAO,OACtB,GAAI,CAACgK,EAAQ,OACb,MAAMmwK,EAAWnwK,EAAO,WAAW,WAAa,GAEhD,GADkBA,EAAO,OAAS,QAAUA,EAAO,OAAS,GAC3C,KAAK,MAAM,UAAW,CACjCmwK,EAAU,KAAK,gBAAgB,OAAQnwK,EAAO,KAAK,EAClD,KAAK,WAAW,OAAQA,EAAO,KAAK,EACzC,KAAK,6BAA4B,EACjC,MACF,CACA,KAAK,eAAc,EACnB,KAAK,6BAA4B,CACnC,CAEA,uBAAwB,CACtB,KAAK,eAAe,CAAE,gBAAiB,GAAM,OAAQ,GAAM,EAC3D,KAAK,MAAM,wBAA0B6pI,GACrC,KAAK,MAAM,4BAA8B,GACzC,KAAK,gCAA+B,EACpC,KAAK,yBAAwB,EAC7B,KAAK,4BAA2B,EAChC,KAAK,wBAAuB,EAC5B,KAAK,4BAA2B,EAChC,KAAK,YAAW,EAChB,KAAK,WAAW,kBAAkB,CACpC,CAEA,sBAAsB7zI,EAAO,CAC3B,MAAMmzK,EAAcnzK,GAAO,QAAQ,MAAQ,KACvCmzK,IAAgB,cAAgBA,IAAgB,eACpD,KAAK,wBAAuB,EAC5B,KAAK,WAAW,YAAY,EAC9B,CACF,CCxxBY,MAACmH,GAAe,OAAO,OAAO,CACxClM,GAAmB,GACnBqB,GAAiB,GACjByJ,GAAgB,GAChB/I,GAAe,GACfsD,GAAkB,GAClBkC,GAAe,GACfU,GAAgB,GAChBa,GAAe,GACflE,GAAc,GACdwG,GAAkB,EACpB,CAAC,EAYM,SAASe,IAAgC,CAC9C,OAAO,IAAIxL,GAAgB,EACxB,SAASuL,GAAa,CAAC,EAAGlM,EAAkB,EAC5C,SAASkM,GAAa,CAAC,EAAG7K,EAAgB,EAC1C,SAAS6K,GAAa,CAAC,EAAGpB,EAAe,EACzC,SAASoB,GAAa,CAAC,EAAGnK,EAAc,EACxC,SAASmK,GAAa,CAAC,EAAG7G,EAAiB,EAC3C,SAAS6G,GAAa,CAAC,EAAG3E,EAAc,EACxC,SAAS2E,GAAa,CAAC,EAAGjE,EAAe,EACzC,SAASiE,GAAa,CAAC,EAAGpD,EAAc,EACxC,SAASoD,GAAa,CAAC,EAAGtH,EAAa,EACvC,SAASsH,GAAa,CAAC,EAAGd,EAAiB,CAChD,CCxDA,MAAMgB,GAAqB,yBAMdC,GAA6B,EAQ7BC,GAAoB,OAAO,OAAO,CAC7C,YAAa,cACb,cAAe,gBACf,QAAS,SACX,CAAC,EAED,SAAS/M,GAAkBhwK,EAAO,CAChC,GAAI,MAAM,QAAQA,CAAK,EAAG,OAAOA,EAAM,IAAKguB,GAAUgiJ,GAAkBhiJ,CAAK,CAAC,EAC9E,GAAI,YAAY,OAAOhuB,CAAK,EAAG,OAAO,MAAM,KAAKA,CAAK,EACtD,GAAIA,GAAS,OAAOA,GAAU,SAAU,CACtC,MAAMwC,EAAO,CAAA,EACb,SAAW,CAACW,EAAK6qB,CAAK,IAAK,OAAO,QAAQhuB,CAAK,EAAGwC,EAAKW,CAAG,EAAI6sK,GAAkBhiJ,CAAK,EACrF,OAAOxrB,CACT,CACA,OAAOxC,CACT,CAEA,SAASg9K,GAAch9K,EAAO,CAC5B,OAAOA,GAAS,OAAOA,GAAU,UAAY,CAAC,MAAM,QAAQA,CAAK,CACnE,CAEA,SAASi9K,GAAUtiK,EAAMuiK,EAAUl9K,EAAO,CACxC,IAAI8B,EAAS6Y,EACb,QAASzR,EAAI,EAAGA,EAAIg0K,EAAS,OAAS,EAAGh0K,GAAK,EAAG,CAC/C,MAAM/F,EAAM+5K,EAASh0K,CAAC,EACjB8zK,GAAcl7K,EAAOqB,CAAG,CAAC,IAAGrB,EAAOqB,CAAG,EAAI,CAAA,GAC/CrB,EAASA,EAAOqB,CAAG,CACrB,CACArB,EAAOo7K,EAAS,GAAG,EAAE,CAAC,EAAIlN,GAAkBhwK,CAAK,CACnD,CAEA,SAASm9K,GAAcn9K,EAAOo9K,EAAQ34J,EAAQ,CAC5C,GAAI,MAAM,QAAQzkB,CAAK,GAAK,CAACg9K,GAAch9K,CAAK,EAAG,CACjDykB,EAAO24J,CAAM,EAAIpN,GAAkBhwK,CAAK,EACxC,MACF,CACA,MAAMslB,EAAU,OAAO,QAAQtlB,CAAK,EACpC,GAAI,CAACslB,EAAQ,QAAU83J,EAAQ,CAC7B34J,EAAO24J,CAAM,EAAI,CAAA,EACjB,MACF,CACA,SAAW,CAACj6K,EAAK6qB,CAAK,IAAK1I,EACzB63J,GAAcnvJ,EAAOovJ,EAAS,GAAGA,CAAM,IAAIj6K,CAAG,GAAKA,EAAKshB,CAAM,CAElE,CAEA,MAAM44J,GAA0B,IAAI,IAAI,CACtC,8CACA,2DACA,8CACA,oDACA,6DACA,8DACF,CAAC,EAEKC,GAA6B,CACjC,iBACF,EAEMC,GAAgC,CACpC,cACA,oBACA,kBACA,aACA,aACA,cACA,gBACA,eACA,eACA,eACA,kBACA,gBACA,aACF,EAEMC,GAAkC,IAAI,IAAI,CAAC,SAAU,UAAW,UAAW,YAAa,SAAS,CAAC,EAExG,SAASC,GAAqB/0E,EAAMg1E,EAAU,CAC5C,MAAM57K,EAAS,OAAO4mG,GAAQ,EAAE,EAChC,OAAOg1E,EAAS,KAAMN,GAAWt7K,IAAWs7K,GAAUt7K,EAAO,WAAW,GAAGs7K,CAAM,GAAG,CAAC,CACvF,CAEA,SAASO,GAAuBj1E,EAAM,CACpC,MAAM5mG,EAAS,OAAO4mG,GAAQ,EAAE,EAChC,OAAO20E,GAAwB,IAAIv7K,CAAM,GACpCw7K,GAA2B,KAAMF,GAAWt7K,IAAWs7K,GAAUt7K,EAAO,WAAW,GAAGs7K,CAAM,GAAG,CAAC,CACvG,CAEA,SAASQ,GAAuB/8J,EAAM,GAAI,CACxC,UAAW6nF,KAAQ,OAAO,KAAK7nF,CAAG,EAC5B88J,GAAuBj1E,CAAI,GAAG,OAAO7nF,EAAI6nF,CAAI,EAEnD,OAAO7nF,CACT,CAEA,SAASg9J,GAAqBh9J,EAAM,GAAI,CACtC,MAAMre,EAAOo7K,GAAuB/8J,CAAG,EAEvC,OAD8B,OAAO,KAAKre,CAAI,EAAE,KAAMkmG,GAAS+0E,GAAqB/0E,EAAM60E,EAA6B,CAAC,GAC3F,CAAC,OAAO,UAAU,eAAe,KAAK/6K,EAAM,wBAAwB,IAC/FA,EAAK,wBAAwB,EAAI,IAE5BA,CACT,CAEA,SAASs7K,GAA+B99K,EAAQ,GAAI,CAClD,MAAMuD,EAASvD,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EAC5D,MAAO,CACL,gBAAiB,OAAOuD,EAAO,iBAAoB,SAAWA,EAAO,gBAAkB,KACvF,cAAe,OAAOA,EAAO,eAAkB,SAAWA,EAAO,cAAgB,KACjF,kBAAmB,OAAOA,EAAO,mBAAsB,SAAWA,EAAO,kBAAoB,IACjG,CACA,CAUO,SAASw6K,GAA8B/9K,EAAQ,GAAI,CACxD,MAAMuD,EAASvD,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EAC5D,MAAO,CACL,MAAO,OAAOuD,EAAO,OAAU,SAAWA,EAAO,MAAQ,KACzD,SAAUA,EAAO,WAAa,GAC9B,WAAYu6K,GAA+Bv6K,EAAO,UAAU,CAChE,CACA,CASO,SAASy6K,GAAqBh+K,EAAQ,GAAI,CAC/C,MAAMuD,EAASvD,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EAC5D,MAAO,CACL,MAAO,OAAOuD,EAAO,OAAU,SAAWA,EAAO,MAAQ,KACzD,OAAQA,EAAO,QAAU,OAAOA,EAAO,QAAW,SAAWysK,GAAkBzsK,EAAO,MAAM,EAAI,CAAA,EAChG,UAAWA,EAAO,WAAa,OAAOA,EAAO,WAAc,SAAWysK,GAAkBzsK,EAAO,SAAS,EAAI,CAAA,EAC5G,UAAWA,EAAO,WAAa,OAAOA,EAAO,WAAc,SAAWysK,GAAkBzsK,EAAO,SAAS,EAAI,CAAA,CAChH,CACA,CAUO,SAAS06K,GAA2Bj+K,EAAQ,GAAI,CACrD,MAAMuD,EAASvD,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EAC5D,MAAO,CACL,KAAM,OAAOuD,EAAO,MAAS,SAAWA,EAAO,KAAO,KACtD,SAAU,OAAOA,EAAO,UAAa,SAAWA,EAAO,SAAW,KAClE,OAAQ,OAAOA,EAAO,QAAW,SAAWA,EAAO,OAAS,KAC5D,UAAW,OAAO,SAASA,EAAO,SAAS,EAAI,OAAOA,EAAO,SAAS,EAAI,KAC1E,UAAW,OAAO,SAASA,EAAO,SAAS,EAAI,OAAOA,EAAO,SAAS,EAAI,KAC1E,8BAA+BA,EAAO,gCAAkC,GACxE,SAAU,OAAO,SAASA,EAAO,QAAQ,EAAI,OAAOA,EAAO,QAAQ,EAAI,IAC3E,CACA,CASO,SAAS26K,GAA8Bl+K,EAAQ,GAAI,CACxD,MAAMuD,EAASvD,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EACtDu2K,EAAcwH,GAA8Bx6K,EAAO,WAAW,EACpE,MAAO,CACL,YAAAgzK,EACA,sBAAuBuH,GAA+Bv6K,EAAO,uBAAyBgzK,EAAY,UAAU,EAC5G,QAASyH,GAAqBz6K,EAAO,SAAWA,EAAO,EAAE,EACzD,cAAeA,EAAO,eAAiB,OAAOA,EAAO,eAAkB,SACnEysK,GAAkBzsK,EAAO,aAAa,EACrCA,EAAO,WAAa,OAAOA,EAAO,WAAc,SAAWysK,GAAkBzsK,EAAO,SAAS,EAAI,GACtG,UAAWA,EAAO,WAAa,OAAOA,EAAO,WAAc,SACvDysK,GAAkBzsK,EAAO,SAAS,EAClC,KACJ,YAAaA,EAAO,aAAe,OAAOA,EAAO,aAAgB,SAC7DysK,GAAkBzsK,EAAO,WAAW,EACnCA,EAAO,QAAU,OAAOA,EAAO,QAAW,SAAWysK,GAAkBzsK,EAAO,MAAM,EAAI,KAC7F,mBAAoBA,EAAO,oBAAsB,OAAOA,EAAO,oBAAuB,SAClFysK,GAAkBzsK,EAAO,kBAAkB,EAC1CA,EAAO,gBAAkB,OAAOA,EAAO,gBAAmB,SAAWysK,GAAkBzsK,EAAO,cAAc,EAAI,KACrH,cAAe06K,GAA2B16K,EAAO,eAAiBA,EAAO,MAAM,EAC/E,mBAAoBA,EAAO,oBAAsB,OAAOA,EAAO,oBAAuB,SAClFysK,GAAkBzsK,EAAO,kBAAkB,EAC3C,KACJ,aAAcA,EAAO,cAAgB,OAAOA,EAAO,cAAiB,SAChEysK,GAAkBzsK,EAAO,YAAY,EACrC,IACR,CACA,CASO,SAAS46K,GAAwBn+K,EAAQ,GAAI,CAClD,MAAMuD,EAASvD,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EACtDu2K,EAAcwH,GAA8Bx6K,EAAO,WAAW,EAC9D66K,EAAqBC,GACzB96K,EAAO,oBAAsBA,EAAO,eAAiB,CAAA,EACrDw5K,GAAkB,aACtB,EACE,MAAO,CACL,QAAS,CACP,GAAI,OAAOx5K,EAAO,SAAS,IAAO,SAAWA,EAAO,QAAQ,GAAM,OAAOA,EAAO,IAAO,SAAWA,EAAO,GAAK,KAC9G,UAAW,OAAO,SAASA,EAAO,SAAS,SAAS,EAAI,OAAOA,EAAO,QAAQ,SAAS,EAAK,OAAO,SAASA,EAAO,SAAS,EAAI,OAAOA,EAAO,SAAS,EAAI,KAC3J,UAAW,OAAO,SAASA,EAAO,SAAS,SAAS,EAAI,OAAOA,EAAO,QAAQ,SAAS,EAAK,OAAO,SAASA,EAAO,SAAS,EAAI,OAAOA,EAAO,SAAS,EAAI,KAC3J,YAAa,OAAOA,EAAO,SAAS,aAAgB,SAAWA,EAAO,QAAQ,YAAe,OAAOA,EAAO,aAAgB,SAAWA,EAAO,YAAc,KAC3J,SAAU,OAAOA,EAAO,SAAS,UAAa,SAAWA,EAAO,QAAQ,SAAY,OAAOA,EAAO,UAAa,SAAWA,EAAO,SAAW,KAC5I,WAAYA,EAAO,SAAS,aAAe,IAASA,EAAO,aAAe,GAC1E,OAAQ,OAAOA,EAAO,SAAS,QAAW,SAAWA,EAAO,QAAQ,OAAU,OAAOA,EAAO,QAAW,SAAWA,EAAO,OAAS,SAClI,MAAO,OAAO,SAASA,EAAO,SAAS,KAAK,EAAI,OAAOA,EAAO,QAAQ,KAAK,EAAK,OAAO,SAASA,EAAO,KAAK,EAAI,OAAOA,EAAO,KAAK,EAAI,MAC7I,EACI,YAAAgzK,EACA,sBAAuBuH,GAA+Bv6K,EAAO,uBAAyBgzK,EAAY,UAAU,EAC5G,QAASyH,GAAqBz6K,EAAO,SAAWA,EAAO,EAAE,EACzD,cAAeA,EAAO,eAAiB,OAAOA,EAAO,eAAkB,SACnEysK,GAAkBzsK,EAAO,aAAa,EACrCA,EAAO,WAAa,OAAOA,EAAO,WAAc,SAAWysK,GAAkBzsK,EAAO,SAAS,EAAI,GACtG,cAAe06K,GAA2B16K,EAAO,eAAiBA,EAAO,MAAM,EAC/E,YAAaA,EAAO,aAAe,OAAOA,EAAO,aAAgB,SAC7D,CACA,OAAQ,OAAOA,EAAO,YAAY,QAAW,SAAWA,EAAO,YAAY,OAAS,QACpF,KAAMA,EAAO,YAAY,MAAQ,KACjC,QAAS,OAAOA,EAAO,YAAY,SAAY,SAAWA,EAAO,YAAY,QAAU,KACvF,WAAY,OAAO,SAASA,EAAO,YAAY,UAAU,EAAI,OAAOA,EAAO,YAAY,UAAU,EAAI,IAC7G,EACQ,CACA,OAAQ,OAAOA,EAAO,eAAkB,SAAWA,EAAO,cAAgB,QAC1E,KAAMA,EAAO,cAAgB,KAC7B,QAAS,KACT,WAAY,IACpB,EACI,aAAcA,EAAO,cAAgB,OAAOA,EAAO,cAAiB,SAChE,CACA,OAAQ,OAAOA,EAAO,aAAa,QAAW,SAAWA,EAAO,aAAa,OAAS,mCACtF,QAAS,OAAO,SAASA,EAAO,aAAa,OAAO,EAAI,OAAOA,EAAO,aAAa,OAAO,EAAI,EAC9F,SAAU,OAAOA,EAAO,aAAa,UAAa,SAAWA,EAAO,aAAa,SAAW,UAC5F,YAAa,OAAOA,EAAO,aAAa,aAAgB,SAAWA,EAAO,aAAa,YAAc,OACrG,KAAMA,EAAO,aAAa,MAAQ,KAClC,QAAS,OAAOA,EAAO,aAAa,SAAY,SAAWA,EAAO,aAAa,QAAU,KACzF,OAAQ,OAAO,SAASA,EAAO,aAAa,MAAM,EAAI,OAAOA,EAAO,aAAa,MAAM,EAAI,KAC3F,WAAY,OAAO,SAASA,EAAO,aAAa,UAAU,EAAI,OAAOA,EAAO,aAAa,UAAU,EAAI,KACvG,iBAAkB,OAAO,SAASA,EAAO,aAAa,gBAAgB,EAAI,OAAOA,EAAO,aAAa,gBAAgB,EAAI,KACzH,UAAW,OAAO,SAASA,EAAO,aAAa,SAAS,EAAI,OAAOA,EAAO,aAAa,SAAS,EAAI,EACpG,UAAW,OAAO,SAASA,EAAO,aAAa,SAAS,EAAI,OAAOA,EAAO,aAAa,SAAS,EAAI,KACpG,WAAY,OAAO,SAASA,EAAO,aAAa,UAAU,EAAI,OAAOA,EAAO,aAAa,UAAU,EAAI,KACvG,aAAcA,EAAO,aAAa,cAAgB,OAAOA,EAAO,aAAa,cAAiB,SAC1FysK,GAAkBzsK,EAAO,aAAa,YAAY,EAClD,IACZ,EACQ,KACJ,UAAWA,EAAO,WAAa,OAAOA,EAAO,WAAc,SACvDysK,GAAkBzsK,EAAO,SAAS,EAClC,KACJ,mBAAA66K,CACJ,CACA,CAcO,SAASE,GAA0BlxK,EAAMhG,EAASm3K,EAAW,CAAA,EAAI,CACtE,MAAO,CACL,OAAQ1B,GACR,QAASC,GACT,KAAA1vK,EACA,SAAUmxK,GAAY,OAAOA,GAAa,SAAWvO,GAAkBuO,CAAQ,EAAI,CAAA,EACnF,QAASnxK,IAAS2vK,GAAkB,YAChCgB,GAA8B32K,CAAO,EACrCgG,IAAS2vK,GAAkB,cACzBmB,GAA8B92K,CAAO,EACrC+2K,GAAwB/2K,CAAO,CACzC,CACA,CAEA,SAASo3K,GAA4Bx+K,EAAO,CAC1C,OAAO+9K,GAA8B/9K,CAAK,CAC5C,CAEA,SAASy+K,GAA8Bz+K,EAAO,CAC5C,OAAOk+K,GAA8Bl+K,CAAK,CAC5C,CAEA,SAAS0+K,GAAwB1+K,EAAO,CACtC,OAAOm+K,GAAwBn+K,CAAK,CACtC,CAUO,SAASq+K,GAA2B5pG,EAAOkqG,EAAe,KAAM,CACrE,MAAMp7K,EAASkxE,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EACtDrnE,EAAOuxK,GAAgBp7K,EAAO,MAAQw5K,GAAkB,cAE9D,GAAIx5K,EAAO,SAAWs5K,IAAsB,OAAOt5K,EAAO,OAAO,IAAMu5K,GACrE,OAAOwB,GAA0BlxK,EAAM7J,EAAO,QAASA,EAAO,QAAQ,EAGxE,MAAMsqB,EAAU,OAAO,SAAStqB,EAAO,OAAO,EAAI,OAAOA,EAAO,OAAO,EAAI,EACrE6D,EAAU7D,EAAO,SAAWs5K,GAAqBt5K,EAAO,QAAUA,EACxE,OAAI6J,IAAS2vK,GAAkB,aACzBlvJ,GAAW,EAAUywJ,GAA0BlxK,EAAMoxK,GAA4Bp3K,CAAO,EAAG7D,EAAO,QAAQ,EAE5G6J,IAAS2vK,GAAkB,eACzBlvJ,GAAW,EAAUywJ,GAA0BlxK,EAAMqxK,GAA8Br3K,CAAO,EAAG7D,EAAO,QAAQ,EAE9G6J,IAAS2vK,GAAkB,SACzBlvJ,GAAW,EAAUywJ,GAA0BlxK,EAAMsxK,GAAwBt3K,CAAO,EAAG7D,EAAO,QAAQ,EAGrG+6K,GAA0BlxK,EAAMhG,EAAS7D,EAAO,QAAQ,CACjE,CASO,SAASq7K,GAA8Br7K,EAAQ,CAEpD,MAAM6D,EADWi3K,GAA2B96K,EAAQw5K,GAAkB,aAAa,EAC1D,SAAW,CAAA,EAC9Bt4J,EAAS,CAAA,EACTo6J,EAAYz3K,EAAQ,eAAiB,OAAOA,EAAQ,eAAkB,SACxEA,EAAQ,cACR,CAAA,EACJ,SAAW,CAACgL,EAAI/K,CAAQ,IAAK,OAAO,QAAQw3K,CAAS,EAAG,CAClDrB,GAAgC,IAAIprK,CAAE,GAAK/K,GAAY,OAAOA,GAAa,WAC7Eod,EAAO,aAAarS,CAAE,QAAQ,EAAI49J,GAAkB3oK,CAAQ,GAE9D,MAAMzG,EAAUyG,GAAU,SAAW,OAAOA,EAAS,SAAY,SAC7DA,EAAS,QACT,CAAA,EACJ81K,GAAcv8K,EAASwR,EAAIqS,CAAM,EAC7BrS,IAAO,WAAa/K,GAAU,QAAU,OAAOA,EAAS,QAAW,UACrE81K,GAAc91K,EAAS,OAAQ,UAAWod,CAAM,EAE9CrS,IAAO,cACL,OAAO,UAAU,eAAe,KAAK/K,GAAY,CAAA,EAAI,eAAe,IACtEod,EAAO,yBAAyB,EAAIurJ,GAAkB3oK,EAAS,aAAa,GAE1E,OAAO,UAAU,eAAe,KAAKA,GAAY,CAAA,EAAI,eAAe,IACtEod,EAAO,yBAAyB,EAAIurJ,GAAkB3oK,EAAS,aAAa,GAE1E,OAAO,UAAU,eAAe,KAAKA,GAAY,CAAA,EAAI,yBAAyB,IAChFod,EAAO,mCAAmC,EAAIpd,EAAS,yBAErD,OAAO,UAAU,eAAe,KAAKA,GAAY,CAAA,EAAI,6BAA6B,IACpFod,EAAO,uCAAuC,EAAIpd,EAAS,6BAGjE,CACA,OAAID,EAAQ,SAAS+1K,GAAc/1K,EAAQ,QAAS,KAAMqd,CAAM,EAC5Drd,EAAQ,cACV+1K,GAAc/1K,EAAQ,YAAa,SAAUqd,CAAM,GAC/Crd,EAAQ,YAAY,OAAS,MAAQA,EAAQ,YAAY,OAAS,QACpEqd,EAAO,iBAAiB,EAAIrd,EAAQ,YAAY,OAGhDA,EAAQ,oBAAoB+1K,GAAc/1K,EAAQ,mBAAoB,iBAAkBqd,CAAM,EAC3Fm5J,GAAuBn5J,CAAM,CACtC,CAUO,SAASq6J,GAAiBr1K,EAAO,GAAIY,EAAU,CAAA,EAAI,CACxD,MAAM00K,EAAQ,IAAI,IAAI,CAAC,GAAG,OAAO,KAAKt1K,CAAI,EAAG,GAAG,OAAO,KAAKY,CAAO,CAAC,CAAC,EAC/D20K,EAAO,CAAA,EACb,UAAWt2E,KAAQq2E,EACb,KAAK,UAAUt1K,EAAKi/F,CAAI,CAAC,IAAM,KAAK,UAAUr+F,EAAQq+F,CAAI,CAAC,GAC3D,OAAO,UAAU,eAAe,KAAKr+F,EAASq+F,CAAI,IACpDs2E,EAAKt2E,CAAI,EAAIsnE,GAAkB3lK,EAAQq+F,CAAI,CAAC,GAGhD,OAAOs2E,CACT,CAUO,SAASC,GAAmC17K,EAAQ8gJ,EAAY,GAAI,CACzE,MAAM66B,EAAWb,GAA2B96K,EAAQw5K,GAAkB,aAAa,EAC7E31K,EAAU4oK,GAAkBkP,EAAS,SAAW,CAAA,CAAE,EAClDC,EAAsBtB,GAAqB7N,GAAkB3rB,GAAa,CAAA,CAAE,CAAC,EACnF,SAAW,CAAC37C,EAAM1oG,CAAK,IAAK,OAAO,QAAQm/K,CAAmB,EAAG,CAC/D,GAAIxB,GAAuBj1E,CAAI,EAAG,SAClC,MAAMw0E,EAAW,OAAOx0E,CAAI,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EACvD,GAAI,CAACw0E,EAAS,OAAQ,SACtB,GAAIA,EAAS,CAAC,IAAM,KAAM,CACnB91K,EAAQ,UAASA,EAAQ,QAAU,CAAA,GACxC61K,GAAU71K,EAAQ,QAAS81K,EAAS,MAAM,CAAC,EAAGl9K,CAAK,EACnD,QACF,CACA,GAAIk9K,EAAS,CAAC,IAAM,SAAWA,EAAS,CAAC,IAAM,YAAa,CAC1D,MAAMp8K,EAAOd,IAAU,KAAO,KAAQA,IAAU,KAAO,KAAO,KAC1Dc,IACGsG,EAAQ,cAAaA,EAAQ,YAAc,CAAA,GAChDA,EAAQ,YAAY,KAAOtG,GAE7B,QACF,CACA,GAAIo8K,EAAS,CAAC,IAAM,SAAU,CACvB91K,EAAQ,cAAaA,EAAQ,YAAc,CAAA,GAChD61K,GAAU71K,EAAQ,YAAa81K,EAAS,MAAM,CAAC,EAAGl9K,CAAK,EACvD,QACF,CACA,GAAIk9K,EAAS,CAAC,IAAM,iBAAkB,CAC/B91K,EAAQ,qBAAoBA,EAAQ,mBAAqB,CAAA,GAC9D61K,GAAU71K,EAAQ,mBAAoB81K,EAAS,MAAM,CAAC,EAAGl9K,CAAK,EAC9D,QACF,CACA,GAAIk9K,EAAS,CAAC,IAAM,aAAeA,EAAS,QAAU,GAAKA,EAAS,CAAC,IAAM,QAAS,CAC7E91K,EAAQ,gBAAeA,EAAQ,cAAgB,CAAA,GACpDA,EAAQ,cAAc81K,EAAS,CAAC,CAAC,EAAIlN,GAAkBhwK,CAAK,EAC5D,QACF,CACA,MAAMipJ,EAAai0B,EAAS,CAAC,EACxB91K,EAAQ,gBAAeA,EAAQ,cAAgB,CAAA,GAC/CA,EAAQ,cAAc6hJ,CAAU,IAAG7hJ,EAAQ,cAAc6hJ,CAAU,EAAI,CAAE,QAAS,EAAE,GACpF7hJ,EAAQ,cAAc6hJ,CAAU,EAAE,UAAS7hJ,EAAQ,cAAc6hJ,CAAU,EAAE,QAAU,CAAA,GAC5Fg0B,GAAU71K,EAAQ,cAAc6hJ,CAAU,EAAE,QAASi0B,EAAS,MAAM,CAAC,EAAGl9K,CAAK,CAC/E,CACA,OAAOs+K,GAA0BvB,GAAkB,cAAe31K,EAAS83K,EAAS,QAAQ,CAC9F,CAUO,SAASE,GAA6BF,EAAUG,EAAS,GAAM,CACpE,OAAO,KAAK,UAAUhB,GAA2Ba,EAAUA,GAAU,MAAQ,IAAI,EAAG,KAAMG,EAAS,EAAI,CAAC,CAC1G,CAWO,SAASC,GAAyB/7K,EAAQo7K,EAAe,KAAM,CACpE,OACSN,GADL,OAAO96K,GAAW,SACc,KAAK,MAAMA,CAAM,EAEnBA,EAFsBo7K,CAAY,CAGtE,CC5fA,SAASY,GAAU78K,EAAU,CAC3B,GAAI,OAAO,gBAAmB,WAAY,CACxC,eAAeA,CAAQ,EACvB,MACF,CACA,QAAQ,QAAO,EAAG,KAAKA,CAAQ,CACjC,CAWO,MAAM88K,EAA4B,CACvC,YAAY5+K,EAAU,GAAI,CACxB,KAAK,QAAUA,EAAQ,SAAW,WAAW,cAAgB,KAC7D,KAAK,IAAMA,EAAQ,KAAO,qCAC1B,KAAK,qBAAuBA,EAAQ,sBAAwB,2CAC9D,CAEA,wBAAwB6+K,EAAc,KAAM,CAC1C,OAAIA,GAAe,MAAQA,IAAgB,GAAW,KAAK,qBACpD,GAAG,KAAK,oBAAoB,IAAI,mBAAmB,OAAOA,CAAW,CAAC,CAAC,EAChF,CAEA,MAAM,MAAO,CACX,GAAI,CAAC,KAAK,QAAS,OAAO,KAC1B,MAAMppJ,EAAM,KAAK,QAAQ,QAAQ,KAAK,GAAG,EACzC,OAAOA,EAAM,KAAK,MAAMA,CAAG,EAAI,IACjC,CAEA,MAAM,MAAMr2B,EAAO,CACjB,OAAK,KAAK,SACV,KAAK,QAAQ,QAAQ,KAAK,IAAK,KAAK,UAAUA,CAAK,CAAC,EAC7CA,GAFmB,IAG5B,CAEA,MAAM,OAAQ,CACZ,KAAK,SAAS,aAAa,KAAK,GAAG,CACrC,CAEA,MAAM,uBAAuBy/K,EAAc,KAAM7+K,EAAU,CAAA,EAAI,CAC7D,GAAI,CAAC,KAAK,QAAS,OAAO,KAC1B,MAAMuC,EAAM,KAAK,wBAAwBs8K,CAAW,EAC9Cz/K,EAAQ,KAAK,QAAQ,QAAQmD,CAAG,EACtC,OAAInD,IACAY,EAAQ,gBAAkB,IAAQuC,IAAQ,KAAK,qBAC1C,KAAK,QAAQ,QAAQ,KAAK,oBAAoB,EAEhD,KACT,CAEA,MAAM,uBAAuBiP,EAAIqtK,EAAc,KAAM,CACnD,GAAI,CAAC,KAAK,QAAS,OAAO,KAC1B,MAAMt8K,EAAM,KAAK,wBAAwBs8K,CAAW,EACpD,OAAIrtK,GAAM,MAAQA,IAAO,GAAI,KAAK,QAAQ,WAAWjP,CAAG,EACnD,KAAK,QAAQ,QAAQA,EAAK,OAAOiP,CAAE,CAAC,EAClCA,GAAM,IACf,CACF,CAEA,SAASstK,GAAiBzN,EAAS,CACjC,OAAO,IAAI,QAAQ,CAACxjH,EAAS8mG,IAAW,CACtC0c,EAAQ,UAAY,IAAMxjH,EAAQwjH,EAAQ,MAAM,EAChDA,EAAQ,QAAU,IAAM1c,EAAO0c,EAAQ,OAAS,IAAI,MAAM,0BAA0B,CAAC,CACvF,CAAC,CACH,CAEA,SAAS0N,GAAqBC,EAAI,CAChC,OAAIA,GAAI,YAAc,GAAa,QAAQ,QAAQ,EAAI,EAChD,IAAI,QAAQ,CAACnxH,EAAS8mG,IAAW,CACtCqqB,EAAG,WAAa,IAAMnxH,EAAQ,EAAI,EAClCmxH,EAAG,QAAU,IAAMrqB,EAAOqqB,EAAG,OAAS,IAAI,MAAM,8BAA8B,CAAC,EAC/EA,EAAG,QAAU,IAAMrqB,EAAOqqB,EAAG,OAAS,IAAI,MAAM,+BAA+B,CAAC,CAClF,CAAC,CACH,CAYO,MAAMC,EAAsB,CACjC,YAAYj/K,EAAU,GAAI,CACxB,KAAK,UAAYA,EAAQ,WAAa,WAAW,WAAa,KAC9D,KAAK,OAASA,EAAQ,QAAU,aAChC,KAAK,UAAYA,EAAQ,WAAa,WACtC,KAAK,QAAUA,EAAQ,SAAW,EAClC,KAAK,WAAa,IACpB,CAEA,MAAM,OAAQ,CACZ,GAAI,CAAC,KAAK,UACR,MAAM,IAAI,MAAM,gDAAgD,EAElE,OAAI,KAAK,WAAmB,KAAK,YACjC,KAAK,WAAa,IAAI,QAAQ,CAAC6tD,EAAS8mG,IAAW,CACjD,MAAM0c,EAAU,KAAK,UAAU,KAAK,KAAK,OAAQ,KAAK,OAAO,EAC7DA,EAAQ,gBAAkB,IAAM,CAC9B,MAAM6N,EAAK7N,EAAQ,OACd6N,EAAG,iBAAiB,SAAS,KAAK,SAAS,GAC9CA,EAAG,kBAAkB,KAAK,UAAW,CAAE,QAAS,KAAM,CAE1D,EACA7N,EAAQ,UAAY,IAAMxjH,EAAQwjH,EAAQ,MAAM,EAChDA,EAAQ,QAAU,IAAM1c,EAAO0c,EAAQ,OAAS,IAAI,MAAM,0BAA0B,CAAC,CACvF,CAAC,EACM,KAAK,WACd,CAEA,MAAM,IAAI/rB,EAAQ,CAEhB,MAAM05B,GADK,MAAM,KAAK,MAAK,GACb,YAAY,KAAK,UAAW,WAAW,EAE/C3N,EADQ2N,EAAG,YAAY,KAAK,SAAS,EACrB,IAAI15B,CAAM,EAChC,aAAMw5B,GAAiBzN,CAAO,EAC9B,MAAM0N,GAAqBC,CAAE,EACtB15B,CACT,CAEA,MAAM,IAAI9zI,EAAI,CAGZ,MAAM2tK,GAFK,MAAM,KAAK,MAAK,GACb,YAAY,KAAK,UAAW,UAAU,EACnC,YAAY,KAAK,SAAS,EAE3C,OADe,MAAML,GAAiBK,EAAM,IAAI3tK,CAAE,CAAC,GAClC,IACnB,CAEA,MAAM,QAAS,CAGb,MAAM2tK,GAFK,MAAM,KAAK,MAAK,GACb,YAAY,KAAK,UAAW,UAAU,EACnC,YAAY,KAAK,SAAS,EAC3C,GAAI,OAAOA,EAAM,QAAW,WAAY,CACtC,MAAMz6K,EAAS,MAAMo6K,GAAiBK,EAAM,OAAM,CAAE,EACpD,OAAO,MAAM,QAAQz6K,CAAM,EAAIA,EAAS,CAAA,CAC1C,CACA,OAAO,IAAI,QAAQ,CAACmpD,EAAS8mG,IAAW,CACtC,MAAM1jJ,EAAS,CAAA,EACTogK,EAAU8N,EAAM,WAAU,EAChC9N,EAAQ,UAAY,IAAM,CACxB,MAAMr7J,EAASq7J,EAAQ,OACvB,GAAI,CAACr7J,EAAQ,CACX63C,EAAQ58C,CAAM,EACd,MACF,CACAA,EAAO,KAAK+E,EAAO,KAAK,EACxBA,EAAO,SAAQ,CACjB,EACAq7J,EAAQ,QAAU,IAAM1c,EAAO0c,EAAQ,OAAS,IAAI,MAAM,yBAAyB,CAAC,CACtF,CAAC,CACH,CAEA,MAAM,OAAO7/J,EAAI,CAEf,MAAMwtK,GADK,MAAM,KAAK,MAAK,GACb,YAAY,KAAK,UAAW,WAAW,EAC/CG,EAAQH,EAAG,YAAY,KAAK,SAAS,EAC3C,aAAMF,GAAiBK,EAAM,OAAO3tK,CAAE,CAAC,EACvC,MAAMutK,GAAqBC,CAAE,EACtB,EACT,CACF,CASO,SAASI,IAAsB,CACpC,MAAMnuK,EAAS,IAAI,IACnB,MAAO,CACL,QAAQ1O,EAAK,CACX,OAAO0O,EAAO,IAAI1O,CAAG,EAAI0O,EAAO,IAAI1O,CAAG,EAAI,IAC7C,EACA,QAAQA,EAAKnD,EAAO,CAClB6R,EAAO,IAAI1O,EAAK,OAAOnD,CAAK,CAAC,CAC/B,EACA,WAAWmD,EAAK,CACd0O,EAAO,OAAO1O,CAAG,CACnB,EACA,OAAQ,CACN0O,EAAO,MAAK,CACd,CACJ,CACA,CASO,SAASouK,IAA+B,CAC7C,MAAMC,CAAc,CAClB,aAAc,CACZ,KAAK,OAAS,OACd,KAAK,MAAQ,KACb,KAAK,UAAY,KACjB,KAAK,QAAU,KACf,KAAK,gBAAkB,IACzB,CAEA,QAAQ56K,EAAQ+Z,EAAO,UAAW,CAChC,KAAK,OAAS/Z,EACdi6K,GAAU,IAAM,EACElgK,IAAS,gBAAkB,KAAK,gBAAkB,KAAK,aAC7D,CAAE,OAAQ,KAAM,CAC5B,CAAC,CACH,CAEA,KAAKxa,EAAO,CACV,KAAK,MAAQA,EACb06K,GAAU,IAAM,KAAK,UAAU,CAAE,OAAQ,IAAI,CAAE,CAAC,CAClD,CACJ,CAEE,MAAMY,CAAa,CACjB,YAAYhlG,EAAO82F,EAAS,CAC1B,KAAK,OAAS92F,EACd,KAAK,SAAW82F,EAChB,KAAK,OAAS,EACd,KAAK,MAAQ92F,EAAM,CAAC,GAAK,IAC3B,CAEA,UAAW,CACT,KAAK,QAAU,EACf,MAAM34E,EAAO,KAAK,OAAO,KAAK,MAAM,GAAK,KACzC+8K,GAAU,IAAM,CACd,KAAK,SAAS,OAAS/8K,EAAO,IAAI29K,EAAa,KAAK,OAAO,MAAM,KAAK,MAAM,EAAG,KAAK,QAAQ,EAAI,KAChG,KAAK,SAAS,YAAY,CAAE,OAAQ,KAAK,SAAU,CACrD,CAAC,CACH,CACJ,CAEE,MAAMC,CAAkB,CACtB,YAAYC,EAASC,EAAS,CAC5B,KAAK,QAAUD,EACf,KAAK,QAAUC,CACjB,CAEA,IAAItgL,EAAO,CACT,MAAMiyK,EAAU,IAAIiO,EACpB,OAAAX,GAAU,IAAM,CACd,MAAMp8K,EAAMnD,IAAQ,KAAK,OAAO,EAChC,KAAK,QAAQ,IAAImD,EAAK,gBAAgBnD,CAAK,CAAC,EAC5CiyK,EAAQ,OAAS9uK,EACjB8uK,EAAQ,YAAY,CAAE,OAAQA,CAAO,CAAE,CACzC,CAAC,EACMA,CACT,CAEA,IAAI7/J,EAAI,CACN,MAAM6/J,EAAU,IAAIiO,EACpB,OAAAX,GAAU,IAAM,CACdtN,EAAQ,OAAS,KAAK,QAAQ,IAAI7/J,CAAE,EAAI,gBAAgB,KAAK,QAAQ,IAAIA,CAAE,CAAC,EAAI,OAChF6/J,EAAQ,YAAY,CAAE,OAAQA,CAAO,CAAE,CACzC,CAAC,EACMA,CACT,CAEA,QAAS,CACP,MAAMA,EAAU,IAAIiO,EACpB,OAAAX,GAAU,IAAM,CACdtN,EAAQ,OAAS,MAAM,KAAK,KAAK,QAAQ,OAAM,EAAKjyK,GAAU,gBAAgBA,CAAK,CAAC,EACpFiyK,EAAQ,YAAY,CAAE,OAAQA,CAAO,CAAE,CACzC,CAAC,EACMA,CACT,CAEA,OAAO7/J,EAAI,CACT,MAAM6/J,EAAU,IAAIiO,EACpB,OAAAX,GAAU,IAAM,CACd,KAAK,QAAQ,OAAOntK,CAAE,EACtB6/J,EAAQ,OAAS,OACjBA,EAAQ,YAAY,CAAE,OAAQA,CAAO,CAAE,CACzC,CAAC,EACMA,CACT,CAEA,YAAa,CACX,MAAMA,EAAU,IAAIiO,EACd/kG,EAAQ,MAAM,KAAK,KAAK,QAAQ,OAAM,EAAKn7E,GAAU,gBAAgBA,CAAK,CAAC,EACjF,OAAAu/K,GAAU,IAAM,CACdtN,EAAQ,OAAS92F,EAAM,OAAS,IAAIglG,EAAahlG,EAAO82F,CAAO,EAAI,KACnEA,EAAQ,YAAY,CAAE,OAAQA,CAAO,CAAE,CACzC,CAAC,EACMA,CACT,CACJ,CAEE,MAAMsO,CAAkB,CACtB,YAAYR,EAAO,CACjB,KAAK,OAASA,EACd,KAAK,MAAQ,KACb,KAAK,WAAa,KAClB,KAAK,QAAU,KACf,KAAK,QAAU,KACf,KAAK,UAAY,GACjBR,GAAU,IAAM,CACd,KAAK,UAAY,GACjB,KAAK,aAAa,CAAE,OAAQ,IAAI,CAAE,CACpC,CAAC,CACH,CAEA,aAAc,CACZ,OAAO,KAAK,MACd,CACJ,CAEE,MAAMiB,CAAe,CACnB,YAAYj+K,EAAMsrB,EAAS,CACzB,KAAK,KAAOtrB,EACZ,KAAK,QAAUsrB,EACf,KAAK,QAAU,IAAI,IACnB,KAAK,iBAAmB,CACtB,SAAWtrB,GAAS,KAAK,QAAQ,IAAIA,CAAI,CACjD,CACI,CAEA,kBAAkBA,EAAM3B,EAAU,GAAI,CACpC,MAAMm/K,EAAQ,IAAIK,EAAkB,IAAI,IAAOx/K,EAAQ,SAAW,IAAI,EACtE,YAAK,QAAQ,IAAI2B,EAAMw9K,CAAK,EACrBA,CACT,CAEA,YAAYx9K,EAAM,CAChB,MAAMw9K,EAAQ,KAAK,QAAQ,IAAIx9K,CAAI,EACnC,GAAI,CAACw9K,EAAO,MAAM,IAAI,MAAM,yBAAyBx9K,CAAI,GAAG,EAC5D,OAAO,IAAIg+K,EAAkBR,CAAK,CACpC,CACJ,CAEE,MAAMU,EAAY,IAAI,IACtB,MAAO,CACL,KAAKl+K,EAAMsrB,EAAU,EAAG,CACtB,MAAMokJ,EAAU,IAAIiO,EACpB,OAAAX,GAAU,IAAM,CACd,IAAIO,EAAKW,EAAU,IAAIl+K,CAAI,GAAK,KAChC,MAAMm+K,EAAe,CAACZ,GAAMjyJ,EAAUiyJ,EAAG,QACpCA,EAGMjyJ,EAAUiyJ,EAAG,UACtBA,EAAG,QAAUjyJ,IAHbiyJ,EAAK,IAAIU,EAAej+K,EAAMsrB,CAAO,EACrC4yJ,EAAU,IAAIl+K,EAAMu9K,CAAE,GAIxB7N,EAAQ,OAAS6N,EACbY,GACFzO,EAAQ,kBAAkB,CAAE,OAAQA,CAAO,CAAE,EAE/CA,EAAQ,YAAY,CAAE,OAAQA,CAAO,CAAE,CACzC,CAAC,EACMA,CACT,CACJ,CACA,CC7WA,SAASjD,GAAkB3vJ,EAAMhT,EAAQ,CACvC,GAAI,OAAO,aAAgB,WAAY,OAAO,IAAI,YAAYgT,EAAM,CAAE,OAAAhT,EAAQ,EAC9E,GAAI,OAAO,OAAU,WAAY,CAC/B,MAAMhK,EAAQ,IAAI,MAAMgd,CAAI,EAC5B,OAAAhd,EAAM,OAASgK,EACRhK,CACT,CACA,MAAO,CAAE,KAAAgd,EAAM,OAAAhT,CAAM,CACvB,CAEO,SAASs0K,GAAgB3gL,EAAO,CACrC,GAAIA,GAAS,MAAQ,OAAOA,GAAU,SAAU,OAAOA,EACvD,GAAI,OAAO,iBAAoB,WAC7B,GAAI,CACF,OAAO,gBAAgBA,CAAK,CAC9B,MAAY,CAEZ,CAEF,OAAO,KAAK,MAAM,KAAK,UAAUA,CAAK,CAAC,CACzC,CAEO,SAAS4gL,GAAY/lK,EAAGC,EAAG,CAChC,OAAO+lK,GAAoBhmK,EAAGC,EAAG,IAAI,OAAS,CAChD,CAEA,SAASgmK,GAA0B9gL,EAAO,CACxC,GAAI,CAACA,GAAS,OAAOA,GAAU,SAAU,MAAO,GAChD,MAAM+gL,EAAQ,OAAO,eAAe/gL,CAAK,EACzC,OAAO+gL,IAAU,OAAO,WAAaA,IAAU,IACjD,CAEA,SAASC,GAAsBnmK,EAAGC,EAAG,CAEnC,GADI,CAAC,YAAY,OAAOD,CAAC,GAAK,CAAC,YAAY,OAAOC,CAAC,GAC/CD,EAAE,cAAgBC,EAAE,aAAeD,EAAE,aAAeC,EAAE,WAAY,MAAO,GAC7E,GAAID,aAAa,UAAYC,aAAa,SAAU,CAClD,MAAMmmK,EAAS,IAAI,WAAWpmK,EAAE,OAAQA,EAAE,WAAYA,EAAE,UAAU,EAC5DqmK,EAAS,IAAI,WAAWpmK,EAAE,OAAQA,EAAE,WAAYA,EAAE,UAAU,EAClE,QAAS5R,EAAI,EAAGA,EAAI+3K,EAAO,OAAQ/3K,GAAK,EACtC,GAAI+3K,EAAO/3K,CAAC,IAAMg4K,EAAOh4K,CAAC,EAAG,MAAO,GAEtC,MAAO,EACT,CACA,GAAI2R,EAAE,SAAWC,EAAE,OAAQ,MAAO,GAClC,QAAS5R,EAAI,EAAGA,EAAI2R,EAAE,OAAQ3R,GAAK,EACjC,GAAI,CAAC,OAAO,GAAG2R,EAAE3R,CAAC,EAAG4R,EAAE5R,CAAC,CAAC,EAAG,MAAO,GAErC,MAAO,EACT,CAEA,SAAS23K,GAAoBhmK,EAAGC,EAAGktE,EAAM,CACvC,GAAI,OAAO,GAAGntE,EAAGC,CAAC,EAAG,MAAO,GAG5B,GAFID,GAAK,MAAQC,GAAK,MAClB,OAAOD,GAAM,OAAOC,GACpB,OAAOD,GAAM,SAAU,MAAO,GAClC,GAAI,YAAY,OAAOA,CAAC,GAAK,YAAY,OAAOC,CAAC,EAAG,OAAOkmK,GAAsBnmK,EAAGC,CAAC,EAErF,MAAMqmK,EAAWn5F,EAAK,IAAIntE,CAAC,EAC3B,GAAIsmK,GAAU,IAAIrmK,CAAC,EAAG,MAAO,GAI7B,GAHIqmK,EAAUA,EAAS,IAAIrmK,CAAC,EACvBktE,EAAK,IAAIntE,EAAG,IAAI,QAAQ,CAACC,CAAC,CAAC,CAAC,EAE7B,MAAM,QAAQD,CAAC,GAAK,MAAM,QAAQC,CAAC,EAAG,CACxC,GAAI,CAAC,MAAM,QAAQD,CAAC,GAAK,CAAC,MAAM,QAAQC,CAAC,GAAKD,EAAE,SAAWC,EAAE,OAAQ,MAAO,GAC5E,QAAS5R,EAAI,EAAGA,EAAI2R,EAAE,OAAQ3R,GAAK,EACjC,GAAI,CAAC23K,GAAoBhmK,EAAE3R,CAAC,EAAG4R,EAAE5R,CAAC,EAAG8+E,CAAI,EAAG,MAAO,GAErD,MAAO,EACT,CAEA,GAAI,CAAC84F,GAA0BjmK,CAAC,GAAK,CAACimK,GAA0BhmK,CAAC,EAAG,MAAO,GAC3E,MAAMsmK,EAAQ,OAAO,KAAKvmK,CAAC,EACrBwmK,EAAQ,OAAO,KAAKvmK,CAAC,EAC3B,GAAIsmK,EAAM,SAAWC,EAAM,OAAQ,MAAO,GAC1C,UAAWl+K,KAAOi+K,EAEhB,GADI,CAAC,OAAO,UAAU,eAAe,KAAKtmK,EAAG3X,CAAG,GAC5C,CAAC09K,GAAoBhmK,EAAE1X,CAAG,EAAG2X,EAAE3X,CAAG,EAAG6kF,CAAI,EAAG,MAAO,GAEzD,MAAO,EACT,CAEO,SAASs5F,GAAkBn+K,EAAK,CACrC,OAAO,OAAOA,GAAO,EAAE,EAAE,KAAI,EAAG,QAAQ,aAAc,EAAE,CAC1D,CAEO,SAASo+K,GAAanE,EAAQj6K,EAAK,CACxC,MAAM6kD,EAAOs5H,GAAkBlE,CAAM,EAC/Bn1H,EAAQq5H,GAAkBn+K,CAAG,EACnC,OAAK6kD,EACAC,EACDA,IAAUD,GAAQC,EAAM,WAAW,GAAGD,CAAI,GAAG,EAAUC,EACpD,GAAGD,CAAI,IAAIC,CAAK,GAFJD,EADDC,CAIpB,CAEA,SAASu5H,GAAex7I,EAAO,CAC7B,MAAMhmC,EAAQ,OAAOgmC,GAAS,EAAE,EAAE,KAAI,EACtC,MAAO,CAAC,OAAQ,YAAa,UAAW,SAAS,EAAE,SAAShmC,CAAK,EAAIA,EAAQ,SAC/E,CAEA,SAASyhL,GAAcpiK,EAAM,CAC3B,MAAMrf,EAAQ,OAAOqf,GAAQ,EAAE,EAAE,KAAI,EACrC,MAAO,CAAC,SAAU,UAAW,SAAU,OAAQ,SAAU,OAAO,EAAE,SAASrf,CAAK,EAAIA,EAAQ,QAC9F,CAEO,SAAS0hL,GAA8Bn+K,EAAQ,CACpD,MAAMvD,EAAQ,OAAOuD,GAAU,EAAE,EAAE,KAAI,EACvC,OAAOvD,IAAU,MAAQA,IAAU,WAAaA,IAAU,OAASA,IAAU,OAC/E,CAEO,SAAS2hL,GAA2Bt1K,EAAS,GAAI,CACtD,MAAM9I,EAAS,OAAO8I,EAAO,QAAU,EAAE,EAAE,KAAI,GAAM,QAC/CmjI,EAAS,OAAOnjI,EAAO,QAAU9I,CAAM,EAAE,KAAI,GAAMA,EACnDS,EAAS,OAAOqI,EAAO,QAAU,EAAE,EAAE,KAAI,GAAM,MAC/Cu1K,EAAcr+K,IAAW,WAC1BA,IAAW,WACXA,IAAW,WACXA,IAAW,WACXS,EAAO,SAAS,SAAS,GACzBA,EAAO,SAAS,SAAS,EACxBsV,EAAWjN,EAAO,cAAgB,IACnCA,EAAO,gBAAkB,IACzBq1K,GAA8Bn+K,CAAM,GACpCm+K,GAA8BlyC,CAAM,EACzC,MAAO,CACL,OAAAjsI,EACA,OAAAisI,EACA,OAAAxrI,EACA,YAAA49K,EACA,SAAAtoK,CACJ,CACA,CAEA,SAASuoK,GAAuB1+K,EAAKrB,EAAQggL,EAAcC,EAAa,IAAI,IAAO,CAEjF,GADI,CAACjgL,GACDqB,IAAQrB,GAAUqB,EAAI,WAAW,GAAGrB,CAAM,GAAG,EAAG,MAAO,GAC3D,MAAMkgL,EAAYV,GAAkBQ,CAAY,EAChD,GAAI,CAACE,EAAW,MAAO,GAGvB,GAFI7+K,IAAQ6+K,GAAa7+K,EAAI,WAAW,GAAG6+K,CAAS,GAAG,GACnD7+K,IAAQ,aAAa6+K,CAAS,IAAM7+K,EAAI,WAAW,aAAa6+K,CAAS,GAAG,GAC5EA,IAAc,WAAa7+K,IAAQ,kBAAoBA,EAAI,WAAW,iBAAiB,GAAI,MAAO,GACtG,UAAWshH,KAASs9D,EAAW,IAAI5+K,CAAG,GAAK,CAAA,EACzC,GAAIshH,IAAUu9D,GAAav9D,EAAM,WAAW,GAAGu9D,CAAS,GAAG,GAAKA,EAAU,WAAW,GAAGv9D,CAAK,GAAG,EAC9F,MAAO,GAGX,MAAO,EACT,CAEA,SAASw9D,GAA+B9+K,EAAK6qB,EAAO,CAClD,MAAM84F,EAAK94F,GAAO,IAAM,OAAOA,EAAM,IAAO,SAAWA,EAAM,GAAK,CAAA,EAClE,GACE,OAAO,UAAU,eAAe,KAAKA,GAAS,CAAA,EAAI,OAAO,GACtD,OAAO,UAAU,eAAe,KAAKA,GAAS,CAAA,EAAI,SAAS,GAC3D,OAAO,UAAU,eAAe,KAAK84F,EAAI,OAAO,GAChD,OAAO,UAAU,eAAe,KAAKA,EAAI,SAAS,EAErD,MAAM,IAAI,MAAM,gBAAgB3jH,CAAG,8EAA8E,CAErH,CAEA,SAAS++K,GAAoB/+K,EAAK6qB,EAAQ,CAAA,EAAI5hB,EAAQ,KAAM+1K,EAAY,GAAI,CAC1EF,GAA+B9+K,EAAK6qB,CAAK,EACzC,MAAMo0J,EAAa,OAAO,UAAU,eAAe,KAAKp0J,EAAO,SAAS,EAClE02H,EAAkB,OAAO,UAAU,eAAe,KAAK12H,EAAO,cAAc,EAC5E42C,EAAew9G,EAAap0J,EAAM,QAAW02H,EAAkB12H,EAAM,aAAe,KACpFq0J,EAAU,MAAM,QAAQr0J,EAAM,OAAO,EACvCA,EAAM,QAAQ,IAAKy2F,GAAU68D,GAAkB78D,CAAK,CAAC,EAAE,OAAO,OAAO,EACrE,CAAA,EACE69D,EAAahB,GAAkBtzJ,EAAM,QAAUm0J,CAAS,EAAE,MAAM,GAAG,EAAE,IAAG,EACxEI,EAAuBn2K,GAASk2K,GAAc,OAAOl2K,EAAMk2K,CAAU,GAAM,WAC7El2K,EAAMk2K,CAAU,EAAE,KAAKl2K,CAAK,EAC5B,KACJ,MAAO,CACL,IAAAjJ,EACA,QAAAk/K,EACA,YAAa,OAAOr0J,EAAM,aAAgB,SAAWA,EAAM,YAAc,GACzE,QAAS2yJ,GAAgB/7G,CAAY,EACrC,KAAM68G,GAAczzJ,EAAM,IAAI,EAC9B,MAAOwzJ,GAAexzJ,EAAM,KAAK,EACjC,QAASA,EAAM,UAAY,GAC3B,GAAIA,EAAM,IAAM,OAAOA,EAAM,IAAO,SAAW,CAAE,GAAGA,EAAM,EAAE,EAAK,CAAA,EACjE,OAAQ,OAAOA,EAAM,QAAW,WAC5BA,EAAM,OACL,OAAOA,EAAM,KAAQ,WAAaA,EAAM,IAAOu0J,EAAuB,IAAMA,IAAyB,KAC1G,OAAQ,OAAOv0J,EAAM,QAAW,WAC5BA,EAAM,OACL,OAAOA,EAAM,KAAQ,WAAaA,EAAM,IAAOu0J,EAAuB,CAACviL,EAAOY,IAAY2hL,EAAqBviL,EAAOY,CAAO,EAAI,KACtI,UAAW,OAAOotB,EAAM,WAAc,WAAaA,EAAM,UAAY,KACrE,OAAQ,OAAOA,EAAM,QAAW,WAAaA,EAAM,OAAS,KAC5D,aAAcA,EAAM,eAAiB,GACrC,SAAU,OAAOA,EAAM,UAAa,SAAWA,EAAM,SAAWs0J,EAChE,UAAW,OAAOt0J,EAAM,WAAc,WAAaA,EAAM,UAAY,KACrE,YAAa,OAAOA,EAAM,aAAgB,WAAaA,EAAM,YAAc,KAC3E,OAAQ,OAAOA,EAAM,QAAW,WAAaA,EAAM,OAAS4yJ,EAChE,CACA,CAEO,SAAS4B,GAAsBn2K,EAAS,CAAA,EAAIvK,EAAS,GAAI2lJ,EAAU,KAAM,CAC9E,MAAMl5I,EAAO,CAAA,EAGb,GAFI,OAAOlC,EAAO,YAAe,UAAUkC,EAAK,KAAKlC,EAAO,UAAU,EAClE,OAAOA,EAAO,UAAa,UAAUkC,EAAK,KAAKlC,EAAO,QAAQ,EAC9D,MAAM,QAAQA,EAAO,WAAW,EAClC,UAAWlJ,KAAOkJ,EAAO,YACnB,OAAOlJ,GAAQ,UAAUoL,EAAK,KAAKpL,CAAG,EAG9C,GAAI,MAAM,QAAQkJ,EAAO,SAAS,EAChC,UAAWlJ,KAAOkJ,EAAO,UACnB,OAAOlJ,GAAQ,UAAUoL,EAAK,KAAKpL,CAAG,EAG9C,OAAKoL,EAAK,OACHA,EAAK,KAAMpL,GAAQskJ,GAAS,aAAatkJ,CAAG,IAAMrB,CAAM,EADtC,EAE3B,CAEA,SAAS2gL,GAAmBp2K,EAAS,GAAI,CACvC,OAAO,OAAOA,EAAO,YAAe,UAC/B,OAAOA,EAAO,UAAa,UAC1B,MAAM,QAAQA,EAAO,WAAW,GAAKA,EAAO,YAAY,KAAMlJ,GAAQ,OAAOA,GAAQ,QAAQ,GAC7F,MAAM,QAAQkJ,EAAO,SAAS,GAAKA,EAAO,UAAU,KAAMlJ,GAAQ,OAAOA,GAAQ,QAAQ,CACjG,CAQO,MAAMu/K,WAA2B,WAAY,CAClD,YAAY9hL,EAAU,GAAI,CACxB,MAAK,EACL,KAAK,QAAU,IAAI,IACnB,KAAK,OAAS,IAAI,IAClB,KAAK,UAAY,IAAI,IACrB,KAAK,QAAU,IAAI,IACnB,KAAK,WAAa,IAAI,IACtB,KAAK,OAAS,IAAI,IAClB,KAAK,WAAa,IAAI,IACtB,KAAK,yBAA2B,IAAI,IACpC,KAAK,IAAMA,EAAQ,MAAQ,IAAM,KAAK,OACtC,KAAK,QAAU,EACf,KAAK,QAAU,CAAA,EACf,KAAK,cAAgB,CAAA,EACrB,KAAK,cAAgB,IAAI,IACzB,KAAK,sBAAwB,IAAI,IACjC,KAAK,SAAW,IAAI+hL,GAAuB,IAAI,EAC/C,KAAK,aAAe,KACpB,KAAK,sBAAwB/hL,EAAQ,wBAA0B,EACjE,CAEA,yBAAyB41C,EAAQ,GAAM,CACrC,YAAK,sBAAwBA,IAAU,GAChC,KAAK,qBACd,CAEA,SAASpqC,EAAOgxK,EAAQ93J,EAAU,CAAA,EAAI,CACpC,IAAIs9J,EAAcx2K,EACdy2K,EAAezF,EACf0F,EAAgBx9J,GAChBA,GAAW,MAAQ,OAAOA,GAAY,YACxCw9J,EAAgB1F,EAChByF,EAAez2K,EACfw2K,EAAc,MAEhB,MAAM7tE,EAAW,CAAA,EACjB,SAAW,CAACxyG,EAAM8uB,CAAU,IAAK,OAAO,QAAQyxJ,GAAiB,CAAA,CAAE,EAAG,CACpE,MAAM3/K,EAAMo+K,GAAasB,EAActgL,CAAI,EAC3C,GAAI,CAACY,EAAK,SACV,MAAM4/K,EAAgB,KAAK,QAAQ,IAAI5/K,CAAG,GAAK,KACzC6/K,EAAgB,KAAK,OAAO,IAAI7/K,CAAG,EAAI,KAAK,OAAO,IAAIA,CAAG,EAAI,OAC9D6qB,EAAQk0J,GAAoB/+K,EAAKkuB,EAAYuxJ,EAAargL,CAAI,EACpE,KAAK,QAAQ,IAAIY,EAAK6qB,CAAK,EAC3B,KAAK,oBAAoB7qB,CAAG,EAC5B,UAAWshH,KAASz2F,EAAM,QAAS,CACjC,GAAIy2F,IAAUthH,EAAK,SACnB,KAAK,QAAQ,IAAIshH,EAAOthH,CAAG,EAC3B,MAAM4+K,EAAa,KAAK,WAAW,IAAI5+K,CAAG,GAAK,IAAI,IACnD4+K,EAAW,IAAIt9D,CAAK,EACpB,KAAK,WAAW,IAAIthH,EAAK4+K,CAAU,EAC/B,KAAK,OAAO,IAAIt9D,CAAK,IACvB,KAAK,OAAO,IAAIthH,EAAKw9K,GAAgB,KAAK,OAAO,IAAIl8D,CAAK,CAAC,CAAC,EAC5D,KAAK,OAAO,OAAOA,CAAK,GAEtB,KAAK,UAAU,IAAIA,CAAK,IAC1B,KAAK,UAAU,IAAIthH,EAAKw9K,GAAgB,KAAK,UAAU,IAAIl8D,CAAK,CAAC,CAAC,EAClE,KAAK,UAAU,OAAOA,CAAK,EAC3B,KAAK,iCAAgC,EAEzC,CACA,GAAIm+D,EAAa,CACf,MAAMK,EAAY,KAAK,OAAO,IAAIL,CAAW,GAAK,IAAI,IACtDK,EAAU,IAAI9/K,CAAG,EACjB,KAAK,OAAO,IAAIy/K,EAAaK,CAAS,CACxC,CACA,MAAMC,EAAUl1J,EAAM,OAASA,EAAM,OAAM,EAAKA,EAAM,QAChDk9G,EAAey1C,GAAgBuC,GAAkBl1J,EAAM,OAAiB,EACzE,KAAK,OAAO,IAAI7qB,CAAG,EAGtB,CAAC,KAAK,UAAU,IAAIA,CAAG,GACpB4/K,IACCC,GAAiB,MAAQD,EAAc,OAAOC,EAAeD,EAAc,OAAO,IAEtF,KAAK,OAAO,IAAI5/K,EAAK+nI,CAAY,EANjC,KAAK,OAAO,IAAI/nI,EAAK+nI,CAAY,EAQnC,MAAMi4C,EAAiB,KAAK,SAAS,KAAKhgL,EAAK6qB,EAAO40J,CAAW,EACjE,GAAI,KAAK,UAAU,IAAIz/K,CAAG,EAAG,CAC3B,MAAMigL,EAAgBzC,GAAgB,KAAK,UAAU,IAAIx9K,CAAG,CAAC,EACvDkgL,EAAgBr1J,EAAM,YAAcA,EAAM,YAAYo1J,EAAe,CACzE,OAAQ,UACR,OAAQ,4BAClB,CAAS,EAAIA,EACL,KAAK,OAAO,IAAIjgL,EAAKw9K,GAAgB0C,CAAa,CAAC,EACnD,KAAK,SAAS,MAAMlgL,EAAKkgL,EAAe,CACtC,OAAQ,UACR,OAAQ,6BACR,aAAc,GACd,cAAe,EACzB,CAAS,CACH,CACAtuE,EAAS,KAAK,IAAM,CAClBouE,IAAc,EACd,UAAW1+D,KAAS,KAAK,WAAW,IAAIthH,CAAG,GAAK,GAC9C,KAAK,QAAQ,OAAOshH,CAAK,EAE3B,KAAK,WAAW,OAAOthH,CAAG,EAC1B,KAAK,QAAQ,OAAOA,CAAG,EACvB,KAAK,OAAO,OAAOA,CAAG,EACtB,KAAK,gBAAgBA,CAAG,CAC1B,CAAC,CACH,CACA,MAAO,IAAM,CACX,UAAW8xG,KAAWF,EAAUE,EAAO,EACnC2tE,GAAa,KAAK,OAAO,OAAOA,CAAW,EAC/C,KAAK,MAAM,SAAU,CAAE,OAAQ,aAAc,MAAOA,GAAe,KAAM,CAC3E,CACF,CAEA,MAAMz/K,EAAK,CACT,MAAMrB,EAAS,KAAK,WAAWqB,CAAG,EAC5B6qB,EAAQ,KAAK,QAAQ,IAAIlsB,CAAM,EACrC,OAAOksB,EAAQ,CAAE,GAAGA,EAAO,GAAI,CAAE,GAAIA,EAAM,IAAM,CAAA,CAAG,CAAE,EAAK,IAC7D,CAEA,WAAWovJ,EAAS,GAAI,CACtB,MAAMt7K,EAAS,KAAK,WAAWs7K,CAAM,EACrC,OAAO,MAAM,KAAK,KAAK,QAAQ,QAAO,CAAE,EACrC,OAAO,CAAC,CAACj6K,CAAG,IAAM,CAACrB,GAAUqB,IAAQrB,GAAUqB,EAAI,WAAW,GAAGrB,CAAM,GAAG,CAAC,EAC3E,IAAI,CAAC,CAACqB,EAAK6qB,CAAK,IAAM,CAAC7qB,EAAK,CAAE,GAAG6qB,EAAO,GAAI,CAAE,GAAIA,EAAM,IAAM,CAAA,CAAG,CAAE,CAAE,CAAC,CAC3E,CAEA,IAAI7qB,EAAKlD,EAAW,OAAW,CAC7B,MAAM6B,EAAS,KAAK,WAAWqB,CAAG,EAClC,GAAI,KAAK,OAAO,IAAIrB,CAAM,EAAG,OAAO,KAAK,OAAO,IAAIA,CAAM,EAC1D,MAAMksB,EAAQ,KAAK,QAAQ,IAAIlsB,CAAM,EACrC,OAAIksB,EAAcA,EAAM,QACjB/tB,CACT,CAEA,IAAIkD,EAAKnD,EAAOY,EAAU,CAAA,EAAI,CAC5B,OAAO,KAAK,QAAQuC,EAAKnD,EAAOY,CAAO,CACzC,CAEA,WAAWuC,EAAKnD,EAAOY,EAAU,CAAA,EAAI,CACnC,MAAMkhL,EAAeR,GAAkBn+K,CAAG,EACpCrB,EAAS,KAAK,WAAWggL,CAAY,EAC3C,GAAI,CAAChgL,EAAQ,OAAO,KAEpB,MAAMksB,EAAQ,CAAE,GADC,KAAK,QAAQ,IAAIlsB,CAAM,GAAKogL,GAAoBpgL,EAAQ,EAAE,EAC9C,QAAS6+K,GAAgB3gL,CAAK,CAAC,EAC5D,KAAK,QAAQ,IAAI8B,EAAQksB,CAAK,EACzB,KAAK,UAAU,IAAIlsB,CAAM,IAC5B,KAAK,OAAO,IAAIA,EAAQ6+K,GAAgB3gL,CAAK,CAAC,EAC9C,KAAK,SAAS,MAAM8B,EAAQ9B,EAAO,CACjC,OAAQY,EAAQ,QAAU,UAC1B,OAAQA,EAAQ,QAAU,cAC1B,aAAc,EACtB,CAAO,GAEH,MAAMyL,EAAS,CACb,IAAKvK,EACL,KAAMA,EACN,aAAAggL,EACA,MAAO,KAAK,IAAIhgL,CAAM,EACtB,QAAS6+K,GAAgB3gL,CAAK,EAC9B,OAAQY,EAAQ,QAAU,UAC1B,OAAQA,EAAQ,QAAU,cAC1B,cAAe,GACf,gBAAiB,GACjB,OAAQ,KAAK,OAAOkB,CAAM,CAChC,EACI,YAAK,MAAM,SAAUuK,CAAM,EACpBA,CACT,CAEA,MAAMi3K,EAAa1iL,EAAU,GAAI,CAC/B,MAAMkB,EAAS,KAAK,WAAWwhL,CAAW,EAC1C,GAAI,CAACxhL,EAAQ,MAAO,CAAE,MAAO,GAAO,QAAS,EAAE,EAC/C,MAAMyM,EAAO,KAAK,cAAczM,CAAM,EAChCwjB,EAAU,CAAA,EAChB,UAAWniB,KAAOoL,EAAM,CACtB,MAAMyf,EAAQ,KAAK,QAAQ,IAAI7qB,CAAG,EAClC,GAAI,CAAC6qB,EAAO,SACZ,MAAM1oB,EAAS,KAAK,QAAQnC,EAAKw9K,GAAgB3yJ,EAAM,OAAO,EAAG,CAC/D,GAAGptB,EACH,OAAQA,EAAQ,QAAU,QAC1B,OAAQA,EAAQ,QAAU,QAC1B,cAAe,GACf,cAAe,EACvB,CAAO,EACG0E,GAAQ,OAAOggB,EAAQ,KAAKhgB,EAAO,KAAK,CAC9C,CACA,MAAO,CAAE,MAAOggB,EAAQ,OAAS,EAAG,QAAAA,CAAO,CAC7C,CAEA,eAAeg+J,EAAa1iL,EAAU,GAAI,CACxC,OAAO,KAAK,MAAM0iL,EAAa1iL,CAAO,CACxC,CAEA,OAAO0iL,EAAa,CAClB,MAAMxB,EAAeR,GAAkBgC,CAAW,EAC5CxhL,EAAS,KAAK,WAAWggL,CAAY,EACrC9zJ,EAAQ,KAAK,QAAQ,IAAIlsB,CAAM,GAAK,KACpC6iJ,EAAc,KAAK,UAAU,IAAI7iJ,CAAM,EAC7C,GAAIksB,GAAS,KAAK,OAAO,IAAIlsB,CAAM,EAAG,CACpC,MAAMyhL,EAAkB,KAAK,yBAAyB,IAAIzhL,CAAM,GAAK,EACrE,MAAO,CACL,IAAKggL,GAAgBhgL,EACrB,aAAcA,EACd,MAAO6iJ,EAAc,UAAa4+B,EAAkB,EAAI,UAAY,UACpE,YAAa5+B,GAAe4+B,EAAkB,EAC9C,MAAO,KAAK,IAAIzhL,CAAM,EACtB,QAASksB,GAAO,SAAW,KAC3B,aAAcA,GAAO,SAAW,IACxC,CACI,CACA,MAAMw1J,EAAgB,KAAK,UAAU,IAAI1hL,CAAM,EACzCuD,GAAW,KAAK,yBAAyB,IAAIvD,CAAM,GAAK,IAAM0hL,EAAgB,EAAI,GACxF,MAAO,CACL,IAAK1hL,EACL,aAAcA,EACd,MAAO0hL,EAAgB,UAAan+K,EAAU,EAAI,UAAY,UAC9D,YAAaA,EAAU,EACvB,MAAO,OACP,QAAS,OACT,aAAc,MACpB,CACE,CAEA,YAAa,CACX,MAAM4sG,EAAW,CAAA,EACX8I,EAAW,CAAA,EACXhQ,EAAS,CAAA,EACf,UAAW5nG,KAAO,KAAK,UAAU,KAAI,EAAI,CACvC8uG,EAAS9uG,CAAG,EAAI,UAChB,UAAWshH,KAAS,KAAK,WAAW,IAAIthH,CAAG,GAAK,GAC9C8uG,EAASwS,CAAK,EAAI,UAEpB,MAAM/yC,EAAQvuE,EAAI,MAAM,GAAG,EACvBuuE,EAAM,CAAC,IAAGq5B,EAAOr5B,EAAM,CAAC,CAAC,EAAIq5B,EAAOr5B,EAAM,CAAC,CAAC,IAAM,UAAY,UAAY,WAC1EA,EAAM,CAAC,GAAKA,EAAM,CAAC,IAAGqpC,EAAS,GAAGrpC,EAAM,CAAC,CAAC,IAAIA,EAAM,CAAC,CAAC,EAAE,EAAI,UAClE,CACA,MAAO,CAAE,SAAAugC,EAAU,SAAA8I,EAAU,OAAAhQ,CAAM,CACrC,CAEA,UAAUu4E,EAAa5gL,EAAU9B,EAAU,CAAA,EAAI,CAC7C,MAAMkhL,EAAeR,GAAkBgC,CAAW,EAC5CxhL,EAAS,KAAK,WAAWggL,CAAY,EAC3C,GAAI,OAAOp/K,GAAa,WAAY,MAAO,IAAM,CAAC,EAClD,MAAM+gL,EAAe,CAAE,aAAA3B,EAAc,OAAAhgL,EAAQ,SAAAY,CAAQ,EACrD,KAAK,cAAc,IAAI+gL,CAAY,EACnC,MAAMC,EAAsB,KAAK,sBAAsB,IAAI5hL,CAAM,GAAK,IAAI,IAC1E,OAAA4hL,EAAoB,IAAID,CAAY,EACpC,KAAK,sBAAsB,IAAI3hL,EAAQ4hL,CAAmB,EACtD9iL,EAAQ,YAAc,IAAQkB,GAAQY,EAAS,KAAK,IAAIZ,CAAM,EAAG,CAAE,IAAKggL,GAAgBhgL,EAAQ,aAAcA,EAAQ,OAAQ,YAAa,EACxI,IAAM,CACX,KAAK,cAAc,OAAO2hL,CAAY,EACtC,MAAME,EAAgB,KAAK,sBAAsB,IAAI7hL,CAAM,EAC3D6hL,GAAe,OAAOF,CAAY,EAC9BE,GAAiBA,EAAc,MAAQ,GAAG,KAAK,sBAAsB,OAAO7hL,CAAM,CACxF,CACF,CAEA,YAAYlB,EAAU,GAAI8B,EAAW,KAAM,CAKzC,GAJI,OAAO9B,GAAY,aACrB8B,EAAW9B,EACXA,EAAU,CAAA,GAER,OAAO8B,GAAa,WAAY,OAAO,KAC3C,GAAI,KAAK,aAAc,CACrB,MAAMk9K,EAAK,IAAIgE,GAAiB,KAAM,KAAK,aAAa,OAAO,EAC/D,OAAAlhL,EAASk9K,CAAE,EACJA,EAAG,OAAM,CAClB,CACA,MAAMjzK,EAAW,KAAK,aAChBk3K,EAAc,CAAE,QAAAjjL,EAAS,OAAQ,CAAA,CAAE,EACzC,KAAK,aAAeijL,EACpB,GAAI,CACF,MAAMjE,EAAK,IAAIgE,GAAiB,KAAMhjL,CAAO,EAC7C8B,EAASk9K,CAAE,EACX,MAAMkE,EAASD,EAAY,OAAO,MAAK,EACvC,OAAIC,EAAO,QACT,KAAK,MAAM,cAAe,CACxB,OAAQljL,EAAQ,QAAU,QAC1B,OAAQA,EAAQ,QAAU,cAC1B,OAAQkjL,EAAO,IAAKzhL,GAAUs+K,GAAgBt+K,CAAK,CAAC,EACpD,KAAM,MAAM,KAAK,IAAI,IAAIyhL,EAAO,IAAKzhL,GAAUA,EAAM,GAAG,CAAC,CAAC,CACpE,CAAS,EAEIu9K,EAAG,OAAM,CAClB,QAAC,CACC,KAAK,aAAejzK,CACtB,CACF,CAEA,QAAQtF,EAAW,GAAIzG,EAAU,CAAA,EAAI,CACnC,MAAM2C,EAAS8D,GAAU,WAAa,OAAOA,EAAS,WAAc,SAChEA,EAAS,UACTA,EACEyiI,EAAW,CAAA,EACjB,YAAK,YAAY,CACf,OAAQlpI,EAAQ,QAAU,UAC1B,OAAQA,EAAQ,QAAU,SAChC,EAAQg/K,GAAO,CACT,SAAW,CAACz8K,EAAKnD,CAAK,IAAK,OAAO,QAAQuD,GAAU,CAAA,CAAE,EAAG,CACvD,MAAM+B,EAASs6K,EAAG,IAAIz8K,EAAKnD,EAAO,CAChC,OAAQY,EAAQ,QAAU,UAC1B,OAAQA,EAAQ,QAAU,UAC1B,cAAeA,EAAQ,cACvB,aAAcA,EAAQ,YAChC,CAAS,EACG0E,GAAQ,KAAKwkI,EAAS,KAAKxkI,EAAO,GAAG,CAC3C,CACF,CAAC,EACMwkI,CACT,CAEA,SAASlpI,EAAU,GAAI,CACrB,MAAMyG,EAAW,CACf,OAAQ,mBACR,QAAS,EACT,UAAW,KAAK,aAAazG,CAAO,CAC1C,EACI,OAAIA,EAAQ,gBAAkB,KAC5ByG,EAAS,OAAS,OAAO,YAAY,MAAM,KAAK,KAAK,OAAO,QAAO,EAAI,CAAC,CAAClE,EAAKnD,CAAK,IAAM,CAACmD,EAAKw9K,GAAgB3gL,CAAK,CAAC,CAAC,CAAC,GAErHY,EAAQ,iBAAmB,KAC7ByG,EAAS,QAAU,KAAK,QAAQ,IAAK2mB,GAAU2yJ,GAAgB3yJ,CAAK,CAAC,GAEhE3mB,CACT,CAEA,WAAY,CACV,MAAO,CACL,OAAQ,OAAO,YAAY,MAAM,KAAK,KAAK,OAAO,QAAO,EAAI,CAAC,CAAClE,EAAKnD,CAAK,IAAM,CAACmD,EAAKw9K,GAAgB3gL,CAAK,CAAC,CAAC,CAAC,EAC7G,UAAW,OAAO,YAAY,MAAM,KAAK,KAAK,UAAU,QAAO,EAAI,CAAC,CAACmD,EAAKnD,CAAK,IAAM,CAACmD,EAAKw9K,GAAgB3gL,CAAK,CAAC,CAAC,CAAC,EACnH,QAAS,KAAK,QAAQ,IAAKguB,GAAU2yJ,GAAgB3yJ,CAAK,CAAC,CACjE,CACE,CAEA,aAAa7qB,EAAK,CAChB,MAAMrB,EAAS,KAAK,WAAWqB,CAAG,EAElC,OADgB,KAAK,WAAW,IAAIrB,CAAM,GAC1B,SAAM,EAAK,OAAI,EAAK,OAASA,CAC/C,CAEA,cAAe,CACb,OAAO,MAAM,KAAK,KAAK,UAAU,KAAI,CAAE,CACzC,CAEA,aAAalB,EAAU,GAAI,CACzB,MAAMyhL,EAAUzhL,EAAQ,SAAW,YAC7B6jB,EAAS,CAAA,EACf,SAAW,CAACthB,EAAKnD,CAAK,IAAK,KAAK,UAAU,UAAW,CACnD,MAAM+jL,EAAcpD,GAAgB3gL,CAAK,EACnCgkL,EAAY,MAAM,KAAK,KAAK,WAAW,IAAI7gL,CAAG,GAAK,EAAE,EAC3D,GAAIk/K,IAAY,MAAO,CACrB59J,EAAOthB,CAAG,EAAI4gL,EACd,UAAWt/D,KAASu/D,EAAWv/J,EAAOggG,CAAK,EAAIk8D,GAAgB3gL,CAAK,CACtE,MAAWqiL,IAAY,IAAQA,IAAY,YACzC59J,EAAOu/J,EAAU,CAAC,GAAK7gL,CAAG,EAAI4gL,EAE9Bt/J,EAAOthB,CAAG,EAAI4gL,CAElB,CACA,OAAOt/J,CACT,CAEA,WAAWthB,EAAK,CACd,MAAMrB,EAASw/K,GAAkBn+K,CAAG,EACpC,GAAI,CAACrB,EAAQ,MAAO,GACpB,GAAI,KAAK,QAAQ,IAAIA,CAAM,EAAG,OAAO,KAAK,QAAQ,IAAIA,CAAM,EAC5D,IAAImiL,EAAY,GACZC,EAAUpiL,EACd,SAAW,CAAC2iH,EAAON,CAAS,IAAK,KAAK,QAAQ,UACvCriH,EAAO,WAAW,GAAG2iH,CAAK,GAAG,IAC9BA,EAAM,QAAUw/D,EAAU,SAC9BA,EAAYx/D,EACZy/D,EAAU,GAAG//D,CAAS,GAAGriH,EAAO,MAAM2iH,EAAM,MAAM,CAAC,KAErD,OAAOy/D,CACT,CAEA,QAAQ/gL,EAAKnD,EAAOY,EAAU,CAAA,EAAI,CAChC,MAAMkhL,EAAeR,GAAkBn+K,CAAG,EACpCrB,EAAS,KAAK,WAAWggL,CAAY,EAC3C,GAAI,CAAChgL,EAAQ,OAAO,KACpB,MAAMksB,EAAQ,KAAK,QAAQ,IAAIlsB,CAAM,GAAKogL,GAAoBpgL,EAAQ,EAAE,EACnE,KAAK,QAAQ,IAAIA,CAAM,IAC1B,KAAK,QAAQ,IAAIA,EAAQksB,CAAK,EAC9B,KAAK,oBAAoBlsB,CAAM,GAEjC,MAAM2wG,EAAYzkF,EAAM,YAAcA,EAAM,YAAYhuB,EAAOY,CAAO,EAAIZ,EACpEmkL,EAAW,KAAK,OAAO,IAAIriL,CAAM,EAAI,KAAK,OAAO,IAAIA,CAAM,EAAIksB,EAAM,QACrE82H,EAAgB92H,EAAM,UAAY,IAAS,KAAK,qBAAqBptB,CAAO,EAC5E4uI,EAASmyC,GAA2B/gL,CAAO,EAC3CwjL,EAAc,KAAK,UAAU,IAAItiL,CAAM,EACvCuiL,EAAe,CAACr2J,EAAM,OAAOm2J,EAAU1xE,CAAS,EACtD,IAAI6xE,EACAC,EAAkB,GAOtB,GANIz/B,GACFw/B,EAAqBt2J,EAAM,UAAYA,EAAM,UAAUykF,EAAW7xG,CAAO,EAAI6xG,EAC7E8xE,EAAkB,CAACH,GAAe,CAACp2J,EAAM,OAAO,KAAK,UAAU,IAAIlsB,CAAM,EAAGwiL,CAAkB,GAE9FC,EAAkB3jL,EAAQ,gBAAkB,IAAQwjL,EAElD,CAACC,GAAgB,CAACE,EACpB,MAAO,CAAE,QAAS,GAAO,IAAKziL,EAAQ,MAAO2wG,EAAW,MAAO,KAAK,OAAO3wG,CAAM,EAAE,KAAK,EAE1F,KAAK,OAAO,IAAIA,EAAQ2wG,CAAS,EAC7BqyC,EACF,KAAK,aAAahjJ,EAAQwiL,CAAkB,EACnC1jL,EAAQ,gBAAkB,IACnC,KAAK,gBAAgBkB,CAAM,EAE7B,MAAMO,EAAQ,CACZ,IAAK,KAAK,QACV,UAAW,KAAK,IAAG,EACnB,IAAKP,EACL,KAAMA,EACN,aAAAggL,EACA,SAAAqC,EACA,SAAU1xE,EACV,MAAOA,EACP,OAAQ7xG,EAAQ,QAAU,QAC1B,OAAQA,EAAQ,QAAU4uI,EAAO,OACjC,OAAQ5uI,EAAQ,QAAU,MAC1B,YAAa4uI,EAAO,YACpB,SAAUA,EAAO,SACjB,aAAc5uI,EAAQ,eAAiB,GACvC,cAAAkkJ,EACA,gBAAAy/B,EACA,cAAeA,EACX,CACE,IAAKziL,EACL,MAAOgjJ,EAAgBw/B,EAAqB,OAC5C,QAAS,CAACx/B,GAAiBlkJ,EAAQ,gBAAkB,EACjE,EACU,KACJ,SAAUA,EAAQ,SAClB,WAAYA,EAAQ,YAAcA,EAAQ,sBAC1C,OAAQ,IACd,EACI,OAAAyB,EAAM,OAAS,KAAK,OAAOP,CAAM,EACjC,KAAK,SAAW,EACZlB,EAAQ,UAAY,IAAO,KAAK,eAAeyB,CAAK,EACxD,KAAK,oBAAoBA,CAAK,EAC1BA,EAAM,eAAiB,IAAO,KAAK,SAAS,MAAMP,EAAQ2wG,EAAWpwG,CAAK,EAC9E,KAAK,MAAM,SAAUA,CAAK,EACtB,KAAK,cAAc,KAAK,aAAa,OAAO,KAAKA,CAAK,EACnD,CAAE,QAAS,GAAM,IAAKP,EAAQ,MAAO2wG,EAAW,MAAOpwG,EAAM,OAAO,MAAO,MAAAA,CAAK,CACzF,CAEA,cAAc+6K,EAAQ,CACpB,MAAM4E,EAAYV,GAAkBlE,CAAM,EACpCt7K,EAAS,KAAK,WAAWkgL,CAAS,EAClCzzK,EAAO,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ,KAAI,EAAI,GAAG,KAAK,OAAO,OAAQ,GAAG,KAAK,UAAU,KAAI,CAAE,CAAC,EAC9F,SAAW,CAACk2G,EAAOthH,CAAG,IAAK,KAAK,QAAQ,WAClCshH,IAAUu9D,GAAav9D,EAAM,WAAW,GAAGu9D,CAAS,GAAG,IAAGzzK,EAAK,IAAIpL,CAAG,EAE5E,OAAO,MAAM,KAAKoL,CAAI,EAAE,OAAQpL,GAAQA,IAAQrB,GAAUqB,EAAI,WAAW,GAAGrB,CAAM,GAAG,GAAK,KAAK,uBAAuBqB,EAAK6+K,CAAS,CAAC,CACvI,CAEA,oBAAoB7+K,EAAK,CACvB,MAAMuuE,EAAQ4vG,GAAkBn+K,CAAG,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAC9D,QAAS,EAAI,EAAG,EAAIuuE,EAAM,OAAQ,GAAK,EACrC,KAAK,WAAW,IAAIA,EAAM,MAAM,EAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAEnD,CAEA,iBAAiBvuE,EAAK,CACpB,MAAMuuE,EAAQ4vG,GAAkBn+K,CAAG,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EACxDqhL,EAAY,CAAA,EAClB,QAASt7K,EAAI,EAAGA,EAAIwoE,EAAM,OAAQxoE,GAAK,EACrCs7K,EAAU,KAAK9yG,EAAM,MAAM,EAAGxoE,CAAC,EAAE,KAAK,GAAG,CAAC,EAE5C,OAAOs7K,CACT,CAEA,aAAarhL,EAAKnD,EAAO,CACvB,MAAM8B,EAASw/K,GAAkBn+K,CAAG,EAC9BihL,EAAc,KAAK,UAAU,IAAItiL,CAAM,EAE7C,GADA,KAAK,UAAU,IAAIA,EAAQ9B,CAAK,EAC5B,CAAAokL,EACJ,UAAWK,KAAY,KAAK,wBAAwB3iL,CAAM,EACxD,KAAK,yBAAyB,IAAI2iL,GAAW,KAAK,yBAAyB,IAAIA,CAAQ,GAAK,GAAK,CAAC,CAEtG,CAEA,gBAAgBthL,EAAK,CACnB,MAAMrB,EAASw/K,GAAkBn+K,CAAG,EACpC,GAAK,KAAK,UAAU,OAAOrB,CAAM,EACjC,UAAW2iL,KAAY,KAAK,wBAAwB3iL,CAAM,EAAG,CAC3D,MAAMU,GAAQ,KAAK,yBAAyB,IAAIiiL,CAAQ,GAAK,GAAK,EAC9DjiL,EAAO,EAAG,KAAK,yBAAyB,IAAIiiL,EAAUjiL,CAAI,EACzD,KAAK,yBAAyB,OAAOiiL,CAAQ,CACpD,CACF,CAEA,kCAAmC,CACjC,KAAK,yBAAyB,MAAK,EACnC,UAAWthL,KAAO,KAAK,UAAU,KAAI,EACnC,UAAWshL,KAAY,KAAK,wBAAwBthL,CAAG,EACrD,KAAK,yBAAyB,IAAIshL,GAAW,KAAK,yBAAyB,IAAIA,CAAQ,GAAK,GAAK,CAAC,CAGxG,CAEA,wBAAwBthL,EAAK,CAC3B,MAAMqhL,EAAY,IAAI,IAAI,KAAK,iBAAiBrhL,CAAG,CAAC,EACpD,GAAIA,IAAQ,kBAAoBA,EAAI,WAAW,iBAAiB,EAAG,CACjEqhL,EAAU,IAAI,QAAQ,EACtB,MAAM7/I,EAASxhC,EAAI,MAAM,EAAuB,EAAE,QAAQ,OAAQ,EAAE,EACpE,GAAIwhC,EACF,UAAW8/I,KAAY,KAAK,iBAAiB,mBAAmB9/I,CAAM,EAAE,EAAG6/I,EAAU,IAAIC,CAAQ,CAErG,CACA,UAAWhgE,KAAS,KAAK,WAAW,IAAIthH,CAAG,GAAK,GAC9C,UAAWshL,KAAY,KAAK,iBAAiBhgE,CAAK,EAAG+/D,EAAU,IAAIC,CAAQ,EAE7E,OAAOD,CACT,CAEA,eAAeniL,EAAO,CACpB,KAAK,QAAQ,KAAKA,CAAK,EACvB,MAAMqN,EAAM,IACR,KAAK,QAAQ,OAASA,GAAK,KAAK,QAAQ,OAAO,EAAG,KAAK,QAAQ,OAASA,CAAG,CACjF,CAEA,oBAAoBrN,EAAO,CACzB,KAAK,cAAc,KAAK,CACtB,UAAWA,EAAM,UACjB,IAAKA,EAAM,IACX,OAAQA,EAAM,OACd,OAAQA,EAAM,OACd,OAAQA,EAAM,OACd,cAAeA,EAAM,cACrB,gBAAiBA,EAAM,gBACvB,YAAaA,EAAM,WACzB,CAAK,EACD,MAAMqiL,EAAS,KAAK,IAAG,EAAM,GAAK,GAAK,IACvC,KAAO,KAAK,cAAc,OAAS,GAAK,KAAK,cAAc,CAAC,EAAE,UAAYA,GACxE,KAAK,cAAc,MAAK,EAE1B,MAAMh1K,EAAM,IACR,KAAK,cAAc,OAASA,GAAK,KAAK,cAAc,OAAO,EAAG,KAAK,cAAc,OAASA,CAAG,CACnG,CAEA,WAAW9O,EAAU,GAAI,CACvB,MAAM8tK,EAAW,OAAO,SAAS9tK,EAAQ,QAAQ,EAAI,KAAK,IAAI,EAAG,OAAOA,EAAQ,QAAQ,CAAC,EAAI,IACvF8jL,EAAS,KAAK,IAAG,EAAKhW,EACtBiW,EAAgB/jL,EAAQ,gBAAkB,GAC1CgkL,EAAchkL,EAAQ,cAAgB,GAC5C,IAAIikL,EAAmB,EACnBC,EAAgB,EACpB,MAAMC,EAASJ,EAAgB,CAAA,EAAK,KACpC,UAAW32J,KAAS,KAAK,cACnBA,EAAM,UAAY02J,IACtBG,GAAoB,GAChB72J,EAAM,SAAW,MAAQA,EAAM,SAAW,QAAM82J,GAAiB,GACjEC,GAAQA,EAAO,KAAK/2J,CAAK,GAE/B,MAAMoC,EAAQ,CACZ,SAAAs+I,EACA,kBAAmB,KAAK,UAAU,KAClC,YAAakW,EAAc,MAAM,KAAK,KAAK,UAAU,KAAI,CAAE,EAAI,CAAA,EAC/D,iBAAAC,EACA,cAAAC,CACN,EACI,OAAIH,EAAev0J,EAAM,cAAgB20J,EAAO,IAAK/2J,GAAU2yJ,GAAgB3yJ,CAAK,CAAC,EAChFoC,EAAM,cAAgB,CAAA,EACpBA,CACT,CAEA,2BAA2BjtB,EAAK,CAC9B,MAAMqe,EAAU,IAAI,IACdwjK,EAAehlL,GAAU,CAC7B,MAAM0xE,EAAQ4vG,GAAkBthL,CAAK,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAChE,QAASkJ,EAAI,EAAGA,GAAKwoE,EAAM,OAAQxoE,GAAK,EACtCsY,EAAQ,IAAIkwD,EAAM,MAAM,EAAGxoE,CAAC,EAAE,KAAK,GAAG,CAAC,CAE3C,EACA87K,EAAY7hL,CAAG,EACf,UAAWshH,KAAS,KAAK,WAAW,IAAIthH,CAAG,GAAK,CAAA,EAAI6hL,EAAYvgE,CAAK,EACrE,OAAIthH,IAAQ,kBAAoBA,EAAI,WAAW,iBAAiB,IAAGqe,EAAQ,IAAI,QAAQ,EACnFre,EAAI,WAAW,YAAY,GAAG6hL,EAAY7hL,EAAI,QAAQ,gBAAiB,EAAE,CAAC,EACvEqe,CACT,CAEA,qBAAqB5gB,EAAU,GAAI,CACjC,GAAI,OAAO,UAAU,eAAe,KAAKA,EAAS,eAAe,EAC/D,OAAOA,EAAQ,gBAAkB,GAEnC,MAAM4uI,EAASmyC,GAA2B/gL,CAAO,EAKjD,OAJI4uI,EAAO,aACP,KAAK,wBAA0B,IAAS,CAACA,EAAO,UAIlD,KAAK,wBAA0B,KAC3BA,EAAO,SAAW,SAAWA,EAAO,SAAW,UAChD5uI,EAAQ,cAAgB,IACxBA,EAAQ,gBAAkB,GAEtB,GAEF4uI,EAAO,QAChB,CAEA,uBAAuBrsI,EAAKi6K,EAAQ,CAGlC,GAFI,CAACA,GACDj6K,IAAQ,aAAai6K,CAAM,IAAMj6K,EAAI,WAAW,aAAai6K,CAAM,GAAG,GACtEA,IAAW,WAAaj6K,IAAQ,kBAAoBA,EAAI,WAAW,iBAAiB,GAAI,MAAO,GACnG,UAAWshH,KAAS,KAAK,WAAW,IAAIthH,CAAG,GAAK,GAC9C,GAAIshH,IAAU24D,GAAU34D,EAAM,WAAW,GAAG24D,CAAM,GAAG,EAAG,MAAO,GAEjE,MAAO,EACT,CAEA,MAAM/9J,EAAMhT,EAAQ,CAClB,KAAK,cAAc2iK,GAAkB3vJ,EAAMhT,CAAM,CAAC,EAC9CgT,IAAS,UAAU,KAAK,qBAAqBhT,CAAM,CACzD,CAEA,qBAAqBA,EAAS,GAAI,CAChC,MAAMlJ,EAAMm+K,GAAkBj1K,GAAQ,KAAO,EAAE,EACzCs3K,EAAgBxgL,EAClB,IAAI,IAAI,MAAM,KAAK,KAAK,2BAA2BA,CAAG,CAAC,EACtD,QAASrB,GAAW,MAAM,KAAK,KAAK,sBAAsB,IAAIA,CAAM,GAAK,CAAA,CAAE,CAAC,CAAC,EAC9E,IAAI,IAAI,KAAK,aAAa,EAC9B,UAAW2hL,KAAgBE,EAAe,CACxC,GAAIxgL,GAAO,CAAC0+K,GAAuB1+K,EAAKsgL,EAAa,OAAQA,EAAa,aAAc,KAAK,UAAU,EAAG,SAC1G,MAAMzjL,EAAQmD,GAAOA,IAAQsgL,EAAa,QAAU,OAAO,UAAU,eAAe,KAAKp3K,EAAQ,OAAO,EACpGA,EAAO,MACP,KAAK,IAAIo3K,EAAa,QAAUtgL,CAAG,EACvCsgL,EAAa,SAASzjL,EAAOqM,CAAM,CACrC,CACF,CACF,CAQO,MAAMu3K,EAAiB,CAC5B,YAAYn8B,EAAS7mJ,EAAU,GAAI,CACjC,KAAK,QAAU6mJ,EACf,KAAK,QAAU7mJ,EACf,KAAK,OAAS,CAAA,CAChB,CAEA,IAAIuC,EAAKnD,EAAOY,EAAU,CAAA,EAAI,CAC5B,MAAM0E,EAAS,KAAK,QAAQ,QAAQnC,EAAKnD,EAAO,CAAE,GAAG,KAAK,QAAS,GAAGY,CAAO,CAAE,EAC/E,OAAI0E,GAAQ,OAAO,KAAK,OAAO,KAAKA,EAAO,KAAK,EACzCA,CACT,CAEA,MAAMg+K,EAAa1iL,EAAU,GAAI,CAC/B,OAAO,KAAK,QAAQ,MAAM0iL,EAAa,CAAE,GAAG,KAAK,QAAS,GAAG1iL,EAAS,CACxE,CAEA,QAAS,CACP,MAAO,CACL,QAAS,KAAK,OAAO,OAAS,EAC9B,OAAQ,KAAK,OAAO,IAAKyB,GAAUs+K,GAAgBt+K,CAAK,CAAC,EACzD,KAAM,MAAM,KAAK,IAAI,IAAI,KAAK,OAAO,IAAKA,GAAUA,EAAM,GAAG,CAAC,CAAC,CACrE,CACE,CACF,CAQO,MAAMsgL,EAAuB,CAClC,YAAYl7B,EAAS,CACnB,KAAK,QAAUA,EACf,KAAK,SAAW,IAAI,IACpB,KAAK,SAAW,IAAI,IACpB,KAAK,SAAW,IAAI,GACtB,CAEA,KAAKtkJ,EAAK6qB,EAAO5hB,EAAQ,KAAM,CAC7B,MAAMtK,EAASw/K,GAAkBn+K,CAAG,EACpC,GAAI,CAACrB,GAAU,CAACksB,EAAO,MAAO,IAAM,CAAC,EACrC,KAAK,OAAOlsB,CAAM,EAClB,MAAMizG,EAAW,CAAA,EACXkwE,EAAa,CAACjlL,EAAOY,EAAU,CAAA,IAAO,KAAK,MAAMkB,EAAQ9B,EAAOY,CAAO,EAC7E,KAAK,SAAS,IAAIkB,EAAQ,CAAE,MAAAksB,EAAO,MAAA5hB,EAAO,WAAA64K,EAAY,EACtD,MAAMt7C,EAAS,CAAC3pI,EAAOqM,EAAS,CAAA,IAAO,CACrC,GAAI,KAAK,SAAS,IAAIvK,CAAM,EAAG,OAC/B,MAAM2wG,EAAYzyG,IAAU,QAAa,OAAOguB,EAAM,QAAW,WAAaA,EAAM,OAAM,EAAKhuB,EACzFwvI,EAASmyC,GAA2Bt1K,CAAM,EAE9CA,EAAO,gBAAkB,IACtBmjI,EAAO,UACP,CAACA,EAAO,aACR,CAACizC,GAAmBp2K,CAAM,GAC1B,OAAO,QAAY,KACnB,OAAO,QAAQ,MAAS,YAE3B,QAAQ,KAAK,mEAAmEvK,CAAM,oDAAoD,EAE5I,MAAMojL,EAAsB74K,EAAO,gBAAkB,GACjD,IACCA,EAAO,gBAAkB,IAASmjI,EAAO,UAAY,CAACA,EAAO,cAC7DgzC,GAAsBn2K,EAAQvK,EAAQ,KAAK,OAAO,EACvD,KAAK,QAAQ,IAAIA,EAAQ2wG,EAAW,CAClC,OAAQpmG,EAAO,QAAU,UACzB,OAAQA,EAAO,QAAUmjI,EAAO,OAChC,OAAQnjI,EAAO,QAAU,eACzB,cAAe64K,EACf,aAAc,EACtB,CAAO,CACH,EACA,GAAI,OAAOl3J,EAAM,QAAW,WAAY,CACtC,MAAMinF,EAAUjnF,EAAM,OAAO,CAC3B,IAAKlsB,EACL,MAAO,KAAK,QACZ,QAAS,KAAK,QACd,OAAA6nI,EACA,MAAOs7C,CACf,CAAO,EACG,OAAOhwE,GAAY,YAAYF,EAAS,KAAKE,CAAO,CAC1D,SAAW,OAAOjnF,EAAM,WAAc,WAAY,CAChD,MAAMinF,EAAUjnF,EAAM,UAAU,CAAChuB,EAAOqM,IAAWs9H,EAAO3pI,EAAOqM,CAAM,CAAC,EACpE,OAAO4oG,GAAY,YAAYF,EAAS,KAAKE,CAAO,CAC1D,SAAW7oG,GAAS,OAAOA,EAAM,MAAS,WAAY,CACpD,MAAM6oG,EAAU7oG,EAAM,KAAKtK,EAAO,MAAM,GAAG,EAAE,IAAG,EAAI,CAAC9B,EAAOqM,IAAWs9H,EAAO3pI,EAAOqM,CAAM,CAAC,EACxF,OAAO4oG,GAAY,YAAYF,EAAS,KAAKE,CAAO,CAC1D,CACA,MAAMA,EAAU,IAAM,CACpB,UAAWhtG,KAAM8sG,EAAS,OAAO,CAAC,EAAG9sG,IAAE,EACvC,KAAK,SAAS,OAAOnG,CAAM,EAC3B,KAAK,SAAS,OAAOA,CAAM,CAC7B,EACA,YAAK,SAAS,IAAIA,EAAQmzG,CAAO,EAC1BA,CACT,CAEA,MAAM9xG,EAAKnD,EAAOY,EAAU,CAAA,EAAI,CAC9B,MAAMkB,EAASw/K,GAAkBn+K,CAAG,EAC9B4D,EAAU,KAAK,SAAS,IAAIjF,CAAM,EACxC,GAAI,CAACiF,GAAW,KAAK,SAAS,IAAIjF,CAAM,EAAG,OAC3C,KAAM,CAAE,MAAAksB,EAAO,MAAA5hB,CAAK,EAAKrF,EACzB,KAAK,SAAS,IAAIjF,CAAM,EACxB,GAAI,CACE,OAAOksB,EAAM,QAAW,WAC1BA,EAAM,OAAOhuB,EAAOY,CAAO,EAClBotB,EAAM,cAAgB5hB,GAAS4hB,EAAM,WAC9C5hB,EAAM4hB,EAAM,QAAQ,EAAIhuB,EAE5B,QAAC,CACC,KAAK,SAAS,OAAO8B,CAAM,CAC7B,CACF,CAEA,OAAOqB,EAAK,CACV,MAAMrB,EAASw/K,GAAkBn+K,CAAG,EAC9B8xG,EAAU,KAAK,SAAS,IAAInzG,CAAM,EACxC,OAAAmzG,IAAO,EACA,EAAQA,CACjB,CAEA,SAAU,CACR,UAAWA,KAAW,MAAM,KAAK,KAAK,SAAS,QAAQ,EAAGA,IAAO,EACjE,KAAK,SAAS,MAAK,EACnB,KAAK,SAAS,MAAK,CACrB,CACF,CCl9BA,SAAS+5D,GAAkB3vJ,EAAMhT,EAAQ,CACvC,GAAI,OAAO,aAAgB,WAAY,OAAO,IAAI,YAAYgT,EAAM,CAAE,OAAAhT,EAAQ,EAC9E,GAAI,OAAO,OAAU,WAAY,CAC/B,MAAMhK,EAAQ,IAAI,MAAMgd,CAAI,EAC5B,OAAAhd,EAAM,OAASgK,EACRhK,CACT,CACA,MAAO,CAAE,KAAAgd,EAAM,OAAAhT,CAAM,CACvB,CAEA,SAAS2jK,GAAkBhwK,EAAO,CAChC,GAAIA,GAAS,MAAQ,OAAOA,GAAU,SAAU,OAAOA,EACvD,GAAI,OAAO,iBAAoB,WAC7B,GAAI,CACF,OAAO,gBAAgBA,CAAK,CAC9B,MAAY,CAEZ,CAEF,OAAO,KAAK,MAAM,KAAK,UAAUA,CAAK,CAAC,CACzC,CAEA,SAASmlL,GAAyBnlL,EAAO,CACvC,GAAIA,GAAS,KAAM,MAAO,GAC1B,GAAI,OAAO,KAAS,KAAeA,aAAiB,KAAM,OAAOA,EAAM,KAEvE,GADIA,aAAiB,aACjB,YAAY,OAAOA,CAAK,EAAG,OAAOA,EAAM,WAC5C,GAAI,OAAOA,GAAU,SAAU,OAAOA,EAAM,OAAS,EACrD,GAAI,CACF,OAAO,KAAK,UAAUA,CAAK,EAAE,OAAS,CACxC,MAAY,CACV,MAAO,EACT,CACF,CAEA,SAASolL,GAAmBplL,EAAO,CACjC,GAAI,EAAEA,aAAiB,aAAeA,EAAM,QAAU,EAAG,MAAO,GAChE,GAAI,OAAO,OAAW,IAAa,OAAO,OAAO,KAAKA,CAAK,EAAE,SAAS,QAAQ,EAC9E,IAAIqlL,EAAS,GACb,MAAMC,EAAY,MAClB,QAAS58K,EAAS,EAAGA,EAAS1I,EAAM,OAAQ0I,GAAU48K,EAAW,CAC/D,MAAMC,EAAQvlL,EAAM,SAAS0I,EAAQA,EAAS48K,CAAS,EACvDD,GAAU,OAAO,aAAa,GAAGE,CAAK,CACxC,CACA,OAAO,KAAKF,CAAM,CACpB,CAEA,SAASr0G,GAAmBhxE,EAAO,CACjC,GAAI,OAAOA,GAAU,UAAYA,EAAM,QAAU,EAAG,OAAO,KAC3D,GAAI,OAAO,OAAW,IAAa,OAAO,WAAW,KAAK,OAAO,KAAKA,EAAO,QAAQ,CAAC,EACtF,MAAMqlL,EAAS,KAAKrlL,CAAK,EACnBunB,EAAQ,IAAI,WAAW89J,EAAO,MAAM,EAC1C,QAAS,EAAI,EAAG,EAAIA,EAAO,OAAQ,GAAK,EAAG99J,EAAM,CAAC,EAAI89J,EAAO,WAAW,CAAC,EACzE,OAAO99J,CACT,CAEA,SAASi+J,GAA6BxvH,EAAU,GAAI,CAClD,GAAIA,GAAS,WAAa,kBAAoB,OAAOA,EAAQ,MAAS,SAAU,OAAO,KACvF,MAAMzuC,EAAQypD,GAAmBhb,EAAQ,IAAI,EAC7C,GAAI,CAACzuC,GAASA,EAAM,YAAc,GAAKA,EAAM,WAAa,aAAa,oBAAsB,EAAG,OAAO,KACvG,MAAMsB,EAAO,IAAI,WAAWtB,EAAM,UAAU,EAC5CsB,EAAK,IAAItB,CAAK,EACd,MAAM1V,EAAS,IAAI,aAAagX,EAAK,MAAM,EAC3C,OAAImtC,EAAQ,QAAU,MAAQnkD,EAAO,SAAW,OAAOmkD,EAAQ,MAAM,EAAU,KACxEnkD,CACT,CAEA,SAAS4zK,GAA6B5zK,EAAQ,CAC5C,GAAI,EAAEA,aAAkB,eAAiBA,EAAO,QAAU,EAAG,OAAO,KACpE,MAAM0V,EAAQ,IAAI,WAAW1V,EAAO,OAAQA,EAAO,WAAYA,EAAO,UAAU,EAChF,MAAO,CACL,SAAU,iBACV,OAAQA,EAAO,OACf,WAAYA,EAAO,WACnB,KAAMuzK,GAAmB79J,CAAK,CAClC,CACA,CAEA,MAAMm+J,GAA+B,iCAC/BC,GAAyC,IAAM,KAErD,SAASC,GAAiCv5K,EAAS,GAAI,CACrD,MAAMxH,EAAQ,IAAI,MAAM,qFAAqF,EAC7G,OAAAA,EAAM,KAAO6gL,GACb7gL,EAAM,OAASwH,EACRxH,CACT,CAEA,SAASghL,GAA6BhhL,EAAO,CAC3C,OAAOA,GAAO,OAAS6gL,EACzB,CAEA,eAAeI,GAAsBv+J,EAAO3mB,EAAU,GAAI,CACxD,GAAI,EAAE2mB,aAAiB,aAAeA,EAAM,YAAc,EAAG,OAAO,KACpE,MAAM8O,EAAM,IAAI,WAAW9O,EAAM,UAAU,EAC3C8O,EAAI,IAAI9O,CAAK,EACb,MAAMw+J,EAAsB,OAAO,SAAS,OAAOnlL,EAAQ,mBAAmB,CAAC,EAC3E,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOA,EAAQ,mBAAmB,CAAC,CAAC,EAC3D+kL,GACJ,GAAItvJ,EAAI,WAAa0vJ,EACnB,MAAO,CAAE,KAAM1vJ,EAAK,YAAa,OAAQ,mBAAoB,iBAAiB,EAEhF,GAAI,OAAO,mBAAsB,YAAc,OAAO,UAAa,YAAc,OAAO,MAAS,WAC/F,MAAO,CAAE,KAAMA,EAAK,YAAa,OAAQ,mBAAoB,aAAa,EAE5E,GAAI,CACF,MAAM2vJ,EAAa,IAAI,WAAW,MAAM,IAAI,SAC1C,IAAI,KAAK,CAAC3vJ,CAAG,CAAC,EAAE,OAAM,EAAG,YAAY,IAAI,kBAAkB,MAAM,CAAC,CACxE,EAAM,YAAW,CAAE,EACf,GAAI2vJ,EAAW,WAAa,GAAKA,EAAW,WAAa3vJ,EAAI,WAC3D,MAAO,CAAE,KAAM2vJ,EAAY,YAAa,MAAM,CAElD,OAASnhL,EAAO,CACd,QAAQ,KAAK,+EAAgFA,CAAK,CACpG,CACA,MAAO,CAAE,KAAMwxB,EAAK,YAAa,MAAM,CACzC,CAEA,eAAe4vJ,GAAwBpkK,EAAMqkK,EAAc,OAAQ,CACjE,GAAI,EAAErkK,aAAgB,aAAe,EAAEA,aAAgB,cAAgB,CAAC,YAAY,OAAOA,CAAI,EAAG,OAAO,KACzG,MAAM0F,EAAQ1F,aAAgB,WAC1BA,EACCA,aAAgB,YAAc,IAAI,WAAWA,CAAI,EAAI,IAAI,WAAWA,EAAK,OAAQA,EAAK,WAAYA,EAAK,UAAU,EACtH,GAAIqkK,IAAgB,QAAUA,GAAe,MAAQA,IAAgB,GAAI,CACvE,MAAM7vJ,EAAM,IAAI,WAAW9O,EAAM,UAAU,EAC3C,OAAA8O,EAAI,IAAI9O,CAAK,EACN8O,CACT,CACA,GAAI6vJ,IAAgB,OAAQ,MAAM,IAAI,MAAM,oDAAoDA,CAAW,EAAE,EAC7G,GAAI,OAAO,qBAAwB,YAAc,OAAO,UAAa,YAAc,OAAO,MAAS,WACjG,MAAM,IAAI,MAAM,6FAA6F,EAE/G,OAAO,IAAI,WAAW,MAAM,IAAI,SAC9B,IAAI,KAAK,CAAC3+J,CAAK,CAAC,EAAE,OAAM,EAAG,YAAY,IAAI,oBAAoB,MAAM,CAAC,CAC1E,EAAI,YAAW,CAAE,CACjB,CAEA,SAAS4+J,GAAyBnmL,EAAO,CACvC,OAAI,OAAOA,GAAU,SAAiB,KACtBA,EAAM,KAAI,GACR,IACpB,CAEA,SAASomL,GAAkBlH,EAAU,CACnC,OAAOA,GAAU,SAAS,SAAS,IAAMA,GAAU,IAAM,IAC3D,CAEA,SAASmH,GAAkBnH,EAAU,CACnC,MAAMl/K,EAAQk/K,GAAU,SAAS,SAAS,WAAaA,GAAU,WAAa,KAC9E,OAAO,OAAO,SAASl/K,CAAK,EAAI,OAAOA,CAAK,EAAI,IAClD,CAEA,SAASsmL,GAA2BpH,EAAUt+K,EAAU,GAAI,CAC1D,MAAMotB,EAAQqwJ,GAA2Ba,EAAUnC,GAAkB,OAAO,EACtE11B,EAAUr5H,GAAO,SAAS,SAAW,CAAA,EACrCu4J,EAAgBv4J,GAAO,SAAS,eAAiB,CAAA,EACjD5b,EAAKi1I,EAAQ,IAAMr5H,EAAM,IAAM,KAC/BojI,EAAW+0B,GAAyB9+B,EAAQ,QAAQ,EACpDm/B,EAAYC,GAAuBz4J,CAAK,EAC9C,MAAO,CACL,GAAA5b,EACA,YAAai1I,EAAQ,aAAe,KACpC,SAAA+J,EACA,MAAOA,GAAYm1B,EAAc,MAAQA,EAAc,UAAYn0K,GAAM,UACzE,UAAW,OAAO,SAASi1I,EAAQ,SAAS,EAAI,OAAOA,EAAQ,SAAS,EAAI,KAC5E,UAAW,OAAO,SAASA,EAAQ,SAAS,EAAI,OAAOA,EAAQ,SAAS,EAAI,KAC5E,WAAYA,EAAQ,aAAe,GACnC,OAAQA,EAAQ,QAAU,SAC1B,MAAOm/B,EAAU,MACjB,cAAeA,EAAU,cACzB,aAAcA,EAAU,aACxB,cAAeA,EAAU,cACzB,QAAS5lL,EAAQ,kBAAoB,MAAQwR,GAAM,MAAQ,OAAOxR,EAAQ,gBAAgB,IAAM,OAAOwR,CAAE,EACzG,cAAe49J,GAAkBuW,CAAa,EAC9C,UAAWv4J,GAAO,SAAS,UAAYgiJ,GAAkBhiJ,EAAM,QAAQ,SAAS,EAAI,IACxF,CACA,CAEA,SAAS04J,GAAsB7kK,EAAM,CACnC,OAAIA,GAAQ,KAAa,EACrBA,aAAgB,aAChB,YAAY,OAAOA,CAAI,EAAUA,EAAK,WACtC,MAAM,QAAQA,CAAI,GAAKA,EAAK,MAAO7hB,GAAU,OAAO,UAAUA,CAAK,GAAKA,GAAS,GAAKA,GAAS,GAAG,EAC7F6hB,EAAK,OAEPsjK,GAAyBtjK,CAAI,CACtC,CAEA,SAAS8kK,MAA0B90K,EAAQ,CACzC,UAAW7R,KAAS6R,EAAQ,CAC1B,MAAMwlG,EAAS,OAAOr3G,CAAK,EAC3B,GAAI,OAAO,SAASq3G,CAAM,GAAKA,EAAS,EAAG,OAAOA,CACpD,CACA,MAAO,EACT,CAEA,SAASovE,GAAuBvH,EAAW,GAAI,CAC7C,MAAMlxJ,EAAQgiJ,GAAkBkP,CAAQ,EACxClxJ,EAAM,QAAUA,EAAM,SAAW,OAAOA,EAAM,SAAY,SAAWA,EAAM,QAAU,CAAA,EACrF,MAAMw9H,EAAcx9H,EAAM,QAAQ,aAAe,OAAOA,EAAM,QAAQ,aAAgB,SAClFA,EAAM,QAAQ,YACd,KACE44J,EAAe54J,EAAM,QAAQ,cAAgB,OAAOA,EAAM,QAAQ,cAAiB,SACrFA,EAAM,QAAQ,aACd,KACE64J,EAAer7B,EACjBm7B,GAAuBn7B,EAAY,WAAYk7B,GAAsBl7B,EAAY,IAAI,CAAC,EACtF,EACEjlI,EAAgBqgK,EAClBD,GAAuBC,EAAa,iBAAkBF,GAAsBE,EAAa,IAAI,EAAGA,EAAa,UAAU,EACvH,EACAp7B,IAAaA,EAAY,KAAO,MAChCo7B,IAAcA,EAAa,KAAO,MACtC,MAAME,EAAgB3B,GAAyBn3J,CAAK,EACpD,MAAO,CACL,cAAA84J,EACA,aAAAD,EACA,cAAAtgK,EACA,MAAOugK,EAAgBD,EAAetgK,CAC1C,CACA,CAEA,SAAS8zF,GAAal3G,EAAK,CACzB,OAAO,OAAOA,GAAO,EAAE,EAAE,KAAI,EAAG,QAAQ,aAAc,EAAE,CAC1D,CAEA,SAAS4jL,GAA2BnmL,EAAU,GAAI,CAChD,MAAMy1B,EAAMz1B,EAAQ,KAAOA,EAAQ,YAAcA,EAAQ,aAAeA,EAAQ,WAChF,OAAIy1B,IAAQ,IAAQA,IAAQ,OAASA,IAAQ,UACpC,CACL,QAAS,GACT,MAAOz1B,EAAQ,iBAAmBA,EAAQ,cAAgB,YAC1D,QAAS,EACf,EAEM,CAACy1B,GAAO,OAAOA,GAAQ,UAAYA,EAAI,UAAY,GAAc,CAAE,QAAS,EAAK,EAC9E,CACL,QAAS,GACT,MAAOA,EAAI,OAASA,EAAI,MAAQz1B,EAAQ,iBAAmB,YAC3D,QAASy1B,EAAI,UAAY,EAC7B,CACA,CAEA,SAAS2wJ,GAAqB50K,EAAI60K,EAAS,CACzC,GAAI,GAAC70K,GAAM60K,GAAS,UAAY,IAChC,GAAI,CACF,MAAM9tH,EAAW,WAAW,SACtB0yE,EAAU,WAAW,QAC3B,GAAI,CAAC1yE,GAAY,CAAC0yE,GAAS,aAAc,OACzC,MAAMuiB,EAAM,IAAI,IAAIj1F,EAAS,IAAI,EAC3B+tH,EAAQ,OAAOD,EAAQ,OAAS,WAAW,EACjD,GAAI74B,EAAI,aAAa,IAAI84B,CAAK,IAAM90K,EAAI,OACxCg8I,EAAI,aAAa,IAAI84B,EAAO90K,CAAE,EAC9B,MAAMtR,EAAOmmL,EAAQ,UAAY,GAAQ,YAAc,eACvDp7C,EAAQ/qI,CAAI,GAAG,KAAK+qI,EAASA,EAAQ,MAAO,GAAIuiB,CAAG,CACrD,OAASvpJ,EAAO,CACd,QAAQ,KAAK,0DAA2DA,CAAK,CAC/E,CACF,CAGA,MAAMsiL,GAAkC,IAClCC,GAAsC,IACtCC,GAAuC,IACvCC,GAAsC,IAAM,KAC5CC,GAAqD,IACrDC,GAAuC,IACvCC,GAA2C,KAC3CC,GAAwC,IACxCC,GAAsC,EAAI,KAAO,KACjDC,GAAoC,OAAO,iBAC3CC,GAAqC,GACrCC,GAAsB,uCACtBC,GAA4B,GAC5B15K,GAAwB,IAAI,QAElC,SAASlC,GAASC,EAAOjJ,EAAKQ,EAAS0I,EAAS,OAAW,CACzD,GAAI,OAAO,QAAY,KAAe,OAAO,QAAQ,MAAS,WAAY,OAC1E,MAAMvK,EAASsK,IAAU,OAAOA,GAAU,UAAY,OAAOA,GAAU,YAAcA,EAAQD,GAC7F,IAAIoC,EAAOF,GAAsB,IAAIvM,CAAM,EACtCyM,IACHA,EAAO,IAAI,IACXF,GAAsB,IAAIvM,EAAQyM,CAAI,GAExC,MAAMk2E,EAAgB,OAAOthF,GAAOQ,CAAO,EACvC4K,EAAK,IAAIk2E,CAAa,IAC1Bl2E,EAAK,IAAIk2E,CAAa,EAClBp4E,IAAW,OAAW,QAAQ,KAAK1I,CAAO,EACzC,QAAQ,KAAKA,EAAS0I,CAAM,EACnC,CAEA,SAAS27K,GAAsBx2K,EAASu2K,GAA2B,CACjE,MAAM1+K,EAAO,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,KAAK,MAAM,OAAOmI,CAAM,GAAKu2K,EAAyB,CAAC,CAAC,EACxFxgK,EAAQ,IAAI,WAAWle,CAAI,EAC3B4+K,EAAS,WAAW,OAC1B,GAAIA,GAAU,OAAOA,EAAO,iBAAoB,WAC9CA,EAAO,gBAAgB1gK,CAAK,MAE5B,SAASre,EAAI,EAAGA,EAAIG,EAAMH,GAAK,EAAGqe,EAAMre,CAAC,EAAI,KAAK,MAAM,KAAK,OAAM,EAAK,GAAG,EAE7E,IAAIkJ,EAAK,GACT,QAASlJ,EAAI,EAAGA,EAAIqe,EAAM,OAAQre,GAAK,EACrCkJ,GAAM01K,GAAoBvgK,EAAMre,CAAC,EAAI4+K,GAAoB,MAAM,EAEjE,OAAO11K,CACT,CAEA,SAAS81K,GAAyB3kL,EAAQ,CACxC,MAAMvD,EAAQ,OAAOuD,GAAU,EAAE,EAAE,KAAI,EACvC,OAAOvD,IAAU,WAAaA,IAAU,OAASA,IAAU,SAC7D,CAEA,SAASmoL,GAAyC5kL,EAAQ,CACxD,MAAMvD,EAAQ,OAAOuD,GAAU,EAAE,EAAE,KAAI,EACvC,OAAOvD,IAAU,IAAMA,IAAU,WAAaA,IAAU,WAAaA,IAAU,QACjF,CAEA,SAASooL,GAAwBjlL,EAAK,CACpC,MAAMnD,EAAQ,OAAOmD,GAAO,EAAE,EAAE,KAAI,EACpC,OAAOnD,IAAU,wBACZA,EAAM,WAAW,uBAAuB,GACxCA,IAAU,cACVA,EAAM,WAAW,aAAa,CACrC,CAEA,SAASqoL,GAA0ChkC,EAAY,CAAA,EAAIikC,EAAU,CAAA,EAAIC,EAAa,KAAMC,EAAc,KAAM,CACtH,MAAMrkE,EAAahhH,GAAS,OAAOolL,GAAe,YAAcA,EAAWplL,CAAG,GAAKk3G,GAAal3G,CAAG,EAC7FX,EAAOwtK,GAAkB3rB,GAAa,EAAE,EACxCokC,EAAiB,OAAO,KAAKjmL,CAAI,EAAE,OAAQW,GAAQilL,GAAwBjkE,EAAUhhH,CAAG,CAAC,CAAC,EAC1FulL,EAAsC,IAAM,CAChD,GAAI,EAAAD,EAAe,OAAS,GAAK,OAAOD,GAAgB,YACxD,UAAWrlL,KAAOslL,EAAgB,CAChC,GAAI,CAAC,OAAO,UAAU,eAAe,KAAKjmL,EAAMW,CAAG,EAAG,SACtD,MAAM6qB,EAAQw6J,EAAYrkE,EAAUhhH,CAAG,CAAC,EACnC6qB,GAAO,QACRA,EAAM,OAAOxrB,EAAKW,CAAG,EAAG6qB,EAAM,OAAO,GAAG,OAAOxrB,EAAKW,CAAG,CAC7D,CACF,EACA,GAAI,CAACmlL,GAAW,CAAC,MAAM,QAAQA,CAAO,GAAKA,EAAQ,SAAW,EAC5D,OAAAI,EAAmC,EAC5BlmL,EAET,MAAMmmL,EAAiB,IAAI,IAC3B,UAAWtmL,KAASimL,EAAS,CAC3B,MAAMnlL,EAAMghH,EAAU9hH,GAAO,KAAOA,GAAO,MAAQA,GAAO,cAAgB,EAAE,EACxE,CAACc,GAAO,CAACilL,GAAwBjlL,CAAG,GACxCwlL,EAAe,IAAIxlL,EAAKd,CAAK,CAC/B,CACA,UAAWc,KAAO,OAAO,KAAKX,CAAI,EAAG,CACnC,MAAMV,EAASqiH,EAAUhhH,CAAG,EAC5B,GAAI,CAACilL,GAAwBtmL,CAAM,EAAG,SACtC,MAAMO,EAAQsmL,EAAe,IAAI7mL,CAAM,EAClCO,GACDA,EAAM,gBAAkB,IACvB8lL,GAAyC9lL,EAAM,MAAM,GAC1D,OAAOG,EAAKW,CAAG,CACjB,CACA,OAAAulL,EAAmC,EAC5BlmL,CACT,CAEA,SAASomL,GAAgBn/K,EAAO,GAAIukD,EAAQ,CAAA,EAAI,CAC9C,MAAMvpC,EAAS,CAAE,GAAIhb,GAAQ,OAAOA,GAAS,SAAWA,EAAO,CAAA,CAAG,EAClE,SAAW,CAACtG,EAAKnD,CAAK,IAAK,OAAO,QAAQguD,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,CAAE,EACnFhuD,GAAS,OAAOA,GAAU,UAAY,CAAC,MAAM,QAAQA,CAAK,EAC5DykB,EAAOthB,CAAG,EAAIylL,GAAgBnkK,EAAOthB,CAAG,EAAGnD,CAAK,EAEhDykB,EAAOthB,CAAG,EAAInD,EAGlB,OAAOykB,CACT,CAEA,SAASokK,GAAiC7oL,EAAQ,GAAI,CACpD,GAAIA,IAAU,GAAO,MAAO,CAAE,QAAS,EAAK,EAC5C,MAAMuD,EAASvD,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EACtD8oL,EAA2BvlL,EAAO,uBACnCA,EAAO,uBACPA,EAAO,UAAU,cAChBwlL,EAAkBxlL,EAAO,kBAAoB,IAC9CA,EAAO,WAAa,IACpBulL,IAA6B,GAClC,MAAO,CACL,QAASvlL,EAAO,UAAY,GAC5B,SAAU,OAAO,SAAS,OAAOA,EAAO,QAAQ,CAAC,EAC7C,KAAK,IAAI,GAAI,KAAK,MAAM,OAAOA,EAAO,QAAQ,CAAC,CAAC,EAChD6jL,GACJ,UAAW,OAAO,SAAS,OAAO7jL,EAAO,SAAS,CAAC,EAC/C,KAAK,IAAI,GAAI,KAAK,MAAM,OAAOA,EAAO,SAAS,CAAC,CAAC,EACjD8jL,GACJ,SAAU,OAAO,SAAS,OAAO9jL,EAAO,QAAQ,CAAC,EAC7C,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOA,EAAO,QAAQ,CAAC,CAAC,EAC/C+jL,GACJ,gBAAAyB,EACA,sBAAuBD,IAA6B,GAChDvB,GACAyB,GAAuBF,EAA0BvB,EAAkD,EACvG,cAAehkL,EAAO,gBAAkB,GACxC,eAAgBA,EAAO,iBAAmB,GAC1C,iBAAkBA,EAAO,mBAAqB,EAClD,CACA,CAEA,eAAe0lL,GAAc96B,EAAM,CACjC,GAAI,CAACA,EAAM,OAAO,KAClB,GAAI,OAAO,WAAe,IACxB,OAAO,MAAM,IAAI,QAAQ,CAAC1/F,EAAS8mG,IAAW,CAC5C,MAAM2zB,EAAS,IAAI,WACnBA,EAAO,OAAS,IAAMz6H,EAAQ,OAAOy6H,EAAO,QAAW,SAAWA,EAAO,OAAS,IAAI,EACtFA,EAAO,QAAU,IAAM3zB,EAAO2zB,EAAO,OAAS,IAAI,MAAM,+BAA+B,CAAC,EACxFA,EAAO,cAAc/6B,CAAI,CAC3B,CAAC,EAEH,GAAI,OAAOA,EAAK,aAAgB,WAAY,CAC1C,MAAMxgI,EAAS,MAAMwgI,EAAK,YAAW,EAC/B5mI,EAAQ,IAAI,WAAWoG,CAAM,EACnC,IAAI03J,EAAS,GACb,QAASn8K,EAAI,EAAGA,EAAIqe,EAAM,OAAQre,GAAK,EAAGm8K,GAAU,OAAO,aAAa99J,EAAMre,CAAC,CAAC,EAChF,MAAM8sD,EAAU,OAAO,MAAS,WAC5B,KAAKqvH,CAAM,EACX,OAAO,KAAK99J,CAAK,EAAE,SAAS,QAAQ,EACxC,MAAO,QAAQ4mI,EAAK,MAAQ,WAAW,WAAWn4F,CAAO,EAC3D,CACA,OAAO,IACT,CAEA,SAASgzH,GAAuBhpL,EAAOC,EAAW,EAAG,CACnD,GAAID,IAAU,GAAO,MAAO,GAC5B,MAAMq3G,EAAS,OAAOr3G,CAAK,EAC3B,OAAO,OAAO,SAASq3G,CAAM,EAAI,KAAK,IAAI,EAAGA,CAAM,EAAIp3G,CACzD,CAEA,SAASkpL,IAAkB,CACzB,MAAMC,EAAiB,WAAW,aAAa,MAAG,EAClD,OAAO,OAAO,SAASA,CAAc,EAAIA,EAAiB,KAAK,IAAG,CACpE,CAEA,SAASC,GAAcrpL,EAAO,CAC5B,OAAK,OAAO,SAASA,CAAK,EACnB,KAAK,MAAMA,EAAQ,EAAE,EAAI,GADI,CAEtC,CAEA,SAASspL,GAA2BtpL,EAAOC,EAAW,EAAG,CACvD,GAAID,IAAU,IAASA,GAAS,KAAM,OAAOC,EAC7C,MAAMo3G,EAAS,OAAOr3G,CAAK,EAC3B,OAAK,OAAO,SAASq3G,CAAM,EACpB,KAAK,IAAI,EAAG,KAAK,MAAMA,CAAM,CAAC,EADAp3G,CAEvC,CAEA,SAASspL,GAA+BvpL,EAAQ,GAAI,CAClD,GAAIA,IAAU,GAAO,MAAO,CAAE,QAAS,EAAK,EAC5C,MAAMuD,EAASvD,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EACtDwpL,EAAmBF,GACvB/lL,EAAO,kBACFA,EAAO,kBACPA,EAAO,WAAW,UAClBA,EAAO,WAAW,iBACvBokL,EACJ,EACQ8B,EAAmBD,EAAmB,EACxC,KAAK,IAAI,EAAG,KAAK,MAAMA,GAAoB,EAAI,aAAa,kBAAkB,CAAC,EAC/E,EACJ,MAAO,CACL,QAASjmL,EAAO,UAAY,GAC5B,iBAAAimL,EACA,gBAAiBF,GACf/lL,EAAO,iBACFA,EAAO,iBACPA,EAAO,SAAS,SACrBkmL,CACN,CACA,CACA,CAEA,SAASC,GAAwBr9K,EAAS,GAAI,CAC5C,MAAM9I,EAAS,OAAO8I,EAAO,QAAU,EAAE,EAAE,YAAW,EAChDmjI,EAAS,OAAOnjI,EAAO,QAAUA,EAAO,QAAQ,QAAU,EAAE,EAAE,YAAW,EACzE89C,EAAS,OAAO99C,EAAO,QAAUA,EAAO,QAAQ,QAAU,EAAE,EAAE,YAAW,EACzErI,EAAS,OAAOqI,EAAO,QAAU,EAAE,EAAE,YAAW,EACtD,OAAOmjI,IAAW,eACbjsI,IAAW,eACXS,EAAO,SAAS,aAAa,GAC7B,CAAC,MAAO,OAAQ,QAAS,SAAU,QAAS,UAAW,QAAS,SAAS,EAAE,KAAMmpF,GAAUhjC,EAAO,SAASgjC,CAAK,CAAC,CACxH,CAEA,SAASw8F,GAA0Bh9K,EAAUnK,EAAM,CACjD,OAAImK,IAAa,IAAQnK,IAAS,GAAa,GAC3CmK,IAAa,QAAUnK,IAAS,OAAe,OAC5CA,IAAS,IAASmK,IAAa,GAAQ,GAAQ,MACxD,CAEA,SAASi9K,GAA4Bj9K,EAAW,GAAInK,EAAO,CAAA,EAAI,CAC7D,MAAMs2F,EAAUnsF,GAAY,OAAOA,GAAa,SAAWA,EAAW,CAAA,EAChE/L,EAAU4B,GAAQ,OAAOA,GAAS,SAAWA,EAAO,CAAA,EACpDqnL,EAA2B,OAAOjpL,EAAQ,oBAAoB,EAC9DkpL,EAA8B,OAAOhxF,EAAQ,oBAAoB,EACvE,MAAO,CACL,GAAGA,EACH,GAAGl4F,EACH,eAAgBk4F,EAAQ,iBAAmB,IAAQl4F,EAAQ,iBAAmB,GAC9E,iBAAkBk4F,EAAQ,mBAAqB,IAAQl4F,EAAQ,mBAAqB,GACpF,iBAAkB+oL,GAA0B7wF,EAAQ,iBAAkBl4F,EAAQ,gBAAgB,EAC9F,sBAAuBk4F,EAAQ,wBAA0B,IAAQl4F,EAAQ,wBAA0B,GACnG,qBAAsBA,EAAQ,mBAAqB,IAAQ,OAAO,SAASipL,CAAwB,EAC/FA,EACC,OAAO,SAASC,CAA2B,EAAIA,EAA8B,MACtF,CACA,CAQO,MAAMC,EAAa,CACxB,YAAYnpL,EAAU,GAAI,CACxB,KAAK,MAAQA,EAAQ,OAAS,KAC9B,KAAK,QAAUA,EAAQ,SAAW,KAClC,KAAK,OAASA,EAAQ,QAAU,8BAChC,KAAK,SAAWA,EAAQ,UAAY,GAAG,KAAK,MAAM,QAClD,KAAK,qBAAuBA,EAAQ,sBAAwB,GAAG,KAAK,MAAM,oBAC5E,CAEA,IAAIwR,EAAI,CACN,MAAO,GAAG,KAAK,MAAM,GAAG,mBAAmB,OAAOA,CAAE,CAAC,CAAC,EACxD,CAEA,oBAAoBA,EAAI,CACtB,MAAO,GAAG,OAAOA,CAAE,CAAC,gBACtB,CAEA,qBAAqBA,EAAI,CACvB,MAAO,GAAG,OAAOA,CAAE,CAAC,iBACtB,CAEA,wBAAwBqtK,EAAc,KAAM,CAC1C,OAAIA,GAAe,MAAQA,IAAgB,GAAW,KAAK,qBACpD,GAAG,KAAK,oBAAoB,IAAI,mBAAmB,OAAOA,CAAW,CAAC,CAAC,EAChF,CAEA,YAAa,CACX,GAAI,CAAC,KAAK,SAAS,QAAS,MAAO,CAAA,EACnC,GAAI,CACF,MAAMuK,EAAS,KAAK,MAAM,KAAK,QAAQ,QAAQ,KAAK,QAAQ,GAAK,IAAI,EACrE,OAAO,MAAM,QAAQA,CAAM,EAAIA,EAAO,IAAK53K,GAAO,OAAOA,CAAE,CAAC,EAAE,OAAO,OAAO,EAAI,CAAA,CAClF,OAASvN,EAAO,CACd,eAAQ,KAAK,6EAA8EA,CAAK,EACzF,CAAA,CACT,CACF,CAEA,YAAYmN,EAAM,GAAI,CACpB,GAAI,CAAC,KAAK,SAAS,QAAS,OAC5B,MAAMo3G,EAAS,MAAM,KAAK,IAAI,IAAIp3G,EAAI,IAAKI,GAAO,OAAOA,CAAE,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC,EAC9E,KAAK,QAAQ,QAAQ,KAAK,SAAU,KAAK,UAAUg3G,CAAM,CAAC,CAC5D,CAEA,YAAYh3G,EAAI,CACd,GAAI,CAACA,EAAI,OACT,MAAMJ,EAAM,KAAK,WAAU,EACtBA,EAAI,SAAS,OAAOI,CAAE,CAAC,GAAG,KAAK,YAAY,CAAC,GAAGJ,EAAK,OAAOI,CAAE,CAAC,CAAC,CACtE,CAEA,iBAAiBA,EAAI,CACnB,GAAI,CAACA,EAAI,OACT,MAAMtQ,EAAS,OAAOsQ,CAAE,EACxB,KAAK,YAAY,KAAK,WAAU,EAAG,OAAQ4b,GAAUA,IAAUlsB,CAAM,CAAC,CACxE,CAEA,yBAAyBokJ,EAAQ,CAC/B,MAAM9zI,EAAK8zI,GAAQ,IAAMkgC,GAAkBlgC,CAAM,EACjD,GAAI,CAAC9zI,EAAI,MAAO,CAAE,OAAA8zI,EAAQ,cAAe,KAAM,eAAgB,IAAI,EACnE,IAAI+jC,EAAa/jC,EACbgkC,EAAgB,KAChBC,EAAiB,KACrB,MAAMtoK,EAAOqkI,GAAQ,SAAS,aAAa,KAC3C,GAAIrkI,GAAQ,KAAM,CAChB,MAAMuoK,EAAkB,KAAK,oBAAoBh4K,CAAE,EAC7Co5I,EAActF,EAAO,QAAQ,aAAe,CAAA,EAClDgkC,EAAgB,CACd,GAAIE,EACJ,KAAM,uBACN,UAAW,OAAOh4K,CAAE,EACpB,OAAQo5I,EAAY,QAAU,KAC9B,KAAA3pI,EACA,WAAYsjK,GAAyBtjK,CAAI,EACzC,UAAW,KAAK,IAAG,CAC3B,EACMooK,EAAa,CACX,GAAGA,EACH,QAAS,CACP,GAAIA,EAAW,SAAW,GAC1B,YAAa,CACX,GAAGz+B,EACH,KAAM,KACN,QAAS4+B,EACT,WAAYF,EAAc,UACtC,CACA,CACA,CACI,CACA,MAAMtD,EAAeqD,GAAY,SAAS,cAAgB,KAC1D,GAAIrD,GAAc,MAAQ,KAAM,CAC9B,MAAMyD,EAAmB,KAAK,qBAAqBj4K,CAAE,EACrD+3K,EAAiB,CACf,GAAIE,EACJ,KAAM,wBACN,UAAW,OAAOj4K,CAAE,EACpB,OAAQw0K,EAAa,QAAU,mCAC/B,QAASA,EAAa,SAAW,EACjC,KAAMA,EAAa,KACnB,WAAYzB,GAAyByB,EAAa,IAAI,EACtD,UAAW,KAAK,IAAG,CAC3B,EACMqD,EAAa,CACX,GAAGA,EACH,QAAS,CACP,GAAIA,EAAW,SAAW,GAC1B,aAAc,CACZ,GAAGrD,EACH,KAAM,KACN,QAASyD,EACT,iBAAkBF,EAAe,UAC7C,CACA,CACA,CACI,CACA,MAAO,CACL,OAAQF,EACR,cAAAC,EACA,eAAAC,CACN,CACE,CAEA,MAAM,QAAQjkC,EAAQtlJ,EAAU,GAAI,CAClC,OAAI,KAAK,OAAO,IAAY,KAAK,MAAM,IAAIslJ,CAAM,GAC7C,KAAK,SAAS,UAChB,KAAK,QAAQ,QAAQ,KAAK,IAAIA,EAAO,EAAE,EAAG,KAAK,UAAUA,CAAM,CAAC,EAC5DtlJ,EAAQ,QAAU,IAAO,KAAK,YAAYslJ,EAAO,EAAE,GAChDA,EAGX,CAEA,MAAM,IAAIA,EAAQ,CAChB,MAAMokC,EAAQ,KAAK,yBAAyBpkC,CAAM,EAClD,OAAIokC,EAAM,eAAe,MAAM,KAAK,QAAQA,EAAM,cAAe,CAAE,MAAO,GAAO,EAC7EA,EAAM,gBAAgB,MAAM,KAAK,QAAQA,EAAM,eAAgB,CAAE,MAAO,GAAO,EAC5E,KAAK,QAAQA,EAAM,OAAQ,CAAE,MAAO,GAAM,CACnD,CAEA,MAAM,QAAQl4K,EAAI,CAChB,GAAI,CAACA,EAAI,OAAO,KAChB,GAAI,KAAK,OAAO,IAAK,OAAO,KAAK,MAAM,IAAIA,CAAE,EAC7C,GAAI,KAAK,SAAS,QAAS,CACzB,MAAMikB,EAAM,KAAK,QAAQ,QAAQ,KAAK,IAAIjkB,CAAE,CAAC,EAC7C,OAAOikB,EAAM,KAAK,MAAMA,CAAG,EAAI,IACjC,CACA,OAAO,IACT,CAEA,MAAM,IAAIjkB,EAAIxR,EAAU,GAAI,CAC1B,MAAMslJ,EAAS,MAAM,KAAK,QAAQ9zI,CAAE,EACpC,GAAI,CAAC8zI,GAAUtlJ,EAAQ,qBAAuB,GAAO,OAAOslJ,EAC5D,IAAIqkC,EAAWrkC,EACf,MAAMsF,EAAc++B,GAAU,SAAS,aAAe,KAChDC,EAAUh/B,GAAa,SAAW,KACxC,GAAIg/B,GAAWh/B,EAAY,MAAQ,KAAM,CACvC,MAAM0+B,EAAgB,MAAM,KAAK,QAAQM,CAAO,EAC5CN,GAAe,MAAQ,OACzBK,EAAW,CACT,GAAGA,EACH,QAAS,CACP,GAAIA,EAAS,SAAW,GACxB,YAAa,CACX,GAAG/+B,EACH,OAAQA,EAAY,QAAU0+B,EAAc,QAAU,KACtD,KAAMA,EAAc,KACpB,WAAY1+B,EAAY,YAAc0+B,EAAc,YAAc/E,GAAyB+E,EAAc,IAAI,CAC3H,CACA,CACA,EAEI,CACA,GAAItpL,EAAQ,sBAAwB,GAAO,OAAO2pL,EAClD,MAAM3D,EAAe2D,GAAU,SAAS,cAAgB,KAClDE,EAAkB7D,GAAc,SAAW,KACjD,GAAI6D,GAAmB7D,EAAa,MAAQ,KAAM,CAChD,MAAMuD,EAAiB,MAAM,KAAK,QAAQM,CAAe,EACrDN,GAAgB,MAAQ,OAC1BI,EAAW,CACT,GAAGA,EACH,QAAS,CACP,GAAIA,EAAS,SAAW,GACxB,aAAc,CACZ,GAAG3D,EACH,KAAMuD,EAAe,KACrB,iBAAkBvD,EAAa,kBAAoBuD,EAAe,YAAchF,GAAyBgF,EAAe,IAAI,CAC1I,CACA,CACA,EAEI,CACA,OAAOI,CACT,CAEA,MAAM,QAAS,CACb,GAAI,KAAK,OAAO,OAAQ,OAAO,KAAK,MAAM,OAAM,EAChD,MAAMG,EAAa,KAAK,WAAU,EAClC,GAAIA,EAAW,QAAU,KAAK,SAAS,QAAS,CAC9C,MAAMrK,EAAU,CAAA,EAChB,UAAWjuK,KAAMs4K,EAAY,CAC3B,MAAMr0J,EAAM,KAAK,QAAQ,QAAQ,KAAK,IAAIjkB,CAAE,CAAC,EACzCikB,GAAKgqJ,EAAQ,KAAK,KAAK,MAAMhqJ,CAAG,CAAC,CACvC,CACA,OAAOgqJ,CACT,CACA,GAAI,CAAC,KAAK,SAAS,SAAW,CAAC,OAAO,SAAS,KAAK,QAAQ,MAAM,EAAG,MAAO,CAAA,EAC5E,MAAMA,EAAU,CAAA,EAChB,QAAS,EAAI,EAAG,EAAI,KAAK,QAAQ,OAAQ,GAAK,EAAG,CAC/C,MAAMl9K,EAAM,KAAK,QAAQ,MAAM,CAAC,EAChC,GAAI,CAACA,GAAO,CAACA,EAAI,WAAW,KAAK,MAAM,EAAG,SAC1C,MAAMkzB,EAAM,KAAK,QAAQ,QAAQlzB,CAAG,EAChCkzB,GAAKgqJ,EAAQ,KAAK,KAAK,MAAMhqJ,CAAG,CAAC,CACvC,CACA,OAAOgqJ,CACT,CAEA,MAAM,OAAOjuK,EAAI,CACf,OAAI,KAAK,OAAO,QACd,MAAM,KAAK,MAAM,OAAO,KAAK,oBAAoBA,CAAE,CAAC,EACpD,MAAM,KAAK,MAAM,OAAO,KAAK,qBAAqBA,CAAE,CAAC,EAC9C,KAAK,MAAM,OAAOA,CAAE,IAE7B,KAAK,SAAS,aAAa,KAAK,IAAIA,CAAE,CAAC,EACvC,KAAK,SAAS,aAAa,KAAK,IAAI,KAAK,oBAAoBA,CAAE,CAAC,CAAC,EACjE,KAAK,SAAS,aAAa,KAAK,IAAI,KAAK,qBAAqBA,CAAE,CAAC,CAAC,EAClE,KAAK,iBAAiBA,CAAE,EACjB,GACT,CAEA,MAAM,uBAAuBqtK,EAAc,KAAM,CAC/C,OAAI,KAAK,OAAO,uBAA+B,KAAK,MAAM,uBAAuBA,CAAW,EACvF,KAAK,SAAS,QACZ,KAAK,QAAQ,QAAQ,KAAK,wBAAwBA,CAAW,CAAC,EADlC,IAErC,CAEA,MAAM,uBAAuBrtK,EAAIqtK,EAAc,KAAM,CACnD,GAAI,KAAK,OAAO,uBAAwB,OAAO,KAAK,MAAM,uBAAuBrtK,EAAIqtK,CAAW,EAChG,GAAI,CAAC,KAAK,QAAS,OAAOrtK,GAAM,KAChC,MAAMjP,EAAM,KAAK,wBAAwBs8K,CAAW,EACpD,OAAIrtK,GAAM,MAAQA,IAAO,GAAI,KAAK,QAAQ,aAAajP,CAAG,EACrD,KAAK,QAAQ,UAAUA,EAAK,OAAOiP,CAAE,CAAC,EACpCA,GAAM,IACf,CACF,CAQO,MAAMu4K,WAA6B,WAAY,CACpD,YAAY/pL,EAAU,GAAI,CACxB,MAAK,EACL,KAAK,OAASA,EAAQ,QAAU,KAChC,KAAK,KAAOA,EAAQ,MAAQ,SAC5B,KAAK,YAAcA,EAAQ,aAAe,UAC1C,KAAK,UAAYA,EAAQ,UAAY,OAAOA,EAAQ,SAAS,EAAI,KACjE,KAAK,mBAAqB,KAAK,UAC/B,KAAK,uBAAyB,GAC9B,KAAK,eAAiBA,EAAQ,iBAAmB,GACjD,KAAK,WAAa,CAAE,QAAS,EAAK,EAClC,KAAK,eAAiB,KACtB,KAAK,iBAAmB,KACxB,KAAK,oBAAsB,KAC3B,KAAK,mBAAqB,KAC1B,KAAK,YAAc,CACjB,QAAS,KAAK,eACd,OAAQ,OACR,MAAO,GACP,aAAc,GACd,eAAgB,GAChB,QAAS,KACT,QAAS,IACf,EACI,KAAK,aAAe,CAClB,WAAYA,EAAQ,aAAe,GACnC,SAAUA,EAAQ,WAAa,GAC/B,QAASA,EAAQ,UAAY,GAC7B,OAAQA,EAAQ,SAAW,EACjC,EACI,KAAK,sBAAwBA,EAAQ,wBAA0B,GAC/D,KAAK,OAASA,EAAQ,QAAUA,EAAQ,UAAY,IAAI8hL,GAAmB9hL,CAAO,EAClF,KAAK,QAAQ,2BAA2B,KAAK,qBAAqB,EAClE,KAAK,aAAeA,EAAQ,cAAgB,KAC5C,KAAK,UAAYA,EAAQ,WAAaonL,GACtC,KAAK,KAAO,OAAOpnL,EAAQ,KAAQ,WAAaA,EAAQ,IAAM,IAAM,KAAK,IAAG,EAC5E,KAAK,iBAAmBioL,GAAiCjoL,EAAQ,kBAAoBA,EAAQ,SAAS,SAAS,EAC/G,KAAK,sBAAwB2oL,GAC3B3oL,EAAQ,uBACHA,EAAQ,SAAS,uBACjBA,EAAQ,SAAS,cAC5B,EACI,KAAK,0BAA4BooL,GAC/BpoL,EAAQ,2BAA6BA,EAAQ,SAAS,0BACtD4mL,EACN,EACI,KAAK,sBAAwBwB,GAC3BpoL,EAAQ,uBAAyBA,EAAQ,SAAS,sBAClD6mL,EACN,EACI,KAAK,iBAAmB,GACxB,KAAK,uBAAyB,KAC9B,KAAK,uBAAyB,KAC9B,KAAK,MAAQ,QAAQ,QAAQ,IAAI,EACjC,KAAK,gBAAmBplL,GAAU,CAChC,MAAMgK,EAAShK,EAAM,QAAU,CAAA,EAC/B,KAAK,6BAA6BgK,CAAM,EACpC,GAAC,KAAK,aAAa,YAAc,CAAC,KAAK,aAAa,UAAY,CAAC,KAAK,aAAa,UACvF,KAAK,MAAM,SAAUA,CAAM,CAC7B,EACA,KAAK,OAAO,iBAAiB,SAAU,KAAK,eAAe,EAC3D,KAAK,sBAAwB,KAC7B,KAAK,wBAA0B,KAC/B,KAAK,0BAA4B,KACjC,KAAK,mCAAqC,KAC1C,KAAK,4BAA8B,IAAI,IACvC,KAAK,qBAAuB,IAAI,IAChC,KAAK,kBAAoB,QAAQ,QAAO,EACxC,KAAK,wBAA0B,EAC/B,KAAK,gCAAkC,GACvC,KAAK,qBAAuB,EAC5B,KAAK,2BAA6B,EAClC,KAAK,sBAAwB28K,GAC3BpoL,EAAQ,sBAAwBA,EAAQ,SAAS,cACjDumL,EACN,EACI,KAAK,qBAAuBvmL,EAAQ,sBAC/BA,EAAQ,SAAS,eACjBA,EAAQ,SAAS,WACjB,GACL,KAAK,gCAAkCooL,GACrCpoL,EAAQ,iCACHA,EAAQ,SAAS,0BACjBA,EAAQ,SAAS,qBACtBinL,EACN,EACI,KAAK,4BAA8B,KACnC,KAAK,+BAAiC,CAAA,EACtC,KAAK,mCAAqC,GAC1C,KAAK,gCAAkC,KACvC,KAAK,gCAAkC,KACvC,KAAK,uBAAyB,KAC9B,KAAK,uBAAyB,KAC9B,KAAK,sBAAwB,EAC7B,KAAK,0BAA4B,CAAA,EACjC,KAAK,6BAA4B,EACjC,KAAK,UAAU,CACb,mBAAoBjnL,EAAQ,mBAC5B,oBAAqBA,EAAQ,mBACnC,CAAK,EACD,KAAK,uCAAsC,CAC7C,CAEA,MAAM,wBAAyB,CAC7B,OAAO,KAAK,cAAc,yBAAyB,KAAK,WAAW,GAAK,IAC1E,CAEA,MAAM,uBAAuBwR,EAAI,CAC/B,OAAO,KAAK,cAAc,yBAAyBA,EAAI,KAAK,WAAW,GAAMA,GAAM,IACrF,CAEA,yBAAyBokC,EAAQ,GAAM,CACrC,YAAK,sBAAwBA,IAAU,GACvC,KAAK,QAAQ,2BAA2B,KAAK,qBAAqB,EAC3D,KAAK,qBACd,CAEA,6BAA6BnqC,EAAS,GAAI,CAGxC,GAFIA,GAAQ,kBAAoB,IAC5BA,EAAO,WAAa,IACpBA,EAAO,gBAAkB,IAASA,EAAO,eAAe,UAAY,GAAM,OAC9E,KAAK,yBAAyBA,CAAM,EACpC,MAAM9I,EAAS,OAAO8I,EAAO,QAAUA,EAAO,QAAU,EAAE,EAAE,YAAW,GAC5C,KAAK,yBAAyB,iBAAmB,IACvE,KAAK,yBAAyB,mBAAqB,IACnDA,EAAO,iBAAmB,IAC1BA,EAAO,mBAAqB,KACP9I,IAAW,OAAM,KAAK,uBAAyB,KAAK,KAAI,GAClF,KAAK,yBAAyB,CAC5B,GAAG8I,EACH,eAAgBA,EAAO,iBAAmB,GAC1C,SAAU,GACV,iBAAkB,OAAO,UAAU,eAAe,KAAKA,EAAQ,kBAAkB,EAC7EA,EAAO,iBACP,OACJ,sBAAuB,EAC7B,CAAK,CACH,CAEA,wBAAwBA,EAAS,GAAI,CACnC,MAAMkC,EAAO,IAAI,IACXw0E,EAAO/iF,GAAU,CACrB,MAAMmD,EAAMk3G,GAAar6G,CAAK,EAC1BmD,GAAKoL,EAAK,IAAIpL,CAAG,CACvB,EACMghH,EAAY,KAAK,OAAO,aAAa93G,EAAO,KAAOA,EAAO,MAAQA,EAAO,YAAY,GAAKguG,GAAahuG,EAAO,KAAOA,EAAO,IAAI,EACtI02E,EAAIohC,CAAS,EACbphC,EAAI12E,EAAO,GAAG,EACd02E,EAAI12E,EAAO,IAAI,EACf02E,EAAI12E,EAAO,YAAY,EACvB02E,EAAI,KAAK,OAAO,eAAeohC,CAAS,CAAC,EACzC,UAAWM,KAAS,KAAK,OAAO,YAAY,MAAMN,CAAS,GAAK,CAAA,EAAIphC,EAAI0hC,CAAK,EAC7E,OAAO,MAAM,KAAKl2G,CAAI,CACxB,CAEA,yBAAyBlC,EAAS,GAAI,CACpC,MAAMtH,EAAQsH,EAAO,eAAiB,KACtC,GAAI,CAACtH,GAAS,CAACsH,EAAO,IAAK,OAC3B,MAAMkC,EAAO,KAAK,wBAAwBlC,CAAM,EAC1C83G,EAAY,KAAK,OAAO,aAAa93G,EAAO,GAAG,GAAKguG,GAAahuG,EAAO,GAAG,EAC3E6xI,EAAY7jC,GAAa,KAAK,OAAO,eAAe8J,CAAS,GAAKA,CAAS,EACjF,UAAWhhH,KAAOoL,EAChB,KAAK,4BAA4B,IAAIpL,EAAK,CAAE,QAAS,GAAM,EAEzD4B,EAAM,UAAY,IAAQm5I,GAC5B,KAAK,4BAA4B,IAAIA,EAAW,CAC9C,QAAS,GACT,MAAO8xB,GAAkBjrK,EAAM,KAAK,CAC5C,CAAO,CAEL,CAEA,8BAA+B,CAC7B,KAAK,OAAO,SAAS,KAAM,GAAI,CAC7B,8BAA+B,CAC7B,QAAS,KAAK,YAAY,UAAY,GACtC,KAAM,UACN,MAAO,WACf,EACM,+BAAgC,CAC9B,QAAS,KAAK,YAAY,WAAa,GACvC,KAAM,UACN,MAAO,WACf,EACM,gCAAiC,CAC/B,QAAS,GACT,KAAM,UACN,MAAO,WACf,EACM,iCAAkC,CAChC,QAAS,KAAK,YAAY,qBAAqB,WAAa,GAC5D,KAAM,UACN,MAAO,WACf,EACM,uBAAwB,CACtB,QAAS,GACT,KAAM,UACN,MAAO,MACf,EACM,WAAY,CACV,QAAS,KACT,KAAM,SACN,MAAO,MACf,EACM,gCAAiC,CAC/B,QAAS,KACT,KAAM,SACN,MAAO,MACf,EACM,8BAA+B,CAC7B,QAAS,KACT,KAAM,SACN,MAAO,MACf,EACM,kCAAmC,CACjC,QAAS,KACT,KAAM,SACN,MAAO,MACf,CACA,CAAK,CACH,CAEA,UAAUnE,EAAU,GAAI,CACtB,MAAMgqL,EAAqBhqL,EAAQ,oBAAsB,OAAOA,EAAQ,oBAAuB,SAC3FA,EAAQ,mBACR,CAAA,EACEiqL,EAAsBjqL,EAAQ,qBAAuB,OAAOA,EAAQ,qBAAwB,SAC9FA,EAAQ,oBACR,CAAA,EACJ,YAAK,YAAc,CACjB,GAAG,KAAK,YACR,QAASgqL,EAAmB,UAAY,GACxC,SAAU,OAAO,UAAU,eAAe,KAAKA,EAAoB,UAAU,EACzEA,EAAmB,WAAa,GAChC,KAAK,aAAa,WAAa,GACnC,oBAAqB,CACnB,QAASC,EAAoB,UAAY,GACzC,SAAU,OAAO,UAAU,eAAe,KAAKA,EAAqB,UAAU,EAC1EA,EAAoB,WAAa,GACjC,KAAK,aAAa,qBAAqB,WAAa,EAChE,EACM,OAAQ,OAAOD,EAAmB,QAAW,SACzCA,EAAmB,OAClB,KAAK,aAAa,QAAU,IACvC,EACQ,OAAO,UAAU,eAAe,KAAKA,EAAoB,UAAU,GACrE,KAAK,UAAU,+BAAgCA,EAAmB,WAAa,GAAM,CACnF,OAAQ,SACR,OAAQ,6BACR,SAAU,EAClB,CAAO,EAEC,OAAO,UAAU,eAAe,KAAKA,EAAoB,SAAS,GACpE,KAAK,UAAU,8BAA+BA,EAAmB,UAAY,GAAO,CAClF,OAAQ,SACR,OAAQ,6BACR,SAAU,EAClB,CAAO,EAEC,OAAO,UAAU,eAAe,KAAKC,EAAqB,UAAU,GACtE,KAAK,UAAU,iCAAkCA,EAAoB,WAAa,GAAM,CACtF,OAAQ,SACR,OAAQ,+BACR,SAAU,EAClB,CAAO,EAEC,OAAO,UAAU,eAAe,KAAKA,EAAqB,SAAS,GACrE,KAAK,UAAU,gCAAiCA,EAAoB,UAAY,GAAO,CACrF,OAAQ,SACR,OAAQ,+BACR,SAAU,EAClB,CAAO,EAEH,KAAK,MAAM,SAAU,CAAE,OAAQ,YAAa,OAAQ,KAAK,kBAAiB,EAAI,EACvE,KAAK,kBAAiB,CAC/B,CAEA,gBAAiB,CACf,OAAO9M,GAA8B,CACnC,MAAO,KAAK,OAAO,IAAI,WAAY,IAAI,EACvC,SAAU,KAAK,OAAO,IAAI,uBAAwB,EAAK,IAAM,GAC7D,WAAY,CACV,gBAAiB,KAAK,OAAO,IAAI,gCAAiC,IAAI,EACtE,cAAe,KAAK,OAAO,IAAI,8BAA+B,IAAI,EAClE,kBAAmB,KAAK,OAAO,IAAI,kCAAmC,IAAI,CAClF,CACA,CAAK,CACH,CAEA,MAAM,iBAAkB,CACtB,OAAO,KAAK,eAAc,CAC5B,CAEA,MAAM,kBAAkB/vH,EAAQ,GAAI,CAClC,MAAMxrD,EAAOu7K,GAA8B6K,GAAgB,KAAK,eAAc,EAAI56H,CAAK,CAAC,EAClF88H,EAAkB,CAAC3nL,EAAKnD,IAAU,KAAK,UAAUmD,EAAKnD,EAAO,CACjE,MAAO,OACP,OAAQ,cACR,OAAQ,oBACd,CAAK,EACG,OAAO,UAAU,eAAe,KAAKguD,EAAO,UAAU,GACxD88H,EAAgB,uBAAwBtoL,EAAK,WAAa,EAAI,EAE5D,OAAO,UAAU,eAAe,KAAKwrD,EAAO,OAAO,GACrD88H,EAAgB,WAAYtoL,EAAK,OAAS,IAAI,EAEhD,MAAMuoL,EAAkB/8H,GAAO,YAAc,OAAOA,EAAM,YAAe,SACrEA,EAAM,WACN,CAAA,EACJ,OAAI,OAAO,UAAU,eAAe,KAAK+8H,EAAiB,iBAAiB,GACzED,EAAgB,gCAAiCtoL,EAAK,WAAW,iBAAmB,IAAI,EAEtF,OAAO,UAAU,eAAe,KAAKuoL,EAAiB,eAAe,GACvED,EAAgB,8BAA+BtoL,EAAK,WAAW,eAAiB,IAAI,EAElF,OAAO,UAAU,eAAe,KAAKuoL,EAAiB,mBAAmB,GAC3ED,EAAgB,kCAAmCtoL,EAAK,WAAW,mBAAqB,IAAI,EAEvFA,CACT,CAEA,iBAAiBwB,EAAS,iBAAkB,CAI1C,GAHqB,KAAK,aAAa,QAAU,IAC5C,KAAK,aAAa,eAAiB,IACnC,KAAK,aAAa,SAAW,SACd,KAAK,mBAAqB,GAC5C,OAAO,KAAK,wBAA0B,KAAK,kBAAiB,EAE9D,MAAMgnL,EAAU,KAAK,aAAa,QAAU,IAAQ,OAAO,SAAS,OAAO,KAAK,aAAa,OAAO,CAAC,EACjG,OAAO,KAAK,YAAY,OAAO,EAC/B,KAAK,KAAI,EACb,YAAK,YAAc,CACjB,GAAG,KAAK,YACR,QAAS,GACT,OAAQ,QACR,MAAO,GACP,aAAc,GACd,QAAAA,EACA,OAAAhnL,CACN,EACI,KAAK,MAAM,SAAU,CAAE,OAAAA,EAAQ,OAAQ,KAAK,kBAAiB,EAAI,EACjE,KAAK,yBAAyB,CAC5B,OAAAA,EACA,OAAQ,UACR,eAAgB,GAChB,SAAU,GACV,iBAAkB,OAClB,sBAAuB,EAC7B,CAAK,EACM,KAAK,kBAAiB,CAC/B,CAEA,mBAAmBA,EAAS,mBAAoB,CAC9C,KAAK,uBAAyB,KAAK,sBAAwB,GAAK,OAAO,iBACnE,KAAK,uBAAyB,IAAG,KAAK,sBAAwB,GAClE,MAAMinL,EAAuB,KAAK,sBAIlC,GAHqB,KAAK,aAAa,QAAU,IAC5C,KAAK,aAAa,iBAAmB,IACrC,KAAK,aAAa,SAAW,SACd,KAAK,mBAAqB,GAC5C,OAAO,KAAK,wBAA0B,KAAK,kBAAiB,EAE9D,MAAMD,EAAU,KAAK,aAAa,QAAU,IAAQ,OAAO,SAAS,OAAO,KAAK,aAAa,OAAO,CAAC,EACjG,OAAO,KAAK,YAAY,OAAO,EAC/B,KAAK,KAAI,EACb,YAAK,YAAc,CACjB,GAAG,KAAK,YACR,QAAS,GACT,OAAQ,QACR,MAAO,GACP,eAAgB,GAChB,QAAAA,EACA,OAAAhnL,CACN,EACI,KAAK,MAAM,SAAU,CAAE,OAAAA,EAAQ,OAAQ,KAAK,kBAAiB,EAAI,EACjE,KAAK,yBAAyB,CAC5B,OAAAA,EACA,OAAQ,YACR,eAAgB,GAChB,iBAAkB,GAClB,qBAAAinL,EACA,SAAU,GACV,iBAAkB,OAClB,sBAAuB,GACvB,cAAe,CACb,iBAAkB,EAC1B,EACM,WAAYvD,EAClB,CAAK,EACM,KAAK,kBAAiB,CAC/B,CAEA,MAAM,mBAAmBt2B,EAAUh/I,EAAK,KAAK,UAAW,CACtD,MAAM7R,EAAa4lL,GAAyB/0B,CAAQ,EACpD,GAAI,CAAC,KAAK,aAAa,UAAY,CAACh/I,EAAI,OAAO,KAC/C,MAAMi1I,EAAU,MAAM,KAAK,WAAWj1I,CAAE,EACxC,GAAI,CAACi1I,EAAS,OAAO,KACrBA,EAAQ,QAAQ,QAAQ,SAAW9mJ,EACnC8mJ,EAAQ,QAAQ,QAAQ,UAAY,KAAK,IAAG,EAC5C,MAAM63B,EAAWZ,GAA0BvB,GAAkB,QAAS11B,EAAQ,OAAO,EACrF,OAAA63B,EAAS,GAAK73B,EAAQ,QAAQ,QAAQ,GACtC,MAAM,KAAK,cAAc,MAAM63B,CAAQ,EACvC,KAAK,eAAiBmH,GAAkBnH,CAAQ,GAAK,KAAK,IAAG,EAC7D,KAAK,MAAM,SAAU,CAAE,OAAQ,mBAAoB,UAAW9sK,EAAI,OAAQ,KAAK,kBAAiB,CAAE,CAAE,EAC7F8sK,CACT,CAEA,UAAU/7K,EAAKnD,EAAOY,EAAU,CAAA,EAAI,CAClC,MAAMsqL,EAA0B,KAAK,wBAA0B,IAC1D,CAAC,OAAO,UAAU,eAAe,KAAKtqL,EAAS,eAAe,GAC9D,CAACsnL,GAAyBtnL,EAAQ,MAAM,EACvCikJ,EAAe,CACnB,GAAGjkJ,EACH,cAAeA,EAAQ,eAAiB,CAACsqL,CAC/C,EACI,OAAO,KAAK,OAAO,IAAI/nL,EAAKnD,EAAO6kJ,CAAY,CACjD,CAEA,oCAAqC,CACnC,MAAMsmC,EAAoB,OAAO,KAAK,QAAQ,SAAS,SAAS,EAChE,GAAI,OAAO,SAASA,CAAiB,GAAKA,EAAoB,EAC5D,OAAO,KAAK,MAAMA,CAAiB,EAAI,EAAI,aAAa,kBAE1D,MAAMC,EAAkB,OAAO,KAAK,QAAQ,oBAAiB,GAAM,SAAS,EAC5E,OAAI,OAAO,SAASA,CAAe,GAAKA,EAAkB,EACjD,KAAK,MAAMA,CAAe,EAAI,EAAI,aAAa,kBAEjD,IACT,CAEA,2BAA4B,CAC1B,MAAMjgE,EAAS,CACb,OAAO,KAAK,QAAQ,SAAS,SAAS,EACtC,OAAO,KAAK,QAAQ,oBAAiB,GAAM,SAAS,CAC1D,EAAM,OAAQnrH,GAAU,OAAO,SAASA,CAAK,GAAKA,EAAQ,CAAC,EACvD,OAAOmrH,EAAO,OAAS,KAAK,IAAI,GAAGA,EAAO,IAAKnrH,GAAU,KAAK,MAAMA,CAAK,CAAC,CAAC,EAAI,IACjF,CAEA,uBAAuBY,EAAU,GAAI,CAEnC,GADIA,EAAQ,WAAa,IACrB,KAAK,uBAAuB,UAAY,GAAO,OAAO,KAC1D,GAAIA,EAAQ,mBAAqB,GAAM,CACrC,MAAMsR,EAAQ,OAAO,KAAK,uBAAuB,gBAAgB,EAC3DwW,EAAa,KAAK,mCAAkC,EAC1D,GAAI,OAAO,SAASxW,CAAK,GAAKA,EAAQ,GAAK,OAAO,SAASwW,CAAU,GAAKA,EAAaxW,EACrF,MAAO,CACL,OAAQ,aACR,MAAO,YACP,WAAAwW,EACA,SAAUxW,EACV,QAAS,iEAAiE,KAAK,KAAKwW,EAAa,IAAI,CAAC,kBAAkB,KAAK,KAAKxW,EAAQ,IAAI,CAAC,iDACzJ,CAEI,CACA,GAAItR,EAAQ,iBAAmB,GAAM,CACnC,MAAMsR,EAAQ,OAAO,KAAK,uBAAuB,eAAe,EAC1DmH,EAAY,KAAK,0BAAyB,EAChD,GAAI,OAAO,SAASnH,CAAK,GAAKA,EAAQ,GAAK,OAAO,SAASmH,CAAS,GAAKA,EAAYnH,EACnF,MAAO,CACL,OAAQ,aACR,MAAO,UACP,UAAAmH,EACA,SAAUnH,EACV,QAAS,yDAAyDmH,EAAU,eAAc,CAAE,qBAAqBnH,EAAM,eAAc,CAAE,mDACjJ,CAEI,CACA,OAAO,IACT,CAEA,qBAAqBm5K,EAAO,GAAIzqL,EAAU,CAAA,EAAI,CAC5C,MAAMoD,EAAS,CACb,OAAQqnL,EAAK,QAAU,WACvB,MAAOA,EAAK,OAAS,UACrB,WAAY,OAAO,SAASA,EAAK,UAAU,EAAI,OAAOA,EAAK,UAAU,EAAI,KACzE,SAAU,OAAO,SAASA,EAAK,QAAQ,EAAI,OAAOA,EAAK,QAAQ,EAAI,KACnE,UAAW,OAAO,SAASA,EAAK,SAAS,EAAI,OAAOA,EAAK,SAAS,EAAI,KACtE,SAAU,OAAO,SAASA,EAAK,QAAQ,EAAI,OAAOA,EAAK,QAAQ,EAAI,KACnE,QAASA,EAAK,SAAW,2EACzB,WAAY,KAAK,KAAI,CAC3B,EACI,YAAK,iBAAmB,GACxB,KAAK,uBAAyBrnL,EAC9B,KAAK,YAAc,CACjB,GAAG,KAAK,YACR,iBAAkB,GAClB,uBAAwBA,EACxB,OAAQpD,EAAQ,YAAc,GAC1B,QACC,KAAK,YAAY,QAAU,QAChC,MAAO,KAAK,YAAY,QAAU,IAAQA,EAAQ,YAAc,GAChE,QAAS,KAAK,YAAY,UAAYA,EAAQ,YAAc,GAAO,KAAK,KAAI,EAAK,MACjF,QAAS,IACf,EACI,KAAK,UAAU,+BAAgC,GAAO,CACpD,OAAQ,SACR,OAAQ,sBACR,cAAe,GACf,SAAU,GACV,QAAS,EACf,CAAK,EACD,KAAK,UAAU,iCAAkC,GAAO,CACtD,OAAQ,SACR,OAAQ,sBACR,cAAe,GACf,SAAU,GACV,QAAS,EACf,CAAK,EACD,KAAK,MAAM,SAAU,CAAE,OAAQ,sBAAuB,OAAQ,KAAK,kBAAiB,EAAI,KAAMoD,CAAM,CAAE,EAC/FA,CACT,CAEA,wCAAwCA,EAAS,2BAA4B,CAC3E,GAAI,CAAC,KAAK,uBAAwB,MAAO,GACzC,MAAM6pJ,EAAe,KAAK,sBACpB,KAAK,mBACL,wBAAwB,KAAK,kBAAkB,mBAC/C,sCACF,KAAK,wBACP,aAAa,KAAK,qBAAqB,EACvC,KAAK,sBAAwB,MAE/B,KAAK,wBAA0B,KAC/B,MAAMy9B,EAAiB,KAAK,aAAa,SAAW,SAC/C,KAAK,aAAa,gBAAkBz9B,GACpC,KAAK,aAAa,QAAU,GACjC,YAAK,YAAc,CACjB,GAAG,KAAK,YACR,QAAS,GACT,OAAQ,QACR,MAAO,GACP,QAAS,KAAK,aAAa,SAAW,KAAK,KAAI,EAC/C,cAAeA,EACf,aAAcA,CACpB,EACSy9B,GACH,KAAK,MAAM,SAAU,CACnB,OAAAtnL,EACA,UAAW,KAAK,UAChB,MAAO6pJ,EACP,OAAQ,KAAK,kBAAiB,CACtC,CAAO,EAEI,EACT,CAEA,yBAAyBjtJ,EAAU,GAAI,CAErC,GADI,CAAC,KAAK,aAAa,UAAY,CAAC,KAAK,WAAa,CAAC,KAAK,cACxDA,EAAQ,WAAa,IAAS,KAAK,wCAAuC,EAAI,OAClF,KAAK,2BAA0B,EAC/B,MAAMk4F,EAAU,KAAK,yBAA2B,CAAA,EAC1CvlE,EAAcq2J,GAA4B9wF,EAASl4F,CAAO,EAChE,KAAK,wBAA0B2yB,EAC/B,MAAMg4J,EAAYvC,GAAuBpoL,EAAQ,mBAAqBA,EAAQ,WAAY,GAAG,EACvF4qL,EAAsB9B,GAAwB9oL,CAAO,GAAKA,EAAQ,yBAA2B,GAC/F4qL,IAAqB,KAAK,uBAAyB,KAAK,KAAI,GAChE,MAAMhnL,EAAQgnL,EACV,KAAK,IAAID,EAAW,KAAK,yBAAyB,EAClDA,EACEE,EAA2B,KAAK,wBAChCl4J,EAAY,iBAAmB,IAAQA,EAAY,mBAAqB,MACxEulE,EAAQ,iBAAmB,IAAQA,EAAQ,mBAAqB,IAClE,KAAK,uBAAyB,CAAC2yF,GAA0B,aAAa,KAAK,qBAAqB,EACpG,MAAMT,EAAU,KAAK,aAAa,QAAU,IAAQ,OAAO,SAAS,OAAO,KAAK,aAAa,OAAO,CAAC,EACjG,OAAO,KAAK,YAAY,OAAO,EAC/B,KAAK,KAAI,EACb,KAAK,YAAc,CACjB,GAAG,KAAK,YACR,OAAQ,KAAK,YAAY,SAAW,OAAS,QAAU,KAAK,YAAY,OACxE,MAAO,GACP,QAAAA,CACN,EACI,MAAMU,EAAe,KAAK,uBAAuBn4J,CAAW,EAC5D,GAAIm4J,EAAc,CAChB,KAAK,wBAA0B,KAC3B,KAAK,wBACP,aAAa,KAAK,qBAAqB,EACvC,KAAK,sBAAwB,MAE/B,KAAK,qBAAqBA,EAAc,CAAE,UAAW,EAAI,CAAE,EAC3D,MACF,CACA,GAAI,KAAK,kBAAoB9qL,EAAQ,WAAa,GAAO,CACvD,MAAM+qL,EAAkB,KAAK,aAAa,mBAAqB,GAC/D,KAAK,YAAc,CACjB,GAAG,KAAK,YACR,iBAAkB,GAClB,uBAAwB,KAAK,sBACrC,EACWA,GACH,KAAK,MAAM,SAAU,CAAE,OAAQ,oBAAqB,OAAQ,KAAK,kBAAiB,EAAI,EAExF,MACF,CACKF,IACH,KAAK,sBAAwB,WAAW,IAAM,KAAK,6BAA6Bl4J,CAAW,EAAG/uB,CAAK,EAEvG,CAEA,oBAAqB,CACnB,OAAO,KAAK,qBAAqB,KAAO,GAAK,KAAK,wBAA0B,CAC9E,CAEA,mCAAmC5D,EAAU,GAAI,CAC/C,KAAK,wBAA0BgpL,GAA4B,KAAK,yBAA2B,CAAA,EAAIhpL,CAAO,EAClG,MAAK,kCACT,KAAK,gCAAkC,GACvC,KAAK,kBAAkB,QAAQ,IAAM,CAEnC,GADA,KAAK,gCAAkC,GACnC,CAAC,KAAK,yBAA2B,KAAK,sBAAuB,OACjE,MAAMgrL,EAAe,KAAK,wBAC1B,KAAK,sBAAwB,WAAW,IAAM,KAAK,6BAA6BA,CAAY,EAAG,CAAC,CAClG,CAAC,EACH,CAEA,oCAAoCvpL,EAAO,CACzC,GAAI,CAAC,KAAK,aAAa,UAAY,CAAC,KAAK,WAAa,CAAC,KAAK,aAAc,OAC1E,MAAMoC,EAAM,KAAK,KAAI,EACf4H,EAAShK,GAAO,QAAU,OAAOA,EAAM,QAAW,SAAWA,EAAM,OAAS,CAAA,EAElF,GAAI,CADoBqnL,GAAwBr9K,CAAM,EAChC,OACtB,KAAK,uBAAyB5H,EAC9B,MAAMumL,EAAU,KAAK,aAAa,QAAU,IAAQ,OAAO,SAAS,OAAO,KAAK,aAAa,OAAO,CAAC,EACjG,OAAO,KAAK,YAAY,OAAO,EAC/BvmL,EACJ,KAAK,YAAc,CACjB,GAAG,KAAK,YACR,OAAQ,KAAK,YAAY,SAAW,QAAU,KAAK,YAAY,SAAW,QACtE,QACA,KAAK,YAAY,OACrB,MAAO,GACP,QAAAumL,EACA,OAAQ3oL,GAAO,MAAQ,KAAK,YAAY,QAAU,eACxD,EACI,KAAK,MAAM,SAAU,CAAE,OAAQA,GAAO,MAAQ,gBAAiB,OAAQ,KAAK,kBAAiB,CAAE,CAAE,EACjG,MAAMy2F,EAAU,KAAK,oCAAsC,CAAA,EACrDvlE,EAAc,CAClB,GAAGulE,EACH,OAAQ,SACR,OAAQz2F,GAAO,MAAQy2F,EAAQ,QAAU,gBACzC,WAAY,EACZ,eAAgB,GAChB,iBAAkB,GAClB,iBAAkB6wF,GAA0B7wF,EAAQ,iBAAkB,MAAM,EAC5E,sBAAuB,GACvB,uBAAwB,GACxB,SAAU,EAChB,EACI,KAAK,mCAAqCvlE,EACtC,KAAK,2BAA2B,aAAa,KAAK,yBAAyB,EAC/E,MAAMs4J,EAAY,KAAK,IAAI,EAAG,KAAK,2BAA6BrE,EAAoC,EACpG,KAAK,0BAA4B,WAAW,IAAM,CAChD,KAAK,0BAA4B,KACjC,MAAMoE,EAAe,KAAK,oCAAsCr4J,EAChE,KAAK,mCAAqC,KAC1C,KAAK,yBAAyBq4J,CAAY,CAC5C,EAAGC,CAAS,CACd,CAEA,2BAA2BjrL,EAAU,GAAI,CACvC,MAAM6D,EAAM,KAAK,KAAI,EACfqnL,EAAS,KAAK,2BAA6B,EAC3CC,EAAY,IAAM,CACtB,GAAInrL,EAAQ,WAAa,GAAO,MAAO,GACvC,MAAM8qF,EAAgB,KAAK,uBAAyB,EACpD,GAAIA,GAAiB,GAAK,CAAC,OAAO,SAAS,KAAK,sBAAsB,EAAG,MAAO,GAChF,MAAMghF,EAAYhhF,GAAiBjnF,EAAM,KAAK,wBAC9C,OAAOioK,EAAY,EAAIA,EAAY,CACrC,EAEA,GAD2B9rK,EAAQ,iBAAmB,IAAQA,EAAQ,mBAAqB,GACnE,CACtB,GAAI,KAAK,gCAAgCA,CAAO,EAC9C,YAAK,uBAAyB6D,EACvB,KAAK,IAAIqnL,EAAQ,GAAG,EAE7B,GAAIA,EAAS,GAAK,OAAO,SAAS,KAAK,sBAAsB,EAAG,CAC9D,MAAMpf,EAAYof,GAAUrnL,EAAM,KAAK,wBACvC,GAAIioK,EAAY,EAAG,OAAOA,CAC5B,CACA,OAAOqf,EAAS,CAClB,CACA,GAAI,KAAK,qCAAqCnrL,CAAO,EACnD,YAAK,uBAAyB6D,EACvB,KAAK,IAAIqnL,EAAQ,GAAG,EAE7B,GAAIA,EAAS,GAAK,OAAO,SAAS,KAAK,sBAAsB,EAAG,CAC9D,MAAMpf,EAAYof,GAAUrnL,EAAM,KAAK,wBACvC,GAAIioK,EAAY,EAAG,OAAOA,CAC5B,CACA,OAAOqf,EAAS,CAClB,CAEA,oCAAqC,CACnC,MAAMC,EAAS,IAAI,IAAI,KAAK,2BAA2B,EACvD,YAAK,4BAA4B,MAAK,EAC/BA,CACT,CAEA,mCAAmCA,EAAQ,CACzC,SAAW,CAAC7oL,EAAK4B,CAAK,IAAKinL,GAAU,CAAA,EACnC,KAAK,4BAA4B,IAAI7oL,EAAK4B,CAAK,CAEnD,CAEA,qBAAqBF,EAAO,CAC1B,OAAIA,GAAS,KAAa,wBACtB,OAAOA,GAAU,SAAiBA,EAC/BA,EAAM,SAAW,OAAOA,CAAK,CACtC,CAEA,6BAA6BlB,EAAS0I,EAAS,GAAI,CACjD,MAAMwhJ,EAAe,KAAK,qBAAqBlqJ,CAAO,EACtD,YAAK,oBAAsBkqJ,EAC3B,KAAK,YAAc,CACjB,GAAG,KAAK,YACR,OAAQ,QACR,cAAeA,EACf,aAAcA,CACpB,EACI,KAAK,MAAM,SAAU,CACnB,OAAQxhJ,EAAO,QAAU,wBACzB,UAAWA,EAAO,WAAa,KAAK,WAAa,KACjD,MAAOwhJ,EACP,OAAQ,KAAK,kBAAiB,CACpC,CAAK,EACD,QAAQ,MAAM,yCAA0C,CACtD,MAAOA,EACP,UAAWxhJ,EAAO,WAAa,KAAK,WAAa,IACvD,CAAK,EACMwhJ,CACT,CAEA,yBAAyBjtJ,EAAU,GAAI,CACrC,GAAIA,EAAQ,WAAa,IAAQA,EAAQ,mBAAqB,GAAM,MAAO,GAC3E,MAAMqrL,EAAmB,OAAOrrL,EAAQ,oBAAoB,EAC5D,OAAO,OAAO,SAASqrL,CAAgB,GAClCA,EAAmB,GACnBA,EAAmB,KAAK,qBAC/B,CAEA,2BAA2BrrL,EAAU,GAAI,CACvC,MAAMqrL,EAAmB,OAAOrrL,EAAQ,oBAAoB,EACtDsrL,EAAiB,KAAK,sBAO5B,GANA,KAAK,yBAAyB,kCAAmC,CAC/D,GAAItrL,EAAQ,IAAM,KAAK,WAAa,KACpC,OAAQA,EAAQ,QAAU,KAC1B,iBAAkB,OAAO,SAASqrL,CAAgB,EAAIA,EAAmB,KACzE,eAAAC,CACN,CAAK,EACG,KAAK,yBAA2B,GAAK,CAAC,KAAK,yBAA2B,CAAC,KAAK,sBAAuB,CACrG,MAAM34J,EAAcq2J,GAA4B,GAAI,CAClD,GAAGhpL,EACH,OAAQ,8BACR,iBAAkB,GAClB,SAAU,GACV,qBAAsBsrL,EACtB,iBAAkBtrL,EAAQ,kBAAoB,MACtD,CAAO,EACD,KAAK,wBAA0B2yB,EAC/B,KAAK,sBAAwB,WAAW,IAAM,KAAK,6BAA6BA,CAAW,EAAG,CAAC,CACjG,CACA,OAAO,IACT,CAEA,8BAA8B3yB,EAAU,GAAI,CAC1C,MAAMqrL,EAAmB,OAAOrrL,EAAQ,oBAAoB,EACtDsrL,EAAiB,KAAK,sBAC5B,YAAK,yBAAyB,kCAAmC,CAC/D,GAAItrL,EAAQ,IAAM,KAAK,WAAa,KACpC,OAAQA,EAAQ,QAAU,KAC1B,iBAAkB,OAAO,SAASqrL,CAAgB,EAAIA,EAAmB,KACzE,eAAAC,CACN,CAAK,EACM,CACL,GAAGtrL,EACH,qBAAsBsrL,CAC5B,CACE,CAEA,kBAAkBtrL,EAAU,GAAI,CAC9B,MAAMwR,EAAK,EAAE,KAAK,qBACZw8C,EAAY,KAAK,KAAI,EACrB5gC,EAAQ,CACZ,GAAA5b,EACA,UAAAw8C,EACA,OAAQhuD,EAAQ,QAAU,KAC1B,SAAUA,EAAQ,WAAa,GAC/B,eAAgBA,EAAQ,iBAAmB,GAC3C,iBAAkBA,EAAQ,mBAAqB,GAC/C,aAAc,IACpB,EACI,YAAK,qBAAqB,IAAIwR,EAAI4b,CAAK,EACvC,KAAK,mBAAqB,KAC1B,KAAK,YAAc,CACjB,GAAG,KAAK,YACR,QAAS,GACT,OAAQ,UACR,QAAS,GACT,cAAe4gC,EACf,cAAe,IACrB,EACI,KAAK,MAAM,SAAU,CACnB,OAAQ,qBACR,UAAW,KAAK,UAChB,KAAM,CAAE,GAAG5gC,EAAO,aAAc,MAAS,EACzC,OAAQ,KAAK,kBAAiB,CACpC,CAAK,EACG,KAAK,sBAAwB,IAC/BA,EAAM,aAAe,WAAW,IAAM,CACpC,GAAI,CAAC,KAAK,qBAAqB,IAAI5b,CAAE,EAAG,OACxC,MAAM47J,EAAY,KAAK,IAAI,EAAG,KAAK,KAAI,EAAKp/G,CAAS,EACrD,KAAK,mBAAqB,uCAAuC,KAAK,MAAMo/G,EAAY,GAAI,CAAC,KAC7F,QAAQ,KAAK,8DAA+D,CAC1E,UAAW,KAAK,UAChB,OAAQhgJ,EAAM,OACd,SAAUA,EAAM,SAChB,UAAAggJ,CACV,CAAS,EACD,KAAK,MAAM,SAAU,CACnB,OAAQ,uBACR,UAAW,KAAK,UAChB,QAAS,KAAK,mBACd,UAAAA,EACA,OAAQ,KAAK,kBAAiB,CACxC,CAAS,CACH,EAAG,KAAK,qBAAqB,GAExB57J,CACT,CAEA,mBAAmBA,EAAIvN,EAAQ,KAAM,CACnC,MAAMmpB,EAAQ,KAAK,qBAAqB,IAAI5b,CAAE,GAAK,KAC/C4b,GAAO,cAAc,aAAaA,EAAM,YAAY,EACxD,KAAK,qBAAqB,OAAO5b,CAAE,EACnC,MAAMy7I,EAAehpJ,EAAQ,KAAK,qBAAqBA,CAAK,EAAI,KAChE,GAAIgpJ,EAAc,CAChB,KAAK,iBAAmBA,EACxB,KAAK,mBAAqB,KAC1B,KAAK,YAAc,CACjB,GAAG,KAAK,YACR,OAAQ,QACR,QAAS,GACT,cAAeA,CACvB,EACM,MAAMs+B,EAAS,GAAG,KAAK,WAAa,EAAE,IAAIt+B,CAAY,GAClD,KAAK,8BAAgCs+B,IACvC,KAAK,4BAA8BA,EACnC,QAAQ,MAAM,sCAAuC,CACnD,MAAAtnL,EACA,UAAW,KAAK,UAChB,OAAQmpB,GAAO,QAAU,KACzB,SAAUA,GAAO,WAAa,EACxC,CAAS,GAEH,KAAK,MAAM,SAAU,CACnB,OAAQ,qBACR,UAAW,KAAK,UAChB,MAAO6/H,EACP,OAAQ,KAAK,kBAAiB,CACtC,CAAO,EACD,MACF,CACI,KAAK,qBAAqB,OAAS,IACrC,KAAK,mBAAqB,KAC1B,KAAK,YAAc,CACjB,GAAG,KAAK,YACR,QAAS,EACjB,EACM,KAAK,MAAM,SAAU,CACnB,OAAQ,sBACR,UAAW,KAAK,UAChB,OAAQ,KAAK,kBAAiB,CACtC,CAAO,GAEC7/H,GAAO,WAAa,KAAM,KAAK,uBAAyB,KAAK,KAAI,EACvE,CAEA,MAAM,yBAAyBo+J,EAAWxrL,EAAU,GAAI,CACtD,MAAMwR,EAAK,KAAK,kBAAkBxR,CAAO,EACzC,GAAI,CACF,MAAM0E,EAAS,MAAM8mL,EAAS,EAC9B,YAAK,mBAAmBh6K,CAAE,EACnB9M,CACT,OAAST,EAAO,CACd,WAAK,mBAAmBuN,EAAIvN,CAAK,EAC3BA,CACR,CACF,CAEA,oBAAoBunL,EAAWxrL,EAAU,GAAI,CAC3C,KAAK,yBAA2B,EAC3B,OAAO,SAASA,EAAQ,WAAW,IAAGA,EAAQ,YAAcuoL,GAAe,GAChF,MAAM9hG,EAAM,UACV,KAAK,wBAA0B,KAAK,IAAI,EAAG,KAAK,wBAA0B,CAAC,EACpE,KAAK,yBAAyB+kG,EAAWxrL,CAAO,GAEnDyrL,EAAS,KAAK,kBAAkB,MAAM,IAAM,IAAI,EAAE,KAAKhlG,CAAG,EAChE,YAAK,kBAAoBglG,EAAO,MAAM,IAAM,IAAI,EACzCA,CACT,CAEA,yBAA0B,CACxB,OAAO,KAAK,6BAA6B,MAAQ,CACnD,CAEA,wBAAyB,CACvB,OAAO,KAAK,wBAAuB,EAAK,CAC1C,CAEA,yBAAyBroL,EAAS,oBAAqBpD,EAAU,CAAA,EAAI,CAC/DA,EAAQ,QAAU,IAAO,KAAK,4BAA4B,MAAK,EACnE,MAAM6D,EAAM,KAAK,KAAI,EACf6nL,EAAe1rL,EAAQ,UAAY,GACnC2rL,EAAiB3rL,EAAQ,YAAc,GACvC4rL,EAAeF,EAAe,GAAQ,KAAK,aAAa,eAAiB,GACzEG,EAAiBF,EAAiB,GAAQ,KAAK,aAAa,iBAAmB,GAC/E39D,EAAQ49D,GAAgBC,EAC9B,YAAK,YAAc,CACjB,GAAG,KAAK,YACR,OAAQ79D,EAAQ,QAAU,QAC1B,MAAAA,EACA,aAAA49D,EACA,eAAAC,EACA,QAAShoL,EACT,QAASmqH,EAAS,KAAK,aAAa,SAAWnqH,EAAO,KACtD,OAAAT,CACN,EACI,KAAK,MAAM,SAAU,CAAE,OAAAA,EAAQ,OAAQ,KAAK,kBAAiB,EAAI,EAC1D,KAAK,kBAAiB,CAC/B,CAEA,4BAA4BpD,EAAU,GAAI,CACxC,MAAM2K,EAAS,KAAK,OACpB,GAAI,CAACA,EAAQ,MAAO,CAAA,EACpB,MAAMmhL,EAAY,CAACvpL,EAAKlD,EAAW,OAAS,CAC1C,MAAM+tB,EAAQ,KAAK,QAAQ,QAAQ7qB,CAAG,EACtC,GAAI,CAAC6qB,EAAO,OAAO/tB,EACnB,MAAMD,EAAQ,OAAOguB,EAAM,QAAW,WAClCA,EAAM,OAAM,EACZ,KAAK,OAAO,IAAI7qB,EAAKlD,CAAQ,EACjC,OAAOD,GAAS,KAAOC,EAAW+vK,GAAkBhwK,CAAK,CAC3D,EACM2sL,EAAgB/rL,EAAQ,QAAU,CAAA,EACxC,IAAIgsL,EAAcF,EAAU,aAAa,EACpCE,IACC,OAAOrhL,EAAO,sBAAyB,WACzCqhL,EAAcrhL,EAAO,qBAAqBohL,CAAa,EAC9C,OAAOphL,EAAO,YAAe,aACtCqhL,EAAcrhL,EAAO,WAAU,EAC3BqhL,GAAeD,EAAc,kBAAoB,IAAM,OAAOC,EAAY,WAGlF,IAAIC,EAAqB,KACzB,MAAMC,EAAuB,OAAO,KAAK,QAAQ,YAAe,WAC5D,KAAK,OAAO,WAAW,iBAAiB,EACxC,CAAA,EACJ,GAAIA,EAAqB,OAAS,EAAG,CACnCD,EAAqB,CAAA,EACrB,SAAW,CAAC1pL,CAAG,IAAK2pL,EAAsB,CACxC,MAAMnoJ,EAASxhC,EAAI,WAAW,kBAAkB,EAC5CA,EAAI,MAAM,EAAyB,EACnC,GACJ,GAAI,CAACwhC,EAAQ,SACb,MAAM3W,EAAQ,KAAK,OAAO,MAAM7qB,CAAG,EAC7BnD,EAAQ,OAAOguB,GAAO,QAAW,WACnCA,EAAM,OAAM,EACZ,KAAK,OAAO,IAAI7qB,CAAG,EACvB0pL,EAAmBloJ,CAAM,EAAIqrI,GAAkBhwK,CAAK,CACtD,CACF,CACK6sL,IACC,OAAOthL,EAAO,6BAAgC,WAChDshL,EAAqBthL,EAAO,4BAA2B,EAC9C,OAAOA,EAAO,gBAAmB,aAC1CshL,EAAqBthL,EAAO,eAAc,IAG9C,IAAIwhL,EAAqBL,EAAU,sBAAsB,EACzD,OAAI9rL,EAAQ,uBAAyB,IAAS,OAAO2K,EAAO,4BAA+B,aACzFwhL,EAAqBA,GAAsBxhL,EAAO,2BAA2B,CAC3E,iBAAkB,GAClB,GAAI3K,EAAQ,eAAiB,EACrC,CAAO,GAEI,CACL,YAAagsL,EAAc5c,GAAkB4c,CAAW,EAAI,KAC5D,mBAAoBC,EAAqB7c,GAAkB6c,CAAkB,EAAI,KACjF,mBAAoBE,EAAqB/c,GAAkB+c,CAAkB,EAAI,IACvF,CACE,CAEA,oCAAoC3O,EAAoBx9K,EAAU,GAAI,CACpE,GAAI,CAACw9K,GAAsB,OAAOA,GAAuB,SAAU,OAAOA,EAC1EA,EAAmB,QAAUA,EAAmB,SAAW,OAAOA,EAAmB,SAAY,SAC7FA,EAAmB,QACnB,CAAA,EACJ,MAAMrtF,EAAU,KAAK,4BAA4BnwF,CAAO,EACxD,OAAImwF,EAAQ,cAAaqtF,EAAmB,QAAQ,YAAcrtF,EAAQ,aACtEA,EAAQ,qBAAoBqtF,EAAmB,QAAQ,mBAAqBrtF,EAAQ,oBACpFA,EAAQ,qBAAoBqtF,EAAmB,QAAQ,mBAAqBrtF,EAAQ,oBACjFqtF,CACT,CAEA,MAAM,6BAA6Bx9K,EAAU,CAAA,EAAIorL,EAAS,IAAI,IAAO,CACnE,GAAI,CAAC,KAAK,aAAa,UAAY,CAAC,KAAK,WAAa,CAAC,KAAK,cAAgBA,EAAO,MAAQ,EAAG,OAAO,KACrG,MAAM55K,EAAK,OAAOxR,EAAQ,IAAM,KAAK,SAAS,EACxCosL,EAAiB,MAAM,KAAK,aAAa,MAAM56K,EAAI,CAAE,mBAAoB,GAAO,EACtF,GAAI,CAAC46K,EACH,OAAO,KAAK,sBAAsB,CAChC,GAAGpsL,EACH,GAAAwR,EACA,eAAgB,GAChB,iBAAkBxR,EAAQ,mBAAqB,GAC/C,sBAAuB,EAC/B,CAAO,EAEH,MAAMs+K,EAAW,KAAK,2BAA2B8N,CAAc,EACzD5lL,EAAU4oK,GAAkBkP,GAAU,SAAW,CAAA,CAAE,EACnDz6K,EAAM,KAAK,IAAG,EACpB2C,EAAQ,QAAU,CAChB,GAAIA,EAAQ,SAAW,GACvB,GAAAgL,EACA,UAAW,OAAO,SAASxR,EAAQ,SAAS,EAAI,OAAOA,EAAQ,SAAS,EAAI6D,EAC5E,YAAa,KAAK,YAClB,WAAY7D,EAAQ,aAAe,GACnC,OAAQA,EAAQ,QAAUwG,EAAQ,SAAS,QAAU,QAC3D,EACI,MAAMg3K,EAAqBh3K,EAAQ,oBAAsB,OAAOA,EAAQ,oBAAuB,SAC3FA,EAAQ,mBACRk3K,GAA0BvB,GAAkB,cAAe,CACzD,aAAc,KAAK,kBAAkBn8K,EAAQ,SAAW,CAAA,CAAE,CACpE,CAAS,EACLw9K,EAAmB,QAAUA,EAAmB,SAAW,OAAOA,EAAmB,SAAY,SAC7FA,EAAmB,QACnB,CAAA,EACJ,MAAM6O,EAAe7O,EAAmB,QAAQ,cAAgB,OAAOA,EAAmB,QAAQ,cAAiB,SAC/GA,EAAmB,QAAQ,aAC3B,KAAK,kBAAkBx9K,EAAQ,SAAW,CAAA,CAAE,EAChDqsL,EAAa,MAAQA,EAAa,OAAS,OAAOA,EAAa,OAAU,SACrEA,EAAa,MACb,CAAE,OAAQ,mBAAoB,QAAS,EAAG,UAAW,CAAA,CAAE,EAC3DA,EAAa,MAAM,UAAYA,EAAa,MAAM,WAAa,OAAOA,EAAa,MAAM,WAAc,SACnGA,EAAa,MAAM,UACnB,CAAA,EACJ,OAAOA,EAAa,MAAM,OACtBrsL,EAAQ,iBAAmB,IAAM,OAAOqsL,EAAa,MAAM,QAC/D7O,EAAmB,QAAQ,UAAYA,EAAmB,QAAQ,WAAa,OAAOA,EAAmB,QAAQ,WAAc,SAC3HA,EAAmB,QAAQ,UAC3B,CAAA,EACJ,SAAW,CAACj7K,EAAK4B,CAAK,IAAKinL,EACzB,GAAK7oL,EACL,GAAI4B,GAAO,UAAY,GACrB,OAAOkoL,EAAa,MAAM,UAAU9pL,CAAG,EACvC,OAAOi7K,EAAmB,QAAQ,UAAUj7K,CAAG,MAC1C,CACL,MAAMnD,EAAQgwK,GAAkBjrK,EAAM,KAAK,EAC3CkoL,EAAa,MAAM,UAAU9pL,CAAG,EAAInD,EACpCo+K,EAAmB,QAAQ,UAAUj7K,CAAG,EAAI6sK,GAAkBhwK,CAAK,CACrE,CAEF,KAAK,oCAAoCo+K,EAAoB,CAC3D,GAAGx9K,EACH,cAAe,CACb,iBAAkB,GAClB,GAAIA,EAAQ,eAAiB,EACrC,CACA,CAAK,EACDw9K,EAAmB,QAAQ,aAAe6O,EAC1C7lL,EAAQ,mBAAqBg3K,EAC7Bh3K,EAAQ,UAAY,MAAM,KAAK,iCAAiCxG,EAASs+K,CAAQ,EACjF,MAAM18K,EAAO87K,GAA0BvB,GAAkB,QAAS31K,EAAS,CACzE,OAAQ,iBACR,YAAa,EACnB,CAAK,EACD5E,EAAK,GAAK4P,EACV5P,EAAK,QAAQ,QAAQ,MAAQikL,GAAuBjkL,CAAI,EAAE,MAC1D,MAAM,KAAK,aAAa,MAAMA,CAAI,EAClC,KAAK,yBAAyB,iCAAkC,CAC9D,GAAA4P,EACA,WAAY45K,EAAO,KACnB,OAAQprL,EAAQ,QAAU,IAChC,CAAK,EACD,KAAK,eAAiBylL,GAAkB7jL,CAAI,GAAKiC,EACjD,KAAK,iBAAmB,KACxB,KAAK,oBAAsB,KAC3B,KAAK,mBAAqB,KAC1B,MAAMyoL,EAAqB,KAAK,aAAa,cAAgB,MACxD,KAAK,aAAa,QAAU,IAC5B,KAAK,aAAa,iBAAmB,GACpCC,EAAoB,KAAK,aAAa,eAAiB,IAAQD,EAC/DE,EAAsB,KAAK,aAAa,iBAAmB,GAC3DC,EAAiBF,GAAqBC,EACtCE,EAAyB,KAAK,aAAa,SAAW,KAC5D,YAAK,YAAc,CACjB,GAAG,KAAK,YACR,QAAS,GACT,OAAQD,EAAiB,QAAU,QACnC,MAAOA,EACP,aAAcF,EACd,eAAgBC,EAChB,QAASC,EAAkB,KAAK,aAAa,SAAW5oL,EAAO,KAC/D,QAAS4oL,EAAiBC,EAAyB,KAAK,eACxD,OAAQlmL,EAAQ,aAAa,QAAU,KAAK,YAAY,QAAU,KAClE,cAAe,KACf,aAAc,KACd,QAAS,EACf,EACI,MAAM,KAAK,uBAAuB5E,EAAK,SAAS,SAAS,aAAe,GAAQ,KAAO4P,CAAE,EACzF,KAAK,MAAM,SAAU,CAAE,OAAQ,2BAA4B,UAAWA,EAAI,OAAQ,KAAK,kBAAiB,CAAE,CAAE,EACrG5P,CACT,CAEA,6BAA6B5B,EAAU,GAAI,CACzC,KAAK,sBAAwB,KAC7B,MAAMgrL,EAAe,KAAK,yBAA2BhrL,EAErD,GADA,KAAK,wBAA0B,KAC3BgrL,EAAa,WAAa,IAAS,KAAK,wCAAuC,EAAI,OACvF,MAAM2B,EAAa,KAAK,2BAA2B3B,CAAY,EAC/D,GAAI2B,EAAa,EAAG,CAClB,KAAK,wBAA0B3B,EAC/B,KAAK,sBAAwB,WAAW,IAAM,KAAK,6BAA6BA,CAAY,EAAG2B,CAAU,EACzG,MACF,CACA,MAAM7B,EAAe,KAAK,uBAAuBE,CAAY,EAC7D,GAAIF,EAAc,CAChB,KAAK,qBAAqBA,EAAc,CAAE,UAAW,EAAI,CAAE,EAC3D,MACF,CACA,GAAI,KAAK,qBAAsB,CAC7B,KAAK,mCAAmCE,CAAY,EACpD,MACF,CACA,MAAM4B,EAAc,KAAK,mCAAkC,EACrDC,EAA2BD,EAAY,KAAO,GAC/C5B,EAAa,iBAAmB,IAChCA,EAAa,mBAAqB,IAClCA,EAAa,wBAA0B,IACxB6B,EAChB,KAAK,oBAAoB,IAAM,KAAK,6BAA6B,CACjE,GAAI,KAAK,UACT,OAAQ7B,EAAa,QAAU,mBAC/B,iBAAkBA,EAAa,mBAAqB,GAChD,GACCA,EAAa,mBAAqB,OAAS,OAAS,EACjE,EAAS4B,CAAW,EAAG5B,CAAY,EAC3B,KAAK,YAAY,CACjB,GAAI,KAAK,UACT,OAAQA,EAAa,QAAU,mBAC/B,SAAUA,EAAa,WAAa,GACpC,eAAgBA,EAAa,iBAAmB,GAChD,iBAAkBA,EAAa,mBAAqB,GACpD,qBAAsBA,EAAa,qBACnC,iBAAkBA,EAAa,mBAAqB,GAChD,GACCA,EAAa,mBAAqB,OAAS,OAAS,GACzD,sBAAuBA,EAAa,wBAA0B,GAC9D,cAAeA,EAAa,cAC5B,cAAeA,EAAa,eAAiBA,EAAa,SAAS,QAAUA,EAAa,oBAAoB,OAC9G,uBAAwBA,EAAa,yBAA2B,EACxE,CAAO,GACS,MAAO/mL,GAAU,CACvB4oL,GAA0B,KAAK,mCAAmCD,CAAW,EACjF,MAAM3/B,EAAe,KAAK,qBAAqBhpJ,CAAK,EACpD,KAAK,MAAM,SAAU,CAAE,OAAQ,yBAA0B,MAAOgpJ,EAAc,OAAQ,KAAK,kBAAiB,CAAE,CAAE,CAClH,CAAC,CACH,CAEA,yBAAyBjtJ,EAAU,GAAI,CACrC,OAAIA,EAAQ,gBAAkB,IAASA,EAAQ,aAAe,GAAc,KACrE,CACL,GAAI,EAAE,KAAK,2BACX,YAAauoL,GAAe,EAC5B,WAAY,OAAO,SAASvoL,EAAQ,WAAW,EAAI,OAAOA,EAAQ,WAAW,EAAI,KACjF,OAAQA,EAAQ,QAAU,KAC1B,SAAUA,EAAQ,WAAa,GAC/B,eAAgBA,EAAQ,iBAAmB,GAC3C,iBAAkBA,EAAQ,mBAAqB,GAC/C,qBAAsB,OAAO,SAAS,OAAOA,EAAQ,oBAAoB,CAAC,EACtE,OAAOA,EAAQ,oBAAoB,EACnC,KACJ,MAAO,CAAA,EACP,SAAU,EAChB,CACE,CAEA,uBAAuB8sL,EAAQnrL,EAAMorL,EAAathL,EAAS,CAAA,EAAI,CAC7D,GAAI,CAACqhL,GAAUA,EAAO,SAAU,OAAO,KACvC,MAAM7+H,EAAO,CACX,KAAAtsD,EACA,GAAI8mL,GAAcF,GAAe,EAAKwE,CAAW,EACjD,GAAG3d,GAAkB3jK,CAAM,CACjC,EACI,OAAAqhL,EAAO,MAAM,KAAK7+H,CAAI,EACfA,CACT,CAEA,iBAAiB6+H,EAAQnrL,EAAM8J,EAAQ+/K,EAAW,CAChD,GAAI,OAAOA,GAAc,WAAY,OAAOA,EAC5C,GAAI,CAACsB,EAAQ,OAAOtB,EAAS,EAC7B,MAAMuB,EAAcxE,GAAe,EACnC,GAAI,CACF,MAAM7jL,EAAS8mL,EAAS,EACxB,YAAK,uBAAuBsB,EAAQnrL,EAAMorL,EAAathL,CAAM,EACtD/G,CACT,OAAST,EAAO,CACd,WAAK,uBAAuB6oL,EAAQnrL,EAAMorL,EAAa,CACrD,GAAGthL,EACH,MAAO,KAAK,qBAAqBxH,CAAK,CAC9C,CAAO,EACKA,CACR,CACF,CAEA,MAAM,sBAAsB6oL,EAAQnrL,EAAM8J,EAAQ+/K,EAAW,CAC3D,GAAI,OAAOA,GAAc,WAAY,OAAOA,EAC5C,GAAI,CAACsB,EAAQ,OAAO,MAAMtB,EAAS,EACnC,MAAMuB,EAAcxE,GAAe,EACnC,GAAI,CACF,MAAM7jL,EAAS,MAAM8mL,EAAS,EAC9B,YAAK,uBAAuBsB,EAAQnrL,EAAMorL,EAAathL,CAAM,EACtD/G,CACT,OAAST,EAAO,CACd,WAAK,uBAAuB6oL,EAAQnrL,EAAMorL,EAAa,CACrD,GAAGthL,EACH,MAAO,KAAK,qBAAqBxH,CAAK,CAC9C,CAAO,EACKA,CACR,CACF,CAEA,yBAAyB6oL,EAAQ9sL,EAAU,CAAA,EAAIyL,EAAS,CAAA,EAAI,CAC1D,GAAI,CAACqhL,GAAUA,EAAO,SAAU,OAAO,KACvCA,EAAO,SAAW,GAClB,MAAME,EAAUvE,GAAcF,GAAe,EAAKuE,EAAO,WAAW,EAC9DG,EAAc,OAAO,SAASH,EAAO,UAAU,EACjDrE,GAAcqE,EAAO,YAAcA,EAAO,UAAU,EACpD,KACExlH,EAAU,CACd,OAAQwlH,EAAO,GACf,GAAI9sL,EAAQ,IAAM,KAAK,WAAa,KACpC,OAAQA,EAAQ,QAAU8sL,EAAO,OACjC,SAAU9sL,EAAQ,WAAa,GAC/B,eAAgBA,EAAQ,iBAAmB,GAC3C,iBAAkBA,EAAQ,mBAAqB,GAC/C,qBAAsB8sL,EAAO,qBAC7B,4BAA6B,KAAK,sBAClC,QAAAE,EACA,YAAAC,EACA,OAAQxhL,EAAO,QAAU,QACzB,MAAOqhL,EAAO,MAAM,IAAK7+H,GAASmhH,GAAkBnhH,CAAI,CAAC,CAC/D,EACQxiD,EAAO,QAAO67D,EAAQ,MAAQ,KAAK,qBAAqB77D,EAAO,KAAK,GACxE,KAAK,yBAAyB,sBAAuB67D,CAAO,EAC5D,MAAM4lH,EAAc9E,GAClBpoL,EAAQ,0BAA4B,KAAK,gCACzCinL,EACN,EAUI,OATkB,KAAK,uBAAyB,IAC3CjnL,EAAQ,YAAc,IACtBgtL,GAAWE,IAEZltL,EAAQ,YAAc,IACnBsnE,EAAQ,gBACRA,EAAQ,kBACRA,EAAQ,SAAW,UAET,OAAO,QAAY,KAAe,OAAO,QAAQ,MAAS,YACzE,QAAQ,KAAK,sCAAuCA,CAAO,EAEtDA,CACT,CAEA,yBAAyB7oD,EAAMhT,EAAS,GAAI,CAC1C,MAAMvH,EAAY,KAAK,KAAI,EAC3B,KAAK,0BAA0B,KAAK,CAClC,UAAAA,EACA,KAAAua,EACA,GAAG2wJ,GAAkB3jK,CAAM,CACjC,CAAK,EACD,MAAMq4K,EAAS5/K,EAAa,GAAK,GAAK,IACtC,KAAO,KAAK,0BAA0B,OAAS,GAAK,KAAK,0BAA0B,CAAC,EAAE,UAAY4/K,GAChG,KAAK,0BAA0B,MAAK,EAEtC,MAAMh1K,EAAM,IACR,KAAK,0BAA0B,OAASA,GAC1C,KAAK,0BAA0B,OAAO,EAAG,KAAK,0BAA0B,OAASA,CAAG,CAExF,CAEA,WAAW9O,EAAU,GAAI,CACvB,MAAM8tK,EAAW,OAAO,SAAS9tK,EAAQ,QAAQ,EAAI,KAAK,IAAI,EAAG,OAAOA,EAAQ,QAAQ,CAAC,EAAI,IACvF8jL,EAAS,KAAK,KAAI,EAAKhW,EACvBiW,EAAgB/jL,EAAQ,gBAAkB,GAC1CgkL,EAAchkL,EAAQ,cAAgB,GACtCmtL,EAAqBntL,EAAQ,qBAAuB,GAC1D,IAAIotL,EAAyB,EAC7B,MAAMC,EAAqBtJ,EAAgB,CAAA,EAAK,KAChD,UAAW32J,KAAS,KAAK,0BACnBA,EAAM,UAAY02J,IACtBsJ,GAA0B,EACtBC,GAAoBA,EAAmB,KAAKjgK,CAAK,GAUvD,MAAMoC,EAAQ,CACZ,GATiB,KAAK,QAAQ,aAAa,CAAE,SAAAs+I,EAAU,cAAAiW,EAAe,YAAAC,CAAW,CAAE,GAAK,CACxF,SAAAlW,EACA,kBAAmB,KAAK,QAAQ,eAAY,EAAK,QAAU,EAC3D,YAAakW,EAAe,KAAK,QAAQ,eAAY,GAAQ,CAAA,EAAM,CAAA,EACnE,iBAAkB,EAClB,cAAe,EACf,cAAe,CAAA,CACrB,EAGM,SAAAlW,EACA,uBAAAsf,EACA,yBAA0BrJ,EACtBsJ,EAAmB,IAAKjgK,GAAUgiJ,GAAkBhiJ,CAAK,CAAC,EAC1D,CAAA,EACJ,UAAW,KAAK,WAAa,KAC7B,cAAe,KAAK,aAAa,QAAU,IACjD,EACI,OAAI+/J,IAAoB39J,EAAM,YAAc4/I,GAAkB,KAAK,WAAW,GACvE5/I,CACT,CAEA,wCAAyC,CACvC,MAAM7kB,EAAS,KAAK,OACpB,GAAI,CAACA,EAAQ,OACb,MAAM66I,EAAY/jJ,GAAU,CAC1B,KAAK,oCAAoCA,CAAK,CAChD,EACA,UAAWgd,IAAQ,CAAC,cAAe,uBAAuB,EAAG,CAC3D,GAAI,OAAO9T,EAAO,IAAO,WACvB,GAAI,CACF,MAAMguG,EAAchuG,EAAO,GAAG8T,EAAM+mI,CAAQ,EACxC,OAAO7sC,GAAgB,YAAY,KAAK,+BAA+B,KAAKA,CAAW,EAC3F,QACF,OAAS10G,EAAO,CACdsH,GACE,KACA,wBAAwBkT,CAAI,GAC5B,2CAA2CA,CAAI,yDAC/C,CAAE,MAAAxa,CAAK,CACnB,CACQ,CAEF,GAAI,OAAO0G,EAAO,kBAAqB,WACrC,GAAI,CACFA,EAAO,iBAAiB8T,EAAM+mI,CAAQ,EACtC,KAAK,+BAA+B,KAAK,IAAM76I,EAAO,oBAAoB8T,EAAM+mI,CAAQ,CAAC,CAC3F,OAASvhJ,EAAO,CACdsH,GACE,KACA,sCAAsCkT,CAAI,GAC1C,2CAA2CA,CAAI,qBAC/C,CAAE,MAAAxa,CAAK,CACnB,CACQ,CAEJ,CACF,CAEA,oBAAoB6jG,EAAM1oG,EAAOY,EAAU,CAAA,EAAI,CAC7C,OAAO,KAAK,UAAU8nG,EAAM1oG,EAAO,CACjC,MAAOY,EAAQ,OAAS,UACxB,OAAQA,EAAQ,QAAU,UAC1B,OAAQA,EAAQ,QAAU,iBAC1B,SAAUA,EAAQ,QACxB,CAAK,CACH,CAEA,QAAS,CACP,OAAO,KAAK,kBAAiB,CAC/B,CAEA,mBAAoB,CAClB,MAAMstL,EAAU,KAAK,qBAAqB,KAAO,EAC3CC,EAAaD,EACf,MAAM,KAAK,KAAK,qBAAqB,OAAM,CAAE,EAAE,KAAK,CAACrzK,EAAGC,IAAMD,EAAE,UAAYC,EAAE,SAAS,EAAE,CAAC,EAC1F,KACEszK,EAAY,KAAK,kBAAoB,KAAK,qBAAuB,KACjE3sK,EAAS,CACb,KAAM,KAAK,KACX,aAAc,CAAE,GAAG,KAAK,YAAY,EACpC,YAAa,KAAK,YAClB,UAAW,KAAK,UAChB,mBAAoB,KAAK,mBACzB,uBAAwB,KAAK,uBAC7B,cAAe,KAAK,OAAO,aAAY,EAAG,OAC1C,WAAY,KAAK,OAAO,WAAU,EAClC,QAAAysK,EACA,UAAAE,EACA,YAAa,KAAK,mBAClB,YAAape,GAAkB,CAC7B,GAAG,KAAK,YACR,OAAQke,EAAU,UAAY,KAAK,YAAY,OAC/C,QAAAA,EACA,YAAa,KAAK,kBAC1B,CAAO,EACD,YAAa,CACX,OAAQA,EAAU,UAAaE,EAAY,QAAW,KAAK,eAAiB,QAAU,OACtF,QAAS,KAAK,eACd,MAAOA,EACP,QAAS,KAAK,mBACd,QAASF,EACT,UAAWC,GAAY,WAAa,KACpC,OAAQA,GAAY,QAAU,IACtC,CACA,EACI,YAAK,uBAAyB1sK,EACvBA,CACT,CAEA,kBAAkB7gB,EAAU,GAAI,CAC9B,MAAO,CACL,OAAQ,qBACR,QAAS,EACT,KAAM,KAAK,KACX,YAAa,KAAK,YAClB,UAAW,KAAK,UAChB,MAAO,KAAK,OAAO,SAAS,CAC1B,QAASA,EAAQ,SAAW,YAC5B,eAAgBA,EAAQ,iBAAmB,EACnD,CAAO,EACD,QAASA,EAAQ,iBAAmB,IAAQ,KAAK,eAC7C,KAAK,QAAQ,mBAAmBA,EAAQ,SAAW,CAAA,CAAE,EACrD,KACJ,SAAU,CACR,UAAW,KAAK,IAAG,EACnB,OAAQ,gBAChB,CACA,CACE,CAEA,4BAA6B,CAC3B,KAAK,mCAAqC,EAC5C,CAEA,gCAAgC4vJ,EAAW,CACzC,GAAI,CAACA,EAAW,OAChB,MAAM69B,EAAa,OAAO,SAAS,OAAO79B,EAAU,UAAU,CAAC,EAC3D,OAAOA,EAAU,UAAU,EAC3B,KAAK,KAAI,EACb,KAAK,gCAAkC69B,EACvC,KAAK,mCAAqC,EAC5C,CAEA,mCAAmC5pL,EAAM,KAAK,OAAQ,CACpD,MAAMqnL,EAAS,KAAK,2BAA6B,EACjD,OAAIA,GAAU,GAAK,CAAC,OAAO,SAAS,KAAK,sBAAsB,EAAU,GAClErnL,EAAM,KAAK,wBAA0BqnL,CAC9C,CAEA,qCAAqClrL,EAAU,GAAI,CACjD,GAAIA,EAAQ,mBAAqB,KAAM,OAAOA,EAAQ,oBAAsB,GAC5E,MAAM2K,EAAS,KAAK,OACpB,GAAI,CAACA,EAAQ,MAAO,GACpB,UAAW0zJ,IAAU,CACnB,sBACA,6BACA,4BACA,2BACN,EACM,GAAI,OAAO1zJ,EAAO0zJ,CAAM,GAAM,WAC5B,GAAI,CACF,GAAI1zJ,EAAO0zJ,CAAM,MAAQ,GAAM,MAAO,EACxC,OAASp6J,EAAO,CACdsH,GACE,KACA,qBAAqB8yJ,CAAM,GAC3B,sCAAsCA,CAAM,qCAC5C,CAAE,MAAAp6J,CAAK,CACnB,CACQ,CAIJ,MAAMypL,GADU/iL,EAAO,UAAY,OACV,SAAW,KAOpC,MANI,GAAA+iL,GAAS,SAAW,IACpBA,GAAS,UAAU,KAAO,IACR/iL,EAAO,uBAAyB,OACnC,oBAAsB,IACrCA,EAAO,gBAAkB,MAAQA,EAAO,2BACrBA,EAAO,UAAU,QAAUA,EAAO,WAAW,MAAM,QAAQ,GAAK,OACnE,OAAO,UAAY,GAEzC,CAEA,gCAAgC3K,EAAU,GAAI,CAC5C,GAAIA,EAAQ,mBAAqB,KAAM,OAAOA,EAAQ,oBAAsB,GAC5E,MAAM2K,EAAS,KAAK,OACpB,GAAI,CAACA,EAAQ,MAAO,GACpB,UAAW0zJ,IAAU,CACnB,sBACA,6BACA,2BACN,EACM,GAAI,OAAO1zJ,EAAO0zJ,CAAM,GAAM,YAAc1zJ,EAAO0zJ,CAAM,EAAC,IAAO,GAAM,MAAO,GAGhF,MAAMqvB,GADU/iL,EAAO,UAAY,OACV,SAAW,KAEpC,OADI+iL,GAAS,SAAW,IACpBA,GAAS,UAAU,KAAO,EAAU,IAClB/iL,EAAO,uBAAyB,OAChC,oBAAsB,EAC9C,CAEA,gCAAgC3K,EAAU,GAAI,CAC5C,MAAM6D,EAAM,KAAK,KAAI,EACrB,KAAK,gCAAkCA,EACvC,MAAMhB,EAASolL,GAAiCjoL,EAAQ,WAAaA,EAAQ,kBAAoB,KAAK,gBAAgB,EAQtH,MAPI,EAAA6C,EAAO,UAAY,IAASA,EAAO,kBAAoB,IACvD,CAAC,KAAK,aAAa,UAAY,CAAC,KAAK,WAAa,CAAC,KAAK,cACxD,CAAC,KAAK,QAAU,OAAO,KAAK,OAAO,yBAA4B,YAC/D,KAAK,aAAa,QAAU,IAC5B,KAAK,qCAAuC,IAC5C,CAAC,KAAK,mCAAmCgB,CAAG,GAC5C,KAAK,qCAAqC7D,CAAO,GACjD,OAAO,SAAS,KAAK,+BAA+B,GACtC6D,EAAM,KAAK,gCACbhB,EAAO,sBAGzB,CAEA,MAAM,iCAAiC7C,EAAU,GAAI2tL,EAAmB,KAAM,CAC5E,GAAI3tL,EAAQ,WAAa,OAAOA,EAAQ,WAAc,UAAYA,EAAQ,UAAU,QAAS,CAC3F,MAAM4vJ,EAAYwf,GAAkBpvK,EAAQ,SAAS,EACrD,YAAK,gCAAgC4vJ,CAAS,EACvCA,CACT,CAEA,MAAMg+B,EADqB5tL,EAAQ,8BAAgC,GAE/D,KACAovK,GAAkBue,GAAkB,SAAS,WAAa,IAAI,EAClE,OAAI3tL,EAAQ,mBAAqB,GAAc4tL,EAC3C5tL,EAAQ,mBAAqB,OAC1B,KAAK,gCAAgCA,CAAO,EAC/B,MAAM,KAAK,wBAAwB,CACnD,GAAGA,EACH,iBAAkB,EAC1B,CAAO,GACmB4tL,EALuCA,EAOtD,MAAM,KAAK,wBAAwB5tL,CAAO,CACnD,CAEA,MAAM,8BAA8BA,EAAU,GAAI,CAChD,GAAI,CAAC,KAAK,QAAQ,iCAAmC,CAAC,KAAK,QAAQ,2BAA4B,OAAO,KACtG,MAAM8sL,EAAS9sL,EAAQ,SAAW,KAC5B6tL,EAA2B7tL,EAAQ,kBAAoBA,EAAQ,eAAe,iBAC9E8tL,EAAmB,OAAO,SAAS,OAAOD,CAAwB,CAAC,EACrE,KAAK,IAAI,EAAG,OAAOA,CAAwB,CAAC,EAC3C7tL,EAAQ,WAAa,GACpB,KAAK,uBAAuB,kBAAoB+mL,GAChDC,GACA+G,EAAsBxF,GAAe,EACrCyF,EAAe,MAAO,KAAK,OAAO,kCAAkC,CACxE,OAAQhuL,EAAQ,QAAU,wBAC1B,GAAIA,EAAQ,eAAiB,GAC7B,iBAAA8tL,EACA,iBAAkB,GAClB,eAAgB,EACtB,CAAK,GAAK,KAAK,OAAO,6BAA6B,CAC7C,OAAQ9tL,EAAQ,QAAU,wBAC1B,GAAIA,EAAQ,eAAiB,GAC7B,iBAAA8tL,EACA,iBAAkB,GAClB,eAAgB,EACtB,CAAK,GAQD,GAPA,KAAK,uBAAuBhB,EAAQ,mCAAoCiB,EAAqB,CAC3F,UAAW,OAAO,SAASC,GAAc,SAAS,EAAI,OAAOA,EAAa,SAAS,EAAI,KACvF,aAAcA,GAAc,WAAa,KACzC,iBAAkBA,GAAc,mBAAqB,GACrD,eAAgBA,GAAc,gBAAkB,KAChD,iBAAAF,CACN,CAAK,EACG,KAAK,yBAAyB9tL,CAAO,GAAK,KAAK,wBAA0B,EAAG,CAC9E,MAAMqrL,EAAmB,OAAOrrL,EAAQ,oBAAoB,EACtDsrL,EAAiB,KAAK,sBAC5B,WAAK,uBAAuBwB,EAAQ,sCAAuCvE,GAAe,EAAI,CAC5F,iBAAkB,OAAO,SAAS8C,CAAgB,EAAIA,EAAmB,KACzE,eAAAC,EACA,YAAa,KAAK,uBAC1B,CAAO,EACKtG,GAAiC,CACrC,MAAO,iBACP,iBAAkB,OAAO,SAASqG,CAAgB,EAAIA,EAAmB,KACzE,eAAAC,CACR,CAAO,CACH,CACA,MAAM2C,EAAoB1F,GAAe,EACnC/gL,EAAYo9K,GAA6BoJ,GAAc,SAAS,EAKtE,GAJA,KAAK,uBAAuBlB,EAAQ,kCAAmCmB,EAAmB,CACxF,WAAYzmL,aAAqB,aAAeA,EAAU,OAAS,EACnE,WAAYA,aAAqB,aAAeA,EAAU,WAAa,CAC7E,CAAK,EACG,EAAEA,aAAqB,eAAiBA,EAAU,QAAU,EAAG,OAAO,KAC1E,MAAM0mL,EAAsB3F,GAAe,EACrC5iK,EAAgB,IAAI,WAAWne,EAAU,OAAQA,EAAU,WAAYA,EAAU,UAAU,EACjG,KAAK,uBAAuBslL,EAAQ,4BAA6BoB,EAAqB,CACpF,WAAYvoK,EAAc,UAChC,CAAK,EACD,MAAMwoK,EAAsB5F,GAAe,EACrCpD,EAAsBnlL,EAAQ,6BAC/BA,EAAQ,eAAe,6BACvBA,EAAQ,oBACPolL,EAAa,MAAMF,GAAsBv/J,EAAe,CAAE,oBAAAw/J,CAAmB,CAAE,EAOrF,GANA,KAAK,uBAAuB2H,EAAQ,0BAA2BqB,EAAqB,CAClF,YAAa/I,GAAY,aAAe,KACxC,mBAAoBA,GAAY,oBAAsB,KACtD,gBAAiBz/J,EAAc,WAC/B,iBAAkBy/J,GAAY,MAAM,YAAc,CACxD,CAAK,EACG,CAACA,GAAY,KAAM,OAAO,KAC9B,MAAMgJ,EAAsB7F,GAAe,EACrC8F,EAAkBjf,GAAkB4e,GAAgB,EAAE,EAC5D,cAAOK,EAAgB,UACvB,OAAOA,EAAgB,iBACvB,KAAK,uBAAuBvB,EAAQ,kCAAmCsB,EAAqB,CAC1F,UAAW,OAAO,SAASJ,GAAc,SAAS,EAC9C,OAAOA,EAAa,SAAS,EAC7B,KAAK,MAAMxmL,EAAU,OAAS,CAAC,CACzC,CAAK,EACM,CACL,OAAQ,mCACR,QAAS,EACT,SAAU,UACV,YAAa49K,EAAW,YACxB,KAAMA,EAAW,KACjB,OAAQ59K,EAAU,OAClB,WAAYA,EAAU,WACtB,iBAAkB49K,EAAW,KAAK,WAClC,UAAW,EACX,UAAW,OAAO,SAAS4I,GAAc,SAAS,EAC9C,OAAOA,EAAa,SAAS,EAC7B,KAAK,MAAMxmL,EAAU,OAAS,CAAC,EACnC,WAAY,OAAO,SAASwmL,GAAc,UAAU,EAAI,OAAOA,EAAa,UAAU,EAAI,KAAK,KAAI,EACnG,aAAcK,CACpB,CACE,CAEA,MAAM,kCAAkCrI,EAAe,GAAI,CAEzD,GADI,CAACA,GAAgB,OAAOA,GAAiB,UAAYA,EAAa,MAAQ,MAC1EA,EAAa,WAAa,UAAW,OAAO,KAChD,MAAMr/J,EAAQ,MAAM0+J,GAAwBW,EAAa,KAAMA,EAAa,aAAe,MAAM,EACjG,GAAI,CAACr/J,GAASA,EAAM,YAAc,GAAKA,EAAM,WAAa,aAAa,oBAAsB,EAAG,OAAO,KACvG,MAAMsB,EAAO,IAAI,WAAWtB,EAAM,UAAU,EAC5CsB,EAAK,IAAItB,CAAK,EACd,MAAMnf,EAAY,IAAI,aAAaygB,EAAK,MAAM,EAC9C,GAAI+9J,EAAa,QAAU,MAAQx+K,EAAU,SAAW,OAAOw+K,EAAa,MAAM,EAChF,MAAM,IAAI,MAAM,qDAAqDA,EAAa,MAAM,SAASx+K,EAAU,MAAM,EAAE,EAErH,MAAO,CACL,GAAI4nK,GAAkB4W,EAAa,cAAgB,CAAA,CAAE,EACrD,OAAQA,EAAa,cAAc,QAAU,kCAC7C,QAASA,EAAa,cAAc,SAAW,EAC/C,WAAY,OAAO,SAASA,EAAa,UAAU,EAAI,OAAOA,EAAa,UAAU,EAAI,KAAK,IAAG,EACjG,UAAW,OAAO,SAASA,EAAa,SAAS,EAC7C,OAAOA,EAAa,SAAS,EAC7B,KAAK,MAAMx+K,EAAU,OAAS,CAAC,EACnC,UAAWq9K,GAA6Br9K,CAAS,CACvD,CACE,CAEA,MAAM,yBAAyBxH,EAAU,GAAI,CAC3C,MAAM8sL,EAAS9sL,EAAQ,SAAW,KAC5BwR,EAAK,OAAOxR,EAAQ,IAAM,KAAK,WAAW,EAC1CosL,EAAiBpsL,EAAQ,mBAAqB,IAAS,CAAC,KAAK,cAAc,IAC7E,KACA,MAAM,KAAK,sBAAsB8sL,EAAQ,6BAA8B,CAAE,GAAAt7K,CAAE,EAAI,IAC/E,KAAK,aAAa,IAAIA,EAAI,CAAE,mBAAoB,EAAK,CAAE,CACxD,EACGm8K,EAAmBvB,EACrB,KAAK,iBAAiBU,EAAQ,+BAAgC,CAAE,GAAAt7K,CAAE,EAAI,IAAM,KAAK,2BAA2B46K,CAAc,CAAC,EAC3H,KACJ,GAAI,KAAK,yBAAyBpsL,CAAO,GAAK,KAAK,wBAA0B,EAAG,CAC9E,MAAMqrL,EAAmB,OAAOrrL,EAAQ,oBAAoB,EACtDsrL,EAAiB,KAAK,sBAC5B,WAAK,uBAAuBwB,EAAQ,qCAAsCvE,GAAe,EAAI,CAC3F,iBAAkB,OAAO,SAAS8C,CAAgB,EAAIA,EAAmB,KACzE,eAAAC,EACA,YAAa,KAAK,uBAC1B,CAAO,EACKtG,GAAiC,CACrC,MAAO,yBACP,iBAAkB,OAAO,SAASqG,CAAgB,EAAIA,EAAmB,KACzE,eAAAC,CACR,CAAO,CACH,CACA,GAAI,CAAC,KAAK,OACR,OAAO5N,GAA0BvB,GAAkB,QAAS,CAC1D,QAAS,CACP,GAAA3qK,EACA,UAAW,OAAO,SAASxR,EAAQ,SAAS,EACxC,OAAOA,EAAQ,SAAS,EACvB,OAAO2tL,GAAkB,SAAS,SAAS,SAAS,GAAK,KAAK,MACnE,UAAW,OAAO,SAAS3tL,EAAQ,SAAS,EAAI,OAAOA,EAAQ,SAAS,EAAI,KAAK,IAAG,EACpF,YAAa,KAAK,YAClB,SAAUulL,GAAyBvlL,EAAQ,UAAYA,EAAQ,MAAQA,EAAQ,KAAK,GAC/EulL,GAAyBoI,GAAkB,SAAS,SAAS,QAAQ,EAC1E,WAAY3tL,EAAQ,aAAe,GACnC,OAAQA,EAAQ,QAAU,QACpC,EACQ,mBAAoBA,EAAQ,oBACvB09K,GAA0BvB,GAAkB,cAAe,CAC5D,aAAc,KAAK,kBAAkBn8K,EAAQ,SAAW,CAAA,CAAE,CACtE,CAAW,EACH,YAAa2tL,GAAkB,SAAS,aAAe,KACvD,aAAcA,GAAkB,SAAS,cAAgB,KACzD,UAAW,MAAM,KAAK,sBAAsBb,EAAQ,4BAA6B,CAC/E,KAAM9sL,EAAQ,kBAAoB,IAC5C,EAAW,IAAM,KAAK,iCAAiCA,EAAS2tL,CAAgB,CAAC,CACjF,CAAO,EAEH,MAAMW,EAAY,OAAO,SAAStuL,EAAQ,SAAS,EAC/C,OAAOA,EAAQ,SAAS,EACvB,OAAO2tL,GAAkB,SAAS,SAAS,SAAS,GAAK,KAAK,MAC7Dl+B,EAAY,OAAO,SAASzvJ,EAAQ,SAAS,EAAI,OAAOA,EAAQ,SAAS,EAAI,KAAK,IAAG,EACrFuuL,EAAgB,OAAOvuL,EAAQ,eAAkB,SACnDA,EAAQ,cACP,OAAOA,EAAQ,oBAAoB,QAAW,SAC7CA,EAAQ,mBAAmB,OAC1B2tL,GAAkB,SAAS,aAAa,QAAU,QACnDa,EAAwBxuL,EAAQ,wBAA0B,GAC1DyuL,EAAuBD,EACzB,CACE,OAAQxuL,EAAQ,QAAU,eAC1B,sBAAuB,GACvB,cAAeA,EAAQ,eAAiB,CAAA,CAClD,EACQ,CACE,OAAQA,EAAQ,QAAU,eAC1B,sBAAuB,GACvB,cAAe,CACb,iBAAkB,GAClB,eAAgB,GAChB,GAAIA,EAAQ,eAAiB,EACzC,CACA,EACU0uL,EAA0B1uL,EAAQ,yBAA2B,IAAQA,EAAQ,cAAgB,GAC7Fw9K,EAAqBx9K,EAAQ,oBAC9B,MAAM,KAAK,sBAAsB8sL,EAAQ,gCAAiC,CAC3E,YAAa4B,EACb,sBAAAF,CACR,EAAS,IACDE,IACI,KAAK,OAAO,yCAA2C,KAAK,OAAO,oCAClE,KAAK,OAAO,0CAA0CD,CAAoB,GACxE,KAAK,OAAO,qCAAqCA,CAAoB,EACvE,KAAK,OAAO,mCAAmCA,CAAoB,GACjE,KAAK,OAAO,8BAA8BA,CAAoB,CACtE,EACGE,EAAuBnR,GAAoB,SAAW,CAAA,EACtDmI,EAAgB3lL,EAAQ,eAAiB2uL,EAAqB,eAAiB,KAC/En+B,EAAW+0B,GAAyBvlL,EAAQ,UAAYA,EAAQ,MAAQA,EAAQ,KAAK,GACtFulL,GAAyBoI,GAAkB,SAAS,SAAS,QAAQ,GACrEpI,GAAyBI,GAAe,UAAYA,GAAe,IAAI,GACvEJ,GAAyB,KAAK,QAAQ,wBAA0B,KAAK,QAAQ,sBAAsB,EAClGqJ,EAAmB5uL,EAAQ,mBAAqB,IAAQA,EAAQ,eAAiB,KACjF+rJ,EAAiB/rJ,EAAQ,iBAAmB,IAASA,EAAQ,cAAgB,KAC7E4qJ,EAAc,OAAO,UAAU,eAAe,KAAK5qJ,EAAS,aAAa,EAC3EA,EAAQ,YACR+rJ,EACE,MAAM,KAAK,sBAAsB+gC,EAAQ,wBAAyB,CAChE,OAAQyB,EACR,wBAAyBK,EAAmB,GAAQ5uL,EAAQ,0BAA4B,EACpG,EAAa,IAAM,KAAK,OAAO,sBAAsBuuL,EAAe,CACtD,qBAAsB,GACtB,wBAAyBK,EAAmB,GAAQ5uL,EAAQ,0BAA4B,GACxF,OAAQ,YACtB,CAAa,CAAC,EACJ,KACA6uL,EAAsB,KAAK,iBAAiB/B,EAAQ,uBAAwB,CAChF,eAAgBliC,GAAe,KAC/B,WAAYk7B,GAAsBl7B,CAAW,CACnD,EAAO,IAAOA,GAAe,KACnB,CACE,OAAQ2jC,EACR,KAAM3jC,CAClB,EACUwkB,GAAkBue,GAAkB,SAAS,aAAe,CAC1D,OAAQY,EACR,KAAM,IAClB,CAAW,CAAE,EACHvI,EAAe,OAAO,UAAU,eAAe,KAAKhmL,EAAS,cAAc,EAC7EA,EAAQ,aACR4uL,EACE,MAAM,KAAK,sBAAsB9B,EAAQ,kCAAmC,CAC1E,iBAAkB,OAAO,SAAS,OAAO9sL,EAAQ,oBAAoB,CAAC,EAClE,OAAOA,EAAQ,oBAAoB,EACnC,IAChB,EAAa,IAAM,KAAK,8BAA8B,CAC1C,GAAGA,EACH,QAAS8sL,EACT,OAAQ9sL,EAAQ,QAAU,cACtC,CAAW,CAAC,EACF,KACA8uL,EAAuB,KAAK,iBAAiBhC,EAAQ,wBAAyB,CAClF,kBAAmB9G,GAAgB,KACnC,iBAAkB,OAAOA,GAAc,kBAAoB,CAAC,GAAK,CACvE,EAAO,IAAOA,GAEJ5W,GAAkBue,GAAkB,SAAS,cAAgB,IAAI,CAAE,EACnE/9B,EAAY,MAAM,KAAK,sBAAsBk9B,EAAQ,4BAA6B,CACtF,KAAM9sL,EAAQ,kBAAoB,IACxC,EAAO,IAAM,KAAK,iCAAiC,CAC7C,GAAGA,EACH,4BAA6BA,EAAQ,8BAAgC,IAAQ4qJ,GAAe,IAClG,EAAO+iC,CAAgB,CAAC,EACdnnL,EAAU,KAAK,iBAAiBsmL,EAAQ,wBAAyB,CACrE,eAAA/gC,EACA,iBAAA6iC,CACN,EAAO,KAAO,CACR,QAAS,CACP,GAAAp9K,EACA,UAAA88K,EACA,UAAA7+B,EACA,YAAa,KAAK,YAClB,SAAAe,EACA,WAAYxwJ,EAAQ,aAAe,GACnC,OAAQA,EAAQ,QAAU,QAClC,EACM,YAAaA,EAAQ,aAAe,KAAK,eAAc,EACvD,sBAAuBA,EAAQ,uBAAyB,KAAK,eAAc,EAAG,WAC9E,QAASA,EAAQ,SAAW2uL,EAAqB,QACjD,cAAe3uL,EAAQ,eAAiB2uL,EAAqB,cAC7D,cAAAhJ,EACA,YAAakJ,EACb,aAAcC,EACd,UAAAl/B,EACA,mBAAA4tB,CACN,EAAM,EACIc,EAAW,KAAK,iBAAiBwO,EAAQ,0BAA2B,CAAA,EAAI,IAAMpP,GAA0BvB,GAAkB,QAAS31K,EAAS,CAChJ,OAAQ,gBACd,CAAK,CAAC,EACF,OAAA83K,EAAS,GAAK9sK,EACd8sK,EAAS,QAAQ,QAAQ,MAAQ,KAAK,iBAAiBwO,EAAQ,6BAA8B,CAC3F,aAAchH,GAAsB+I,GAAqB,IAAI,EAC7D,cAAe/I,GAAsBgJ,GAAsB,IAAI,CACrE,EAAO,IAAMjJ,GAAuBvH,CAAQ,EAAE,KAAK,EAC/C,OAAO,eAAeA,EAAU,0BAA2B,CACzD,MAAO1zB,GAAe,KACtB,WAAY,GACZ,aAAc,EACpB,CAAK,EACD,OAAO,eAAe0zB,EAAU,2BAA4B,CAC1D,MAAO0H,GAAgB,KACvB,WAAY,GACZ,aAAc,EACpB,CAAK,EACM1H,CACT,CAEA,2BAA2B73K,EAAW,GAAI,CACxC,OAAOg3K,GAA2Bh3K,EAAU01K,GAAkB,OAAO,CACvE,CAEA,MAAM,wBAAwBn8K,EAAU,GAAI,CAC1C,MAAM6C,EAASolL,GAAiCjoL,EAAQ,WAAaA,EAAQ,kBAAoB,KAAK,gBAAgB,EAEtH,GADI6C,EAAO,UAAY,IAAS7C,EAAQ,mBAAqB,IACzD,CAAC,KAAK,OAAQ,OAAO,KACzB,GAAI,CACF,MAAMw0J,EAAmB,CACvB,SAAU3xJ,EAAO,SACjB,UAAWA,EAAO,UAClB,MAAOA,EAAO,SACd,OAAQA,EAAO,UACf,cAAeA,EAAO,cACtB,eAAgBA,EAAO,eACvB,iBAAkBA,EAAO,iBACzB,cAAe,CACvB,EACY0qJ,EAAO,MAAM,KAAK,OAAO,8BAA8BiH,CAAgB,GACxE,MAAM,KAAK,OAAO,0BAA0B,CAC7C,OAAQ,MACR,OAAQ,SACR,MAAO3xJ,EAAO,SACd,OAAQA,EAAO,UACf,cAAeA,EAAO,cACtB,eAAgBA,EAAO,eACvB,iBAAkBA,EAAO,iBACzB,sBAAuB,GACvB,cAAe,CACzB,EAAW,CACD,SAAUA,EAAO,SACjB,UAAWA,EAAO,UAClB,cAAe,CACzB,CAAS,EACH,GAAI,CAAC0qJ,EAAM,OAAO,KAClB,MAAM5mI,EAAQ49J,GAAyBh3B,CAAI,EAC3C,GAAI1qJ,EAAO,SAAW,GAAK8jB,EAAQ9jB,EAAO,SAAU,OAAO,KAC3D,MAAMksL,EAAU,MAAM1G,GAAc96B,CAAI,EACxC,GAAI,CAACwhC,EAAS,OAAO,KACrB,MAAMn/B,EAAY,CAChB,KAAMrC,GAAM,MAAQ,YACpB,SAAU,WACV,MAAO1qJ,EAAO,SACd,OAAQA,EAAO,UACf,WAAY8jB,EACZ,QAAAooK,EACA,WAAY,KAAK,KAAI,CAC7B,EACM,YAAK,gCAAgCn/B,CAAS,EACvCA,CACT,OAAS3rJ,EAAO,CACd,eAAQ,KAAK,+CAAgDA,CAAK,EAC3D,IACT,CACF,CAEA,MAAM,oBAAoBjE,EAAU,GAAI,CACtC,GAAI,CAAC,KAAK,aAAa,SAAU,OAAO,KACxC,MAAM8sL,EAAS9sL,EAAQ,SAAW,KAC5Bs+K,EAAW,MAAM,KAAK,sBAAsBwO,EAAQ,6BAA8B,CACtF,eAAgB9sL,EAAQ,iBAAmB,GAC3C,iBAAkBA,EAAQ,mBAAqB,EACrD,EAAO,IAAM,KAAK,yBAAyBA,CAAO,CAAC,EACzCwR,EAAKg0K,GAAkBlH,CAAQ,EACrC,GAAI,CAAC9sK,EAAI,OAAO,KAChB8sK,EAAS,GAAK9sK,EACd,MAAM,KAAK,sBAAsBs7K,EAAQ,oBAAqB,CAC5D,GAAAt7K,EACA,MAAO8sK,EAAS,SAAS,SAAS,OAAS,KAC3C,aAAcwH,GAAsBxH,EAAS,SAAS,aAAa,IAAI,EACvE,cAAewH,GAAsBxH,EAAS,SAAS,cAAc,IAAI,CAC/E,EAAO,IAAM,KAAK,cAAc,MAAMA,CAAQ,CAAC,EAC3C,KAAK,eAAiBmH,GAAkBnH,CAAQ,GAAK,KAAK,IAAG,EAC7D,KAAK,iBAAmB,KACxB,KAAK,oBAAsB,KAC3B,KAAK,mBAAqB,KAC1B,MAAM0Q,EAAiB1Q,EAAS,2BAA6B,IACvD,OAAO,UAAU,eAAe,KAAKt+K,EAAS,cAAc,GAAKA,EAAQ,cAAgB,MACzFA,EAAQ,iBAAmB,IAASA,EAAQ,0BAA4B,GACxEivL,EAAe3Q,EAAS,0BAA4B,IACpD,OAAO,UAAU,eAAe,KAAKt+K,EAAS,aAAa,GAAKA,EAAQ,aAAe,KACvFkvL,EAAgC,OAAOlvL,EAAQ,oBAAoB,EACnEmvL,EAA8B,CAACH,GAChC,CAAC,OAAO,SAASE,CAA6B,GAC9CA,GAAiC,KAAK,sBACrC1C,EAAsB,KAAK,aAAa,iBAAmB,KAC3D,CAACwC,GAAkB,CAACG,GACpB7C,EAAqB,KAAK,aAAa,cAAgB,MACxD,KAAK,aAAa,QAAU,IAC5B,KAAK,aAAa,iBAAmB,GAEpCC,GADkB,KAAK,aAAa,eAAiB,IAAQD,IACtB,CAAC2C,EACxCxC,EAAiBF,GAAqBC,EACtCE,EAAyB,KAAK,aAAa,SAAW,KAC5D,YAAK,YAAc,CACjB,GAAG,KAAK,YACR,QAAS,GACT,OAAQD,EAAiB,QAAU,QACnC,MAAOA,EACP,aAAcF,EACd,eAAgBC,EAChB,QAASC,EAAkB,KAAK,aAAa,SAAW,KAAK,KAAI,EAAM,KACvE,QAASA,EAAiBC,EAAyB,KAAK,eACxD,OAAQpO,EAAS,SAAS,aAAa,QAAU,KAAK,YAAY,QAAU,KAC5E,cAAe,KACf,aAAc,KACd,QAAS,EACf,GAC2Bt+K,EAAQ,WAAa,IAAS,KAAK,WAAa,MAAQ,OAAOwR,CAAE,IAAM,OAAO,KAAK,SAAS,KAEjH,KAAK,UAAY,OAAOA,CAAE,EAC1B,KAAK,uBAAyB,IAEhC,MAAM,KAAK,sBAAsBs7K,EAAQ,4BAA6B,CACpE,GAAIxO,EAAS,SAAS,SAAS,aAAe,GAAQ,KAAO,OAAO9sK,CAAE,CAC5E,EAAO,IAAM,KAAK,uBAAuB8sK,EAAS,SAAS,SAAS,aAAe,GAAQ,KAAO,OAAO9sK,CAAE,CAAC,CAAC,EACzG,KAAK,MAAM,SAAU,CAAE,OAAQ,eAAgB,UAAWA,EAAI,OAAQ,KAAK,kBAAiB,CAAE,CAAE,EACzF8sK,CACT,CAEA,MAAM,uBAAuB73K,EAAW,GAAIzG,EAAU,CAAA,EAAI,CACxD,MAAMs+K,EAAW,KAAK,2BAA2B73K,CAAQ,EACnDD,EAAU83K,GAAU,SAAW,KACrC,GAAI,CAAC93K,GAAS,SAAS,GAAI,OAAO,KAC9BA,EAAQ,aAAa,MAAQ,KAAK,QAAQ,cAC5C,MAAM,KAAK,OAAO,YAAYA,EAAQ,YAAY,KAAM,CACtD,OAAQA,EAAQ,YAAY,OAC5B,WAAYxG,EAAQ,aAAe,GACnC,iBAAkBA,EAAQ,mBAAqB,GAC/C,WAAY,GACZ,MAAO,GACP,0BAA2B,GAC3B,sBAAuB,GACvB,iBAAkB,EAC1B,CAAO,EACD,KAAK,OAAO,yCAAyC,CACnD,OAAQA,EAAQ,QAAU,0BAC1B,mBAAoBwG,EAAQ,oBAAoB,SAAS,oBAAsB,IACvF,CAAO,GAEH,IAAI4oL,EAA+B,KAC/B5oL,EAAQ,cAAc,OACxB4oL,EAA+B,MAAM,KAAK,kCAAkC5oL,EAAQ,YAAY,EAC5F4oL,GAAgC5oL,EAAQ,oBAAoB,SAAWxG,EAAQ,4BAA8B,IAAS,KAAK,QAAQ,yBACrIwG,EAAQ,mBAAmB,QAAQ,mBAAqBwhL,GACtDxhL,EAAQ,mBAAmB,QAAQ,oBAAsB,CAAA,EACzD4oL,CACV,EACiBA,GAAgC,KAAK,QAAQ,2BACtD,KAAK,OAAO,0BAA0BA,EAA8B,CAClE,OAAQpvL,EAAQ,QAAU,2BAC1B,gBAAiBA,EAAQ,wBAA0B,EAC7D,CAAS,GAGDA,EAAQ,4BAA8B,IAASwG,EAAQ,oBAAsB,KAAK,QAAQ,yBAC5F,MAAM,KAAK,OAAO,yBAAyBA,EAAQ,mBAAoB,CACrE,GAAGxG,EACH,sBAAuBA,EAAQ,wBAA0B,GACzD,mBAAoB,GACpB,mBAAoB,EAC5B,CAAO,EACQwG,EAAQ,oBAAoB,SAAS,cAAgBxG,EAAQ,iBAAmB,IACzF,KAAK,gBAAgBwG,EAAQ,mBAAmB,QAAQ,aAAc,CACpE,OAAQ,UACR,OAAQxG,EAAQ,QAAU,iBAClC,CAAO,EAEH,KAAK,UAAY,OAAOwG,EAAQ,QAAQ,EAAE,EAC1C,KAAK,uBAAyB,GAC9B,KAAK,eAAiB,OAAOA,EAAQ,QAAQ,SAAS,GAAK,KAAK,IAAG,EACnE,KAAK,iBAAmB,KACxB,KAAK,oBAAsB,KAC3B,KAAK,mBAAqB,KAC1B,KAAK,YAAc,CACjB,GAAG,KAAK,YACR,QAAS,GACT,OAAQ,QACR,MAAO,GACP,aAAc,GACd,eAAgB,GAChB,QAAS,KACT,QAAS,KAAK,eACd,OAAQA,EAAQ,aAAa,QAAU,KAAK,YAAY,QAAU,KAClE,cAAe,KACf,aAAc,KACd,QAAS,EACf,EACI,MAAM6oL,EAAuB,KAAK,uBAAuB,CACvD,SAAU,GACV,eAAgB7oL,EAAQ,aAAa,MAAQ,MAAQA,EAAQ,aAAa,SAAW,KACrF,iBAAkBA,EAAQ,cAAc,MAAQ,MAAQA,EAAQ,cAAc,SAAW,IAC/F,CAAK,EAKD,GAJI6oL,GACF,KAAK,qBAAqBA,EAAsB,CAAE,UAAW,EAAK,CAAE,EAEtE,MAAM,KAAK,uBAAuBrvL,EAAQ,eAAiB,GAAO,KAAO,KAAK,SAAS,EACnFA,EAAQ,eAAiB,GAAM,CACjCwG,EAAQ,QAAQ,WAAa,GAC7BA,EAAQ,QAAQ,OAAS,WACzB,MAAM5E,EAAO87K,GAA0BvB,GAAkB,QAAS31K,CAAO,EACzE,OAAA5E,EAAK,GAAK4E,EAAQ,QAAQ,GAC1B,MAAM,KAAK,cAAc,MAAM5E,CAAI,EAC5BA,CACT,CACA,OAAO08K,CACT,CAWA,MAAM,yBAAyBt+K,EAAU,GAAI,CAC3C,GAAI,CAAC,KAAK,OACR,OAAO09K,GAA0BvB,GAAkB,cAAe,CAChE,aAAc,KAAK,kBAAkBn8K,EAAQ,SAAW,CAAA,CAAE,CAClE,EAAS,CACD,OAAQ,gBAChB,CAAO,EAEH,MAAMsvL,EAAgB,CACpB,GAAItvL,EAAQ,eAAiB,GAC7B,GAAIA,EAAQ,0BAA4B,GAAQ,CAAA,EAAK,CAAE,eAAgB,GAC7E,EACUuvL,EAAkB,CACtB,GAAGvvL,EACH,cAAAsvL,EACA,QAAStvL,EAAQ,SAAW,CAAA,CAClC,EAEI,OADgCA,EAAQ,yBAA2B,IAAQA,EAAQ,cAAgB,KACnE,KAAK,OAAO,yCAA2C,KAAK,OAAO,oCAC1F,MAAO,KAAK,OAAO,0CAA0CuvL,CAAe,GAC9E,KAAK,OAAO,qCAAqCA,CAAe,GAEhE,MAAO,KAAK,OAAO,mCAAmCA,CAAe,GACvE,KAAK,OAAO,8BAA8BA,CAAe,EAChE,CAYA,MAAM,kCAAkC9oL,EAAW,KAAMzG,EAAU,CAAA,EAAI,CACrE,GAAI,CAAC,KAAK,QAAQ,kCAAmC,OAAO,KAC5D,MAAMw9K,EAAqB/2K,GAAY,MAAM,KAAK,yBAAyBzG,CAAO,EAClF,OAAO,KAAK,OAAO,kCAAkCw9K,EAAoBx9K,CAAO,CAClF,CAWA,MAAM,oBAAoBmgC,EAAS,QAASngC,EAAU,CAAA,EAAI,CACxD,OAAK,KAAK,QAAQ,oBACX,KAAK,OAAO,oBAAoBmgC,EAAQ,CAC7C,GAAGngC,EACH,YAAaA,EAAQ,yBAA2B,GAAO,GAAQA,EAAQ,cAAgB,GACvF,qBAAsBA,EAAQ,uBAAyB,EAC7D,CAAK,EAL6C,IAMhD,CAWA,MAAM,uBAAuB2C,EAAQ3C,EAAU,GAAI,CACjD,OAAK,KAAK,QAAQ,YACX,KAAK,OAAO,YAAY2C,EAAQ,CACrC,GAAG3C,EACH,0BAA2BA,EAAQ,4BAA8B,EACvE,CAAK,EAJqC,IAKxC,CAEA,gBAAgByG,EAAW,GAAIzG,EAAU,CAAA,EAAI,CAC3C,MAAM8K,EAAQrE,GAAU,OAAS,OAAOA,EAAS,OAAU,SAAWA,EAAS,MAAQA,EACjFg9I,EAAY34I,GAAO,WAAa,OAAOA,EAAM,WAAc,SAAWA,EAAM,UAAY,CAAA,EACxF0kL,EAAoBxvL,EAAQ,4CAA8C,GAC5EyjJ,EACAgkC,GACAhkC,EACA34I,GAAO,QACNvI,GAAQ,KAAK,OAAO,WAAWA,CAAG,EAClCA,GAAQ,KAAK,OAAO,MAAMA,CAAG,CACtC,EACI,OAAO,KAAK,OAAO,QAAQitL,EAAmB,CAC5C,OAAQxvL,EAAQ,QAAU,UAC1B,OAAQA,EAAQ,QAAU,mBAC1B,cAAeA,EAAQ,eAAiB,EAC9C,CAAK,CACH,CAEA,MAAM,YAAYiuK,EAAY,KAAK,UAAWjuK,EAAU,CAAA,EAAI,CAC1D,GAAI,CAAC,KAAK,aAAa,UAAY,CAACiuK,EAAW,OAAO,KACtD,MAAM3oB,EAAS,MAAM,KAAK,cAAc,MAAM2oB,CAAS,EACvD,GAAI,CAAC3oB,EAAQ,CACX,MAAM87B,EAAY,KAAK,oBAAsB,MAAQ,OAAOnT,CAAS,IAAM,OAAO,KAAK,kBAAkB,EACnGwhB,EAAiBzvL,EAAQ,iBAAmB,GAClD,OAAIohL,GAAaqO,GACf,KAAK,uBAAyB,GAC9B,KAAK,6BAA6B,wBAAwBxhB,CAAS,mBAAoB,CACrF,UAAAA,EACA,OAAQ,0BAClB,CAAS,GACQmT,IACT,KAAK,uBAAyB,GAC9B,KAAK,oBAAsB,MAEtB,IACT,CACA,KAAK,uBAAyB,GAC9B,KAAK,oBAAsB,KAC3B,KAAK,UAAY,OAAOnT,CAAS,EACjC,MAAM/kC,EAAW,MAAM,KAAK,uBAAuBoc,EAAQ,CAAE,kBAAmB,GAAM,EACtF,OAAI,KAAK,oBAAsB,MAAQ,OAAO2oB,CAAS,IAAM,OAAO,KAAK,kBAAkB,IACzF,KAAK,QAAQ,UAAU,WAAW,sBAAmB,EACrD,KAAK,QAAQ,WAAW,MAAM,WAAW,GAAG,sBAAmB,EAC3D,KAAK,QAAQ,8BAA8B,YAC7C,KAAK,OAAO,6BAA6B,UAAU,aAAe,OAG/D/kC,CACT,CAEA,iBAAiBlpI,EAAU,GAAI,EAE3B,OAAO,UAAU,eAAe,KAAKA,EAAS,uBAAuB,GAClE,OAAO,UAAU,eAAe,KAAKA,EAAS,gBAAgB,KAEjE,KAAK,sBAAwB2oL,GAC3B3oL,EAAQ,uBAAyBA,EAAQ,cACjD,GAEQ,OAAO,UAAU,eAAe,KAAKA,EAAS,2BAA2B,IAC3E,KAAK,0BAA4BooL,GAC/BpoL,EAAQ,0BACR4mL,EACR,GAEQ,OAAO,UAAU,eAAe,KAAK5mL,EAAS,uBAAuB,IACvE,KAAK,sBAAwBooL,GAC3BpoL,EAAQ,sBACR6mL,EACR,IAGM,OAAO,UAAU,eAAe,KAAK7mL,EAAS,kBAAkB,GAC7D,OAAO,UAAU,eAAe,KAAKA,EAAS,WAAW,KAE5D,KAAK,iBAAmBioL,GAAiCjoL,EAAQ,kBAAoBA,EAAQ,SAAS,GAExG,MAAM0vL,EAAa1vL,EAAQ,IAAMA,EAAQ,WAAa,KAAK,WAAa,KAAK,oBAAsB,KACnG,YAAK,WAAammL,GAA2BnmL,CAAO,EAChD0vL,GAAc,MAAQA,IAAe,IACvC,KAAK,UAAY,OAAOA,CAAU,EAClC,KAAK,mBAAqB,OAAOA,CAAU,GACjC,KAAK,YACf,KAAK,UAAY,OAAO,KAAK,UAAS,CAAE,EACxC,KAAK,mBAAqB,MAE5BtJ,GAAqB,KAAK,UAAW,KAAK,UAAU,EAC7C,CACL,UAAW,KAAK,UAChB,mBAAoB,KAAK,mBACzB,uBAAwB,KAAK,sBACnC,CACE,CAEA,MAAM,qBAAqBpmL,EAAU,GAAI,CACvC,GAAI,CAAC,KAAK,aAAa,SAAU,OAAO,KACxC,GAAIA,EAAQ,UAAY,GACtB,OAAIA,EAAQ,sBAAwB,IAClC,MAAM,KAAK,YAAY,CACrB,GAAGA,EACH,GAAIA,EAAQ,IAAM,KAAK,WAAa,KAAK,oBAAsB,MACzE,CAAS,EAEI,KAET,GAAI,KAAK,oBAAsB,KAAK,aAAc,CAChD,MAAM2vL,EAA0B3vL,EAAQ,sBAAwB,GAC1DkpI,EAAW,MAAM,KAAK,YAAY,KAAK,mBAAoB,CAC/D,eAAgB,CAACymD,CACzB,CAAO,EACD,OAAIzmD,IACA,KAAK,uBAA+B,KACpClpI,EAAQ,sBAAwB,GAC3B,KAAK,YAAY,CACtB,GAAGA,EACH,GAAI,KAAK,mBACT,cAAeA,EAAQ,eAAiBA,EAAQ,oBAAoB,MAC9E,CAAS,EAEI,KACT,CACA,GAAI,KAAK,UAAW,CAClB,MAAMkpI,EAAW,MAAM,KAAK,YAAY,KAAK,SAAS,EACtD,GAAIA,EAAU,OAAOA,EACrB,GAAIlpI,EAAQ,sBAAwB,GAClC,OAAO,KAAK,YAAY,CACtB,GAAGA,EACH,GAAI,KAAK,UACT,cAAeA,EAAQ,eAAiBA,EAAQ,oBAAoB,MAC9E,CAAS,CAEL,CACA,OAAO,IACT,CAEA,MAAM,gBAAgBA,EAAU,GAAI,CAClC,GAAI,CAAC,KAAK,aAAa,SAAU,OAAO,KACxC,MAAM8sJ,EAAa,KAAK,WAAa,KACjC9sJ,EAAQ,gBAAkB,IAAS8sJ,GACrC,MAAM,KAAK,8BAA8B,CACvC,GAAG9sJ,EACH,OAAQA,EAAQ,qBAAuBA,EAAQ,QAAU,gBACjE,CAAO,EAEH,MAAMwR,EAAK,OAAOxR,EAAQ,IAAO,UAAYA,EAAQ,GAAG,KAAI,EAAKA,EAAQ,GAAG,KAAI,EAAK,OAAO,KAAK,WAAW,EACtGwwJ,EAAW+0B,GAAyBvlL,EAAQ,UAAYA,EAAQ,MAAQA,EAAQ,KAAK,EAC3F,YAAK,UAAYwR,EACjB,KAAK,mBAAqB,KAC1B,KAAK,uBAAyB,GAC9B40K,GAAqB50K,EAAI,CACvB,GAAG,KAAK,WACR,QAASxR,EAAQ,oBAAsB,EAC7C,CAAK,EACD,MAAM,KAAK,uBAAuBwR,CAAE,EAChCxR,EAAQ,qBAAuB,IACjC,MAAM,KAAK,YAAY,CACrB,GAAGA,EACH,GAAAwR,EACA,SAAAg/I,EACA,SAAU,GACV,cAAexwJ,EAAQ,eAAiBA,EAAQ,oBAAoB,MAC5E,CAAO,EAEI,CACL,GAAAwR,EACA,WAAAs7I,EACA,SAAA0D,EACA,OAAQ,CAAE,UAAW,KAAK,SAAS,CACzC,CACE,CAEA,MAAM,8BAA8BxwJ,EAAU,GAAI,CAChD,GAAI,CAAC,KAAK,aAAa,UAAY,CAAC,KAAK,UACvC,MAAO,CAAE,QAAS,GAAO,QAAS,GAAM,OAAQ,mBAAmB,EAErE,MAAM8sJ,EAAa,KAAK,UACxB,GAAI,CACF,MAAMpoJ,EAAS,MAAM,KAAK,MAAM,CAC9B,GAAG1E,EACH,GAAI8sJ,EACJ,OAAQ9sJ,EAAQ,QAAU,iBAC1B,eAAgBA,EAAQ,yBAA2B,GACnD,iBAAkBA,EAAQ,2BAA6B,GACvD,sBAAuBA,EAAQ,gCAAkC,GACjE,iBAAkB,OAAO,UAAU,eAAe,KAAKA,EAAS,0BAA0B,EACtFA,EAAQ,yBACR,OACJ,UAAWA,EAAQ,4BAA8B,GAAQ,OAAY,CAAE,QAAS,EAAK,EACrF,0BAA2B,EACnC,CAAO,EACD,MAAO,CAAE,QAAS,GAAM,WAAA8sJ,EAAY,OAAApoJ,CAAM,CAC5C,OAAST,EAAO,CACd,MAAMwH,EAAS,CACb,MAAAxH,EACA,WAAA6oJ,EACA,OAAQ,KAAK,kBAAiB,EAC9B,OAAQ9sJ,EAAQ,QAAU,gBAClC,EACM,IAAI4sJ,EAAY5sJ,EAAQ,uBAAyB,IAC5CA,EAAQ,0BAA4B,IACpCA,EAAQ,2BAA6B,GAI1C,GAHI,CAAC4sJ,GAAa,OAAO5sJ,EAAQ,wBAA2B,aAC1D4sJ,EAAY,MAAM5sJ,EAAQ,uBAAuByL,CAAM,IAAM,IAE3DmhJ,EACF,eAAQ,KAAK,6EAA8E,CACzF,WAAAE,EACA,MAAA7oJ,CACV,CAAS,EACM,CAAE,QAAS,GAAO,UAAW,GAAM,WAAA6oJ,EAAY,MAAA7oJ,CAAK,EAE7D,MAAM2rL,EAAU,IAAI,MAClB,kEAAkE9iC,CAAU,yBAC5E,CAAE,MAAO7oJ,CAAK,CACtB,EACM,MAAA2rL,EAAQ,KAAO,oCACfA,EAAQ,kBAAoB9iC,EACtB8iC,CACR,CACF,CAEA,MAAM,sBAAsB5vL,EAAU,GAAI,CACxC,MAAM61J,EAAc,CAClB,GAAG71J,EACH,uBAAwBA,EAAQ,yBAA2B,EACjE,EACQ61J,EAAY,mBAAqB,IAAQ,CAAC,OAAO,SAAS,OAAOA,EAAY,oBAAoB,CAAC,IACpGA,EAAY,qBAAuB,KAAK,uBAE1C,MAAMi3B,EAASj3B,EAAY,SAAW,KAAK,yBAAyBA,CAAW,EAC/EA,EAAY,QAAUi3B,EACtB,GAAI,CACF,GAAI,KAAK,yBAAyBj3B,CAAW,GAAK,KAAK,wBAA0B,EAAG,CAClF,KAAK,uBAAuBi3B,EAAQ,0BAA2BvE,GAAe,EAAI,CAChF,iBAAkB,OAAO1yB,EAAY,oBAAoB,GAAK,KAC9D,eAAgB,KAAK,sBACrB,YAAa,KAAK,uBAC5B,CAAS,EACD,MAAMnxJ,EAAS,KAAK,2BAA2BmxJ,CAAW,EAC1D,YAAK,yBAAyBi3B,EAAQj3B,EAAa,CAAE,OAAQ,YAAa,EACnEnxJ,CACT,CACI,KAAK,yBAAyBmxJ,CAAW,IAC3C,KAAK,uBAAuBi3B,EAAQ,yBAA0BvE,GAAe,EAAI,CAC/E,iBAAkB,OAAO1yB,EAAY,oBAAoB,GAAK,KAC9D,eAAgB,KAAK,qBAC/B,CAAS,EACD,OAAO,OAAOA,EAAa,KAAK,8BAA8BA,CAAW,CAAC,EACtEi3B,IAAQA,EAAO,qBAAuB,OAAO,SAAS,OAAOj3B,EAAY,oBAAoB,CAAC,EAC9F,OAAOA,EAAY,oBAAoB,EACvCi3B,EAAO,uBAEb,MAAM+C,EAAQ,MAAM,KAAK,sBAAsB/C,EAAQ,wBAAyB,CAC9E,eAAgBj3B,EAAY,iBAAmB,GAC/C,iBAAkBA,EAAY,mBAAqB,EAC3D,EAAS,IAAM,KAAK,oBAAoBA,CAAW,CAAC,EAC9C,OAAIg6B,GACF,KAAK,yBAAyB,eAAgB,CAC5C,GAAIrK,GAAkBqK,CAAK,GAAK7vL,EAAQ,IAAM,KAAK,WAAa,KAChE,OAAQA,EAAQ,QAAU,KAC1B,eAAgBA,EAAQ,iBAAmB,GAC3C,iBAAkBA,EAAQ,mBAAqB,EACzD,CAAS,EAEH,KAAK,yBAAyB8sL,EAAQj3B,EAAa,CAAE,OAAQg6B,EAAQ,QAAU,UAAW,EACnFA,CACT,OAAS5rL,EAAO,CACd,GAAIghL,GAA6BhhL,CAAK,EACpC,YAAK,2BAA2B4xJ,CAAW,EAC3C,KAAK,yBAAyBi3B,EAAQj3B,EAAa,CACjD,OAAQ5xJ,EAAM,QAAQ,MAAQ,aAAaA,EAAM,OAAO,KAAK,GAAK,WAC5E,CAAS,EACM,KAET,WAAK,yBAAyB6oL,EAAQj3B,EAAa,CAAE,OAAQ,QAAS,MAAA5xJ,EAAO,EACvEA,CACR,CACF,CAEA,MAAM,YAAYjE,EAAU,GAAI,CAC9B,GAAI,CAAC,KAAK,aAAa,SAAU,OAAO,KACxC,MAAM61J,EAAc,CAClB,GAAG71J,EACH,uBAAwBA,EAAQ,yBAA2B,EACjE,EACI,OAAO,KAAK,oBAAoB,IAAM,KAAK,sBAAsB61J,CAAW,EAAGA,CAAW,CAC5F,CAEA,MAAM,WAAWrkJ,EAAI,CACnB,GAAI,CAAC,KAAK,aAAa,UAAY,CAACA,EAAI,OAAO,KAC/C,MAAM8zI,EAAS,MAAM,KAAK,cAAc,MAAM9zI,CAAE,EAChD,OAAI8zI,EAAe,KAAK,2BAA2BA,CAAM,EAClD,IACT,CAEA,MAAM,aAAatlJ,EAAU,GAAI,CAC/B,GAAI,CAAC,KAAK,aAAa,SAAU,MAAO,CAAA,EACxC,MAAMy/K,EAAU,MAAM,KAAK,cAAc,SAAM,GAAQ,CAAA,EACjDZ,EAAc7+K,EAAQ,aAAe,KAAK,aAAe,KACzDqmJ,EAAWo5B,EACd,OAAQryJ,GAAUA,GAAO,OAAS,oBAC9BA,GAAO,OAAS,wBAChBA,GAAO,OAAS,yBAChB,CAAC,OAAOA,GAAO,IAAM,EAAE,EAAE,WAAW,qCAAqC,CAAC,EAC9E,IAAKA,GAAU,KAAK,2BAA2BA,CAAK,CAAC,EACrD,OAAQA,GAAU,CACjB,GAAIptB,EAAQ,uBAAyB,IAAQ6+K,GAAe,KAAM,MAAO,GACzE,MAAMiR,EAAiB1iK,GAAO,SAAS,SAAS,aAAe,KAC/D,OAAI0iK,GAAkB,KAAajR,IAAgB,WAAa7+K,EAAQ,wBAA0B,GAC3F,OAAO8vL,CAAc,IAAM,OAAOjR,CAAW,CACtD,CAAC,EACA,OAAQzxJ,GAAUptB,EAAQ,kBAAoB,IAAQotB,EAAM,QAAQ,QAAQ,aAAe,EAAK,EAChG,KAAK,CAACnT,EAAGC,KAAOurK,GAAkBvrK,CAAC,GAAK,IAAMurK,GAAkBxrK,CAAC,GAAK,EAAE,EAC3E,OAAO,OAAO,SAASja,EAAQ,KAAK,EAChCqmJ,EAAS,MAAM,EAAG,KAAK,IAAI,EAAG,OAAOrmJ,EAAQ,KAAK,CAAC,CAAC,EACpDqmJ,CACN,CAEA,MAAM,qBAAqBrmJ,EAAU,GAAI,CACvC,GAAI,CAAC,KAAK,aAAa,SAAU,MAAO,CAAA,EACxC,MAAM+uJ,EAAmB/uJ,EAAQ,kBAAoB,KAAK,WAAa,KAEvE,OADiB,MAAM,KAAK,aAAaA,CAAO,GAChC,IAAKslJ,GAAWogC,GAA2BpgC,EAAQ,CAAE,iBAAAyJ,CAAgB,CAAE,CAAC,CAC1F,CAEA,MAAM,kBAAkB/uJ,EAAU,GAAI,CACpC,GAAI,CAAC,KAAK,aAAa,SAAU,MAAO,CAAA,EACxC,MAAM+uJ,EAAmB/uJ,EAAQ,kBAAoB,KAAK,WAAa,KACjE+vL,EAAe,MAAM,KAAK,uBAAsB,EAChDC,EAAmBD,EAAe,MAAM,KAAK,WAAWA,CAAY,EAAI,KAOxEpvE,GANY,MAAM,KAAK,qBAAqB,CAChD,GAAG3gH,EACH,gBAAiBA,EAAQ,kBAAoB,GAC7C,MAAO,OACP,iBAAA+uJ,CACN,CAAK,GAC0B,OAAQ3hI,GAC7B,CAACA,GAAO,IACRptB,EAAQ,iBAAmB,IAAS+uJ,GAAoB,MAAQ,OAAO3hI,EAAM,EAAE,IAAM,OAAO2hI,CAAgB,EAAU,GACnH3hI,EAAM,aAAe,IAASptB,EAAQ,kBAAoB,EAClE,EACD,OACEgwL,GAAkB,SAAS,SAAS,IACjCA,EAAiB,QAAQ,QAAQ,aAAe,IAChD,CAACrvE,EAAS,KAAMvzF,GAAU,OAAOA,EAAM,EAAE,IAAM,OAAO4iK,EAAiB,QAAQ,QAAQ,EAAE,CAAC,GAC1F,EAAEhwL,EAAQ,iBAAmB,IAAS+uJ,GAAoB,MAAQ,OAAOihC,EAAiB,QAAQ,QAAQ,EAAE,IAAM,OAAOjhC,CAAgB,IAE5IpuC,EAAS,QAAQ+kE,GAA2BsK,EAAkB,CAAE,iBAAAjhC,CAAgB,CAAE,CAAC,EAE9E,OAAO,SAAS/uJ,EAAQ,KAAK,EAChC2gH,EAAS,MAAM,EAAG,KAAK,IAAI,EAAG,OAAO3gH,EAAQ,KAAK,CAAC,CAAC,EACpD2gH,CACN,CAEA,MAAM,gBAAgB3gH,EAAU,GAAI,CAElC,GADI,CAAC,KAAK,aAAa,UACnB,KAAK,mBAAoB,OAAO,KACpC,MAAMqmJ,EAAW,MAAM,KAAK,kBAAkBrmJ,CAAO,EAC/C+wF,EAAQs1D,EAAS,CAAC,GAAK,KAC7B,OAAKt1D,GAAO,GACL,CACL,QAAS,GACT,UAAWA,EAAM,GACjB,OAAQ,SACR,UAAWA,EAAM,WAAa,KAC9B,cAAeq+E,GAAkBr+E,EAAM,aAAa,EACpD,SAAUq+E,GAAkB/oB,CAAQ,CAC1C,EAR2B,IASzB,CAEA,MAAM,cAAc4nB,EAAWjuK,EAAU,GAAI,CAC3C,OAAK,KAAK,aAAa,SAChB,KAAK,YAAYiuK,GAAa,KAAK,SAAS,EADX,IAE1C,CAEA,MAAM,eAAegiB,EAAmBjwL,EAAU,GAAI,CACpD,OAAK,KAAK,aAAa,SACnB,OAAOiwL,GAAsB,SAAiB,KAAK,YAAYA,CAAiB,EAChFA,EAA0B,KAAK,uBAAuBA,EAAmBjwL,CAAO,EAC7E,KAHiC,IAI1C,CAEA,MAAM,cAAcwR,EAAI,CACtB,GAAI,CAAC,KAAK,aAAa,UAAY,CAACA,EAAI,MAAO,GAC/C,MAAM0+K,EAAe,MAAM,KAAK,cAAc,MAAM1+K,CAAE,EAClD,KAAK,cAAc,QAAQ,MAAM,KAAK,aAAa,OAAOA,CAAE,EAChE,MAAMu+K,EAAe,MAAM,KAAK,uBAAsB,EACtD,OAAIA,GAAgB,MAAQ,OAAOA,CAAY,IAAM,OAAOv+K,CAAE,GAC5D,MAAM,KAAK,uBAAuB,IAAI,EAEjC,EAAQ0+K,CACjB,CAEA,MAAM,oBAAoB1+K,EAAK,KAAK,UAAW,CAC7C,GAAI,CAAC,KAAK,aAAa,UAAY,CAACA,EAAI,OAAO,KAC/C,MAAMi1I,EAAU,MAAM,KAAK,WAAWj1I,CAAE,EACxC,GAAI,CAACi1I,EAAS,OAAO,KACrBA,EAAQ,QAAQ,QAAQ,WAAa,GACrCA,EAAQ,QAAQ,QAAQ,OAAS,WACjC,MAAM63B,EAAWZ,GAA0BvB,GAAkB,QAAS11B,EAAQ,OAAO,EACrF63B,EAAS,GAAK73B,EAAQ,QAAQ,QAAQ,GACtC,MAAM,KAAK,cAAc,MAAM63B,CAAQ,EACvC,MAAMyR,EAAe,MAAM,KAAK,uBAAsB,EACtD,OAAIA,GAAgB,MAAQ,OAAOA,CAAY,IAAM,OAAOv+K,CAAE,GAAG,MAAM,KAAK,uBAAuB,IAAI,EAChG8sK,CACT,CAEA,MAAM,gCAAgCt+K,EAAU,GAAI,CAClD,MAAMsG,EAAUtG,EAAQ,SAAW,KAAK,QAAQ,SAAW,KACrDmwL,EAAW,KAAK,QAAQ,gCAAgC7pL,CAAO,GAAK,KAC1E,OAAK6pL,GAAU,SAAS,cACxB,KAAK,gBAAgBA,EAAS,QAAQ,aAAc,CAClD,OAAQ,UACR,OAAQnwL,EAAQ,QAAU,0BAChC,CAAK,EACMmwL,GALsC,IAM/C,CAEA,MAAM,MAAMnwL,EAAU,GAAI,CACpB,KAAK,wBACP,aAAa,KAAK,qBAAqB,EACvC,KAAK,sBAAwB,MAE/B,MAAMk4F,EAAU,KAAK,yBAA2B,CAAA,EAChD,KAAK,wBAA0B,KAC/B,MAAM29D,EAAc71J,EAAQ,4BAA8B,GACtD,CAAE,GAAGk4F,EAAS,GAAGl4F,CAAO,EACxB,CAAE,GAAGA,CAAO,EAChB,OAAO61J,EAAY,0BACnB,MAAM+2B,EAAc,KAAK,mCAAkC,EAC3D,GACE/2B,EAAY,cAAgB,IACzB+2B,EAAY,KAAO,GACnB/2B,EAAY,iBAAmB,IAC/BA,EAAY,mBAAqB,IACjCA,EAAY,wBAA0B,GAEzC,GAAI,CACF,OAAO,MAAM,KAAK,oBAAoB,IAAM,KAAK,6BAA6B,CAC5E,GAAGA,EACH,GAAIA,EAAY,IAAM,KAAK,WAAa,MAClD,EAAW+2B,CAAW,EAAG/2B,CAAW,CAC9B,OAAS5xJ,EAAO,CACd,WAAK,mCAAmC2oL,CAAW,EAC7C3oL,CACR,CAEF,OAAI2oL,EAAY,KAAO,GAAG,KAAK,mCAAmCA,CAAW,EACtE,KAAK,YAAY,CACtB,GAAG/2B,EACH,GAAIA,EAAY,IAAM,KAAK,WAAa,OACxC,cAAeA,EAAY,eAAiBA,EAAY,SAAS,QAAUA,EAAY,oBAAoB,OAC3G,uBAAwBA,EAAY,yBAA2B,EACrE,CAAK,CACH,CAEA,MAAM,KAAK71J,EAAU,GAAI,CACvB,MAAMowL,EAAoB,OAAO,UAAU,eAAe,KAAKpwL,EAAS,gBAAgB,EAClFqwL,EAAsB,OAAO,UAAU,eAAe,KAAKrwL,EAAS,kBAAkB,EACtFswL,EAAsB,OAAO,UAAU,eAAe,KAAKtwL,EAAS,kBAAkB,EACtF+rJ,EAAiBqkC,EACnBpwL,EAAQ,iBAAmB,GAC1B,KAAK,aAAa,eAAiB,IAAQ,KAAK,aAAa,SAAW,KACvE4uL,EAAmByB,EACrBrwL,EAAQ,mBAAqB,GAC7B,KAAK,aAAa,iBAAmB,GACzC,OAAO,KAAK,MAAM,CAChB,GAAGA,EACH,eAAA+rJ,EACA,iBAAA6iC,EACA,iBAAkB0B,EACdtwL,EAAQ,iBACP+rJ,EAAiB,OAAS,EACrC,CAAK,CACH,CAEA,MAAM,cAAc/rJ,EAAU,GAAI,CAUhC,GATI,KAAK,4BACP,aAAa,KAAK,yBAAyB,EAC3C,KAAK,0BAA4B,MAEnC,KAAK,mCAAqC,KACtC,KAAK,wBACP,aAAa,KAAK,qBAAqB,EACvC,KAAK,sBAAwB,MAE3BA,EAAQ,QAAU,IAAS,KAAK,aAAa,QAAU,GAAM,OAAO,KAAK,kBAAiB,EAC9F,MAAMk4F,EAAU,KAAK,yBAA2B,CAAA,EAChD,OAAO,KAAK,MAAM,CAChB,GAAGl4F,EACH,OAAQA,EAAQ,QAAU,yBAC1B,SAAU,GACV,iBAAkB,OAAO,UAAU,eAAe,KAAKA,EAAS,kBAAkB,EAC9EA,EAAQ,iBACPk4F,EAAQ,kBAAoB,OACjC,0BAA2B,EACjC,CAAK,CACH,CAEA,SAAU,CACJ,KAAK,2BAA2B,aAAa,KAAK,yBAAyB,EAC/E,KAAK,mCAAqC,KACtC,KAAK,uBAAuB,aAAa,KAAK,qBAAqB,EACvE,KAAK,wBAA0B,KAC/B,UAAWmc,KAAW,KAAK,+BAA+B,OAAO,CAAC,EAAGA,IAAO,EAC5E,KAAK,OAAO,oBAAoB,SAAU,KAAK,eAAe,CAChE,CAEA,MAAM51F,EAAMhT,EAAQ,CAClB,KAAK,cAAc2iK,GAAkB3vJ,EAAMhT,CAAM,CAAC,CACpD,CACF,CAQO,MAAM8kL,WAA4BxG,EAAqB,CAC5D,YAAY/pL,EAAU,GAAI,CACxB,MAAM,CACJ,GAAGA,EACH,KAAM,QACN,WAAY,GACZ,SAAU,GACV,QAAS,GACT,aAAc,IACpB,CAAK,CACH,CACF,CAQO,MAAMwwL,WAA8BzG,EAAqB,CAC9D,YAAY/pL,EAAU,GAAI,CACxB,MAAMywL,EAAmBzwL,EAAQ,UAAU,WAAaA,EAAQ,WAAa,WAAW,WAAa,KAC/Fm/K,EAAQn/K,EAAQ,cAAgB,IAAImpL,GAAa,CACrD,MAAOnpL,EAAQ,YAAc,IAAS,CAACywL,EACnC,KACA,IAAIxR,GAAsB,CAAE,GAAIj/K,EAAQ,UAAY,CAAA,EAAK,UAAWywL,EAAkB,EAC1F,QAASzwL,EAAQ,SAAW,WAAW,cAAgBo/K,GAAmB,CAChF,CAAK,EACD,MAAM,CACJ,GAAGp/K,EACH,KAAM,UACN,WAAY,GACZ,SAAU,GACV,QAASA,EAAQ,iBAAmB,GACpC,aAAcm/K,CACpB,CAAK,EACG,KAAK,WAAan/K,EAAQ,UAAY,KAAO,KAAK,MAAQ,KAAK,YAAY,KAAK,SAAS,EAC/F,CACF,CAQO,MAAM0wL,WAA6B3G,EAAqB,CAC7D,YAAY/pL,EAAU,GAAI,CACxB,MAAM2wL,EAAS3wL,EAAQ,QAAU,CAAA,EACjC,MAAM,CACJ,GAAGA,EACH,KAAM,SACN,WAAY,GACZ,SAAU,GACV,QAASA,EAAQ,iBAAmB,GACpC,OAAQ,GACR,aAAc,IAAImpL,GAAa,CAC7B,MAAO,CACL,IAAM7jC,GAAWqrC,EAAO,aAAarrC,CAAM,GAAKqrC,EAAO,cAAcrrC,CAAM,EAC3E,IAAM9zI,GAAOm/K,EAAO,aAAan/K,CAAE,GAAKm/K,EAAO,cAAcn/K,CAAE,EAC/D,OAAQ,IAAMm/K,EAAO,eAAY,GAAQ,CAAA,EACzC,OAASn/K,GAAOm/K,EAAO,gBAAgBn/K,CAAE,GAAK,GAC9C,uBAAyBqtK,GAAgB8R,EAAO,yBAAyB9R,CAAW,GAAK,KACzF,uBAAwB,CAACrtK,EAAIqtK,IAAgB8R,EAAO,yBAAyBn/K,EAAIqtK,CAAW,GAAMrtK,GAAM,IAClH,CACA,CAAO,CACP,CAAK,EACD,KAAK,OAASm/K,EACV,KAAK,WAAa3wL,EAAQ,UAAY,KAAO,KAAK,MAAQ,KAAK,YAAY,KAAK,SAAS,EAC/F,CACF,CAQO,SAAS4wL,GAA2B/tL,EAAS,OAAWgJ,EAAU,CAAA,EAAI,CAC3E,GACEhJ,GACG,OAAOA,GAAW,WAEnB,OAAOA,EAAO,mBAAsB,YACjC,OAAOA,EAAO,aAAgB,YAC9B,OAAOA,EAAO,MAAS,YACvBA,EAAO,cAGZ,MAAI,CAACA,EAAO,QAAUgJ,EAAQ,SAAQhJ,EAAO,OAASgJ,EAAQ,QACvDhJ,EAET,GAAIA,IAAW,IAASA,GAAU,KAAM,OAAO,IAAI0tL,GAAoB1kL,CAAO,EAC9E,GAAIhJ,IAAW,GAAM,OAAO,IAAI2tL,GAAsB3kL,CAAO,EAC7D,MAAM7L,EAAU6C,GAAU,OAAOA,GAAW,SAAW,CAAE,GAAGA,CAAM,EAAK,CAAA,EACjE4b,EAAO,OAAOze,EAAQ,MAAQA,EAAQ,MAAQ,EAAE,EAAE,YAAW,EAC7D4L,EAAS,CACb,GAAGC,EACH,GAAG7L,EACH,UAAWA,EAAQ,WAAaA,EAAQ,IAAM6L,EAAQ,WAAa,IACvE,EACE,OAAI4S,IAAS,UAAYze,EAAQ,OAAe,IAAI0wL,GAAqB9kL,CAAM,EAC3E6S,IAAS,SAAWA,IAAS,SAAiB,IAAI8xK,GAAoB3kL,CAAM,EACzE,IAAI4kL,GAAsB5kL,CAAM,CACzC,CCr5GA,KAAM,CACJ,wBAAA9G,GACA,oBAAAE,GACA,qBAAAC,GACA,6BAAAC,GACA,qBAAAK,EACF,EAAIE,GACEorL,GAAuC,EACvCC,GAA8C,EAAI,KAAO,KAEzDC,GAA4B,OAC5BC,GAAqC,cACrCC,GAAmC,YACnClb,GAAgC,UAChCmb,GAA6B,OAAO,OAAO,CAC/C,MAAO,mBACP,MAAO,kBACP,UAAW,EACX,uBAAwB,EACxB,kBAAmB,GACnB,WAAY,IACd,CAAC,EAED,SAASC,IAA4B,CACnC,MAAO,CACL,OAAQ,GACR,MAAO,GACP,YAAa,GACb,YAAa,GACb,YAAa,KACb,iBAAkB,KAClB,YAAa,KACb,UAAW,KACX,eAAgB,EAChB,eAAgB,EAChB,yBAA0B,KAC1B,SAAU,IAAI,GAClB,CACA,CAEA,SAASC,GAAiBjlI,EAAW,CACnC,OAAOA,GAAa,OAAOA,EAAU,MAAS,YAAc,OAAOA,EAAU,YAAe,UAC9F,CAEA,SAASq4H,GAAmB79J,EAAO,CACjC,GAAI,EAAEA,aAAiB,aAAeA,EAAM,QAAU,EAAG,MAAO,GAChE,GAAI,OAAO,OAAW,IACpB,OAAO,OAAO,KAAKA,CAAK,EAAE,SAAS,QAAQ,EAE7C,IAAI89J,EAAS,GACb,MAAMC,EAAY,MAClB,QAAS58K,EAAS,EAAGA,EAAS6e,EAAM,OAAQ7e,GAAU48K,EAAW,CAC/D,MAAMC,EAAQh+J,EAAM,SAAS7e,EAAQA,EAAS48K,CAAS,EACvDD,GAAU,OAAO,aAAa,GAAGE,CAAK,CACxC,CACA,OAAO,KAAKF,CAAM,CACpB,CAEA,SAASr0G,GAAmBhxE,EAAO,CACjC,GAAI,OAAOA,GAAU,UAAYA,EAAM,QAAU,EAAG,OAAO,KAC3D,GAAI,OAAO,OAAW,IACpB,OAAO,WAAW,KAAK,OAAO,KAAKA,EAAO,QAAQ,CAAC,EAErD,MAAMqlL,EAAS,KAAKrlL,CAAK,EACnBunB,EAAQ,IAAI,WAAW89J,EAAO,MAAM,EAC1C,QAAS,EAAI,EAAG,EAAIA,EAAO,OAAQ,GAAK,EAAG99J,EAAM,CAAC,EAAI89J,EAAO,WAAW,CAAC,EACzE,OAAO99J,CACT,CAEA,SAAS0qK,GAAyBpgL,EAAQ,CACxC,GAAI,EAAEA,aAAkB,eAAiBA,EAAO,QAAU,EAAG,OAAO,KACpE,MAAM0V,EAAQ,IAAI,WAAW1V,EAAO,OAAQA,EAAO,WAAYA,EAAO,UAAU,EAChF,OAAOuzK,GAAmB79J,CAAK,CACjC,CAEA,SAAS2qK,GAAyBlyL,EAAOmyL,EAAiB,KAAM,CAC9D,MAAM5qK,EAAQypD,GAAmBhxE,CAAK,EACtC,GAAI,CAACunB,GAASA,EAAM,YAAc,GAAKA,EAAM,WAAa,aAAa,oBAAsB,EAAG,OAAO,KACvG,MAAMsB,EAAO,IAAI,WAAWtB,EAAM,UAAU,EAC5CsB,EAAK,IAAItB,CAAK,EACd,MAAM9f,EAAO,IAAI,aAAaohB,EAAK,MAAM,EACzC,OAAIspK,GAAkB,MAAQ1qL,EAAK,SAAW,OAAO0qL,CAAc,EAAU,KACtE1qL,CACT,CAEA,SAAS2qL,GAAa3sJ,EAAS4sJ,EAAS,CACtC,GAAI5sJ,GAAW,KACf,IAAI,OAAOA,GAAY,SAAU,CAC/B4sJ,EAAQ5sJ,CAAO,EACf,MACF,CACA,GAAI,MAAM,QAAQA,CAAO,GAAK,YAAY,OAAOA,CAAO,EAAG,CACzD,QAASv8B,EAAI,EAAGA,EAAIu8B,EAAQ,OAAQv8B,GAAK,EAAGmpL,EAAQ5sJ,EAAQv8B,CAAC,CAAC,EAC9D,MACF,CACA,GAAI,OAAOu8B,EAAQ,OAAO,QAAQ,GAAM,WACtC,UAAWnyB,KAASmyB,EAAS4sJ,EAAQ/+K,CAAK,EAE9C,CAEA,SAASg/K,GAAyBjzK,EAAM,CACtC,GAAI,OAAOA,GAAS,SAClB,MAAM,IAAI,UAAU,6BAA6B,EAEnD,MAAMm3D,EAAUn3D,EAAK,KAAI,EACzB,GAAI,CAACm3D,EACH,MAAM,IAAI,MAAM,4BAA4B,EAE9C,GAAI,KAAK,KAAKA,CAAO,EACnB,MAAM,IAAI,MAAM,kDAAkD,EAEpE,MAAM9lD,EAAM8lD,EAAQ,QAAQ,GAAG,EAC/B,GAAI9lD,IAAQ,GAAI,MAAO,CAAE,KAAM8lD,EAAS,UAAW,EAAE,EACrD,MAAM/sE,EAAO+sE,EAAQ,MAAM,EAAG9lD,CAAG,EAC3B6hK,EAAY/7G,EAAQ,MAAM9lD,EAAM,CAAC,EACvC,GAAI,CAACjnB,EACH,MAAM,IAAI,MAAM,gEAAgE,EAElF,MAAO,CAAE,KAAMA,EAAM,UAAA8oL,CAAS,CAChC,CAEA,SAASC,GAAiB96J,EAAMwkB,EAAQ,CACtC,GAAI,OAAOxkB,GAAS,UAAYA,IAAS,QAAS,MAAO,GACzD,GAAI,OAAOA,GAAS,SAAU,CAC5B,MAAM13B,EAAQk8C,IAASxkB,CAAI,EAC3B,GAAI13B,GAAS,KACX,MAAM,IAAI,MAAM,uBAAuB03B,CAAI,GAAG,EAEhD,OAAO13B,CACT,CACA,GAAI,MAAM,QAAQ03B,CAAI,EAAG,CACvB,IAAIklD,EAAW,EACf,UAAW5uD,KAAS0J,EAClBklD,GAAa,OAAO41G,GAAiBxkK,EAAOkuB,CAAM,CAAC,IAAM,EAE3D,OAAO0gC,IAAa,CACtB,CACA,OAAOllD,CACT,CAEA,SAAS+6J,GAAiB36J,EAAMokB,EAAQ,CACtC,GAAI,OAAOpkB,GAAS,SAAU,OAAOA,EACrC,MAAMJ,EAAO,OAAO86J,GAAiB16J,EAAMokB,CAAM,CAAC,IAAM,EACxD,GAAI,CAACxkB,GAASA,EAAQA,EAAO,EAC3B,MAAM,IAAI,MAAM,UAAUI,CAAI,4DAA4D,EAE5F,MAAO,IAAK,KAAK,MAAMJ,CAAI,CAC7B,CAEA,SAASg7J,GAAoB9tJ,EAAO,CAClC,GAAIA,GAAS,KAAM,OAAO,KAC1B,GAAI,MAAM,QAAQA,CAAK,GAAK,YAAY,OAAOA,CAAK,EAAG,CACrD,MAAMsvB,EAAI,OAAOtvB,EAAM,CAAC,CAAC,EACnBuvB,EAAI,OAAOvvB,EAAM,CAAC,CAAC,EACnB9pB,EAAI,OAAO8pB,EAAM,CAAC,CAAC,EACnB/pB,EAAI+pB,EAAM,QAAU,EAAI,OAAOA,EAAM,CAAC,CAAC,EAAI,EACjD,MAAK,CAACsvB,EAAGC,EAAGr5C,EAAGD,CAAC,EAAE,MAAM,OAAO,QAAQ,EAC3B,KAAK,IAAIq5C,EAAGC,EAAGr5C,EAAGD,CAAC,EACrB,EACD,CAACq5C,EAAI,IAAKC,EAAI,IAAKr5C,EAAI,IAAKD,EAAI,GAAG,EAErC,CAACq5C,EAAGC,EAAGr5C,EAAGD,CAAC,EAL+B,IAMnD,CACA,GAAI,OAAO+pB,GAAU,SAAU,CAC7B,MAAMwmC,EAAMxmC,EAAM,KAAI,EACtB,GAAI,CAACwmC,EAAI,WAAW,GAAG,EAAG,OAAO,KACjC,MAAM/0C,EAAM+0C,EAAI,MAAM,CAAC,EACjBmG,EAAUpjC,GAAM,GAAGA,CAAC,GAAGA,CAAC,GAC9B,IAAI+lB,EAAI,EAAOC,EAAI,EAAOr5C,EAAI,EAAO,EAAI,IACzC,GAAIub,EAAI,SAAW,GAAKA,EAAI,SAAW,EACrC69B,EAAI,SAASqd,EAAOl7C,EAAI,CAAC,CAAC,EAAG,EAAE,EAC/B89B,EAAI,SAASod,EAAOl7C,EAAI,CAAC,CAAC,EAAG,EAAE,EAC/Bvb,EAAI,SAASy2D,EAAOl7C,EAAI,CAAC,CAAC,EAAG,EAAE,EAC3BA,EAAI,SAAW,IAAG,EAAI,SAASk7C,EAAOl7C,EAAI,CAAC,CAAC,EAAG,EAAE,WAC5CA,EAAI,SAAW,GAAKA,EAAI,SAAW,EAC5C69B,EAAI,SAAS79B,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAChC89B,EAAI,SAAS99B,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAChCvb,EAAI,SAASub,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAC5BA,EAAI,SAAW,IAAG,EAAI,SAASA,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,OAEtD,QAAO,KAET,MAAK,CAAC69B,EAAGC,EAAGr5C,EAAG,CAAC,EAAE,MAAM,OAAO,QAAQ,EAChC,CAACo5C,EAAI,IAAKC,EAAI,IAAKr5C,EAAI,IAAK,EAAI,GAAG,EADO,IAEnD,CACA,OAAO,IACT,CAEA,SAAS63K,GAAwB58I,EAAW91C,EAAWk1B,GAAgC,CACrF,GAAI,EAAE,MAAM,QAAQ4gB,CAAS,GAAK,YAAY,OAAOA,CAAS,GAAI,MAAO,CAAC,GAAG91C,CAAQ,EACrF,MAAM0I,EAAI,OAAOotC,EAAU,CAAC,CAAC,EACvBntC,EAAI,OAAOmtC,EAAU,CAAC,CAAC,EACvBjrC,EAAI,OAAOirC,EAAU,CAAC,CAAC,EAC7B,GAAI,CAAC,OAAO,SAASptC,CAAC,GAAK,CAAC,OAAO,SAASC,CAAC,GAAK,CAAC,OAAO,SAASkC,CAAC,EAAG,MAAO,CAAC,GAAG7K,CAAQ,EAC1F,MAAMuR,EAAS,KAAK,MAAM7I,EAAGC,EAAGkC,CAAC,EACjC,OAAM0G,EAAS,KACR,CAAC7I,EAAI6I,EAAQ5I,EAAI4I,EAAQ1G,EAAI0G,CAAM,EADb,CAAC,GAAGvR,CAAQ,CAE3C,CAEA,SAAS2yL,GAAgB5yL,EAAOC,EAAU,CACxC,MAAMM,EAAamyL,GAAoB1yL,CAAK,EAC5C,OAAOO,EAAa,CAAC,GAAGA,CAAU,EAAI,CAAC,GAAGN,CAAQ,CACpD,CAEA,SAAS+vK,GAAkBhwK,EAAO,CAChC,GAAI,MAAM,QAAQA,CAAK,EAAG,OAAOA,EAAM,IAAKguB,GAAUgiJ,GAAkBhiJ,CAAK,CAAC,EAC9E,GAAI,YAAY,OAAOhuB,CAAK,EAAG,OAAO,MAAM,KAAKA,EAAQguB,GAAUgiJ,GAAkBhiJ,CAAK,CAAC,EAC3F,GAAIhuB,GAAS,OAAOA,GAAU,SAAU,CACtC,MAAMwC,EAAO,CAAA,EACb,SAAW,CAACW,EAAK6qB,CAAK,IAAK,OAAO,QAAQhuB,CAAK,EAAGwC,EAAKW,CAAG,EAAI6sK,GAAkBhiJ,CAAK,EACrF,OAAOxrB,CACT,CACA,OAAOxC,CACT,CAEA,SAAS6yL,GAAqBh4K,EAAGC,EAAG,CAClC,GAAI,OAAO,GAAGD,EAAGC,CAAC,EAAG,MAAO,GAE5B,GADI,EAAE,MAAM,QAAQD,CAAC,GAAK,YAAY,OAAOA,CAAC,IAAM,EAAE,MAAM,QAAQC,CAAC,GAAK,YAAY,OAAOA,CAAC,IAC1FD,EAAE,SAAWC,EAAE,OAAQ,MAAO,GAClC,QAAS5R,EAAI,EAAGA,EAAI2R,EAAE,OAAQ3R,GAAK,EACjC,GAAI,CAAC,OAAO,GAAG,OAAO2R,EAAE3R,CAAC,CAAC,EAAG,OAAO4R,EAAE5R,CAAC,CAAC,CAAC,EAAG,MAAO,GAErD,MAAO,EACT,CAEA,SAAS4pL,GAAsBj4K,EAAGC,EAAG,CACnC,GAAI,OAAO,GAAGD,EAAGC,CAAC,EAAG,MAAO,GAC5B,GAAI,CAACD,GAAK,CAACC,GAAK,OAAOD,GAAM,UAAY,OAAOC,GAAM,SAAU,MAAO,GACvE,MAAMi4K,EAAc,IAAI,IAAI,CAAC,SAAU,QAAS,QAAS,WAAY,UAAU,CAAC,EAC1EC,EAAe,IAAI,IAAI,CAAC,OAAQ,aAAc,OAAQ,UAAU,CAAC,EACvE,UAAW9xK,KAAS8xK,EAClB,GAAI,CAAC,OAAO,GAAGn4K,EAAEqG,CAAK,EAAGpG,EAAEoG,CAAK,CAAC,EAAG,MAAO,GAE7C,UAAWA,KAAS6xK,EAClB,GAAI,CAACF,GAAqBh4K,EAAEqG,CAAK,GAAK,CAAA,EAAIpG,EAAEoG,CAAK,GAAK,EAAE,EAAG,MAAO,GAEpE,MAAM+xK,EAAc,IAAI,IAAI,CAAC,GAAGD,EAAc,GAAGD,CAAW,CAAC,EACvDG,EAAS,OAAO,KAAKr4K,CAAC,EAAE,OAAQ1X,GAAQ,CAAC8vL,EAAY,IAAI9vL,CAAG,CAAC,EAC7DgwL,EAAS,OAAO,KAAKr4K,CAAC,EAAE,OAAQ3X,GAAQ,CAAC8vL,EAAY,IAAI9vL,CAAG,CAAC,EACnE,GAAI+vL,EAAO,SAAWC,EAAO,OAAQ,MAAO,GAC5C,UAAWhwL,KAAO+vL,EAChB,GAAI,CAAC,OAAO,UAAU,eAAe,KAAKp4K,EAAG3X,CAAG,GAAK,CAACy9K,GAAY/lK,EAAE1X,CAAG,EAAG2X,EAAE3X,CAAG,CAAC,EAAG,MAAO,GAE5F,MAAO,EACT,CAEA,SAASqrF,GAAgBvsF,EAAQ,CAC/B,GAAI,CAACA,GAAU,OAAOA,GAAW,SAC/B,MAAO,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAC,EAE/C,MAAMC,EAAUlC,GAAU,CACxB,MAAME,EAAU,OAAOF,CAAK,EAC5B,OAAO,OAAO,SAASE,CAAO,EAAI,KAAK,IAAI,EAAGA,CAAO,EAAI,CAC3D,EACA,MAAO,CACL,IAAKgC,EAAOD,EAAO,GAAG,EACtB,MAAOC,EAAOD,EAAO,KAAK,EAC1B,OAAQC,EAAOD,EAAO,MAAM,EAC5B,KAAMC,EAAOD,EAAO,IAAI,CAC5B,CACA,CAEA,SAASmxL,MAAsB9tK,EAAS,CACtC,MAAM9iB,EAAO,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAC,EACnD,UAAWwrB,KAAS1I,EAAS,CAC3B,MAAMrjB,EAASusF,GAAgBxgE,CAAK,EACpCxrB,EAAK,IAAM,KAAK,IAAIA,EAAK,IAAKP,EAAO,GAAG,EACxCO,EAAK,MAAQ,KAAK,IAAIA,EAAK,MAAOP,EAAO,KAAK,EAC9CO,EAAK,OAAS,KAAK,IAAIA,EAAK,OAAQP,EAAO,MAAM,EACjDO,EAAK,KAAO,KAAK,IAAIA,EAAK,KAAMP,EAAO,IAAI,CAC7C,CACA,OAAOO,CACT,CAEA,SAASwsK,GAAkB3vJ,EAAMhT,EAAQ,CACvC,GAAI,OAAO,aAAgB,WAAY,OAAO,IAAI,YAAYgT,EAAM,CAAE,OAAAhT,EAAQ,EAC9E,GAAI,OAAO,OAAU,WAAY,CAC/B,MAAMhK,EAAQ,IAAI,MAAMgd,CAAI,EAC5B,OAAAhd,EAAM,OAASgK,EACRhK,CACT,CACA,MAAO,CAAE,KAAAgd,EAAM,OAAAhT,CAAM,CACvB,CAEA,SAASgnL,GAAsB1mL,EAAUzF,EAASu1E,EAAUrC,EAAO,CACjE,MAAMqY,EAAa,IAAIjW,GAAiB7vE,GAAU,MAAQ,OAAQzF,EAASu1E,EAAUrC,CAAK,EAC1F,GAAI,CAACztE,GAAU,SAAWA,EAAS,QAAQ,OAAS,EAClD,OAAO8lF,EAETA,EAAW,QAAQ,MAAK,EACxBA,EAAW,cAAgB,KAC3B,SAAW,CAACtvF,EAAK+1E,CAAM,IAAKvsE,EAAS,QAAQ,UAAW,CACtD,MAAMkwE,EAAS4V,EAAW,aAAatvF,CAAG,EAC1C,SAAW,CAAC+2E,EAAaz2E,CAAM,IAAKy1E,GAAQ,UAAU,UAAO,GAAQ,GAC/D,CAACgB,GAAe,CAACz2E,GACrBo5E,EAAO,WAAW3C,EAAa,CAAE,GAAGz2E,EAAQ,WAAYA,EAAO,YAAcA,EAAO,KAAM,EAExF,CAACgvF,EAAW,gBAAkBtvF,IAAQ,WAAa+1E,IAAWvsE,EAAS,iBACzE8lF,EAAW,cAAgB5V,EAE/B,CACA,OAAK4V,EAAW,gBACdA,EAAW,cAAgBA,EAAW,QAAQ,IAAI,SAAS,GAAKA,EAAW,QAAQ,OAAM,EAAG,KAAI,EAAG,OAAS,MAEvGA,CACT,CAEA,SAAS6gG,GAA+B7gG,EAAY,CAClD,OAAO8gG,GAAkC9gG,CAAU,CACrD,CAEA,SAAS+gG,GAA2BjxL,EAAM,CACxC,GAAI,OAAOA,GAAS,SAAU,OAAO,KACrC,MAAMypF,EAAQzpF,EAAK,KAAI,EAAG,YAAW,EACrC,OAAIypF,EAAM,SAAS,QAAQ,EAAU,QACjCA,EAAM,SAAS,QAAQ,EAAU,QACjCA,EAAM,SAAS,OAAO,EAAU,OAChCA,EAAM,SAAS,MAAM,EAAU,MAC/BA,EAAM,SAAS,SAAS,GACxBA,EAAM,SAAS,KAAK,EAAU,KAC3B,IACT,CAEA,SAASynG,GAAgCzzL,EAAO,CAC9C,GAAIA,IAAU,GACZ,MAAO,CACL,QAAS,GACT,OAAQ,OACR,iBAAkB,CAAC,QAAS,QAAS,OAAQ,MAAO,IAAI,EACxD,eAAgB,CAAE,WAAY,GAAM,iBAAkB,GAAM,WAAY,EAAK,CACnF,EAEE,GAAI,CAACA,GAAS,OAAOA,GAAU,UAAYA,EAAM,UAAY,GAAO,MAAO,CAAE,QAAS,EAAK,EAC3F,MAAM0zL,EAAU,MAAM,QAAQ1zL,EAAM,gBAAgB,EAChDA,EAAM,iBAAiB,IAAKguB,GAAU,OAAOA,CAAK,EAAE,KAAI,EAAG,aAAa,EAAE,OAAO,OAAO,EACxF,CAAC,QAAS,QAAS,OAAQ,MAAO,IAAI,EAC1C,MAAO,CACL,QAAS,GACT,OAAQhuB,EAAM,QAAU,OACxB,iBAAkB0zL,EAClB,eAAgB,CACd,WAAY,GACZ,iBAAkB,GAClB,WAAY,GACZ,GAAI1zL,EAAM,gBAAkB,OAAOA,EAAM,gBAAmB,SAAWA,EAAM,eAAiB,EACpG,EACI,aAAc,OAAOA,EAAM,cAAiB,SAAWA,EAAM,aAAe,2BAC5E,gBAAiB,OAAOA,EAAM,iBAAoB,SAC9CA,EAAM,gBACN,sBAAsB0zL,EAAQ,IAAKvkI,GAAQ,IAAIA,CAAG,EAAE,EAAE,KAAK,IAAI,CAAC,EACxE,CACA,CAEA,SAASwkI,GAAa/yL,EAASuC,EAAK,CAClC,OAAO,OAAO,UAAU,eAAe,KAAKvC,GAAW,CAAA,EAAIuC,CAAG,CAChE,CAEA,SAASywL,GAAmBhzL,EAASuC,EAAK,CACxC,OAAOwwL,GAAa/yL,EAASuC,CAAG,GAAK,OAAOvC,IAAUuC,CAAG,GAAM,UAAYvC,EAAQuC,CAAG,EAAE,KAAI,EAAG,OAAS,CAC1G,CAEA,MAAM0wL,GAA2B,OAAO,OAAO,CAAC,IAAM,IAAM,IAAM,CAAC,CAAC,EAC9DC,GAA4B,OAAO,OAAO,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,EAE5D,SAASC,GAAmB/zL,EAAO,CACjC,GAAI,OAAOA,GAAU,SAAU,OAAO,KACtC,MAAM03F,EAAQ13F,EAAM,KAAI,EAAG,YAAW,EACtC,OAAK03F,EACDA,IAAU,SAAWA,IAAU,UAAkB,QACjDA,IAAU,QAAUA,IAAU,QAAgB,OAC3C,KAHY,IAIrB,CAEA,SAASs8F,GAA6BjyL,EAAS,CAC7C,GAAI,CAACA,GAAW,OAAOA,EAAQ,SAAY,WAAY,OAAO,KAC9D,MAAMwB,EAASxB,EAAQ,QAAQ,2DAA2D,EAC1F,MAAI,CAACwB,GAAU,OAAOA,EAAO,cAAiB,WAAmB,KAC1DwwL,GACLxwL,EAAO,aAAa,mBAAmB,GACpCA,EAAO,aAAa,YAAY,GAChCA,EAAO,aAAa,sBAAsB,CACjD,CACA,CAEA,SAAS0wL,IAAgC,CACvC,GAAI,OAAO,SAAa,IAAa,OAAO,KAC5C,MAAMC,EAAQ,CAAC,SAAS,gBAAiB,SAAS,IAAI,EAAE,OAAO,OAAO,EACtE,UAAWv5K,KAAQu5K,EAAO,CACxB,MAAMx8F,EAAQq8F,GACZp5K,EAAK,eAAe,mBAAmB,GACpCA,EAAK,eAAe,YAAY,GAChCA,EAAK,eAAe,sBAAsB,CACnD,EACI,GAAI+8E,EAAO,OAAOA,CACpB,CACA,OAAO,IACT,CAEA,SAASy8F,GAAwBjlD,EAAW,CAC1C,GAAI,OAAO,SAAa,IAAa,OAAO,KAC5C,GAAI,OAAOA,GAAc,SACvB,GAAI,CACF,OAAO,SAAS,cAAcA,CAAS,CACzC,MAAY,CACV,OAAO,IACT,CAEF,OAAOA,GAAa,OAAOA,GAAc,UAAYA,EAAU,WAAa,EAAIA,EAAY,IAC9F,CAEA,SAASklD,IAAsB,CAC7B,GAAI,OAAO,OAAW,KAAe,OAAO,OAAO,YAAe,WAAY,OAAO,KACrF,GAAI,CACF,GAAI,OAAO,WAAW,+BAA+B,EAAE,QAAS,MAAO,QACvE,GAAI,OAAO,WAAW,8BAA8B,EAAE,QAAS,MAAO,MACxE,MAAY,CACV,OAAO,IACT,CACA,OAAO,IACT,CAEA,SAASC,GAAoBzzL,EAAU,GAAIsuI,EAAY,KAAM,CAC3D,MAAMolD,EAAY1zL,EAAQ,IAAM,OAAOA,EAAQ,IAAO,SAAWA,EAAQ,GAAK,CAAA,EACxE2zL,EAAe3zL,EAAQ,eAAiB,OAAOA,EAAQ,eAAkB,SAC3EA,EAAQ,cACR,CAAA,EACE4zL,EAAgBT,GAAmBnzL,EAAQ,KAAK,GACjDmzL,GAAmBO,EAAU,KAAK,GAClCP,GAAmBQ,EAAa,KAAK,EAC1C,GAAIC,EAAe,OAAOA,EAC1B,MAAMC,EAAmBN,GAAwBjlD,CAAS,EAC1D,OAAO8kD,GAA6BS,CAAgB,GAC/CR,GAA6B,GAC7BG,GAAmB,GACnB,MACP,CAEA,SAASM,GAAuB9zL,EAAU,GAAI,CAC5C,MAAM0zL,EAAY1zL,EAAQ,IAAM,OAAOA,EAAQ,IAAO,SAAWA,EAAQ,GAAK,CAAA,EACxE2zL,EAAe3zL,EAAQ,eAAiB,OAAOA,EAAQ,eAAkB,SAC3EA,EAAQ,cACR,CAAA,EACJ,OAAOgzL,GAAmBhzL,EAAS,OAAO,GACrCgzL,GAAmBU,EAAW,OAAO,GACrCV,GAAmBW,EAAc,OAAO,CAC/C,CAEA,SAASI,GAA8Bj9F,EAAO,CAC5C,MAAO,CAAC,GAAIA,IAAU,QAAUo8F,GAA4BD,EAAyB,CACvF,CAEA,SAASe,GAAkCh0L,EAAU,GAAI82F,EAAQ,OAAQ,CACvE,MAAMm9F,EAAgBlB,GAAa/yL,EAAS,YAAY,EAClDk0L,EAAgBnB,GAAa/yL,EAAS,YAAY,EACxD,GAAIi0L,GAAiBC,EAAe,CAClC,MAAMlwJ,EAAQiwJ,EAAgBj0L,EAAQ,WAAaA,EAAQ,WACrDL,EAAamyL,GAAoB9tJ,CAAK,EAC5C,GAAI,CAACrkC,EACH,MAAM,IAAI,MAAM,0FAA0F,EAE5G,OAAAK,EAAQ,WAAaL,EACdA,CACT,CACA,OAAAK,EAAQ,WAAa+zL,GAA8Bj9F,CAAK,EACjD92F,EAAQ,UACjB,CAEA,SAASm0L,GAA8B1oL,EAAS,GAAI,CAClD,MAAM9I,EAAS,OAAO8I,EAAO,QAAU,EAAE,EAAE,KAAI,EACzCrI,EAAS,OAAOqI,EAAO,QAAU,EAAE,EAAE,KAAI,EAE/C,OADI9I,IAAW,WAAaA,IAAW,WAAaA,IAAW,WAC3DS,IAAW,cAAgBA,EAAO,WAAW,aAAa,EAAU,GACjET,IAAW,WACbA,IAAW,MACXA,IAAW,WACXA,IAAW,OACXA,IAAW,SACX8I,EAAO,WAAa,IACpBA,EAAO,gBAAkB,IACzBA,EAAO,kBAAoB,EAClC,CAEA,SAAS2oL,GAAwBp0L,EAAU,GAAI,CAC7C,GAAIA,EAAQ,UAAY,GAAM,MAAO,GACrC,GAAIA,EAAQ,SAAW,OAAOA,EAAQ,SAAY,SAAU,CAC1D,MAAMye,EAAO,OAAOze,EAAQ,QAAQ,MAAQA,EAAQ,QAAQ,MAAQ,EAAE,EAAE,YAAW,EACnF,GAAIye,IAAS,SAAWA,IAAS,SAAU,MAAO,EACpD,CACA,MAAO,CACL,cACA,qBACA,sBACA,UACA,WACJ,EAAI,KAAMlc,GAAQwwL,GAAa/yL,EAASuC,CAAG,GAAKvC,EAAQuC,CAAG,IAAM,IAASvC,EAAQuC,CAAG,GAAK,IAAI,CAC9F,CAEA,SAAS8xL,GAAmCr0L,EAAU,GAAI,CACxD,GAAIA,EAAQ,UAAY,GAAO,MAAO,GACtC,MAAMs0L,EAAoBt0L,EAAQ,WAAa,MAAQ,OAAOA,EAAQ,SAAS,EAAE,KAAI,EACjF,CAAE,UAAW,OAAOA,EAAQ,SAAS,EAAE,KAAI,CAAE,EAC7C,CAAA,EACJ,OAAI,OAAOA,EAAQ,SAAY,UAAYA,EAAQ,QAAQ,KAAI,EAAW,CAAE,UAAWA,EAAQ,QAAQ,KAAI,CAAE,EACzGA,EAAQ,UAAY,GAAa,CAAE,GAAGs0L,CAAiB,EACvDt0L,EAAQ,SAAW,OAAOA,EAAQ,SAAY,SACzC,CACL,GAAGA,EAAQ,QACX,GAAGs0L,CACT,EAEMA,EAAkB,UAAkB,CAAE,GAAGA,CAAiB,EACvD,EACT,CAEA,SAASC,GAA0Bv0L,EAAU,GAAI,CAC/C,MAAMi5C,EAAUj5C,EAAQ,QACxB,GAAI,CAACi5C,GAAW,OAAOA,GAAY,SAAU,OAAO,KACpD,MAAM75C,EAAQ65C,EAAQ,WAAaA,EAAQ,IAAM,KACjD,OAAO75C,GAAS,MAAQ,OAAOA,CAAK,EAAE,KAAI,EAAK,OAAOA,CAAK,EAAE,KAAI,EAAK,IACxE,CAEA,MAAMo1L,GAA4B,OAAO,OAAO,CAC9C,UACA,kBACA,sBACA,oBACA,oBACA,uBACA,uBACA,2BACA,8BACA,yBACA,mCACA,mCACA,2BACA,gCACA,YACA,sBACA,QACA,aACA,iBACA,YACA,aACA,eACA,yBACA,mBACF,CAAC,EAED,SAASC,GAA4B9xL,EAAQ3C,EAAU,GAAI,CACzD,MAAMZ,EAAQ,OAAOuD,GAAU,EAAE,EAAE,KAAI,EACvC,OAAOvD,IAAU,MAAQA,IAAU,eAAiBA,IAAU,OAASA,IAAU,WAAaY,EAAQ,SAAW,EACnH,CAEA,SAAS00L,GAAevoI,EAAW,CACjC,OAAOA,aAAqBkiH,IAAY,GAAQliH,GAAa,OAAOA,EAAU,QAAW,WAC3F,CAEA,SAASwoI,GAAwBhqL,EAAQ,CACvC,MAAMiqL,EAAmB,SAAkBjzL,EAAM,CAC/C,OAAOgJ,EAAO,YAAYhJ,CAAI,CAChC,EACA,OAAO,IAAI,MAAMizL,EAAkB,CACjC,MAAMC,EAASC,EAAU9xL,EAAM,CAC7B,OAAO2H,EAAO,YAAY3H,EAAK,CAAC,CAAC,CACnC,EACA,IAAI9B,EAAQ+mG,EAAM8sF,EAAU,CAC1B,OAAI,OAAO9sF,GAAS,UAAY,QAAQ,IAAI/mG,EAAQ+mG,CAAI,EAC/C,QAAQ,IAAI/mG,EAAQ+mG,EAAM8sF,CAAQ,EAEpCpqL,EAAO,YAAYs9F,CAAI,CAChC,CACJ,CAAG,CACH,CAEA,SAAS+sF,GAAgB7zL,EAAS,CAChC,OAAKA,EACE,IAAI,cAAa,EAAG,kBAAkBA,CAAO,EAD/B,EAEvB,CAEA,SAAS8zL,GAAsB/zK,EAAQjf,EAAOC,EAAQlC,EAAU,CAAA,EAAI,CAClE,MAAM2C,EAASue,aAAkB,WAAaA,EAAS,IAAI,WAAWA,CAAM,EACtEvhB,EAAa,IAAI,kBAAkBsC,EAAQC,EAAS,CAAC,EACrDgzL,EAAQl1L,EAAQ,QAAU,GAC1Bm1L,EAAcn1L,EAAQ,cAAgB,GACtCggJ,EAAY,OAAOhgJ,EAAQ,WAAa,UAAU,EAAE,KAAI,EAAG,YAAW,EAC5E,QAASsiD,EAAM,EAAGA,EAAMpgD,EAAQogD,GAAO,EAAG,CACxC,MAAM8yI,EAASF,EAAShzL,EAAS,EAAIogD,EAAOA,EAC5C,QAAS+yI,EAAM,EAAGA,EAAMpzL,EAAOozL,GAAO,EAAG,CACvC,MAAMC,GAAaF,EAASnzL,EAAQozL,GAAO,EACrCE,GAAajzI,EAAMrgD,EAAQozL,GAAO,EACxC,IAAIG,EACAC,EACAC,EACJ,MAAMnsL,EAAQ5G,EAAO2yL,EAAY,CAAC,EAUlC,GATIH,GACFK,EAAM7yL,EAAO2yL,EAAY,CAAC,EAC1BG,EAAQ9yL,EAAO2yL,EAAY,CAAC,EAC5BI,EAAO/yL,EAAO2yL,CAAS,IAEvBE,EAAM7yL,EAAO2yL,CAAS,EACtBG,EAAQ9yL,EAAO2yL,EAAY,CAAC,EAC5BI,EAAO/yL,EAAO2yL,EAAY,CAAC,GAEzBt1C,IAAc,YAChB,GAAIz2I,GAAS,EACXisL,EAAM,EACNC,EAAQ,EACRC,EAAO,UACEnsL,EAAQ,IAAK,CACtB,MAAMwlB,EAAQ,IAAMxlB,EACpBisL,EAAM,KAAK,IAAI,IAAK,KAAK,MAAMA,EAAMzmK,CAAK,CAAC,EAC3C0mK,EAAQ,KAAK,IAAI,IAAK,KAAK,MAAMA,EAAQ1mK,CAAK,CAAC,EAC/C2mK,EAAO,KAAK,IAAI,IAAK,KAAK,MAAMA,EAAO3mK,CAAK,CAAC,CAC/C,EAEFpvB,EAAW41L,CAAS,EAAIC,EACxB71L,EAAW41L,EAAY,CAAC,EAAIE,EAC5B91L,EAAW41L,EAAY,CAAC,EAAIG,EAC5B/1L,EAAW41L,EAAY,CAAC,EAAIhsL,CAC9B,CACF,CACA,OAAO5J,CACT,CAEA,SAASg2L,GAAez0K,EAAQjf,EAAOC,EAAQ47I,EAAaC,EAAc/9I,EAAU,GAAI,CACtF,MAAM41L,EAAmBX,GAAsB/zK,EAAQjf,EAAOC,EAAQlC,CAAO,EACvE61L,EAAa,SAAS,cAAc,QAAQ,EAClDA,EAAW,MAAQ,KAAK,IAAI,EAAG5zL,CAAK,EACpC4zL,EAAW,OAAS,KAAK,IAAI,EAAG3zL,CAAM,EACtC,MAAM4zL,EAAUD,EAAW,WAAW,KAAM,CAAE,mBAAoB,GAAM,EACxE,GAAI,CAACC,EAAS,MAAM,IAAI,MAAM,wDAAwD,EAGtF,GAFAA,EAAQ,aAAa,IAAI,UAAUF,EAAkB3zL,EAAOC,CAAM,EAAG,EAAG,CAAC,EAErED,IAAU67I,GAAe57I,IAAW67I,EACtC,OAAO83C,EAGT,MAAME,EAAe,SAAS,cAAc,QAAQ,EACpDA,EAAa,MAAQ,KAAK,IAAI,EAAGj4C,CAAW,EAC5Ci4C,EAAa,OAAS,KAAK,IAAI,EAAGh4C,CAAY,EAC9C,MAAMi4C,EAAYD,EAAa,WAAW,IAAI,EAC9C,GAAI,CAACC,EAAW,MAAM,IAAI,MAAM,qDAAqD,EACrF,OAAAA,EAAU,sBAAwB,GAC9B,OAAOA,EAAU,sBAA0B,MAAaA,EAAU,sBAAwB,QAC9FA,EAAU,UAAUH,EAAY,EAAG,EAAGE,EAAa,MAAOA,EAAa,MAAM,EACtEA,CACT,CAEA,SAASE,GAAal2I,EAAQthC,EAAM,CAClC,OAAO,IAAI,QAAQ,CAACovC,EAAS8mG,IAAW,CACtC50G,EAAO,OAAQwtG,GAAS,CAClBA,EAAM1/F,EAAQ0/F,CAAI,EACjBoH,EAAO,IAAI,MAAM,8BAA8Bl2I,CAAI,EAAE,CAAC,CAC7D,EAAGA,CAAI,CACT,CAAC,CACH,CAEA,SAASy3K,GAA0BC,EAAcn2L,EAAU,GAAI,CAC7D,GAAI,CAACm2L,GAAgB,OAAO,SAAa,IAAa,OAAO,KAC7D,MAAM9zK,EAAc,KAAK,MAAM,OAAO8zK,EAAa,KAAK,GAAK,CAAC,EACxD7zK,EAAe,KAAK,MAAM,OAAO6zK,EAAa,MAAM,GAAK,CAAC,EAChE,GAAI9zK,GAAe,GAAKC,GAAgB,EAAG,OAAO,KAClD,MAAM8kF,EAAW,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOpnG,EAAQ,UAAYA,EAAQ,KAAK,GAAK,GAAG,CAAC,EACnFohJ,EAAY,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOphJ,EAAQ,WAAaA,EAAQ,MAAM,GAAK,GAAG,CAAC,EACtF+uB,EAAQ,KAAK,IAAIq4E,EAAW/kF,EAAa++H,EAAY9+H,CAAY,EACjErgB,EAAQ,KAAK,IAAI,EAAG,KAAK,MAAMogB,EAAc0M,CAAK,CAAC,EACnD7sB,EAAS,KAAK,IAAI,EAAG,KAAK,MAAMogB,EAAeyM,CAAK,CAAC,EACrDgnK,EAAe,SAAS,cAAc,QAAQ,EACpDA,EAAa,MAAQ9zL,EACrB8zL,EAAa,OAAS7zL,EACtB,MAAMsrG,EAAMuoF,EAAa,WAAW,IAAI,EACxC,OAAKvoF,GACLA,EAAI,sBAAwB,GACxB,OAAOA,EAAI,sBAA0B,MAAaA,EAAI,sBAAwB,UAClFA,EAAI,UAAU2oF,EAAc,EAAG,EAAGl0L,EAAOC,CAAM,EACxC+zL,GAAaF,EAAc,WAAW,GAJ5B,IAKnB,CAEA,SAASK,GAAaC,EAAS,CAC7B,OAAO,IAAI,QAAQ,CAACxoI,EAAS8mG,IAAW,CACtC,MAAMpH,EAAO,IAAI,KAAK,CAAC8oC,CAAO,EAAG,CAAE,KAAM,gBAAiB,EACpD7oC,EAAM,IAAI,gBAAgBD,CAAI,EAC9B70D,EAAQ,IAAI,MAClBA,EAAM,OAAS,IAAM,CACnB,IAAI,gBAAgB80D,CAAG,EACvB3/F,EAAQ6qC,CAAK,CACf,EACAA,EAAM,QAAWz0F,GAAU,CACzB,IAAI,gBAAgBupJ,CAAG,EACvBmH,EAAO1wJ,aAAiB,MAAQA,EAAQ,IAAI,MAAM,iCAAiC,CAAC,CACtF,EACAy0F,EAAM,IAAM80D,CACd,CAAC,CACH,CAEA,MAAM8oC,GAAiC,iDAEvC,SAASC,GAA6B5jB,EAAiB,CACrD,MAAMhwK,EAAS,MAAM,QAAQgwK,CAAe,EAAIA,EAAkB,CAAC,EAAG,EAAG,EAAG,CAAC,EACvE6iB,EAAM,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK,KAAK,MAAM,OAAO7yL,EAAO,CAAC,GAAK,CAAC,EAAI,GAAG,CAAC,CAAC,EACzE8yL,EAAQ,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK,KAAK,MAAM,OAAO9yL,EAAO,CAAC,GAAK,CAAC,EAAI,GAAG,CAAC,CAAC,EAC3E+yL,EAAO,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK,KAAK,MAAM,OAAO/yL,EAAO,CAAC,GAAK,CAAC,EAAI,GAAG,CAAC,CAAC,EAChF,MAAO,CACL,IAAA6yL,EACA,MAAAC,EACA,KAAAC,EACA,IAAK,OAAOF,CAAG,IAAIC,CAAK,IAAIC,CAAI,GACpC,CACA,CAEA,SAASc,GAA2Bx2L,EAAU,GAAI,CAChD,MAAMiC,EAAQ,KAAK,IACjB,EACA,OAAOjC,EAAQ,cAAgBA,EAAQ,OAASA,EAAQ,aAAeA,EAAQ,aAAa,OAAS,CAAC,CAC1G,EACQkC,EAAS,KAAK,IAClB,EACA,OAAOlC,EAAQ,eAAiBA,EAAQ,QAAUA,EAAQ,cAAgBA,EAAQ,aAAa,QAAU,CAAC,CAC9G,EACQsgJ,EAAc,KAAK,IAAI,EAAG,OAAOtgJ,EAAQ,aAAeiC,CAAK,CAAC,EAC9Ds+I,EAAe,KAAK,IAAI,EAAG,OAAOvgJ,EAAQ,cAAgBkC,CAAM,CAAC,EACjEw+I,EAAmB,KAAK,IAC5B,EACA,OAAO1gJ,EAAQ,kBAAoB,KAAK,IAAIsgJ,EAAcr+I,EAAOs+I,EAAer+I,EAAQ,CAAC,CAAC,CAC9F,EACE,MAAO,CAAE,MAAAD,EAAO,OAAAC,EAAQ,iBAAAw+I,CAAgB,CAC1C,CAEA,SAAS+1C,IAAqB,CAC5B,MAAM/kL,EAAM,IAAI,aAAa,EAAE,EAC/B,OAAAA,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAI,EACTA,EAAI,EAAE,EAAI,EACVA,EAAI,EAAE,EAAI,EACHA,CACT,CAEA,SAASglL,GAAkBt3L,EAAO+uF,EAAU,MAAO,CACjD,OAAK,OAAO,SAAS/uF,CAAK,EACtB,KAAK,IAAIA,CAAK,GAAK+uF,EAAgB/uF,EAChCA,EAAQ,EAAI,CAAC+uF,EAAUA,EAFMA,CAGtC,CAEA,SAASloC,GAAav0C,EAAKuI,EAAGC,EAAG,CAC/B,MAAMujB,EAAMxjB,EAAE,CAAC,EACTyjB,EAAMzjB,EAAE,CAAC,EACT0jB,EAAM1jB,EAAE,CAAC,EACT2jB,EAAM3jB,EAAE,CAAC,EACT4jB,EAAM5jB,EAAE,CAAC,EACT6jB,EAAM7jB,EAAE,CAAC,EACT8jB,EAAM9jB,EAAE,CAAC,EACT+jB,EAAM/jB,EAAE,CAAC,EACTgkB,EAAMhkB,EAAE,CAAC,EACTikB,EAAMjkB,EAAE,CAAC,EACTkkB,EAAMlkB,EAAE,EAAE,EACVmkB,EAAMnkB,EAAE,EAAE,EACVokB,EAAMpkB,EAAE,EAAE,EACVqkB,EAAMrkB,EAAE,EAAE,EACVskB,EAAMtkB,EAAE,EAAE,EACVukB,EAAMvkB,EAAE,EAAE,EAEVwkB,EAAMvkB,EAAE,CAAC,EACTwkB,EAAMxkB,EAAE,CAAC,EACTykB,EAAMzkB,EAAE,CAAC,EACT0kB,EAAM1kB,EAAE,CAAC,EACTilB,EAAMjlB,EAAE,CAAC,EACTklB,EAAMllB,EAAE,CAAC,EACTgsC,EAAMhsC,EAAE,CAAC,EACTisC,EAAMjsC,EAAE,CAAC,EACTksC,EAAMlsC,EAAE,CAAC,EACTmsC,EAAMnsC,EAAE,CAAC,EACTosC,EAAMpsC,EAAE,EAAE,EACVqsC,EAAMrsC,EAAE,EAAE,EACVssC,EAAMtsC,EAAE,EAAE,EACVusC,EAAMvsC,EAAE,EAAE,EACVwsC,EAAMxsC,EAAE,EAAE,EACVysC,EAAMzsC,EAAE,EAAE,EAEhB,OAAAxI,EAAI,CAAC,EAAI+rB,EAAMgB,EAAMZ,EAAMa,EAAMT,EAAMU,EAAMN,EAAMO,EACnDltB,EAAI,CAAC,EAAIgsB,EAAMe,EAAMX,EAAMY,EAAMR,EAAMS,EAAML,EAAMM,EACnDltB,EAAI,CAAC,EAAIisB,EAAMc,EAAMV,EAAMW,EAAMP,EAAMQ,EAAMJ,EAAMK,EACnDltB,EAAI,CAAC,EAAIksB,EAAMa,EAAMT,EAAMU,EAAMN,EAAMO,EAAMH,EAAMI,EACnDltB,EAAI,CAAC,EAAI+rB,EAAM0B,EAAMtB,EAAMuB,EAAMnB,EAAMioB,EAAM7nB,EAAM8nB,EACnDz0C,EAAI,CAAC,EAAIgsB,EAAMyB,EAAMrB,EAAMsB,EAAMlB,EAAMgoB,EAAM5nB,EAAM6nB,EACnDz0C,EAAI,CAAC,EAAIisB,EAAMwB,EAAMpB,EAAMqB,EAAMjB,EAAM+nB,EAAM3nB,EAAM4nB,EACnDz0C,EAAI,CAAC,EAAIksB,EAAMuB,EAAMnB,EAAMoB,EAAMhB,EAAM8nB,EAAM1nB,EAAM2nB,EACnDz0C,EAAI,CAAC,EAAI+rB,EAAM2oB,EAAMvoB,EAAMwoB,EAAMpoB,EAAMqoB,EAAMjoB,EAAMkoB,EACnD70C,EAAI,CAAC,EAAIgsB,EAAM0oB,EAAMtoB,EAAMuoB,EAAMnoB,EAAMooB,EAAMhoB,EAAMioB,EACnD70C,EAAI,EAAE,EAAIisB,EAAMyoB,EAAMroB,EAAMsoB,EAAMloB,EAAMmoB,EAAM/nB,EAAMgoB,EACpD70C,EAAI,EAAE,EAAIksB,EAAMwoB,EAAMpoB,EAAMqoB,EAAMjoB,EAAMkoB,EAAM9nB,EAAM+nB,EACpD70C,EAAI,EAAE,EAAI+rB,EAAM+oB,EAAM3oB,EAAM4oB,EAAMxoB,EAAMyoB,EAAMroB,EAAMsoB,EACpDj1C,EAAI,EAAE,EAAIgsB,EAAM8oB,EAAM1oB,EAAM2oB,EAAMvoB,EAAMwoB,EAAMpoB,EAAMqoB,EACpDj1C,EAAI,EAAE,EAAIisB,EAAM6oB,EAAMzoB,EAAM0oB,EAAMtoB,EAAMuoB,EAAMnoB,EAAMooB,EACpDj1C,EAAI,EAAE,EAAIksB,EAAM4oB,EAAMxoB,EAAMyoB,EAAMroB,EAAMsoB,EAAMloB,EAAMmoB,EAC7Cj1C,CACT,CAEA,SAASilL,GAAYjlL,EAAK01C,EAAMC,EAAOC,EAAQC,EAAKR,EAAMC,EAAK,CAC7D,MAAM4vI,EAAK,EAAIF,GAAkBrvI,EAAQD,CAAI,EACvCyvI,EAAK,EAAIH,GAAkBnvI,EAAMD,CAAM,EACvCJ,EAAK,EAAIwvI,GAAkB3vI,EAAOC,CAAG,EAC3C,OAAAt1C,EAAI,CAAC,EAAK,EAAIq1C,EAAQ6vI,EACtBllL,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAK,EAAIq1C,EAAQ8vI,EACtBnlL,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,GAAK21C,EAAQD,GAAQwvI,EAC1BllL,EAAI,CAAC,GAAK61C,EAAMD,GAAUuvI,EAC1BnlL,EAAI,EAAE,GAAKs1C,EAAMD,GAAQG,EACzBx1C,EAAI,EAAE,EAAI,GACVA,EAAI,EAAE,EAAI,EACVA,EAAI,EAAE,EAAI,EACVA,EAAI,EAAE,EAAK,EAAIs1C,EAAMD,EAAQG,EAC7Bx1C,EAAI,EAAE,EAAI,EACHA,CACT,CAEA,SAASy1C,GAAUz1C,EAAK01C,EAAMC,EAAOC,EAAQC,EAAKR,EAAMC,EAAK,CAC3D,MAAMQ,EAAK,EAAIkvI,GAAkBtvI,EAAOC,CAAK,EACvCI,EAAK,EAAIivI,GAAkBpvI,EAASC,CAAG,EACvCL,EAAK,EAAIwvI,GAAkB3vI,EAAOC,CAAG,EAC3C,OAAAt1C,EAAI,CAAC,EAAI,GAAK81C,EACd91C,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAI,GAAK+1C,EACd/1C,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAI,EACTA,EAAI,EAAE,EAAI,EAAIw1C,EACdx1C,EAAI,EAAE,EAAI,EACVA,EAAI,EAAE,GAAK01C,EAAOC,GAASG,EAC3B91C,EAAI,EAAE,GAAK61C,EAAMD,GAAUG,EAC3B/1C,EAAI,EAAE,GAAKs1C,EAAMD,GAAQG,EACzBx1C,EAAI,EAAE,EAAI,EACHA,CACT,CAEA,SAASolL,GAAuB7tL,EAAQuiG,EAAaurF,EAAc,CACjE,MAAMC,EAAY,KAAK,IAAI,EAAG,OAAOD,GAAc,OAAS,CAAC,CAAC,EACxDE,EAAa,KAAK,IAAI,EAAG,OAAOF,GAAc,QAAU,CAAC,CAAC,EAC1DhvL,EAAI,KAAK,IAAI,KAAK,IAAI,EAAG,OAAOyjG,GAAa,GAAK,CAAC,CAAC,EAAGwrF,CAAS,EAChEhvL,EAAI,KAAK,IAAI,KAAK,IAAI,EAAG,OAAOwjG,GAAa,GAAK,CAAC,CAAC,EAAGyrF,CAAU,EACjEh1L,EAAQ,KAAK,IACjB,KAAK,IAAI,KAAM,OAAOupG,GAAa,OAASwrF,CAAS,CAAC,EACtD,KAAK,IAAI,KAAMA,EAAYjvL,CAAC,CAChC,EACQ7F,EAAS,KAAK,IAClB,KAAK,IAAI,KAAM,OAAOspG,GAAa,QAAUyrF,CAAU,CAAC,EACxD,KAAK,IAAI,KAAMA,EAAajvL,CAAC,CACjC,EAEQkvL,EAAKnvL,EAAIivL,EACTG,GAAMpvL,EAAI9F,GAAS+0L,EACnB9sI,EAAKliD,EAAIivL,EACT9sI,GAAMniD,EAAI9F,GAAU+0L,EAE1B,MAAO,CACL,KAAMhuL,EAAO,MAASA,EAAO,MAAQA,EAAO,MAAQiuL,EACpD,MAAOjuL,EAAO,MAASA,EAAO,MAAQA,EAAO,MAAQkuL,EACrD,IAAKluL,EAAO,KAAQA,EAAO,OAASA,EAAO,KAAOihD,EAClD,OAAQjhD,EAAO,KAAQA,EAAO,OAASA,EAAO,KAAOkhD,CACzD,CACA,CAEA,SAASitI,GAAwBC,EAAkBtwI,EAAM,CACvD,MAAMuwI,EAAM,OAAOD,IAAmB,CAAC,GAAK,CAAC,EACvCE,EAAM,OAAOF,IAAmB,CAAC,GAAK,CAAC,EACvCG,EAAM,OAAOH,IAAmB,CAAC,GAAK,CAAC,EACvCI,EAAM,OAAOJ,IAAmB,CAAC,GAAK,CAAC,EAC7C,MAAI,CAAC,OAAO,SAASC,CAAG,GAAK,CAAC,OAAO,SAASC,CAAG,GAAK,KAAK,IAAID,CAAG,EAAI,OAAS,KAAK,IAAIC,CAAG,EAAI,MACtF,KAEF,CACL,KAAMxwI,IAASywI,EAAM,GAAKF,GAC1B,MAAOvwI,IAASywI,EAAM,GAAKF,GAC3B,OAAQvwI,IAAS0wI,EAAM,GAAKF,GAC5B,IAAKxwI,IAAS0wI,EAAM,GAAKF,EAC7B,CACA,CAEA,SAASG,GAAyBL,EAAkB,CAClD,MAAMC,EAAM,OAAOD,IAAmB,CAAC,GAAK,CAAC,EACvCE,EAAM,OAAOF,IAAmB,CAAC,GAAK,CAAC,EACvCM,EAAM,OAAON,IAAmB,EAAE,GAAK,CAAC,EACxCO,EAAM,OAAOP,IAAmB,EAAE,GAAK,CAAC,EAC9C,MAAI,CAAC,OAAO,SAASC,CAAG,GAAK,CAAC,OAAO,SAASC,CAAG,GAAK,KAAK,IAAID,CAAG,EAAI,OAAS,KAAK,IAAIC,CAAG,EAAI,MACtF,KAEF,CACL,MAAO,GAAKI,GAAOL,EACnB,OAAQ,EAAIK,GAAOL,EACnB,QAAS,GAAKM,GAAOL,EACrB,KAAM,EAAIK,GAAOL,CACrB,CACA,CAEA,SAASM,GAA2Bz4L,EAAO,CACzC,GAAI,OAAOA,GAAU,UAAW,OAAOA,EACvC,GAAI,OAAOA,GAAU,UAAY,OAAOA,GAAU,SAChD,OAAO,OAAOA,CAAK,IAAM,EAE3B,GAAI,OAAOA,GAAU,SAAU,CAC7B,MAAMO,EAAaP,EAAM,KAAI,EAAG,YAAW,EAC3C,GAAI,CAACO,EAAY,MAAO,GACxB,GAAI,CAAC,IAAK,OAAQ,MAAO,IAAK,KAAM,UAAW,MAAM,EAAE,SAASA,CAAU,EAAG,MAAO,GACpF,GAAI,CAAC,IAAK,QAAS,KAAM,IAAK,MAAO,UAAU,EAAE,SAASA,CAAU,EAAG,MAAO,EAChF,CACA,MAAO,EACT,CAEA,SAASm4L,GAAoB14L,EAAO,CAClC,MAAMO,EAAa,OAAOP,GAAS,EAAE,EAAE,KAAI,EAAG,YAAW,EACzD,OAAIO,IAAe,OAAe,OAC9BA,IAAe,UAAYA,IAAe,SAAWA,IAAe,YAAoB,SACrF,IACT,CAEA,SAASo4L,GAA0BzxL,EAAS3E,EAAM,CAChD,GAAI,CAAC2E,GAAW,OAAO3E,GAAS,UAAY,CAACA,EAAK,KAAI,EAAI,OAC1D,MAAMyzE,EAAO9uE,EAAQ,0BAA0B3E,CAAI,GAAK,KACxD,GAAI,CAACyzE,GAAQ,OAAOA,EAAK,WAAa,CAAC,IAAM,EAAG,OAChD,GAAI,OAAOA,EAAK,IAAI,IAAMx3B,GAAAA,cAAc,QAAU,OAAOw3B,EAAK,IAAI,IAAMx3B,GAAAA,cAAc,SACpF,OAAOt3C,EAAQ,4BAA4B3E,CAAI,EAEjD,IAAIvC,EACJ,MAAMgvB,EAAO,IAAM,CAEjBhvB,GADekH,EAAQ,4BAA4B3E,CAAI,GAAK,OAC5C,OAAO,CAAC,CAC1B,EACA,GAAI,CACE,OAAO2E,EAAQ,kBAAqB,WAAYA,EAAQ,iBAAiB8nB,CAAI,EAC5EA,EAAI,CACX,OAASnqB,EAAO,CACd,QAAQ,KAAK,6CAA6CtC,CAAI,KAAMsC,CAAK,EACzE,MACF,CACA,OAAO7E,CACT,CAEA,SAAS44L,GAAgC1xL,EAAS3E,EAAM,CACtD,MAAMvC,EAAQ24L,GAA0BzxL,EAAS3E,CAAI,EACrD,OAAIvC,GAAS,KAAa,KACnB,OAAOA,CAAK,EAAE,KAAI,GAAM,IACjC,CAEA,SAAS64L,GAA2B3xL,EAAS3E,EAAMtC,EAAU,CAC3D,MAAMD,EAAQ,OAAO24L,GAA0BzxL,EAAS3E,CAAI,CAAC,EAC7D,OAAO,OAAO,SAASvC,CAAK,EAAIA,EAAQC,CAC1C,CAEA,SAAS64L,GAAwC5xL,EAAS6xL,EAAmB,GAAI,CAC/E,MAAMC,EAAgBN,GAAoBK,EAAiB,UAAU,EAC/DE,EAAiBR,GAA2BE,GAA0BzxL,EAASyqL,EAAyB,CAAC,EACzGuH,EAAkCH,EAAiB,kBAAoBE,EAAiB,GAAO,QACrG,GAAID,IAAkB,SACpB,MAAO,CAAE,GAAGD,EAAkB,WAAY,SAAU,gBAAiBG,CAA+B,EAEtG,GAAI,CAACD,GAAkBD,IAAkB,OACvC,MAAO,CAAE,GAAGD,EAAkB,WAAY,QAAQ,EAEpD,GAAI,CAACE,EACH,eAAQ,KAAK,+FAA+F,EACrG,CAAE,GAAGF,EAAkB,WAAY,QAAQ,EAGpD,MAAMrjL,EAAsB,OAC1BqjL,EAAiB,qBACZH,GAAgC1xL,EAAS,uBAAuB,GAChE0qL,EACT,EAAI,KAAI,EACN,GAAI,CAACl8K,GAAuB,CAACxO,GAAS,mBAAmBwO,CAAmB,EAC1E,eAAQ,KACN,gEAAgEA,GAAuBk8K,EAAkC,mBAC/H,EACW,CAAE,GAAGmH,EAAkB,WAAY,SAAU,gBAAiBG,CAA+B,EAGtG,MAAMC,EAAyBJ,EAAiB,mBAAqBH,GAAgC1xL,EAAS,qBAAqB,EAC7HkyL,EAA0B,OAAOD,GAA2B,UAAYA,EAAuB,KAAI,EACrGA,EAAuB,KAAI,EAC3BtH,GACEl8K,EAAoBzO,GAAS,mBAAmBkyL,CAAuB,EACzEA,EACA,KACEC,EAA6BN,EAAiB,uBAC/CH,GAAgC1xL,EAAS,oBAAoB,EAC5DoyL,EAA8B,OAAOD,GAA+B,UAAYA,EAA2B,KAAI,EACjHA,EAA2B,KAAI,EAC/B,KACEE,EAA0B,GAC9BD,GACGpyL,GAAS,mBAAmBoyL,CAA2B,GAG5D,MAAO,CACL,GAAGP,EACH,WAAY,OACZ,gBAAiBG,EACjB,oBAAAxjL,EACA,kBAAAC,EACA,sBAAuB4jL,EAA0BD,EAA8B,KAC/E,wBAAAC,EACA,MAAOV,GAA2B3xL,EAAS,SAAU6xL,EAAiB,OAASjH,GAA2B,KAAK,EAC/G,MAAO+G,GAA2B3xL,EAAS,SAAU6xL,EAAiB,OAASjH,GAA2B,KAAK,EAC/G,UAAW+G,GAA2B3xL,EAAS,aAAc6xL,EAAiB,WAAajH,GAA2B,SAAS,EAC/H,kBAAmB+G,GACjB3xL,EACA,mBACA6xL,EAAiB,mBAAqBjH,GAA2B,iBACvE,EACI,uBAAwB+G,GACtB3xL,EACA,4BACA6xL,EAAiB,wBAA0BjH,GAA2B,sBAC5E,EACI,WAAY+G,GACV3xL,EACA,gBACA6xL,EAAiB,YAAcjH,GAA2B,UAChE,EACI,YAAa,OAAO,SAAS,OAAOiH,EAAiB,WAAW,CAAC,EAAIA,EAAiB,YAAc,EACpG,WAAY,OAAO,SAAS,OAAOA,EAAiB,UAAU,CAAC,EAAIA,EAAiB,WAAa,EACjG,SAAU,OAAO,SAAS,OAAOA,EAAiB,QAAQ,CAAC,EAAIA,EAAiB,SAAW,CAC/F,CACA,CAEA,SAASS,GAAqCv1L,EAAQ,CACpD,MAAM+F,EAAQ,KAAK,IAAI,EAAG,OAAO/F,GAAQ,SAAS,OAAS,CAAC,GAAK,CAAC,EAC5D8F,EAAS,KAAK,IAAI,EAAG,OAAO9F,GAAQ,SAAS,QAAU,CAAC,GAAK,CAAC,EAC9DiH,EAAalB,EAAQ,KAAOA,EAAQ,KAAK,IAAI,EAAGD,EAAS,GAAI,EACnE,OAAO,KAAK,IAAI,KAAMmB,EAAa,IAAK,CAC1C,CAEA,SAASX,GAAOvK,EAAO,CACrB,IAAI2I,EAAI3I,IAAU,EAClB,OAAA2I,GAAKA,IAAM,GACXA,EAAI,KAAK,KAAKA,EAAG,UAAU,IAAM,EACjCA,GAAKA,IAAM,GACXA,EAAI,KAAK,KAAKA,EAAG,UAAU,IAAM,EACjCA,GAAKA,IAAM,GACJA,IAAM,CACf,CAEA,SAAS8wL,GAAmBpyL,EAAUgnB,EAAY,EAAG,CACnD,GAAI,EAAEhnB,aAAoB,eAAiBA,EAAS,OAAS,EAAG,MAAO,GACvE,IAAIuD,EAAO,IACPC,EAAO,KACX,QAAS3B,EAAI,EAAGA,EAAI7B,EAAS,OAAQ6B,GAAK,EAAG,CAC3C,MAAM4B,EAAI,OAAOzD,EAAS6B,CAAC,CAAC,EACvB,OAAO,SAAS4B,CAAC,IAClBA,EAAIF,IAAMA,EAAOE,GACjBA,EAAID,IAAMA,EAAOC,GACvB,CACA,GAAI,CAAC,OAAO,SAASF,CAAI,GAAK,CAAC,OAAO,SAASC,CAAI,EAAG,MAAO,GAC7D,MAAM0jB,EAAY,KAAK,IAAI,KAAM,KAAK,IAAI,OAAOF,CAAS,GAAK,CAAC,EAAI,GAAI,EACxE,OAAQxjB,EAAOD,EAAQ2jB,CACzB,CAEA,SAASmrK,GAAuBryL,EAAUgnB,EAAY,EAAG,CACvD,GAAI,EAAEhnB,aAAoB,eAAiBA,EAAS,OAAS,EAAG,MAAO,GACvE,MAAMinB,EAAgB,KAAK,IAAI,KAAM,OAAOD,CAAS,GAAK,CAAC,EACrD3mB,EAAQ,KAAK,MAAML,EAAS,OAAS,CAAC,EAC5C,GAAIK,GAAS,GAAK+xL,GAAmBpyL,EAAUinB,CAAa,EAAG,MAAO,GACtE,IAAIE,EAAO,EACX,QAASnjB,EAAS,EAAGA,EAAS3D,EAAO2D,GAAU,EAC7CmjB,KAAYjkB,GAAOc,EAAS,CAAC,EAAI,IAAO,WAAc,IAAOijB,EAE/DE,GAAQ,KAAK,IAAI,EAAG9mB,CAAK,EACzB,QAAS2D,EAAS,EAAGA,EAAS3D,EAAO2D,GAAU,EAAG,CAChD,MAAM3C,EAAU2C,EAAS,EAAK,EACxB0T,EAAW,OAAO1X,EAASqB,CAAM,CAAC,EAClC+lB,EAAQ,OAAO,SAAS1P,CAAQ,EAAIA,EAAW,EAC/C2P,IAAYnkB,GAAOc,EAAS,CAAC,EAAI,IAAO,WAAc,IAAOijB,EAAiBE,EACpFnnB,EAASqB,CAAM,EAAI+lB,EAAQC,CAC7B,CACA,MAAO,EACT,CAEA,SAASirK,GAA2BC,EAAcvwL,EAAMvI,EAAM,CAC5D,MAAM+4L,EAAW/4L,IAAS,KAAO,KAAO,KAClC+B,EAAQ,KAAK,IAAI,EAAGwG,GAAM,OAAS,CAAC,EAAE,IACtCvG,EAAS,KAAK,IAAI,EAAGuG,GAAM,QAAU,CAAC,EAAE,IACxCywL,EAAU,KAAK,IAAI,EAAG,KAAK,IAAIj3L,EAAOC,CAAM,CAAC,EAC7C2G,EAAO,CACX,MAAOqwL,EACP,OAAQA,EACR,MAAOD,IAAa,KAAOC,EAAU,EACrC,KAAMD,EACN,OAAQ,CAAC,EAAG,EAAG,CAAC,CACpB,EAEE,GAAI,CAACD,GAAgB5H,GAAiB4H,CAAY,EAAG,OAAOnwL,EAC5D,GAAImwL,GAAc,OAAS,SAAU,CACnC,MAAMG,EAAOH,EAAa,SAAW,CAAA,EAC/B7vL,EAAS,OAAO,SAASgwL,EAAK,MAAM,EAAI,KAAK,IAAI,EAAGA,EAAK,MAAM,EAAI,IACnE/vL,EAAQ,OAAO,SAAS+vL,EAAK,KAAK,EAAI,KAAK,IAAI,EAAGA,EAAK,KAAK,EAAIhwL,EAChET,EAAS,MAAM,QAAQywL,EAAK,MAAM,EAAIA,EAAK,OAAS,CAAC,EAAG,EAAG,CAAC,EAC5DpwF,EAAOkwF,IAAa,KAAO,KAAK,IAAI9vL,EAAQC,EAAO,CAAC,EAAID,EAC9D,MAAO,CACL,MAAO4/F,EACP,OAAQA,EACR,MAAOkwF,IAAa,KAAOlwF,EAAO,EAClC,KAAMkwF,EACN,OAAAvwL,CACN,CACE,CACA,GAAIswL,GAAc,OAAS,aAAeA,GAAc,OAAS,WAAY,CAC3E,MAAMG,EAAOH,EAAa,SAAW,CAAA,EAC/B7vL,EAAS,OAAO,SAASgwL,EAAK,MAAM,EAAI,KAAK,IAAI,EAAGA,EAAK,MAAM,EAAI,IACnE/vL,EAAQ,OAAO,SAAS+vL,EAAK,KAAK,EAAI,KAAK,IAAI,EAAGA,EAAK,KAAK,EAAIhwL,EAChET,EAAS,MAAM,QAAQywL,EAAK,MAAM,EAAIA,EAAK,OAAS,CAAC,EAAG,EAAG,CAAC,EAC5DpwF,EAAOkwF,IAAa,KAAO,KAAK,IAAI9vL,EAAQC,EAAO,CAAC,EAAID,EAC9D,MAAO,CACL,MAAO4/F,EACP,OAAQA,EACR,MAAOkwF,IAAa,KAAOlwF,EAAO,EAClC,KAAMkwF,EACN,OAAAvwL,CACN,CACE,CAEA,GAAIswL,GAAc,OAAS,aAAeA,GAAc,OAAS,cAAe,CAC9E,MAAM/vL,EAAS+vL,GAAc,SAAS,QAAU,KAChD,GAAI,MAAM,QAAQ/vL,CAAM,GAAKA,EAAO,QAAU,EAAG,CAC/C,MAAMxB,EAAO,OAAOwB,EAAO,CAAC,CAAC,EACvBvB,EAAO,OAAOuB,EAAO,CAAC,CAAC,EACvBtB,EAAO,OAAOsB,EAAO,CAAC,CAAC,EACvBrB,EAAO,OAAOqB,EAAO,CAAC,CAAC,EAC7B,GAAI,CAACxB,EAAMC,EAAMC,EAAMC,CAAI,EAAE,MAAM,OAAO,QAAQ,EAChD,MAAO,CACL,MAAO,KAAK,IAAI,EAAGD,EAAOF,CAAI,EAC9B,OAAQ,KAAK,IAAI,EAAGG,EAAOF,CAAI,EAC/B,MAAO,EACP,KAAMuxL,EACN,OAAQ,EAAExxL,EAAOE,GAAQ,IAAMD,EAAOE,GAAQ,GAAK,CAAC,CAC9D,CAEI,CACF,CAEA,MAAMqB,EAAS+vL,GAAc,SAAS,QAAU,KAChD,GAAI,MAAM,QAAQ/vL,CAAM,GAAKA,EAAO,QAAU,EAAG,CAC/C,MAAMxB,EAAO,OAAOwB,EAAO,CAAC,CAAC,EACvBvB,EAAO,OAAOuB,EAAO,CAAC,CAAC,EACvBtB,EAAO,OAAOsB,EAAO,CAAC,CAAC,EACvBrB,EAAO,OAAOqB,EAAO,CAAC,CAAC,EAC7B,GAAI,CAACxB,EAAMC,EAAMC,EAAMC,CAAI,EAAE,MAAM,OAAO,QAAQ,EAChD,MAAO,CACL,MAAO,KAAK,IAAI,EAAGD,EAAOF,CAAI,EAC9B,OAAQ,KAAK,IAAI,EAAGG,EAAOF,CAAI,EAC/B,MAAO,EACP,KAAMuxL,EACN,OAAQ,EAAExxL,EAAOE,GAAQ,IAAMD,EAAOE,GAAQ,GAAK,CAAC,CAC5D,CAEE,CAEA,OAAOiB,CACT,CAEA,SAASuwL,GAAqC36K,EAAM,CAClD,OAAOA,IAASm/B,GAAAA,cAAc,OACzBn/B,IAASm/B,GAAAA,cAAc,QACvBn/B,IAASm/B,GAAAA,cAAc,SACvBn/B,IAASm/B,GAAAA,cAAc,iBACvBn/B,IAASm/B,GAAAA,cAAc,YACvBn/B,IAASm/B,GAAAA,cAAc,kBAC9B,CAEA,SAASy7I,GAAgB13L,EAAM,CAC7B,GAAI,OAAOA,GAAS,SAAU,MAAO,UACrC,MAAMi0E,EAAUj0E,EAAK,KAAI,EACzB,GAAI,CAACi0E,EAAS,MAAO,UACrB,MAAM0jH,EAAe1jH,EAAQ,QAAQ,cAAe,EAAE,EACtD,GAAI0jH,IAAiB1jH,EAAS,OAAO0jH,EACrC,MAAMC,EAAe3jH,EAAQ,QAAQ,gCAAiC,EAAE,EACxE,OAAI2jH,IAAiB3jH,EAAgB2jH,EAC9B3jH,EAAQ,QAAQ,YAAa,EAAE,GAAKA,CAC7C,CAEA,SAAS/mE,GAAMzP,EAAOsK,EAAKoF,EAAK,CAC9B,OAAO,KAAK,IAAIpF,EAAK,KAAK,IAAIoF,EAAK1P,CAAK,CAAC,CAC3C,CAEA,SAASo6L,GAASp6L,EAAOC,EAAW,EAAG,CACrC,MAAO,CACL,OAAO,SAASD,IAAQ,CAAC,CAAC,EAAIA,EAAM,CAAC,EAAIC,EACzC,OAAO,SAASD,IAAQ,CAAC,CAAC,EAAIA,EAAM,CAAC,EAAIC,EACzC,OAAO,SAASD,IAAQ,CAAC,CAAC,EAAIA,EAAM,CAAC,EAAIC,CAC7C,CACA,CAEA,SAASo6L,GAAwBnsI,EAAMr2C,EAAY,EAAG,CACpD,MAAMwwE,EAAO,KAAK,IAAI,KAAM,OAAO,SAASn6B,GAAM,IAAI,EAAIA,EAAK,KAAO,CAAC,EACjEosI,EAAMpsI,GAAM,OAAS,CAAC,EAAG,EAAG,CAAC,EACnC,MAAO,CACL,EAAE,OAAOosI,EAAI,CAAC,CAAC,GAAK,GAAKjyG,EACzB,EAAE,OAAOiyG,EAAI,CAAC,CAAC,GAAK,GAAKjyG,EACzB,OAAO,SAASxwE,CAAS,EAAIA,EAAY,CAC7C,CACA,CAEA,SAAS0iL,GAAwBrsI,EAAM,CACrC,MAAMpsD,EAASosD,GAAM,QAAU,CAAC,EAAG,EAAG,CAAC,EACjCosI,EAAMpsI,GAAM,OAAS,CAAC,EAAG,EAAG,CAAC,EACnC,MAAO,EACJ,OAAOpsD,EAAO,CAAC,CAAC,GAAK,IAAM,OAAOw4L,EAAI,CAAC,CAAC,GAAK,IAC7C,OAAOx4L,EAAO,CAAC,CAAC,GAAK,IAAM,OAAOw4L,EAAI,CAAC,CAAC,GAAK,IAC7C,OAAOx4L,EAAO,CAAC,CAAC,GAAK,IAAM,OAAOw4L,EAAI,CAAC,CAAC,GAAK,EAClD,CACA,CAEA,SAASE,GAA6BtsI,EAAM,CAC1C,MAAMxZ,EAAiB,KAAK,IAAI,EAAG,OAAOwZ,GAAM,UAAU,MAAM,GAAK,CAAC,EAChEm6B,EAAO,KAAK,IAAI,KAAM,OAAO,SAASn6B,GAAM,IAAI,EAAIA,EAAK,KAAO,CAAC,EACjE7C,GAAW,OAAO,SAAS6C,GAAM,GAAG,EAAIA,EAAK,IAAM,IAAM,KAAK,GAAM,IACpEusI,EAAa,KAAK,IAAI,KAAM,KAAK,IAAIpvI,EAAS,EAAG,CAAC,EACxD,OAAO3W,GAAkB,EAAI2zC,EAAOoyG,EACtC,CAEA,SAASC,GAA6BxsI,EAAM,CAC1C,MAAMxZ,EAAiB,KAAK,IAAI,EAAG,OAAOwZ,GAAM,UAAU,MAAM,GAAK,CAAC,EAChE8iC,EAAW,KAAK,IAAI,KAAM,OAAO,SAAS9iC,GAAM,QAAQ,EAAIA,EAAK,SAAW,GAAG,EAC/E7C,GAAW,OAAO,SAAS6C,GAAM,GAAG,EAAIA,EAAK,IAAM,IAAM,KAAK,GAAM,IACpEysI,EAAc,KAAK,IAAI,KAAM,EAAI3pG,EAAW,KAAK,IAAI3lC,EAAS,EAAG,CAAC,EACxE,OAAO3W,EAAiBimJ,CAC1B,CAEA,MAAMC,GAAkC,IAClCC,GAAkCrtI,GAAyB,KAAO,GAAI,EACtEstI,GAAiC,IACjCC,GAAoC,KACpCC,GAAuC,IACvCC,GAAuC,IACvCC,GAAuC,IACvCC,GAA8B,EAC9BC,GAAoC,KACpCC,GAA2C,IAC3CC,GAAmB,OAAO,OAAO,CACrC,eAAgB,GAChB,0BAA2B,GAC3B,iBAAkB,IAClB,iBAAkB,IAClB,iBAAkB,EACpB,CAAC,EACKC,GAAyB,OAAO,OAAO,CAC3C,QAAS,GACT,QAAS,GACT,OAAQ,GACR,KAAM,GACN,mBAAoB,GACpB,MAAO,OACP,WAAY,GACZ,IAAK,EACL,OAAQ,GACR,aAAc,GACd,WAAY,IACd,CAAC,EACKC,GAA2B,wBAC3BC,GAA0B,4DAE1BptL,GAAwB,IAAI,QAElC,SAASlC,GAASC,EAAOjJ,EAAKQ,EAAS0I,EAAS,OAAW,CACzD,GAAI,OAAO,QAAY,KAAe,OAAO,QAAQ,MAAS,WAAY,OAC1E,MAAMvK,EAASsK,IAAU,OAAOA,GAAU,UAAY,OAAOA,GAAU,YAAcA,EAAQD,GAC7F,IAAIoC,EAAOF,GAAsB,IAAIvM,CAAM,EACtCyM,IACHA,EAAO,IAAI,IACXF,GAAsB,IAAIvM,EAAQyM,CAAI,GAExC,MAAMk2E,EAAgB,OAAOthF,GAAOQ,CAAO,EACvC4K,EAAK,IAAIk2E,CAAa,IAC1Bl2E,EAAK,IAAIk2E,CAAa,EAClBp4E,IAAW,OAAW,QAAQ,KAAK1I,CAAO,EACzC,QAAQ,KAAKA,EAAS0I,CAAM,EACnC,CAEA,MAAMqvL,GAA0B,OAAO,OAAO,CAC5C,QAAS,GACT,gBAAiB,IACjB,oBAAqB,IACrB,kBAAmB,IACnB,qBAAsB,IACtB,qBAAsB,IACtB,yBAA0B,EAC1B,4BAA6B,IAC7B,kBAAmBZ,GACnB,uBAAwB,GACxB,iCAAkCG,GAClC,iCAAkCC,GAClC,yBAA0BC,GAC1B,8BAA+BC,GAC/B,UAAW,GACX,oBAAqBJ,GACrB,MAAO,GACP,WAAY,EACZ,UAAW,OAAO,OAAO,CAAC,EAAG,EAAG,CAAC,CAAC,EAClC,WAAY,IACZ,eAAgB,EAChB,aAAc,GACd,uBAAwB,IACxB,kBAAmB,IACrB,CAAC,EAED,SAASx8F,GAAex+F,EAAOC,EAAW,EAAG,CAC3C,MAAMC,EAAU,OAAOF,CAAK,EAC5B,OAAO,OAAO,SAASE,CAAO,EAAIA,EAAUD,CAC9C,CAEA,MAAM07L,GAAkC,OAAO,OAAO,CACpD,QAAS,GACT,KAAM,MACN,aAAc,QACd,WAAY,IACZ,iBAAkB,GAClB,wBAAyB,EACzB,yBAA0B,IAC1B,sBAAuB,EACvB,sBAAuB,GACvB,sBAAuB,IACvB,OAAQ,SACR,UAAW,EACX,qBAAsB,IACxB,CAAC,EAEKC,GAAmB,OAAO,OAAO,CACrC,QAAS,GACT,aAAc,GACd,YAAa,GACb,cAAe,GACf,UAAW,KACX,YAAa,kBACb,SAAU,UACV,gBAAiB,OACjB,eAAgB,aAChB,YAAa,GACb,QAAS,KACT,cAAe,EACf,cAAe,EACf,eAAgB,GAChB,0BAA2B,GAC3B,SAAU,kBACV,iBAAkB,sBAClB,kBAAmB,sBACnB,kBAAmB,MACrB,CAAC,EAEKC,GAAwC,8BAE9C,SAASC,GAA2B37F,EAAiB,CACnD,OAAO,OAAOA,GAAoB,UAC7BA,EAAgB,KAAI,EAAG,OAAS,GAChCA,EAAgB,KAAI,IAAO,MAClC,CAEA,SAAS47F,GAA8B17F,EAAUF,EAAiB,CAChE,MAAMG,EAAc,OAAOD,GAAa,SAAWA,EAAS,KAAI,EAAK,GAC/DE,EAAa,OAAOJ,GAAoB,SAAWA,EAAgB,KAAI,EAAK,GAElF,MADI,CAACI,GAAcA,IAAe,QAC9BD,GAAeC,IAAeD,EAAoB,OAC/CC,CACT,CAEA,SAASy7F,GAA6B77F,EAAiBj+D,EAAe,CACpE,OAAO45J,GAA2B37F,CAAe,GAAKj+D,IAAkB,WACpE,WACA,YACN,CAEA,SAAS+5J,GAA4Bx4L,EAAQ,CAC3C,OAAOu4L,GAA6Bv4L,GAAQ,gBAAiBA,GAAQ,cAAc,IAAM,UAC3F,CAEA,SAASy4L,GAA6Bz4L,EAAQstF,EAAS,CACrD,OAAIkrG,GAA4Bx4L,CAAM,EAC7BA,GAAQ,kBAAoBA,GAAQ,mBAAqBA,GAAQ,SAEtEstF,GAAS,YAAc,GAClBttF,GAAQ,mBAAqBA,GAAQ,SAEvCA,GAAQ,QACjB,CAEA,MAAM04L,GAAiC,OAAO,OAAO,CACnD,QAAS,GACT,qBAAsB,GACtB,oBAAqB,GACrB,gBAAiB,IACjB,kBAAmB,IACnB,iBAAkB,GAClB,iBAAkB,EACpB,CAAC,EAEKC,GAAkC,OAAO,OAAO,CACpD,oBAAqB,IACrB,iBAAkB,GAClB,mBAAoB,EACpB,cAAe,EACf,aAAc,IAChB,CAAC,EAED,SAASC,GAAuBr8L,EAAO,CACrC,GAAIA,GAAS,KAAM,OAAO,KAC1B,GAAI,OAAOA,GAAU,SAAU,CAC7B,MAAME,EAAU,KAAK,MAAMF,CAAK,EAChC,OAAO,OAAO,SAASE,CAAO,GAAKA,GAAW,EAAI,CAACA,CAAO,EAAI,CAAA,CAChE,CACA,MAAMsC,EAAO,CAAA,EACPwlF,EAAO,IAAI,IACjB,OAAAoqG,GAAapyL,EAAQguB,GAAU,CAC7B,MAAM9tB,EAAU,KAAK,MAAM,OAAO8tB,CAAK,CAAC,EACpC,CAAC,OAAO,SAAS9tB,CAAO,GAAKA,EAAU,GAAK8nF,EAAK,IAAI9nF,CAAO,IAChE8nF,EAAK,IAAI9nF,CAAO,EAChBsC,EAAK,KAAKtC,CAAO,EACnB,CAAC,EACMsC,CACT,CAEA,SAAS85L,GAA+Bt8L,EAAO,CAC7C,GAAIA,GAAS,KAAM,MAAO,CAAA,EAC1B,GAAI,OAAOA,GAAU,SAAU,CAC7B,MAAME,EAAU,KAAK,MAAMF,CAAK,EAChC,OAAO,OAAO,SAASE,CAAO,GAAKA,GAAW,EAAI,CAACA,CAAO,EAAI,CAAA,CAChE,CACA,MAAMsC,EAAO,CAAA,EACb,OAAA4vL,GAAapyL,EAAQguB,GAAU,CAC7B,MAAM9tB,EAAU,KAAK,MAAM,OAAO8tB,CAAK,CAAC,EACpC,CAAC,OAAO,SAAS9tB,CAAO,GAAKA,EAAU,GAC3CsC,EAAK,KAAKtC,CAAO,CACnB,CAAC,EACMsC,CACT,CAEA,SAAS+5L,GAAkBjqL,EAAKd,EAAQ,CACtC,OAAIc,aAAe,cAAgBA,EAAI,QAAUd,EAAec,EACzD,IAAI,aAAa,KAAK,IAAI,EAAGd,CAAM,CAAC,CAC7C,CAEA,SAASgrL,GAA8B/0L,EAAMuK,EAAKM,EAAM,KAAM,CAC5D,MAAM5K,EAAQsK,GAAK,QAAU,EACvB5J,EAAYm0L,GAAkBjqL,EAAK5K,EAAQ,CAAC,EAElD,GADAU,EAAU,KAAK,EAAG,EAAGV,EAAQ,CAAC,EAC1B,CAACD,GAAQ,CAAC,OAAO,SAASA,EAAK,MAAM,EAAG,OAAOW,EACnD,QAASc,EAAI,EAAGA,EAAIxB,EAAOwB,GAAK,EAAG,CAEjC,MAAMsJ,EADKR,EAAI9I,CAAC,EACC,EACXuJ,EAAMvJ,EAAI,EACZsJ,EAAM,GAAK/K,EAAK,SACpBW,EAAUqK,CAAG,EAAI,OAAO,SAAShL,EAAK+K,CAAG,CAAC,EAAI/K,EAAK+K,CAAG,EAAI,EAC1DpK,EAAUqK,EAAM,CAAC,EAAI,OAAO,SAAShL,EAAK+K,EAAM,CAAC,CAAC,EAAI/K,EAAK+K,EAAM,CAAC,EAAI,EACtEpK,EAAUqK,EAAM,CAAC,EAAI,OAAO,SAAShL,EAAK+K,EAAM,CAAC,CAAC,EAAI/K,EAAK+K,EAAM,CAAC,EAAI,EACxE,CACA,OAAOpK,CACT,CAEA,SAASq0L,GAA2Br0L,EAAWV,EAAO4K,EAAM,KAAM,CAChE,MAAMK,EAAW4pL,GAAkBjqL,EAAK,CAAC,EACzCK,EAAS,CAAC,EAAI,EACdA,EAAS,CAAC,EAAI,EACdA,EAAS,CAAC,EAAI,EACd,MAAMC,EAAY,KAAK,IAAI,EAAG,KAAK,IAAI,KAAK,MAAM,OAAOlL,CAAK,GAAK,CAAC,EAAG,KAAK,OAAOU,GAAW,QAAU,GAAK,CAAC,CAAC,CAAC,EAChH,GAAIwK,GAAa,EAAG,MAAO,CAAE,SAAAD,EAAU,MAAO,CAAC,EAC/C,IAAIE,EAAO,EACPC,EAAO,EACPC,EAAO,EACPC,EAAQ,EACZ,QAAS9J,EAAI,EAAGA,EAAI0J,EAAW1J,GAAK,EAAG,CACrC,MAAMR,EAASQ,EAAI,EACbP,EAAIP,EAAUM,CAAM,EACpBE,EAAIR,EAAUM,EAAS,CAAC,EACxBoC,EAAI1C,EAAUM,EAAS,CAAC,EAC1B,CAAC,OAAO,SAASC,CAAC,GAAK,CAAC,OAAO,SAASC,CAAC,GAAK,CAAC,OAAO,SAASkC,CAAC,IACpE+H,GAAQlK,EACRmK,GAAQlK,EACRmK,GAAQjI,EACRkI,GAAS,EACX,CACA,OAAIA,EAAQ,IACVL,EAAS,CAAC,EAAIE,EAAOG,EACrBL,EAAS,CAAC,EAAIG,EAAOE,EACrBL,EAAS,CAAC,EAAII,EAAOC,GAEhB,CAAE,SAAAL,EAAU,MAAOK,CAAK,CACjC,CAEA,SAAS0pL,GAA2B18L,EAAOC,EAAW,EAAG,CACvD,MAAMC,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrBuP,GAAMvP,EAAS,IAAK,EAAE,EADSD,CAExC,CAEA,SAAS08L,GAA6BlzL,EAAO,GAAIukD,EAAQ,CAAA,EAAI,CAC3D,MAAMxrD,EAAO,CAAE,GAAGiH,CAAI,EACtB,OAAI,OAAO,UAAU,eAAe,KAAKukD,EAAO,SAAS,IACvDxrD,EAAK,QAAUwrD,EAAM,UAAY,IAE/B,OAAO,UAAU,eAAe,KAAKA,EAAO,iBAAiB,IAC/DxrD,EAAK,gBAAkBiN,GACrB+mI,GAA2BxoF,EAAM,gBAAiBxrD,EAAK,iBAAmBk5L,GAAwB,gBAAiB,GAAK,CAAC,EACzH,GACA,CACN,GAEM,OAAO,UAAU,eAAe,KAAK1tI,EAAO,qBAAqB,IACnExrD,EAAK,oBAAsBg0I,GAA2BxoF,EAAM,oBAAqBxrD,EAAK,qBAAuB,EAAG,EAAG,CAAC,GAElH,OAAO,UAAU,eAAe,KAAKwrD,EAAO,mBAAmB,IACjExrD,EAAK,kBAAoBg0I,GAA2BxoF,EAAM,kBAAmBxrD,EAAK,mBAAqB,EAAG,EAAG,GAAK,GAEhH,OAAO,UAAU,eAAe,KAAKwrD,EAAO,sBAAsB,IACpExrD,EAAK,qBAAuBg0I,GAA2BxoF,EAAM,qBAAsBxrD,EAAK,sBAAwB,EAAG,EAAG,GAAK,GAEzH,OAAO,UAAU,eAAe,KAAKwrD,EAAO,sBAAsB,IACpExrD,EAAK,qBAAuBg0I,GAA2BxoF,EAAM,qBAAsBxrD,EAAK,sBAAwB,EAAG,EAAG,GAAK,GAEzH,OAAO,UAAU,eAAe,KAAKwrD,EAAO,0BAA0B,IACxExrD,EAAK,yBAA2Bg0I,GAA2BxoF,EAAM,yBAA0BxrD,EAAK,0BAA4B,EAAG,EAAG,EAAE,GAElI,OAAO,UAAU,eAAe,KAAKwrD,EAAO,6BAA6B,IAC3ExrD,EAAK,4BAA8Bo6L,GACjC5uI,EAAM,4BACNxrD,EAAK,6BAA+B,EACpC,EACA,OAAO,gBACb,GAEM,OAAO,UAAU,eAAe,KAAKwrD,EAAO,mBAAmB,IACjExrD,EAAK,kBAAoBo6L,GACvB5uI,EAAM,kBACNxrD,EAAK,mBAAqBs4L,GAC1B,GACA,GACN,GAEM,OAAO,UAAU,eAAe,KAAK9sI,EAAO,wBAAwB,IACtExrD,EAAK,uBAAyBwrD,EAAM,yBAA2B,IAE7D,OAAO,UAAU,eAAe,KAAKA,EAAO,kCAAkC,IAChFxrD,EAAK,iCAAmCo6L,GACtC5uI,EAAM,iCACNxrD,EAAK,kCAAoCy4L,GACzC,EACA,OAAO,gBACb,GAEM,OAAO,UAAU,eAAe,KAAKjtI,EAAO,kCAAkC,IAChFxrD,EAAK,iCAAmCo6L,GACtC5uI,EAAM,iCACNxrD,EAAK,kCAAoC04L,GACzC,EACA,OAAO,gBACb,GAEM,OAAO,UAAU,eAAe,KAAKltI,EAAO,0BAA0B,IACxExrD,EAAK,yBAA2Bg0I,GAC9BxoF,EAAM,yBACNxrD,EAAK,0BAA4B24L,GACjC,EACA,EACN,GAEM,OAAO,UAAU,eAAe,KAAKntI,EAAO,+BAA+B,IAC7ExrD,EAAK,8BAAgCg0I,GACnCxoF,EAAM,8BACNxrD,EAAK,+BAAiC44L,GACtC,EACA,GACN,GAEM,OAAO,UAAU,eAAe,KAAKptI,EAAO,WAAW,IACzDxrD,EAAK,UAAYwrD,EAAM,YAAc,IAEnC,OAAO,UAAU,eAAe,KAAKA,EAAO,qBAAqB,IACnExrD,EAAK,oBAAsBg0I,GAA2BxoF,EAAM,oBAAqBxrD,EAAK,qBAAuB,EAAG,EAAG,GAAK,GAEtH,OAAO,UAAU,eAAe,KAAKwrD,EAAO,OAAO,IACrDxrD,EAAK,MAAQwrD,EAAM,QAAU,IAE3B,OAAO,UAAU,eAAe,KAAKA,EAAO,YAAY,IAC1DxrD,EAAK,WAAak6L,GAChB1uI,EAAM,WACNxrD,EAAK,YAAck5L,GAAwB,UACjD,GAEM,OAAO,UAAU,eAAe,KAAK1tI,EAAO,WAAW,IACzDxrD,EAAK,UAAYmwL,GACf3kI,EAAM,UACNxrD,EAAK,WAAak5L,GAAwB,SAChD,GAEM,OAAO,UAAU,eAAe,KAAK1tI,EAAO,YAAY,IAC1DxrD,EAAK,WAAag0I,GAA2BxoF,EAAM,WAAYxrD,EAAK,YAAc,EAAG,EAAG,EAAE,GAExF,OAAO,UAAU,eAAe,KAAKwrD,EAAO,gBAAgB,IAC9DxrD,EAAK,eAAiB,OAAOwrD,EAAM,cAAc,EAAI,EAAI,GAAK,GAE5D,OAAO,UAAU,eAAe,KAAKA,EAAO,cAAc,IAC5DxrD,EAAK,aAAewrD,EAAM,eAAiB,IAEzC,OAAO,UAAU,eAAe,KAAKA,EAAO,wBAAwB,IACtExrD,EAAK,uBAAyBg0I,GAC5BxoF,EAAM,uBACNxrD,EAAK,wBAA0B,EAC/B,EACA,GACN,GAEM,OAAO,UAAU,eAAe,KAAKwrD,EAAO,mBAAmB,IACjExrD,EAAK,kBAAoB65L,GAAuBruI,EAAM,iBAAiB,GAGzExrD,EAAK,qBAAuB,KAAK,IAAIA,EAAK,sBAAwB,EAAGA,EAAK,sBAAwB,CAAC,EACnGA,EAAK,qBAAuB,KAAK,IAAIA,EAAK,sBAAwB,EAAGA,EAAK,sBAAwB,CAAC,EAC5FA,CACT,CAEA,SAASq6L,GAAuB78L,EAAQ,GAAIY,EAAU,CAAA,EAAI,CACxD,GAAIZ,IAAU,IAASY,EAAQ,iBAAmB,GAChD,MAAO,CACL,GAAG06L,GACH,eAAgB,GAChB,0BAA2B,GAC3B,iBAAkB,EAClB,iBAAkB,EAClB,iBAAkBA,GAAiB,gBACzC,EAEE,MAAMttI,EAAQhuD,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EACrDgvB,EAAO,CAAC7rB,EAAKlD,IACjB,OAAO,UAAU,eAAe,KAAK+tD,EAAO7qD,CAAG,EAC3C6qD,EAAM7qD,CAAG,EACR,OAAO,UAAU,eAAe,KAAKvC,EAASuC,CAAG,EAAIvC,EAAQuC,CAAG,EAAIlD,EAErE68L,EAAO35L,GACX,OAAO,UAAU,eAAe,KAAK6qD,EAAO7qD,CAAG,GAC5C,OAAO,UAAU,eAAe,KAAKvC,EAASuC,CAAG,EAEtD,MAAO,CACL,eAAgB6rB,EAAK,iBAAkBssK,GAAiB,cAAc,IAAM,GAC5E,0BAA2BtsK,EACzB,4BACAssK,GAAiB,yBACvB,IAAU,GACN,iBAAkBsB,GAChB5tK,EAAK,mBAAoBA,EAAK,0BAA2BssK,GAAiB,gBAAgB,CAAC,EAC3FA,GAAiB,iBACjB,EACA,OAAO,gBACb,EACI,iBAAkB9kD,GAChBxnH,EAAK,mBAAoBA,EAAK,0BAA2BssK,GAAiB,gBAAgB,CAAC,EAC3FA,GAAiB,iBACjB,EACA,GACN,EACI,iBAAkBtsK,EAAK,mBAAoBssK,GAAiB,gBAAgB,IAAM,GAClF,0BAA2BwB,EAAI,kBAAkB,GAAKA,EAAI,yBAAyB,EACnF,0BAA2BA,EAAI,kBAAkB,GAAKA,EAAI,yBAAyB,CACvF,CACA,CAEA,SAASC,GAA6B/8L,EAAOY,EAAU,GAAI,CACzD,GAAIZ,IAAU,IAASA,GAAS,MAAQY,EAAQ,iBAAmB,GACjE,MAAO,CACL,GAAG26L,GACH,MAAOxH,GAAmBnzL,EAAQ,YAAY,GAAK26L,GAAuB,MAC1E,QAAS,EACf,EAEE,MAAMvtI,EAAQhuD,GAAS,OAAOA,GAAU,SAAWA,EAAQ,CAAA,EACrDs0L,EAAY1zL,EAAQ,IAAM,OAAOA,EAAQ,IAAO,SAAWA,EAAQ,GAAK,CAAA,EACxEo8L,EAAgBjJ,GAAmBnzL,EAAQ,YAAY,GAAK26L,GAAuB,MACnF7jG,EAAQ,OAAO1pC,EAAM,OAAU,UAAYA,EAAM,MACnDA,EAAM,MACL,OAAOsmI,EAAU,OAAU,UAAYA,EAAU,MAAQA,EAAU,MAAQ0I,EAC1Ev5L,EAAS,CACb,GAAG83L,GACH,GAAGvtI,EACH,MAAA0pC,EACA,QAAS1pC,EAAM,UAAY,GAC3B,QAASA,EAAM,UAAY,IAASA,EAAM,MAAQ,GAClD,OAAQA,EAAM,SAAW,GACzB,KAAMA,EAAM,OAAS,GACrB,mBAAoBA,EAAM,qBAAuB,GACjD,WAAY4uI,GAAyB5uI,EAAM,WAAYutI,GAAuB,WAAY,GAAI,EAAE,EAChG,IAAK/kD,GAA2BxoF,EAAM,IAAKutI,GAAuB,IAAK,EAAG,EAAE,EAC5E,OAAQ/kD,GAA2BxoF,EAAM,OAAQutI,GAAuB,OAAQ,EAAG,EAAE,EACrF,aAAc/kD,GAA2BxoF,EAAM,aAAcutI,GAAuB,aAAc,EAAG,GAAG,EACxG,WAAY/kD,GAA2BxoF,EAAM,WAAYutI,GAAuB,WAAY,KAAM,CAAC,CACvG,EACE,MAAI,CAAC93L,EAAO,SAAW,CAACA,EAAO,QAAU,CAACA,EAAO,OAAMA,EAAO,QAAU,IACjEA,CACT,CAEA,SAASw5L,GAAwBx5L,EAAS,GAAI,CAC5C,MAAO,CACL,GAAGA,EACH,UAAWkvL,GAAwBlvL,EAAO,UAAWi4L,GAAwB,SAAS,EACtF,kBAAmB,MAAM,QAAQj4L,EAAO,iBAAiB,EAAI,CAAC,GAAGA,EAAO,iBAAiB,EAAI,IACjG,CACA,CAEA,SAASy5L,GAAiBrrL,EAAQgJ,EAAGC,EAAG,CACtC,GAAID,IAAMC,EAAG,OACb,MAAMirE,EAAMl0E,EAAOgJ,CAAC,EACpBhJ,EAAOgJ,CAAC,EAAIhJ,EAAOiJ,CAAC,EACpBjJ,EAAOiJ,CAAC,EAAIirE,CACd,CAEA,SAASo3G,GAAmBtrL,EAAQgJ,EAAGC,EAAGqzB,EAAG,CAC3C,MAAMwe,EAAK96C,EAAOgJ,CAAC,EACb+xC,EAAK/6C,EAAOiJ,CAAC,EACbg3D,EAAKjgE,EAAOs8B,CAAC,EACnB,OAAIwe,EAAKC,EACHA,EAAKklB,EAAWh3D,EACb6xC,EAAKmlB,EAAK3jC,EAAItzB,EAEnB8xC,EAAKmlB,EAAWj3D,EACb+xC,EAAKklB,EAAK3jC,EAAIrzB,CACvB,CAEA,SAASsiL,GAAsBvrL,EAAQL,EAAQs5D,EAAG,CAChD,MAAMpjE,EAAQ,KAAK,IAAI,EAAG,KAAK,IAAI,KAAK,MAAM,OAAO8J,CAAM,GAAK,CAAC,EAAGK,GAAQ,QAAU,CAAC,CAAC,EACxF,GAAInK,GAAS,EAAG,MAAO,KACvB,MAAM5F,EAAS,KAAK,IAAI,EAAG,KAAK,IAAI4F,EAAQ,EAAG,KAAK,MAAM,OAAOojE,CAAC,GAAK,CAAC,CAAC,CAAC,EAC1E,IAAI9iB,EAAO,EACPC,EAAQvgD,EAAQ,EACpB,KAAOsgD,EAAOC,GAAO,CACnB,MAAM6wB,EAAM9wB,GAASC,EAAQD,GAAS,GAChCq1I,EAAaF,GAAmBtrL,EAAQm2C,EAAM8wB,EAAK7wB,CAAK,EACxDq1I,EAAazrL,EAAOwrL,CAAU,EACpC,IAAIE,EAAKv1I,EACL9+C,EAAI8+C,EACJw1I,EAAKv1I,EACT,KAAO/+C,GAAKs0L,GAAI,CACd,MAAMx9L,EAAQ6R,EAAO3I,CAAC,EAClBlJ,EAAQs9L,GACVJ,GAAiBrrL,EAAQ0rL,EAAIr0L,CAAC,EAC9Bq0L,GAAM,EACNr0L,GAAK,GACIlJ,EAAQs9L,GACjBJ,GAAiBrrL,EAAQ3I,EAAGs0L,CAAE,EAC9BA,GAAM,GAENt0L,GAAK,CAET,CACA,GAAIpH,EAASy7L,EAAIt1I,EAAQs1I,EAAK,UACrBz7L,EAAS07L,EAAIx1I,EAAOw1I,EAAK,MAC7B,QAAO3rL,EAAO/P,CAAM,CAC3B,CACA,OAAO+P,EAAOm2C,CAAI,CACpB,CAEA,SAASy1I,GAAmB5rL,EAAQL,EAAQ,EAAG,CAC7C,MAAM9J,EAAQ,KAAK,IAAI,EAAG,KAAK,IAAI,KAAK,MAAM,OAAO8J,CAAM,GAAK,CAAC,EAAGK,GAAQ,QAAU,CAAC,CAAC,EACxF,GAAInK,IAAU,EAAG,MAAO,KACxB,GAAIA,IAAU,EAAG,OAAOmK,EAAO,CAAC,EAEhC,MAAMyB,EADU7D,GAAM,OAAO,CAAC,EAAG,EAAG,CAAC,GACZ/H,EAAQ,GAC3B0tE,EAAK,KAAK,MAAM9hE,CAAK,EACrB+hE,EAAK,KAAK,KAAK/hE,CAAK,EACpBoqL,EAAUN,GAAsBvrL,EAAQnK,EAAO0tE,CAAE,EACvD,GAAIA,IAAOC,EAAI,OAAOqoH,EACtB,MAAMC,EAAUP,GAAsBvrL,EAAQnK,EAAO2tE,CAAE,EACjDp9C,EAAS3kB,EAAQ8hE,EACvB,OAAOsoH,GAAYC,EAAUD,GAAWzlK,CAC1C,CAEA,SAAS2lK,GAAkBtrL,EAAKmzC,EAAG,CACjC,MAAM9iB,EAAM,KAAK,MAAM8iB,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAC7C,GAAI9iB,EAAM,EAAG,CACX,MAAM4iB,EAAM,EAAI5iB,EAChBrwB,EAAI,CAAC,EAAImzC,EAAE,CAAC,EAAIF,EAChBjzC,EAAI,CAAC,EAAImzC,EAAE,CAAC,EAAIF,EAChBjzC,EAAI,CAAC,EAAImzC,EAAE,CAAC,EAAIF,EAChBjzC,EAAI,CAAC,EAAImzC,EAAE,CAAC,EAAIF,CAClB,MACEjzC,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAI,EAEX,OAAOA,CACT,CAEA,SAASurL,GAAiBvrL,EAAKuI,EAAGC,EAAG,CACnC,MAAMkqC,EAAKnqC,EAAE,CAAC,EACRoqC,EAAKpqC,EAAE,CAAC,EACRqqC,EAAKrqC,EAAE,CAAC,EACRwrC,EAAKxrC,EAAE,CAAC,EACRsqC,EAAKrqC,EAAE,CAAC,EACRsqC,EAAKtqC,EAAE,CAAC,EACRuqC,EAAKvqC,EAAE,CAAC,EACRwrC,EAAKxrC,EAAE,CAAC,EACd,OAAAxI,EAAI,CAAC,EAAI+zC,EAAKlB,EAAKH,EAAKsB,EAAKrB,EAAKI,EAAKH,EAAKE,EAC5C9yC,EAAI,CAAC,EAAI+zC,EAAKjB,EAAKJ,EAAKK,EAAKJ,EAAKqB,EAAKpB,EAAKC,EAC5C7yC,EAAI,CAAC,EAAI+zC,EAAKhB,EAAKL,EAAKI,EAAKH,EAAKE,EAAKD,EAAKoB,EAC5Ch0C,EAAI,CAAC,EAAI+zC,EAAKC,EAAKtB,EAAKG,EAAKF,EAAKG,EAAKF,EAAKG,EACrC/yC,CACT,CAEA,SAASi0C,GAAkBC,EAAMyG,EAAS,CACxC,MAAM36C,EAAM,IAAI,aAAa,CAAC,EACxB0yC,EAAK,OAAOwB,IAAO,CAAC,CAAC,GAAK,EAC1BvB,EAAK,OAAOuB,IAAO,CAAC,CAAC,GAAK,EAC1BtB,EAAK,OAAOsB,IAAO,CAAC,CAAC,GAAK,EAC1B7jB,EAAM,KAAK,MAAMqiB,EAAIC,EAAIC,CAAE,EACjC,GAAIviB,GAAO,MACT,OAAArwB,EAAI,CAAC,EAAI,EACFA,EAET,MAAMo0C,EAAOuG,EAAU,GACjBt9B,EAAQ,KAAK,IAAI+2B,CAAI,EAAI/jB,EAC/B,OAAArwB,EAAI,CAAC,EAAI0yC,EAAKr1B,EACdrd,EAAI,CAAC,EAAI2yC,EAAKt1B,EACdrd,EAAI,CAAC,EAAI4yC,EAAKv1B,EACdrd,EAAI,CAAC,EAAI,KAAK,IAAIo0C,CAAI,EACfp0C,CACT,CAEA,SAASwrL,GAAyBr4I,EAAG98C,EAAGC,EAAGkC,EAAG,CAC5C,MAAM46C,EAAKD,IAAI,CAAC,GAAK,EACfE,EAAKF,IAAI,CAAC,GAAK,EACfG,EAAKH,IAAI,CAAC,GAAK,EACfI,EAAKJ,IAAI,CAAC,GAAK,EACfK,EAAMD,EAAKl9C,EAAMg9C,EAAK76C,EAAM86C,EAAKh9C,EACjCm9C,EAAMF,EAAKj9C,EAAMg9C,EAAKj9C,EAAM+8C,EAAK56C,EACjCk7C,EAAMH,EAAK/6C,EAAM46C,EAAK98C,EAAM+8C,EAAKh9C,EACjCs9C,EAAM,CAACP,EAAK/8C,EAAMg9C,EAAK/8C,EAAMg9C,EAAK96C,EACxC,MAAO,CACJg7C,EAAKD,EAAOI,EAAK,CAACP,EAAOK,EAAK,CAACH,EAAOI,EAAK,CAACL,EAC5CI,EAAKF,EAAOI,EAAK,CAACN,EAAOK,EAAK,CAACN,EAAOI,EAAK,CAACF,EAC5CI,EAAKH,EAAOI,EAAK,CAACL,EAAOE,EAAK,CAACH,EAAOI,EAAK,CAACL,CACjD,CACA,CAEA,SAASq4I,GAAmBlmK,EAAG53B,EAAU,CACvC,MAAM0iC,EAAM,KAAK,MAAM9K,IAAI,CAAC,GAAK,EAAGA,IAAI,CAAC,GAAK,EAAGA,IAAI,CAAC,GAAK,CAAC,EAC5D,MAAI,CAAC,OAAO,SAAS8K,CAAG,GAAKA,GAAO,KAAa,CAAC,GAAG1iC,CAAQ,EACtD,CAAC43B,EAAE,CAAC,EAAI8K,EAAK9K,EAAE,CAAC,EAAI8K,EAAK9K,EAAE,CAAC,EAAI8K,CAAG,CAC5C,CAEA,SAASq7J,GAAenjL,EAAGC,EAAG,CAC5B,MAAO,CACJD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAMD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAC1BD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAMD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAC1BD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAMD,EAAE,CAAC,EAAIC,EAAE,CAAC,CAC/B,CACA,CAEA,SAASmjL,GAAapjL,EAAGC,EAAG,CAC1B,OAAQD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAMD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAMD,EAAE,CAAC,EAAIC,EAAE,CAAC,CACpD,CAEA,SAASojL,GAA8B9mG,EAAU,CAC/C,MAAMu3C,EAAUovD,GAAmBD,GAAyB1mG,EAAU,EAAG,EAAG,EAAE,EAAG,CAAC,EAAG,EAAG,EAAE,CAAC,EAC3F,IAAI5uC,EAAKu1I,GAAmBD,GAAyB1mG,EAAU,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EAC9EnvC,EAAQ81I,GAAmBC,GAAervD,EAASnmF,CAAE,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EACrE,OAAAA,EAAKu1I,GAAmBC,GAAe/1I,EAAO0mF,CAAO,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EACjE1mF,EAAQ81I,GAAmB91I,EAAO,CAAC,EAAG,EAAG,CAAC,CAAC,EACpC,CAAE,MAAAA,EAAO,GAAAO,EAAI,QAAAmmF,CAAO,CAC7B,CAEA,SAASwvD,GAA2Bn+L,EAAOC,EAAW07L,GAAgC,KAAM,CAC1F,MAAMtlK,EAAM,OAAOr2B,GAASC,CAAQ,EAAE,KAAI,EAAG,YAAW,EAIxD,MAA8C,KAEhD,CAEA,SAASm+L,GAAmCp+L,EAAOC,EAAW07L,GAAgC,aAAc,CAC1G,GAAI,OAAO37L,GAAU,UACnB,OAAOA,EAAQ,WAAa,QAE9B,MAAMq2B,EAAM,OAAOr2B,GAASC,CAAQ,EAAE,KAAI,EAAG,YAAW,EACxD,OAAKo2B,EACDA,IAAQ,YAAcA,IAAQ,QAAUA,IAAQ,UAAkB,WAClEA,IAAQ,SAAWA,IAAQ,UAAYA,IAAQ,WAAmB,QAC/Dp2B,EAHUA,CAInB,CAEA,SAASo+L,GAA6Br+L,EAAOC,EAAW07L,GAAgC,OAAQ,CAE9F,OADY,OAAO37L,GAASC,CAAQ,EAAE,KAAI,EAAG,YAAW,EAGjD,QACT,CAEA,SAAS6xB,GAAQ9xB,EAAOC,EAAW,EAAG,CACpC,MAAMC,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACxBA,GAAW,EAAU,EACrBA,GAAW,EAAU,EAClBA,EAH+BD,CAIxC,CAEA,SAASu2I,GAA2Bx2I,EAAOC,EAAUqK,EAAM,EAAGoF,EAAM,OAAO,kBAAmB,CAC5F,MAAMxP,EAAU,OAAOF,CAAK,EAC5B,GAAI,CAAC,OAAO,SAASE,CAAO,EAAG,OAAOD,EACtC,MAAMsjH,EAAa,KAAK,IAAIj5G,EAAKpK,CAAO,EACxC,OAAO,KAAK,IAAIwP,EAAK6zG,CAAU,CACjC,CAEA,SAASq5E,GAAyB58L,EAAOC,EAAUqK,EAAM,EAAGoF,EAAM,OAAO,kBAAmB,CAC1F,MAAMxP,EAAU,OAAOF,CAAK,EAC5B,GAAI,CAAC,OAAO,SAASE,CAAO,EAAG,OAAOD,EACtC,MAAMq+L,EAAU,KAAK,MAAMp+L,CAAO,EAClC,OAAIo+L,EAAUh0L,EAAYA,EACtBg0L,EAAU5uL,EAAYA,EACnB4uL,CACT,CAEA,SAASC,GAAmC90L,EAAO,GAAIukD,EAAQ,CAAA,EAAI,CACjE,GAAIA,IAAU,IAAQA,IAAU,GAC9B,MAAO,CACL,GAAGvkD,EACH,QAASukD,IAAU,EACzB,EAEE,GAAI,CAACA,GAAS,OAAOA,GAAU,SAC7B,MAAO,CAAE,GAAGvkD,CAAI,EAElB,MAAMjH,EAAO,CAAE,GAAGiH,CAAI,EACtB,OAAI,OAAO,UAAU,eAAe,KAAKukD,EAAO,SAAS,GAAKA,EAAM,UAAY,SAC9ExrD,EAAK,QAAUwrD,EAAM,UAAY,KAGjC,OAAO,UAAU,eAAe,KAAKA,EAAO,sBAAsB,GAC/D,OAAO,UAAU,eAAe,KAAKA,EAAO,aAAa,KAE5DxrD,EAAK,qBAAuBg0I,GAC1BxoF,EAAM,sBAAwBA,EAAM,YACpCxrD,EAAK,sBAAwB25L,GAA+B,qBAC5D,EACA,GACN,IAGI,OAAO,UAAU,eAAe,KAAKnuI,EAAO,iBAAiB,GAC1D,OAAO,UAAU,eAAe,KAAKA,EAAO,cAAc,KAE7DxrD,EAAK,gBAAkBg0I,GACrBxoF,EAAM,iBAAmBA,EAAM,aAC/BxrD,EAAK,iBAAmB25L,GAA+B,gBACvD,EACA,GACN,IAGI,OAAO,UAAU,eAAe,KAAKnuI,EAAO,qBAAqB,GAC9D,OAAO,UAAU,eAAe,KAAKA,EAAO,4BAA4B,KAE3ExrD,EAAK,oBAAsBo6L,GACzB5uI,EAAM,qBAAuBA,EAAM,2BACnCxrD,EAAK,qBAAuB25L,GAA+B,oBAC3D,EACA,GACN,IAGI,OAAO,UAAU,eAAe,KAAKnuI,EAAO,mBAAmB,GAC5D,OAAO,UAAU,eAAe,KAAKA,EAAO,cAAc,KAE7DxrD,EAAK,kBAAoBg0I,GACvBxoF,EAAM,mBAAqBA,EAAM,aACjCxrD,EAAK,mBAAqB25L,GAA+B,kBACzD,EACA,GACN,GAEM,OAAO,UAAU,eAAe,KAAKnuI,EAAO,kBAAkB,IAChExrD,EAAK,iBAAmBwrD,EAAM,mBAAqB,IAEjD,OAAO,UAAU,eAAe,KAAKA,EAAO,kBAAkB,IAChExrD,EAAK,iBAAmBwrD,EAAM,mBAAqB,IAE9CxrD,CACT,CAEA,SAASg8L,GAAiC/6L,EAAQ,CAChD,MAAMxD,EAAWwD,GAAQ,mBAAqB,GAAO,WAAak4L,GAAgC,aAClG,OAAOyC,GAAmC36L,GAAQ,aAAcxD,CAAQ,CAC1E,CAEA,SAASw+L,GAAyB39L,EAAMwzB,EAAG,CACzC,MAAMxoB,EAAUgmB,GAAQwC,EAAG,CAAC,EAC5B,OAA8BxoB,CAEhC,CAEA,SAAS4yL,GAAuB7jL,EAAGC,EAAGi0E,EAAU,KAAM,CAEpD,GADI,CAACl0E,GAAK,CAACC,GACPD,EAAE,SAAWC,EAAE,OAAQ,MAAO,GAClC,QAAS,EAAI,EAAG,EAAID,EAAE,OAAQ,GAAK,EACjC,GAAI,KAAK,KAAKA,EAAE,CAAC,GAAK,IAAMC,EAAE,CAAC,GAAK,EAAE,EAAIi0E,EAAS,MAAO,GAE5D,MAAO,EACT,CAEA,SAAS4vG,GAAkBjxF,EAAMC,EAAIr7F,EAAKgiB,EAAG,CAC3C,GAAI,CAACo5E,GAAQ,CAACC,GAAM,CAACr7F,EAAK,OAAOA,EACjC,MAAM2lB,EAASnG,GAAQwC,EAAG,CAAC,EACrB5sB,EAAQ,KAAK,IAAIgmG,EAAK,OAAQC,EAAG,OAAQr7F,EAAI,MAAM,EACzD,QAASpJ,EAAI,EAAGA,EAAIxB,EAAOwB,GAAK,EAC9BoJ,EAAIpJ,CAAC,EAAIwkG,EAAKxkG,CAAC,GAAKykG,EAAGzkG,CAAC,EAAIwkG,EAAKxkG,CAAC,GAAK+uB,EAEzC,OAAO3lB,CACT,CAEA,SAASssL,GAAiClxF,EAAMC,EAAI,CAClD,GAAI,CAACD,GAAQ,CAACC,GAAMD,EAAK,SAAWC,EAAG,QAAUD,EAAK,SAAW,EAAG,MAAO,GAC3E,IAAImxF,EAAW,EACXC,EAAe,EACnB,QAAS51L,EAAI,EAAGA,EAAIwkG,EAAK,OAAQxkG,GAAK,EAAG,CACvC,MAAM2R,EAAI,OAAO6yF,EAAKxkG,CAAC,GAAK,CAAC,EACvB4R,EAAI,OAAO6yF,EAAGzkG,CAAC,GAAK,CAAC,EACrBnE,EAAQ,KAAK,IAAI+V,EAAID,CAAC,EACxB9V,EAAQ85L,IAAUA,EAAW95L,GACjC,MAAMgoH,EAAY,KAAK,IAAI,KAAK,IAAIlyG,CAAC,EAAG,KAAK,IAAIC,CAAC,CAAC,EAC/CiyG,EAAY+xE,IAAcA,EAAe/xE,EAC/C,CACA,OAAI8xE,GAAY,EAAU,EACnBA,EAAW,KAAK,IAAI,EAAGC,CAAY,CAC5C,CAEA,MAAM3iG,GAA4B,SAC5BC,GAAmC,gBACnC2iG,GAAmC,OAAO,OAAO,CACrD,YACA,YACA,eACA,eACA,gBACA,gBACA,eACA,eACA,kBACF,CAAC,EAED,SAASjiG,GAA0B98F,EAAOC,EAAWk8F,GAA2B,CAC9E,MAAM9lE,EAAM,OAAOr2B,GAASC,CAAQ,EAAE,KAAI,EAAG,YAAW,EACxD,OAAIo2B,IAAQ+lE,IAAoC/lE,IAAQ,UAAYA,IAAQ,gBACnE+lE,GAEFD,EACT,CAEA,SAAS6iG,GAA4Bp+L,EAAU,GAAI,CACjD,MAAM0R,EAAM,CAAA,EACZ,UAAWnP,KAAO47L,GACZ,OAAO,UAAU,eAAe,KAAKn+L,EAASuC,CAAG,IACnDmP,EAAInP,CAAG,EAAIvC,EAAQuC,CAAG,GAG1B,GAAI,OAAO,UAAU,eAAe,KAAKmP,EAAK,kBAAkB,EAAG,CACjE,MAAMorJ,EAAmB,KAAK,MAAM,OAAOprJ,EAAI,gBAAgB,CAAC,EAC5D,OAAO,SAASorJ,CAAgB,GAAKA,EAAmB,EAC1DprJ,EAAI,iBAAmBorJ,EAEvB,OAAOprJ,EAAI,gBAEf,CACA,OAAOA,CACT,CAEA,SAAS2sL,GAAuBr+L,EAAU,GAAI,CAC5C,UAAWuC,KAAO47L,GAChB,GAAI,OAAO,UAAU,eAAe,KAAKn+L,EAASuC,CAAG,EACnD,MAAO,GAGX,MAAO,EACT,CAEA,SAAS+7L,GAAWl/L,EAAOC,EAAW,EAAG,CACvC,MAAMC,EAAU,OAAOF,CAAK,EAC5B,OAAO,OAAO,SAASE,CAAO,EAAIA,EAAUD,CAC9C,CAEA,SAAS2hB,GAAW5hB,EAAO,CACzB,MAAMwR,EAAS,OAAOxR,GAAO,MAAM,EACnC,OAAO,OAAO,SAASwR,CAAM,GAAKA,GAAU,EAAI,KAAK,MAAMA,CAAM,EAAI,CACvE,CAEA,SAAS2tL,GAA6BC,EAAaC,EAAe,CAChE,MAAM51L,EAAOy1L,GAAWE,EAAa,CAAC,EAChCr6L,EAAQm6L,GAAWG,EAAe,CAAC,EACnCzvK,EAAMnmB,EAAO1E,EACnB,OAAI6qB,GAAO,OAAO,iBACTA,EAAM,OAAO,iBAElBA,EAAM,EAAU,EACbA,CACT,CAEA,SAAS0vK,GAAmBt/L,EAAO,CACjC,MAAMqK,EAAU60L,GAAWl/L,EAAO,CAAC,EACnC,OAAIqK,GAAW,OAAO,iBAAmB,EAAU,EAC5CA,EAAU,CACnB,CAeY,MAACsiI,GAAS,OAAO,OAAO,CAClC,aAAc,eACd,YAAa,cACb,eAAgB,iBAChB,aAAc,eAEd,WAAY,aACZ,WAAY,aAEZ,YAAa,cACb,eAAgB,iBAEhB,WAAY,aACZ,WAAY,aAEZ,cAAe,gBACf,cAAe,gBAEf,cAAe,gBACf,aAAc,eAEd,OAAQ,SACR,YAAa,cACb,sBAAuB,wBACvB,iBAAkB,mBAClB,gBAAiB,kBACjB,qBAAsB,sBACxB,CAAC,EA8IM,MAAM4yD,WAAe,WAAY,CAQtC,OAAO,OAAS,OAAO,OAAO,CAC5B,SAAU,EACV,SAAU,EACV,YAAa,CACjB,CAAG,EASD,OAAO,WAAaA,GAAO,OAS3B,OAAO,YAAc,OAAO,OAAO,CACjC,eAAgB,CACd,KAAM,SACN,MAAO,mBACP,YAAa,4BACb,aAAc,EACd,OAAQ,CAAE,IAAK,EAAG,IAAK,EAAE,EACzB,iBAAkB,CAAE,IAAK,EAAK,IAAK,EAAI,EACvC,KAAM,GACZ,EACI,cAAe,CACb,KAAM,SACN,MAAO,kBACP,YAAa,wCACb,aAAc,EACd,OAAQ,CAAE,IAAK,EAAG,IAAK,EAAE,EACzB,iBAAkB,CAAE,IAAK,EAAK,IAAK,CAAG,EACtC,KAAM,GACZ,EACI,iBAAkB,CAChB,KAAM,SACN,MAAO,qBACP,YAAa,6BACb,aAAc,GACd,OAAQ,CAAE,IAAK,EAAG,IAAK,CAAC,EACxB,iBAAkB,CAAE,IAAK,EAAK,IAAK,CAAG,EACtC,KAAM,IACN,KAAM,CAAE,SAAU,EAAG,SAAU,IAAI,CACzC,EACI,gBAAiB,CACf,KAAM,SACN,MAAO,oBACP,YAAa,yCACb,aAAc,EACd,OAAQ,CAAE,IAAK,EAAG,IAAK,CAAC,EACxB,iBAAkB,CAAE,IAAK,EAAK,IAAK,CAAG,EACtC,KAAM,GACZ,EACI,iBAAkB,CAChB,KAAM,SACN,MAAO,qBACP,YAAa,6BACb,aAAc,EACd,OAAQ,CAAE,IAAK,EAAG,IAAK,CAAC,EACxB,iBAAkB,CAAE,IAAK,EAAK,IAAK,CAAG,EACtC,KAAM,IACN,KAAM,CAAE,SAAU,EAAG,SAAU,IAAI,CACzC,EACI,gBAAiB,CACf,KAAM,SACN,MAAO,oBACP,YAAa,yCACb,aAAc,EACd,OAAQ,CAAE,IAAK,EAAG,IAAK,CAAC,EACxB,iBAAkB,CAAE,IAAK,EAAK,IAAK,CAAG,EACtC,KAAM,GACZ,EACI,cAAe,CACb,KAAM,SACN,MAAO,kBACP,YAAa,2BACb,aAAc,EACd,OAAQ,CAAE,IAAK,EAAG,IAAK,GAAG,EAC1B,iBAAkB,CAAE,IAAK,EAAK,IAAK,EAAI,EACvC,KAAM,GACZ,EACI,aAAc,CACZ,KAAM,SACN,MAAO,iBACP,YAAa,uCACb,aAAc,EACd,OAAQ,CAAE,IAAK,EAAG,IAAK,EAAE,EACzB,iBAAkB,CAAE,IAAK,EAAK,IAAK,EAAI,EACvC,KAAM,GACZ,EACI,qBAAsB,CACpB,KAAM,SACN,MAAO,qBACP,YAAa,mFACb,aAAc,EACd,OAAQ,CAAE,IAAK,EAAG,IAAK,CAAC,EACxB,iBAAkB,CAAE,IAAK,EAAK,IAAK,CAAG,EACtC,KAAM,GACZ,EACI,sBAAuB,CACrB,KAAM,SACN,MAAO,sBACP,YAAa,+BACb,aAAc,EACd,OAAQ,CAAE,IAAK,EAAG,IAAK,EAAE,EACzB,iBAAkB,CAAE,IAAK,EAAK,IAAK,EAAI,EACvC,KAAM,GACZ,EACI,qBAAsB,CACpB,KAAM,SACN,MAAO,qBACP,YAAa,2CACb,aAAc,EACd,OAAQ,CAAE,IAAK,EAAG,IAAK,EAAE,EACzB,iBAAkB,CAAE,IAAK,EAAK,IAAK,CAAG,EACtC,KAAM,GACZ,EACI,iBAAkB,CAChB,KAAM,SACN,MAAO,qBACP,YAAa,oDACb,aAAc,GACd,OAAQ,CAAE,IAAK,EAAG,IAAK,CAAC,EACxB,iBAAkB,CAAE,IAAK,EAAK,IAAK,GAAG,EACtC,KAAM,GACZ,EACI,6BAA8B,CAC5B,KAAM,UACN,MAAO,oBACP,YAAa,gGACb,aAAc,EACpB,EACI,mBAAoB,CAClB,KAAM,UACN,MAAO,cACP,YAAa,6GACb,aAAc,EACpB,EACI,eAAgB,CACd,KAAM,UACN,MAAO,mBACP,YAAa,yEACb,aAAc,EACpB,EACI,kBAAmB,CACjB,KAAM,UACN,MAAO,kBACP,YAAa,6HACb,aAAc,EACpB,EACI,cAAe,CACb,KAAM,UACN,MAAO,SACP,YAAa,6EACb,aAAc,EACpB,EACI,YAAa,CACX,KAAM,UACN,MAAO,QACP,YAAa,yCACb,aAAc,EACpB,EACI,YAAa,CACX,KAAM,UACN,MAAO,QACP,YAAa,0FACb,aAAc,EACpB,EACI,sBAAuB,CACrB,KAAM,SACN,MAAO,UACP,YAAa,2DACb,aAAcpqK,GAA+B,CAAC,EAC9C,OAAQ,CAAE,IAAK,GAAI,IAAK,CAAC,EACzB,iBAAkB,CAAE,IAAK,GAAI,IAAK,CAAC,EACnC,KAAM,GACZ,EACI,sBAAuB,CACrB,KAAM,SACN,MAAO,UACP,YAAa,yDACb,aAAcA,GAA+B,CAAC,EAC9C,OAAQ,CAAE,IAAK,GAAI,IAAK,CAAC,EACzB,iBAAkB,CAAE,IAAK,GAAI,IAAK,CAAC,EACnC,KAAM,GACZ,EACI,sBAAuB,CACrB,KAAM,SACN,MAAO,UACP,YAAa,4CACb,aAAcA,GAA+B,CAAC,EAC9C,OAAQ,CAAE,IAAK,GAAI,IAAK,CAAC,EACzB,iBAAkB,CAAE,IAAK,GAAI,IAAK,CAAC,EACnC,KAAM,GACZ,EACI,sBAAuB,CACrB,KAAM,SACN,MAAO,UACP,YAAa,gFACb,aAAcI,GACd,OAAQ,CAAE,IAAK,EAAG,IAAK,CAAC,EACxB,iBAAkB,CAAE,IAAK,EAAG,IAAK,CAAC,EAClC,KAAM,GACZ,EACI,sBAAuB,CACrB,KAAM,SACN,MAAO,UACP,YAAa,8DACb,aAAcC,GACd,OAAQ,CAAE,IAAK,EAAG,IAAK,CAAC,EACxB,iBAAkB,CAAE,IAAK,EAAG,IAAK,CAAC,EAClC,KAAM,GACZ,EACI,uBAAwB,CACtB,KAAM,SACN,MAAO,WACP,YAAa,mFACb,aAAcE,GACd,OAAQ,CAAE,IAAK,EAAG,IAAK,CAAC,EACxB,iBAAkB,CAAE,IAAK,EAAG,IAAK,GAAG,EACpC,KAAM,GACZ,EACI,gBAAiB,CACf,KAAM,SACN,MAAO,YACP,YAAa,gDACb,aAAcC,GACd,OAAQ,CAAE,IAAK,EAAG,IAAK,GAAG,EAC1B,iBAAkB,CAAE,IAAK,EAAG,IAAK,GAAG,EACpC,KAAM,CACZ,EACI,wBAAyB,CACvB,KAAM,UACN,MAAO,oBACP,YAAa,0DACb,aAAc,EACpB,EACI,sBAAuB,CACrB,KAAM,UACN,MAAO,QACP,YAAa,oEACb,aAAc,EACpB,EACI,sBAAuB,CACrB,KAAM,UACN,MAAO,QACP,YAAa,oEACb,aAAc,EACpB,EACI,yBAA0B,CACxB,KAAM,SACN,MAAO,WACP,YAAa,oDACb,aAAcC,GACd,OAAQ,CAAE,IAAK,EAAG,IAAK,CAAC,EACxB,iBAAkB,CAAE,IAAK,GAAK,IAAK,CAAG,EACtC,KAAM,GACZ,EACI,uBAAwB,CACtB,KAAM,SACN,MAAO,SACP,YAAa,2CACb,aAAcC,GACd,OAAQ,CAAE,IAAK,EAAG,IAAK,GAAG,EAC1B,iBAAkB,CAAE,IAAK,EAAG,IAAK,GAAG,EACpC,KAAM,CACZ,EACI,qBAAsB,CACpB,KAAM,SACN,MAAO,OACP,YAAa,4DACb,aAAcC,GACd,OAAQ,CAAE,IAAK,EAAG,IAAK,EAAG,EAC1B,iBAAkB,CAAE,IAAK,KAAO,IAAK,GAAI,EACzC,KAAM,IACZ,EACI,qBAAsB,CACpB,KAAM,SACN,MAAO,OACP,YAAa,4CACb,aAAcf,EACpB,EACI,+BAAgC,CAC9B,KAAM,SACN,MAAO,aACP,YAAa,gFACb,aAAcgB,GACd,OAAQ,CAAE,IAAK,EAAG,IAAK,CAAC,EACxB,iBAAkB,CAAE,IAAK,GAAK,IAAK,GAAG,EACtC,KAAM,GACZ,EACI,+BAAgC,CAC9B,KAAM,SACN,MAAO,aACP,YAAa,qFACb,aAAcC,GACd,OAAQ,CAAE,IAAK,EAAG,IAAK,CAAC,EACxB,iBAAkB,CAAE,IAAK,EAAG,IAAK,EAAG,EACpC,KAAM,GACZ,EACI,wBAAyB,CACvB,KAAM,SACN,MAAO,UACP,YAAa,qDACb,aAAcjC,EACpB,EACI,2BAA4B,CAC1B,KAAM,UACN,MAAO,iBACP,YAAa,wFACb,aAAcooK,GAA+B,OACnD,EACI,wCAAyC,CACvC,KAAM,SACN,MAAO,aACP,YAAa,8EACb,aAAcA,GAA+B,qBAC7C,OAAQ,CAAE,IAAK,EAAG,IAAK,GAAG,EAC1B,iBAAkB,CAAE,IAAK,EAAG,IAAK,EAAE,EACnC,KAAM,CACZ,EACI,8CAA+C,CAC7C,KAAM,SACN,MAAO,aACP,YAAa,iGACb,aAAcA,GAA+B,oBAC7C,OAAQ,CAAE,IAAK,EAAG,IAAK,EAAE,EACzB,iBAAkB,CAAE,IAAK,EAAG,IAAK,EAAE,EACnC,KAAM,CACZ,EACI,mCAAoC,CAClC,KAAM,SACN,MAAO,YACP,YAAa,8EACb,aAAcA,GAA+B,gBAC7C,OAAQ,CAAE,IAAK,EAAG,IAAK,GAAI,EAC3B,iBAAkB,CAAE,IAAK,IAAK,IAAK,GAAI,EACvC,KAAM,EACZ,EACI,qCAAsC,CACpC,KAAM,SACN,MAAO,mBACP,YAAa,yEACb,aAAcA,GAA+B,kBAC7C,OAAQ,CAAE,IAAK,EAAG,IAAK,GAAI,EAC3B,iBAAkB,CAAE,IAAK,EAAG,IAAK,GAAG,EACpC,KAAM,EACZ,EACI,oCAAqC,CACnC,KAAM,UACN,MAAO,SACP,YAAa,2FACb,aAAc,EACpB,EACI,oCAAqC,CACnC,KAAM,UACN,MAAO,SACP,YAAa,8EACb,aAAcA,GAA+B,gBACnD,EACI,WAAY,CACV,KAAM,SACN,MAAO,SACP,YAAa,qFACb,aAAc,KACpB,EACI,6BAA8B,CAC5B,KAAM,UACN,MAAO,cACP,YAAa,wIACb,aAAc,EACpB,EACI,cAAe,CACb,KAAM,UACN,MAAO,cACP,YAAa,yBACb,aAAc,EACpB,EACI,iBAAkB,CAChB,KAAM,SACN,MAAO,aACP,YAAa,4CACb,aAAc,IACd,OAAQ,CAAE,IAAK,EAAG,IAAK,GAAI,EAC3B,iBAAkB,CAAE,IAAK,GAAI,IAAK,GAAG,EACrC,KAAM,CACZ,EACI,oBAAqB,CACnB,KAAM,SACN,MAAO,mBACP,YAAa,wCACb,aAAc,EACd,OAAQ,CAAE,IAAK,IAAM,IAAK,CAAC,EAC3B,iBAAkB,CAAE,IAAK,GAAK,IAAK,GAAG,EACtC,KAAM,GACZ,EACI,sBAAuB,CACrB,KAAM,SACN,MAAO,kBACP,YAAa,0EACb,aAAc,EACd,OAAQ,CAAE,IAAK,EAAG,IAAK,GAAG,EAC1B,iBAAkB,CAAE,IAAK,EAAG,IAAK,EAAE,EACnC,KAAM,EACZ,EACI,mBAAoB,CAClB,KAAM,SACN,MAAO,sBACP,YAAa,0BACb,aAAc,EACd,OAAQ,CAAE,IAAK,EAAG,IAAK,EAAE,EACzB,iBAAkB,CAAE,IAAK,EAAG,IAAK,CAAC,EAClC,KAAM,GACZ,EACI,yBAA0B,CACxB,KAAM,SACN,MAAO,sBACP,YAAa,+DACb,aAAc,EACd,OAAQ,CAAE,IAAK,GAAI,IAAK,CAAC,EACzB,iBAAkB,CAAE,IAAK,GAAI,IAAK,CAAC,EACnC,KAAM,GACZ,EACI,eAAgB,CACd,KAAM,SACN,MAAO,qBACP,YAAa,oDACb,aAAc,EACd,OAAQ,CAAE,IAAK,KAAM,IAAK,GAAG,EAC7B,iBAAkB,CAAE,IAAK,IAAK,IAAK,EAAE,EACrC,KAAM,CACZ,EACI,eAAgB,CACd,KAAM,SACN,MAAO,kBACP,YAAa,+DACb,aAAc,GACd,OAAQ,CAAE,IAAK,EAAG,IAAK,GAAG,EAC1B,iBAAkB,CAAE,IAAK,EAAG,IAAK,EAAE,EACnC,KAAM,CACZ,EACI,cAAe,CACb,KAAM,SACN,MAAO,iBACP,YAAa,0DACb,aAAc,EACd,OAAQ,CAAE,IAAK,EAAG,IAAK,CAAC,EACxB,iBAAkB,CAAE,IAAK,EAAG,IAAK,CAAC,EAClC,KAAM,CACZ,EACI,eAAgB,CACd,KAAM,UACN,MAAO,eACP,YAAa,6BACb,aAAc,EACpB,EACI,WAAY,CACV,KAAM,QACN,MAAO,aACP,YAAa,kCACb,UAAW,YACjB,EACI,WAAY,CACV,KAAM,QACN,MAAO,aACP,YAAa,iCACnB,EACI,cAAe,CACb,KAAM,SACN,MAAO,gBACP,YAAa,8CACnB,CACA,CAAG,EAUD,cAAc55L,EAAM,CAClB,OAAO,KAAK,YAAY,cAAcA,CAAI,GAAK,IACjD,CAEA,qBAAqBA,EAAMvC,EAAOqM,EAAS,CAAA,EAAI,CAC7C,GAAI,OAAK,6BAA+B,IACpC,OAAO,KAAK,eAAkB,WAClC,GAAI,CACF,MAAMjF,EAAU,CACd,OAAQiF,EAAO,QAAU,UACzB,cAAeA,EAAO,gBAAkB,GACxC,GAAGA,EACH,GAAI,UAAU9J,CAAI,GAClB,KAAAA,EACA,MAAAvC,CACR,EACM,KAAK,8BAA8BuC,EAAM6E,CAAO,EAChD,KAAK,cAAc4nK,GAAkB,oBAAqB5nK,CAAO,CAAC,CACpE,OAASvC,EAAO,CACd,GACE,KAAK,gBAAkB,YAAY,UAAU,eAC1CA,aAAiB,WACjB,8BAA8B,KAAK,OAAOA,EAAM,SAAW,EAAE,CAAC,EAEjE,OAEF,QAAQ,KAAK,iDAAiDtC,CAAI,KAAMsC,CAAK,CAC/E,CACF,CAEA,mBAAmBZ,EAAS,KAAK,QAAS,CACxC,MAAMotB,EAAa,OAAOptB,GAAQ,sBAAyB,WACtDA,EAAO,qBAAoB,GAAM,KAClC,KACJ,KAAK,KAAK0oI,GAAO,eAAgB,CAC/B,OAAA1oI,EACA,IAAKotB,GAAY,KAAO,KACxB,MAAOA,GAAY,OAASptB,GAAQ,aAAa,MAAQ,IAC/D,CAAK,CACH,CAEA,oBAAoBA,EAAQ,CAC1B,OAAIA,GAAU,OAAOA,GAAW,WAC9BA,EAAO,OAAS,MAEXA,CACT,CAEA,kBAAkBD,EAAS,SAAU,CACnC,MAAMyH,EAAY,KAAK,WAAa,KAKpC,MAJI,CAACA,GAAa,OAAOA,EAAU,kBAAqB,aAC1C,OAAOA,EAAU,gBAAmB,WAC9CA,EAAU,eAAc,EACvBA,EAAU,gBAAkB,GAAQ,UAAY,aACvC,OAAe,IAC7BA,EAAU,iBAAiB,GAAMzH,CAAM,EACvCyH,EAAU,gBAAgBzH,CAAM,EACzB,GACT,CAEA,qBAAqBA,EAAS,SAAU,CACtC,MAAMC,EAAS,KAAK,SAAW,KAC/B,MAAI,CAACA,GAAU,OAAOA,GAAW,SAAiB,GAC9C,OAAOA,EAAO,QAAW,YAC3BA,EAAO,OAAOD,CAAM,EACb,KAETC,EAAO,gBAAa,EACb,GACT,CAEA,wCAAwCu7L,EAAex7L,EAAS,mBAAoB,CAElF,GADIw7L,IAAkB,QAClB,KAAK,mBAAmBt3L,GAAc,MAAO,GACjD,MAAMu3L,EAAO,KAAK,kBAAkBz7L,CAAM,EACpC07L,EAAW,KAAK,qBAAqB17L,CAAM,EACjD,OAAOy7L,GAAQC,CACjB,CAEA,mCAAmCC,EAAqB37L,EAAS,mBAAoB,CACnF,KAAK,6BAA6B,KAAK,QAAS,CAAE,mBAAoB,GAAO,EAC7E,KAAK,UAAU,UAAU,KAAK,OAAO,EACrC,KAAK,wCAAwC27L,EAAqB37L,CAAM,EACxE,KAAK,mBAAmB,KAAK,OAAO,CACtC,CAEA,YAAYkD,EAAStG,EAAU,GAAI,CACjC,GAAI,CAACsG,EACH,MAAM,IAAI,MAAM,2CAA2C,EAS7D,GAPA,MAAK,EACL,KAAK,WAAa,GAClB,KAAK,qBAAuB,KACvB,OAAO,UAAU,eAAe,KAAKtG,EAAS,uBAAuB,IACxEA,EAAQ,sBAAwB,YAElCA,EAAQ,KAAOA,EAAQ,OAAS,KAAO,KAAO,KAC1C,CAAC,OAAO,UAAU,eAAe,KAAKA,EAAS,QAAQ,EAAG,CAC5D,MAAME,EAAOF,EAAQ,KACrBA,EAAQ,OAAS,CACf,KAAM,YACN,QAAS,CACP,KAAAE,CACV,CACA,CACI,CACA,MAAMouI,EAAYtuI,EAAQ,WAAa,SAAS,eAAe,KAAK,GAAK,SAAS,KAC5EojJ,EAAmB0wC,GAAuB9zL,CAAO,EACjDg/L,EAAwBjM,GAAa/yL,EAAS,YAAY,GAAK+yL,GAAa/yL,EAAS,YAAY,EACvG,KAAK,cAAgByzL,GAAoBzzL,EAASsuI,CAAS,EAC3D,KAAK,wBAA0B8U,EAC/B,KAAK,mBAAqB,CACxB,WAAY,CAAC47C,GAAyB,CAAC57C,EACvC,SAAU,CAACA,EACX,aAAc,KAAK,cACnB,QAAS,KACT,aAAc,IACpB,EACI4wC,GAAkCh0L,EAAS,KAAK,aAAa,EAC7D,KAAK,QAAUsG,EACf,MAAM24L,EAAuBj/L,EAAQ,eAAiB,OAAOA,EAAQ,eAAkB,SACnFA,EAAQ,cACR,CAAA,EACEk/L,EAAqB,OAAOD,EAAqB,MAAS,UAAYA,EAAqB,KAAK,KAAI,EACtGA,EAAqB,KAAK,KAAI,EAC7B,OAAOj/L,EAAQ,aAAgB,UAAYA,EAAQ,YAAY,KAAI,EAAKA,EAAQ,YAAY,KAAI,EAAK,KACpGm/L,EAAqB,OAAOF,EAAqB,UAAa,UAAYA,EAAqB,SAAS,KAAI,EAC9GA,EAAqB,SAAS,KAAI,EACjCC,EAAqB7F,GAAgB6F,CAAkB,EAAI,KAChE,KAAK,uBAAyBA,EAC9B,KAAK,uBAAyBC,EAC9B,KAAK,yBAA2B,OAAOF,EAAqB,QAAW,SACnEA,EAAqB,OACrBrM,GAA2BsM,CAAkB,EACjD,KAAK,QAAUl/L,EACf,KAAK,aAAeA,EAAQ,OAAS,KAAO,KAAO,KACnD,KAAK,aAAeA,EAAQ,QAAU,GAClC,GACA,EAAEA,EAAQ,OAAS,OAAOA,EAAQ,OAAU,UAAYA,EAAQ,MAAM,UAAY,IACtF,KAAK,MAAQkD,GAAkBlD,EAAQ,KAAK,EACxC,KAAK,cAAgB,OAAO,OAAW,MACzC,OAAO,SAAW,MAEpB,KAAK,MAAM,IAAI,SAAU,+BAAgC,CAAE,KAAM,KAAK,aAAc,EACpF,KAAK,eAAiB,KACtB,KAAK,aAAe,GACpB,KAAK,sBAAwB,EAC7B,KAAK,iBAAmB,IAAM,CAC5B,KAAK,aAAe,GACpB,KAAK,uBAAyB,EAC9B,KAAK,eAAiB,KACtB,KAAK,WAAW,kBAAe,EAC/B,KAAK,OAAO+rI,GAAO,gBAAiB,CAClC,KAAM2mD,GAA+B,KAAK,UAAU,EACpD,KAAMA,GAA+B,KAAK,UAAU,CAC5D,CAAO,CACH,EACA,KAAK,OAAS,IAAInxL,GAAa+sI,EAAW,CACxC,wBAAyBtuI,EAAQ,0BAA4B,GAC7D,cAAeA,EAAQ,cACvB,iBAAkBA,EAAQ,iBAC1B,wBAAyBA,EAAQ,wBACjC,2BAA4BA,EAAQ,0BAC1C,CAAK,EACD,KAAK,wBAA0B6yL,GAC7B7yL,EAAQ,UAAYA,EAAQ,iBAAmBA,EAAQ,kBAC7D,EACI,KAAK,wBAA0B,KAC/B,KAAK,wBAA0B,KAC/B,KAAK,sBAAwB,EAC7B,KAAK,kBAAiB,EACtB,KAAK,sBAAqB,EAC1B,KAAK,QAAU,IAAIg+E,GAAiB13E,EAAS,KAAK,KAAK,EACvD,KAAK,WAAa,IAAIs1E,GAAiB,OAAQt1E,EAAS,KAAK,iBAAkB,KAAK,KAAK,EACzF,KAAK,WAAa,IAAIs1E,GAAiB,OAAQt1E,EAAS,KAAK,iBAAkB,KAAK,KAAK,EACzF,MAAM84L,EAAgBp/L,EAAQ,QAC9B,GAAIo/L,IAAkB,KAAM,CAC1B,MAAMC,EAAiBD,GAAiB3jH,GAAqBn1E,CAAO,EAChE+4L,GAAgB,YAClB,KAAK,WAAW,WAAWA,EAAe,UAAU,EAElDA,GAAgB,YAClB,KAAK,WAAW,WAAWA,EAAe,UAAU,CAExD,CACA,KAAK,aAAe,GACpB,KAAK,QAAQ,qBAAqBtG,GAA2B/4L,EAAQ,OAAQ,KAAK,OAAO,KAAMA,EAAQ,IAAI,CAAC,EAC5G,MAAMs/L,EAAmBt/L,EAAQ,kBAAmB,GAC9Cu/L,EAAoBv/L,EAAQ,mBAAqB,GACjDw/L,EAAsBx/L,EAAQ,qBAAuBu/L,EAC3D,KAAK,mBAAqB,IAAIr4H,GAAmB,CAC/C,QAASo4H,EACT,WAAYC,EACZ,SAAUC,CAChB,CAAK,EACD,KAAK,uBAAyB,CAC5B,WAAYx/L,EAAQ,sBAAwB,GAC5C,OAAQA,EAAQ,2BAA6B,KAC7C,UAAWA,EAAQ,8BAAgC,IACzD,EACI,KAAK,gBAAkBA,EAAQ,kBAAoB,GACnD,KAAK,UAAY,IAAImD,GAAU,CAC7B,mBAAoB,KAAK,mBACzB,OAAQnD,EAAQ,OAChB,MAAO,KAAK,MACZ,oBAAqB,KAAK,uBAAuB,WACjD,gBAAiB,KAAK,uBAAuB,OAC7C,mBAAoB,KAAK,uBAAuB,SACtD,CAAK,EACD,MAAMy/L,EAA4Bz/L,EAAQ,WAAW,UAAY,KAC3D0/L,EAA0BD,EAC5B,KAAK,0BAA0BA,CAAyB,EACxD,KACEE,EAAwB3/L,EAAQ,WAAW,SAAW,YAAc0/L,EACtE,WACA,UACJ,KAAK,iBAAmB,CACtB,OAAQC,EACR,SAAUD,CAChB,EACI,KAAK,wBAA0B,KAC/B,MAAME,EAAuB5/L,EAAQ,eAAiB,KAChD6/L,EAA4BrC,GAChCoC,GAAsB,cAAgBA,GAAsB,iBAC5DA,GAAsB,iBAAmB,KACrC,QACAA,GAAsB,mBAAqB,GACzC,WACA7E,GAAgC,YAC5C,EACI,KAAK,qBAAuB,CAC1B,GAAGA,GACH,GAAI6E,GAAwB,OAAOA,GAAyB,SAAWA,EAAuB,CAAA,EAC9F,KAAMrC,GAA2BqC,GAAsB,MAAQA,GAAsB,IAAI,EACzF,OAAQnC,GAA6BmC,GAAsB,MAAM,EACjE,QAASA,GAAsB,UAAY,GAC3C,aAAcC,EACd,WAAYjqD,GACVgqD,GAAsB,iBAAmBA,GAAsB,YAAcA,GAAsB,SACnG7E,GAAgC,UACxC,EACM,iBAAkB8E,IAA8B,WAChD,wBAAyB7D,GACvB4D,GAAsB,wBACtB7E,GAAgC,wBAChC,EACA,GACR,EACM,yBAA0BnlD,GACxBgqD,GAAsB,yBACtB7E,GAAgC,yBAChC,IACA,GACR,EACM,sBAAuBnlD,GACrBgqD,GAAsB,sBACtB7E,GAAgC,sBAChC,EACA,EACR,EACM,sBAAuBnlD,GACrBgqD,GAAsB,sBACtB7E,GAAgC,sBAChC,EACA,GACR,EACM,sBAAuBnlD,GACrBgqD,GAAsB,sBACtB7E,GAAgC,sBAChC,EACA,GACR,EACM,UAAWnlD,GACTgqD,GAAsB,UACtB7E,GAAgC,SACxC,EACM,qBAAsBnlD,GACpBgqD,GAAsB,qBACtB7E,GAAgC,oBACxC,CACA,EACI,KAAK,sBAAwB,CAC3B,OAAQ,GACR,UAAW,EACX,YAAa,EACb,mBAAoB,EACpB,gBAAiB,GACjB,gBAAiB,KACjB,gBAAiB,KACjB,eAAgB,KAChB,cAAe,EACf,cAAe,EACf,YAAa,EACb,OAAQ,EACR,gBAAiB,KACjB,mBAAoB,KACpB,mBAAoB,KACpB,kBAAmB,KACnB,sBAAuB,KACvB,oBAAqB,KAAK,qBAAqB,WAC/C,kBAAmB,CAAA,CACzB,EACI,KAAK,UAAU,cAAc,CAAC,CAAE,UAAA72L,CAAS,IAAO,KAAK,4BAA4BA,CAAS,CAAC,EACvFlE,EAAQ,UAAY,IACtB,KAAK,QAAO,EAEd,KAAK,QAAU,KAAK,oBAAoB,KAAK,aAAaA,EAAQ,MAAM,CAAC,EACzE,KAAK,6BAA6B,KAAK,QAAS,CAC9C,mBAAoB,GACpB,cAAe,GACf,gBAAiB,GACjB,cAAe,EACrB,CAAK,EACD,KAAK,SAAW,KAChB,KAAK,iBAAmB,KACxB,KAAK,oBAAsB,KAC3B,KAAK,cAAgB,IAAI,IACzB,KAAK,gBAAkB,IAAI,IAC3B,KAAK,wBAA0B,IAAI,IACnC,KAAK,sBAAwB,IAAI,IACjC,KAAK,SAAW,EAChB,KAAK,gBAAkB,YAAY,IAAG,EACtC,KAAK,SAAW,CACd,eAAgB,EAChB,aAAc,EACd,qBAAsB,CAC5B,EACI,KAAK,eAAiB,KACtB,KAAK,4BAA8B,KACnC,MAAM8/L,EAAuB9/L,EAAQ,QAAUA,EAAQ,gBAAkB,KACzE,KAAK,qBAAuB+7L,GAC1BjB,GACAgF,GAAwB,OAAOA,GAAyB,SACpDA,EACA,CAAA,CACV,EACI,KAAK,sBAAwB,CAC3B,cAAe,OAAO,kBACtB,YAAa,EACb,iBAAkB,GAClB,wBAAyB,KAAK,qBAAqB,kBACnD,aAAc,GACd,iBAAkB,KAClB,mBAAoB,OAAO,kBAC3B,wBAAyB,GACzB,yBAA0B,KAC1B,0BAA2B,EAC3B,qBAAsB,KACtB,uBAAwB,OAAO,kBAC/B,4BAA6B,GAC7B,6BAA8B,KAC9B,8BAA+B,GAC/B,8BAA+B,EAC/B,qBAAsB,KACtB,sBAAuB,GACvB,iBAAkB,GAClB,kBAAmB,GACnB,oBAAqB,GACrB,uBAAwB,OAAO,kBAC/B,kBAAmB,KACnB,kBAAmB,KAAK,qBAAqB,YAAc,EAC3D,UAAW,GACX,kBAAmB,GACnB,gBAAiB,KACjB,cAAe,KACf,qBAAsB,EACtB,sBAAuB,EACvB,qBAAsB,GACtB,0BAA2B,GAC3B,iCAAkC,KAClC,oCAAqC,GACrC,mBAAoB,OAAO,iBACjC,EACI,KAAK,SAAW,CACd,KAAM,CAAE,QAAS,GAAO,aAAc,EAAI,EAC1C,KAAM,CAAE,QAAS,GAAO,aAAc,EAAI,EAC1C,QAAS,CACP,gBAAiB,GACjB,WAAY,GACZ,OAAQ,GACR,wBAAyB,GACzB,qBAAsB,EACtB,0BAA2B,GACnC,EACM,MAAO,CAAE,KAAM,KAAM,MAAO,GAAI,MAAO,IAAI,EAC3C,QAAS,CAAE,EAAG,EAAG,EAAG,EAAG,QAAS,EAAG,QAAS,EAAG,OAAQ,EAAK,EAC5D,cAAe,GACf,gBAAiB,KACjB,mBAAoB,KACpB,QAAS3O,GAAyB,EAClC,KAAM,KACN,UAAW,GACX,OAAQ,GACR,cAAe,IACrB,EACI,KAAK,0BAA4B,GACjC,KAAK,sBAAwB,CAC3B,KAAO1vL,GAAU,KAAK,mBAAmBA,CAAK,EAC9C,KAAOA,GAAU,KAAK,mBAAmBA,CAAK,EAC9C,GAAKA,GAAU,KAAK,iBAAiBA,CAAK,EAC1C,OAASA,GAAU,KAAK,iBAAiBA,CAAK,EAC9C,MAAO,IAAM,KAAK,oBAAmB,EACrC,MAAQA,GAAU,KAAK,aAAaA,CAAK,EACzC,MAAQA,GAAU,KAAK,oBAAoBA,EAAO,GAAO,CAAE,UAAW,GAAO,EAC7E,SAAWA,GAAU,KAAK,oBAAoBA,EAAO,GAAM,CAAE,UAAW,GAAO,CACrF,EACI,KAAK,qBAAuB,KAC5B,KAAK,kBAAoB,KAAK,mBAAqB,CACjD,QAAS,GACT,MAAO85F,GACP,QAAS,KACT,UAAW,KACX,YAAa,KACb,YAAa,KACb,aAAc,KACd,aAAc,KACd,gBAAiB,KACjB,cAAej1F,EACf,cAAeA,EACf,QAAS,EACT,MAAO,KACP,UAAW,IACjB,EACI,KAAK,oBAAsB,KAC3B,KAAK,iBAAmB,CACtB,UAAW,IAAI,IACf,UAAW,IAAI,IACf,YAAa,KACb,YAAa,KACb,UAAW,KACX,UAAW,IACjB,EACI,KAAK,yBAA2BtG,EAAQ,0BAA4B,GACpE,KAAK,yBAA2BA,EAAQ,0BAA4B,GACpE,KAAK,wBAA0B,CAC7B,QAASA,EAAQ,yBAA2B,IAASA,EAAQ,0BAA4B,GACzF,2BAA4BA,EAAQ,4CAA8C,GAClF,8BAA+BA,EAAQ,+CAAiD,GACxF,iCAAkCA,EAAQ,kDAAoD,EACpG,EACI,KAAK,kBAAoB,IAAI,IAC7B,KAAK,gBAAkB,CAAE,MAAO,IAAI,IAAO,MAAO,IAAI,GAAK,EAC3D,MAAM+/L,EAAiB//L,EAAQ,UAAY,IAAQA,EAAQ,iBAAmB,GACxEggM,EAAehgM,EAAQ,cAAgBA,EAAQ,qBAAuBg7L,GAAiB,aACvFiF,EAAqBjgM,EAAQ,cAAgB,IAAQA,EAAQ,qBAAuB,GACpFkgM,EAAuBlgM,EAAQ,uBAAyB,IACzDA,EAAQ,qBAAuB,IAC/BA,EAAQ,uBAAyB,GAChCmgM,EAAqBngM,EAAQ,0BAA4B,IAC1DA,EAAQ,qBAAuB,IAC/BA,EAAQ,qBAAuB,GAC9BogM,EAAwB,OAAOpgM,EAAQ,uBAA0B,UAAYA,EAAQ,sBAAsB,KAAI,EACjHA,EAAQ,sBAAsB,KAAI,EAClCg7L,GAAiB,eACfqF,EAAyB,OAAOrgM,EAAQ,mBAAsB,UAAYA,EAAQ,kBAAkB,KAAI,EAC1GA,EAAQ,kBAAkB,KAAI,EAC9Bg7L,GAAiB,gBACfsF,EAAkB,OAAOtgM,EAAQ,iBAAoB,UAAYA,EAAQ,gBAAgB,KAAI,EAC/FA,EAAQ,gBAAgB,KAAI,EAC5Bg7L,GAAiB,SACfuF,EAAkCpF,GAA8BmF,EAAiBD,CAAsB,EAC7G,KAAK,eAAiB,CACpB,GAAGrF,GACH,QAAS+E,EACT,aAAclxL,GAAM+uF,GAAeoiG,EAAchF,GAAiB,YAAY,EAAG,IAAM,CAAG,EAC1F,YAAaiF,EACb,cAAeC,EACf,SAAUI,EACV,gBAAiBC,EACjB,eAAgBnF,GAA6BmF,EAAiCH,CAAqB,EACnG,YAAaD,EACb,QAAStxL,GACP+uF,GAAe59F,EAAQ,gBAAkBA,EAAQ,uBAAwBg7L,GAAiB,OAAO,EACjG,MACA,CACR,EACM,cAAensL,GACb+uF,GAAe59F,EAAQ,qBAAsBg7L,GAAiB,aAAa,EAC3E,KACA,GACR,EACM,cAAensL,GACb+uF,GAAe59F,EAAQ,qBAAsBg7L,GAAiB,aAAa,EAC3E,EACA,CACR,EACM,eAAgBh7L,EAAQ,wBAA0B,IAC7CA,EAAQ,iBAAmB,GAChC,0BAA2BA,EAAQ,mCAAqC,IACnEA,EAAQ,4BAA8B,GAC3C,UAAW6O,GACT+uF,GAAe59F,EAAQ,iBAAkBg7L,GAAiB,SAAS,EACnE,IACA,GACR,EACM,YAAansL,GACX+uF,GAAe59F,EAAQ,cAAeg7L,GAAiB,WAAW,EAClE,EACA,GACR,EACM,SAAU,OAAOh7L,EAAQ,iBAAoB,UAAYA,EAAQ,gBAAgB,KAAI,EACjFA,EAAQ,gBAAgB,KAAI,EAC5Bg7L,GAAiB,SACrB,iBAAkB,OAAOh7L,EAAQ,yBAA4B,UAAYA,EAAQ,wBAAwB,KAAI,EACzGA,EAAQ,wBAAwB,KAAI,EACpCg7L,GAAiB,iBACrB,kBAAmB,OAAOh7L,EAAQ,0BAA6B,UAAYA,EAAQ,yBAAyB,KAAI,EAC5GA,EAAQ,yBAAyB,KAAI,EACrCg7L,GAAiB,kBACrB,kBAAmB,OAAOh7L,EAAQ,0BAA6B,SAC3DA,EAAQ,yBACRg7L,GAAiB,iBAC3B,EACI,KAAK,gBAAkB,CAAE,UAAW,GAAO,YAAa,IAAI,EAC5D,KAAK,cAAgB,KACrB,KAAK,UAAY,IAAI1qB,GAAgB,KAAM0L,GAA6B,CAAE,EAC1E,KAAK,6BAA4B,EACjC,KAAK,2BAA6B2hB,GAChCpC,GACAv7L,EAAQ,qBAAuB,CAAE,QAASA,EAAQ,0BAA0B,CAClF,EACI,KAAK,qBAAuB,CAC1B,YAAa,OAAO,kBACpB,aAAc,KACd,oBAAqB,CAAA,EACrB,sBAAuB,KACvB,iBAAkB,CAAA,EAClB,mBAAoB,KACpB,eAAgB,GAChB,sBAAuB,GACvB,OAAQ,KAAK,2BAA2B,QAAU,UAAY,WAC9D,kBAAmB,OAAO,kBAC1B,gBAAiB,KACjB,WAAY,KACZ,iBAAkB,EAClB,sBAAuB,OAAO,kBAC9B,yBAA0B,IAC1B,iBAAkB,EACxB,EACI,KAAK,mBAAqB,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAC,EAChE,KAAK,4BAA8B,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAC,EACzE,KAAK,eAAiB,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAC,EAC5D,KAAK,qBAAuBm8L,GAA6Bn8L,EAAQ,cAAe,CAC9E,GAAIA,EAAQ,GACZ,aAAc,KAAK,aACzB,CAAK,EACD,KAAK,eAAiB,KACtB,KAAK,sBAAwB,CAAA,EAC7B,KAAK,oBAAmB,EACxB,KAAK,WAAa,CAChB,aAAeZ,IACb,KAAK,iBAAiBA,CAAK,EACpB,KAAK,YAEd,qBAAuBA,IACrB,KAAK,cAAcA,CAAK,EACjB,KAAK,YAEd,YAAcA,IACZ,KAAK,gBAAgBA,CAAK,EACnB,KAAK,YAEd,kBAAoBkE,GACdA,IAAY,OAAkB,KAAK,QAAO,EAAG,WACjD,KAAK,gBAAkB,CAAE,GAAG,KAAK,gBAAiB,UAAWA,IAAY,EAAI,EAC7E,KAAK,cAAa,EACX,KAAK,WAEpB,EACI,KAAK,QAAU,IAAImiF,GAAmB,KAAMzlF,EAAQ,QAAU,EAAE,EAChE,KAAK,SAAW,IAAI81F,GAAoB,KAAM91F,EAAQ,SAAW,EAAE,EACnE,KAAK,KAAO,CAAE,GAAG,KAAK,OAAO,IAAI,EACjC,KAAK,qBAAuB,KAC5B,KAAK,4BAA8B,GACnC,KAAK,eAAiBi8L,GAAuBj8L,EAAQ,QAASA,CAAO,EACrE,KAAK,aAAe,KAAK,mBAAmB,KAAK,cAAc,EAC/D,KAAK,gBAAkB,KAAK,sBAAsB,KAAK,cAAc,EACrE,KAAK,iCAAmC,KACxC,KAAK,8BAA6B,EAClC,MAAMwgM,EAAiBpM,GAAwBp0L,CAAO,EAChDygM,EAAgB1N,GAAa/yL,EAAS,SAAS,EACjDA,EAAQ,QACPwgM,EAAiB,CAAE,KAAM,SAAS,EAAK,GACtCE,EAAmBnM,GAA0Bv0L,CAAO,EAC1D,KAAK,OAAS,IAAI8hL,GAAmB,CACnC,IAAK9hL,EAAQ,GACnB,CAAK,EACD,KAAK,mBAAmB,aAAe,KAAK,+BAA8B,EAC1E,KAAK,QAAU4wL,GAA2B6P,EAAe,CACvD,OAAQ,KACR,OAAQ,KAAK,OACb,YAAazgM,EAAQ,aAAe,UACpC,UAAW0gM,EACX,eAAgB1gM,EAAQ,iBAAmB,GAC3C,mBAAoBA,EAAQ,mBAC5B,oBAAqBA,EAAQ,oBAC7B,iBAAkBA,EAAQ,iBAC1B,sBAAuB,EAC7B,CAAK,EACD,KAAK,mCAAqC,KAC1C,KAAK,0CAA0CA,CAAO,EACtD,KAAK,0BAAyB,EAC9B,MAAM2gM,EAAiBH,EAAiBnM,GAAmCr0L,CAAO,EAAI,GACtF,KAAK,2BAA6B2gM,IAAmBD,EAAmB,CAAE,UAAWA,CAAgB,EAAK,IAC1G,KAAK,4BAA4B1gM,EAAQ,SAAS,EAClD,KAAK,qBAAqBA,EAAQ,SAAS,EAC3C,KAAK,wBAAuB,EAC5B,KAAK,GAAK,KACV,KAAK,MAAQ,KAAK,WAAU,CAC9B,CAEA,mBAAmB6C,EAAS63L,GAAkB,CAC5C,IAAIkG,EAAmB5E,GACrBn5L,EAAO,iBACP63L,GAAiB,iBACjB,EACA,OAAO,gBACb,EACQmG,EAAmBjrD,GACrB/yI,EAAO,iBACP63L,GAAiB,iBACjB,EACA,GACN,EACI,OAAI,KAAK,gCACH73L,EAAO,4BAA8B,KACvC+9L,EAAmBlG,GAAiB,kBAElC73L,EAAO,4BAA8B,KACvCg+L,EAAmBpG,KAGhB,CACL,OAAQ53L,EAAO,iBAAmB,IAAQA,EAAO,4BAA8B,IAASA,EAAO,iBAAmB,IAAS+9L,EAAmB,GAAKC,EAAmB,EACtK,uBAAwB,GACxB,UAAW,EACX,iBAAkB,EAClB,uBAAwBD,EACxB,uBAAwBC,EACxB,eAAgBh+L,EAAO,iBAAmB,GAC1C,0BAA2BA,EAAO,4BAA8B,GAChE,eAAgBA,EAAO,iBAAmB,GAC1C,OAAAA,CACN,CACE,CAEA,6BAA8B,CAC5B,MAAMA,EAAS,KAAK,sBAAwBi4L,GACtC,CAAE,UAAAriL,EAAW,UAAA4V,CAAS,EAAK,KAAK,gCAA6B,GAAQ,CACzE,UAAW,KAAK,IAAI,EAAG,KAAK,MAAM,OAAO,KAAK,SAAS,SAAS,GAAK,CAAC,CAAC,EACvE,UAAW,KAAK,IAAI,EAAG,KAAK,MAAM,OAAO,KAAK,SAAS,SAAS,GAAK,CAAC,CAAC,CAC7E,EACUyyK,EAAgB9E,GACpBn5L,EAAO,iCACPw3L,GACA,EACA,OAAO,gBACb,EACU0G,EAAgB/E,GACpBn5L,EAAO,iCACPy3L,GACA,EACA,OAAO,gBACb,EACI,OAAO7hL,GAAaqoL,GAAiBzyK,GAAa0yK,CACpD,CAEA,sBAAsBl+L,EAAS63L,GAAkB,CAC/C,GAAI73L,EAAO,iBAAmB,IAAS,OAAO,SAAa,IAAa,OAAO,KAC/E,MAAMiX,EAAS,KAAK,QAAQ,SAAW,KAAK,QAAQ,MAAQ,KAC5D,GAAI,CAACA,EAAQ,OAAO,KACpB,MAAMknL,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,yBACpB,OAAO,OAAOA,EAAQ,MAAO,CAC3B,SAAU,WACV,MAAO,IACP,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,cAAe,OACf,OAAQ,IACd,CAAK,EACD,MAAMC,EAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAQ,UAAY,yBACpBA,EAAQ,aAAa,cAAe,MAAM,EAC1C,OAAO,OAAOA,EAAQ,MAAO,CAC3B,MAAO,OACP,OAAQ,OACR,aAAc,MACd,UAAW,aACX,WAAY,cACZ,OAAQ,0EACR,eAAgB,gDAChB,UAAW,wEACX,UAAW,2CACjB,CAAK,EACDD,EAAQ,YAAYC,CAAO,EAC3BnnL,EAAO,YAAYknL,CAAO,EAC1B,KAAK,4BAA2B,EACzBA,CACT,CAEA,6BAA8B,CAE5B,GADI,OAAO,SAAa,KACpB,SAAS,eAAe,8BAA8B,EAAG,OAC7D,MAAMhqK,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,GAAK,+BACXA,EAAM,YAAc,uEACpB,SAAS,MAAM,YAAYA,CAAK,CAClC,CAEA,+BAAgC,CAC9B,MAAM+oB,EAAS,KAAK,QAAQ,QAAU,KAChCmhJ,EAAO,KAAK,cAAgB,KAC9B,CAACnhJ,GAAU,CAACmhJ,GAAM,QAAUA,EAAK,4BAA8B,KAC/DnhJ,EAAO,MAAM,aAAe,WAC9B,KAAK,iCAAmCA,EAAO,MAAM,YAEvDA,EAAO,MAAM,WAAa,SAC5B,CAEA,6BAA6B//C,EAAU,GAAI,CAEzC,MAAM6C,EAAS,CACb,GAFW,KAAK,gBAAkB63L,GAGlC,eAAgB16L,EAAQ,iBAAmB,GAC3C,0BAA2BA,EAAQ,4BAA8B,GACjE,eAAgB,EACtB,EACI,OAAI,OAAO,UAAU,eAAe,KAAKA,EAAS,kBAAkB,IAClE6C,EAAO,iBAAmB7C,EAAQ,iBAClC6C,EAAO,0BAA4B,IAEjC,OAAO,UAAU,eAAe,KAAK7C,EAAS,kBAAkB,IAClE6C,EAAO,iBAAmB7C,EAAQ,iBAClC6C,EAAO,0BAA4B,IAErC,KAAK,iBAAiB,SAAM,EAC5B,KAAK,gBAAkB,KACvB,KAAK,aAAe,KAAK,mBAAmBA,CAAM,EAClD,KAAK,gBAAkB,KAAK,sBAAsBA,CAAM,EACxD,KAAK,8BAA6B,EAClC,KAAK,WAAW,gBAAa,EACtB,KAAK,YACd,CAEA,+BAA+Bq+L,EAAM,CACnC,GAAI,CAACA,GAAQ,KAAK,eAAiBA,EAAM,OACzC,MAAMr+L,EAAS,CACb,GAAIq+L,EAAK,QAAU,KAAK,gBAAkBxG,GAC1C,eAAgB,EACtB,EACUyG,EAAqB,KAAK,iCAIhC,GAHA,KAAK,aAAe,KAAK,mBAAmBt+L,CAAM,EAClD,KAAK,aAAa,UAAY,YAAY,IAAG,EAC7C,KAAK,iCAAmCs+L,EACpC,KAAK,aAAa,SAAW,GAC3B,CAAC,KAAK,iBAAmB,KAAK,aAAa,iBAAmB,KAChE,KAAK,gBAAkB,KAAK,sBAAsBt+L,CAAM,GAE1D,KAAK,8BAA6B,MAC7B,CACL,KAAK,iBAAiB,SAAM,EAC5B,KAAK,gBAAkB,KACvB,MAAMk9C,EAAS,KAAK,QAAQ,QAAU,KAClCA,GAAU,KAAK,aAAa,4BAA8B,KAC5DA,EAAO,MAAM,WAAaohJ,GAAsB,GAEpD,CACA,KAAK,WAAW,kBAAe,EAC/B,KAAK,WAAW,gBAAa,CAC/B,CAEA,8BAA8BD,EAAM,CAC9B,CAACA,GAAQ,KAAK,eAAiBA,IACnCA,EAAK,eAAiB,GACtB,KAAK,gCAA+B,EACtC,CAEA,4BAA6B,CAC3B,MAAMA,EAAO,KAAK,cAAgB,KAC9B,CAACA,GAAQA,EAAK,yBAA2B,KAC7CA,EAAK,kBAAoB,EAC3B,CAEA,6BAA6Br9L,EAAM,YAAY,MAAO,CACpD,MAAMq9L,EAAO,KAAK,cAAgB,KAClC,GAAI,CAACA,GAAQA,EAAK,SAAW,IAAQA,EAAK,yBAA2B,GAAM,MAAO,GAClF,MAAMh9L,EAAY,OAAO,SAASL,CAAG,EAAIA,EAAM,YAAY,IAAG,EAI9D,IAHI,CAAC,OAAO,SAASq9L,EAAK,SAAS,GAAKA,EAAK,WAAa,KACxDA,EAAK,UAAYh9L,GAEfg9L,EAAK,iBAAmB,GAC1B,MAAO,GAET,MAAME,EAAqBF,EAAK,uBAAyB,EACnDG,EAAgBH,EAAK,uBAAyB,EAIpD,GAHI,CAACE,GAAsB,CAACC,GAGxB,CAAC,KAAK,gCACR,MAAO,GAET,MAAMC,EAAoBF,GAAsBF,EAAK,kBAAoBA,EAAK,uBACxEK,EAAcF,GAAkBn9L,EAAYg9L,EAAK,WAAcA,EAAK,uBAC1E,MAAO,EAAEI,GAAqBC,EAChC,CAEA,+BAAgC,CAC9B,MAAMl+L,EAAS,KAAK,SAAW,KAE/B,MADI,GAACA,GAAUA,aAAkBiE,IAC7B,KAAK,WAAW,gBAAkB,GAExC,CAEA,8BAA+B,CAC7B,MAAM45L,EAAO,KAAK,cAAgB,KAClC,GAAI,CAACA,GAAQA,EAAK,SAAW,IAAQA,EAAK,yBAA2B,GAAM,MAAO,GAClF,MAAME,EAAqBF,EAAK,uBAAyB,EACnDG,EAAgBH,EAAK,uBAAyB,EACpD,MAAI,CAACE,GAAsB,CAACC,EAAsB,GAC3C,KAAK,8BAA6B,CAC3C,CAEA,iCAAkC,CAChC,MAAMH,EAAO,KAAK,cAAgB,KAClC,GAAI,CAACA,GAAQA,EAAK,yBAA2B,GAAM,OACnDA,EAAK,uBAAyB,GAC9BA,EAAK,OAAS,GACdA,EAAK,eAAiB,GACtB,MAAMnhJ,EAAS,KAAK,QAAQ,QAAU,KAClCA,GAAUmhJ,EAAK,4BAA8B,KAC/CnhJ,EAAO,MAAM,WAAa,KAAK,kCAAoC,IAErE,KAAK,iBAAiB,SAAM,EAC5B,KAAK,gBAAkB,KACvB,KAAK,uCAAsC,CAC7C,CAEA,gCAAiC,CAC/B,MAAMzE,EAAS,KAAK,QAAU,KAC9B,GAAI,CAACA,GAAU,OAAOA,EAAO,kBAAqB,WAAY,OAAO,KACrE,MAAM73C,EAAWhC,GAAU,CACzB,MAAMgK,EAAShK,GAAO,QAAU,CAAA,EAC1Bc,EAAM,KAAK,QAAQ,aAAakJ,EAAO,KAAOA,EAAO,MAAQ,EAAE,GAAK,OAAOA,EAAO,KAAOA,EAAO,MAAQ,EAAE,EAC1G+1L,EAAgB,KAAK,QAAQ,aAAa,uBAAuB,GAAK,wBACtEC,EAAW,KAAK,QAAQ,aAAa,UAAU,GAAK,WACtDl/L,IAAQi/L,GAAiBrN,GAA8B1oL,CAAM,IAC/D,KAAK,mBAAmB,WAAa,IAEnClJ,IAAQk/L,GAAYtN,GAA8B1oL,CAAM,IAC1D,KAAK,mBAAmB,SAAW,GAEvC,EACA,OAAA6vC,EAAO,iBAAiB,SAAU73C,CAAO,EAClC,IAAM63C,EAAO,sBAAsB,SAAU73C,CAAO,CAC7D,CAEA,0BAA2B,CACzB,OAAOgwL,GAAoB,KAAK,SAAW,CAAA,EAAI,KAAK,QAAQ,MAAQ,KAAK,QAAQ,WAAa,KAAK,SAAS,WAAa,IAAI,CAC/H,CAEA,yBAA0B,CACxB,MAAM3oL,EAAQ,KAAK,oBAAsB,KACzC,GAAI,CAACA,GAAU,CAACA,EAAM,YAAc,CAACA,EAAM,SAAW,OAAO,KAE7D,GADA,KAAK,wBAAwBA,EAAM,cAAgB,KAAK,2BAA4B,CAAE,OAAQ,kBAAmB,EAC7GA,EAAM,QAAS,OAAOA,EAAM,QAChC,GAAI,OAAO,SAAa,KAAe,OAAO,OAAW,IAAa,OAAO,KAE7E,MAAMojK,EAAiB,IAAM,CAE3B,GADI,KAAK,YACL,CAACpjK,EAAM,YAAc,CAACA,EAAM,SAAU,OAC1C,MAAM42L,EAAY,KAAK,yBAAwB,EAC3CA,IAAc52L,EAAM,cACxB,KAAK,wBAAwB42L,CAAS,CACxC,EACMvtF,EAAW,CAAA,EACXwtF,EAAiB,SAAS,iBAAmB,SAAS,MAAQ,KACpE,GAAI,OAAO,kBAAqB,YAAcA,EAAgB,CAC5D,MAAMzgF,EAAW,IAAI,iBAAkBu+D,GAAY,CAC5CA,EAAQ,KAAMn6B,GAAW,CAAC,oBAAqB,aAAc,uBAAwB,OAAO,EAAE,SAASA,EAAO,aAAa,CAAC,GAGjI4oB,EAAc,CAChB,CAAC,EACDhtD,EAAS,QAAQygF,EAAgB,CAC/B,QAAS,GACT,WAAY,GACZ,gBAAiB,CAAC,oBAAqB,aAAc,uBAAwB,OAAO,CAC5F,CAAO,EACDxtF,EAAS,KAAK,IAAM+M,EAAS,WAAU,CAAE,CAC3C,CACA,MAAM0gF,EAAoBnkG,GAAU,CAC7BA,IACD,OAAOA,EAAM,kBAAqB,YACpCA,EAAM,iBAAiB,SAAUywE,CAAc,EAC/C/5D,EAAS,KAAK,IAAM1W,EAAM,sBAAsB,SAAUywE,CAAc,CAAC,GAChE,OAAOzwE,EAAM,aAAgB,aACtCA,EAAM,YAAYywE,CAAc,EAChC/5D,EAAS,KAAK,IAAM1W,EAAM,iBAAiBywE,CAAc,CAAC,GAE9D,EACA,GAAI,CACF0zB,EAAiB,OAAO,aAAa,8BAA8B,CAAC,EACpEA,EAAiB,OAAO,aAAa,+BAA+B,CAAC,CACvE,MAAY,CAEZ,CACA,OAAA92L,EAAM,QAAU,IAAM,CACpB,UAAWupG,KAAWF,EAAS,OAAO,CAAC,EAAGE,IAAO,EACjDvpG,EAAM,QAAU,IAClB,EACOA,EAAM,OACf,CAEA,wBAAwBgsF,EAAQ,OAAQ92F,EAAU,CAAA,EAAI,CACpD,MAAM8K,EAAQ,KAAK,oBAAsB,KACzC,GAAI,CAACA,EAAO,OAAO,KACnB,MAAM42L,EAAY5qG,IAAU,QAAU,QAAU,OAEhD,GADAhsF,EAAM,aAAe42L,EACjB52L,EAAM,WAAY,CACpB,MAAMorF,EAAa69F,GAA8B2N,CAAS,EACpDF,EAAgB,KAAK,QAAQ,aAAa,uBAAuB,GAAK,wBACxE,OAAO,KAAK,QAAQ,OAAU,YAAc,KAAK,OAAO,MAAMA,CAAa,EAC7E,KAAK,OAAO,aAAaA,EAAetrG,EAAY,CAClD,OAAQ,UACR,OAAQl2F,EAAQ,QAAU,aAC1B,aAAc,EACxB,CAAS,EAED,KAAK,iBAAiB,aAAck2F,EAAY,CAC9C,OAAQ,UACR,OAAQl2F,EAAQ,QAAU,aAC1B,cAAe,EACzB,CAAS,CAEL,CACA,GAAI8K,EAAM,SAAU,CACd,KAAK,uBAAsB,KAAK,qBAAqB,MAAQ42L,GAEjE,MAAMG,GADW,KAAK,QAAQ,SAAS,UAAU,GAAK,OACtB,cAAgB,GAC1CJ,EAAW,KAAK,QAAQ,aAAa,UAAU,GAAK,WACtD,OAAO,KAAK,QAAQ,OAAU,YAAc,KAAK,OAAO,MAAMA,CAAQ,GACxE,KAAK,OAAO,aAAaA,EAAUC,EAAW,CAC5C,OAAQ,UACR,OAAQ1hM,EAAQ,QAAU,aAC1B,aAAc,EACxB,CAAS,EAEC,KAAK,IAAM,CAAC6hM,GACd,KAAK,GAAG,WAAWH,EAAW,CAC5B,OAAQ,UACR,OAAQ1hM,EAAQ,QAAU,aAC1B,cAAe,EACzB,CAAS,GAEC,CAAC,KAAK,IAAM,CAAC6hM,IAAe,KAAK,wBAAwBH,CAAS,CACxE,CACA,OAAO,IACT,CAEA,8BAA8B//L,EAAM8J,EAAS,GAAI,CAC/C,MAAMX,EAAQ,KAAK,oBAAsB,KACzC,GAAI,CAACA,EAAO,OACZ,MAAMvI,EAAMZ,IAAS,cAAgBA,IAAS,aAC1C,aACCA,IAAS,SAAWA,IAAS,WAAa,WAAa,KACxD,CAACY,GAAO,CAAC4xL,GAA8B1oL,CAAM,IACjDX,EAAMvI,CAAG,EAAI,GACf,CAEA,mBAAoB,CAElB,GADI,KAAK,SAAS,cAAgB,IAC9B,OAAO,kBAAqB,WAAY,OAC5C,MAAMwX,EAAO,KAAK,QAAQ,MAAQ,KAC5Bu0H,EAAY,KAAK,QAAQ,WAAa,KAC5C,GAAI,CAACv0H,GAAQ,CAACu0H,EAAW,OAEzB,MAAMwzD,EAAqBhpK,GACzBA,IAAS/e,GACN+e,IAASw1G,GACR,OAAOx1G,GAAM,UAAa,aAAeA,EAAK,SAAS/e,CAAI,GAAK+e,EAAK,SAASw1G,CAAS,GAGvFptB,EAAW,IAAI,iBAAkBu+D,GAAY,CACjD,GAAI,KAAK,WAAY,CACnBv+D,EAAS,WAAU,EACnB,MACF,CACA,UAAWokC,KAAUm6B,EACnB,UAAW3mJ,KAAQwsH,EAAO,cAAgB,CAAA,EACxC,GAAKw8C,EAAkBhpK,CAAI,EAC3B,CAAAooF,EAAS,WAAU,EACnB,KAAK,QAAO,EACZ,OAGN,CAAC,EAEDA,EAAS,QAAQotB,EAAW,CAAE,UAAW,EAAI,CAAE,EAC3CA,EAAU,YACZptB,EAAS,QAAQotB,EAAU,WAAY,CAAE,UAAW,GAAM,EAE5D,KAAK,qBAAuBptB,CAC9B,CAEA,0CAA0ClhH,EAAU,GAAI,CAEtD,GADIA,EAAQ,8BAAgC,IAASA,EAAQ,SAAS,uBAAyB,IAC3F,OAAO,OAAW,KAAe,OAAO,OAAO,kBAAqB,WAAY,OACpF,MAAMyD,EAAWhC,GAAU,CACzB,GAAI,OAAO,kCAAoC,GAAM,OACrD,MAAMof,EAAS,KAAK,SAAS,oBAAiB,GAAQ,KAChD+pI,EAAc/pI,GAAQ,aAAe,CAAA,EAI3C,GAAI,EAHsB+pI,EAAY,QAAU,IAC3CA,EAAY,iBAAmB,IAC/B/pI,GAAQ,aAAa,UAAY,IACd,OACxB,MAAM9d,EAAU,oFAChB,OAAAtB,EAAM,iBAAc,EACpBA,EAAM,YAAcsB,EACbA,CACT,EACA,OAAO,iBAAiB,eAAgBU,CAAO,EAC/C,KAAK,mCAAqC,IAAM,CAC9C,OAAO,oBAAoB,eAAgBA,CAAO,CACpD,CACF,CAEA,+BAAgC,CAC9B,MAAMwnF,EAAa,KAAK,yBAAyB,OACjD,GAAIA,GAAc,OAAOA,GAAe,UAAY,OAAOA,EAAW,kBAAqB,WACzF,OAAOA,EAET,GAAI,OAAOA,GAAe,UAAYA,GAAcA,IAAe,OAAQ,CACzE,MAAM74E,EAAQ,SAAS,cAAc64E,CAAU,EAC/C,GAAI74E,EAAO,OAAOA,CACpB,CACA,OAAO,KAAK,QAAQ,MAAQ,IAC9B,CAEA,mBAAmB3Q,EAAO,CAExB,OADc,MAAM,KAAKA,GAAO,cAAc,OAAS,EAAE,EAC5C,SAAS,OAAO,CAC/B,CAEA,+BAAgC,CAC9B,GAAI,KAAK,wBAAyB,OAAO,KAAK,wBAC9C,MAAMimG,EAAM,KAAK,QAAQ,MAAM,eAAiB,SAC1Cs5F,EAAUt5F,EAAI,cAAc,KAAK,EACvCs5F,EAAQ,UAAY,8BACpBA,EAAQ,aAAa,cAAe,MAAM,EAC1CA,EAAQ,MAAM,SAAW,WACzBA,EAAQ,MAAM,MAAQ,KACtBA,EAAQ,MAAM,OAAS,OACvBA,EAAQ,MAAM,QAAU,OACxBA,EAAQ,MAAM,WAAa,SAC3BA,EAAQ,MAAM,eAAiB,SAC/BA,EAAQ,MAAM,cAAgB,SAC9BA,EAAQ,MAAM,IAAM,MACpBA,EAAQ,MAAM,cAAgB,OAC9BA,EAAQ,MAAM,OAAS,0BACvBA,EAAQ,MAAM,aAAe,OAC7BA,EAAQ,MAAM,WAAa,sBAC3BA,EAAQ,MAAM,MAAQ,OACtBA,EAAQ,MAAM,UAAY,SAC1BA,EAAQ,MAAM,KAAO,qFACrBA,EAAQ,MAAM,QAAU,OAExB,MAAMx5F,EAAQE,EAAI,cAAc,KAAK,EACrCF,EAAM,UAAY,qCAClBA,EAAM,YAAc,KAAK,yBAAyB,cAAgB,2BAClE,MAAMu6F,EAAWr6F,EAAI,cAAc,KAAK,EACxC,OAAAq6F,EAAS,UAAY,wCACrBA,EAAS,YAAc,KAAK,yBAAyB,iBAAmB,+DACxEf,EAAQ,YAAYx5F,CAAK,EACzBw5F,EAAQ,YAAYe,CAAQ,EAC5B,KAAK,QAAQ,MAAM,YAAYf,CAAO,EACtC,KAAK,wBAA0BA,EACxBA,CACT,CAEA,0BAA0B50L,EAAQ,CAChC,MAAM40L,EAAU,KAAK,8BAA6B,EAClDA,EAAQ,MAAM,QAAU50L,EAAS,OAAS,OAC1C,KAAK,QAAQ,MAAM,UAAU,OAAO,6BAA8BA,CAAM,CAC1E,CAEA,MAAM,uBAAuBspJ,EAAM,CACjC,GAAI,CAACA,EAAM,OAAO,KAClB,MAAMv1H,EAASyyJ,GAA2Bl9B,EAAK,IAAI,EAC7CssC,EAAY,KAAK,yBAAyB,kBAAoB,CAAA,EACpE,GAAI,CAAC7hK,GAAU,CAAC6hK,EAAU,SAAS7hK,CAAM,EACvC,eAAQ,KAAK,kEAAmE,CAAE,KAAMu1H,EAAK,KAAM,OAAAv1H,EAAQ,EACpG,KAET,MAAM8hK,EAAiB,KAAK,yBAAyB,gBAAkB,CAAA,EACjEC,EAAqBD,EAAe,oBAAsB,KAAK,0BACrE,GAAI,OAAOC,GAAuB,YACd,MAAMA,EAAmB,CACzC,OAAQxsC,EACR,WAAYA,EAAK,KACjB,OAAAv1H,EACA,QAAS,MACjB,CAAO,IACiB,GAAM,OAAO,KAEjC,MAAMgiK,EAA+BF,EAAe,uBAC9CG,EAAyB,OAAOD,GAAiC,WACnEA,EACC,OAAO,KAAK,+BAAkC,WAC5C12L,GAAW,KAAK,8BAA8B,CAC7C,GAAGA,EACH,WAAYiqJ,EAAK,KACjB,QAAS,MACrB,CAAW,EACD,OACN,OAAO,KAAK,YAAYA,EAAM,CAC5B,GAAGusC,EACH,OAAA9hK,EACA,mBAAoB8hK,EAAe,qBAAuB,GAC1D,uBAAAG,CACN,CAAK,CACH,CAEA,uBAAwB,CACtB,GAAI,KAAK,yBAAyB,UAAY,GAAM,OACpD,MAAMlhM,EAAS,KAAK,8BAA6B,EACjD,GAAI,CAACA,EAAQ,OAEb,MAAMmhM,EAAW5gM,GACV,KAAK,mBAAmBA,CAAK,GAClCA,EAAM,iBAAc,EACpBA,EAAM,kBAAe,EACjBA,EAAM,eAAcA,EAAM,aAAa,WAAa,QACjD,IAJqC,GAMxC6gM,EAAe7gM,GAAU,CACxB4gM,EAAQ5gM,CAAK,IAClB,KAAK,uBAAyB,EAC9B,KAAK,0BAA0B,EAAI,EACrC,EACM8gM,EAAc9gM,GAAU,CAC5B4gM,EAAQ5gM,CAAK,CACf,EACM+gM,EAAe/gM,GAAU,CACxB4gM,EAAQ5gM,CAAK,IAClB,KAAK,sBAAwB,KAAK,IAAI,EAAG,KAAK,sBAAwB,CAAC,EACnE,KAAK,wBAA0B,GAAG,KAAK,0BAA0B,EAAK,EAC5E,EACMghM,EAAUhhM,GAAU,CACxB,GAAI,CAAC4gM,EAAQ5gM,CAAK,EAAG,OACrB,KAAK,sBAAwB,EAC7B,KAAK,0BAA0B,EAAK,EACpC,MAAMi0J,EAAOj0J,EAAM,cAAc,QAAQ,CAAC,GAAK,KAC/C,KAAK,uBAAuBi0J,CAAI,EAAE,MAAOzxJ,GAAU,CACjD,QAAQ,MAAM,+CAAgDA,CAAK,CACrE,CAAC,CACH,EAEA/C,EAAO,iBAAiB,YAAaohM,CAAW,EAChDphM,EAAO,iBAAiB,WAAYqhM,CAAU,EAC9CrhM,EAAO,iBAAiB,YAAashM,CAAW,EAChDthM,EAAO,iBAAiB,OAAQuhM,CAAM,EACtC,KAAK,wBAA0B,IAAM,CACnCvhM,EAAO,oBAAoB,YAAaohM,CAAW,EACnDphM,EAAO,oBAAoB,WAAYqhM,CAAU,EACjDrhM,EAAO,oBAAoB,YAAashM,CAAW,EACnDthM,EAAO,oBAAoB,OAAQuhM,CAAM,EACzC,KAAK,yBAAyB,SAAM,EACpC,KAAK,wBAA0B,KAC/B,KAAK,sBAAwB,CAC/B,CACF,CAEA,wBAAyB,CACvB,KAAK,sBAAsB,aAAU,EACrC,KAAK,qBAAuB,IAC9B,CAEA,iBAAiB9gM,EAAM,CACrB,MAAM6P,EAAK,OAAO7P,GAAQ,EAAE,EAAE,KAAI,EAClC,GAAI,CAAC6P,EAAI,OAAO,KAChB,MAAMksC,EAAW,KAAK,WAAW,MAAMlsC,CAAE,GAAK,KAC9C,OAAIksC,IACA,KAAK,WAAW,UAAU,MAAMlsC,CAAE,EAC7B,KAAK,YAAYA,CAAE,EAErB,KACT,CAUA,YAAY7P,EAAM,CAChB,MAAM6P,EAAK,OAAO7P,GAAQ,EAAE,EAAE,KAAI,EAClC,OAAK6P,EACE,KAAK,WAAW,MAAMA,CAAE,IAAM,IAAQ,KAAK,WAAW,UAAU,MAAMA,CAAE,IAAM,GADrE,EAElB,CAUA,YAAY7P,EAAM,CAChB,OAAO,KAAK,iBAAiBA,CAAI,CACnC,CAEA,8BAA+B,CAC7B,YAAK,SAAWgzL,GAAwB,IAAI,EACrC,KAAK,QACd,CAWA,iBAAiBhzL,EAAM+gM,EAAc,CACnC,YAAK,WAAW,UAAU,WAAW/gM,EAAM+gM,CAAY,EAChD,IACT,CAcA,YAAY/gM,EAAMghM,EAAmB,CACnC,MAAMnxL,EAAK,OAAO7P,GAAQ,EAAE,EAAE,KAAI,EAClC,GAAI,CAAC6P,EAAI,MAAM,IAAI,MAAM,yEAAyE,EAElG,GAAIkjL,GAAeiO,CAAiB,EAClC,OAAAA,EAAkB,GAAKnxL,EAChB,KAAK,UAAU,IAAImxL,CAAiB,EAG7C,MAAMjlJ,EAAW,KAAK,WAAW,MAAMlsC,CAAE,GAAK,KAC9C,GAAIksC,GAAYilJ,GAAqB,OAAOA,GAAsB,SAChE,OAAAjlJ,EAAS,SAASilJ,CAAiB,EAC5BjlJ,EAET,GAAIA,IAAailJ,IAAsB,QAAaA,IAAsB,IACxE,OAAOjlJ,EAET,GAAI,CAAC,KAAK,WAAW,UAAU,MAAMlsC,CAAE,EACrC,MAAM,IAAI,MAAM,qBAAqBA,CAAE,GAAG,EAE5C,OAAImxL,IAAsB,QAAaA,IAAsB,GACpD,KAAK,UAAU,IAAInxL,CAAE,EAEvB,KAAK,UAAU,IAAIA,EAAImxL,CAAiB,CACjD,CAEA,qBAAqB9/L,EAAQ,CAC3B,GAAI,CAACA,GAAUA,IAAW,GAAO,OACjC,GAAI,MAAM,QAAQA,CAAM,EAAG,CACzB,UAAWuqB,KAASvqB,EACd,OAAOuqB,GAAU,SAAU,KAAK,YAAYA,CAAK,EAC5CsnK,GAAetnK,CAAK,GAAG,KAAK,YAAYA,EAAM,IAAMA,EAAM,aAAa,GAAIA,CAAK,EAE3F,MACF,CACA,GAAI,OAAOvqB,GAAW,SAAU,CAC9B,KAAK,YAAYA,CAAM,EACvB,MACF,CACA,GAAI,OAAOA,GAAW,SAAU,OAEhC,MAAM+/L,EAAe,IAAI,IAAI,CAAC,MAAO,SAAS,CAAC,EAC/C,SAAW,CAACjhM,EAAMvC,CAAK,IAAK,OAAO,QAAQyD,CAAM,EAC/C,GAAI,EAAA+/L,EAAa,IAAIjhM,CAAI,GAAKvC,IAAU,IACxC,IAAIA,IAAU,IAAQs1L,GAAet1L,CAAK,EAAG,CAC3C,KAAK,YAAYuC,EAAMvC,IAAU,GAAO,OAAYA,CAAK,EACzD,QACF,CACA,KAAK,YAAYuC,EAAMvC,CAAK,EAG9B,MAAMyjM,EAAa,CAAA,EACf,MAAM,QAAQhgM,EAAO,GAAG,EAAGggM,EAAW,KAAK,GAAGhgM,EAAO,GAAG,EACnDA,EAAO,KAAKggM,EAAW,KAAKhgM,EAAO,GAAG,EAC3C,CAACggM,EAAW,QAAUhgM,EAAO,YAAc,IAC7CggM,EAAW,KAAK,WAAW,EAE7B,UAAWz1K,KAASy1K,EAClB,GAAI,OAAOz1K,GAAU,SAAU,CAC7B,MAAM01K,EAAkBjgM,EAAO,UAAUuqB,CAAK,EAC9C,KAAK,YAAYA,EAAO01K,CAAe,CACzC,MAAWpO,GAAetnK,CAAK,GAC7B,KAAK,YAAYA,EAAM,IAAMA,EAAM,aAAa,GAAIA,CAAK,CAG/D,CAEA,4BAA4BvqB,EAAQ,CAClC,GAAIA,IAAW,GAAO,OACtB,MAAM2xG,EAAW,IAAI,IACfuuF,EAAkB,CAAA,EACxB,GAAIlgM,GAAU,OAAOA,GAAW,UAAY,CAAC,MAAM,QAAQA,CAAM,GAAK,CAAC6xL,GAAe7xL,CAAM,EAAG,CAC7F,SAAW,CAAClB,EAAMvC,CAAK,IAAK,OAAO,QAAQyD,CAAM,EAC3CzD,IAAU,GAAOo1G,EAAS,IAAI7yG,CAAI,EAC7BvC,GAAS,OAAOA,GAAU,UAAY,CAACs1L,GAAet1L,CAAK,IAClE2jM,EAAgBphM,CAAI,EAAIvC,GAGxByD,EAAO,SAAW,OAAOA,EAAO,SAAY,UAC9C,OAAO,OAAOkgM,EAAiBlgM,EAAO,OAAO,CAEjD,CACI,KAAK,SAAS,QAAU,CAACkgM,EAAgB,SAAQA,EAAgB,OAAS,KAAK,QAAQ,QACvF,KAAK,SAAS,SAAW,CAACA,EAAgB,UAASA,EAAgB,QAAU,KAAK,QAAQ,SAE9F,UAAWvxL,KAAMuqK,GACXvnE,EAAS,IAAIhjG,CAAE,GACnB,KAAK,YAAYA,EAAIuxL,EAAgBvxL,CAAE,CAAC,CAE5C,CAEA,kCAAmC,CACjC,MAAMysK,EAAY,KAAK,WAAW,SAAM,GAAQ,CAAA,EAChD,UAAW71B,KAAY61B,EACrB71B,EAAS,2BAAwB,EACjCA,EAAS,wBAAqB,EAC9BA,EAAS,wBAAqB,EAC9BA,EAAS,2BAAwB,EACjCA,EAAS,+BAA4B,EACrCA,EAAS,8BAA2B,EACpCA,EAAS,cAAW,EAEtB,UAAWA,KAAY61B,EACrB71B,EAAS,0BAAuB,EAElC,OAAO,IACT,CAEA,2BAA4B,CAC1B,MAAM9sG,EAAS,KAAK,QAAU,KAC9B,GAAI,OAAOA,GAAQ,UAAa,WAAY,OAC5CA,EAAO,SAAS,KAAM,QAAS,CAC7B,UAAW,CACT,YAAa,wBACb,QAAS,KAAK,eAAiB,KAAO,KAAO,KAC7C,KAAM,OACN,MAAO,UACP,GAAI,CACF,MAAO,YACP,WAAY,YACZ,QAAS,CAAC,KAAM,IAAI,CAC9B,EACQ,OAAQ,IAAM,KAAK,KAAI,EACvB,OAAQ,CAACl8C,EAAOqM,EAAS,KAAO,KAAK,QAAQrM,IAAU,KAAO,KAAO,KAAM,CACzE,QAAS,GACT,aAAc,GACd,OAAQqM,EAAO,QAAU,QACzB,WAAY,EACtB,CAAS,EACD,UAAYs9H,GAAW,KAAK,GAAGgD,GAAO,aAAetqI,GAAU,CAC7D,MAAMgK,EAAShK,GAAO,QAAUA,GAAS,CAAA,EACzCsnI,EAAOt9H,EAAO,OAAS,KAAO,KAAO,KAAM,CACzC,OAAQ,UACR,OAAQ,eACR,cAAe,EAC3B,CAAW,CACH,CAAC,CACT,CACA,CAAK,EACD,MAAMygL,EAAuB,CAAA,EACvB8W,EAAkB,KAAK,4BAA2B,EAClDC,EAA0Bl6D,GAAW,KAAK,GAAGgD,GAAO,sBAAuB,IAAM,CACrFhD,EAAO,OAAW,CAChB,OAAQ,UACR,OAAQ,wBACR,cAAe,EACvB,CAAO,CACH,CAAC,EACD,UAAWxmI,KAAOiyL,GAA2B,CAC3C,MAAMp1L,EAAQ4jM,IAAkBzgM,CAAG,EAC7B2gM,EAAe,MAAM,QAAQ9jM,CAAK,GAAK,YAAY,OAAOA,CAAK,EAC/Dqf,EAAO,OAAOrf,GAAU,UAC1B,UACC,OAAOA,GAAU,SAAW,SAAY8jM,EAAe,QAAU,SACtEhX,EAAqB3pL,CAAG,EAAI,CAC1B,YAAa,yBAAyBA,CAAG,IACzC,QAAS6sK,GAAkBhwK,CAAK,EAChC,KAAAqf,EACA,MAAO,UACP,QAAS,CAAC,kBAAkBlc,CAAG,EAAE,EACjC,GAAI,CACF,MAAOA,EAAI,QAAQ,qBAAsB,OAAO,EAAE,QAAQ,KAAO4gM,GAAWA,EAAO,YAAW,CAAE,EAChG,WAAY1kL,IAAS,UAAY,SAAYA,IAAS,SAAW,SAAW,QACtF,EACQ,OAAQ,IAAM2wJ,GAAkB,KAAK,4BAA2B,IAAK7sK,CAAG,CAAC,EACzE,OAAQ,CAACsvG,EAAWpmG,EAAS,KAAO,CAClC,KAAK,eAAe,CAAE,CAAClJ,CAAG,EAAGsvG,CAAS,EAAI,CACxC,OAAQpmG,EAAO,QAAU,QACzB,OAAQA,EAAO,QAAU,gBACzB,WAAY,EACxB,CAAW,CACH,EACA,UAAWw3L,CACnB,CACI,CACA3nJ,EAAO,SAAS,KAAM,kBAAmB4wI,CAAoB,EAC7D5wI,EAAO,SAAS,KAAM,SAAU,CAC9B,KAAM,CACJ,YAAa,uBACb,QAAS,KAAK,qBAAqB,CAAE,gBAAiB,EAAK,CAAE,EAC7D,KAAM,SACN,MAAO,UACP,GAAI,CACF,MAAO,cACP,WAAY,SACZ,WAAY,GACtB,EACQ,OAAQ,IAAM,KAAK,qBAAqB,CAAE,gBAAiB,EAAK,CAAE,EAClE,OAAQ42I,GACR,OAAQ,CAAC5kI,EAAM7hD,EAAS,CAAA,IAAO,KAAK,oBAAoB6hD,EAAM,CAC5D,OAAQ7hD,EAAO,QAAU,QACzB,gBAAiBA,EAAO,kBAAoB,EACtD,CAAS,EACD,UAAYs9H,GAAW,CACrB,IAAIye,EAAQ,KACR47C,EAAc,KACdC,EAAgB,KACpB,MAAMC,EAAQ,IAAM,CAElB,GADA97C,EAAQ,KACJ,CAAC47C,EAAa,OAClB,MAAM91I,EAAO81I,EACP33L,EAAS43L,GAAiB,CAAA,EAChCD,EAAc,KACdC,EAAgB,KAChBt6D,EAAOz7E,EAAM,CACX,OAAQmnI,GAA4BhpL,EAAO,OAAQA,CAAM,EAAKA,EAAO,QAAU,cAAiB,UAChG,OAAQ,cACR,SAAU,cACV,WAAY,cACZ,cAAegpL,GAA4BhpL,EAAO,OAAQA,CAAM,EAChE,WAAY,GAC1B,CAAa,CACH,EACMktG,EAAc,KAAK,GAAGozB,GAAO,YAActqI,GAAU,CACzD,MAAMgK,EAAShK,GAAO,QAAUA,GAAS,CAAA,EACnC6rD,EAAO,KAAK,qBAAqB,CAAE,gBAAiB,EAAK,CAAE,EAC5DA,IACL81I,EAAc91I,EACd+1I,EAAgB53L,EACZ+7I,GAAS,MAAM,aAAaA,CAAK,EACrCA,EAAQ,WAAW87C,EAAO,GAAG,EAC/B,CAAC,EACD,MAAO,IAAM,CACP97C,GAAS,MAAM,aAAaA,CAAK,EACrC7uC,IAAW,CACb,CACF,CACR,CACA,CAAK,EACDr9D,EAAO,SAAS,KAAM,iBAAkB,CACtC,MAAO,CACL,YAAa,iFACb,QAAS,KAAK,2BAA2B,CAAE,iBAAkB,EAAK,CAAE,EACpE,KAAM,SACN,MAAO,UACP,QAAS,GACT,OAAQ,IAAM,KAAK,2BAA2B,CAAE,iBAAkB,EAAK,CAAE,EACzE,OAASl8C,GAAU,KAAK,0BAA0BA,EAAO,CACvD,gBAAiB,GACjB,OAAQ,eAClB,CAAS,EACD,UAAY2pI,GAAW,CACrB,MAAMtlI,EAAWhC,GAAUsnI,EAAO,OAAW,CAC3C,GAAItnI,GAAO,QAAU,GACrB,OAAQ,UACR,OAAQ,wBACR,cAAe,EAC3B,CAAW,EACK0yG,EAAW,CACf,KAAK,GAAG43B,GAAO,eAAgBtoI,CAAO,EACtC,KAAK,GAAGsoI,GAAO,aAActoI,CAAO,CAChD,EACU,MAAO,IAAM0wG,EAAS,QAASE,GAAYA,IAAO,CAAI,CACxD,CACR,CACA,CAAK,CACH,CAEA,qBAAqBr0G,EAAU,GAAI,CACjC,MAAM61B,EAAS,KAAK,UAAU,QAAU,KAClCy3B,EAAOL,GAAkBp3B,CAAM,EACrC,OAAIy3B,GAAQttD,EAAQ,kBAAoB,IAAM,OAAOstD,EAAK,SACnDA,CACT,CAEA,oBAAoBxiD,EAAO9K,EAAU,GAAI,CACvC,MAAM61B,EAAS,KAAK,UAAU,QAAU,KAClCy3B,EAAOxiD,GAAS9K,EAAQ,kBAAoB,GAAO,CAAE,GAAG8K,CAAK,EAAKA,EACpEwiD,GAAQttD,EAAQ,kBAAoB,IAAM,OAAOstD,EAAK,SAC1D,KAAK,6BAA6B,OAAI,EACtC,KAAK,oCAAmC,EACxCD,GAAgBx3B,EAAQy3B,CAAI,EAC5B,KAAK,WAAW,gBAAa,CAC/B,CAEA,6BAA8B,CAC5B,OAAO+uI,GAAwB,KAAK,sBAAwBvB,EAAuB,CACrF,CAEA,2BAA2BhwL,EAAO,CAChC,GAAI,GAACA,GAAS,OAAOA,GAAU,UAC/B,IAAI,CAAC,KAAK,sBAAuB,CAC/B,KAAK,qBAAuBixL,GAA6B,KAAK,sBAAwBjB,GAAyBhwL,CAAK,EACpH,MACF,CACA,KAAK,iBAAiBA,CAAK,EAC7B,CAGA,mCAAoC,CAClC,OAAK,KAAK,8BACR,KAAK,4BAA8B,IAAI6iD,GAA2B,CAChE,cAAe,IAAM,KAAK,WAAW,gBAAa,CAC1D,CAAO,GAEI,KAAK,2BACd,CAEA,yBAA0B,CACxB,MAAM9qD,EAASw5L,GAAwB,KAAK,sBAAwBvB,EAAuB,EACrFyI,EAA0B,KAAK,sCAAqC,EAC1E,MAAO,CACL,GAAG1gM,EACH,wBAAA0gM,EACA,2BAA4B,KAAK,gCAAgCA,GAAyB,QAAU,IAAI,CAC9G,CACE,CAEA,0BAA2B,CACzB,KAAK,KAAKx3D,GAAO,sBAAuB,KAAK,wBAAuB,CAAE,CACxE,CAEA,uCAAwC,CACtC,MAAMuD,EAAoBmsD,GAAuB,KAAK,sBAAsB,iBAAiB,EAC7F,OAAOnsD,GAAmB,OAASA,EAAoB,IACzD,CAEA,kBAAkB1hF,EAAgB,GAAO,CACvC,GAAI,CAAC,KAAK,sBAAuB,OACjC,KAAK,sBAAsB,aAAe,GAC1C,KAAK,sBAAsB,cAAgB,OAAO,kBAClD,KAAK,gCAA+B,EACpC,MAAMtnD,EAAU,KAAK,oBAAiB,GAAQ,KAC9C,GAAI,KAAK,iCAAiCA,CAAO,EAAG,CAClD,MAAMzD,EAAS,KAAK,sBAAwBi4L,GACtCzpB,EAAUxuK,EAAO,eAAiB,GACpC,KAAK,gCAAgC,KAAK,sCAAqC,EAAIA,CAAM,EACzF,KAAK,iCAAiC,KAAK,sCAAqC,EAAIA,CAAM,EAC1FwuK,GAAS,KAAK,iCAAiCA,EAAS,CAAE,MAAO,GAAM,OAAQ,QAAS,CAC9F,MACE,KAAK,oCAAoC,CAAE,MAAO,GAAM,OAAQ,QAAS,EAEvEzjH,IAAkB,IACpB,KAAK,WAAW,gBAAa,CAEjC,CAEA,iCAAkC,CAChC,MAAMuiC,EAAU,KAAK,uBAAyB,KACzCA,IACLA,EAAQ,qBAAuB,KAC/BA,EAAQ,sBAAwB,GAChCA,EAAQ,iBAAmB,GAC3BA,EAAQ,kBAAoB,GAC9B,CAEA,sBAAuB,EACN,KAAK,sBAAwB,OAChC,UAAY,KACL,KAAK,UAAU,QAAQ,MAAQ,QAC/B,MACnB,KAAK,kBAAkB,EAAK,CAC9B,CAEA,8BAA+B,CAC7B,MAAMA,EAAU,KAAK,uBAAyB,KACzCA,IACLA,EAAQ,iBAAmB,KAC3BA,EAAQ,mBAAqB,OAAO,kBACpCA,EAAQ,wBAA0B,GAClCA,EAAQ,yBAA2B,KACnCA,EAAQ,2BAA6BA,EAAQ,2BAA6B,GAAK,EAC/EA,EAAQ,qBAAuB,KAC/BA,EAAQ,uBAAyB,OAAO,kBACxCA,EAAQ,4BAA8B,GACtCA,EAAQ,6BAA+B,KACvCA,EAAQ,8BAAgC,GACxCA,EAAQ,+BAAiCA,EAAQ,+BAAiC,GAAK,EACzF,CAEA,iCAAkC,CAEhC,GAAI,EADY,KAAK,uBAAyB,MAChC,OACd,KAAK,6BAA4B,EACjC,MAAMttF,EAAS,KAAK,sBAAwBi4L,GACxCj4L,EAAO,UAAY,IAAQA,EAAO,eAAiB,GACrD,KAAK,kBAAkB,EAAK,EAE5B,KAAK,gCAA+B,CAExC,CAEA,iCAAkC,CAChC,MAAMstF,EAAU,KAAK,uBAAyB,KACzCA,IACLA,EAAQ,kBAAoB,KAC9B,CAEA,sBAAsBqzG,EAAcxjM,EAAU,GAAI,CAChD,MAAM2C,EAAS,YAAY,OAAO6gM,CAAY,GAAKA,EAAa,QAAU,EACtEA,EACAvJ,GACJ,IAAIwJ,EAAe,IAAI,aAAa9gM,CAAM,EAC1C,MAAMkqD,EAAa,OAAO,SAAS7sD,EAAQ,UAAU,EAAI,OAAOA,EAAQ,UAAU,EAAI,EAChF8sD,EAAe,OAAO,SAAS9sD,EAAQ,YAAY,EAAI,OAAOA,EAAQ,YAAY,EAAI,EACtF0jM,EAAY3R,GAAwB/xL,EAAQ,KAAM86L,GAAwB,SAAS,EAEzF,GAAI,KAAK,IAAIjuI,CAAU,EAAI,MAAO,CAChC,MAAME,EAAMpH,GAAkB+9I,EAAW72I,CAAU,EAC7C82I,EAAU,IAAI,aAAa,CAAC,EAClC1G,GAAiB0G,EAAS52I,EAAK02I,CAAY,EAC3CA,EAAeE,CACjB,CACA,GAAI,KAAK,IAAI72I,CAAY,EAAI,MAAO,CAClC,MAAME,EAAQrH,GAAkB,CAAC,EAAG,EAAG,CAAC,EAAGmH,CAAY,EACjD62I,EAAU,IAAI,aAAa,CAAC,EAClC1G,GAAiB0G,EAASF,EAAcz2I,CAAK,EAC7Cy2I,EAAeE,CACjB,CACA,OAAA3G,GAAkByG,EAAcA,CAAY,EACrCA,CACT,CAEA,2BAA2BzjM,EAAU,GAAI,CACvC,MAAMmwF,EAAU,KAAK,uBAAyB,KACxCyzG,EAAiB,KAAK,kBAAoB,CAAE,OAAQ,UAAW,SAAU,IAAI,EACnF,GAAIA,EAAe,SAAW,WAC5B,MAAO,CAAE,OAAQ,UAAW,KAAM,IAAI,EAGxC,MAAMxsK,EAAWwsK,EAAe,UAAY,KAAK,yBAA2B,KAC5E,GAAI,CAACxsK,EAAU,MAAO,CAAE,OAAQ,WAAY,KAAM,IAAI,EAEtD,MAAMvrB,EAAU,KAAK,8BAA8B7L,CAAO,EAC1D,IAAI6G,EAAO,KACX,GAAI,CACE,OAAOuwB,EAAS,qBAAwB,WAC1CvwB,EAAOuwB,EAAS,oBAAoBvrB,CAAO,EAClC,OAAOurB,EAAS,iBAAoB,aAC7CvwB,EAAOuwB,EAAS,gBAAgBvrB,CAAO,EAE3C,OAAS5H,EAAO,CACdsH,GACE,KACA,yBACA,oFACA,CAAE,MAAAtH,EAAO,SAAAmzB,CAAQ,CACzB,EACMvwB,EAAO,IACT,CACA,OAAIA,GAAQ,OAAO,SAASA,EAAK,MAAM,GAAKA,EAAK,OAAS,EACjD,CAAE,OAAQ,gBAAiB,KAAAA,CAAI,EAGpC7G,EAAQ,uBAAyB,GAC5B,CAAE,OAAQ,WAAY,KAAM,IAAI,GAEzC,KAAK,gCAAgCo3B,EAAUp3B,CAAO,EAClDmwF,GAAS,2BAA6B/4D,GAAY+4D,EAAQ,kBAAoBA,EAAQ,iBAAiB,OAAS,EAC3G,CAAE,OAAQ,oBAAqB,KAAMA,EAAQ,gBAAgB,EAE/D,CAAE,OAAQ,WAAY,KAAM,IAAI,EACzC,CAEA,gCAAgC/4D,EAAUp3B,EAAU,GAAI,CACtD,MAAMmwF,EAAU,KAAK,uBAAyB,KAE9C,GADI,CAACA,GAAW,CAAC/4D,GAAY,OAAO,KAAK,2BAA8B,YACnE+4D,EAAQ,yBAA2BA,EAAQ,2BAA6B/4D,EAAU,OAEtF,MAAMvzB,EAAM,YAAY,IAAG,EACrB4U,EAAY,KAAK,sCAAqC,GAAI,QAAU,KAAK,qBAAqB,WAAa,EAC3GqyE,EAAgBj8E,GAAM,KAAK,gCAAgC4J,CAAS,EAAI,GAAK,IAAK,GAAI,EAC5F,GACE03E,EAAQ,2BAA6B/4D,GAClC,OAAO,SAAS+4D,EAAQ,kBAAkB,GACzCtsF,EAAMssF,EAAQ,mBAAsBrF,EAExC,OAGFqF,EAAQ,wBAA0B,GAClCA,EAAQ,yBAA2B/4D,EACnC,MAAMysK,GAAa1zG,EAAQ,2BAA6B,GAAK,EAC7DA,EAAQ,0BAA4B0zG,EAEpC,QAAQ,QAAO,EACZ,KAAK,IAAM,KAAK,0BAA0B,CAAE,GAAG7jM,EAAS,SAAAo3B,EAAU,CAAC,EACnE,KAAM3wB,GAAa,CACd0pF,EAAQ,4BAA8B0zG,GAAa1zG,EAAQ,2BAA6B/4D,GACxF3wB,GAAY,OAAO,SAASA,EAAS,MAAM,GAAKA,EAAS,OAAS,IACpE0pF,EAAQ,iBAAmB1pF,EAC3B0pF,EAAQ,mBAAqB,YAAY,IAAG,EAC5C,KAAK,kBAAkB,EAAK,EAC5B,KAAK,WAAW,gBAAa,EAC7B,KAAK,0BAAuB,EAEhC,CAAC,EACA,MAAOlsF,GAAU,CAChBsH,GACE,KACA,2BACA,qEACA,CAAE,MAAAtH,EAAO,SAAAmzB,CAAQ,CAC3B,CACM,CAAC,EACA,QAAQ,IAAM,CACT+4D,EAAQ,4BAA8B0zG,GAAa1zG,EAAQ,2BAA6B/4D,IAC1F+4D,EAAQ,wBAA0B,GAEtC,CAAC,CACL,CAEA,8BAA8BnwF,EAAU,GAAI,CAC1C,GAAIA,EAAQ,gBAAkB,IAAQA,EAAQ,sBAAwB,IAAQA,EAAQ,gBAAkB,GAAO,MAAO,GACtH,GAAIA,EAAQ,gBAAkB,GAAM,MAAO,GAC3C,MAAM6D,EAAM,YAAY,IAAG,EACrB6pL,EAAU,KAAK,UAAU,SAAW,KAG1C,GAFIA,GAAS,SAAW,IAAQ,KAAK,UAAU,gBAAkB,IAC7D,OAAO,SAASA,GAAS,gBAAgB,GAAK7pL,EAAM6pL,EAAQ,iBAAmB,KAC/E,OAAO,SAASA,GAAS,WAAW,GAAK7pL,EAAM6pL,EAAQ,YAAc,IAAK,MAAO,GACrF,MAAMoW,EAAsB,KAAK,sBAAwB,KACzD,OAAI,OAAO,SAASA,GAAqB,iBAAiB,GAAKjgM,EAAMigM,EAAoB,kBAA0B,GAC5G,KAAK,uBAAuB,oBAAsB,EAC3D,CAEA,0BAA0B17L,EAAa,CACrC,OAAKA,GAAa,OACX,MAAM,KAAKA,EAAcoJ,GAAO,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOA,CAAE,GAAK,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,EADxD,EAEnC,CAEA,oBAAoBO,EAAUk6B,EAAc,EAAGjsC,EAAU,CAAA,EAAI,CAI3D,GAHI,CAAC,OAAO,SAASisC,CAAW,GAAKA,GAAe,GAGhD,CAACl6B,GAAY,CAAC,OAAO,SAASA,EAAS,CAAC,CAAC,GAAK,CAAC,OAAO,SAASA,EAAS,CAAC,CAAC,GAAK,CAAC,OAAO,SAASA,EAAS,CAAC,CAAC,EAC7G,OAAO,KAET,MAAMgyL,EAAenuD,GAA2B51I,EAAQ,aAAc,EAAG,EAAG,CAAC,EACvE6zC,EAAgB,KAAK,IAAI,EAAG,OAAO,KAAK,UAAU,QAAQ,UAAU,OAAS,KAAK,MAAM,OAAS,CAAC,CAAC,EACnGC,EAAiB,KAAK,IAAI,EAAG,OAAO,KAAK,UAAU,QAAQ,UAAU,QAAU,KAAK,MAAM,QAAU,CAAC,CAAC,EACtGkwJ,EAAiB,KAAK,IAAInwJ,EAAeC,CAAc,EAAIiwJ,EAC3D12F,EAAY,OAAO,SAASrtG,EAAQ,SAAS,EAC/C,KAAK,IAAI,EAAG,OAAOA,EAAQ,SAAS,CAAC,EACrC,KAAK,IAAI,GAAIgkM,CAAc,EACzBj8L,EAAIgK,EAAS,CAAC,EACd/J,EAAI+J,EAAS,CAAC,EACd7H,EAAI6H,EAAS,CAAC,EACpB,MAAO,CACL,UAAAs7F,EACA,SAAU,EACV,YAAAphE,EACA,aAAcA,EACd,KAAMlkC,EACN,KAAMC,EACN,KAAMkC,EACN,KAAMnC,EACN,KAAMC,EACN,KAAMkC,EACN,QAASnC,EACT,QAASC,EACT,QAASkC,EACT,QAASnC,EACT,QAASC,EACT,QAASkC,EACT,KAAMnC,EAAIkkC,EACV,KAAMjkC,EAAIikC,EACV,KAAM/hC,EAAI+hC,EACV,MAAOA,EACP,WAAY,CAAClkC,EAAGC,EAAGkC,CAAC,EACpB,SAAU,CAACnC,EAAGC,EAAGkC,CAAC,CACxB,CACE,CAEA,oCAAoCktB,EAAUhvB,EAAapI,EAAU,CAAA,EAAI,CACvE,MAAMmwF,EAAU,KAAK,uBAAyB,KAC9C,GAAI,CAACA,GAAW,CAAC/4D,GAAY,CAAChvB,GAAa,QAAU,OAAO,KAAK,sBAAyB,WAAY,OACtG,MAAM89D,EAAY,KAAK,0BAA0B99D,CAAW,EAC5D,GAAI,CAAC89D,EAAW,OAChB,MAAM+9H,EAAgBjkM,EAAQ,gBAAkB,GAChD,GACEmwF,EAAQ,6BACLA,EAAQ,+BAAiC/4D,GACzC+4D,EAAQ,gCAAkCjqB,GAC1C+9H,IAAkB,GAErB,OAGF,MAAMpgM,EAAM,YAAY,IAAG,EACrBinF,EAAgBj8E,GACpB+mI,GACE,KAAK,sBAAsB,uBAC3BklD,GAAwB,uBACxB,EACA,GACR,EAAU,GACJ,GACA,GACN,EACI,GACE3qG,EAAQ,+BAAiC/4D,GACtC+4D,EAAQ,gCAAkCjqB,GAC1C,OAAO,SAASiqB,EAAQ,sBAAsB,GAC7CtsF,EAAMssF,EAAQ,uBAA0BrF,GACzCm5G,IAAkB,GAErB,OAGF9zG,EAAQ,4BAA8B,GACtCA,EAAQ,6BAA+B/4D,EACvC+4D,EAAQ,8BAAgCjqB,EACxC,MAAM29H,GAAa1zG,EAAQ,+BAAiC,GAAK,EACjEA,EAAQ,8BAAgC0zG,EAExC,QAAQ,QAAO,EACZ,KAAK,IAAM,KAAK,qBAAqBz7L,EAAa,CACjD,GAAGpI,EACH,SAAAo3B,EACA,aAAcp3B,EAAQ,cAAgB,CAACikM,EACvC,kBAAmBjkM,EAAQ,mBAAqB,CAACikM,EACjD,cAAejkM,EAAQ,gBAAkBikM,EAAgB,GAAQ,KAAK,8BAA8BjkM,CAAO,EACnH,CAAO,CAAC,EACD,KAAM0E,GAAW,CAChB,GACEyrF,EAAQ,gCAAkC0zG,GACvC1zG,EAAQ,+BAAiC/4D,GACzC+4D,EAAQ,gCAAkCjqB,EAE7C,OAEF,MAAMj9D,EAAS,KAAK,oBAAoBvE,GAAQ,SAAUA,GAAQ,OAAS0D,EAAY,OAAQpI,CAAO,EACtG,GAAKiJ,EAGL,IAFAknF,EAAQ,qBAAuBlnF,EAC/BknF,EAAQ,uBAAyB,YAAY,IAAG,EAC5CnwF,EAAQ,sBAAwB,GAAM,CACxC,MAAMkkM,EAAW,KAAK,wBAAwBj7L,EAAQ,CACpD,UAAW,WACX,UAAW,OAAO,SAASjJ,EAAQ,SAAS,EACxC,OAAOA,EAAQ,SAAS,EACxB,OAAO,SAASA,EAAQ,UAAU,EAChC,OAAOA,EAAQ,UAAU,EACzB,EACN,aAAcA,EAAQ,aACtB,iBAAkBA,EAAQ,iBAC1B,mBAAoBA,EAAQ,kBACxC,CAAW,EACKmkM,EAAUnkM,EAAQ,SAAW,KAAK,sBAAsB,YAAc,GACtE8tD,EAAa9tD,EAAQ,YAAc,KAAK,sBAAsB,oBAChE,KAAK,sBAAsB,eAAiB,GAC9C,KAAK,wBAAwBkkM,EAAU,CAAE,QAAAC,EAAS,WAAAr2I,CAAU,CAAE,EAE9D,KAAK,sCAAsCo2I,EAAU,CAAE,QAAAC,EAAS,WAAAr2I,CAAU,CAAE,CAEhF,CACA,KAAK,kBAAkB,EAAK,EAC5B,KAAK,WAAW,gBAAa,EAC/B,CAAC,EACA,MAAO7pD,GAAU,CAChBsH,GACE,KACA,gCACA,wEACA,CAAE,MAAAtH,EAAO,SAAAmzB,EAAU,UAAA8uC,CAAS,CACtC,CACM,CAAC,EACA,QAAQ,IAAM,CAEXiqB,EAAQ,gCAAkC0zG,GACvC1zG,EAAQ,+BAAiC/4D,GACzC+4D,EAAQ,gCAAkCjqB,IAE7CiqB,EAAQ,4BAA8B,GAE1C,CAAC,CACL,CAEA,wCAAwC7pF,EAAS,CAC/C,MAAMiL,EAAW,IAAI,IACrB,GAAI,KAAK,iCAAiCjL,CAAO,EAAG,CAClD,UAAW3E,IAAQ,CAACqD,GAAqBE,EAA4B,EAAGqM,EAAS,IAAI5P,EAAM,EAAK,EAChG,OAAO4P,CACT,CACA,UAAW5P,IAAQ,CAACqD,GAAqBE,EAA4B,EAAG,CACtE,GAAI,CAACoB,GAAW,OAAO3E,GAAS,UAAY,CAACA,EAAM,CACjD4P,EAAS,IAAI5P,EAAM,EAAK,EACxB,QACF,CACA,GAAI2E,EAAQ,iBAAiB,MAAM3E,CAAI,EAAG,CACxC,GAAI,OAAO2E,EAAQ,sBAAyB,WAC1C,GAAI,CACFiL,EAAS,IAAI5P,EAAM,EAAQ2E,EAAQ,qBAAqB3E,CAAI,CAAE,CAChE,MAAQ,CACN4P,EAAS,IAAI5P,EAAM,EAAK,CAC1B,MAEA4P,EAAS,IAAI5P,EAAM,EAAI,EAEzB,QACF,CACA,GAAI,OAAO2E,EAAQ,sBAAyB,WAAY,CACtD,GAAI,CACFiL,EAAS,IAAI5P,EAAM,EAAQ2E,EAAQ,qBAAqB3E,CAAI,CAAE,CAChE,MAAQ,CACN4P,EAAS,IAAI5P,EAAM,EAAK,CAC1B,CACA,QACF,CACA,GAAI,OAAO2E,EAAQ,kBAAqB,WAAY,CAClD,GAAI,CACFiL,EAAS,IAAI5P,EAAM,EAAQ2E,EAAQ,iBAAiB3E,CAAI,CAAE,CAC5D,MAAQ,CACN4P,EAAS,IAAI5P,EAAM,EAAK,CAC1B,CACA,QACF,CACA4P,EAAS,IAAI5P,EAAM,EAAI,CACzB,CACA,OAAO4P,CACT,CAEA,iCAAiCjL,EAAU,KAAK,oBAAiB,GAAQ,KAAM,CAC7E,OAAO,KAAK,IAAI,EAAG,OAAOA,GAAS,qBAAuB,CAAC,GAAK,CAAC,EAAI,CACvE,CAEA,iCAAiCkB,EAAWY,EAAapI,EAAU,CAAA,EAAI,CACrE,GAAI,CAACwH,GAAa,CAAC,OAAO,SAASA,EAAU,MAAM,GAAKA,EAAU,QAAU,EAAG,OAAO,KACtF,MAAM48L,EAAWv1L,GAAM,OAAO,SAAS7O,EAAQ,QAAQ,EAAI,OAAOA,EAAQ,QAAQ,EAAI,EAAG,GAAK,CAAC,EACzF+jM,EAAenuD,GAA2B51I,EAAQ,aAAc,EAAG,EAAG,CAAC,EACvE6zC,EAAgB,KAAK,IAAI,EAAG,OAAO,KAAK,UAAU,QAAQ,UAAU,OAAS,KAAK,MAAM,OAAS,CAAC,CAAC,EACnGC,EAAiB,KAAK,IAAI,EAAG,OAAO,KAAK,UAAU,QAAQ,UAAU,QAAU,KAAK,MAAM,QAAU,CAAC,CAAC,EACtGkwJ,EAAiB,KAAK,IAAInwJ,EAAeC,CAAc,EAAIiwJ,EAC3D12F,EAAY,OAAO,SAASrtG,EAAQ,SAAS,EAC/C,KAAK,IAAI,EAAG,OAAOA,EAAQ,SAAS,CAAC,EACrC,KAAK,IAAI,GAAIgkM,CAAc,EACzBK,EAAarI,GAAyBh8L,EAAQ,WAAYk6L,GAAgC,GAAI,GAAO,EACrGtrK,EAAS,EACTq/B,EAAO,KAAK,IAAI,EAAG,KAAK,KAAK7lD,EAAY,OAAS,KAAK,IAAI,EAAGi8L,CAAU,CAAC,CAAC,EAC1EC,EAAuB,KAAK,KAAKl8L,EAAY,OAAS6lD,CAAI,EAC1Ds2I,EAAgB,IAAI,aAAa,KAAK,IAAI,EAAGD,CAAoB,EAAI,CAAC,EAE5E,IAAI78L,EAAO,IAAcC,EAAO,IAAcsC,EAAO,IACjDrC,EAAO,KAAeC,EAAO,KAAeqC,EAAO,KACnDgI,EAAO,EAAOC,EAAO,EAAOC,EAAO,EACnCrL,EAAQ,EACR09L,EAAkB,EAClBpyL,EAAQ,GACZ,MAAMqyL,EAAUL,EAAW,QAAW,IAAI,aAAa,KAAK,IAAI,EAAGE,CAAoB,CAAC,EAAI,KACtFI,EAAUN,EAAW,QAAW,IAAI,aAAa,KAAK,IAAI,EAAGE,CAAoB,CAAC,EAAI,KACtFK,EAAUP,EAAW,QAAW,IAAI,aAAa,KAAK,IAAI,EAAGE,CAAoB,CAAC,EAAI,KACtFntI,EAAa,KAAK,UAAU,YAAc,KAC1C7wD,EAAU,KAAK,oBAAiB,GAAQ,KACxCs+L,EAAsB5kM,EAAQ,+BAA+B,IAAMA,EAAQ,oBAAsB,KACjG6kM,EAAyBljM,IACzBijM,GAAqB,IAAIjjM,EAAI,IAAM,GAAc,KAC9C2E,GAAS,yBAAyB3E,EAAI,GAAG,MAAQ,KAEpDimF,EAAe,KAAK,IAAI,EAAG,OAAOzwB,GAAY,cAAgB,CAAC,GAAK,CAAC,EACrE0wB,EAAgB,KAAK,IAAI,EAAG,OAAO1wB,GAAY,eAAiB,CAAC,GAAK,CAAC,EACvE2wB,EAAkB,KAAK,IAAI,EAAG,OAAO3wB,GAAY,sBAAwB,CAAC,GAAK,CAAC,EAChF4wB,EAAmB,KAAK,IAAI,EAAG,OAAO5wB,GAAY,uBAAyB,CAAC,GAAK,CAAC,EAClFypB,EAAWikH,EAAsB7/L,EAAmB,EACpD8/L,EAAcD,EAAsB3/L,EAA4B,EAEtE,QAASoD,GAAI,EAAGA,GAAIF,EAAY,OAAQE,IAAK2lD,EAAM,CACjD,MAAMz8C,GAAKpJ,EAAYE,EAAC,EAClBguB,GAAI9kB,GAAKod,EACf,GAAK0H,GAAI,GAAM9uB,EAAU,OAAQ,SACjC,MAAMO,GAAIP,EAAU8uB,EAAC,EACftuB,GAAIR,EAAU8uB,GAAI,CAAC,EACnBpsB,EAAI1C,EAAU8uB,GAAI,CAAC,EACzB,GAAI,CAAC,OAAO,SAASvuB,EAAC,GAAK,CAAC,OAAO,SAASC,EAAC,GAAK,CAAC,OAAO,SAASkC,CAAC,EAAG,SACvE,MAAM89E,GAAU,OAAO,SAASpH,IAAWpvE,EAAE,CAAC,EAAI,OAAOovE,EAASpvE,EAAE,CAAC,EAAI3L,GACnEoiF,GAAa,OAAO,SAAS68G,IAActzL,EAAE,CAAC,EAAI,OAAOszL,EAAYtzL,EAAE,CAAC,EAAIzL,GAC5Eg/L,GAAe,KAAK,IAAI,EAAIn9G,EAAeC,EAAgBG,GAAW,KAAK,IAAI,EAAGF,EAAkBC,EAAmBE,EAAU,CAAC,EACxIu8G,EAAkB,KAAK,IAAIA,EAAiBO,GAAe,EAAG,EAC9D3yL,EAAQ,GACR,MAAM4yL,GAAcl+L,EAAQ,EAC5By9L,EAAcS,EAAW,EAAIj9L,GAC7Bw8L,EAAcS,GAAc,CAAC,EAAIh9L,GACjCu8L,EAAcS,GAAc,CAAC,EAAI96L,EACjC+H,GAAQlK,GAAGmK,GAAQlK,GAAGmK,GAAQjI,EAC9BpD,GAAS,EACLiB,GAAIN,IAAMA,EAAOM,IAAOA,GAAIJ,IAAMA,EAAOI,IACzCC,GAAIN,IAAMA,EAAOM,IAAOA,GAAIJ,IAAMA,EAAOI,IACzCkC,EAAIF,IAAMA,EAAOE,GAAOA,EAAID,IAAMA,EAAOC,GACzCu6L,IACFA,EAAQ39L,EAAQ,CAAC,EAAIiB,GACrB28L,EAAQ59L,EAAQ,CAAC,EAAIkB,GACrB28L,EAAQ79L,EAAQ,CAAC,EAAIoD,EAEzB,CACA,GAAI,CAACkI,EAAO,OAAO,KAEnB,IAAI6yL,GAAUx9L,EAAUy9L,GAAUx9L,EAAUy9L,GAAUn7L,EAClDo7L,GAAUz9L,EAAU09L,GAAUz9L,EAAU09L,GAAUr7L,EACtD,GAAIw6L,GAAW39L,GAAS,EAAG,CACzB,MAAM0vB,IAAQ,EAAI4tK,GAAY,GAC9Ba,GAAUpI,GAAmB4H,EAAS39L,EAAO0vB,EAAI,EACjD4uK,GAAUvI,GAAmB4H,EAAS39L,EAAO,EAAI0vB,EAAI,EACrD0uK,GAAUrI,GAAmB6H,EAAS59L,EAAO0vB,EAAI,EACjD6uK,GAAUxI,GAAmB6H,EAAS59L,EAAO,EAAI0vB,EAAI,EACrD2uK,GAAUtI,GAAmB8H,EAAS79L,EAAO0vB,EAAI,EACjD8uK,GAAUzI,GAAmB8H,EAAS79L,EAAO,EAAI0vB,EAAI,CACvD,CAEA,MAAM+uK,GAAUN,GAAUG,IAAW,GAC/BI,IAAUN,GAAUG,IAAW,GAC/BI,GAAUN,GAAUG,IAAW,GAC/BvzL,EAAW,CACfjL,EAAQ,EAAKmL,EAAOnL,EAASy+L,EAC7Bz+L,EAAQ,EAAKoL,EAAOpL,EAAS0+L,GAC7B1+L,EAAQ,EAAKqL,EAAOrL,EAAS2+L,CACnC,EACI,MAAO,CACL,UAAAp4F,EACA,SAAA+2F,EACA,gBAAiB,OAAO,SAASpkM,EAAQ,eAAe,EACpD,KAAK,IAAI,EAAG,OAAOA,EAAQ,eAAe,CAAC,EAC3C,KAAK,IAAI6wL,GAAsC2T,CAAe,EAClE,YAAap8L,EAAY,OACzB,aAActB,EACd,KAAAW,EACA,KAAAC,EACA,KAAAsC,EACA,KAAArC,EACA,KAAAC,EACA,KAAAqC,EACA,QAAAg7L,GACA,QAAAC,GACA,QAAAC,GACA,QAAAC,GACA,QAAAC,GACA,QAAAC,GACA,UAAWf,EAAc,SAAS,EAAGz9L,EAAQ,CAAC,EAC9C,KAAAmL,EACA,KAAAC,EACA,KAAAC,EACA,MAAArL,EACA,WAAY,CAACy+L,EAAQC,GAAQC,CAAM,EACnC,SAAA1zL,CACN,CACE,CAEA,gCAAgC0G,EAAY,KAAM,CAChD,MAAM5V,EAAS,KAAK,sBAAwBi4L,GACtC4K,EAAe9vD,GACnB/yI,EAAO,kBACPi4L,GAAwB,kBACxB,EACA,GACN,EACU6K,EAAc/vD,GAClB/yI,EAAO,qBACPi4L,GAAwB,qBACxB,EACA,GACN,EACU8K,EAAchwD,GAClB/yI,EAAO,qBACPi4L,GAAwB,qBACxB6K,EACA,GACN,EACUE,EAAgBjwD,GACpB/yI,EAAO,yBACPi4L,GAAwB,yBACxB,EACA,EACN,EACUgL,EAAW9J,GACfn5L,EAAO,4BACPi4L,GAAwB,4BACxB,EACA,OAAO,gBACb,EACUiL,EAAoB,KAAK,IAAI,EAAG,OAAO,SAASttL,CAAS,EAAI,KAAK,MAAMA,CAAS,EAAI,KAAK,MAAM,KAAK,qBAAqB,WAAa,CAAC,CAAC,EACzIutL,EAAgBH,GAAiB,EACnC,EACA,KAAK,IAAI,EAAG,KAAK,IAAIE,EAAoBD,EAAU,EAAG,EAAID,CAAa,EACrEliM,EAAWkL,GAAM62L,EAAeM,EAAeL,EAAaC,CAAW,EAC7E,OAAI,KAAK,wBACP,KAAK,sBAAsB,wBAA0BjiM,GAEhDA,CACT,CAEA,8CAA8C8H,EAAS,KAAM,CAC3D,MAAM5I,EAAS,KAAK,sBAAwB,KAC5C,GAAI,CAACA,EAAQ,MAAO,GACpB,KAAK,gCAA+B,EACpC,MAAM2pG,EAAS6vF,GAAwBx5L,CAAM,EAC7C,IAAI4B,EAAU,GACd,MAAM8kD,EAAS99C,GAAQ,QAAU,KAC3Bw6L,EAAe,IAAI,IAAI,OAAO18I,GAAU,EAAE,EAAE,MAAM,aAAa,EAAE,OAAO,OAAO,CAAC,EAChF28I,EAAQD,EAAa,IAAI,KAAK,GAAKA,EAAa,IAAI,WAAW,EAC/DE,EAAWF,EAAa,IAAI,QAAQ,EACpCG,EAASH,EAAa,IAAI,MAAM,EAChCI,EAAUJ,EAAa,IAAI,OAAO,EAClCK,EAA4B76L,GAAQ,OAAS,OAC7CA,GAAQ,OAAS,WAAaA,GAAQ,OAAS,SAAWA,GAAQ,OAAS,UAC5E,CAAC89C,EAiBN,IAhBI28I,GAASC,GAAYC,GAAUC,GAAWC,IAC5C,KAAK,oCAAmC,EAEtCzjM,EAAO,UAAY,KAASqjM,GAASC,GAAYC,GAAUC,GAAWC,KACxEzjM,EAAO,QAAU,GACjB4B,EAAU,IAER5B,EAAO,QAAU,IAAQ,CAACujM,GAAU,CAACC,IACvCxjM,EAAO,MAAQ,GACf4B,EAAU,IAER5B,EAAO,eAAiB,KAASqjM,GAASE,GAAUC,GAAWC,KACjEzjM,EAAO,aAAe,GACtBA,EAAO,kBAAoB,KAC3B4B,EAAU,IAERA,EAAS,CAGX,GAFA,KAAK,kBAAkB,EAAK,EAC5B,KAAK,yBAAwB,EACzB,OAAO,KAAK,QAAQ,KAAQ,WAAY,CAC1C,MAAM8hM,EAAe9R,GAA4BhpL,GAAQ,OAAQA,CAAM,EAAKA,EAAO,QAAU,cAAiB,cAC9G,UAAWlJ,IAAO,CAAC,UAAW,QAAS,eAAgB,mBAAmB,EACpE,KAAK,UAAUiqG,IAASjqG,CAAG,CAAC,IAAM,KAAK,UAAU,KAAK,gCAAgCA,CAAG,CAAC,GAC9F,KAAK,OAAO,IAAI,mBAAmBA,CAAG,GAAI6sK,GAAkB,KAAK,gCAAgC7sK,CAAG,CAAC,EAAG,CACtG,OAAQgkM,IAAiB,OAAS,UAAYA,EAC9C,OAAQ,qBACR,cAAe,GACf,aAAc,GACd,WAAY,IACZ,QAAS,EACrB,CAAW,CAEL,CACA,KAAK,WAAW,gBAAa,CAC/B,CACA,OAAO9hM,CACT,CAEA,oBAAoBzE,EAAU,GAAI,CAChC,MAAMsG,EAAU,KAAK,kBAAiB,EAChCkgM,EAAuB/K,GAAuBz7L,EAAQ,WAAW,EACjE4kM,EAAsB,KAAK,wCAAwCt+L,CAAO,EAC1EmgM,EAAgB,CAAE,GAAGzmM,EAAS,oBAAA4kM,CAAmB,EACvD,GAAI4B,GAAsB,OAAQ,CAChC,MAAMj8K,EAAW,KAAK,2BAA2B,CAAE,GAAGk8K,EAAe,qBAAsB,GAAM,EACjG,GAAIl8K,GAAU,SAAW,UACvB,OAAO,KAAK,+BAA+BjkB,EAAS,IAAM,CACxD,MAAMkB,EAAY,KAAK,4BAA2B,EAClD,OAAO,KAAK,iCAAiCA,EAAWg/L,EAAsBC,CAAa,CAC7F,CAAC,EAEH,GAAI,CAACl8K,GAAU,KAAM,CACnB,MAAM6M,EAAW,KAAK,kBAAkB,UAAY,KAAK,yBAA2B,KAEpF,GADA,KAAK,oCAAoCA,EAAUovK,EAAsBC,CAAa,EAClFA,EAAc,gBAAkB,GAClC,OAAO,KAET,MAAMt2G,EAAU,KAAK,uBAAyB,KACxCjqB,EAAY,KAAK,0BAA0BsgI,CAAoB,EACrE,OACEr2G,GAAS,+BAAiC/4D,GACvC+4D,EAAQ,gCAAkCjqB,GAC1CiqB,EAAQ,qBAEJA,EAAQ,qBAEV,IACT,CACA,OAAO,KAAK,+BAA+B7pF,EAAS,IAClD,KAAK,iCAAiCikB,EAAS,KAAMi8K,EAAsBC,CAAa,CACzF,CACH,CAEA,MAAMl8K,EAAW,KAAK,2BAA2Bk8K,CAAa,EAC9D,GAAIl8K,GAAU,SAAW,UACvB,OAAO,KAAK,+BAA+BjkB,EAAS,IAAM,CACxD,MAAMkB,EAAY,KAAK,4BAA2B,EAC5CY,EAAc9B,GAAS,aAAe,KAC5C,OAAO,KAAK,iCAAiCkB,EAAWY,EAAaq+L,CAAa,CACpF,CAAC,EAEH,IAAIr+L,EAAc,KAQlB,OAPA,KAAK,0BAA0B,IAAM,CACnC,MAAMgE,EAAS9F,GAAS,aAAe,KAClC8F,GAAQ,SACbhE,EAAc,YAAY,OAAOgE,CAAM,EACnC,IAAI,YAAYA,CAAM,EACtB,MAAM,KAAKA,CAAM,EACvB,CAAC,EACG,CAAChE,GAAa,QAAU,CAACmiB,GAAU,KAAa,KAC7C,KAAK,+BAA+BjkB,EAAS,IAClD,KAAK,iCAAiCikB,EAAS,KAAMniB,EAAaq+L,CAAa,CAChF,CACH,CAEA,8BAA8Bp1B,EAAU,GAAI,CAC1C,MAAMrxK,EAAUqxK,EAAQ,SAAW,CAAA,EAC7BjpK,EAAcqzL,GAAuBpqB,EAAQ,WAAW,EACxDl6G,EAAa,KAAK,UAAU,YAAc,KAC1C51B,EAAW,KAAK,UAAU,QAAQ,UAAY,KAAK,MAAQ,CAAA,EACjE,OAAO,KAAK,UAAU,CACpB,KAAM8vI,EAAQ,MAAQ,SACtB,YAAajpK,GAAa,OAAS,KAAK,0BAA0BA,CAAW,EAAI,GACjF,SAAU,OAAO,SAASpI,EAAQ,QAAQ,EAAI,OAAOA,EAAQ,QAAQ,EAAI,KACzE,aAAc,OAAO,SAASA,EAAQ,YAAY,EAAI,OAAOA,EAAQ,YAAY,EAAI,KACrF,UAAW,OAAO,SAASA,EAAQ,SAAS,EAAI,OAAOA,EAAQ,SAAS,EAAI,KAC5E,WAAY,OAAO,SAASA,EAAQ,UAAU,EAAI,KAAK,MAAM,OAAOA,EAAQ,UAAU,CAAC,EAAI,KAC3F,gBAAiB,OAAO,SAASA,EAAQ,eAAe,EAAI,OAAOA,EAAQ,eAAe,EAAI,KAC9F,cAAe,OAAOuhC,EAAS,OAAS,KAAK,MAAM,OAAS,CAAC,GAAK,EAClE,eAAgB,OAAOA,EAAS,QAAU,KAAK,MAAM,QAAU,CAAC,GAAK,EACrE,aAAc,OAAO41B,GAAY,cAAgB,CAAC,GAAK,EACvD,cAAe,OAAOA,GAAY,eAAiB,CAAC,GAAK,EACzD,qBAAsB,OAAOA,GAAY,sBAAwB,CAAC,GAAK,EACvE,sBAAuB,OAAOA,GAAY,uBAAyB,CAAC,GAAK,CAC/E,CAAK,CACH,CAEA,6BAA6Bk6G,EAASrxK,EAAU,GAAI,CAClD,MAAMmwF,EAAU,KAAK,uBAAyB,KAC9C,GAAI,CAACA,GAAW,CAACkhF,EAAS,OAAO,KACjC,MAAMnrG,EAAY,KAAK,8BAA8BmrG,CAAO,EAC5D,GACErxK,EAAQ,QAAU,IACfmwF,EAAQ,oBAAsB,IAC9BA,EAAQ,wBAA0BjqB,GAClCiqB,EAAQ,qBAEX,OAAOA,EAAQ,qBAEjB,GAAI,KAAK,mCACP,YAAK,iCAAiCkhF,EAAS,CAAE,GAAGrxK,EAAS,MAAO,GAAM,EACnEmwF,EAAQ,sBAAwB,KAEzC,MAAMlnF,EAAS,KAAK,oBAAoB,CACtC,GAAIooK,EAAQ,SAAW,GACvB,YAAaA,EAAQ,aAAe,MAC1C,CAAK,EACD,OAAAlhF,EAAQ,uBAAyB,OAAO,SAASnwF,EAAQ,GAAG,EAAI,OAAOA,EAAQ,GAAG,EAAI,YAAY,IAAG,EACrGmwF,EAAQ,oBAAsB,GAC9BA,EAAQ,iBAAmBkhF,EAAQ,MAAQ,SAC3ClhF,EAAQ,sBAAwBjqB,EAChCiqB,EAAQ,qBAAuBlnF,GAAU,KACzCknF,EAAQ,kBAAoB,CAAAlnF,EACrBA,GAAU,IACnB,CAEA,iCAAiCooK,EAASrxK,EAAU,GAAI,CACtD,MAAMmwF,EAAU,KAAK,uBAAyB,KAC9C,GAAI,CAACA,GAAW,CAACkhF,GAAWlhF,EAAQ,sBAAwB,GAAM,MAAO,GACzEA,EAAQ,oBAAsB,GAC9B,MAAM1J,EAAM,IAAM,CAChB,MAAMh9E,EAAU,KAAK,uBAAyB,KAC9C,GAAKA,EACL,IAAI,CACF,KAAK,6BAA6B4nK,EAAS,CAAE,GAAGrxK,EAAS,MAAO,GAAM,CACxE,QAAC,CACCyJ,EAAQ,oBAAsB,EAChC,CACA,KAAK,WAAW,gBAAa,EAC/B,EACA,OAAI,OAAO,gBAAmB,WAAY,eAAeg9E,CAAG,EACvD,QAAQ,QAAO,EAAG,KAAKA,CAAG,EACxB,EACT,CAEA,iCAAiC4qF,EAAS,CACxC,MAAMlhF,EAAU,KAAK,uBAAyB,KAC9C,GAAI,CAACA,GAAW,CAACkhF,EAAS,OAAO,KACjC,MAAMnrG,EAAY,KAAK,8BAA8BmrG,CAAO,EAC5D,OAAIlhF,EAAQ,wBAA0BjqB,EAAkB,KACjDiqB,EAAQ,sBAAwB,IACzC,CAEA,gCAAgC/nF,EAAavF,EAAS,KAAK,sBAAwBi4L,GAAyB,CAC1G,MAAMn7L,EAAa87L,GAAuBrzL,CAAW,EACrD,OAAKzI,GAAY,OACV,CACL,KAAM,SACN,YAAaA,EACb,QAAS,CACP,SAAU,EACV,aAAc,EACd,WAAYkD,EAAO,iBAC3B,CACA,EAToC,IAUlC,CAEA,iCAAiCuF,EAAc,KAAMvF,EAAS,KAAK,sBAAwBi4L,GAAyB,CAClH,MAAMn7L,EAAa87L,GAAuBrzL,CAAW,EACrD,MAAO,CACL,KAAM,UACN,YAAazI,GAAY,OAASA,EAAa,KAC/C,QAAS,CACP,SAAUkD,EAAO,gBACjB,aAAcA,EAAO,oBACrB,WAAYA,EAAO,iBAC3B,CACA,CACE,CAEA,oCAAoC7C,EAAU,GAAI,CAChD,MAAMmwF,EAAU,KAAK,uBAAyB,KACxCttF,EAAS,KAAK,sBAAwBi4L,GAC5C,GAAI,CAAC3qG,GAAWA,EAAQ,YAAc,GAAM,OAAO,KACnD,GAAIttF,EAAO,eAAiB,GAAM,CAChC,MAAMysI,EAAoB,KAAK,sCAAqC,EAC9D+hC,EAAU,KAAK,gCAAgC/hC,EAAmBzsI,CAAM,EAC9E,OAAOwuK,EAAU,KAAK,6BAA6BA,EAASrxK,CAAO,EAAI,IACzE,CACA,GAAI6C,EAAO,UAAY,IAAQstF,EAAQ,eAAiB,IAAQA,EAAQ,4BAA8B,GACpG,OAAO,KAET,MAAMm/C,EAAoB,KAAK,sCAAqC,EAC9D+hC,EAAU,KAAK,iCAAiC/hC,EAAmBzsI,CAAM,EAC/E,OAAO,KAAK,6BAA6BwuK,EAASrxK,CAAO,CAC3D,CAEA,wBAAwBiJ,EAAQjJ,EAAU,GAAI,CAC5C,MAAM61B,EAAS,KAAK,UAAU,QAAU,KAClC6wK,EAAWz5I,GAAkBp3B,CAAM,EACnCpsB,EAAUzJ,EAAQ,SAAWktD,GAAgBw5I,EAAU1mM,EAAQ,QAAQ,EAAI0mM,EACjF,GAAI,CAAC7wK,GAAU,CAACpsB,GAAW,CAACR,EAAQ,OAAO,KAC3C,MAAM09L,EAAY3mM,EAAQ,YAAc,WAAa,WAAa,OAC5D0I,EACF8wL,GADWmN,IAAc,WAChB19L,EAAO,UAAYA,EAAO,YAAc,CAAC,EAAG,EAAG,CAAC,EAChDA,EAAO,YAAcA,EAAO,UAAY,CAAC,EAAG,EAAG,CAAC,EADG,CAAC,EAE3D29L,EAAY,KAAK,IAAI,KAAM,OAAO,SAAS5mM,EAAQ,SAAS,EAAI,OAAOA,EAAQ,SAAS,EAAI,CAAC,EAC7F6mM,EAAqBjxD,GAA2B51I,EAAQ,mBAAoB,EAAG,EAAG,CAAC,EACzF,GAAI61B,EAAO,OAAS,KAAM,CACxB,IAAIixK,EAAcr9L,EAAQ,KAAOm9L,EACjC,GAAIA,EAAY,GAAK,OAAO,SAAS5mM,EAAQ,YAAY,EAAG,CAC1D,MAAM+mM,EAAe,KAAK,IAAIlxK,EAAO,SAAW,KAAM,OAAO71B,EAAQ,YAAY,CAAC,EAElF8mM,EADwBr9L,EAAQ,MAASs9L,GAAgB,EAAIF,GAC7Bp9L,EAAQ,KAAO,KAAK,IAAIq9L,EAAaC,CAAY,CACnF,CACA,MAAMC,EAAW,KAAK,IAAInxK,EAAO,SAAWixK,EAAa,KAAK,IAAIjxK,EAAO,SAAWixK,EAAaA,CAAW,CAAC,EAC7G,OAAO55I,GAAgBzjD,EAAS,CAC9B,KAAM,KACN,WAAY,eACZ,OAAQ,IAAI,aAAaf,CAAM,EAC/B,MAAO,IAAI,aAAa,CAAC,EAAG,EAAG,CAAC,CAAC,EACjC,MAAO,IAAI,aAAa,CACtB,CAACA,EAAO,CAAC,EAAIs+L,EACb,CAACt+L,EAAO,CAAC,EAAIs+L,EACb,CACV,CAAS,EACD,KAAMA,CACd,CAAO,CACH,CACA,IAAIC,EAAkBx9L,EAAQ,SAAWm9L,EACzC,GAAIA,EAAY,GAAK,OAAO,SAAS5mM,EAAQ,gBAAgB,EAAG,CAC9D,MAAMknM,EAAmB,KAAK,IAAIrxK,EAAO,aAAe,KAAM,OAAO71B,EAAQ,gBAAgB,CAAC,EAE9FinM,EAD4Bx9L,EAAQ,UAAay9L,GAAoB,EAAIL,GACjCp9L,EAAQ,SAAW,KAAK,IAAIw9L,EAAiBC,CAAgB,CACvG,CACA,MAAMC,EAAe,KAAK,IAAItxK,EAAO,aAAeoxK,EAAiB,KAAK,IAAIpxK,EAAO,aAAeoxK,EAAiBA,CAAe,CAAC,EACrI,OAAO/5I,GAAgBzjD,EAAS,CAC9B,KAAM,KACN,OAAQ,IAAI,aAAaf,CAAM,EAC/B,MAAO,IAAI,aAAa,CAAC,EAAG,EAAG,CAAC,CAAC,EACjC,SAAUy+L,CAChB,CAAK,CACH,CAEA,sBAAsBl+L,EAAQjJ,EAAU,GAAI,CAC1C,MAAM61B,EAAS,KAAK,UAAU,QAAU,KAClCpsB,EAAUwjD,GAAkBp3B,CAAM,EACxC,GAAI,CAACA,GAAU,CAACpsB,GAAW,CAACR,EAAQ,OAAO,KAE3C,MAAM09L,EAAY3mM,EAAQ,YAAc,WAAa,WAAa,OAC5D0I,EACF8wL,GADWmN,IAAc,WAChB19L,EAAO,UAAYA,EAAO,YAAc,CAAC,EAAG,EAAG,CAAC,EAChDA,EAAO,YAAcA,EAAO,UAAY,CAAC,EAAG,EAAG,CAAC,EADG,CAAC,EAE3Dm+L,EAAW,KAAK,IAAI,KAAMn+L,EAAO,QAAUA,EAAO,OAAO,EACzDo+L,EAAY,KAAK,IAAI,KAAMp+L,EAAO,QAAUA,EAAO,OAAO,EAC/C,KAAK,IAAI,KAAMA,EAAO,QAAUA,EAAO,OAAO,EAC/D,MAAMu7L,EAAkB,KAAK,IAAI,EAAG,OAAOv7L,EAAO,iBAAmB,CAAC,GAAK,CAAC,EAE5E,GAAI4sB,EAAO,OAAS,KAAM,CACxB,MAAMyxK,EAAgB,KAAK,IACzB,EACA,OAAO,SAAStnM,EAAQ,UAAU,EAC9B,OAAOA,EAAQ,UAAU,EACzBm6L,EACZ,EACYoN,EAAY,KAAK,IAAI,EAAG1xK,EAAO,UAAU,OAAS,KAAK,MAAM,OAAS,CAAC,EACvE2xK,EAAY,KAAK,IAAI,EAAG3xK,EAAO,UAAU,QAAU,KAAK,MAAM,QAAU,CAAC,EACzE4xK,EAAS,KAAK,IAAI,EAAGF,EAAYt+L,EAAO,UAAY,CAAC,EACrDy+L,EAAS,KAAK,IAAI,EAAGF,EAAYv+L,EAAO,UAAY,CAAC,EACrD0+L,EAAQF,EAAS,KAAK,IAAI,KAAML,EAAW5C,EAAkB,CAAC,EAC9DoD,EAAQF,EAAS,KAAK,IAAI,KAAML,EAAY7C,EAAkB,CAAC,EAC/DwC,EAAW,KAAK,IAAIW,EAAOC,CAAK,EAAIN,EACpCO,EAAc,KAAK,IAAIhyK,EAAO,SAAWmxK,EAAU,KAAK,IAAInxK,EAAO,SAAWmxK,EAAUA,CAAQ,CAAC,EACvG,OAAO95I,GAAgBzjD,EAAS,CAC9B,KAAM,KACN,WAAY,eACZ,OAAQ,IAAI,aAAaf,CAAM,EAC/B,MAAO,IAAI,aAAa,CAAC,EAAG,EAAG,CAAC,CAAC,EACjC,MAAO,IAAI,aAAa,CACtB,CAACA,EAAO,CAAC,EAAIm/L,EACb,CAACn/L,EAAO,CAAC,EAAIm/L,EACb,CACV,CAAS,EACD,KAAMA,CACd,CAAO,CACH,CAEA,MAAMN,EAAY,KAAK,IAAI,EAAG1xK,EAAO,UAAU,OAAS,KAAK,MAAM,OAAS,CAAC,EACvE2xK,EAAY,KAAK,IAAI,EAAG3xK,EAAO,UAAU,QAAU,KAAK,MAAM,QAAU,CAAC,EACzE4xK,EAAS,KAAK,IAAI,EAAGF,EAAYt+L,EAAO,UAAY,CAAC,EACrDy+L,EAAS,KAAK,IAAI,EAAGF,EAAYv+L,EAAO,UAAY,CAAC,EACrD69C,EAAS,KAAK,IAAI,KAAMygJ,EAAYC,CAAS,EAC7CM,EAAc9nM,EAAQ,mBAAqB,GAC7Ci6L,GACAxwL,EAAQ,SACNuiE,EAAQsxH,GAA8BwK,CAAW,EACvD,IAAIC,EAAU,EACVC,EAAU,EACVC,EAA8B,EAClC,MAAMx9I,GAAU,OAAO,SAAS50B,EAAO,GAAG,EAAIA,EAAO,IAAM,KAAO,KAAK,GAAK,KACtEqyK,EAAW,KAAK,IAAI,KAAM,KAAK,IAAIz9I,EAAS,EAAG,CAAC,EAChD09I,EAAW,KAAK,IAAI,KAAMD,EAAWphJ,CAAM,EAC3CshJ,EAAgB,KAAK,IAAI,KAAMD,GAAYV,EAASF,EAAU,EAC9Dc,EAAgB,KAAK,IAAI,KAAMH,GAAYR,EAASF,EAAU,EAC9Dc,EAAkB,CAACvgM,EAAGC,EAAGkC,IAAM,CACnC,MAAM/F,EAAQ,CAAC4D,EAAIW,EAAO,CAAC,EAAGV,EAAIU,EAAO,CAAC,EAAGwB,EAAIxB,EAAO,CAAC,CAAC,EACpD6/L,EAAQlL,GAAal5L,EAAO6nE,EAAM,KAAK,EACvCw8H,EAAQnL,GAAal5L,EAAO6nE,EAAM,EAAE,EACpCy8H,EAAcpL,GAAal5L,EAAO6nE,EAAM,OAAO,EACrD+7H,EAAU,KAAK,IAAIA,EAAS,KAAK,IAAIQ,CAAK,EAAI/D,CAAe,EAC7DwD,EAAU,KAAK,IAAIA,EAAS,KAAK,IAAIQ,CAAK,EAAIhE,CAAe,EAC7DyD,EAA8B,KAAK,IACjCA,GACE,KAAK,IAAIM,CAAK,EAAI/D,GAAmB4D,EAAiBK,GACtD,KAAK,IAAID,CAAK,EAAIhE,GAAmB6D,EAAiBI,CAChE,CACI,EACA,IAAIC,EAAoB,EACxB,MAAMC,EAAY1/L,EAAO,UACzB,GAAI0/L,GAAa,OAAO,SAASA,EAAU,MAAM,GAAKA,EAAU,QAAU,EAExE,QAASrgM,EAAI,EAAIA,EAAI,EAAKqgM,EAAU,OAAQrgM,GAAK,EAAG,CAClD,MAAMP,EAAI4gM,EAAUrgM,CAAC,EACfN,EAAI2gM,EAAUrgM,EAAI,CAAC,EACnB4B,EAAIy+L,EAAUrgM,EAAI,CAAC,EACrB,CAAC,OAAO,SAASP,CAAC,GAAK,CAAC,OAAO,SAASC,CAAC,GAAK,CAAC,OAAO,SAASkC,CAAC,GAElEnC,EAAKkB,EAAO,QAAU,MAAYlB,EAAKkB,EAAO,QAAU,MACrDjB,EAAKiB,EAAO,QAAU,MAAYjB,EAAKiB,EAAO,QAAU,MACxDiB,EAAKjB,EAAO,QAAU,MAAYiB,EAAKjB,EAAO,QAAU,OAI7Dq/L,EAAgBvgM,EAAGC,EAAGkC,CAAC,EACvBw+L,GAAqB,EACvB,CAEF,GAAIA,GAAqB,EACvB,UAAW3gM,IAAK,CAACkB,EAAO,QAASA,EAAO,OAAO,EAC7C,UAAWjB,IAAK,CAACiB,EAAO,QAASA,EAAO,OAAO,EAC7C,UAAWiB,IAAK,CAACjB,EAAO,QAASA,EAAO,OAAO,EAC7Cq/L,EAAgBvgM,EAAGC,EAAGkC,CAAC,EAK/B,MAAM6wE,EAAUllD,EAAO,aAAe,eAClC,KAAK,IACFmyK,EAAUR,EAAaE,EACvBK,EAAUR,GAAcE,EAAS3gJ,EAC5C,EACQmhJ,EACE73G,EAAW,KAAK,IAAIv6D,EAAO,aAAeklD,EAAS,KAAK,IAAIllD,EAAO,aAAeklD,EAASA,CAAO,CAAC,EACzG,OAAO7tB,GAAgBzjD,EAAS,CAC9B,KAAM,KACN,OAAQ,IAAI,aAAaf,CAAM,EAC/B,MAAO,IAAI,aAAa,CAAC,EAAG,EAAG,CAAC,CAAC,EACjC,MAAO1I,EAAQ,mBAAqB,GAAO,IAAI,aAAa,CAAC,EAAG,EAAG,CAAC,CAAC,EAAIyJ,EAAQ,MACjF,SAAA2mF,EACA,SAAUpwF,EAAQ,mBAAqB,GACnC,IAAI,aAAa8nM,CAAW,EAC5Br+L,EAAQ,QAClB,CAAK,CACH,CAEA,sCAAsCy6L,EAAUlkM,EAAU,GAAI,CAC5D,MAAM61B,EAAS,KAAK,UAAU,QAAU,KAClCpsB,EAAUwjD,GAAkBp3B,CAAM,EACxC,GAAI,CAACA,GAAU,CAACpsB,GAAW,CAACy6L,EAAU,MAAO,GAC7C,MAAMC,EAAUnkM,EAAQ,UAAY,GAC9B8tD,EAAa8nF,GACjB51I,EAAQ,WACR,KAAK,sBAAsB,qBAAuB86L,GAAwB,oBAC1E,EACA,GACN,EACI,OAAIqJ,GAAWr2I,EAAa,EAC1B,KAAK,kCAAiC,EAAG,WAAWj4B,EAAQ,CAC1D,SAAUpsB,EACV,OAAQy6L,EACR,WAAAp2I,CACR,CAAO,GAEDT,GAAgBx3B,EAAQquK,CAAQ,EAChC,KAAK,WAAW,gBAAa,GAExB,EACT,CAEA,8BAA8B50D,EAAoB,KAAM,CACtD,MAAMhpI,EAAU,KAAK,oBAAiB,GAAQ,KAAK,SAAW,KACxDmS,EAAY62H,GAAmB,QAAU,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOhpI,GAAS,SAAS,GAAK,CAAC,CAAC,EAChG+nB,EAAYihH,GAAmB,OAAS,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOhpI,GAAS,SAAS,GAAK,CAAC,CAAC,EACzG,MAAO,CAAE,UAAAmS,EAAW,UAAA4V,CAAS,CAC/B,CAEA,iCAAiCruB,EAAU,GAAIsvI,EAAoB,KAAM,CACvE,GAAIA,GAAmB,OAAQ,MAAO,GACtC,MAAMzsI,EAAS,KAAK,sBAAwBi4L,GAE5C,GADI96L,EAAQ,yBAA2B,IAAQ6C,EAAO,yBAA2B,IAC7EA,EAAO,UAAY,GAAM,MAAO,GACpC,KAAM,CAAE,UAAA4V,EAAW,UAAA4V,CAAS,EAAK,KAAK,8BAA8BihH,CAAiB,EAC/EwxD,EAAgB9E,GACpBn5L,EAAO,iCACPw3L,GACA,EACA,OAAO,gBACb,EACU0G,EAAgB/E,GACpBn5L,EAAO,iCACPy3L,GACA,EACA,OAAO,gBACb,EACI,OAAO7hL,GAAaqoL,GAAiBzyK,GAAa0yK,CACpD,CAEA,gCAAgC6H,EAAS5oM,EAAU,GAAI,CACrD,MAAM61B,EAAS,KAAK,UAAU,QAAU,KACxC,GAAI,CAACA,GAAU,CAAC+yK,EAAS,OAAO,KAChC,MAAM/lM,EAAS,KAAK,sBAAwBi4L,GACtC/rK,EAAQ6mH,GACZ51I,EAAQ,0BAA4B6C,EAAO,yBAC3C03L,GACA,EACA,EACN,EACI,GAAIxrK,GAAS,EAAG,OAAO,KACvB,GAAI65K,EAAQ,OAAS,KAAM,CACzB,MAAMnhH,EAAO,KAAK,IAAI5xD,EAAO,SAAW,KAAM,OAAO+yK,EAAQ,MAAQ/yK,EAAO,MAAQ,CAAC,EAAI9G,CAAK,EACxF85K,EAAa,KAAK,IAAI,KAAM,OAAOD,EAAQ,MAAQ,CAAC,GAAK,CAAC,EAC1DE,EAAWrhH,EAAOohH,EACxB,OAAO37I,GAAgB07I,EAAS,CAC9B,KAAAnhH,EACA,MAAO,IAAI,aAAa,EACrB,OAAOmhH,EAAQ,QAAQ,CAAC,CAAC,GAAK,GAAKE,GACnC,OAAOF,EAAQ,QAAQ,CAAC,CAAC,GAAK,GAAKE,GACnC,OAAOF,EAAQ,QAAQ,CAAC,CAAC,GAAK,GAAKE,CAC9C,CAAS,CACT,CAAO,CACH,CACA,MAAM14G,EAAW,KAAK,IACpBv6D,EAAO,aAAe,OAAO,kBAC7B,KAAK,IAAIA,EAAO,aAAe,KAAM,OAAO+yK,EAAQ,UAAY/yK,EAAO,UAAY,GAAG,EAAI9G,CAAK,CACrG,EACI,OAAOm+B,GAAgB07I,EAAS,CAAE,SAAAx4G,EAAU,CAC9C,CAEA,6BAA6Bw4G,EAAS5oM,EAAU,GAAI,CAClD,MAAM61B,EAAS,KAAK,UAAU,QAAU,KAClCs6D,EAAU,KAAK,uBAAyB,KAC9C,GAAI,CAACt6D,GAAU,CAAC+yK,EAAS,MAAO,GAChC,MAAMG,EAAY,KAAK,gCAAgCH,EAAS5oM,CAAO,EACvE,GAAI,CAAC+oM,EAAW,MAAO,GACvB,MAAMj7I,EAAa8nF,GACjB51I,EAAQ,+BAAiC,KAAK,sBAAsB,8BACpEw6L,GACA,EACA,GACN,EACI,KAAK,oCAAmC,EACxCntI,GAAgBx3B,EAAQkzK,CAAS,EACjC,MAAM7H,EAAO,KAAK,cAAgB,KAElC,OAD0CA,GAAM,SAAW,IAAQA,EAAK,yBAA2B,IAC1D/wG,EACvCA,EAAQ,iCAAmC,CAAE,KAAMy4G,EAAS,WAAA96I,CAAU,EAEtE,KAAK,wBAAwB86I,EAAS,CACpC,QAAS96I,EAAa,EACtB,WAAAA,CACR,CAAO,EAECqiC,IACFA,EAAQ,0BAA4BriC,EAAa,IAC3CqiC,EAAQ,oBAAsB,IAAQA,EAAQ,kCAAoC,MACxFA,EAAQ,aAAe,GACvBA,EAAQ,cAAgB,YAAY,IAAG,EACvCA,EAAQ,iBAAmB,KAAK,oBAAoBy4G,CAAO,GAE7D,KAAK,WAAW,gBAAa,EACtB,EACT,CAEA,+BAA+B5oM,EAAU,GAAI,CAC3C,MAAMkhM,EAAO,KAAK,cAAgB,KAC5B/wG,EAAU,KAAK,uBAAyB,KACxCttF,EAAS,KAAK,sBAAwBi4L,GACtCjlK,EAAS,KAAK,UAAU,QAAU,KAGxC,GAFI,CAACqrK,GAAQA,EAAK,SAAW,IAAQA,EAAK,yBAA2B,IACjE,CAAC/wG,GAAW,CAACt6D,GAAUhzB,EAAO,yBAA2B,IAASA,EAAO,UAAY,IACrF,CAAC,KAAK,iCAAiC,CAAE,uBAAwB,IAAQ,IAAI,EAAG,MAAO,GAC3F,MAAMmmM,EAAkB,KAAK,IAAI,EAAG,KAAK,MAAM,OAAO9H,EAAK,gBAAgB,GAAK,CAAC,CAAC,EAClF,GACElhM,EAAQ,QAAU,IACfmwF,EAAQ,sCAAwC64G,GAChD74G,EAAQ,iCAEX,MAAO,GAET,MAAM84G,EAAgB,KAAK,oBAAoB,CAC7C,SAAUpmM,EAAO,gBACjB,aAAcA,EAAO,oBACrB,WAAYA,EAAO,iBACzB,CAAK,EACD,GAAI,CAAComM,EAAe,MAAO,GAC3B,MAAML,EAAU,KAAK,sBAAsBK,EAAe,CACxD,iBAAkB,GAClB,UAAW,MACjB,CAAK,EACD,GAAI,CAACL,EAAS,MAAO,GACrB,MAAMM,EAAY,KAAK,6BAA6BN,EAAS,CAC3D,uBAAwB,GACxB,yBAA0B/lM,EAAO,yBACjC,8BAA+BA,EAAO,6BAC5C,CAAK,EACD,OAAIqmM,IACF/4G,EAAQ,oCAAsC64G,GAEzCE,CACT,CAEA,wCAAyC,CACvC,MAAM/4G,EAAU,KAAK,uBAAyB,KACxC+H,EAAU/H,GAAS,kCAAoC,KAC7D,GAAI,CAACA,GAAW,CAAC+H,GAAS,KAAM,MAAO,GACvC/H,EAAQ,iCAAmC,KAC3C,MAAMs7F,EAAS,KAAK,wBAAwBvzF,EAAQ,KAAM,CACxD,QAASA,EAAQ,WAAa,EAC9B,WAAYA,EAAQ,UAC1B,CAAK,EACD,OAAA/H,EAAQ,0BAA4Bs7F,GAAUvzF,EAAQ,WAAa,GAAK/H,EAAQ,oBAAsB,GAC/Fs7F,CACT,CAEA,qBAAqBn+H,EAAM,CACzB,OAAKA,EACE,KAAK,UAAU,CACpBA,EAAK,KACLA,EAAK,WACL,OAAOA,EAAK,MAAQ,CAAC,EAAE,QAAQ,CAAC,EAChC,OAAOA,EAAK,UAAY,CAAC,EAAE,QAAQ,CAAC,EACpC,GAAI,MAAM,KAAKA,EAAK,QAAU,CAAA,CAAE,EAAE,IAAKluD,GAAU,OAAOA,CAAK,EAAE,QAAQ,CAAC,CAAC,EACzE,GAAI,MAAM,KAAKkuD,EAAK,OAAS,CAAA,CAAE,EAAE,IAAKluD,GAAU,OAAOA,CAAK,EAAE,QAAQ,CAAC,CAAC,EACxE,GAAI,MAAM,KAAKkuD,EAAK,OAAS,CAAA,CAAE,EAAE,IAAKluD,GAAU,OAAOA,CAAK,EAAE,QAAQ,CAAC,CAAC,EACxE,GAAI,MAAM,KAAKkuD,EAAK,UAAY,CAAA,CAAE,EAAE,IAAKluD,GAAU,OAAOA,CAAK,EAAE,QAAQ,CAAC,CAAC,CACjF,CAAK,EAViB,EAWpB,CAEA,oBAAoBkuD,EAAM,CACxB,OAAKA,EACE,KAAK,UAAU,CACpBA,EAAK,KACLA,EAAK,WACL,OAAOA,EAAK,MAAQ,CAAC,EAAE,QAAQ,CAAC,EAChC,OAAOA,EAAK,UAAY,CAAC,EAAE,QAAQ,CAAC,EACpC,GAAI,MAAM,KAAKA,EAAK,QAAU,CAAA,CAAE,EAAE,IAAKluD,GAAU,OAAOA,CAAK,EAAE,QAAQ,CAAC,CAAC,EACzE,GAAI,MAAM,KAAKkuD,EAAK,OAAS,CAAA,CAAE,EAAE,IAAKluD,GAAU,OAAOA,CAAK,EAAE,QAAQ,CAAC,CAAC,EACxE,GAAI,MAAM,KAAKkuD,EAAK,OAAS,CAAA,CAAE,EAAE,IAAKluD,GAAU,OAAOA,CAAK,EAAE,QAAQ,CAAC,CAAC,CAC9E,CAAK,EATiB,EAUpB,CAEA,qCAAsC,CACpC,MAAM+wF,EAAU,KAAK,uBAAyB,KACzCA,IACLA,EAAQ,kBAAoB,GAC5BA,EAAQ,gBAAkB,KAC1BA,EAAQ,cAAgB,KACxBA,EAAQ,qBAAuB,EAC/BA,EAAQ,sBAAwB,EAChCA,EAAQ,qBAAuB,GAC/BA,EAAQ,4BAA8B,GACtCA,EAAQ,0BAA4B,GACpCA,EAAQ,iCAAmC,KAC3CA,EAAQ,oCAAsC,GAChD,CAEA,+BAA+B7iC,EAAM,CACnC,MAAMz3B,EAAS,KAAK,UAAU,QAAU,KACxC,GAAI,CAACy3B,GAAQz3B,GAAQ,OAAS,KAAM,OAAOy3B,EAC3C,MAAM7jD,EAAUwjD,GAAkBp3B,CAAM,EACxC,OAAKpsB,GAAS,SACPyjD,GAAgBI,EAAM,CAAE,SAAU7jD,EAAQ,QAAQ,CAAE,EAD5B6jD,CAEjC,CAEA,uCAAuCppD,EAAY,YAAY,MAAO,CACpE,MAAMisF,EAAU,KAAK,uBAAyB,KAC9C,GAAI,CAACA,GAAWA,EAAQ,oBAAsB,IAAQ,CAACA,EAAQ,iBAAmB,CAACA,EAAQ,cACzF,MAAO,CAAE,KAAM,KAAM,OAAQ,GAAO,QAAS,EAAK,EAEpD,MAAMriC,EAAa,KAAK,IAAI,EAAG,OAAOqiC,EAAQ,qBAAqB,GAAK,CAAC,EACzE,GAAIriC,GAAc,EAAG,CACnB,MAAMR,EAAO6iC,EAAQ,8BAAgC,GACjD,KAAK,+BAA+BA,EAAQ,aAAa,EACzDA,EAAQ,cACZ,OAAAA,EAAQ,kBAAoB,GAC5BA,EAAQ,gBAAkB,KAC1BA,EAAQ,cAAgB,KACxBA,EAAQ,4BAA8B,GACtCA,EAAQ,0BAA4B,GAC7B,CAAE,KAAA7iC,EAAM,OAAQ,GAAO,QAAS,EAAI,CAC7C,CACA,MAAMzpD,EAAM,OAAO,SAASK,CAAS,EAAIA,EAAY,YAAY,IAAG,EAC9DwvB,EAAI7kB,IAAOhL,EAAMssF,EAAQ,sBAAwBriC,EAAY,EAAG,CAAC,EACvE,IAAIR,EAAOE,GAAsB2iC,EAAQ,gBAAiBA,EAAQ,cAAez8D,CAAC,EAIlF,GAHIy8D,EAAQ,8BAAgC,KAC1C7iC,EAAO,KAAK,+BAA+BA,CAAI,GAE7C55B,GAAK,EAAG,CACV,MAAMy1K,EAAgBh5G,EAAQ,8BAAgC,GAC1D,KAAK,+BAA+BA,EAAQ,aAAa,EACzDA,EAAQ,cACZ,OAAAA,EAAQ,kBAAoB,GAC5BA,EAAQ,gBAAkB,KAC1BA,EAAQ,cAAgB,KACxBA,EAAQ,4BAA8B,GACtCA,EAAQ,0BAA4B,GAC7B,CAAE,KAAMg5G,GAAiB77I,EAAM,OAAQ,GAAO,QAAS,EAAI,CACpE,CACA,MAAO,CAAE,KAAAA,EAAM,OAAQ,GAAM,QAAS,EAAI,CAC5C,CAEA,wBAAwB42I,EAAUlkM,EAAU,GAAI,CAC9C,MAAM61B,EAAS,KAAK,UAAU,QAAU,KAClCs6D,EAAU,KAAK,uBAAyB,KAC9C,GAAI,CAACt6D,GAAU,CAACs6D,GAAW,CAAC+zG,EAAU,MAAO,GAC7C,MAAMkF,EAAmBppM,EAAQ,mBAAqB,IAAQ61B,EAAO,OAAS,KACxEqwC,EAAYkjI,EACd,GAAG,KAAK,oBAAoBlF,CAAQ,CAAC,qBACrC,KAAK,qBAAqBA,CAAQ,EAChCC,EAAUnkM,EAAQ,UAAY,GAC9B8tD,EAAa8nF,GACjB51I,EAAQ,WACR,KAAK,sBAAsB,qBAAuB86L,GAAwB,oBAC1E,EACA,GACN,EACI,GAAI50H,IAAciqB,EAAQ,sBAAwBA,EAAQ,qBAAuBg0G,GAAWr2I,EAAa,GACvG,MAAO,GAET,GAAI,EAAEq2I,GAAWr2I,EAAa,GAC5B,YAAK,oCAAmC,EACxCqiC,EAAQ,qBAAuBjqB,EAC/B7Y,GAAgBx3B,EAAQuzK,EAAmB,KAAK,+BAA+BlF,CAAQ,EAAIA,CAAQ,EACnG,KAAK,WAAW,gBAAa,EACtB,GAET,MAAMrgM,EAAM,YAAY,IAAG,EACrBwlM,EAAcl5G,EAAQ,oBAAsB,GAC7C,KAAK,uCAAuCtsF,CAAG,EAAE,MAAQopD,GAAkBp3B,CAAM,EAClFo3B,GAAkBp3B,CAAM,EAC5B,OAAAs6D,EAAQ,kBAAoB,GAC5BA,EAAQ,gBAAkBk5G,EAC1Bl5G,EAAQ,cAAgB+zG,EACxB/zG,EAAQ,qBAAuBtsF,EAC/BssF,EAAQ,sBAAwBriC,EAChCqiC,EAAQ,qBAAuBjqB,EAC/BiqB,EAAQ,4BAA8Bi5G,EACtC,KAAK,WAAW,gBAAa,EACtB,EACT,CAEA,oCAAoCllM,EAAY,YAAY,MAAO,CACjE,MAAM2xB,EAAS,KAAK,UAAU,QAAU,KACxC,GAAI,CAACA,EAAQ,MAAO,GACpB,MAAMtL,EAAW,KAAK,uCAAuCrmB,CAAS,EACtE,OAAKqmB,EAAS,MACd8iC,GAAgBx3B,EAAQtL,EAAS,IAAI,EAC9BA,EAAS,SAAW,IAFA,EAG7B,CAEA,6BAA6BrmB,EAAY,YAAY,MAAO,CAC1D,MAAML,EAAM,OAAO,SAASK,CAAS,EAAIA,EAAY,YAAY,IAAG,EAC9D2xB,EAAS,KAAK,UAAU,QAAU,KAClChzB,EAAS,KAAK,sBAAwBi4L,GACtC3qG,EAAU,KAAK,uBAAyB,KAE9C,GADI,CAACt6D,GAAU,CAACs6D,GACZA,EAAQ,YAAc,GAAM,MAAO,GACvC,IAAIm5G,EAAc,GAElB,GAAIzmM,EAAO,eAAiB,GAAM,CAChC,MAAM0gM,EAA0B,KAAK,sCAAqC,EAC1E,GAAIA,GAAyB,OAAQ,CACnC,MAAMgG,EAAmB3zD,GACvB/yI,EAAO,uBACPi4L,GAAwB,uBACxB,EACA,GACV,EACQ,GACE,CAAC,OAAO,SAAS3qG,EAAQ,kBAAkB,GACxCo5G,GAAoB,GACnB1lM,EAAMssF,EAAQ,oBAAuBo5G,EACzC,CACAp5G,EAAQ,mBAAqBtsF,EAC7B,MAAM2lM,EAAgB,KAAK,gCAAgCjG,EAAyB1gM,CAAM,EACpFomM,EAAgB,KAAK,iCAAiCO,CAAa,EACpEP,GACH,KAAK,iCAAiCO,EAAe,CAAE,IAAA3lM,EAAK,OAAQ,SAAU,EAEhF,MAAM4lM,EAAa,KAAK,wBAAwBR,EAAe,CAC7D,UAAW,WACX,SAAU94G,EAAQ,eAAiB,IAC/C,CAAW,EACD,GAAIs5G,EAAY,CACd,MAAMC,EAAmB,KAAK,qBAAqBz8I,GAAkBp3B,CAAM,CAAC,EACtE8zK,EAAkB,KAAK,qBAAqBF,CAAU,EAC5D,GAAIE,GAAmBA,IAAoBD,EAAkB,CAC3D,MAAMje,EAAS,KAAK,wBAAwBge,EAAY,CACtD,QAAS5mM,EAAO,UAChB,WAAYA,EAAO,oBACnB,iBAAkBgzB,EAAO,OAAS,IAClD,CAAe,EACDyzK,IAAgB7d,CAClB,CACF,CACF,CACF,CACF,SACE5oL,EAAO,UAAY,IAChBstF,EAAQ,eAAiB,IACzBA,EAAQ,4BAA8B,GACzC,CACA,MAAMozG,EAA0B,KAAK,sCAAqC,EACpE9qL,EAAY8qL,GAAyB,QAAU,KAAK,kBAAiB,GAAI,WAAa,EACtFqG,EAAsB,KAAK,gCAAgCnxL,CAAS,EAC1E,GAAI,CAAC,OAAO,SAAS03E,EAAQ,aAAa,GAAMtsF,EAAMssF,EAAQ,eAAkBy5G,EAAqB,CACnGz5G,EAAQ,cAAgBtsF,EACxB,MAAM2lM,EAAgB,KAAK,iCAAiCjG,EAAyB1gM,CAAM,EACrFomM,EAAgB,KAAK,iCAAiCO,CAAa,EACzE,GAAI,CAACP,EACH94G,EAAQ,aAAe13E,EAAY,EACnC,KAAK,iCAAiC+wL,EAAe,CAAE,IAAA3lM,EAAK,OAAQ,WAAY,MAC3E,CACL,MAAM+kM,EAAU,KAAK,sBAAsBK,EAAe,CACxD,iBAAkB,GAClB,UAAW1F,GAAyB,OAAS,WAAa,MACtE,CAAW,EACKsG,EAAe,KAAK,oBAAoBjB,CAAO,EAC/CkB,EAAsB,KAAK,oBAAoB78I,GAAkBp3B,CAAM,CAAC,EAC1Eg0K,IACF15G,EAAQ,iBAAmB05G,GAE7B15G,EAAQ,aAAe,GACnB05G,GAAgBjB,GAAWiB,IAAiBC,GAC9C,KAAK,wBAAwBlB,EAAS,CACpC,QAAS/lM,EAAO,UAChB,WAAYA,EAAO,oBACnB,iBAAkBgzB,EAAO,OAAS,IAChD,CAAa,CAEL,CACF,CACF,CAEA,MAAMk0K,EAAe,KAAK,uCAAuClmM,CAAG,EACpE,IAAImmM,EAAYD,EAAa,MAAQ98I,GAAkBp3B,CAAM,EAE7D,GADAyzK,IAAgBS,EAAa,SAAW,GACpC,CAACC,EAAW,OAAOV,EAEvB,GAAIzzK,EAAO,OAAS,KAAM,CACxB,MAAMo0K,EAAc,OAAO,SAAS95G,EAAQ,WAAW,GAAKA,EAAQ,YAAc,EAAIA,EAAQ,YAActsF,EACtG4uB,EAAU,KAAK,IAAI,EAAG5uB,EAAMomM,CAAW,EACvCC,EAAe,KAAK,IAAI,EAAG,KAAK,IAAI,GAAKz3K,EAAU,GAAI,CAAC,EAC9D09D,EAAQ,YAActsF,EAEtB,MAAMsmM,EAAqBt7L,GACzB+uF,GAAezN,EAAQ,kBAAmBttF,EAAO,YAAc,CAAC,EAChE,IACA,EACR,EACYunM,EAAmBv7L,GAAM+uF,GAAe/6F,EAAO,WAAYsnM,CAAkB,EAAG,IAAK,EAAE,EAC7F,IAAIE,EAAiBD,EACrB,GAAIvnM,EAAO,YAAc,GAAM,CAC7B,MAAMirD,EAAa8nF,GACjB/yI,EAAO,oBACPi4L,GAAwB,oBACxB,EACA,GACV,EACQ,GAAIhtI,EAAa,GAAKr7B,EAAU,EAAG,CACjC,MAAM63K,EAAQ,KAAK,IAAI,EAAGx8I,EAAa,CAAC,EAClCvkD,EAAQ,EAAI,KAAK,IAAI,CAACkpB,EAAU63K,CAAK,EAC3CD,EAAiBF,GAAuBC,EAAmBD,GAAsBt7L,GAAMtF,EAAO,EAAG,CAAC,CACpG,CACF,CACA4mF,EAAQ,kBAAoBk6G,EAE5B,MAAMv9I,GAAgBu9I,EAAiBF,IAAuB,KAAK,GAAK,KAClEt9I,EAAahqD,EAAO,QAAU,IAAQqnM,EAAe,GAAKrnM,EAAO,WAAa,EAC/E,KAAK,GAAK,EAAKA,EAAO,WAAaA,EAAO,eAAiBqnM,EAC5D,GACA,KAAK,IAAIr9I,CAAU,EAAI,OAAS,KAAK,IAAIC,CAAY,EAAI,SAC3Dk9I,EAAY98I,GAAgB88I,EAAW,CACrC,SAAU,KAAK,sBAAsBA,EAAU,SAAU,CACvD,WAAAn9I,EACA,aAAAC,EACA,KAAMjqD,EAAO,WAAai4L,GAAwB,SAC9D,CAAW,CACX,CAAS,EACDwO,EAAc,GAElB,MACEn5G,EAAQ,YAActsF,EACtBssF,EAAQ,kBAAoBthF,GAAM+uF,GAAe/6F,EAAO,WAAY,CAAC,EAAG,IAAK,EAAE,EAGjF,OAAIknM,EAAa,UAAY,IAAQT,IACnCj8I,GAAgBx3B,EAAQm0K,CAAS,EAG5BV,CACT,CAEA,4BAA4Bx9L,EAAS,EAAG,CACtC,MAAM2Q,EAAU,OAAO,SAAS3Q,CAAM,EAAIA,EAAS,EACnD,IAAIrH,EAAU,GACd,YAAK,0BAA0B,IAAM,CACnC,MAAM+C,EAAY,KAAK,4BAA2B,EAClD,GAAKA,GAAW,OAChB,QAASM,EAAS,EAAGA,EAASN,EAAU,OAAQM,GAAU,EACnD,OAAO,SAASN,EAAUM,EAAS,CAAC,CAAC,IACtC,KAAK,IAAIN,EAAUM,EAAS,CAAC,EAAI2U,CAAO,GAAK,OACjDjV,EAAUM,EAAS,CAAC,EAAI2U,EACxBhY,EAAU,IAEd,CAAC,EAEGA,GACF,KAAK,SAAS,qBAAkB,EAE3BA,CACT,CAEA,MAAM,gCAAgC2yB,EAAUtrB,EAAS,EAAG,CAC1D,GAAI,CAACsrB,GAAY,OAAOA,EAAS,yBAA4B,WAAY,MAAO,GAChF,GAAI,CACF,OAAQ,MAAMA,EAAS,wBACrB,KAAK,8BAA8B,CAAE,OAAQ,aAAa,CAAE,EAC5DtrB,CACR,IAAa,EACT,OAAS7H,EAAO,CACd,eAAQ,KAAK,6EAA8EA,CAAK,EACzF,EACT,CACF,CAEA,MAAM,sCAAsC6H,EAAS,EAAGsrB,EAAW,KAAM,CACvE,MAAMmzK,EAAmB,KAAK,4BAA4Bz+L,CAAM,EAC1D0+L,EAAoB,MAAM,KAAK,gCAAgCpzK,EAAUtrB,CAAM,EACrF,OAAI0+L,GACF,KAAK,SAAS,qBAAkB,GAE9BD,GAAoBC,KACtB,KAAK,WAAW,kBAAe,EAC/B,KAAK,WAAW,gBAAa,GAExBD,GAAoBC,CAC7B,CAEA,4BAA4BvhM,EAAQw8D,EAAa,cAAe,CAC9D,MAAM5vC,EAAS,KAAK,UAAU,QAAU,KAClCpsB,EAAUwjD,GAAkBp3B,CAAM,EACxC,GAAI,CAACA,GAAU,CAACpsB,EAAS,OAAO,KAEhC,MAAMY,EAAU,OAAO,SAASpB,GAAQ,IAAI,GAAK,OAAO,SAASA,GAAQ,KAAK,GAAKA,EAAO,MAAQ,EAC7FA,EAAO,KAAOA,EAAO,MACtB,EACEwhM,EAAchhM,EAAQ,OAAS,KACjCkwL,GAAwBlwL,CAAO,EAC/BgwL,GAAwBhwL,EAASY,CAAO,EACtCqgM,EAAgBjhM,EAAQ,OAAS,KACnC,KAAK,IAAIosB,EAAO,aAAgB,GAAK,EAAIpsB,EAAQ,QAAQ,EACzDoF,GACA+qL,GAA6BnwL,CAAO,EACpCosB,EAAO,aAAgB,GAAK,EAC5BA,EAAO,aAAe,IAC9B,EAEUkzK,EAAY,CAChB,GAAGt/L,EACH,KAAM,KACN,WAAAg8D,EACA,OAAQ,IAAI,aAAaglI,CAAW,EACpC,MAAO,IAAI,aAAa,CAAC,EAAG,EAAG,CAAC,CAAC,EACjC,MAAOjR,GAAS/vL,EAAQ,KAAK,EAC7B,SAAUihM,EACV,SAAUjhM,EAAQ,OAAS,KACvBA,EAAQ,SACR,IAAI,aAAa,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,CACvC,EAEUkhM,EAAiB1hM,GAClB,IAAM,CACP,MAAMuvD,EAAI,KAAK,IAAI,KAAMvvD,EAAO,KAAOA,EAAO,IAAI,EAC5C,EAAI,KAAK,IAAI,KAAMA,EAAO,KAAOA,EAAO,IAAI,EAC5C2hM,EAAK,KAAK,IAAI,KAAM3hM,EAAO,KAAOA,EAAO,IAAI,EAC7CE,EAAS,GAAM,KAAK,MAAMqvD,EAAG,EAAGoyI,CAAE,EAClCngJ,GAAU,OAAO,SAAShhD,EAAQ,GAAG,EAAIA,EAAQ,IAAM,KAAO,KAAK,GAAK,KACxEohM,EAAkB1hM,EAAS,KAAK,IAAI,KAAM,KAAK,IAAIshD,EAAS,EAAG,CAAC,EAChEswB,EAAUtV,IAAe,eAAiBt8D,EAAS,IAAM0hM,EAAkB,KACjF,OAAOh8L,GACLksE,EACAllD,EAAO,aAAeklD,EACtBllD,EAAO,aAAeklD,CAChC,CACM,GAAC,EACC2vH,EACEI,EAAe7hM,EACjB,CACA,OAAO,SAASA,EAAO,IAAI,GAAKA,EAAO,MAAQ,EAAKA,EAAO,KAAOA,EAAO,MAASwhM,EAAY,CAAC,EAC/F,OAAO,SAASxhM,EAAO,IAAI,GAAKA,EAAO,MAAQ,EAAKA,EAAO,KAAOA,EAAO,MAASwhM,EAAY,CAAC,EAC/FpgM,CACR,EACQogM,EAEJ,MAAO,CACL,UAAA1B,EACA,QAAS,CACP,GAAGA,EACH,OAAQ,IAAI,aAAa+B,CAAY,EACrC,MAAO,IAAI,aAAa,CAAC,EAAG,EAAG,CAAC,CAAC,EACjC,SAAUH,EACV,SAAU,IAAI,aAAa1Q,EAA+B,EAC1D,MAAO,IAAI,aAAa,CAAC,EAAG,EAAG,CAAC,CAAC,CACzC,CACA,CACE,CAEA,4BAA4BhxL,EAAQ,CAClC,MAAM4sB,EAAS,KAAK,UAAU,QAAU,KAClCpsB,EAAUwjD,GAAkBp3B,CAAM,EACxC,GAAI,CAACA,GAAU,CAACpsB,EAAS,OAAO,KAEhC,MAAMshM,EAAWthM,EAAQ,OAAS,KAC9BA,EACA,KAAK,4BAA4BR,EAAQ,aAAa,GAAG,SAAW,KACxE,GAAI,CAAC8hM,EAAU,OAAO,KAEtB,MAAMriM,EAASO,EACX,CACA,OAAO,SAASA,EAAO,IAAI,GAAKA,EAAO,MAAQ,EAAKA,EAAO,KAAOA,EAAO,MAAS0wL,GAAwBoR,CAAQ,EAAE,CAAC,EACrH,OAAO,SAAS9hM,EAAO,IAAI,GAAKA,EAAO,MAAQ,EAAKA,EAAO,KAAOA,EAAO,MAAS0wL,GAAwBoR,CAAQ,EAAE,CAAC,EACrH,OAAO,SAAS9hM,EAAO,IAAI,GAAKA,EAAO,MAAQ,EAAKA,EAAO,KAAOA,EAAO,MAAS0wL,GAAwBoR,CAAQ,EAAE,CAAC,CAC7H,EACQpR,GAAwBoR,CAAQ,EAE9BtjH,EAAOx+E,GACR,IAAM,CACP,MAAMuvD,EAAI,KAAK,IAAI,KAAMvvD,EAAO,KAAOA,EAAO,IAAI,EAC5CwhE,EAAI,KAAK,IAAI,KAAMxhE,EAAO,KAAOA,EAAO,IAAI,EAC5Cs+L,EAAY,KAAK,IAAI,EAAG99L,EAAQ,UAAU,OAAS,KAAK,MAAM,OAAS,CAAC,EACxE+9L,EAAY,KAAK,IAAI,EAAG/9L,EAAQ,UAAU,QAAU,KAAK,MAAM,QAAU,CAAC,EAC1Eg+L,EAAS,KAAK,IAAI,EAAGF,EAAY,EAAE,EACnCG,EAAS,KAAK,IAAI,EAAGF,EAAY,EAAE,EACzC,OAAO34L,GACL,KAAK,IAAI44L,EAASjvI,EAAGkvI,EAASj9H,CAAC,EAAI0vH,GACnCtkK,EAAO,SAAY,KAAQ,EAC3BA,EAAO,SAAW,EAC5B,CACM,GAAC,EACChnB,GACAirL,GAA6BiR,CAAQ,EACrCl1K,EAAO,SAAY,KAAQ,EAC3BA,EAAO,SAAW,EAC1B,EAEUm1K,EAA6Bn8L,GACjC+qL,GAA6B,CAC3B,GAAGnwL,EACH,KAAAg+E,CACR,CAAO,EACD5xD,EAAO,aAAgB,GAAK,EAC5BA,EAAO,aAAe,IAC5B,EAEUo1K,EAAU,CACd,GAAGF,EACH,KAAM,KACN,WAAY,cACZ,OAAQ,IAAI,aAAariM,CAAM,EAC/B,MAAO,IAAI,aAAa,CAAC,EAAG,EAAG,CAAC,CAAC,EACjC,SAAUsiM,EACV,SAAU,IAAI,aAAa,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,CAC7C,EAEI,MAAO,CACL,UAAWD,EACX,QAAAE,EACA,YAAa,CACX,GAAGA,EACH,KAAM,KACN,WAAY,eACZ,OAAQ,IAAI,aAAaviM,CAAM,EAC/B,MAAO,IAAI,aAAa,CAAC,EAAG,EAAG,CAAC,CAAC,EACjC,MAAO,IAAI,aAAa,CACtB,CAACA,EAAO,CAAC,EAAI++E,EACb,CAAC/+E,EAAO,CAAC,EAAI++E,EACb,CACV,CAAS,EACD,KAAAA,EACA,SAAU,IAAI,aAAa,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,CAC/C,EACM,QAAS,CACP,GAAGh+E,EACH,KAAM,KACN,WAAY,eACZ,OAAQ,IAAI,aAAaf,CAAM,EAC/B,MAAO,IAAI,aAAa,CAAC,EAAG,EAAG,CAAC,CAAC,EACjC,MAAO,IAAI,aAAa,CACtB,CAACA,EAAO,CAAC,EAAI++E,EACb,CAAC/+E,EAAO,CAAC,EAAI++E,EACb,CACV,CAAS,EACD,KAAAA,EACA,SAAU,IAAI,aAAa,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,CAC/C,CACA,CACE,CAEA,0BAA0BvnF,EAAM,CAC9B,MAAM84L,EAAe,KAAK,SAAS,QAAU,KAC7C,GAAI,CAACA,GAAgB5H,GAAiB4H,CAAY,GAAK,OAAOA,GAAiB,SAAU,OACzF,MAAMhuL,EAAW9K,IAAS,KAAO,KAAO,KACxC84L,EAAa,QAAU,CAAE,GAAIA,EAAa,SAAW,CAAA,CAAG,GAEtDA,EAAa,OAAS,aACnBA,EAAa,OAAS,YACtBA,EAAa,OAAS,UACtBA,EAAa,OAAS,aACtBA,EAAa,OAAS,iBAEzBA,EAAa,QAAQ,KAAOhuL,IAE1BguL,EAAa,OAAS,aAAeA,EAAa,OAAS,iBAC7DA,EAAa,QAAQ,SAAW,CAC9B,GAAIA,EAAa,QAAQ,UAAY,GACrC,MAAOhuL,IAAa,IAC5B,EAEE,CAEA,yBAAyB9K,EAAM,CAC7B,MAAMmD,EAAS,KAAK,SAAW,KACzB2H,EAAW9K,IAAS,KAAO,KAAO,KACxC,MAAI,CAACmD,GAAU,OAAOA,GAAW,SAAiB,GAC9CA,aAAkBuG,IACpBvG,EAAO,cAAc,CAAE,KAAM2H,EAAU,MAAOA,IAAa,KAAM,EAC1D,IAEL3H,aAAkBmvB,IAAkBnvB,aAAkB4E,IACxD5E,EAAO,cAAc,CAAE,KAAM2H,CAAQ,CAAE,EAChC,IAEL,OAAO3H,EAAO,aAAgB,YAChCA,EAAO,YAAY,CAAE,KAAM2H,CAAQ,CAAE,EAC9B,IAEF,EACT,CAEA,MAAM,2BAA2BhL,EAAU,GAAI,CAC7C,MAAMkrM,EAAqB,KAAK,QAAQ,iBAAmB,EACrDC,EAAkB,OAAO,SAASD,CAAkB,EAAI,KAAK,IAAI,EAAG,KAAK,MAAMA,CAAkB,CAAC,EAAI,EACtG7xK,EAAa,KAAK,IAAI,GAAI,EAAI8xK,CAAe,EAC7Cp4K,EAAW,MAAM44B,GAAe,KAAK,OAAO,OAAQ,CACxD,WAAY,KAAK,QAAQ,WACzB,WAAY,KAAK,QAAQ,WAAa,QACtC,YAAa,KAAK,QAAQ,WAAa,SACvC,KAAM,KAAK,QAAQ,MAAQ,KAC3B,WAAY,KAAK,QAAQ,YAAc,cACvC,wBAAyB,KAAK,QAAQ,0BAA4B,GAClE,UAAW,KAAK,QAAQ,UACxB,gBAAiB,KAAK,QAAQ,gBAC9B,uBAAwB,KAAK,QAAQ,uBACrC,qBAAsB,KAAK,QAAQ,qBACnC,uBAAwB,KAAK,QAAQ,uBACrC,0BAA2B,KAAK,QAAQ,0BACxC,cAAe,KAAK,QAAQ,cAC5B,iBAAkB,KAAK,QAAQ,iBAC/B,wBAAyB,KAAK,QAAQ,wBACtC,2BAA4B,KAAK,QAAQ,2BACzC,cAAe,KAAK,QAAQ,cAC5B,sBAAuB,KAAK,QAAQ,sBACpC,iBAAkB,KAAK,QAAQ,iBAC/B,6BAA8B,KAAK,QAAQ,6BAC3C,mBAAoB,KAAK,QAAQ,mBACjC,eAAgB,KAAK,QAAQ,eAC7B,kBAAmB,KAAK,QAAQ,kBAChC,wBAAyB,KAAK,QAAQ,wBACtC,sBAAuB,KAAK,QAAQ,sBACpC,sBAAuB,KAAK,QAAQ,sBACpC,yBAA0B,KAAK,QAAQ,yBACvC,uBAAwB,KAAK,QAAQ,uBACrC,qBAAsB,KAAK,QAAQ,qBACnC,qBAAsB,KAAK,QAAQ,qBACnC,+BAAgC,KAAK,QAAQ,+BAC7C,+BAAgC,KAAK,QAAQ,+BAC7C,wBAAyB,KAAK,QAAQ,wBACtC,WAAAtyB,EACA,GAAGr5B,CACT,CAAK,EACD,KAAK,SAAW+yB,EAChB,KAAK,2BAA0B,EAC/B,KAAK,iCAAgC,EACrC,KAAK,oBAAmB,EACxB,KAAK,mBAAkB,EACvB,KAAK,wBAAuB,EACxB,KAAK,2BAA6B,IAAM,KAAK,2BAA0B,EAC3E,KAAK,kBAAkB,UAAO,EAC9B,KAAK,iBAAmB,IAAI4xC,GAAiB,KAAK,QAAQ,EAC1D,KAAK,iBAAiB,OAAO,KAAK,OAAO,IAAI,EACzC,OAAO,KAAK,SAAS,QAAW,YAClC,KAAK,SAAS,OAAO,KAAK,OAAO,IAAI,EAEvC,KAAK,iCAAgC,EACjC,KAAK,cACP,KAAK,oBAAmB,EAEtB,KAAK,UAAU,QAAQ,mBACzB,KAAK,SAAS,OAAO,kBAAmBl5D,GAAW,CACjD,KAAK,UAAU,cAAa,EACxBA,GAAQ,SAAW,eACrB,KAAK,8CAA8CA,CAAM,EAE3D,KAAK,oBAAoBA,CAAM,EAC/B,KAAK,MAAM,IAAI,SAAU,gCAAgC,CAC3D,CAAC,EAEH,KAAK,oBAAmB,EACxB,KAAK,SAAS,sBAAsB,kBAAkB,CACxD,CAEA,uBAAuBnF,EAAU,KAAK,QAAS,CAC7C,MAAMwD,EAAW2xE,GAAqBn1E,CAAO,EAC7C,KAAK,WAAa,IAAIs1E,GAAiB,OAAQt1E,EAAS,KAAK,iBAAkB,KAAK,KAAK,EACzF,KAAK,WAAa,IAAIs1E,GAAiB,OAAQt1E,EAAS,KAAK,iBAAkB,KAAK,KAAK,EACrFwD,GAAU,YAAY,KAAK,WAAW,WAAWA,EAAS,UAAU,EACpEA,GAAU,YAAY,KAAK,WAAW,WAAWA,EAAS,UAAU,EACxE,KAAK,aAAe,EACtB,CAEA,qBAAsB,CACpB,GAAI,CAAC,KAAK,aAAc,MAAO,GAC/B,GAAI,CAAC,KAAK,QAAS,MAAO,GAC1B,GAAI,CACF,MAAM8vE,EAAa,KAAK,WAAW,iBAAgB,EAC7CK,EAAa,KAAK,WAAW,iBAAiB,CAAE,WAAAL,CAAU,CAAE,EAClE,YAAK,QAAQ,aAAa,CAAE,WAAAA,EAAY,WAAAK,CAAU,CAAE,EACpD,KAAK,aAAe,GACb,EACT,OAASh2E,EAAO,CACd,KAAK,OAAO,MAAM,SAAU,oDAAqD,CAC/E,MAAAA,EACA,UAAW,KAAK,SAAS,WAAa,EACtC,UAAW,KAAK,SAAS,WAAa,CAC9C,CAAO,EACD,QAAQ,KAAK,2EAA4EA,CAAK,EAC9F,GAAI,CACF,KAAK,uBAAuB,KAAK,OAAO,EACxC,MAAM21E,EAAa,KAAK,WAAW,iBAAgB,EAC7CK,EAAa,KAAK,WAAW,iBAAiB,CAAE,WAAAL,CAAU,CAAE,EAClE,YAAK,QAAQ,aAAa,CAAE,WAAAA,EAAY,WAAAK,CAAU,CAAE,EACpD,KAAK,aAAe,GACb,EACT,OAASmxH,EAAe,CAEtB,YAAK,aAAe,GACpB,QAAQ,KAAK,0DAA2DA,CAAa,EAErF,QAAQ,MAAM,iDAAkDA,CAAa,EACtE,EACT,CACF,CACF,CAEA,yBAA0B,CACxB,GAAI,KAAK,kBAAmB,OAAO,KAAK,kBACxC,MAAMC,EAAc,KAAK,SAAW,KACpC,YAAK,kBAAoB,CACvB,QAAS,GACT,MAAO9vG,GACP,QAAS,KACT,UAAW,KACX,YAAa,KACb,YAAa,KACb,aAAc,KACd,aAAc,KACd,gBAAiB,KACjB,cAAe8vG,EACf,cAAeA,EACf,QAAS,EACT,MAAO,KACP,UAAW,IACjB,EACW,KAAK,iBACd,CAEA,iBAAiBC,EAAU,CACzB,GAAI,GAACA,GAAY,OAAOA,GAAa,UACrC,GAAI,CACFA,EAAS,UAAO,CAClB,OAASrnM,EAAO,CACdsH,GACE,KACA,gCACA,mDACA,CAAE,MAAAtH,CAAK,CACf,CACI,CACF,CAEA,6BAA6B6G,EAAO,CAC9B,CAACA,GAAS,OAAOA,GAAU,WAC/B,KAAK,iBAAiBA,EAAM,YAAY,EACxC,KAAK,iBAAiBA,EAAM,YAAY,EACxCA,EAAM,aAAe,KACrBA,EAAM,aAAe,KACvB,CAEA,6BAA6BA,EAAO,CAClC,MAAMxE,EAAU,KAAK,SAAW,KAChC,IAAIilM,EAAe,EACfC,EAAe,EACnB,GAAI,OAAOllM,GAAS,qBAAwB,WAC1C,GAAI,CACF,MAAMiG,EAAWjG,EAAQ,oBAAmB,GAAM,CAAA,EAClDilM,EAAejN,GAAW/xL,EAAS,KAAM,CAAC,EAC1Ci/L,EAAelN,GAAW/xL,EAAS,KAAM,CAAC,CAC5C,OAAStI,EAAO,CACdsH,GACE,KACA,iCACA,8EACA,CAAE,MAAAtH,CAAK,CACjB,EACQsnM,EAAe,EACfC,EAAe,CACjB,MAEAD,EAAejN,GAAWh4L,GAAS,UAAW,CAAC,EAC/CklM,EAAelN,GAAWh4L,GAAS,UAAW,CAAC,EAEjD,MAAMtG,EAAU8K,GAAO,SAAW,CAAA,EAC5B2gM,EAAezrM,GAAS,cAAgB,KACxC0rM,EAAe1rM,GAAS,cAAgB,KACxC2rM,EAAgB3rM,GAAS,eAAiB,KAC1C4rM,EAAgB5rM,GAAS,eAAiB,KAC1C88J,EAAmB,KAAK,IAAI,EAAG,KAAK,MAAM,OAAO98J,GAAS,gBAAgB,GAAK,CAAC,CAAC,EACvF,MAAO,CACL,aAAAurM,EACA,aAAAC,EACA,iBAAA1uC,EACA,gBAAiB2uC,EACjB,gBAAiBC,EACjB,oBAAqBpN,GAAWmN,GAAc,QAAS,CAAC,EACxD,oBAAqBnN,GAAWoN,GAAc,QAAS,CAAC,EACxD,iBAAkBC,EAClB,iBAAkBC,EAClB,qBAAsBtN,GAAWqN,GAAe,QAAS,CAAC,EAC1D,qBAAsBrN,GAAWsN,GAAe,QAAS,CAAC,EAC1D,oBAAqB5qL,GAAW2qL,CAAa,EAC7C,oBAAqB3qL,GAAW4qL,CAAa,CACnD,CACE,CAEA,4BAA4B3xL,EAAGC,EAAG,CAChC,MAAI,CAACD,GAAK,CAACC,EAAU,GAEnBD,EAAE,eAAiBC,EAAE,cAClBD,EAAE,eAAiBC,EAAE,cACrBD,EAAE,mBAAqBC,EAAE,kBACzBD,EAAE,kBAAoBC,EAAE,iBACxBD,EAAE,kBAAoBC,EAAE,iBACxBD,EAAE,sBAAwBC,EAAE,qBAC5BD,EAAE,sBAAwBC,EAAE,qBAC5BD,EAAE,mBAAqBC,EAAE,kBACzBD,EAAE,mBAAqBC,EAAE,kBACzBD,EAAE,uBAAyBC,EAAE,sBAC7BD,EAAE,uBAAyBC,EAAE,sBAC7BD,EAAE,sBAAwBC,EAAE,qBAC5BD,EAAE,sBAAwBC,EAAE,mBAEnC,CAEA,4BAA4B,CAC1B,YAAAmxL,EACA,YAAAjjM,EAAc,KACd,YAAAO,EAAc,KACd,aAAA8iM,EAAe,KACf,aAAAC,EAAe,KACf,QAAAz+K,CACJ,EAAK,CACD,MAAMyzE,EAAsBt4F,aAAuB,YAAcA,EAAc,IAAI,YAAY,CAAC,EAC1Fu4F,EAAsBh4F,aAAuB,YAAcA,EAAc,IAAI,YAAY,CAAC,EAC1FkjM,EAAeJ,GAAgB,OAAOA,GAAiB,SAAWA,EAAe,KACjFK,EAAeJ,GAAgB,OAAOA,GAAiB,SAAWA,EAAe,KACjFK,EAAe,IAAI,YAAY,CAAC,EAChCC,EAAgB,CAAE,KAAM,EAAG,KAAM,CAAC,EAClCC,EAAc,CAAE,KAAM,KAAM,KAAM,IAAI,EACtC3gB,EAAkBlmJ,GAAU,GAAGk5J,GAAWrxK,EAAS,CAAC,CAAC,IAAI++K,EAAc5mK,CAAK,GAAK,CAAC,GAClF8mK,EAAkB,CAAC9mK,EAAOrqB,EAAOjU,IAAU,CAC/C,GAAI,EAAEA,EAAQ,GAAI,OAAO,KACzB,MAAM2C,EAAUwiM,EAAY7mK,CAAK,GAAK,KAChC+mK,EAAY,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOpxL,CAAK,GAAK,CAAC,CAAC,EACtDqxL,EAAUD,EAAY,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOrlM,CAAK,GAAK,CAAC,CAAC,EAChEulM,EAAc5iM,EAAU,KAAK,IAAIA,EAAQ,MAAO0iM,CAAS,EAAIA,EAC7DG,EAAY7iM,EAAU,KAAK,IAAIA,EAAQ,MAAQA,EAAQ,MAAO2iM,CAAO,EAAIA,EACzExgM,EAAS,CACb,MAAOygM,EACP,MAAOC,EAAYD,EACnB,QAAS/gB,EAAelmJ,CAAK,CACrC,EACM,OAAA6mK,EAAY7mK,CAAK,EAAIx5B,EACdA,CACT,EACM2gM,EAAoB,CAACjB,EAAUjsM,IAAa,CAChD,GAAI,CAACisM,EAAU,CACb,GAAI,CACFjsM,EAAS,QAAUisL,EAAejsL,IAAaqhG,EAAsB,OAAS,MAAM,CACtF,MAAY,CAEZ,CACA,OAAOrhG,CACT,CACA,IAAKgsM,GAAa,qBAAuB,IAAM,EAC7C,MAAM,IAAI,MAAM,6DAA6D,EAE/E,MAAMvkM,EAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOwkM,EAAS,KAAK,GAAK,CAAC,CAAC,EAC3DkB,EAAc,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOlB,EAAS,WAAW,GAAK,CAAC,CAAC,EACvEpmH,EAAOomH,EAAS,QAAQ,SAAS,QAAU,KACjD,GAAI,CAACxkM,GAAS,CAAC0lM,GAAe,CAACtnH,EAAM,OAAO7lF,EAC5C,MAAMwH,EAAO,IAAI,YAAYq+E,EAAMsnH,EAAa1lM,CAAK,EACrD,GAAI,CACFD,EAAK,QAAUykL,EAAeggB,IAAaO,EAAe,OAAS,MAAM,CAC3E,MAAY,CAEZ,CACA,OAAOhlM,CACT,EACM4lM,EAAgB,CAACrnK,EAAOlkC,IAAW,CACvC,GAAI,EAAEA,aAAkB,aACtB,MAAM,IAAI,MAAM,GAAGkkC,CAAK,+BAA+B,EAEzD,MAAMsnK,EAAWrB,GAAa,QAAQ,SAAS,QAAU,KACzD,GAAIqB,GAAYxrM,EAAO,SAAWwrM,EAChC,MAAM,IAAI,MAAM,GAAGtnK,CAAK,4DAA4D,EAEtF,MAAMkmK,EAAWlmK,IAAU,OAASymK,EAAeC,EAC7CzsM,EAAW+lC,IAAU,OAASs7D,EAAsBC,EACpDgsG,EAAoBrO,GAAWgN,GAAU,MAAO,GAAG,EACnDxkM,EAAQ,OAAO,SAAS6lM,CAAiB,EAAI,KAAK,IAAI,EAAG,KAAK,MAAMA,CAAiB,CAAC,EAAIttM,EAAS,OACzG,GAAIyH,EAAQ5F,EAAO,OAAQ,OAAO4F,EAClC,GAAI,CAACA,EAAO,MAAO,GAEnB,MAAM0lM,EAAclO,GAAWgN,GAAU,YAAa,CAAC,EACjDsB,EAAatB,GAAU,QAAQ,SAAS,QAAU,KACxD,GAAIkB,EAAc,GAAKI,EAAY,CACjC,MAAM/lM,EAAO,IAAI,YAAY+lM,EAAYJ,EAAa1lM,CAAK,EAC3D,OAAA5F,EAAO,IAAI2F,CAAI,EACRC,CACT,CACA,OAAA5F,EAAO,IAAI7B,EAAS,SAAS,EAAGyH,CAAK,CAAC,EAC/BA,CACT,EACM+lM,EAAwBznK,GAAU,CACtC,MAAMkmK,EAAWlmK,IAAU,OAASymK,EAAeC,EAC7CzsM,EAAW+lC,IAAU,OAASs7D,EAAsBC,EAC1D,OAAI,OAAO2qG,GAAU,cAAiB,WAC7BA,EAAS,aAAY,EAEvBjsM,EAAS,MAAK,CACvB,EACMytM,EAAgB,CAAC1nK,EAAOP,IAAY,CACxC,MAAMymK,EAAWlmK,IAAU,OAASymK,EAAeC,EACnD,MAAI,CAACR,GAAY,OAAOA,EAAS,eAAkB,WAAmB,IACtEA,EAAS,cAAcD,EAAaxmK,CAAO,EACpC,GACT,EACMkoK,EAAwB,CAAC3nK,EAAOP,IAAY,CAChD,MAAMu8I,EAAY,IAAI,IAAI,MAAM,KAAKv8I,GAAW,CAAA,CAAE,EAC/C,IAAKzlC,GAAU,OAAOA,CAAK,CAAC,EAC5B,OAAQA,GAAU,OAAO,UAAUA,CAAK,GAAKA,GAAS,CAAC,CAAC,EACrDqK,EAAUojM,EAAqBznK,CAAK,EAC1C,GAAI,CAACg8I,EAAU,MAAQ,CAAC33K,EAAQ,OAC9B,MAAO,CAAE,QAAS,GAAO,MAAO,EAAG,MAAO,EAAG,QAAS6hL,EAAelmJ,CAAK,CAAC,EAE7E,MAAM4nK,EAAO,CAAA,EACPC,EAAW,CAAA,EACjB,QAAS3kM,EAAI,EAAGA,EAAImB,EAAQ,OAAQnB,GAAK,EAAG,CAC1C,MAAMlJ,EAAQqK,EAAQnB,CAAC,IAAM,EACzB84K,EAAU,IAAIhiL,CAAK,EAAG6tM,EAAS,KAAK7tM,CAAK,EACxC4tM,EAAK,KAAK5tM,CAAK,CACtB,CACA,GAAI,CAAC6tM,EAAS,OACZ,MAAO,CAAE,QAAS,GAAO,MAAO,EAAG,MAAO,EAAG,QAAS3hB,EAAelmJ,CAAK,CAAC,EAE7E,MAAMxjC,EAAO,YAAY,KAAK,CAAC,GAAGorM,EAAM,GAAGC,CAAQ,CAAC,EACpD,IAAIl8G,EAAQ,GACRm8G,EAAO,GACX,QAAS5kM,EAAI,EAAGA,EAAI1G,EAAK,OAAQ0G,GAAK,EAChC1G,EAAK0G,CAAC,IAAMmB,EAAQnB,CAAC,IACnByoF,EAAQ,IAAGA,EAAQzoF,GACvB4kM,EAAO5kM,GAGX,OAAIyoF,EAAQ,GAAK,CAAC+7G,EAAc1nK,EAAOxjC,CAAI,EAClC,CAAE,QAAS,GAAO,MAAO,EAAG,MAAO,EAAG,QAAS0pL,EAAelmJ,CAAK,CAAC,GAE7E4mK,EAAc5mK,CAAK,GAAK,EAEjB,CAAE,QAAS,GAAM,GADR8mK,EAAgB9mK,EAAO2rD,EAAOm8G,EAAOn8G,EAAQ,CAAC,CAC5B,EACpC,EACMulB,EAAsBl3G,GAAU,CACpC,GAAI,OAAOA,GAAU,UAAY,OAAO,SAASA,CAAK,EACpD,OAAIA,IAAU,EAAU,MACpBA,IAAU,EAAU,KACjB,OAET,MAAMO,EAAa,OAAOP,GAAS,MAAM,EAAE,KAAI,EAAG,YAAW,EAC7D,OAAIO,IAAe,OAASA,IAAe,WAAmB,MAC1DA,IAAe,MAAQA,IAAe,WAAmB,KACtD,MACT,EACMwtM,EAAuB,CAACn8L,EAASmkC,IAAc,CACnD,MAAMxO,EAAQ,IAAI,IAAI,MAAM,KAAK31B,GAAW,CAAA,CAAE,EAC3C,IAAK5R,GAAU,OAAOA,CAAK,CAAC,EAC5B,OAAQA,GAAU,OAAO,UAAUA,CAAK,GAAKA,GAAS,CAAC,CAAC,EAC3D,GAAI,CAACunC,EAAM,KAAM,OAAOolK,EACxB,MAAMqB,EAAcP,EAAqB,MAAM,EAC/C,GAAI,CAACO,EAAY,OAAQ,OAAOrB,EAChC,MAAM7rM,EAAOo2G,EAAmBnhE,CAAS,EACnCzwC,EAAS,CAAA,EACf,OAAA2mM,EAAY,iBAAiB,IAAM,CACjC,MAAMt0J,EAAYs0J,EAAY,WAAa,KAC3C,GAAKt0J,EACL,QAASzuC,EAAI,EAAGA,EAAI8kM,EAAY,OAAQ9kM,GAAK,EAAG,CAC9C,MAAM0wB,EAAOo0K,EAAY9kM,CAAC,IAAM,EAC1B3F,EAASo0C,EAAU/d,EAAO,CAAC,IAAM,EACjC93B,EAAS61C,EAAW/d,EAAO,EAAK,CAAC,IAAM,GAE1C94B,IAAS,MAAQymC,EAAM,IAAIhkC,CAAM,GAC9BzC,IAAS,OAASymC,EAAM,IAAIzlC,CAAM,IAEtCwD,EAAO,KAAKs0B,CAAI,CAEpB,CACF,EAAG,CAAE,UAAW,GAAM,EACft0B,EAAO,OAAS,YAAY,KAAKA,CAAM,EAAIqnM,CACpD,EACA,OAAO,IAAI,MAAMV,EAAa,CAC5B,IAAInqM,EAAQu+F,EAAU,CACpB,GAAIA,IAAa,cAAe,OAAO8sG,EAAkBV,EAAcnrG,CAAmB,EAC1F,GAAIjB,IAAa,cAAe,OAAO8sG,EAAkBT,EAAcnrG,CAAmB,EAC1F,GAAIlB,IAAa,YACf,OAAOosG,EACH,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOA,GAAc,KAAK,GAAK,CAAC,CAAC,EACxDnrG,EAAoB,OAE1B,GAAIjB,IAAa,YACf,OAAOqsG,EACH,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOA,GAAc,KAAK,GAAK,CAAC,CAAC,EACxDnrG,EAAoB,OAE1B,GAAIlB,IAAa,+BAAgC,OAAOosG,EACxD,GAAIpsG,IAAa,+BAAgC,OAAOqsG,EACxD,GAAIrsG,IAAa,wBAAyB,OAAO6+F,GAAWrxK,EAAS,CAAC,EACtE,GAAIwyE,IAAa,sBAAuB,OAAOv+F,EAC/C,GAAIu+F,IAAa,mBACf,OAAQ1yE,GAAW0/K,EAAc,OAAQ1/K,CAAM,EAEjD,GAAI0yE,IAAa,mBACf,OAAQ1yE,GAAW0/K,EAAc,OAAQ1/K,CAAM,EAEjD,GAAI0yE,IAAa,gCACf,OAAQ56D,GAAYkoK,EAAsB,OAAQloK,CAAO,EAE3D,GAAI46D,IAAa,gCACf,OAAQ56D,GAAYkoK,EAAsB,OAAQloK,CAAO,EAE3D,GAAI46D,IAAa,wCACf,MAAO,CAAC56D,EAAS7kC,EAAU,CAAA,IAAO+sM,EAAsB,OAAQI,EAAqBtoK,EAAS7kC,EAAQ,WAAa,MAAM,CAAC,EAE5H,GAAIy/F,IAAa,2BACf,OAAQr6D,IACFA,IAAU,QAAUA,IAAU,SACzB6mK,EAAY7mK,CAAK,EAAI,CAAE,GAAG6mK,EAAY7mK,CAAK,CAAC,EAE9C,KAGX,GAAIq6D,IAAa,sBACf,MAAO,IAAM,CACX,IAAIhqE,EAAM,CAAE,KAAM,EAAG,KAAM,CAAC,EAC5B,GAAI,OAAOv0B,EAAO,qBAAwB,WACxC,GAAI,CACFu0B,EAAMv0B,EAAO,oBAAmB,GAAMu0B,CACxC,OAASxxB,EAAO,CACdsH,GACE,KACA,qCACA,wFACA,CAAE,MAAAtH,CAAK,CACzB,EACgBwxB,EAAM,CAAE,KAAM,EAAG,KAAM,CAAC,CAC1B,CAEF,MAAO,CACL,KAAM8oK,GAA6B9oK,EAAI,KAAMxI,CAAO,EACpD,KAAMsxK,GAA6B9oK,EAAI,KAAMxI,CAAO,CAClE,CACU,EAEF,MAAM7tB,EAAQ,QAAQ,IAAI8B,EAAQu+F,EAAUv+F,CAAM,EAClD,OAAI,OAAO9B,GAAU,WACZA,EAAM,KAAK8B,CAAM,EAEnB9B,CACT,EACA,IAAI8B,EAAQu+F,EAAUrgG,EAAO,CAC3B,OAAO,QAAQ,IAAI8B,EAAQu+F,EAAUrgG,EAAO8B,CAAM,CACpD,CACN,CAAK,CACH,CAEA,4BAA4B,CAAE,MAAA+kE,EAAQ,GAAO,aAAAonI,EAAe,EAAK,EAAK,GAAI,CACxE,MAAMviM,EAAQ,KAAK,wBAAuB,EACpCugM,EAAc,KAAK,SAAW,KACpC,GAAI,CAACA,GAAevgM,EAAM,UAAY,IAAQ,CAACA,EAAM,QACnD,YAAK,6BAA6BA,CAAK,EACvCA,EAAM,UAAY,KAClBA,EAAM,YAAc,KACpBA,EAAM,YAAc,KACpBA,EAAM,gBAAkB,KACxBA,EAAM,cAAgBugM,EACtBvgM,EAAM,cAAgBugM,EACtBvgM,EAAM,MAAQ,KACdA,EAAM,UAAY,KACd,KAAK,iCACP,KAAK,qBAAqB,aAAa,EACvC,KAAK,WAAW,gBAAgB,aAAa,GAExCA,EAGT,MAAMs5I,EAAgB,KAAK,6BAA6Bt5I,CAAK,EAE7D,GADkB,CAACm7D,GAAS,KAAK,4BAA4Bm+E,EAAet5I,EAAM,SAAS,EAEzF,OAAAA,EAAM,cAAgBA,EAAM,iBAAmBugM,EAC/CvgM,EAAM,cAAgBA,EAAM,QAAU0wF,GACjC1wF,EAAM,eAAiBugM,EACxBA,EACA,KAAK,iCACP,KAAK,qBAAqB,aAAa,EACvC,KAAK,WAAW,gBAAgB,aAAa,GAExCvgM,EAGT,IAAIwiM,EAAsB,KACtBC,EAAsB,KAC1B,GAAI,CACF,GAAI,OAAOlC,EAAY,gBAAmB,WACxC,MAAM,IAAI,MAAM,uEAAuE,EAEzF,MAAMmC,EAAuB1iM,EAAM,cAAgB,KAC7C2iM,EAAuB3iM,EAAM,cAAgB,KAC7CpG,EAAS2mM,EAAY,eAAe,CAAE,GAAGvgM,EAAM,QAAS,WAAY,GAAM,EAC1E4iM,EAAoB,GACxBhpM,GACG,OAAOA,GAAW,UAClBA,EAAO,OACP,OAAOA,EAAO,MAAM,OAAU,UAC9BA,EAAO,OACP,OAAOA,EAAO,MAAM,OAAU,UAE7BipM,EAAmBD,EAAoBhpM,EAAO,MAAQ,KACtDkpM,EAAmBF,EAAoBhpM,EAAO,MAAQ,KAC5D4oM,EAAsBK,EACtBJ,EAAsBK,EACtB,MAAMxlM,EAAcslM,EAChB,KACChpM,GAAQ,uBAAuB,YAAcA,EAAO,YAAc,IAAI,YAAY,CAAC,EAClFiE,EAAc+kM,EAChB,KACChpM,GAAQ,uBAAuB,YAAcA,EAAO,YAAc,IAAI,YAAY,CAAC,EACxF,OAAAoG,EAAM,QAAU4zL,GAAmB5zL,EAAM,OAAO,EAChDA,EAAM,YAAc1C,EACpB0C,EAAM,YAAcnC,EACpBmC,EAAM,aAAe6iM,EACrB7iM,EAAM,aAAe8iM,EACrB9iM,EAAM,gBAAkB,KAAK,4BAA4B,CACvD,YAAAugM,EACA,YAAAjjM,EACA,YAAAO,EACA,aAAcglM,EACd,aAAcC,EACd,QAAS9iM,EAAM,OACvB,CAAO,EACDA,EAAM,cAAgBA,EAAM,gBAC5BA,EAAM,cAAgBA,EAAM,QAAU0wF,GAClC1wF,EAAM,gBACNugM,EACJvgM,EAAM,UAAYs5I,EAClBt5I,EAAM,UAAY,KAClBA,EAAM,MAAQ,CACZ,UAAW6iM,EACP,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOA,GAAkB,KAAK,GAAK,CAAC,CAAC,EAC5DvlM,EAAY,OAChB,UAAWwlM,EACP,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOA,GAAkB,KAAK,GAAK,CAAC,CAAC,EAC5DjlM,EAAY,OAChB,cAAe,KAAK,IAAI,EAAG,KAAK,MAAM,OAAO0iM,GAAa,SAAS,GAAK,CAAC,CAAC,EAC1E,cAAe,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOA,GAAa,SAAS,GAAK,CAAC,CAAC,CAClF,EACUmC,GAAwBA,IAAyBG,GACnD,KAAK,iBAAiBH,CAAoB,EAExCC,GAAwBA,IAAyBG,GACnD,KAAK,iBAAiBH,CAAoB,EAE5CH,EAAsB,KACtBC,EAAsB,KAClB,KAAK,iCACP,KAAK,qBAAqB,aAAa,EACvC,KAAK,WAAW,gBAAgB,aAAa,GAExCziM,CACT,OAAS7G,EAAO,CACd,GAAIopM,EACF,MAAIC,GAAuBA,IAAwBxiM,EAAM,cACvD,KAAK,iBAAiBwiM,CAAmB,EAEvCC,GAAuBA,IAAwBziM,EAAM,cACvD,KAAK,iBAAiByiM,CAAmB,EAErCtpM,EAER,YAAK,6BAA6B6G,CAAK,EACvCA,EAAM,UAAY7G,EAClB6G,EAAM,UAAYs5I,EAClBt5I,EAAM,YAAc,KACpBA,EAAM,YAAc,KACpBA,EAAM,aAAe,KACrBA,EAAM,aAAe,KACrBA,EAAM,gBAAkB,KACxBA,EAAM,cAAgBugM,EACtBvgM,EAAM,cAAgBugM,EACtBvgM,EAAM,MAAQ,KACV,KAAK,iCACP,KAAK,qBAAqB,aAAa,EACvC,KAAK,WAAW,gBAAgB,aAAa,GAE/CS,GACE,KACA,uBACA,yEACA,CAAE,MAAAtH,CAAK,CACf,EACM,KAAK,OAAO,MAAM,SAAU,4DAA6D,CAAE,MAAAA,EAAO,EAC3F6G,CACT,CACF,CAEA,8BAA+B,CAC7B,MAAMzH,EAAS,KAAK,SAAW,KAC/B,GAAI,CAACA,GAAU,OAAOA,GAAW,SAAU,MAAO,GAClD,MAAMwqM,EAAoB,KAAK,wBAAuB,EAAG,eAAiB,KAAK,SAAW,KAC1F,MAAI,CAACA,GAAqBxqM,EAAO,UAAYwqM,EAA0B,IACvExqM,EAAO,QAAUwqM,EACjBxqM,EAAO,6BAA6BwqM,CAAiB,EACrD,KAAK,6BAA6BxqM,EAAQ,CAAE,mBAAoB,EAAK,CAAE,EAChE,GACT,CAEA,0BAA0BD,EAAS,SAAU,CAC3C,KAAK,4BAA4B,CAAE,MAAO,GAAO,aAAc,GAAO,EACtE,MAAM0qM,EAAuB,KAAK,6BAA4B,EACxDC,EAAc,KAAK,wBAAuB,EAAG,MACnD,KAAK,kBAAkB,EAAK,GACxBD,GAAwBC,IAAgBvyG,KAC1C,KAAK,qBAAqB,QAAQ,EAEpC,KAAK,WAAW,kBAAe,EAC3BsyG,EACF,KAAK,WAAW,gBAAgB,QAAQ,EAC/BC,IAAgBvyG,IACzB,KAAK,WAAW,gBAAgB,QAAQ,EAE1C,KAAK,WAAW,gBAAa,EAC7B,KAAK,SAAS,sBAAsB,gBAAgBp4F,CAAM,EAAE,EAC5D,KAAK,KAAK2oI,GAAO,qBAAsB,KAAK,eAAc,CAAE,CAC9D,CAEA,mBAAoB,CAClB,OAAO,KAAK,4BAA2B,EAAG,eAAiB,KAAK,SAAW,IAC7E,CAEA,mBAAoB,CAClB,OAAO,KAAK,4BAA2B,EAAG,eAAiB,KAAK,SAAW,IAC7E,CAaA,gBAAiB,CACf,MAAMjhI,EAAQ,KAAK,4BAA2B,EACxC9K,EAAU8K,EAAM,QAAU,CAAE,GAAGA,EAAM,OAAO,EAAK,KACvD,OAAI9K,IACFA,EAAQ,MAAQ8K,EAAM,OAEjB,CACL,QAASA,EAAM,UAAY,GAC3B,MAAOA,EAAM,OAASywF,GACtB,QAAAv7F,EACA,UAAW,KAAK,IAAI,EAAG,KAAK,MAAM,OAAO8K,EAAM,OAAO,WAAaA,EAAM,eAAe,SAAS,GAAK,CAAC,CAAC,EACxG,UAAW,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOA,EAAM,OAAO,WAAaA,EAAM,eAAe,SAAS,GAAK,CAAC,CAAC,EACxG,cAAe,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOA,EAAM,OAAO,eAAiB,KAAK,SAAS,SAAS,GAAK,CAAC,CAAC,EACzG,cAAe,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOA,EAAM,OAAO,eAAiB,KAAK,SAAS,SAAS,GAAK,CAAC,CAAC,EACzG,MAAOA,EAAM,UAAaA,EAAM,UAAU,SAAW,OAAOA,EAAM,SAAS,EAAK,IACtF,CACE,CAiBA,YAAY9K,EAAS,CACnB,OAAI,UAAU,SAAW,EAChB,KAAK,eAAc,EAExBA,GAAW,MAAQA,IAAY,IAASA,GAAS,UAAY,GACxD,KAAK,iBAAgB,EAEvB,KAAK,eAAeA,CAAO,CACpC,CAqBA,eAAeA,EAAU,GAAI,CAC3B,GAAIA,GAAW,MAAQA,IAAY,GACjC,OAAO,KAAK,iBAAgB,EAE9B,IAAIguM,EAA0B,GAM9B,GALIhuM,aAAmBo9F,KACrB,KAAK,oBAAsBp9F,EAC3BA,EAAUA,EAAQ,qBAAoB,EACtCguM,EAA0B,IAExB,OAAOhuM,GAAY,SACrB,MAAM,IAAI,UAAU,mDAAmD,EAEpEguM,IACH,KAAK,oBAAsB,MAE7B,MAAM5oK,EAAQ82D,GAA0Bl8F,EAAQ,MAAO,KAAK,wBAAuB,EAAG,KAAK,EACrFiuM,EAAgB7P,GAA4Bp+L,CAAO,EACzD,GAAI,CAACq+L,GAAuB4P,CAAa,EACvC,OAAO,KAAK,iBAAgB,EAG9B,MAAMnjM,EAAQ,KAAK,wBAAuB,EACpCiB,EAAW,CAAE,GAAGjB,CAAK,EAC3BA,EAAM,QAAU,GAChBA,EAAM,MAAQs6B,EACdt6B,EAAM,QAAUmjM,EAChBnjM,EAAM,UAAY,KAClBA,EAAM,UAAY,KAElB,GAAI,CACF,KAAK,4BAA4B,CAAE,MAAO,GAAM,aAAc,GAAM,CACtE,OAAS7G,EAAO,CACd,aAAO,OAAO6G,EAAOiB,CAAQ,EACvB9H,CACR,CACA,YAAK,0BAA0B,KAAK,EAC7B,IACT,CAcA,qBAAqBm8B,EAAQ,CAC3B,GAAIA,GAAU,MAAQA,IAAW,GAC/B,YAAK,oBAAsB,KACpB,KAAK,iBAAgB,EAE9B,GAAI,EAAEA,aAAkBg9D,IACtB,MAAM,IAAI,UAAU,sEAAsE,EAE5F,OAAO,KAAK,eAAeh9D,CAAM,CACnC,CASA,uBAAwB,CACtB,OAAO,KAAK,qBAAuB,IACrC,CASA,2BAA4B,CAC1B,OAAK,KAAK,oBACH,KAAK,qBAAqB,KAAK,mBAAmB,EADnB,IAExC,CAWA,kBAAmB,CACjB,MAAMt1B,EAAQ,KAAK,wBAAuB,EACpCojM,EAAYpjM,EAAM,UAAY,IAAQA,EAAM,iBAAmB,MAAQA,EAAM,SAAW,KAC9F,YAAK,6BAA6BA,CAAK,EACvCA,EAAM,QAAU,GAChBA,EAAM,MAAQywF,GACdzwF,EAAM,QAAU,KAChBA,EAAM,UAAY,KAClBA,EAAM,YAAc,KACpBA,EAAM,YAAc,KACpBA,EAAM,aAAe,KACrBA,EAAM,aAAe,KACrBA,EAAM,gBAAkB,KACxBA,EAAM,cAAgB,KAAK,SAAW,KACtCA,EAAM,cAAgB,KAAK,SAAW,KACtCA,EAAM,MAAQ,KACdA,EAAM,UAAY,KACdojM,GACF,KAAK,0BAA0B,OAAO,EAEjC,IACT,CAkBA,MAAM,eAAeviM,EAAa3L,EAAU,GAAI,CAC9C,GAAI,CAAC2L,EACH,MAAM,IAAI,MAAM,mDAAmD,EAEjE3L,EAAQ,wBAA0B,IACpC,MAAM,KAAK,MAGb,MAAMmuM,EAAanuM,EAAQ,aAAe,GACpCouM,EAAapuM,EAAQ,aAAe,GACpCquM,EAAcruM,EAAQ,cAAgB,GACtCsuM,EAAmBtuM,EAAQ,mBAAqB,GAChDuuM,EAAevuM,EAAQ,OAAU,CAACouM,EAClCpV,EAAeh5L,EAAQ,QAAU,KAAK,QAAQ,OACpD,GAAIoxL,GAAiB4H,CAAY,EAC/B,MAAM,IAAI,MAAM,2FAA2F,EAE7G,MAAMwV,EACJ,KAAK,kBAAkB,SAAW,WAAa,KAAK,iBAAiB,SAAW,KAE5EC,EAAa,CAAC,KAAK,iBAAmB,KAAK,WAAW,UAAY,GAClE1P,EAAsB,OAAO,KAAK,WAAW,gBAAmB,WAClE,KAAK,UAAU,eAAc,EAC5B,KAAK,WAAW,gBAAkB,GAAQ,UAAY,UACrD/S,EAAcoiB,EAAa,KAAK,qBAAoB,EAAK,KACzDM,EAAkB,KAAK,iBACzB,CAAE,KAAM,KAAK,iBAAiB,cAAe,KAAM,KAAK,iBAAiB,cAAe,QAAS,CAAE,GAAG,KAAK,iBAAiB,OAAO,CAAE,EACrI,KACEC,EAAgB,CACpB,KAAM,KAAK,UAAU,MAAM,UAAY,GACvC,KAAM,KAAK,UAAU,MAAM,UAAY,GACvC,QAAS,CAAE,GAAI,KAAK,UAAU,SAAW,CAAA,CAAG,CAClD,EAEI,KAAK,wBAAwBH,CAAsB,EAEnD,KAAK,WAAW,OAAI,EACpB,KAAK,wBAAuB,EAC5B,KAAK,qBAAqB,UAAO,EACjC,KAAK,oBAAsB,KAC3B,KAAK,kBAAkB,UAAO,EAC9B,KAAK,iBAAmB,KACxB,KAAK,cAAc,kBAAkB,EAEjCF,IACF,KAAK,UAAU,UAAO,EACtB,KAAK,SAAW,MAGlB,KAAK,SAAS,UAAO,EAErB,MAAMM,EAAc,KAAK,QA8FzB,GA7FA,KAAK,QAAUjjM,EACf,KAAK,0BAA0B,cAAgBA,EAC/C,KAAK,0BAA0B,cAAgBA,EAC/C,KAAK,4BAA4B,CAAE,MAAO,GAAM,aAAc,GAAO,EACrE,KAAK,QAAU,IAAIqyE,GAAiBryE,EAAa,KAAK,KAAK,EAC3D,KAAK,QAAQ,qBAAqBotL,GAA2BC,EAAc,KAAK,OAAO,KAAM,KAAK,QAAQ,IAAI,CAAC,EAC/G,KAAK,2BAA2B,CAAE,oBAAqB,EAAK,CAAE,EAC9D,KAAK,SAAS,sBAAsB,kBAAkB,EAElDh5L,EAAQ,UAAY,MACtB,KAAK,WAAa,IAAI47E,GAAiB,OAAQjwE,EAAa,KAAK,iBAAkB,KAAK,KAAK,EAC7F,KAAK,WAAa,IAAIiwE,GAAiB,OAAQjwE,EAAa,KAAK,iBAAkB,KAAK,KAAK,EAC7F,KAAK,aAAe,IACX3L,EAAQ,SACjB,KAAK,WAAa,IAAI47E,GAAiB,OAAQjwE,EAAa,KAAK,iBAAkB,KAAK,KAAK,EAC7F,KAAK,WAAa,IAAIiwE,GAAiB,OAAQjwE,EAAa,KAAK,iBAAkB,KAAK,KAAK,EACzF3L,EAAQ,SAAS,YAAY,KAAK,WAAW,WAAWA,EAAQ,QAAQ,UAAU,EAClFA,EAAQ,SAAS,YAAY,KAAK,WAAW,WAAWA,EAAQ,QAAQ,UAAU,EACtF,KAAK,aAAe,IACXquM,GACT,KAAK,WAAa5b,GAAsB,KAAK,WAAY9mL,EAAa,KAAK,iBAAkB,KAAK,KAAK,EACvG,KAAK,WAAa8mL,GAAsB,KAAK,WAAY9mL,EAAa,KAAK,iBAAkB,KAAK,KAAK,EACvG,KAAK,aAAe,IAEpB,KAAK,uBAAuBA,CAAW,EAGzC,KAAK,4BAA8B,GAEnC,KAAK,QAAU,KAAK,oBAAoB,KAAK,aAAaqtL,CAAY,CAAC,EACvE,KAAK,6BAA4B,EAC7B,KAAK,SAAS,mBAChB,KAAK,QAAQ,kBAAmBxyL,GAAY,KAAK,oBAAoBA,CAAO,CAAC,EAE/E,MAAM,KAAK,SAAS,aAAU,EAC9B,KAAK,SAAS,SAAS,KAAK,OAAO,IAAI,EACvC,KAAK,mCAAmCu4L,EAAqB,kBAAkB,EAE3EuP,GACF,MAAM,KAAK,2BAA0B,EACrC,KAAK,iCAAgC,EACrC,KAAK,mBAAkB,EACnBC,EACF,KAAK,oBAAoB,CAAE,UAAWvuM,EAAQ,gBAAkB,GAAI,EAEpE,KAAK,oBAAoBgsL,CAAW,GAE7B,KAAK,WACd,KAAK,iBAAmB,IAAIrnH,GAAiB,KAAK,QAAQ,EAC1D,KAAK,iBAAiB,OAAO,KAAK,OAAO,IAAI,EAC7C,KAAK,oBAAmB,EACxB,KAAK,iCAAgC,EACrC,KAAK,mBAAkB,EACvB,KAAK,iCAAgC,EACjC4pI,EACF,KAAK,oBAAoB,CAAE,UAAWvuM,EAAQ,gBAAkB,GAAI,EAEpE,KAAK,oBAAoBgsL,CAAW,GAMxC,KAAK,oBAAmB,EAEpB0iB,GAAmB,KAAK,kBAC1B,KAAK,wBAAwBA,EAAgB,KAAMA,EAAgB,KAAMA,EAAgB,OAAO,EAE9FC,EAAc,MAAM,KAAK,kBAAkBA,EAAc,OAAO,EAChEA,EAAc,MAAM,KAAK,kBAAkBA,EAAc,OAAO,EAEhEF,GACF,KAAK,UAAU,MAAK,EAEtB,KAAK,UAAU,gBAAe,EAC9B,KAAK,UAAU,cAAa,EAC5B,KAAK,6BAA4B,EACjC,KAAK,gCAA+B,EACpC,KAAK,kBAAkB,EAAK,EAE5B,KAAK,KAAK1iE,GAAO,iBAAkB,CACjC,WAAY6iE,GAAe,KAC3B,QAASjjM,EACT,aAAcijM,GAAa,WAAa,KACxC,aAAcA,GAAa,WAAa,KACxC,UAAWjjM,GAAa,WAAa,KACrC,UAAWA,GAAa,WAAa,IAC3C,CAAK,EACG3L,EAAQ,mBAAqB,IAC/B,KAAK,SAAS,mBAAmB,kBAAkB,EAErD,KAAK,SAAS,sBAAsB,0BAA0B,EAE1DmuM,GAAcS,GAAe,OAAOA,EAAY,SAAY,WAC9D,GAAI,CACFA,EAAY,QAAO,CACrB,OAAS3qM,EAAO,CACdsH,GACE,KACA,2BACA,sEACA,CAAE,MAAAtH,CAAK,CACjB,CACM,CAEJ,CAEA,yBAA0B,CACxB,MAAMi0F,EAAU,KAAK,qBAErB,GADI,CAACA,GACD,CAAC,KAAK,UAAU,OAAQ,MAAO,GACnC,MAAMzvF,EAAO,KAAK,MAAQ,KAAK,QAAQ,MAAQ,KAC/C,MAAI,CAACA,GAAQA,EAAK,OAAS,GAAKA,EAAK,QAAU,EAAU,IAEzDyvF,EAAQ,UAAY,EACT,KAAK,aAAaA,EAAQ,OAAO,GAE1C,KAAK,qBAAuB,KACrB,KAELA,EAAQ,UAAYA,EAAQ,cAC9B,KAAK,qBAAuB,MAEvB,IACT,CAWA,oBAAoBl4F,EAAU,GAAI,CAChC,MAAM6uM,EAAc,OAAO,SAAS7uM,EAAQ,WAAW,EAAI,KAAK,IAAI,EAAG,KAAK,MAAMA,EAAQ,WAAW,CAAC,EAAI,GACpG,CAAE,YAAa8uM,EAAU,GAAGC,CAAY,EAAK/uM,GAAW,CAAA,EAC9D,YAAK,qBAAuB,CAAE,QAAS+uM,EAAc,SAAU,EAAG,YAAAF,CAAW,EAClE,KAAK,wBAAuB,IAErC,KAAK,WAAW,kBAAe,EAC/B,KAAK,WAAW,gBAAa,GAExB,IACT,CAEA,0BAA2B,CACzB,KAAK,oBAAoB,CACvB,QAAS,GACT,iBAAkB,KAAK,KAAI,IAAO,KAClC,uBAAwB,GACxB,YAAa,EACnB,CAAK,CACH,CAEA,iCAAkC,CAC5B,KAAK,uBAAyB,KAAK,gBAAgB,mBAAqB,IAC5E,KAAK,yBAAwB,CAC/B,CAeA,aAAa7uM,EAAU,GAAI,CACzB,MAAM61B,EAAS,KAAK,UAAU,QAAU,KACxC,GAAI,CAACA,EAAQ,MAAO,GACpB,MAAMy5G,EAAoBtvI,EAAQ,aAAe,KAC7Cy7L,GAAuBz7L,EAAQ,WAAW,EAC1C,KAAK,sCAAqC,EACxCipM,EAAgB,KAAK,oBAAoB,CAC7C,GAAGjpM,EACH,YAAasvI,GAAqB,OAClC,SAAU,OAAO,SAAStvI,EAAQ,QAAQ,EACtC,OAAOA,EAAQ,QAAQ,EACtB,KAAK,sBAAsB,iBAAmB86L,GAAwB,gBAC3E,aAAc,OAAO,SAAS96L,EAAQ,YAAY,EAC9C,OAAOA,EAAQ,YAAY,EAC1B,KAAK,sBAAsB,qBAAuB86L,GAAwB,oBAC/E,WAAY96L,EAAQ,YAAc,KAAK,sBAAsB,mBAAqBk6L,EACxF,CAAK,EACD,GAAI,CAAC+O,EAAe,MAAO,GAC3B,MAAM/E,EAAW,KAAK,sBAAsB+E,EAAe,CACzD,iBAAkBjpM,EAAQ,kBAAqB61B,EAAO,OAAS,KAC/D,UAAW71B,EAAQ,YAAcsvI,GAAmB,OAAS,WAAa,OAChF,CAAK,EACD,OAAI,KAAK,iCAAiCtvI,EAASsvI,CAAiB,GAClD,KAAK,6BAA6B40D,EAAUlkM,CAAO,EAC/C,GAEf,KAAK,sCAAsCkkM,EAAU,CAC1D,QAASlkM,EAAQ,UAAY,GAC7B,WAAYA,EAAQ,UAC1B,CAAK,CACH,CAkBA,MAAM,YAAY2C,EAAQ3C,EAAU,GAAI,CACtC,MAAMgvM,EAAkBhvM,EAAQ,QAAU,KACpCivM,EAAmB,OAAOjvM,EAAQ,MAAS,SAC7CA,EAAQ,KACP,OAAOA,EAAQ,UAAa,SAAWA,EAAQ,SAAW,KACzDkvM,EAAwBvsM,GAAU,OAAOA,GAAW,UAAY,OAAOA,EAAO,MAAS,SACzFA,EAAO,KACPssM,EACEE,EAAiB,OAAOD,GAA0B,SACpDtc,GAA2Bsc,CAAqB,EAChD,KACE/uK,EAAS6uK,GAAmBG,EAClC,GAAI,CAAChvK,EACH,MAAM,IAAI,MAAM,kIAAkI,EAEpJ,MAAMivK,EAAkBpvM,EAAQ,qBAAuB,IAAQA,EAAQ,2BAA6B,GAChG,KAAK,6BAA6BA,EAAQ,qBAAqB,EAC/D,KACJ,GAAI,CACF,KAAM,CAAE,QAASqvM,GAAkB,KAAM,QAAO,gBAAgB,EAC1D1vM,EAAawgC,EAAO,YAAW,EACrC,IAAIv+B,EAAO,KACX,GAAIjC,IAAe,QAASiC,EAAO,MAAMytM,EAAc,UAAU1sM,CAAM,UAC9DhD,IAAe,QAASiC,EAAO,MAAMytM,EAAc,UAAU1sM,CAAM,UACnEhD,IAAe,OAAQiC,EAAO,MAAMytM,EAAc,SAAS1sM,CAAM,UACjEhD,IAAe,MAAOiC,EAAO,MAAMytM,EAAc,QAAQ1sM,CAAM,UAC/DhD,IAAe,KAAMiC,EAAO,MAAMytM,EAAc,OAAO1sM,CAAM,MACjE,OAAM,IAAI,MAAM,+BAA+Bw9B,CAAM,EAAE,EAC5D,MAAM6zB,EAAak7I,EACbx5I,EAAa1B,EAAaqlI,GAAgBrlI,CAAU,EAAI,KACxDs7I,EAAkBtvM,EAAQ,iBAAmB01D,GAAc1B,GAAc,GAAGr0D,EAAW,YAAW,CAAE,WACpG4vM,EAAsBvvM,EAAQ,wBAA0B,IACzDA,EAAQ,kBAAoB,IAC5BA,EAAQ,gBAAkB,IAC1BA,EAAQ,aAAe,GAyB5B,GAxBIuvM,GAAuB,OAAO,KAAK,SAAS,iBAAoB,YAClE,MAAM,KAAK,QAAQ,gBAAgB,CACjC,SAAUD,EACV,KAAMt7I,EACN,cAAeh0D,EAAQ,uBAAyB,GAChD,mBAAoB,GACpB,kBAAmBA,EAAQ,oBAAsB,GACjD,uBAAwBA,EAAQ,uBAChC,qBAAsBA,EAAQ,qBAC9B,wBAAyBA,EAAQ,wBACjC,yBAA0BA,EAAQ,yBAClC,oBAAqBA,EAAQ,qBAAuB,6BAC9D,CAAS,EAECg0D,GACF,KAAK,uBAAyBA,EAC9B,KAAK,uBAAyB0B,EAC9B,KAAK,yBAA2Bk9H,GAA2B5+H,CAAU,IAErE,KAAK,uBAAyB,KAC9B,KAAK,uBAAyB,KAC9B,KAAK,yBAA2Br0D,GAElC,MAAM,KAAK,eAAeiC,EAAM5B,CAAO,EACnCA,EAAQ,4BAA8B,GAAO,CAC/C,MAAMwvM,EAAgB,KAAK,8BAA8B5tM,CAAI,EACzD4tM,GACF,MAAM,KAAK,yBAAyBA,EAAe,CAAE,OAAQ,cAAc,CAAE,EAE/E,MAAM,KAAK,SAAS,kCAAkC,CAAE,QAAS5tM,CAAI,CAAE,CACzE,CACA,OAAI2tM,GACF,MAAM,KAAK,SAAS,qBAAqBD,CAAe,EAE1D,KAAK,+BAA+BF,CAAe,EAC5CxtM,CACT,OAASqC,EAAO,CACd,WAAK,8BAA8BmrM,CAAe,EAC5CnrM,CACR,CACF,CAWA,MAAM,YAAYk8B,EAAS,QAASngC,EAAU,CAAA,EAAI,CAChD,MAAML,EAAa,OAAOwgC,CAAM,EAAE,YAAW,EAC7C,GAAI,CAAC,KAAK,QAAS,MAAM,IAAI,MAAM,wCAAwC,EAE3E,KAAK,SAAS,uBAAuB,KAAK,QAAQ,IAAI,EACtD,KAAK,oBAAmB,EACxB,MAAMtc,EAAS7jB,EAAQ,QAAU,OAC3B61J,EAAc,CAAE,GAAI71J,EAAQ,aAAe,GAAK,OAAQ6jB,CAAM,EACpE,GAAIlkB,IAAe,QAAS,CAC1B,GAAI,OAAO,KAAK,QAAQ,WAAc,WAAY,MAAM,IAAI,MAAM,sCAAsC,EACxG,OAAO,KAAK,QAAQ,UAAUk2J,CAAW,CAC3C,CACA,GAAIl2J,IAAe,QAAS,CAC1B,GAAI,OAAO,KAAK,QAAQ,WAAc,WAAY,MAAM,IAAI,MAAM,sCAAsC,EACxG,OAAO,KAAK,QAAQ,UAAUk2J,CAAW,CAC3C,CACA,GAAIl2J,IAAe,OAAQ,CACzB,GAAI,OAAO,KAAK,QAAQ,UAAa,WAAY,MAAM,IAAI,MAAM,qCAAqC,EACtG,OAAO,KAAK,QAAQ,SAASk2J,CAAW,CAC1C,CACA,GAAIl2J,IAAe,MAAO,CACxB,GAAI,OAAO,KAAK,QAAQ,SAAY,WAAY,MAAM,IAAI,MAAM,oCAAoC,EACpG,OAAO,KAAK,QAAQ,QAAQk2J,CAAW,CACzC,CACA,GAAIl2J,IAAe,KAAM,CACvB,GAAI,OAAO,KAAK,QAAQ,QAAW,WAAY,MAAM,IAAI,MAAM,mCAAmC,EAClG,OAAO,KAAK,QAAQ,OAAOk2J,CAAW,CACxC,CACA,MAAM,IAAI,MAAM,+BAA+B11H,CAAM,EAAE,CACzD,CASA,wBAAyB,CACvB,OAAO,KAAK,WAAW,YAAS,GAAQ,CAAA,CAC1C,CAUA,qBAAqB15B,EAAW,GAAI,CAClC,YAAK,WAAW,UAAUA,CAAQ,EAC3B,IACT,CAEA,iCAAiCohG,EAAQ,GAAI,CAC3C,OAAOw1E,GAA2B,CAChC,KAAM,KAAK,wBAA0B,KACrC,SAAU,KAAK,wBAA0B,KACzC,OAAQ,KAAK,0BAA4B,KACzC,UAAW,KAAK,SAAS,WAAa,KACtC,UAAW,KAAK,SAAS,WAAa,KACtC,8BAA+B,KAAK,SAAS,sBAAsB4d,EAAqC,IAAM,GAC9G,GAAGpzF,CACT,CAAK,CACH,CAEA,sBAAsB7nG,EAAU,GAAI,CAClC,GAAI,OAAO,KAAK,SAAS,mBAAsB,WAAY,OAAO,KAClE,MAAMyG,EAAW,KAAK,QAAQ,kBAAkB,CAC9C,eAAgB,GAChB,GAAIzG,GAAW,CAAA,CACrB,CAAK,EACD,OAAOyG,EAAW2oK,GAAkB3oK,CAAQ,EAAI,IAClD,CAEA,gCAAiC,CAC/B,MAAMgpM,EAAmB,KAAK,QAAQ,eAAe,CAAE,QAAS,WAAW,CAAE,GAAK,CAAA,EAC5EhsD,EAAY,CAChB,GAAG2rB,GAAkBqgC,CAAgB,CAC3C,EAGI,IAFiC,KAAK,QAAQ,SAAS,iBAAiB,GAAG,cAAgB,IACtF,KAAK,QAAQ,SAAS,gBAAgB,GAAG,cAAgB,KAC9B,CAAC,OAAO,UAAU,eAAe,KAAKhsD,EAAW,aAAa,EAAG,CAC/F,MAAMn2F,EAAO,KAAK,qBAAqB,CAAE,gBAAiB,EAAK,CAAE,EAC7DA,IAAMm2F,EAAU,aAAa,EAAI2rB,GAAkB9hH,CAAI,EAC7D,CACA,OAAOm2F,CACT,CAWA,4BAA4BzjJ,EAAU,GAAI,CACxC,MAAM21K,EAAc31K,EAAQ,aAAe,KAAK,SAAS,iBAAc,GAAQm9K,GAA6B,EAc5G,OAbiBO,GAA0BvB,GAAkB,cAAe,CAC1E,YAAAxG,EACA,sBAAuBA,GAAa,YAAc,KAClD,QAAS,KAAK,IAAI,iBAAc,GAAQ,KAAK,WAAW,IAAI,iBAAc,GAAQ,CAAA,EAClF,cAAe,KAAK,uBAAsB,EAC1C,YAAa,KAAK,qBAAqB31K,EAAQ,QAAU,CAAA,CAAE,EAC3D,mBAAoB,KAAK,4BAA2B,EACpD,cAAe,KAAK,iCAAgC,EACpD,mBAAoB,KAAK,2BAA2BA,EAAQ,eAAiB,CAAA,CAAE,EAC/E,aAAc,KAAK,sBAAsBA,EAAQ,SAAW,CAAA,CAAE,CACpE,EAAO,CACD,OAAQ,QACd,CAAK,CAEH,CAWA,MAAM,iCAAiCA,EAAU,GAAI,CACnD,MAAM21K,EAAc31K,EAAQ,aAAe,KAAK,SAAS,iBAAc,GAAQm9K,GAA6B,EAC5G,OAAOO,GAA0BvB,GAAkB,cAAe,CAChE,YAAAxG,EACA,sBAAuBA,GAAa,YAAc,KAClD,QAAS,KAAK,IAAI,iBAAc,GAAQ,KAAK,WAAW,IAAI,iBAAc,GAAQ,CAAA,EAClF,cAAe,KAAK,uBAAsB,EAC1C,YAAa,KAAK,qBAAqB31K,EAAQ,QAAU,CAAA,CAAE,EAC3D,mBAAoB,KAAK,4BAA2B,EACpD,cAAe,KAAK,iCAAgC,EACpD,mBAAoB,MAAM,KAAK,gCAAgCA,EAAQ,eAAiB,CAAA,CAAE,EAC1F,aAAc,KAAK,sBAAsBA,EAAQ,SAAW,CAAA,CAAE,CACpE,EAAO,CACD,OAAQ,QACd,CAAK,CACH,CAWA,MAAM,yBAAyB2C,EAAQ3C,EAAU,GAAI,CACnD,MAAMs+K,EAAWI,GAAyB/7K,EAAQw5K,GAAkB,aAAa,EAC3E31K,EAAU83K,EAAS,QACnBoxB,EAAkBlpM,GAAS,cAAc,OAAO,WAAa,OAAOA,EAAQ,aAAa,MAAM,WAAc,SAC/GA,EAAQ,aAAa,MAAM,UAC1BA,GAAS,WAAa,OAAOA,EAAQ,WAAc,SAAWA,EAAQ,UAAY,KA2DvF,aA1DgC,SAAY,CAC1C,MAAMmpM,EAAenpM,EAAQ,aAAa,KAExCxG,EAAQ,cAAgB,KACpB2vM,IAAiB,MAAQA,IAAiB,OAC3CA,IAAiB,KAAK,KAAI,GAC1B,OAAO,KAAK,SAAY,YAE3B,MAAM,KAAK,QAAQA,EAAc,CAC/B,QAAS,GACT,aAAc,GACd,GAAI3vM,EAAQ,aAAe,EACrC,CAAS,EAEH,IAAI4vM,EAAuB,GACvBF,GAAmB1vM,EAAQ,iBAAmB,KAC5CwG,EAAQ,cAAgB,OAAO,KAAK,SAAS,iBAAoB,YACnE,KAAK,QAAQ,gBAAgBA,EAAQ,aAAc,CACjD,OAAQxG,EAAQ,QAAU,UAC1B,OAAQA,EAAQ,QAAU,8BAC1B,cAAeA,EAAQ,aACnC,CAAW,EACD4vM,EAAuB,IACd,OAAO,KAAK,QAAQ,SAAY,YACzC,KAAK,OAAO,QAAQF,EAAiB,CACnC,OAAQ1vM,EAAQ,QAAU,UAC1B,OAAQA,EAAQ,QAAU,8BAC1B,cAAeA,EAAQ,aACnC,CAAW,GAGDwG,EAAQ,eAAiB,OAAOA,EAAQ,eAAkB,UAC5D,KAAK,qBAAqBA,EAAQ,aAAa,EAE7C,OAAO,KAAK,WAAW,IAAI,cAAiB,WAC9C,KAAK,UAAU,GAAG,aAAaA,EAAQ,QAASxG,CAAO,EAC9CwG,EAAQ,SAAW,OAAOA,EAAQ,SAAY,WACvD,KAAK,6BAA+B4oK,GAAkB5oK,EAAQ,OAAO,EACjExG,EAAQ,qBAAuB,KAAO,KAAK,mCAAqC,KAElFwG,EAAQ,oBAAoB,KAAK,2BAA2BA,EAAQ,kBAAkB,EACtFA,EAAQ,aAAa,KAAK,oBAAoBA,EAAQ,YAAa,CAAE,gBAAiBxG,EAAQ,wBAA0B,EAAI,CAAE,EAC9HwG,EAAQ,oBAAsBxG,EAAQ,uBAAyB,IACjE,MAAM,KAAK,0BAA0BwG,EAAQ,mBAAoB,CAC/D,OAAQxG,EAAQ,QAAU,8BAC1B,GAAI,OAAO,UAAU,eAAe,KAAKA,EAAS,uBAAuB,EACrE,CAAE,gBAAiBA,EAAQ,wBAA0B,EAAI,EACzD,EACd,CAAS,EAEC,CAAC4vM,GAAwB,CAACF,GAAmBlpM,EAAQ,cAAgBxG,EAAQ,iBAAmB,IAAS,OAAO,KAAK,SAAS,iBAAoB,YACpJ,KAAK,QAAQ,gBAAgBwG,EAAQ,aAAc,CACjD,OAAQ,UACR,OAAQxG,EAAQ,QAAU,8BAC1B,cAAeA,EAAQ,aACjC,CAAS,CAEL,GAC6B,EACtBs+K,CACT,CAWA,MAAM,0BAA0B37K,EAAQ3C,EAAU,GAAI,CACpD,OAAO,KAAK,yBAAyB2C,EAAQ3C,CAAO,CACtD,CAWA,yBAAyBA,EAAU,GAAI,CACrC,MAAMs+K,EAAW,KAAK,4BAA4Bt+K,CAAO,EACnDmgC,EAASngC,EAAQ,QAAU,SACjC,OAAImgC,IAAW,SAAiBq+I,GAA6BF,EAAUt+K,EAAQ,SAAW,EAAK,EAC3FmgC,IAAW,OACN,IAAI,KAAK,CAACq+I,GAA6BF,EAAUt+K,EAAQ,SAAW,EAAK,CAAC,EAAG,CAAE,KAAM,kBAAkB,CAAE,EAE3Gs+K,CACT,CAWA,mCAAmCt+K,EAAU,GAAI,CAC/C,MAAM21K,EAAc31K,EAAQ,aAAe,KAAK,SAAS,iBAAc,GAAQm9K,GAA6B,EACtG0yB,EAAuB7vM,EAAQ,uBAAyB,GAC9D,OAAO09K,GAA0BvB,GAAkB,cAAe,CAChE,YAAAxG,EACA,sBAAuBA,GAAa,YAAc,KAClD,QAAS,CAAA,EACT,cAAe,CAAA,EACf,YAAa,KAAK,qBAAqB31K,EAAQ,QAAU,CAAA,CAAE,EAC3D,mBAAoB,KAAK,4BAA2B,EACpD,cAAe,KAAK,iCAAgC,EACpD,UAAW,KAAK,+BAA8B,EAC9C,mBAAoB6vM,EAAuB,KAAK,2BAA2B7vM,EAAQ,eAAiB,CAAA,CAAE,EAAI,KAC1G,aAAc,KAAK,sBAAsBA,EAAQ,SAAW,CAAA,CAAE,CACpE,EAAO,CACD,OAAQ,SACR,OAAQ,EACd,CAAK,CACH,CAWA,MAAM,wCAAwCA,EAAU,GAAI,CAC1D,MAAM21K,EAAc31K,EAAQ,aAAe,KAAK,SAAS,iBAAc,GAAQm9K,GAA6B,EACtG0yB,EAAuB7vM,EAAQ,uBAAyB,GAC9D,OAAO09K,GAA0BvB,GAAkB,cAAe,CAChE,YAAAxG,EACA,sBAAuBA,GAAa,YAAc,KAClD,QAAS,CAAA,EACT,cAAe,CAAA,EACf,YAAa,KAAK,qBAAqB31K,EAAQ,QAAU,CAAA,CAAE,EAC3D,mBAAoB,KAAK,4BAA2B,EACpD,cAAe,KAAK,iCAAgC,EACpD,UAAW,KAAK,+BAA8B,EAC9C,mBAAoB6vM,EAAuB,MAAM,KAAK,gCAAgC7vM,EAAQ,eAAiB,CAAA,CAAE,EAAI,KACrH,aAAc,KAAK,sBAAsBA,EAAQ,SAAW,CAAA,CAAE,CACpE,EAAO,CACD,OAAQ,SACR,OAAQ,EACd,CAAK,CACH,CAWA,8BAA8BsG,EAAU,KAAK,QAAStG,EAAU,CAAA,EAAI,CAClE,GAAI,CAACsG,GAAS,sBAAsBtG,EAAQ,eAAiBi7L,EAAqC,EAAG,OAAO,KAC5G,MAAMxlK,EAAMnvB,EAAQ,0BAA0BtG,EAAQ,eAAiBi7L,EAAqC,EAC5G,GAAI,CAACxlK,EAAK,OAAO,KACjB,GAAI,CACF,OAAOipJ,GAAyBjpJ,EAAK0mJ,GAAkB,aAAa,CACtE,OAASl4K,EAAO,CACd,eAAQ,KAAK,+CAAgDA,CAAK,EAC3D,IACT,CACF,CAWA,kCAAkCwC,EAAW,KAAMzG,EAAU,CAAA,EAAI,CAC/D,MAAMsG,EAAUtG,EAAQ,SAAW,KAAK,QACxC,GAAI,CAACsG,EAAS,MAAM,IAAI,MAAM,8DAA8D,EAC5F,MAAMirF,EAAgBvxF,EAAQ,eAAiBi7L,GAC1C30L,EAAQ,sBAAsBirF,CAAa,GAC9CjrF,EAAQ,uBAAuBirF,EAAe3zC,GAAAA,cAAc,OAAQ,CAAC,EAEvE,MAAM9yC,EAAQrE,GAAY,KAAK,4BAA4BzG,CAAO,EAClE,OAAAsG,EAAQ,0BAA0BirF,EAAeitF,GAA6B1zK,EAAO9K,EAAQ,SAAW,EAAK,CAAC,EACvG,IACT,CAUA,gCAAgCA,EAAU,GAAI,CAC5C,MAAMsG,EAAUtG,EAAQ,SAAW,KAAK,QAClCuxF,EAAgBvxF,EAAQ,eAAiBi7L,GAC/C,OAAK30L,GAAS,sBAAsBirF,CAAa,GACjDjrF,EAAQ,uBAAuBirF,CAAa,EACrC,MAFoD,IAG7D,CAaA,MAAM,oBAAoBpxD,EAAS,QAASngC,EAAU,CAAA,EAAI,CACxD,GAAI,CAAC,KAAK,QAAS,MAAM,IAAI,MAAM,gDAAgD,EACnF,MAAMy+I,EAAmB,OAAOt+G,GAAU,OAAO,EAAE,YAAW,EACxDoxD,EAAgBvxF,EAAQ,eAAiBi7L,GACzCplC,EAAc,CAAE,GAAI71J,EAAQ,aAAe,CAAA,CAAG,EAC9C8vM,EAAmB,CACvB,GAAIj6C,EAAY,kBAAoB,GACpC,QAAS,MAAM,QAAQA,EAAY,kBAAkB,OAAO,EACxD,CAAC,GAAGA,EAAY,iBAAiB,OAAO,EACxC,CAAA,CACV,EACUhyI,EAAS7jB,EAAQ,QAAU,OACjC,IAAKy+I,IAAqB,OAASA,IAAqB,OAASz+I,EAAQ,uBAAyB,GAChG,eAAQ,KAAK,WAAWy+I,EAAiB,YAAW,CAAE,uEAAuE,EACtH,KAAK,YAAYt+G,EAAQ,CAAE,OAAAtc,EAAQ,YAAAgyI,CAAW,CAAE,EAEzD,GAAI71J,EAAQ,uBAAyB,GAAM,CACpC8vM,EAAiB,QAAQ,SAASv+G,CAAa,GAAGu+G,EAAiB,QAAQ,KAAKv+G,CAAa,EAClG,IAAIw+G,EAAoB,KACpBC,EAA+B,GACnC,GAAI,CACF,GAAIhwM,EAAQ,0BAA4B,GAAM,CAC5C,MAAMiwM,EAAyB,CAC7B,GAAGjwM,EACH,cAAe,CACb,GAAIA,EAAQ,eAAiB,GAC7B,eAAgB,EAC9B,CACA,EACgB0uL,EAA0B1uL,EAAQ,yBAA2B,IAAQA,EAAQ,cAAgB,GAK7FkwM,GAJqBlwM,EAAQ,oBAC9B,MAAO0uL,EACN,KAAK,wCAAwCuhB,CAAsB,EACnE,KAAK,iCAAiCA,CAAsB,KACtB,SAAS,oBAAoB,WAAa,KACtF,GAAIC,GAAiB,WAAa,kBAAoB,OAAOA,EAAgB,MAAS,SAAU,CAC9F,MAAMC,EAAc,KAAK,SACxBA,GAAa,qBAAuBA,GAAa,MAAM,KAAKA,EAAa,oBAAqBD,EAAiB,CAC9G,MAAO,UACP,OAAQ,SACR,OAAQ,wBACR,SAAU,EACxB,CAAa,EACD,MAAME,EAAmB9e,GAAyB4e,EAAgB,KAAMA,EAAgB,MAAM,EAC1FE,aAA4B,cAAgBA,EAAiB,OAAS,IACxE,KAAK,SAAS,uBAAuB,KAAK,QAAQ,IAAI,EACtDL,EAAoB,KAAK,uBAAsB,EAC3CA,aAA6B,cAAgBA,EAAkB,SAAWK,EAAiB,SAC7FJ,EAA+B,KAAK,oBAAoBI,CAAgB,GAG9E,CACF,CACA,OAAO,MAAM,KAAK,YAAYjwK,EAAQ,CACpC,OAAAtc,EACA,YAAa,CACX,GAAGgyI,EACH,iBAAAi6C,CACZ,CACA,CAAS,CACH,QAAC,CACC,GAAIE,GAAgCD,aAA6B,aAC/D,GAAI,CACF,KAAK,oBAAoBA,CAAiB,CAC5C,OAAS9rM,EAAO,CACdsH,GACE,KACA,iCACA,wEACA,CAAE,MAAAtH,CAAK,CACrB,CACU,CAEJ,CACF,CAkGA,OAAO,MAhGgC,SAAY,CACjD,MAAMosM,EAAc,KAAK,QAAQ,sBAAsB9+G,CAAa,IAAM,GACpE6wF,EAAgBiuB,EAAc,KAAK,QAAQ,0BAA0B9+G,CAAa,EAAI,KAC5F,IAAIw+G,EAAoB,KACpBC,EAA+B,GACnC,GAAI,CACF,MAAMthB,EAA0B1uL,EAAQ,yBAA2B,IAAQA,EAAQ,cAAgB,GAC7Fw9K,EAAqBx9K,EAAQ,oBAC9B,MAAO0uL,EACN,KAAK,wCAAwC,CAC7C,GAAG1uL,EACH,cAAe,CACb,GAAIA,EAAQ,eAAiB,GAC7B,eAAgB,EAChC,CACA,CAAa,EACC,KAAK,iCAAiC,CACtC,GAAGA,EACH,cAAe,CACb,GAAIA,EAAQ,eAAiB,GAC7B,eAAgB,EAChC,CACA,CAAa,GACCkwM,EAAkB1yB,GAAoB,SAAS,oBAAoB,WAAa,KACtF,GACEx9K,EAAQ,0BAA4B,IACjCkwM,GAAiB,WAAa,kBAC9B,OAAOA,EAAgB,MAAS,SACnC,CACA,MAAMC,EAAc,KAAK,SACxBA,GAAa,qBAAuBA,GAAa,MAAM,KAAKA,EAAa,oBAAqBD,EAAiB,CAC9G,MAAO,UACP,OAAQ,SACR,OAAQ,wBACR,SAAU,EACtB,CAAW,EACD,MAAME,EAAmB9e,GAAyB4e,EAAgB,KAAMA,EAAgB,MAAM,EAC1FE,aAA4B,cAAgBA,EAAiB,OAAS,IACxE,KAAK,SAAS,uBAAuB,KAAK,QAAQ,IAAI,EACtDL,EAAoB,KAAK,uBAAsB,EAC3CA,aAA6B,cAAgBA,EAAkB,SAAWK,EAAiB,SAC7FJ,EAA+B,KAAK,oBAAoBI,CAAgB,GAG9E,CACA,MAAME,EAA6B,MAAO,KAAK,SAAS,2BAA2B,CACjF,GAAGtwM,EACH,eAAgB,GAChB,wBAAyBA,EAAQ,0BAA4B,EACvE,CAAS,GAAKw9K,GACN,aAAO,KAAK,SAAS,oCAAoC8yB,EAA4B,CACnF,cAAA/+G,EACA,OAAQvxF,EAAQ,MAC1B,CAAS,GAAK,KAAK,kCAAkCswM,EAA4B,CACvE,cAAA/+G,EACA,OAAQvxF,EAAQ,MAC1B,CAAS,GACM,MAAM,KAAK,YAAYmgC,EAAQ,CAAE,OAAAtc,EAAQ,YAAAgyI,EAAa,CAC/D,QAAC,CACC,GAAIm6C,GAAgCD,aAA6B,aAC/D,GAAI,CACF,KAAK,oBAAoBA,CAAiB,CAC5C,OAAS9rM,EAAO,CACdsH,GACE,KACA,+CACA,6EACA,CAAE,MAAAtH,CAAK,CACrB,CACU,CAEF,GAAIosM,EACF,GAAI,CACF,KAAK,QAAQ,0BAA0B9+G,EAAe6wF,CAAa,CACrE,OAASn+K,EAAO,CACdsH,GACE,KACA,gDACA,sFACA,CAAE,MAAAtH,EAAO,cAAAstF,CAAa,CACpC,CACU,SACS,KAAK,QAAQ,sBAAsBA,CAAa,EACzD,GAAI,CACF,KAAK,QAAQ,uBAAuBA,CAAa,CACnD,OAASttF,EAAO,CACdsH,GACE,KACA,+CACA,sFACA,CAAE,MAAAtH,EAAO,cAAAstF,CAAa,CACpC,CACU,CAEJ,CACF,GAC2C,CAC7C,CAeA,4BAA4BvxF,EAAU,GAAI,CACxC,MAAM+B,EAAgB,OAAO/B,EAAQ,eAAiB,CAAC,EACjDigJ,EAAaX,GAA0B,KAAK,SAAUv9I,CAAa,EACzE,MAAO,CACL,GAAGk+I,EACH,uBAAwB,WAAW,QAAQ,kBAAoB,EAC/D,cAAeN,GAA2B,GAAI,CAC5C,SAAU,KAAK,SACf,WAAY,CACV,GAAGM,EACH,uBAAwB,WAAW,QAAQ,kBAAoB,CACzE,EACQ,WAAY,KAAK,QAAQ,MAAQ,KAAK,MAAQ,CAAA,EAC9C,uBAAwB,WAAW,QAAQ,kBAAoB,CACvE,CAAO,EAAE,OACH,QAASoB,GACP,KAAK,QAAQ,MAAQ,KAAK,MAAQ,CAAA,EAClC,CACE,GAAGpB,EACH,uBAAwB,WAAW,QAAQ,kBAAoB,CACzE,EACQl+I,CACR,CACA,CACE,CAEA,4BAA4B/B,EAAU,GAAI,CACxC,MAAM+B,EAAgB,OAAO/B,EAAQ,eAAiB,CAAC,EACjDigJ,EAAaX,GAA0B,KAAK,SAAUv9I,CAAa,EACzE,OAAO49I,GAA2B3/I,EAAS,CACzC,SAAU,KAAK,SACf,WAAAigJ,EACA,WAAY,KAAK,QAAQ,MAAQ,KAAK,MAAQ,CAAE,MAAO,EAAG,OAAQ,CAAC,EACnE,uBAAwB,WAAW,QAAQ,kBAAoB,CACrE,CAAK,CACH,CAEA,MAAM,2BAA4B,CAChC,GAAI,OAAO,SAAa,IACtB,MAAM,IAAI,MAAM,8CAA8C,EAEhE,GAAI,CAAC,KAAK,UAAY,CAAC,KAAK,UAC1B,MAAM,IAAI,MAAM,gDAAgD,EAElE,GAAI,CAAC,KAAK,QACR,MAAM,IAAI,MAAM,0CAA0C,EAE5D,KAAK,SAAS,uBAAuB,KAAK,QAAQ,MAAQ,KAAK,IAAI,EACnE,KAAK,oBAAmB,EACxB,MAAM/sH,EAAQ,KAAK,UAAU,mBAAgB,GAAQ,KAAK,UAAU,cAAgB,KACpF,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,kDAAkD,EAEpE,OAAOA,CACT,CAEA,yBAAyBq9K,EAAcvwM,EAAU,GAAI,CACnD,MAAM+1B,EAAiB/1B,EAAQ,6BAA+Bw2L,GAA2Bx2L,CAAO,EAChG,GAAI,CAACuwM,GAAc,YAAa,OAAOA,EAEvC,MAAMC,EAAiBD,EAAa,YAAW,EAI/C,GAHI,CAACC,GAAgB,gBAAkB,CAACA,GAAgB,MAAQ,CAACA,GAAgB,YAG7ED,EAAa,OAAS,KACxB,OAAOA,EAGT,MAAMxZ,EAAewZ,EAAa,UAAYC,EAAe,UAAY,KACnEhlG,EAAcxrG,EAAQ,aAAe,KAC3C,GAAI,CAAC+2L,GAAgB,CAACvrF,EACpB,OAAO+kG,EAGT,MAAMlZ,EAAmB,IAAI,aAAamZ,EAAe,UAAU,EAC7DC,EAAa,IAAI,aAAaD,EAAe,IAAI,EACjDE,EAAiBja,GAAkB,EAEzC,GAAI8Z,EAAa,aAAe,eAAgB,CAC9C,MAAMI,EAAajZ,GAAyBL,CAAgB,EAC5D,GAAI,CAACsZ,EAAY,OAAOJ,EACxB,MAAMK,EAAe9Z,GAAuB6Z,EAAYnlG,EAAaurF,CAAY,EACjF5vI,GACEupJ,EACAE,EAAa,KACbA,EAAa,MACbA,EAAa,OACbA,EAAa,IACb,OAAOL,EAAa,MAAQ,EAAG,EAC/B,OAAOA,EAAa,KAAO,GAAM,CACzC,CACI,KAAO,CACL,MAAMxpJ,EAAO,KAAK,IAAI,KAAM,OAAOwpJ,EAAa,MAAQ,EAAG,CAAC,EACtDI,EAAavZ,GAAwBC,EAAkBtwI,CAAI,EACjE,GAAI,CAAC4pJ,EAAY,OAAOJ,EACxB,MAAMK,EAAe9Z,GAAuB6Z,EAAYnlG,EAAaurF,CAAY,EACjFJ,GACE+Z,EACAE,EAAa,KACbA,EAAa,MACbA,EAAa,OACbA,EAAa,IACb7pJ,EACA,KAAK,IAAIA,EAAO,KAAM,OAAOwpJ,EAAa,KAAO,GAAM,CAAC,CAChE,CACI,CAEA,MAAMM,EAAqBpa,GAAkB,EAC7CxwI,GAAa4qJ,EAAoBH,EAAgBD,CAAU,EAE3D,MAAMK,EAAiB,CACrB,GAAGN,EACH,KAAMC,EACN,WAAYC,EACZ,eAAgBG,EAChB,SAAU,IAAI,aAAaL,EAAe,QAAQ,EAClD,MAAO,IAAI,aAAaA,EAAe,KAAK,EAC5C,GAAI,IAAI,aAAaA,EAAe,EAAE,EACtC,SAAU,CACR,GAAIA,EAAe,UAAY,GAC/B,GAAGz6K,CACX,CACA,EAEI,MAAO,CACL,KAAMw6K,EAAa,KACnB,WAAYA,EAAa,WACzB,SAAU,CAAE,GAAGO,EAAe,QAAQ,EACtC,KAAMP,EAAa,KACnB,IAAKA,EAAa,IAClB,YAAY9nM,EAAM,CACXA,IACL,KAAK,SAAW,CAAE,GAAG,KAAK,SAAU,GAAGA,CAAI,EAC3CqoM,EAAe,SAAW,CAAE,GAAGA,EAAe,SAAU,GAAGroM,CAAI,EACjE,EACA,aAAc,CACZ,MAAO,CACL,GAAGqoM,EACH,SAAU,CAAE,GAAGA,EAAe,QAAQ,CAChD,CACM,CACN,CACE,CAEA,MAAM,qBAAqB9wM,EAASkzB,EAAO,CACzC,MAAMH,EAAW,KAAK,UAAY,KAClC,GAAI,CAACA,GAAU,OAAQ,MAAM,IAAI,MAAM,8CAA8C,EAErF,MAAMuN,EAAcvN,EAAS,kBAAkB/yB,EAAQ,iBAAkBA,EAAQ,iBAAiB,EAC5F+wM,EAAqB,MAAM,QAAQh+K,EAAS,UAAU,EAAI,CAAC,GAAGA,EAAS,UAAU,EAAI,KACrFi+K,EAA8BhxM,EAAQ,6BAA+B,KACrEuwM,EAAer9K,GAAO,QAAUH,EAAS,OACzCk+K,EAAe,KAAK,yBAAyBV,EAAcvwM,CAAO,EAClEm1J,EAAc87C,IAAiBV,EAAer9K,EAAQ,CAAE,GAAGA,EAAO,OAAQ+9K,CAAY,EACtFC,EAAyBX,GAAc,SAAW,CAAE,GAAGA,EAAa,QAAQ,EAAK,KACjFp5I,EAAapkC,EAAS,YAAc,KACpCo+K,EAA0Bh6I,GAAY,oBAAsB,GAC5Di6I,EAA4Bj6I,GAAY,4BAA8B,GACtEk6I,EAA2B,KAAK,sBAAsB,mBAAqB,GACjF,GAAI,CACE,KAAK,uBACP,KAAK,qBAAqB,iBAAmB,IAE3Cl6I,IACFA,EAAW,uBAAuB,EAAK,EACvCA,EAAW,+BAA+B,EAAK,GAE7Cn3D,EAAQ,wBAA0B,KACpC+yB,EAAS,WAAa,CAAC,EAAG,EAAG,EAAG,CAAC,GAE/BuN,GAAe,OAAOA,GAAgB,WACxCA,EAAY,4BAA8B0wK,EACtC,CACE,MAAO,KAAK,IAAI,EAAG,OAAOA,EAA4B,OAAS,CAAC,CAAC,EACjE,OAAQ,KAAK,IAAI,EAAG,OAAOA,EAA4B,QAAU,CAAC,CAAC,EACnE,iBAAkB,KAAK,IAAI,EAAG,OAAOA,EAA4B,kBAAoB,CAAC,CAAC,CACrG,EACY,MAEFA,GAA+B,OAAOC,GAAc,aAAgB,YACtEA,EAAa,YAAYD,CAA2B,EAEtDj+K,EAAS,gBAAgBuN,CAAW,EACpCvN,EAAS,OAAOoiI,CAAW,EAC3B,MAAMj0I,EAAS,MAAM6R,EAAS,WAAWuN,EAAa,CACpD,EAAGtgC,EAAQ,SAAS,EACpB,EAAGA,EAAQ,SAAS,EACpB,MAAOA,EAAQ,SAAS,MACxB,OAAQA,EAAQ,SAAS,MACjC,CAAO,EACD,OAAO21L,GACLz0K,EACAlhB,EAAQ,SAAS,MACjBA,EAAQ,SAAS,OACjBA,EAAQ,MACRA,EAAQ,OACR,CACE,MAAO+yB,EAAS,QAAQ,OAAS,SACjC,YAAaA,EAAS,QAAQ,OAAS,UAAY,OAAOA,EAAS,QAAQ,QAAU,EAAE,EAAE,WAAW,MAAM,EAC1G,UAAW/yB,EAAQ,wBAA0B,GAAOA,EAAQ,UAAY,UAClF,CACA,CACI,QAAC,CACC,MAAMq0G,EAAU,CAAC9xG,EAAKQ,EAASsE,IAAO,CACpC,GAAI,CACFA,EAAE,CACJ,OAASpD,EAAO,CACdsH,GAAS,KAAMhJ,EAAKQ,EAAS,CAAE,MAAAkB,CAAK,CAAE,CACxC,CACF,EACAowG,EAAQ,qCAAsC,uEAAwE,IAAM,CACtHl9C,IACFA,EAAW,uBAAuBg6I,CAAuB,EACzDh6I,EAAW,+BAA+Bi6I,CAAyB,GAEjE,KAAK,uBACP,KAAK,qBAAqB,iBAAmBC,EAEjD,CAAC,EACGN,GACF18F,EAAQ,oCAAqC,sEAAuE,IAAM,CACxHthF,EAAS,WAAag+K,CACxB,CAAC,EAECE,IAAiBV,GAAgBW,GAA0B,OAAOX,GAAc,aAAgB,YAClGl8F,EAAQ,wCAAyC,iEAAkE,IAAM,CACvHk8F,EAAa,YAAYW,CAAsB,CACjD,CAAC,EAEH78F,EAAQ,oCAAqC,6DAA8D,IAAM,CAC/GthF,EAAS,gBAAgB,IAAI,CAC/B,CAAC,EACDshF,EAAQ,oCAAqC,iEAAkE,IAAM,CACnH,MAAM/vF,EAASyO,EAAS,QAAU,KAClC,GAAIuN,GAAa,OAAS,SAAU,CAClC,MAAM9hB,EAAK8F,GAAQ,IAAM,KACrB9F,IACE8hB,EAAY,QAAQ9hB,EAAG,oBAAoB8hB,EAAY,MAAM,EAC7DA,EAAY,SAAS9hB,EAAG,gBAAgB8hB,EAAY,OAAO,EAC3DA,EAAY,OAAO9hB,EAAG,qBAAqB8hB,EAAY,KAAK,EAEpE,MAAWA,GAAa,OAAS,WAC/BA,EAAY,SAAS,UAAO,EAC5BA,EAAY,cAAc,UAAO,EAErC,CAAC,CACH,CACF,CAEA,sBAAsBtgC,EAAS,CAC7B,GAAI,OAAO,SAAa,IAAa,OAAO,KAC5C,MAAM+yB,EAAW,KAAK,UAAY,KAClC,GAAI,CAACA,GAAU,OAAQ,OAAO,KAC9B,MAAMu+K,EAAkB,KAAK,SAAS,YAAS,GAAQ,CAAA,EACjDC,EAAmB,KAAK,UAAU,YAAS,GAAQ,CAAE,MAAO,CAAC,EAC7DC,EAAsB,CAC1B,MAAOxxM,EAAQ,MACf,OAAQA,EAAQ,MACtB,EACUyxM,EAAoB1+K,EAAS,QAAQ,UAAY,KAAK,QAAQ,MAAQ,KAAK,MAAQy+K,EACnFE,EAAsB3yD,GAAkCyyD,EAAqBC,EAAmB,CAAC,EACjG3xD,EAAc,KAAK,IACvB,IACA,OAAOyxD,EAAiB,OAAS,CAAC,EAC9BG,EACA,OAAO1xM,EAAQ,aAAe,CAAC,CACzC,EACU2xM,EAAa,CACjB,MAAO3xM,EAAQ,MACf,OAAQA,EAAQ,OAChB,iBAAkB,CACxB,EACUgxM,EAA8BhxM,EAAQ,6BAA+Bw2L,GAA2Bx2L,CAAO,EACvGkxM,EAAyBn+K,EAAS,QAAQ,SAAW,CAAE,GAAGA,EAAS,OAAO,QAAQ,EAAK,KACvFk+K,EAAe,KAAK,yBAAyBl+K,EAAS,OAAQ/yB,CAAO,EAC3E,IAAI8wM,EAAiB,KAErB,MAAMprH,EAAM,SAAS,gBAAgB,6BAA8B,KAAK,EAMxE,GALAA,EAAI,aAAa,QAAS,4BAA4B,EACtDA,EAAI,aAAa,QAAS,GAAG1lF,EAAQ,KAAK,EAAE,EAC5C0lF,EAAI,aAAa,SAAU,GAAG1lF,EAAQ,MAAM,EAAE,EAC9C0lF,EAAI,aAAa,UAAW,OAAO1lF,EAAQ,KAAK,IAAIA,EAAQ,MAAM,EAAE,EAEhEA,EAAQ,cACV,GAAI,CACEixM,IAAiBl+K,EAAS,QAC5Bk+K,EAAa,cAAcD,CAA2B,EACtDF,EAAiBG,EAAa,cAAW,GAAQ,MACxCD,GAA+B,OAAOj+K,EAAS,QAAQ,aAAgB,aAChFA,EAAS,OAAO,YAAYi+K,CAA2B,EACvDF,EAAiB/9K,EAAS,OAAO,cAAW,GAAQ,MAEtD,MAAM6+K,EAAa,KAAK,SAAS,iBAAiB,CAChD,UAAW,YAAY,IAAG,EAC1B,SAAUd,EACV,OAAQ,CACN,WAAY9wM,EAAQ,SAAW,MAC3Bs2L,GACAgb,EAAgB,WACpB,sBAAuBtxM,EAAQ,SAAW,KACtD,CACA,CAAS,EACG4xM,GAAYlsH,EAAI,YAAYksH,CAAU,CAC5C,QAAC,CACC,GAAIV,GAA0B,OAAOn+K,EAAS,QAAQ,aAAgB,WACpE,GAAI,CACFA,EAAS,OAAO,YAAYm+K,CAAsB,CACpD,OAASjtM,EAAO,CACdsH,GACE,KACA,yCACA,mEACA,CAAE,MAAAtH,CAAK,CACrB,CACU,CAEJ,CAEF,GAAIjE,EAAQ,eAAgB,CAC1B,MAAM6xM,EAAe7xM,EAAQ,mBAAqB,GAC9C,CACE,IAAK,KAAK,IAAI,EAAG,OAAO,KAAK,gBAAgB,KAAO,CAAC,CAAC,EACtD,MAAO,KAAK,IAAI,EAAG,OAAO,KAAK,gBAAgB,OAAS,CAAC,CAAC,EAC1D,OAAQ,KAAK,IAAI,EAAG,OAAO,KAAK,gBAAgB,QAAU,CAAC,CAAC,EAC5D,KAAM,KAAK,IAAI,EAAG,OAAO,KAAK,gBAAgB,MAAQ,CAAC,CAAC,CACpE,EACU,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAC,EACpC+2F,EAAc,KAAK,UAAU,iBAAiB,CAClD,KAAM46G,EACN,OAAQE,EACR,eAAgB7xM,EAAQ,OAAS,OAAOA,EAAQ,aAAe,CAAC,EAChE,OAAQ,CACN,QAAS,GACT,kBAAmBA,EAAQ,mBAAqB,GAChD,OAAQ,OAAOuxM,EAAiB,QAAU,EAAE,EAAIG,EAChD,IAAK,OAAOH,EAAiB,KAAO,EAAE,EAAIG,EAC1C,MAAO5xD,EACP,SAAU,GACV,oBAAqB,GACrB,sBAAuB9/I,EAAQ,SAAW,MAC1C,WAAYA,EAAQ,SAAW,MAAQs2L,GAAiCib,EAAiB,UACnG,CACA,CAAO,EACGx6G,IACFA,EAAY,QAAQ,kBAAoB,GAAG+oD,CAAW,IAEpD/oD,GAAarR,EAAI,YAAYqR,CAAW,CAC9C,CACA,OAAKrR,EAAI,WAAW,OACbA,EAD4B,IAErC,CAEA,MAAM,kBAAkB3lC,EAAQ+xJ,EAAY9xM,EAAU,CAAA,EAAI,CACxD,GAAI,CAAC8xM,EAAY,CACf,GAAI9xM,EAAQ,wBAA0B,GACpC,OAAOi2L,GAAal2I,EAAQ,WAAW,EAEzC,MAAMg2I,EAAe,SAAS,cAAc,QAAQ,EACpDA,EAAa,MAAQh2I,EAAO,MAC5Bg2I,EAAa,OAASh2I,EAAO,OAC7B,MAAMytD,EAAMuoF,EAAa,WAAW,IAAI,EACxC,GAAI,CAACvoF,EAAK,MAAM,IAAI,MAAM,qDAAqD,EAC/E,OAAAA,EAAI,UAAY+oF,GAA6Bv2L,EAAQ,eAAe,EAAE,IACtEwtG,EAAI,SAAS,EAAG,EAAGuoF,EAAa,MAAOA,EAAa,MAAM,EAC1DvoF,EAAI,UAAUztD,EAAQ,EAAG,CAAC,EACnBk2I,GAAaF,EAAc,WAAW,CAC/C,CACA,MAAMA,EAAe,SAAS,cAAc,QAAQ,EACpDA,EAAa,MAAQh2I,EAAO,MAC5Bg2I,EAAa,OAASh2I,EAAO,OAC7B,MAAMytD,EAAMuoF,EAAa,WAAW,IAAI,EACxC,GAAI,CAACvoF,EAAK,MAAM,IAAI,MAAM,qDAAqD,EAC3ExtG,EAAQ,wBAA0B,KACpCwtG,EAAI,UAAY+oF,GAA6Bv2L,EAAQ,eAAe,EAAE,IACtEwtG,EAAI,SAAS,EAAG,EAAGuoF,EAAa,MAAOA,EAAa,MAAM,GAE5DvoF,EAAI,UAAUztD,EAAQ,EAAG,CAAC,EAC1B,MAAMgyJ,EAAe,MAAM3b,GAAapB,GAAgB8c,CAAU,CAAC,EACnE,OAAAtkG,EAAI,UAAUukG,EAAc,EAAG,EAAGhc,EAAa,MAAOA,EAAa,MAAM,EAClEE,GAAaF,EAAc,WAAW,CAC/C,CAEA,kBAAkBh2I,EAAQ+xJ,EAAY9xM,EAAS,CAC7C,MAAMgyM,EAAajyJ,EAAO,UAAU,WAAW,EACzCkyJ,EAAWH,EACb,MAAM,KAAKA,EAAW,UAAU,EAAE,IAAKh5K,GAASk8J,GAAgBl8J,CAAI,CAAC,EAAE,KAAK,EAAE,EAC9E,GACEo5K,EAAiBlyM,EAAQ,wBAA0B,GACrD,GACA,gBAAgBA,EAAQ,KAAK,aAAaA,EAAQ,MAAM,WAAWu2L,GAA6Bv2L,EAAQ,eAAe,EAAE,GAAG,OAC1Hq2L,EAAU,CACd,6FAA6Fr2L,EAAQ,KAAK,aAAaA,EAAQ,MAAM,kBAAkBA,EAAQ,KAAK,IAAIA,EAAQ,MAAM,KACtLkyM,EACA,iBAAiBlyM,EAAQ,KAAK,aAAaA,EAAQ,MAAM,WAAWgyM,CAAU,iBAAiBA,CAAU,OACzGC,EACA,QACN,EAAM,KAAK,EAAE,EACT,OAAO,IAAI,KAAK,CAAC5b,CAAO,EAAG,CAAE,KAAM,gBAAiB,CACtD,CAuBA,MAAM,iBAAiBr2L,EAAU,GAAI,CACnC,MAAMuqB,EAAW,KAAK,4BAA4BvqB,CAAO,EACnDkhJ,EAAgB,CACpB,GAAG32H,EACH,gBAAiB,MAAM,QAAQ,KAAK,UAAU,UAAU,EAAI,CAAC,GAAG,KAAK,SAAS,UAAU,EAAI,CAAC,EAAG,EAAG,EAAG,CAAC,EACvG,4BAA6BisK,GAA2B,CACtD,GAAGjsK,EACH,iBAAkB,CAC1B,CAAO,CACP,EACI,GAAI,CAAC22H,EAAc,eACjB,MAAM,IAAI,MACR,6BAA6BA,EAAc,WAAW,IAAIA,EAAc,YAAY,yDACzCA,EAAc,WAAW,kBAAkB,mBAC9F,EAEI,GAAI,CACF,MAAMhuH,EAAQ,MAAM,KAAK,0BAAyB,EAC5Ci/K,EAAe,MAAM,KAAK,qBAAqBjxD,EAAehuH,CAAK,EACnE4+K,EAAa,KAAK,sBAAsB5wD,CAAa,EAC3D,OAAOA,EAAc,SAAW,MAC5B,KAAK,kBAAkBixD,EAAcL,EAAY5wD,CAAa,EAC9D,MAAM,KAAK,kBAAkBixD,EAAcL,EAAY5wD,CAAa,CAC1E,QAAC,CACC,KAAK,WAAW,gBAAa,CAC/B,CACF,CAcA,MAAM,wBAAwBlhJ,EAAU,GAAImhJ,EAAiB,CAAA,EAAI,CAC/D,MAAM52H,EAAW,KAAK,4BAA4BvqB,CAAO,EACnDoyM,EAAoB,CACxB,GAAG7nL,EACH,OAAQ,MACR,gBAAiB,MAAM,QAAQ,KAAK,UAAU,UAAU,EAAI,CAAC,GAAG,KAAK,SAAS,UAAU,EAAI,CAAC,EAAG,EAAG,EAAG,CAAC,EACvG,4BAA6BisK,GAA2B,CACtD,GAAGjsK,EACH,iBAAkB,CAC1B,CAAO,CACP,EACU8nL,EAAiBpxD,GAAqCmxD,EAAmBjxD,CAAc,EACvFmxD,EAAkB,KAAK,4BAA4BD,CAAc,EACjEE,EAAuB,CAC3B,GAAGD,EACH,OAAQ,MACR,cAAeF,EAAkB,cACjC,eAAgBA,EAAkB,eAClC,YAAaA,EAAkB,YAC/B,sBAAuBA,EAAkB,sBACzC,UAAWA,EAAkB,UAC7B,gBAAiBA,EAAkB,gBACnC,4BAA6B5b,GAA2B,CACtD,MAAO4b,EAAkB,OAASE,EAAgB,MAClD,OAAQF,EAAkB,QAAUE,EAAgB,OACpD,YAAaA,EAAgB,YAC7B,aAAcA,EAAgB,aAC9B,aAAcF,EAAkB,6BAA6B,MAC7D,cAAeA,EAAkB,6BAA6B,OAC9D,iBAAkB,CAC1B,CAAO,CACP,EAEUl/K,EAAQ,MAAM,KAAK,0BAAyB,EAC5Ci/K,EAAe,MAAM,KAAK,qBAAqBI,EAAsBr/K,CAAK,EAC1E4+K,EAAa,KAAK,sBAAsBM,CAAiB,EAC/D,OAAO,MAAM,KAAK,kBAAkBD,EAAcL,EAAYS,CAAoB,CACpF,CAEA,MAAM,4BAA4BvyM,EAAU,GAAI,CAC9C,GAAI,CAEF,OADa,MAAMk2L,GAA0B,KAAK,wBAAqB,EAAMl2L,CAAO,GACrE,IACjB,MAAY,CACV,OAAO,IACT,CACF,CAgBA,MAAM,aAAawyM,EAAmBC,EAAe,GAAI,CACvD,MAAMzyM,EAAU,OAAOwyM,GAAsB,SACzC,CAAE,GAAGC,EAAc,SAAUD,CAAiB,EAC9C,CAAE,GAAIA,GAAqB,CAAA,CAAG,EAC5BjoL,EAAW,KAAK,4BAA4BvqB,CAAO,EACnDutJ,EAAO,MAAM,KAAK,iBAAiBvtJ,CAAO,EAChD,GAAI,OAAO,SAAa,IAAa,CACnC,MAAMwtJ,EAAM,IAAI,gBAAgBD,CAAI,EAC9BmlD,EAAO,SAAS,cAAc,GAAG,EACvCA,EAAK,KAAOllD,EACZklD,EAAK,SAAWnoL,EAAS,SACzBmoL,EAAK,MAAM,QAAU,OACrB,SAAS,KAAK,YAAYA,CAAI,EAC9BA,EAAK,MAAK,EACVA,EAAK,OAAM,EACX,WAAW,IAAM,IAAI,gBAAgBllD,CAAG,EAAG,GAAG,CAChD,CACA,MAAO,CACL,KAAAD,EACA,SAAUhjI,EAAS,SACnB,OAAQA,EAAS,OACjB,MAAOA,EAAS,MAChB,OAAQA,EAAS,OACjB,YAAaA,EAAS,YACtB,aAAcA,EAAS,aACvB,cAAeA,EAAS,aAC9B,CACE,CAgBA,GAAG9L,EAAMhb,EAASzD,EAAS,CAEzB,GADA,KAAK,iBAAiBye,EAAMhb,EAASzD,CAAO,EACxCA,GAAS,QAAU,OAAOA,EAAQ,OAAO,kBAAqB,WAAY,CAC5E,MAAM0rK,EAAS1rK,EAAQ,OACnB0rK,EAAO,QACT,KAAK,oBAAoBjtJ,EAAMhb,EAASzD,CAAO,EAE/C0rK,EAAO,iBAAiB,QAAS,IAAM,KAAK,oBAAoBjtJ,EAAMhb,EAASzD,CAAO,EAAG,CAAE,KAAM,EAAI,CAAE,CAE3G,CACA,MAAO,IAAM,KAAK,IAAIye,EAAMhb,EAASzD,CAAO,CAC9C,CAiBA,OAAO2yM,EAAmBlvM,EAASzD,EAAS,CAC1C,MAAMopL,EAASsI,GAAyBihB,CAAiB,EACnDhhB,EAAYvI,EAAO,WAAa,GAChC7mL,EAAM,GAAG6mL,EAAO,IAAI,KAASuI,CAAS,GACtCihB,EAAU5yM,IAAY,GAAO,GAAO,EAAQA,GAAS,QAErD09C,EAAW,KAAK,gBAAgB,IAAIn7C,CAAG,EAO7C,GANIm7C,IACF,KAAK,oBAAoB0rI,EAAO,KAAM1rI,EAAS,SAAUA,EAAS,OAAO,EACzEA,EAAS,oBAAiB,EAC1B,KAAK,gBAAgB,OAAOn7C,CAAG,GAG7BkB,GAAW,KACb,OAAO,KAET,GAAI,OAAOA,GAAY,WACrB,MAAM,IAAI,UAAU,6CAA6C,EAGnE,MAAMtB,EAAYV,GAAUgC,EAAQhC,CAAK,EACnCoxM,EAAkB7yM,IAAY,IAAQA,IAAY,GACpDA,EACA,CAAE,GAAGA,EAAS,OAAQ,MAAS,EACnC,KAAK,iBAAiBopL,EAAO,KAAMjnL,EAAU0wM,CAAe,EAE5D,IAAIC,EAAoB,KACxB,MAAMpnC,EAAS1rK,GAAS,OACxB,GAAI0rK,GAAU,OAAOA,EAAO,kBAAqB,WAC/C,GAAIA,EAAO,QACT,KAAK,oBAAoB0d,EAAO,KAAMjnL,EAAUywM,CAAO,MAClD,CACL,MAAMG,EAAU,IAAM,KAAK,OAAOJ,EAAmB,IAAI,EACzDjnC,EAAO,iBAAiB,QAASqnC,EAAS,CAAE,KAAM,GAAM,EACxDD,EAAoB,IAAMpnC,EAAO,sBAAsB,QAASqnC,CAAO,CACzE,CAGF,YAAK,gBAAgB,IAAIxwM,EAAK,CAC5B,KAAM6mL,EAAO,KACb,UAAAuI,EACA,SAAAxvL,EACA,QAAAywM,EACA,kBAAAE,CACN,CAAK,EAEM,IACT,CAWA,IAAIr0L,EAAMhb,EAASzD,EAAS,CAC1B,KAAK,oBAAoBye,EAAMhb,EAASzD,CAAO,CACjD,CAWA,MAAMyD,EAASzD,EAAS,CACtB,GAAI,OAAOyD,GAAY,WAAY,MAAO,IAAM,CAAC,EACjD,KAAK,cAAc,IAAIA,CAAO,EAC9B,MAAMk1G,EAAc,IAAM,KAAK,cAAc,OAAOl1G,CAAO,EAC3D,GAAIzD,GAAS,QAAU,OAAOA,EAAQ,OAAO,kBAAqB,WAAY,CAC5E,MAAM0rK,EAAS1rK,EAAQ,OACnB0rK,EAAO,QACT/yD,EAAW,EAEX+yD,EAAO,iBAAiB,QAAS/yD,EAAa,CAAE,KAAM,GAAM,CAEhE,CACA,OAAOA,CACT,CAWA,KAAKl6F,EAAMhT,EAAQ,CACjB,MAAMhK,EAAQ,IAAI,YAAYgd,EAAM,CAAE,OAAAhT,CAAM,CAAE,EAE9C,GADA,KAAK,cAAchK,CAAK,EACpB,KAAK,eAAe,KACtB,UAAWgC,KAAW,KAAK,cACzB,GAAI,CACFA,EAAQ,CAAE,KAAAgb,EAAM,OAAAhT,EAAQ,MAAAhK,EAAO,OAAQ,KAAM,CAC/C,OAASwC,EAAO,CAEd,QAAQ,MAAM,8BAA+BA,CAAK,CACpD,CAGJ,OAAOxC,CACT,CAWA,MAAM,YAAa,CACjB,KAAK,MAAM,IAAI,SAAU,qBAAqB,EAC9C,KAAK,6BAA6B,KAAK,QAAS,CAAE,mBAAoB,GAAO,EACzE,KAAK,SAAS,mBAChB,KAAK,QAAQ,kBAAmB+E,GAAY,KAAK,oBAAoBA,CAAO,CAAC,EAE/E,MAAM,KAAK,SAAS,aAAU,EAC9B,KAAK,6BAA6B,KAAK,QAAS,CAAE,mBAAoB,GAAO,EAC7E,KAAK,MAAM,IAAI,SAAU,qBAAsB,CAAE,OAAQ,KAAK,SAAS,aAAa,IAAI,CAAE,EAC1F,KAAK,SAAS,SAAS,KAAK,OAAO,IAAI,EACvC,KAAK,MAAM,IAAI,SAAU,qCAAsC,KAAK,OAAO,IAAI,EAE/E,KAAK,MAAM,IAAI,SAAU,oBAAqB,CAC5C,KAAM,KAAK,QAAQ,MAAQ,KAC3B,WAAY,KAAK,QAAQ,YAAc,cACvC,SAAU,KAAK,QAAQ,UAAY,MACzC,CAAK,EACD,MAAM0kM,EAAqB,KAAK,QAAQ,iBAAmB,EACrDC,EAAkB,OAAO,SAASD,CAAkB,EAAI,KAAK,IAAI,EAAG,KAAK,MAAMA,CAAkB,CAAC,EAAI,EACtG7xK,EAAa,KAAK,IAAI,GAAI,EAAI8xK,CAAe,EACnD,KAAK,SAAW,MAAMx/I,GAAe,KAAK,OAAO,OAAQ,CACvD,WAAY,KAAK,QAAQ,WACzB,WAAY,KAAK,QAAQ,WAAa,QACtC,YAAa,KAAK,QAAQ,WAAa,SACvC,KAAM,KAAK,QAAQ,MAAQ,KAC3B,WAAY,KAAK,QAAQ,YAAc,cACvC,wBAAyB,KAAK,QAAQ,0BAA4B,GAClE,UAAW,KAAK,QAAQ,UACxB,gBAAiB,KAAK,QAAQ,gBAC9B,uBAAwB,KAAK,QAAQ,uBACrC,qBAAsB,KAAK,QAAQ,qBACnC,uBAAwB,KAAK,QAAQ,uBACrC,0BAA2B,KAAK,QAAQ,0BACxC,cAAe,KAAK,QAAQ,cAC5B,iBAAkB,KAAK,QAAQ,iBAC/B,wBAAyB,KAAK,QAAQ,wBACtC,2BAA4B,KAAK,QAAQ,2BACzC,cAAe,KAAK,QAAQ,cAC5B,sBAAuB,KAAK,QAAQ,sBACpC,iBAAkB,KAAK,QAAQ,iBAC/B,6BAA8B,KAAK,QAAQ,6BAC3C,kBAAmB,KAAK,QAAQ,kBAChC,WAAAtyB,CACN,CAAK,EACD,KAAK,MAAM,IAAI,SAAU,mBAAoB,CAAE,SAAU,KAAK,UAAU,aAAa,IAAI,CAAE,EAC3F,KAAK,2BAA0B,EAC/B,KAAK,iCAAgC,EACrC,KAAK,oBAAmB,EACxB,KAAK,wBAAuB,EAC5B,KAAK,iBAAmB,IAAIsrC,GAAiB,KAAK,QAAQ,EAC1D,KAAK,iBAAiB,OAAO,KAAK,OAAO,IAAI,EACzC,OAAO,KAAK,SAAS,QAAW,YAClC,KAAK,SAAS,OAAO,KAAK,OAAO,IAAI,EAEvC,KAAK,iCAAgC,EACjC,KAAK,cACP,KAAK,oBAAmB,EAE1B,KAAK,UAAU,qBACZzxC,GAAU,CACJA,IACL,KAAK,SAAS,qBAAuBmf,GAAY,KAAK,SAAS,oBAAoB,EACnF,KAAK,kBAAkB,OAAOnf,EAAO,EAAK,EAC1C,KAAK,qBAAqB,OAAOA,EAAO,EAAK,EAC/C,EACA,CACE,WAAY,KAAK,uBAAuB,WACxC,OAAQ,KAAK,uBAAuB,OACpC,UAAW,KAAK,uBAAuB,SAC/C,CACA,EACI,KAAK,UAAU,uBAAuB,CACpC,MAAQ1sB,GAAY,CAClB,KAAK,KAAKulI,GAAO,aAAc,CAAE,GAAGvlI,EAAS,KAAM,KAAK,SAAS,aAAa,MAAQ,IAAI,CAAE,CAC9F,EACA,KAAOA,GAAY,CACjB,KAAK,KAAKulI,GAAO,YAAa,CAAE,GAAGvlI,EAAS,KAAM,KAAK,SAAS,aAAa,MAAQ,IAAI,CAAE,EAC3F,KAAK,WAAW,gBAAa,CAC/B,CACN,CAAK,EACG,KAAK,UAAU,QAAQ,mBACzB,KAAK,SAAS,OAAO,kBAAmBiF,GAAW,CACjD,KAAK,UAAU,cAAa,EAC5B,KAAK,mCAAmCA,CAAM,EAC1CA,GAAQ,SAAW,eACrB,KAAK,8CAA8CA,CAAM,EAE3D,KAAK,oBAAoBA,CAAM,EAC/B,KAAK,MAAM,IAAI,SAAU,gCAAgC,CAC3D,CAAC,EAGH,KAAK,qBAAuB,KAAK,OAAO,SAAUhD,GAAS,CACzD,KAAK,KAAOA,EACR,KAAK,UAAU,QACjB,KAAK,SAAS,OAAOA,CAAI,EAE3B,KAAK,kBAAkB,OAAOA,CAAI,EAClC,KAAK,qBAAqB,OAAOA,CAAI,EACrC,KAAK,SAAS,SAASA,CAAI,EAC3B,KAAK,SAAS,sBAAsB,QAAQ,EAC5C,KAAK,wBAAuB,EAC5B,KAAK,qBAAoB,EACpB,KAAK,kBACR,KAAK,UAAU,gBAAe,EAC9B,KAAK,UAAU,cAAa,EAC5B,KAAK,MAAM,IAAI,SAAU,mCAAoCA,CAAI,GAEnE,KAAK,KAAKsjI,GAAO,OAAQ,CAAE,KAAM,CAAE,GAAGtjI,CAAI,EAAI,CAChD,CAAC,EAED,KAAK,MAAM,IAAI,YAAa,6BAA6B,EACzD,KAAK,UAAU,UAAU,KAAK,OAAO,EACrC,KAAK,UAAU,oBAAoB,IAAM,CACvC,KAAK,SAAS,eAAiB4pC,GAAY,KAAK,SAAS,cAAc,EACnE,KAAK,eACP,KAAK,MAAM,IAAI,SAAU,6BAA6B,EACtD,KAAK,oBAAmB,GAE1B,MAAM2gK,EAAgB,KAAK,kBAAiB,EACtC9/K,EAAQ,CACZ,QAAS8/K,EACT,UAAW,YAAY,IAAG,EAC1B,OAAQ,KAAK,UAAU,MAC/B,EACM,OAAK,KAAK,4BAOR,KAAK,MAAM,IAAI,YAAa,0BAA2B,CACrD,MAAOA,GAAe,WAAa,KAAK,SAAS,UACjD,MAAOA,GAAe,WAAa,KAAK,SAAS,SAC3D,CAAS,GATD,KAAK,4BAA8B,GACnC,KAAK,MAAM,IAAI,YAAa,6BAA8B,CACxD,MAAOA,GAAe,WAAa,KAAK,SAAS,UACjD,MAAOA,GAAe,WAAa,KAAK,SAAS,SAC3D,CAAS,GAOH,KAAK,wBAAuB,EACrB9/K,CACT,CAAC,EACD,KAAK,UAAU,kBAAmBA,GAAU,CAC1C,MAAMrvB,EAAM,YAAY,IAAG,EAC3B,GAAI,KAAK,6BAA6BA,CAAG,EACvC,YAAK,+BAA8B,EAC5B,GAQT,GANA,KAAK,+BAA+B,CAAE,MAAO,EAAI,CAAE,EACnD,KAAK,gCAA+B,EACpC,KAAK,MAAM,IAAI,YAAa,kBAAmB,CAC7C,SAAU,KAAK,UAAU,aAAa,KACtC,KAAM,KAAK,IACnB,CAAO,EACG,KAAK,6BAA+B,KAAK,UAAY,OAAO,KAAK,SAAS,QAAW,WAAY,CACnG,KAAK,SAAS,aAAewuC,GAAY,KAAK,SAAS,YAAY,EACnE,MAAM1mB,EAAK9nB,EAAM,KAAK,gBACtB,KAAK,gBAAkBA,EACvB,KAAK,UAAY,EACjB,KAAK,uCAAuCA,CAAG,EAC/C,KAAK,KAAKkoI,GAAO,cAAe,CAAE,QAAS,KAAK,SAAU,GAAApgH,EAAI,MAAAuH,EAAO,KAAM,CAAE,GAAG,KAAK,IAAI,CAAE,CAAE,EAC7F,MAAMtuB,EAAc,YAAY,IAAG,EACnC,KAAK,SAAS,OAAOsuB,EAAO,KAAK,IAAI,EACrC,MAAM+/K,EAAY,YAAY,IAAG,EACjC,KAAK,sCACH,KAAK,gCAAgCA,EAAYruM,EAAa+mB,CAAE,EAChEsnL,CACV,EACQ,KAAK,SAAS,SAAS,CAAE,UAAWpvM,CAAG,CAAE,EACzC,KAAK,UAAU,SAAS,CAAE,UAAWA,CAAG,CAAE,EAC1C,KAAK,KAAKkoI,GAAO,aAAc,CAAE,QAAS,KAAK,SAAU,GAAApgH,EAAI,MAAAuH,EAAO,KAAM,CAAE,GAAG,KAAK,IAAI,CAAE,CAAE,CAC9F,CACF,CAAC,EACD,IAAIggL,EAAwB,GACxB,KAAK,SAAS,OAAS,OAAO,KAAK,QAAQ,MAAM,MAAS,YAC5D,MAAM,KAAK,QAAQ,MAAM,MAAOjvM,IAC9B,QAAQ,KAAK,iDAAkDA,CAAK,EAC7D,KACR,EAEH,MAAM08L,EAAiB,KAAK,4BAA8B,OAAO,KAAK,4BAA+B,SACjG,KAAK,2BACL,CAAA,EASJ,GARI,KAAK,6BAA+B,KAKtCuS,EAJmB,KAAK,SAAS,mBAAmB,CAClD,GAAGvS,EACH,aAAc,EACtB,CAAO,GACqC,MAAQ,KAAK,SAAS,cAAc,WAAa,IAEzF,MAAM,KAAK,sBAAqB,EAC5BuS,EAAuB,CACrBvS,EAAe,UAAY,GAC7B,KAAK,sBAAwB,MAAM,KAAK,SAAS,uBAAuB,CACtE,GAAGA,EACH,eAAgBA,EAAe,iBAAmB,EAC5D,CAAS,EACQA,EAAe,sBAAwB,IAChD,MAAM,KAAK,SAAS,cAAc,CAChC,GAAGA,EACH,GAAIA,EAAe,IAAMA,EAAe,WAAa,KAAK,SAAS,WAAa,OAChF,cAAeA,EAAe,eAAiBA,EAAe,oBAAoB,MAC5F,CAAS,EAEH,MAAMwS,EAAgB,KAAK,SAAS,oBAAiB,GAAQ,CAAA,EACvDvoD,EAAcuoD,EAAc,aAAe,CAAA,EACZxS,EAAe,qBAAuB,IACtE,KAAK,SAAS,MAAM,+BAAgC,EAAI,IAAM,IAC9DwS,EAAc,yBAA2B,IACzCvoD,EAAY,SAAW,SACvBA,EAAY,SAAW,WACvBA,EAAY,SAAW,SAE1B,KAAK,SAAS,mBAAmBA,EAAY,QAAU,yBAAyB,CAEpF,CAEA,GADA,KAAK,gCAA+B,EAChC,CAAC,KAAK,gBACR,KAAK,UAAU,MAAK,EACpB,KAAK,UAAU,gBAAe,EAC9B,KAAK,MAAM,IAAI,YAAa,oCAAoC,MAC3D,CAEL,GAAI,KAAK,aAAc,CACrB,MAAMhxE,EAAa,KAAK,WAAW,iBAAgB,EAC7CK,EAAa,KAAK,WAAW,iBAAiB,CAAE,WAAAL,CAAU,CAAE,EAClE,KAAK,QAAQ,aAAa,CAAE,WAAAA,EAAY,WAAAK,CAAU,CAAE,EACpD,KAAK,aAAe,EACtB,CACA,KAAK,4BAA8B,GACnC,KAAK,MAAM,IAAI,SAAU,oDAAoD,CAC/E,CACA,YAAK,oBAAmB,EACxB,KAAK,sCAAqC,EAC1C,KAAK,MAAM,IAAI,SAAU,yBAAyB,EAC3C,IACT,CAEA,yBAA0B,CACxB,MAAM7uB,EAAQ,KAAK,UAAU,YAAc,KAC3C,GAAI,CAACA,EAAO,MAAO,GACnB,MAAM/9B,EAAS,KAAK,iBAEpB,GADI,CAACA,GACD,CAACA,EAAO,UAAU,MAAQ,CAACA,EAAO,UAAU,MAAQ,CAACA,EAAO,aAAe,CAACA,EAAO,aAAe,CAACA,EAAO,WAAa,CAACA,EAAO,UACjI,MAAO,GAET+9B,EAAM,mBAAgB,EAClB/9B,EAAO,aACT+9B,EAAM,sBAAsB/9B,EAAO,WAAW,EAE5CA,EAAO,aACT+9B,EAAM,sBAAsB/9B,EAAO,WAAW,EAE5CA,EAAO,WACT+9B,EAAM,oBAAoB/9B,EAAO,SAAS,EAExCA,EAAO,WACT+9B,EAAM,oBAAoB/9B,EAAO,SAAS,EAE5C,SAAW,CAAC6J,EAAMF,CAAK,IAAK3J,EAAO,UAAU,UAC3C+9B,EAAM,oBAAoBl0B,EAAMF,CAAK,EAEvC,SAAW,CAACE,EAAMF,CAAK,IAAK3J,EAAO,UAAU,UAC3C+9B,EAAM,oBAAoBl0B,EAAMF,CAAK,EAEvC,MAAO,EACT,CAEA,0BAA0B3vB,EAAI,CAC5B,OAAI,OAAO,KAAK,SAAS,kBAAqB,WACrC,KAAK,QAAQ,iBAAiBA,CAAE,EAErC,OAAO,KAAK,SAAS,kBAAqB,WACrC,KAAK,QAAQ,iBAAiBA,CAAE,EAElCA,EAAE,CACX,CAEA,+BAA+Bf,EAASe,EAAI,CAC1C,OAAI,OAAOf,GAAS,kBAAqB,WAChCA,EAAQ,iBAAiBe,CAAE,EAE7B,KAAK,0BAA0BA,CAAE,CAC1C,CAEA,6BAA8B,CAC5B,GAAI,CACF,OAAO,KAAK,SAAS,yBAAyBvC,EAAuB,GAAG,MAAQ,IAClF,OAASb,EAAO,CACd,OAAAsH,GACE,KACA,qBACA,6CACA,CAAE,MAAAtH,CAAK,CACf,EACa,IACT,CACF,CAEA,uBAAuBmvM,EAAc,KAAM,CACzC,IAAI3sM,EAAW,KACf,YAAK,0BAA0B,IAAM,CACnC,MAAMI,EAAO,KAAK,4BAA2B,EAC7C,GAAI,CAACA,GAAQ,CAAC,OAAO,SAASA,EAAK,MAAM,GAAKA,EAAK,QAAU,EAAG,CAC9DJ,EAAW,KACX,MACF,CACA,MAAMiL,EAAM0hM,GAAeA,EAAY,SAAWvsM,EAAK,OACnDusM,EACA,IAAI,aAAavsM,EAAK,MAAM,EAChC6K,EAAI,IAAI7K,CAAI,EACZJ,EAAWiL,CACb,CAAC,EACMjL,CACT,CAEA,yBAAyBA,EAAUzG,EAAU,GAAI,CAC/C,MAAMqD,EAAS,KAAK,SAAW,KACzBwH,EAAY,KAAK,WAAa,KAC9B6kH,EAAc,OAAO7kH,GAAW,gBAAmB,WACrDA,EAAU,eAAc,EACvBA,GAAW,gBAAkB,GAAQ,UAAY,UAChDijL,EAAmB,OAAO,SAAS9tL,EAAQ,gBAAgB,EAC7D,KAAK,IAAI,EAAG,OAAOA,EAAQ,gBAAgB,CAAC,EAC5C8wL,GACEvnL,EAAQ,KAAK,iBAAiBlG,CAAM,EACpCqF,EAAS,KAAK,+BAA+BjC,EAAU,KAAK,OAAO,EACnEy/H,EAAiB,KAAK,WAAW,MAAM,QAAQ,GAAK,KAAK,WAAW,QAAU,KAI9E09D,GAHyB5jM,EAAQ,iBAAmB,WACtD,WACCA,EAAQ,iBAAmB,UAAY,UAAY,QACN,KAAK,kBAAkB,SAAW,WAAa,WAAa,WACxGo3B,EAAWwsK,IAAmB,WAC/B5jM,EAAQ,UAAY,KAAK,kBAAkB,UAAY,KAAK,yBAA2BqD,GAAQ,sBAAmB,GAAQA,GAAQ,kBAAoB,KACvJ,KACEyH,EAAQ,CACZ,OAAQ,kCACR,QAAS,EACT,WAAY,KAAK,IAAG,EACpB,WAAYo7H,GAAgB,OAAI,GAAQ7iI,GAAQ,aAAa,MAAQ,KACrE,eAAAugM,EACA,aAAcxsK,GAAU,aAAa,MAAQ,KAC7C,KAAM,KAAK,OAAI,IAAS,KAAO,KAAO,KACtC,YAAAs4F,EACA,cAAe7kH,GAAW,gBAAkB,GAC5C,QAAS6kH,IAAgB,UACzB,UAAW,OAAO,SAAS,KAAK,SAAS,SAAS,EAAI,OAAO,KAAK,QAAQ,SAAS,EAAI,KACvF,MAAO,OAAO,SAASnmH,CAAK,EAAIA,EAAQ,KACxC,OAAAb,EACA,UAAW,IACjB,EACI,OAAIjC,aAAoB,cAAgBA,EAAS,OAAS,IACpDA,EAAS,YAAcqnL,EACzBhjL,EAAM,UAAY,CAChB,SAAU,iBACV,OAAQrE,EAAS,OACjB,WAAYA,EAAS,WACrB,KAAM4qL,GAAyB5qL,CAAQ,CACjD,EAEQqE,EAAM,iBAAmB,CACvB,OAAQ,aACR,WAAYrE,EAAS,WACrB,SAAUqnL,CACpB,GAGWhjL,CACT,CAYA,2BAA2B9K,EAAU,GAAI,CACvC,MAAMyG,EAAWzG,EAAQ,mBAAqB,GAAQ,KAAO,KAAK,uBAAsB,EACxF,OAAO,KAAK,yBAAyByG,EAAUzG,CAAO,CACxD,CAYA,MAAM,gCAAgCA,EAAU,GAAI,CAClD,GAAIA,EAAQ,mBAAqB,GAAO,OAAO,KAAK,yBAAyB,KAAMA,CAAO,EAC1F,IAAIyG,EAAW,KACXm9L,EAAiB,UACjByP,EAAmB,KACvB,GAAIrzM,EAAQ,qBAAqB,aAC/ByG,EAAW,IAAI,aAAazG,EAAQ,SAAS,EAC7C4jM,EAAiB5jM,EAAQ,iBAAmB,WAAa,WAAa,UACtEqzM,EAAmBrzM,EAAQ,UAAY,SAClC,CACL,MAAM2C,EAAS,KAAK,kBAAoB,CAAE,OAAQ,UAAW,SAAU,IAAI,EACrEU,EAAS,KAAK,SAAW,KACzB+zB,EAAWp3B,EAAQ,UACpB2C,EAAO,UACP,KAAK,yBACLU,GAAQ,sBAAmB,GAC3BA,GAAQ,kBACR,KAML,GAL0B+zB,IACxBz0B,EAAO,SAAW,YACf3C,EAAQ,iBAAmB,IAC3B,KAAK,OAAI,IAAS,MAGrB,GAAI,CACFyG,EAAW,MAAM,KAAK,0BAA0B,CAC9C,GAAGzG,EACH,SAAAo3B,EACA,MAAOp3B,EAAQ,OAAS,iBACxB,OAAQA,EAAQ,QAAU,yBACtC,CAAW,EACGyG,aAAoB,cAAgBA,EAAS,OAAS,IACxDm9L,EAAiB,WACjByP,EAAmBj8K,EAEvB,OAASnzB,EAAO,CACd,QAAQ,KAAK,oGAAqGA,CAAK,CACzH,EAEE,EAAEwC,aAAoB,eAAiBA,EAAS,QAAU,KAC5DA,EAAW,KAAK,uBAAsB,EACtCm9L,EAAiB,UACjByP,EAAmB,KAEvB,CACA,OAAO,KAAK,yBAAyB5sM,EAAU,CAC7C,GAAGzG,EACH,eAAA4jM,EACA,SAAUyP,CAChB,CAAK,CACH,CAYA,0BAA0BvoM,EAAQ,GAAI9K,EAAU,CAAA,EAAI,CAClD,GAAI,CAAC8K,GAAS,OAAOA,GAAU,SAAU,MAAO,GAChD,MAAMzH,EAAS,KAAK,SAAW,KACzBwH,EAAY,KAAK,WAAa,KACpC,IAAIyoM,EAAoB,GACxB,MAAMl+I,EAAUtqD,EAAM,WAAa,OAAOA,EAAM,WAAc,SAAWA,EAAM,UAAY,KAC3F,GAAIsqD,GAAS,WAAa,kBAAoB,OAAOA,EAAQ,MAAS,SAAU,CAC9E,MAAM3uD,EAAW6qL,GAAyBl8H,EAAQ,KAAMA,EAAQ,MAAM,EAChE3rD,EAAU,KAAK,uBAAsB,EAC3C,GACEhD,aAAoB,cACjBgD,aAAmB,cACnBhD,EAAS,SAAWgD,EAAQ,OAC/B,EACoB,KAAK,OAAI,IAAS,KAAO,KAAO,QAChC,MAClBqvL,GAAuBryL,EAAUmyL,GAAqCv1L,CAAM,CAAC,EAE/E,MAAM+zB,EAAW,KAAK,kBAAkB,SAAW,WAC9C,KAAK,kBAAkB,UAAY/zB,GAAQ,yBAA2BA,GAAQ,kBAAoB,KAClGA,GAAQ,sBAAmB,GAAQA,GAAQ,kBAAoB,KACpE,GAAI+zB,GAAY,OAAOA,EAAS,uBAA0B,WAAY,CACpE,MAAMm8K,EAAwB,OAAOn8K,EAAS,OAAO,EACrDk8K,EAAoBl8K,EAAS,sBAAsB3wB,EAAU,CAC3D,GAAG,KAAK,8BAA8B,CACpC,MAAO,yBACP,OAAQzG,EAAQ,QAAU,wBACxC,CAAa,EACD,OAAQ,MAAM,QAAQ8K,EAAM,MAAM,EAAIA,EAAM,OAAS,OACrD,YAAazH,GAAQ,SAAS,aAAe+zB,GAAU,SAAS,WAC5E,CAAW,IAAM,GAELk8K,GACG,OAAOl8K,EAAS,aAAgB,YAChC,OAAOA,EAAS,OAAO,IAAMm8K,GAEhCn8K,EAAS,YAAW,CAExB,CACA,MAAMo8K,EAAcnwM,GAAQ,2BAA2BoD,EAAU,CAC/D,WAAY,GACZ,cAAe,EACzB,CAAS,IAAM,GACDU,EAAe,KAAK,oBAAoBV,CAAQ,EAEtD,GADA6sM,EAAoBA,GAAqBE,GAAersM,EACpDmsM,EAAmB,CACrB,MAAMnjH,EAAU,KAAK,2BAA2B,CAAE,iBAAkB,GAAO,oBAAqB,GAAM,EACtGA,EAAQ,sBAAwB,IAAI,aAAa1pF,CAAQ,EACzD,KAAK,sBAAwB0pF,EAC7B,KAAK,SAAS,qBAAkB,EAChC,KAAK,SAAS,qBAAqBrrF,EAAuB,EAC1D,KAAK,iCAAgC,EACrC,KAAK,gCAA+B,EACpC,KAAK,WAAW,kBAAe,EAC/B,KAAK,WAAW,gBAAa,EAC7B,KAAK,SAAS,sBAAsB9E,EAAQ,QAAU,wBAAwB,CAChF,CACF,CACF,CAEA,MAAMuJ,EAAQ,OAAOuB,EAAM,KAAK,EAChC,GAAI,OAAO,SAASvB,CAAK,EAAG,CAC1B,MAAMb,EAAS,MAAM,QAAQoC,EAAM,MAAM,EAAIA,EAAM,OAAS,OACxD,OAAOzH,GAAQ,mBAAsB,YACvCA,EAAO,kBAAkB,CAAE,MAAAkG,EAAO,OAAAb,CAAM,CAAE,GAE3BrF,GAAQ,sBAAmB,GAAQA,GAAQ,kBAAoB,OACtE,gBAAgB,CAAE,MAAAkG,EAAO,CACrC,CAEA,OAAIsB,GAAa7K,EAAQ,kBAAoB,KACvC8K,EAAM,cAAgB,WAAaA,EAAM,UAAY,IACvDD,EAAU,mBAAmB,GAAM7K,EAAQ,QAAU,wBAAwB,EAC7E6K,EAAU,gBAAgB7K,EAAQ,QAAU,wBAAwB,GAC3D8K,EAAM,cAAgB,OAC/BD,EAAU,mBAAmB,GAAO,MAAM,EAE1CA,EAAU,mBAAmB,GAAO7K,EAAQ,QAAU,wBAAwB,GAG3EszM,CACT,CAEA,uCAAuCtzM,EAAU,GAAI,CACnD,MAAMyG,EAAW,KAAK,uBAAsB,EAC5C,GAAI,EAAEA,aAAoB,eAAiBA,EAAS,QAAU,EAAG,MAAO,GACxE,MAAMpD,EAAS,KAAK,SAAW,KACzB2qL,EAAehuL,EAAQ,oBAAsB,OAAOA,EAAQ,oBAAuB,SACrFA,EAAQ,mBACR,CAAA,EACJ,IAAIyzM,EAAU,GACd,MAAMr8K,EAAW/zB,GAAQ,sBAAmB,GAAQA,GAAQ,kBAAoB,KAehF,GAdI+zB,GAAY,OAAOA,EAAS,uBAA0B,aACxDq8K,EAAUr8K,EAAS,sBAAsB3wB,EAAU,CACjD,GAAG,KAAK,8BAA8B,CACpC,MAAO,kBACP,OAAQzG,EAAQ,QAAU,yBACpC,CAAS,EACD,OAAQ,MAAM,QAAQguL,EAAa,MAAM,EAAIA,EAAa,OAAS,OACnE,YAAa3qL,GAAQ,SAAS,aAAe+zB,GAAU,SAAS,WACxE,CAAO,IAAM,IAAQq8K,GAEjBA,EAAUpwM,GAAQ,2BAA2BoD,EAAU,CACrD,WAAY,GACZ,cAAe,EACrB,CAAK,IAAM,IAAQgtM,EACX,CAACA,EAAS,MAAO,GACrB,MAAMtjH,EAAU,KAAK,2BAA2B,CAAE,iBAAkB,GAAO,oBAAqB,GAAM,EACtG,OAAAA,EAAQ,sBAAwB,IAAI,aAAa1pF,CAAQ,EACzD,KAAK,sBAAwB0pF,EAC7B,KAAK,iCAAgC,EACrC,KAAK,gCAA+B,EACpC,KAAK,WAAW,kBAAe,EAC/B,KAAK,WAAW,gBAAa,EAC7B,KAAK,SAAS,sBAAsBnwF,EAAQ,QAAU,yBAAyB,EACxE,EACT,CAEA,oBAAoBiR,EAAQ,CAC1B,GAAI,CAACA,GAAU,CAAC,OAAO,SAASA,EAAO,MAAM,GAAKA,EAAO,QAAU,EAAG,MAAO,GAC7E,IAAIvK,EAAQ,GACZ,YAAK,0BAA0B,IAAM,CACnC,MAAMG,EAAO,KAAK,4BAA2B,EAC7C,GAAI,CAACA,GAAQ,CAAC,OAAO,SAASA,EAAK,MAAM,GAAKA,EAAK,QAAU,EAAG,OAChE,MAAMC,EAAQ,KAAK,IAAID,EAAK,OAAQoK,EAAO,MAAM,EAC7CnK,GAAS,IACbD,EAAK,IAAIoK,EAAO,SAAS,EAAGnK,CAAK,EAAG,CAAC,EACrCJ,EAAQ,GACV,CAAC,EACMA,CACT,CAEA,4BAA4BynG,EAAYtqG,EAAM,YAAY,IAAG,EAAI,CAC/D,MAAMssF,EAAU,KAAK,uBAAyB,CAAA,EACxCttF,EAAS,KAAK,sBAAwBk4L,GACtCpvK,EAAK,OAAOwiF,CAAU,EAC5B,GAAI,CAAC,OAAO,SAASxiF,CAAE,GAAKA,GAAM,EAAG,OACrC,MAAM04K,EAAarI,GACjBn5L,EAAO,wBACPk4L,GAAgC,wBAChC,EACA,GACN,EACUjtB,EAAWl4B,GACf/yI,EAAO,yBACPk4L,GAAgC,yBAChC,IACA,GACN,EACUvsI,EAAU,MAAM,QAAQ2hC,EAAQ,iBAAiB,EAAIA,EAAQ,kBAAoB,CAAA,EACvF3hC,EAAQ,KAAK,CAAE,GAAA7iC,EAAI,GAAI9nB,CAAG,CAAE,EAC5B,MAAMigL,EAASjgL,EAAMiqK,EACfqW,EAAS31H,EAAQ,OAAQphC,GAAUA,GAAS,OAAO,SAASA,EAAM,EAAE,GAAKA,EAAM,IAAM02J,CAAM,EAC7FK,EAAO,OAASkgB,GAClBlgB,EAAO,OAAO,EAAGA,EAAO,OAASkgB,CAAU,EAE7Cl0G,EAAQ,kBAAoBg0F,EAC5B,KAAK,sBAAwBh0F,CAC/B,CAEA,gCAAgCtsF,EAAM,YAAY,MAAO,CACvD,MAAMssF,EAAU,KAAK,uBAAyB,CAAA,EACxCttF,EAAS,KAAK,sBAAwBk4L,GACtC2Y,EAAe9V,GAAiC/6L,CAAM,EACtD8wM,EAAgB/9D,GACpB/yI,EAAO,WACPk4L,GAAgC,WAChC,EACA,GACN,EACI,GAAI2Y,IAAiB,WACnB,OAAOC,EAET,MAAMnlJ,EAAU,MAAM,QAAQ2hC,EAAQ,iBAAiB,EAAIA,EAAQ,kBAAoB,CAAA,EACvF,GAAI3hC,EAAQ,SAAW,EACrB,OAAOmlJ,EAET,MAAMtP,EAAarI,GACjBn5L,EAAO,wBACPk4L,GAAgC,wBAChC,EACA,GACN,EACUjtB,EAAWl4B,GACf/yI,EAAO,yBACPk4L,GAAgC,yBAChC,IACA,GACN,EACUjX,EAASjgL,EAAMiqK,EACfqW,EAAS31H,EAAQ,OAAQphC,GAAUA,GAAS,OAAO,SAASA,EAAM,EAAE,GAAKA,EAAM,IAAM02J,CAAM,EACjG,GAAIK,EAAO,SAAW,EACpB,OAAOwvB,EAET,MAAMC,EAAWzvB,EAAO,OAASkgB,EAAalgB,EAAO,MAAMA,EAAO,OAASkgB,CAAU,EAAIlgB,EAEnF0vB,EADMD,EAAS,OAAO,CAAC3nH,EAAK7+D,IAAU6+D,EAAM7+D,EAAM,GAAI,CAAC,EACvCwmL,EAAS,OACzB7kL,EAAQ6mH,GACZ/yI,EAAO,sBACPk4L,GAAgC,sBAChC,EACA,EACN,EACU+Y,EAAcl+D,GAClB/yI,EAAO,sBACPk4L,GAAgC,sBAChC,EACA,GACN,EACUgZ,EAAcn+D,GAClB/yI,EAAO,sBACPk4L,GAAgC,sBAChC+Y,EACA,GACN,EACUE,EAAWH,EAAU9kL,EAC3B,OAAK,OAAO,SAASilL,CAAQ,EACtB,KAAK,IAAIF,EAAa,KAAK,IAAIC,EAAaC,CAAQ,CAAC,EADrBL,CAEzC,CAEA,4BAA4B9vM,EAAM,YAAY,MAAO,CACnD,MAAMssF,EAAU,KAAK,uBAAyB,KACxCttF,EAAS,KAAK,sBAAwBk4L,GAC5C,GAAI,CAAC5qG,EAAS,MAAO,GACrB,MAAMriC,EAAa,OAAO,SAASqiC,EAAQ,mBAAmB,EAC1D,KAAK,IAAI,EAAG,OAAOA,EAAQ,mBAAmB,CAAC,EAC/C,KAAK,gCAAgCtsF,CAAG,EAE5C,GADAssF,EAAQ,oBAAsBriC,EAC1BA,GAAc,EAAG,MAAO,GAC5B,MAAME,EAAY,OAAO,SAASmiC,EAAQ,SAAS,EAAIA,EAAQ,UAAYtsF,EACrEC,EAAU,KAAK,IAAI,EAAGD,EAAMmqD,CAAS,EACrCue,EAASr7C,GAAQptB,EAAUgqD,EAAY,CAAC,EAC9C,OAAO+vI,GAAyBh7L,EAAO,OAAQ0pE,CAAM,CACvD,CAEA,oCAAoC1oE,EAAKowM,EAAiB,CACxD,GAAI,CAACA,GAAmB,CAACA,EAAgB,OAAQ,OAAO,KACxD,MAAM9jH,EAAU,KAAK,uBAAyB,KAC9C,GAAI,CAACA,EAAS,OAAO,IAAI,aAAa8jH,CAAe,EACrD,MAAMntM,EAAQmtM,EAAgB,OACxBtxM,EAASwtF,EAAQ,gBACjBjvF,EAASivF,EAAQ,gBACvB,GACEA,EAAQ,SAAW,IAChBxtF,GAAUzB,GACVyB,EAAO,SAAWmE,GAClB5F,EAAO,SAAW4F,EACrB,CACA,MAAMuwB,EAAS,KAAK,4BAA4BxzB,CAAG,EAC7CqwM,EAAQ,IAAI,aAAaptM,CAAK,EACpC,OAAAi3L,GAAkBp7L,EAAQzB,EAAQgzM,EAAO78K,CAAM,EACxC68K,CACT,CACA,OAAI/jH,EAAQ,uBAAyBA,EAAQ,sBAAsB,SAAWrpF,EACrE,IAAI,aAAaqpF,EAAQ,qBAAqB,EAEhD,IAAI,aAAa8jH,CAAe,CACzC,CAEA,sCAAsCA,EAAiBpwM,EAAKswM,EAAiB,CAC3E,MAAMhkH,EAAU,KAAK,uBAAyB,CAAA,EACxCttF,EAAS,KAAK,sBAAwBk4L,GACtCqZ,EAAkB,KAAK,oCAAoCvwM,EAAKowM,CAAe,EAC/EhoK,EAAc,KAAK,OAAOgoK,GAAiB,QAAU,GAAK,CAAC,EAC3DI,EAAoBrW,GAAiCoW,EAAiBH,CAAe,EACrFK,EAAkB,OAAO,SAASzxM,EAAO,oBAAoB,EAC/D,KAAK,IAAI,EAAG,OAAOA,EAAO,oBAAoB,CAAC,EAC/Ck4L,GAAgC,qBAC9BjtI,EAAa,KAAK,gCAAgCjqD,CAAG,EACrD0wM,EAAoB,GACxB1xM,EAAO,UAAY,IAChBuxM,GACAH,GACAG,EAAgB,SAAWH,EAAgB,QAC3CnmJ,EAAa,GACbumJ,GAAqBC,GACrB,CAACxW,GAAuBsW,EAAiBH,CAAe,GAG7D,OAAA9jH,EAAQ,OAASokH,EACjBpkH,EAAQ,UAAYtsF,EACpBssF,EAAQ,YAActsF,EACtBssF,EAAQ,mBAAqBtsF,EAC7BssF,EAAQ,gBAAkB,OAAO,SAASgkH,CAAe,EAAI,KAAK,IAAI,EAAGA,CAAe,EAAI,GAC5FhkH,EAAQ,gBAAkBikH,EAC1BjkH,EAAQ,gBAAkB8jH,EAC1B9jH,EAAQ,eAAiBA,EAAQ,gBAAkBA,EAAQ,eAAe,SAAW8jH,EAAgB,OACjG9jH,EAAQ,eACR,IAAI,aAAa8jH,EAAgB,MAAM,EAC3C9jH,EAAQ,gBAAkBA,EAAQ,eAAiB,GAAK,GAAK,OAAO,iBACpEA,EAAQ,gBAAkBA,EAAQ,eAAiB,GAAK,GAAK,OAAO,iBACpEA,EAAQ,YAAclkD,EACtBkkD,EAAQ,OAASokH,EAAoB,EAAI,EACzCpkH,EAAQ,mBAAqB,KAC7BA,EAAQ,mBAAqB,KAC7BA,EAAQ,kBAAoB,KAC5BA,EAAQ,gBAAkB,KAC1BA,EAAQ,oBAAsBriC,EAC9BqiC,EAAQ,sBAAwBikH,EAC5B,IAAI,aAAaG,EAAoBH,EAAkBH,CAAe,EACtE,KACJ,KAAK,sBAAwB9jH,EAEtB,CAAE,kBAAAokH,EAAmB,KAAM,MAAO,kBAAAF,EAAmB,WAAAvmJ,CAAU,CACxE,CAEA,sBAAsBjqD,EAAK,CACzB,MAAMssF,EAAU,KAAK,uBAAyB,KAC9C,GAAI,CAACA,GAAS,iBAAmB,CAACA,GAAS,gBAAiB,MAAO,GACnE,MAAM94D,EAAS,KAAK,4BAA4BxzB,CAAG,EACnD,OAAAssF,EAAQ,OAAS94D,EACjB84D,EAAQ,YAActsF,EAEpBssF,EAAQ,uBACLA,EAAQ,sBAAsB,SAAWA,EAAQ,gBAAgB,SASpEA,EAAQ,sBAAwB,IAAI,aAAaA,EAAQ,eAAe,GACxE4tG,GACE5tG,EAAQ,gBACRA,EAAQ,gBACRA,EAAQ,sBACR94D,CACR,EAEWA,EAAS,CAClB,CAEA,4BAA4BnzB,EAAY,YAAY,MAAO,CACzD,MAAML,EAAM,OAAO,SAASK,CAAS,EAAIA,EAAY,YAAY,IAAG,EAC9DisF,EAAU,KAAK,uBAAyB,KACxCttF,EAAS,KAAK,sBAAwBk4L,GACtCyZ,EAAoB,KAAK,6BAA6B3wM,CAAG,EAC/D,GAAI,CAACssF,GAAWttF,EAAO,UAAY,IAAQstF,EAAQ,SAAW,GAC5D,YAAK,iCAAgC,EAC9BqkH,EAEIjX,GAA2B16L,EAAO,IAAI,EACnD,MAAM4xM,EAAc,KAAK,sBAAsB5wM,CAAG,EAClD,OAAAssF,EAAQ,OAASskH,EACZA,IACHtkH,EAAQ,OAAS,EACbA,EAAQ,kBACVA,EAAQ,sBAAwB,IAAI,aAAaA,EAAQ,eAAe,GAE1EA,EAAQ,gBAAkB,KAC1BA,EAAQ,gBAAkB,KAC1BA,EAAQ,eAAiB,KACzBA,EAAQ,YAAc,EACtBA,EAAQ,mBAAqB,KAC7BA,EAAQ,mBAAqB,KAC7BA,EAAQ,kBAAoB,MAE9B,KAAK,iCAAgC,EAC9BskH,GAAeD,CACxB,CAEA,oBAAoBhuM,EAAU,GAAI,CAChC,MAAMkuM,EAAiB,KAAK,uBAAyB,KACrD,GAAIA,GAAkBA,EAAe,aAAe,KAAK,QACvD,OAEF,KAAK,2BAA0B,EAC/B,KAAK,6BAA6B,KAAK,QAAS,CAAE,mBAAoB,GAAM,EAC5E,MAAM7wM,EAAM,OAAO,SAAS2C,GAAS,SAAS,EAAI,OAAOA,EAAQ,SAAS,EAAI,YAAY,IAAG,EACvFmuM,EAAmB,OAAO,SAAS,KAAK,uBAAuB,kBAAkB,EACnF,KAAK,sBAAsB,mBAC3B9wM,EACEswM,EAAkB,OAAO,SAAS3tM,GAAS,eAAe,EAC5D,KAAK,IAAI,EAAG,OAAOA,EAAQ,eAAe,CAAC,EAC3C,KAAK,IAAI,EAAG3C,EAAM8wM,CAAgB,EACtC,KAAK,4BAA4BR,EAAiBtwM,CAAG,EACrD,KAAK,kBAAkB,EAAK,EAC5B,MAAM+wM,EAAuB,KAAK,kBAAkB,SAAW,YAC1D,EAAQ,KAAK,kBAAkB,SAC9BX,EAAkBW,EAAuB,KAAO,KAAK,uBAAsB,EAC3EC,EAAiBruM,GAAS,iBAAmB,GACnD,GAAIytM,GAAmBY,EAAgB,CACrC,MAAM1kH,EAAU,KAAK,uBAAyB,CAAA,EAC9CA,EAAQ,OAAS,GACjBA,EAAQ,OAAS,EACjBA,EAAQ,mBAAqBtsF,EAC7BssF,EAAQ,gBAAkBgkH,EAC1BhkH,EAAQ,oBAAsB,KAAK,gCAAgCtsF,CAAG,EACtEssF,EAAQ,sBAAwB,IAAI,aAAa8jH,CAAe,EAChE9jH,EAAQ,gBAAkB,KAC1BA,EAAQ,gBAAkB,KAC1BA,EAAQ,eAAiB,KACzBA,EAAQ,YAAc,KAAK,MAAM8jH,EAAgB,OAAS,CAAC,EAC3D9jH,EAAQ,gBAAkBA,EAAQ,eAAiB,GAAK,GAAK,OAAO,iBACpEA,EAAQ,mBAAqB,KAC7BA,EAAQ,mBAAqB,KAC7BA,EAAQ,kBAAoB,KAC5B,KAAK,sBAAwBA,EAC7B,KAAK,iCAAgC,EACrC,KAAK,QAAQ,mBAAkB,EAC/B,KAAK,SAAS,qBAAqB,eAAe,EAClD,KAAK,UAAU,gBAAe,EAC9B,KAAK,SAAS,sBAAsB,eAAe,EACnD,KAAK,MAAM,IAAI,SAAU,8DAA8D,EACvF,MACF,CACA,GAAI8jH,GAAmB,KAAK,sBAAsB,UAAY,GAAM,CAClE,KAAM,CAAE,kBAAAM,EAAmB,KAAAr0M,EAAM,kBAAAm0M,EAAmB,WAAAvmJ,CAAU,EAAK,KAAK,sCACtEmmJ,EACApwM,EACAswM,CACR,EACUI,GACF,KAAK,UAAU,cAAa,EAE9B,KAAK,MAAM,IAAI,SAAU,uCAAwC,CAC/D,KAAAr0M,EACA,QAASq0M,EACT,kBAAAF,EACA,WAAAvmJ,EACA,aAAc8vI,GAAiC,KAAK,oBAAoB,EACxE,iBAAkB,KAAK,sBAAsB,mBAAqB,EAC1E,CAAO,CACH,SAAWqW,GAAmBW,EAAsB,CAClD,MAAMzkH,EAAU,KAAK,uBAAyB,CAAA,EAC9CA,EAAQ,OAAS,GACjBA,EAAQ,OAAS,EACjBA,EAAQ,mBAAqBtsF,EAC7BssF,EAAQ,gBAAkBgkH,EAC1BhkH,EAAQ,oBAAsB,KAAK,gCAAgCtsF,CAAG,EACtEssF,EAAQ,sBAAwB8jH,EAAkB,IAAI,aAAaA,CAAe,EAAI,KACtF9jH,EAAQ,gBAAkB,KAC1BA,EAAQ,gBAAkB,KAC1BA,EAAQ,eAAiB,KACrBykH,IACFzkH,EAAQ,gBAAkBA,EAAQ,eAAiB,GAAK,GAAK,OAAO,kBAEtEA,EAAQ,YAAc8jH,EAClB,KAAK,MAAMA,EAAgB,OAAS,CAAC,EACrC,KAAK,IAAI,EAAG,KAAK,MAAM,OAAO,KAAK,kBAAiB,GAAI,WAAa,CAAC,CAAC,CAAC,EAC5E9jH,EAAQ,mBAAqB,KAC7BA,EAAQ,mBAAqB,KAC7BA,EAAQ,kBAAoB,KAC5B,KAAK,sBAAwBA,CAC/B,CACA,KAAK,iCAAgC,EAChCykH,GACH,KAAK,QAAQ,mBAAkB,EAEjC,KAAK,SAAS,qBAAqB,eAAe,EAClD,KAAK,UAAU,gBAAe,EAC9B,KAAK,SAAS,sBAAsB,eAAe,EACnD,KAAK,MAAM,IAAI,SAAU,kCAAkC,CAC7D,CAEA,4BAA6B,CAC3B,MAAM7hL,EAAW,KAAK,SAChBokC,EAAapkC,GAAU,WAC7B,GAAIA,GAAY,KAAK,sBAAsB,KAAM,CAC/C,SAAW,CAACxwB,EAAKnD,CAAK,IAAK,KAAK,sBAAsB,UACpD2zB,EAASxwB,CAAG,EAAInD,EAElB,KAAK,sBAAsB,MAAK,CAClC,CACA,GAAI+3D,GAAc,KAAK,wBAAwB,KAAM,CACnD,SAAW,CAAC50D,EAAKnD,CAAK,IAAK,KAAK,wBAAwB,UACtD+3D,EAAW50D,CAAG,EAAInD,EAEpB,KAAK,wBAAwB,MAAK,CACpC,CACF,CAEA,4BAA4Bg4B,EAAU09K,EAAW,CAC/C,GAAI,CAAC19K,GAAY,CAAC09K,GAAW,OAAQ,OACrC,MAAMjpM,EAAU,KAAK,8BAA6B,EAClD,UAAWkpM,KAAYD,EACrB,GAAI,OAAO19K,IAAW29K,CAAQ,GAAM,WACpC,IAAI,CACF39K,EAAS29K,CAAQ,EAAElpM,CAAO,CAC5B,OAAS5H,EAAO,CACdsH,GACE,KACA,0BAA0BwpM,CAAQ,GAClC,mCAAmCA,CAAQ,YAC3C,CAAE,MAAA9wM,CAAK,CACjB,EACQ,KAAK,MAAM,IAAI,SAAU,qBAAqB8wM,CAAQ,UAAW,CAAE,MAAA9wM,EAAO,CAC5E,CACA,OAEJ,CAEA,8BAA8B4jG,EAAQ,GAAI,CACxC,MAAM90E,EAAW,KAAK,UAAY,KAC5B3I,EAAiB2I,GAAU,QAAU,KACrCqS,EAAQyiE,GAAO,OAAS,KACxBmtG,EAAuB,KAAK,SAAW,OAAO,KAAK,QAAQ,qBAAwB,WACpF,KAAK,QAAQ,oBAAmB,GAAM,KACvC,KACEC,EAAqBD,GACtBA,KAA0B,KAAK,kBAAkB,UAAY,MAC5DE,EAAiB9vK,IAAU,UAAY6vK,EACzC,KAAK,kBAAiB,EACtB,KAAK,kBAAiB,EAC1B,MAAO,CACL,OAAQ,KACR,QAASptG,EAAM,SAAWqtG,EAC1B,QAAS,KAAK,QACd,SAAAniL,EACA,UAAW,KAAK,WAAa,KAC7B,QAAS3I,GAAgB,MAAQ,KACjC,OAAQA,GAAgB,QAAU,KAClC,GAAIA,GAAgB,IAAM,KAC1B,GAAGy9E,CACT,CACE,CAEA,0BAA0BzwE,EAAU,CAClC,GAAI,CAACA,EAAU,OAAO,KACtB,GAAI,EAAEA,aAAoB1rB,IACxB,MAAM,IAAI,UACR,0FACR,EAUI,GAAI,EAPF,OAAO0rB,EAAS,qBAAwB,YACrC,OAAOA,EAAS,iBAAoB,YACpC,OAAOA,EAAS,yBAA4B,YAC5C,OAAOA,EAAS,yBAA4B,YAC5C,OAAOA,EAAS,wBAA2B,YAC3C,OAAOA,EAAS,qBAAwB,YAG3C,MAAM,IAAI,MACR,yGACR,EAEI,OAAOA,CACT,CAEA,6BAA6B/zB,EAAS,KAAK,QAAS,CAClD,GAAI,CAACA,GAAU,OAAOA,GAAW,SAC/B,MAAO,CAAE,OAAQ,UAAW,SAAU,IAAI,EAE5C,GAAI,OAAOA,EAAO,qBAAwB,WACxC,MAAO,CAAE,OAAQ,UAAW,SAAU,IAAI,EAE5C,MAAM+zB,EAAW/zB,EAAO,oBAAmB,GAAM,KACjD,OAAK+zB,EAGE,CACL,OAAQ,WACR,SAAU,KAAK,0BAA0BA,CAAQ,CACvD,EALa,CAAE,OAAQ,UAAW,SAAU,IAAI,CAM9C,CAEA,6BAA6B/zB,EAAS,KAAK,QAASrD,EAAU,CAAA,EAAI,CAChE,MAAMyJ,EAAU,KAAK,kBAAoB,CAAE,OAAQ,UAAW,SAAU,IAAI,EACtE0rM,EAAS,KAAK,6BAA6B9xM,CAAM,EACjD+xM,EAAqB3rM,EAAQ,SAAW,WAAcA,EAAQ,UAAY,KAAQ,KAClF4rM,EAAqBF,EAAO,SAAW,WAAcA,EAAO,UAAY,KAAQ,KAEtF,OADgB1rM,EAAQ,SAAW0rM,EAAO,QAAU1rM,EAAQ,WAAa0rM,EAAO,UAK5EC,GAAsBA,IAAuBC,GAC/C,KAAK,wBAAwBD,CAAkB,EAEjD,KAAK,iBAAmB,CACtB,OAAQD,EAAO,OACf,SAAUA,EAAO,UAAY,IACnC,EACI,KAAK,6BAA4B,EAC7BE,GAAsBA,IAAuBD,GAC/C,KAAK,wBAAwBC,CAAkB,EAE7Cr1M,EAAQ,qBAAuB,GACjC,KAAK,2BAA2B,CAAE,iBAAkB,EAAK,CAAE,EAE3D,KAAK,iCAAgC,EAEnCA,EAAQ,kBAAoB,IAC9B,KAAK,WAAW,kBAAe,EAE7BA,EAAQ,gBAAkB,IAC5B,KAAK,WAAW,gBAAa,EAE3BA,EAAQ,gBAAkB,IAC5B,KAAK,SAAS,sBAAsB,kBAAkB,EAEjD,KA5BL,KAAK,iCAAgC,EAC9B,GA4BX,CAEA,wBAAwBo3B,EAAU,CAChC,MAAMx1B,EAAOw1B,GAAY,KACrB,CAACx1B,GAAQ,KAAK,0BAA4BA,IAC9C,KAAK,wBAA0BA,EAC/B,KAAK,4BAA4BA,EAAM,CAAC,WAAY,QAAQ,CAAC,EAC/D,CAEA,wBAAwBw1B,EAAU,CAChC,MAAMhrB,EAASgrB,GAAY,KAAK,yBAA2B,KACtDhrB,IACL,KAAK,4BAA4BA,EAAQ,CAAC,WAAY,QAAQ,CAAC,EAC3D,KAAK,0BAA4BA,IACnC,KAAK,wBAA0B,MAEnC,CAEA,8BAA+B,CAC7B,MAAM8rF,EAAU,KAAK,uBAAyB,KACxCk4G,EAAmB,KAAK,kBAAoB,CAAE,OAAQ,UAAW,SAAU,IAAI,EAC/EkF,EAAmBlF,EAAiB,SAAW,WAChDA,EAAiB,UAAY,KAC9B,KACEmF,EAAiBr9G,GAAS,kBAAoBA,EAAQ,mBAAqBo9G,EAC5Ep9G,EAAQ,gBAAkB,KAC3B,KACJ,MAAO,CACL,QAAAA,EACA,iBAAAo9G,EACA,eAAgBC,GAAkB,KAAK,SAAW,KAClD,YAAaA,GAAkBA,IAAmB,KAAK,QACnD,KAAK,SAAW,KAChB,IACV,CACE,CAEA,6BAA6Bv1M,EAAU,GAAI,CACzC,MAAMk4F,EAAU,KAAK,uBAAyB,KAC9C,YAAK,sBAAwB,KACzBA,GAAS,gBAAkBl4F,EAAQ,kBAAoB,IACzDk4F,EAAQ,eAAe,UAAO,EAE5BA,GAAS,aAAeA,EAAQ,cAAgBA,EAAQ,gBAC1DA,EAAQ,YAAY,UAAO,EAEtBA,CACT,CAEA,4BAA4B,CAAE,eAAAs9G,EAAiB,KAAM,iBAAAC,EAAmB,KAAM,WAAAnyG,EAAa,IAAI,EAAK,GAAI,CACtG,GAAI,CAACmyG,GAAoB,CAACnyG,GAAc,OAAO,KAAK,2BAA8B,WAChF,MAAO,GAGT,KAAK,6BAA4B,EACjC,MAAM/W,GAAU,KAAK,qBAAuB,GAAK,IAAO,EACxD,YAAK,oBAAsBA,EAC3B+W,EAAW,uBAAoB,EAC/BA,EAAW,oBAAoB,CAC7B,MAAO,KAAK,iBAAiBkyG,CAAc,CACjD,CAAK,EACD,KAAK,sBAAwB,CAC3B,MAAAjpH,EACA,eAAgBipH,EAChB,iBAAkBC,EAClB,YAAa,KACb,WAAAnyG,CACN,EAEI,QAAQ,QAAO,EACZ,KAAK,IAAM,KAAK,0BAA0B,CACzC,SAAUmyG,EACV,QAASD,GAAgB,SAAWC,GAAkB,UAAU,SAAW,KAAK,kBAAiB,EACjG,MAAO,QACf,CAAO,CAAC,EACD,MAAOxxM,IACN,QAAQ,KAAK,gFAAiFA,CAAK,EAC5F,KACR,EACA,KAAMwC,GAAa,CAClB,KAAK,6BAA6B8lF,EAAO9lF,CAAQ,CACnD,CAAC,EACA,MAAOxC,GAAU,CAChBsH,GAAS,KAAM,iCAAkC,+DAAgE,CAAE,MAAAtH,CAAK,CAAE,CAC5H,CAAC,EAEI,EACT,CAEA,iBAAiBZ,EAAS,KAAM,CAC9B,MAAMqyM,EAAS,OAAOryM,GAAQ,KAAK,EACnC,GAAI,OAAO,SAASqyM,CAAM,EAAG,OAAOA,EACpC,MAAM3rM,EAAW,OAAO1G,GAAQ,UAAU,KAAK,EAC/C,GAAI,OAAO,SAAS0G,CAAQ,EAAG,OAAOA,EACtC,MAAMqtB,EAAW/zB,GAAQ,sBAAmB,GAAQA,GAAQ,kBAAoB,KAC1EsyM,EAAgB,OAAOv+K,GAAU,KAAK,EAC5C,GAAI,OAAO,SAASu+K,CAAa,EAAG,OAAOA,EAC3C,MAAM31M,EAAU,OAAOqD,GAAQ,SAAS,KAAK,EAC7C,OAAI,OAAO,SAASrD,CAAO,EAAUA,EAC9B,GACT,CAEA,+BAA+ByG,EAAW,KAAMH,EAAU,KAAM,CAC9D,GAAI,EAAEG,aAAoB,eAAiBA,EAAS,OAAS,EAAG,OAAO,KACvE,MAAMmvM,EAAkB,IAAMtvM,GAAS,uBAAuB,YAAcA,EAAQ,YAAc,KAClG,IAAI8B,EAAc,KACd,OAAO9B,GAAS,kBAAqB,WACvCA,EAAQ,iBAAiB,IAAM,CAC7B8B,EAAcwtM,EAAe,CAC/B,CAAC,EAEDxtM,EAAcwtM,EAAe,EAG/B,IAAI3jM,EAAO,EACPC,EAAO,EACPC,EAAO,EACPrL,EAAQ,EACZ,MAAM+uM,EAAaprM,GAAW,CAC5B,MAAM5B,GAAQ4B,IAAW,GAAK,EAC9B,GAAK5B,EAAO,GAAMpC,EAAS,OAAQ,OACnC,MAAMsB,EAAI,OAAOtB,EAASoC,CAAI,CAAC,EACzBb,EAAI,OAAOvB,EAASoC,EAAO,CAAC,CAAC,EAC7BqB,EAAI,OAAOzD,EAASoC,EAAO,CAAC,CAAC,EAC/B,CAAC,OAAO,SAASd,CAAC,GAAK,CAAC,OAAO,SAASC,CAAC,GAAK,CAAC,OAAO,SAASkC,CAAC,IACpE+H,GAAQlK,EACRmK,GAAQlK,EACRmK,GAAQjI,EACRpD,GAAS,EACX,EAEA,GAAIsB,GAAa,OACf,QAASE,EAAI,EAAGA,EAAIF,EAAY,OAAQE,GAAK,EAC3CutM,EAAUztM,EAAYE,CAAC,CAAC,MAErB,CACL,MAAMmQ,EAAY,KAAK,MAAMhS,EAAS,OAAS,CAAC,EAChD,QAASgE,EAAS,EAAGA,EAASgO,EAAWhO,GAAU,EACjDorM,EAAUprM,CAAM,CAEpB,CAEA,OAAI3D,GAAS,EAAU,KAChB,CAACmL,EAAOnL,EAAOoL,EAAOpL,EAAOqL,EAAOrL,CAAK,CAClD,CAEA,6BAA6BylF,EAAO9lF,EAAW,KAAM,CACnD,MAAMyxF,EAAU,KAAK,uBAAyB,KAC9C,GAAI,CAACA,GAAWA,EAAQ,QAAU3L,EAAO,MAAO,GAChD,KAAK,sBAAwB,KAE7B,MAAM+W,EAAapL,EAAQ,YAAc,KACzC,GAAIoL,GAAc,KAAK,UAAYA,EAAY,CAC7C,MAAMwyG,EAAiB,KAAK,+BAA+BrvM,EAAU68F,GAAY,SAAW,IAAI,EAC5FwyG,GACFxyG,EAAW,oBAAoB,CAAE,OAAQwyG,CAAc,CAAE,EAE3DxyG,EAAW,0BAA0B78F,EAAU,CAAE,WAAY,EAAK,CAAE,EACpE,KAAK,6BAA6B,KAAK,QAAS,CAAE,mBAAoB,GAAO,EAC7E,MAAM0pF,EAAU,KAAK,2BAA2B,CAAE,iBAAkB,GAAO,oBAAqB,GAAM,EAClG1pF,aAAoB,cAAgBA,EAAS,OAAS,IACxD0pF,EAAQ,sBAAwB,IAAI,aAAa1pF,CAAQ,GAE3D,KAAK,sBAAwB0pF,EAC7B,KAAK,iCAAgC,EACrC,KAAK,WAAW,gBAAgB,gBAAgB,EAChD,KAAK,WAAW,kBAAe,EAC/B,KAAK,WAAW,gBAAa,EAC7B,KAAK,SAAS,sBAAsB,gBAAgB,CACtD,CAEA,OAAA+H,EAAQ,gBAAgB,UAAO,EAC3BA,EAAQ,aAAeA,EAAQ,cAAgBA,EAAQ,gBACzDA,EAAQ,YAAY,UAAO,EAEtB,EACT,CAEA,2BAA2B,CAAE,iBAAA69G,EAAmB,GAAO,oBAAAC,EAAsB,EAAI,EAAK,GAAI,CACxF,MAAM7lH,EAAU,KAAK,uBAAyB,CAAA,EACxC8lH,EAAoB,MAAM,QAAQ9lH,EAAQ,iBAAiB,EAAIA,EAAQ,kBAAoB,CAAA,EACjG,OAAAA,EAAQ,OAAS,GACjBA,EAAQ,UAAY,EACpBA,EAAQ,YAAc,EACtBA,EAAQ,mBAAqB,EAC7BA,EAAQ,gBAAkB,GAC1BA,EAAQ,gBAAkB,KAC1BA,EAAQ,gBAAkB,KAC1BA,EAAQ,eAAiB,KACzBA,EAAQ,cAAgB,EACxBA,EAAQ,cAAgB,EACxBA,EAAQ,YAAc,EACtBA,EAAQ,OAAS,EACjBA,EAAQ,gBAAkB,KAC1BA,EAAQ,mBAAqB,KAC7BA,EAAQ,mBAAqB,KAC7BA,EAAQ,kBAAoB,KAC5BA,EAAQ,oBAAsB,KAAK,gCAAgC,YAAY,IAAG,CAAE,EACpFA,EAAQ,kBAAoB6lH,EAAsBC,EAAoB,CAAA,EACjEF,IACH5lH,EAAQ,sBAAwB,MAElC,KAAK,sBAAwBA,EAC7B,KAAK,iCAAgC,EAC9BA,CACT,CAEA,kCAAmC,CACjC,MAAMh5B,EAAa,KAAK,UAAU,YAAc,KAChD,GAAI,CAACA,EAAY,MAAO,GACxB,MAAM++I,EAAiB,KAAK,kBAAkB,SAAW,WACpD,KAAK,kBAAkB,UAAY,KACpC,KACA,OAAO/+I,EAAW,qBAAwB,WAC5CA,EAAW,oBAAoB++I,CAAc,EAE7C/+I,EAAW,iBAAmB++I,EAGhC,MAAMrzM,EAAS,KAAK,sBAAwBk4L,GACtC5qG,EAAU,KAAK,uBAAyB,CAAA,EACxCgmH,EAAsBtzM,EAAO,UAAY,IAC1C06L,GAA2B16L,EAAO,IAAI,IAAM,OAC5CstF,EAAQ,SAAW,GAClBtlD,EAAqB,CACzB,QAASsrK,EACT,OAAQA,EAAsBjlL,GAAQi/D,EAAQ,OAAQ,CAAC,EAAI,EAC3D,cAAe,OAAO,SAASA,EAAQ,aAAa,EAAIA,EAAQ,cAAgB,EAChF,YAAa,OAAO,SAASA,EAAQ,WAAW,EAAIA,EAAQ,YAAc,EAC1E,WAAYgmH,EAAuBhmH,EAAQ,iBAAmB,KAAQ,KACtE,mBAAoBgmH,EAAuBhmH,EAAQ,oBAAsB,KAAQ,KACjF,mBAAoBgmH,EAAuBhmH,EAAQ,oBAAsB,KAAQ,KACjF,kBAAmBgmH,EAAuBhmH,EAAQ,mBAAqB,KAAQ,IACrF,EACI,OAAI,OAAOh5B,EAAW,+BAAkC,WACtDA,EAAW,8BAA8BtsB,CAAkB,EAE3DssB,EAAW,sBAAwBtsB,EAE9B,EACT,CAEA,oBAAqB,CACnB,MAAM/X,EAAW,KAAK,YAAY,aAAe,KACjD,GAAKA,EACL,UAAWnxB,KAAQ,OAAO,KAAKmxB,CAAQ,EAAG,CACxC,GAAI,OAAO,KAAKnxB,CAAI,GAAM,WAAY,SACtC,MAAMvC,EAAQ,KAAKuC,CAAI,EAAC,EACxB,KAAK,qBAAqBA,EAAMvC,EAAO,CAAE,OAAQ,UAAW,cAAe,GAAO,CACpF,CACF,CAEA,qBAAsB,CACpB,MAAM2zB,EAAW,KAAK,UAAY,KAClC,GAAI,CAACA,GAAY,OAAOA,EAAS,UAAa,WAAY,MAAO,GACjE,MAAM2qB,EAAW,KAAK,eAAiB,KACvC,GAAIA,GAAYA,EAAS,SAAW3qB,EAAS,OAC3C,YAAK,2BAA0B,EACxB,GAET,GAAI2qB,EAAU,CACZ,GAAI,CACF3qB,EAAS,YAAY2qB,CAAQ,CAC/B,OAASz5C,EAAO,CACdsH,GACE,KACA,uBACA,kFACA,CAAE,MAAAtH,CAAK,CACjB,CACM,CACA,KAAK,cAAgB,IACvB,CACA,MAAMmyM,EAAe,IAAIr2G,GAAa,CACpC,cAAe,KAAK,eACpB,cAAe,IAAM,KAAK,UAAU,YAAc,KAClD,iBAAmB14F,GAAO,KAAK,0BAA0BA,CAAE,EAC3D,oBAAsBf,GAAY,CAChC,GAAI,CAACA,EAAS,OAAO,KACrB,GAAI,CACF,OAAOA,EAAQ,yBAAyBxB,EAAuB,GAAG,MAAQ,IAC5E,OAASb,EAAO,CACd,OAAAsH,GACE,KACA,6BACA,2DACA,CAAE,MAAAtH,CAAK,CACnB,EACiB,IACT,CACF,EACA,oBAAsBqC,GAAY,CAChC,GAAI,CAACA,EAAS,MAAO,CAAE,KAAM,KAAM,QAAS,KAAM,MAAO,CAAC,EAC1D,GAAI,CACF,MAAMymB,EAASzmB,EAAQ,yBAAyBxB,EAAuB,GAAK,KACtE+B,EAAOkmB,GAAQ,MAAQ,KACvBjmB,EAAQD,GAAQ,OAAO,SAASA,EAAK,MAAM,EAAI,KAAK,MAAMA,EAAK,OAAS,CAAC,EAAI,EAC7EomB,EAAU,OAAO,SAASF,GAAQ,OAAO,EAAI,OAAOA,EAAO,OAAO,EAAI,KAC5E,MAAO,CAAE,KAAAlmB,EAAM,QAAAomB,EAAS,MAAAnmB,CAAK,CAC/B,OAAS7C,EAAO,CACd,OAAAsH,GACE,KACA,6BACA,+DACA,CAAE,MAAAtH,CAAK,CACnB,EACiB,CAAE,KAAM,KAAM,QAAS,KAAM,MAAO,CAAC,CAC9C,CACF,EACA,eAAiB6G,GAAU,CACzB,GAAI,CAACA,GAAS,OAAOA,GAAU,SAAU,OACzC,MAAMurM,EAAoB,KAAK,iBAAiB,YAAc,GACxDC,EAAiB,MAAM,QAAQ,KAAK,iBAAiB,WAAW,EAClE,KAAK,gBAAgB,YACrB,KACJ,KAAK,gBAAkB,CAAE,GAAG,KAAK,gBAAiB,GAAGxrM,CAAK,EAC1D,MAAM+xH,EAAa,MAAM,QAAQ,KAAK,iBAAiB,WAAW,EAC9D,KAAK,gBAAgB,YACrB,KACE05E,EAAgBD,GAAgB,SAAWz5E,GAAY,SACvDy5E,GAAkB,IAAI,KAAK,CAACl3M,EAAOsT,IAAUtT,IAAUy9H,IAAanqH,CAAK,CAAC,GAC3E,KAAK,iBAAiB,YAAc,KAAU2jM,GAAqBE,KACtE,KAAK,uBAAyB,EAElC,CACN,CAAK,EACD,OAAAxjL,EAAS,SAASqjL,EAAc,CAAE,OAAQrjL,EAAS,YAAc,cAAe,EAChF,KAAK,cAAgBqjL,EACrB,KAAK,2BAA0B,EACxB,EACT,CAEA,4BAA6B,CAC3B,KAAK,eAAe,YAAY,KAAK,cAAc,CACrD,CAEA,qBAAsB,CACpB,GAAK,KAAK,WAAW,cACrB,IAAI,OAAO,gBAAmB,WAAY,CACxC,eAAe,IAAM,KAAK,WAAW,gBAAa,CAAI,EACtD,MACF,CACA,QAAQ,QAAO,EAAG,KAAK,IAAM,KAAK,WAAW,iBAAiB,EAChE,CAEA,wBAAwBz0M,EAAM,CAC5B,MAAMwuF,EAAU,KAAK,sBAAwB,KACvCq3D,EAAQr3D,IAAUxuF,CAAI,GAAK,KAC7B6lJ,GAAS,OACX,aAAaA,CAAK,EAClBr3D,EAAQxuF,CAAI,EAAI,KAEpB,CAEA,uCAAwC,CACtC,MAAMwuF,EAAU,KAAK,sBAAwB,KACvCttF,EAAS,KAAK,4BAA8B04L,GAClD,GAAI,CAACprG,GAAW,CAACttF,EAAO,SAAWA,EAAO,mBAAqB,GAAM,OACrE,KAAK,wBAAwB,iBAAiB,EAC9C,MAAMe,EAAQ,KAAK,IAAI,EAAG,OAAOf,EAAO,mBAAqB,CAAC,CAAC,EAC/DstF,EAAQ,gBAAkB,WAAW,IAAM,CACzCA,EAAQ,gBAAkB,KAC1B,KAAK,WAAW,gBAAa,CAC/B,EAAGvsF,CAAK,CACV,CAEA,4BAA6B,CAC3B,MAAMusF,EAAU,KAAK,sBAAwB,KAG7C,GAFI,CAACA,IACL,KAAK,wBAAwB,YAAY,EACrC,CAAC,OAAO,SAASA,EAAQ,WAAW,GAAG,OAC3C,MAAMvsF,EAAQ,KAAK,IAAI,EAAGusF,EAAQ,YAAc,YAAY,KAAK,EACjEA,EAAQ,WAAa,WAAW,IAAM,CACpCA,EAAQ,WAAa,KACrB,KAAK,WAAW,gBAAa,CAC/B,EAAGvsF,CAAK,CACV,CAEA,mCAAmC6H,EAAS,KAAM5H,EAAM,YAAY,IAAG,EAAI,CACzE,MAAMssF,EAAU,KAAK,sBAAwB,KACvCttF,EAAS,KAAK,4BAA8B04L,GAElD,GADI,CAACprG,GAAWttF,EAAO,UAAY,IAAQA,EAAO,mBAAqB,IACnE4I,GAAQ,SAAW,cAAe,MAAO,GAC7C,MAAM+qM,EAAS,OAAO3zM,EAAO,mBAAqB04L,GAA+B,iBAAiB,EAClG,OAAAprG,EAAQ,kBAAoBtsF,EAAM,KAAK,IAAI,EAAG,OAAO,SAAS2yM,CAAM,EAAIA,EAAS,CAAC,EAClF,KAAK,sCAAqC,EACnC,EACT,CAEA,2BAA4B,CAC1B,MAAMr/I,EAAa,KAAK,UAAU,YAAc,KAChD,GAAI,CAACA,GAAc,OAAOA,EAAW,mBAAsB,WAAY,MAAO,GAC9E,GAAI,CACF,OAAOA,EAAW,kBAAiB,IAAO,EAC5C,OAASlzD,EAAO,CACd,OAAAsH,GACE,KACA,wBACA,wEACA,CAAE,MAAAtH,CAAK,CACf,EACa,EACT,CACF,CAEA,kCAAmC,CACjC,MAAMksF,EAAU,KAAK,sBAAwB,KACxCA,IACLA,EAAQ,oBAAsB,CAAA,EAC9BA,EAAQ,sBAAwB,KAChCA,EAAQ,iBAAmB,CAAA,EAC3BA,EAAQ,mBAAqB,KAC/B,CAEA,6BAA6BtsF,EAAM,YAAY,MAAO,CACpD,MAAMhB,EAAS,KAAK,4BAA8B04L,GAC5CprG,EAAU,KAAK,sBAAwB,KACvCu/B,EAAc,OAAO,KAAK,WAAW,gBAAmB,WAC1D,KAAK,UAAU,eAAc,EAC5B,KAAK,WAAW,gBAAkB,GAAQ,UAAY,UACrD+mF,EAAe5zM,EAAO,mBAAqB,IAAQ6sH,IAAgB,UACnEgnF,EAAe7zM,EAAO,mBAAqB,IAC5C,OAAO,SAASstF,GAAS,iBAAiB,GAC1CtsF,EAAMssF,EAAQ,kBACnB,MAAO,CACL,aAAAsmH,EACA,aAAAC,EACA,OAAQD,GAAgBC,CAC9B,CACE,CAEA,+BAA+BC,EAAU,CACvC,MAAMxmH,EAAU,KAAK,sBAAwB,KACvCttF,EAAS,KAAK,4BAA8B04L,GAClD,GAAI,CAACprG,GAAW,CAAC,OAAO,SAASwmH,CAAQ,EACvC,MAAO,CAAE,UAAW,KAAM,YAAa,EAAG,YAAa,CAAC,EAE1D,MAAMC,EAAc5a,GAClBn5L,EAAO,qBAAuBA,EAAO,2BACrC04L,GAA+B,oBAC/B,EACA,GACN,EACU/sI,EAAU,MAAM,QAAQ2hC,EAAQ,mBAAmB,EAAIA,EAAQ,oBAAsB,CAAA,EAC3F,OAAA3hC,EAAQ,KAAK,OAAOmoJ,CAAQ,CAAC,EACzBnoJ,EAAQ,OAASooJ,GACnBpoJ,EAAQ,OAAO,EAAGA,EAAQ,OAASooJ,CAAW,EAEhDzmH,EAAQ,oBAAsB3hC,EAC9B2hC,EAAQ,sBAAwB3hC,EAAQ,OAAS,EAC5CA,EAAQ,OAAO,CAACx/B,EAAK5vB,IAAU4vB,EAAM5vB,EAAO,CAAC,EAAIovD,EAAQ,OAC1D,KACG,CACL,UAAW2hC,EAAQ,sBACnB,YAAa3hC,EAAQ,OACrB,YAAAooJ,CACN,CACE,CAEA,4BAA4BD,EAAU,CACpC,MAAMxmH,EAAU,KAAK,sBAAwB,KACvCttF,EAAS,KAAK,4BAA8B04L,GAClD,GAAI,CAACprG,GAAW,CAAC,OAAO,SAASwmH,CAAQ,EACvC,MAAO,CAAE,UAAW,KAAM,YAAa,EAAG,YAAa,CAAC,EAE1D,MAAMC,EAAc5a,GAClBn5L,EAAO,qBAAuBA,EAAO,2BACrC04L,GAA+B,oBAC/B,EACA,GACN,EACU/sI,EAAU,MAAM,QAAQ2hC,EAAQ,gBAAgB,EAAIA,EAAQ,iBAAmB,CAAA,EACrF,OAAA3hC,EAAQ,KAAK,OAAOmoJ,CAAQ,CAAC,EACzBnoJ,EAAQ,OAASooJ,GACnBpoJ,EAAQ,OAAO,EAAGA,EAAQ,OAASooJ,CAAW,EAEhDzmH,EAAQ,iBAAmB3hC,EAC3B2hC,EAAQ,mBAAqB3hC,EAAQ,OAAS,EACzCA,EAAQ,OAAO,CAACx/B,EAAK5vB,IAAU4vB,EAAM5vB,EAAO,CAAC,EAAIovD,EAAQ,OAC1D,KACG,CACL,UAAW2hC,EAAQ,mBACnB,YAAa3hC,EAAQ,OACrB,YAAAooJ,CACN,CACE,CAEA,gCAAgCD,EAAUE,EAAiB,CACzD,MAAMC,EAAiB,OAAOH,CAAQ,EAChCI,EAAgB,OAAOF,CAAe,EACtCG,EAAoB,OAAO,SAASF,CAAc,GAAKA,GAAkB,EACzEG,EAAmB,OAAO,SAASF,CAAa,GAAKA,GAAiB,EAC5E,OAAIC,GAAqBC,EAAyB,KAAK,IAAIH,EAAgBC,CAAa,EACpFC,EAA0BF,EAC1BG,EAAyBF,EACtB,IACT,CAEA,oBAAoB1zM,EAAS,KAAM,CACjC,MAAM0G,EAAW,OAAO1G,GAAQ,UAAU,QAAQ,EAClD,GAAI,OAAO,SAAS0G,CAAQ,EAAG,OAAOA,EACtC,MAAM/J,EAAU,OAAOqD,GAAQ,SAAS,QAAQ,EAChD,GAAI,OAAO,SAASrD,CAAO,EAAG,OAAOA,EACrC,MAAMo3B,EAAW/zB,GAAQ,sBAAmB,GAAQA,GAAQ,kBAAoB,KAC1E6zM,EAAmB,OAAO9/K,GAAU,QAAQ,EAClD,OAAI,OAAO,SAAS8/K,CAAgB,EAAUA,EACvC,GACT,CAEA,+BAA+BC,EAAmB,EAAG,CACnD,MAAMt0M,EAAS,KAAK,4BAA8B04L,GAC5C1yL,EAAO,KAAK,IAAI,EAAG,OAAOhG,EAAO,iBAAmB04L,GAA+B,eAAe,CAAC,EACzG,GAAI,EAAE1yL,EAAO,GAAI,MAAO,GACxB,MAAMuuM,EAAW,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOD,CAAgB,GAAK,CAAC,CAAC,EAChE1mI,EAAS5nE,EAAQ2yL,GAAgC,eAAiB4b,EACxE,OAAO,KAAK,IACV,KAAK,IAAIvuM,EAAM4nE,CAAM,EACrB+qH,GAAgC,YACtC,CACE,CAEA,sCAAsC33L,EAAM,YAAY,MAAO,CAC7D,MAAMssF,EAAU,KAAK,sBAAwB,KAE7C,GADI,CAACA,GACD,EAAE,OAAO,SAASA,EAAQ,WAAW,GAAKtsF,GAAOssF,EAAQ,aAAc,MAAO,GAClF,MAAMttF,EAAS,KAAK,4BAA8B04L,GAC5C8b,EAAoB,OAAOx0M,EAAO,sBAAwB04L,GAA+B,oBAAoB,EAC/GC,GAAgC,oBAC9B8b,EAAc,OAAOnnH,EAAQ,kBAAkB,EACrD,GAAI,OAAO,SAASmnH,CAAW,GAAKA,EAAcD,EAAmB,MAAO,GAC5E,MAAME,EAAe,KAAK,iBAAiB,KAAK,SAAW,IAAI,EAC/D,GAAI,OAAO,SAASA,CAAY,EAAG,CACjC,MAAMC,EAAgB,OAAO,SAASrnH,EAAQ,wBAAwB,EAClEA,EAAQ,yBACRonH,EACE/tM,EAAW,KAAK,oBAAoB,KAAK,SAAW,IAAI,EACxDiuM,EAAiB,KAAK,IAC1BD,EAAgBhc,GAAgC,iBAChD,OAAO,SAAShyL,CAAQ,EACpBA,EAAWgyL,GAAgC,mBAC3C,OAAO,iBACnB,EACM,GAAI+b,EAAeE,EAAgB,MAAO,EAC5C,CACA,MAAO,EACT,CAEA,gCAAiC,CAC/B,KAAK,qBAAqB,sBAAuB,KAAK,oBAAmB,EAAI,CAC3E,OAAQ,UACR,cAAe,EACrB,CAAK,CACH,CAEA,wCAAyC,CACvC,MAAMr4M,EAAQ,KAAK,oBAAmB,EACtC,KAAK,qBAAqB,sBAAuBA,CAAK,EACtD,KAAK,qBAAqB,6BAA8BA,EAAM,OAAO,EACrE,KAAK,qBAAqB,0CAA2CA,EAAM,oBAAoB,EAC/F,KAAK,qBAAqB,gDAAiDA,EAAM,0BAA0B,EAC3G,KAAK,qBAAqB,qCAAsCA,EAAM,eAAe,EACrF,KAAK,qBAAqB,uCAAwCA,EAAM,iBAAiB,EACzF,KAAK,qBAAqB,sCAAuCA,EAAM,gBAAgB,EACvF,KAAK,qBAAqB,sCAAuCA,EAAM,gBAAgB,CACzF,CAEA,8BAA8BkE,EAASF,EAAS,KAAMpD,EAAU,CAAA,EAAI,CAClE,MAAMmwF,EAAU,KAAK,sBAAwB,KACvCh5B,EAAa,KAAK,UAAU,YAAc,KAC1Cv1D,EAAO0B,IAAY,GACnByI,EAAWorD,GAAY,4BAA8B,GACrDugJ,EAAiBvnH,GAAS,QAAU,KACtCh5B,EACFA,EAAW,+BAA+Bv1D,CAAI,EAE9C,KAAK,wBAAwB,IAAI,4BAA6BA,CAAI,EAEhEuuF,IACFA,EAAQ,OAAS/sF,IAAWxB,EAAO,cAAgB,YAErD,MAAM6C,EAAUsH,IAAanK,GAAQ81M,KAAoBvnH,GAAS,QAAU,MAC5E,OAAI1rF,IACF,KAAK,+BAA8B,EAC/BzE,EAAQ,gBAAkB,IAC5B,KAAK,oBAAmB,GAGrByE,CACT,CAEA,8BAA8BZ,EAAM,YAAY,MAAO,CACrD,MAAMszD,EAAa,KAAK,UAAU,YAAc,KAC1Cg5B,EAAU,KAAK,sBAAwB,KACvCwnH,EAAaxgJ,GAAY,oBAAsB,GAC/CygJ,EAAezgJ,GAAY,4BAA8B,GAC/D,GAAIg5B,GAAS,mBAAqB,GAChC,MAAO,CAAE,KAAM,GAAO,OAAQ,QAAQ,EAExC,GAAI,CAAC,KAAK,4BACR,MAAO,CAAE,KAAM,GAAO,OAAQ,QAAQ,EAExC,GAAIwnH,EACF,MAAO,CAAE,KAAM,GAAO,OAAQ,QAAQ,EAExC,GAAI,EAAE,KAAK,4BAA8Bpc,IAAgC,QACvE,MAAO,CAAE,KAAM,GAAO,OAAQ,UAAU,EAE1C,MAAMsc,EAAW,KAAK,6BAA6Bh0M,CAAG,EACtD,OAAKg0M,EAAS,OAGVD,GAAgBznH,GAAS,SAAW,cAEpC0nH,EAAS,cACN,CAACA,EAAS,cACV,KAAK,sCAAsCh0M,CAAG,EAE1C,CAAE,KAAM,GAAO,OAAQ,OAAO,EAEhC,CAAE,KAAM,GAAM,OAAQ,aAAa,EAErC,CAAE,KAAM,GAAO,OAAQ,SAAS,EAZ9B,CAAE,KAAM,GAAO,OAAQ,SAAS,CAa3C,CAEA,uCAAuCA,EAAM,YAAY,MAAO,CAE9D,MAAMi0M,GADa,KAAK,UAAU,YAAc,OACZ,4BAA8B,GAC5DJ,EAAiB,KAAK,sBAAsB,QAAU,KACtDG,EAAW,KAAK,6BAA6Bh0M,CAAG,EAClD,KAAK,sBACHg0M,EAAS,UAAY,KAAK,qBAAqB,iBAAmB,MACpE,KAAK,qBAAqB,eAAiBA,EAAS,OACpD,KAAK,qBAAqB,sBAAwBA,EAAS,SAAW,GACtE,KAAK,iCAAgC,GAGzC,MAAME,EAAW,KAAK,8BAA8Bl0M,CAAG,EACvD,OACE,KAAK,sBACFi0M,GACAC,EAAS,OAAS,IAClB,KAAK,qBAAqB,SAAW,gBAExC,KAAK,qBAAqB,YAAc,OAAO,kBAC/C,KAAK,wBAAwB,YAAY,EACzC,KAAK,iCAAgC,GAGrC,KAAK,sBACFD,GACAC,EAAS,OAAS,IAClBA,EAAS,SAAW,SACpBL,IAAmB,gBAEtB,KAAK,qBAAqB,sBAAwB,GAClD,KAAK,iCAAgC,GAEvC,KAAK,8BAA8BK,EAAS,KAAMA,EAAS,OAAQ,CAAE,cAAe,GAAO,EACpFA,CACT,CAEA,sCAAsCpB,EAAU9yM,EAAM,YAAY,IAAG,EAAI,CACvE,MAAMssF,EAAU,KAAK,sBAAwB,KACvCttF,EAAS,KAAK,4BAA8B04L,GAC5CpkI,EAAa,KAAK,UAAU,YAAc,KAChD,GAAI,CAACg5B,GAAW,CAACh5B,EAAY,OAC7Bg5B,EAAQ,aAAe,OAAO,SAASwmH,CAAQ,EAAIA,EAAW,KAC9D,MAAMqB,EAAe,KAAK,0BAAyB,EAC7CL,EAAaxgJ,EAAW,oBAAsB,GAC9CygJ,EAAezgJ,EAAW,4BAA8B,GACxD0gJ,EAAW,KAAK,6BAA6Bh0M,CAAG,EACtD,GAAIssF,EAAQ,mBAAqB,IAAQ,CAACttF,EAAO,SAAW80M,GAAc,CAACK,EAAc,CACvF7nH,EAAQ,YAAc,OAAO,kBAC7B,KAAK,wBAAwB,YAAY,EACzC,KAAK,iCAAgC,EACrCA,EAAQ,iBAAmB,EAC3BA,EAAQ,sBAAwB,OAAO,kBACvCA,EAAQ,yBAA2B,IACnC,MACF,CACA,GAAI,CAAC0nH,EAAS,OAAQ,CACpB1nH,EAAQ,YAAc,OAAO,kBAC7B,KAAK,wBAAwB,YAAY,EACzC,KAAK,iCAAgC,EACrCA,EAAQ,iBAAmB,EAC3BA,EAAQ,sBAAwB,OAAO,kBACvCA,EAAQ,yBAA2B,IACnC,MACF,CACA,GAAIynH,EAAc,CACZznH,EAAQ,SAAW,eACrB,KAAK,4BAA4BwmH,CAAQ,EAE3C,MACF,CACA,GAAIxmH,EAAQ,wBAA0B,GAAM,CAC1CA,EAAQ,sBAAwB,GAChCA,EAAQ,aAAe,OAAO,SAASwmH,CAAQ,EAAIA,EAAW,KAC9D,MACF,CACA,KAAM,CAAE,UAAAsB,EAAW,YAAAlgM,EAAa,YAAA6+L,CAAW,EAAK,KAAK,+BAA+BD,CAAQ,EAC5F,GAAI5+L,EAAc6+L,GAAe,CAAC,OAAO,SAASqB,CAAS,EACzD,OAEF,MAAMC,EAAgB,OAAOr1M,EAAO,sBAAwB04L,GAA+B,oBAAoB,EACzG4c,EAAgBD,EAAgB1c,GAAgC,oBACtE,GAAIrrG,EAAQ,SAAW,QAAS,CAC9B,GAAI8nH,GAAaE,EAAe,CAC9BhoH,EAAQ,OAAS,UACjBA,EAAQ,iBAAmB,EAC3BA,EAAQ,YAAc,OAAO,kBAC7BA,EAAQ,sBAAwB,OAAO,kBACvCA,EAAQ,yBAA2B,IACnCA,EAAQ,iBAAmB,CAAA,EAC3BA,EAAQ,mBAAqB,KAC7B,KAAK,wBAAwB,YAAY,EACzC,MACF,CACAA,EAAQ,OAAS,cACjBA,EAAQ,iBAAmB,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOA,EAAQ,gBAAgB,GAAK,CAAC,CAAC,EAAI,EAC5FA,EAAQ,YAActsF,EAAM,KAAK,+BAA+BssF,EAAQ,gBAAgB,EACxFA,EAAQ,sBAAwBtsF,EAChCssF,EAAQ,yBAA2B,KAAK,iBAAiB,KAAK,SAAW,IAAI,EAC7EA,EAAQ,iBAAmB,CAAA,EAC3BA,EAAQ,mBAAqB,KAC7B,KAAK,iCAAgC,EACrC,KAAK,8BAA8B,GAAM,cAAe,CAAE,cAAe,GAAM,EAC/E,MACF,CACA,GAAI8nH,EAAYC,EAAe,CAC7B/nH,EAAQ,iBAAmB,EAC3BA,EAAQ,sBAAwBtsF,EAChCssF,EAAQ,yBAA2B,KAAK,iBAAiB,KAAK,SAAW,IAAI,EAC7EA,EAAQ,YAActsF,EAAM,KAAK,+BAA+B,CAAC,EACjEssF,EAAQ,iBAAmB,CAAA,EAC3BA,EAAQ,mBAAqB,KAC7B,KAAK,iCAAgC,EACrC,KAAK,8BAA8B,GAAM,cAAe,CAAE,cAAe,GAAM,EAC/E,MACF,CACF,CAEA,mBAAmBxuF,EAAM,CACvB,OAAI,KAAK,UAAU,YAAcA,KAAQ,KAAK,SAAS,WAC9C,KAAK,SAAS,WAAWA,CAAI,EAE/B,KAAK,wBAAwB,IAAIA,CAAI,CAC9C,CAEA,+BAA+ByB,EAAQ,CACrC,GAAI,KAAK,6BAA+B,EAAG,CAEzC,GADA,KAAK,wCAA0CA,EAC3C,KAAK,kCAAmC,OAC5C,KAAK,kCAAoC,IACxB,OAAO,uBAA0B,WAC9C,sBACCtB,GAAa,WAAWA,EAAU,EAAE,GAChC,IAAM,CACb,KAAK,kCAAoC,GACzC,MAAMs2M,EAAa,KAAK,yCAA2Ch1M,EACnE,KAAK,wCAA0C,KAC/C,KAAK,SAAS,sBAAsBg1M,CAAU,CAChD,CAAC,EACD,MACF,CACA,KAAK,SAAS,sBAAsBh1M,CAAM,CAC5C,CAEA,mBAAmBzB,EAAMvC,EAAO,CAC9B,OAAI,KAAK,UAAU,YAAcuC,KAAQ,KAAK,SAAS,YACrD,KAAK,SAAS,WAAWA,CAAI,EAAIvC,EACjC,KAAK,UAAU,cAAa,EAC5B,KAAK,+BAA+B,cAAcuC,CAAI,EAAE,EACxD,KAAK,qBAAqBA,EAAMvC,CAAK,EAC9B,OAET,KAAK,wBAAwB,IAAIuC,EAAMvC,CAAK,EAC5C,KAAK,+BAA+B,sBAAsBuC,CAAI,EAAE,EAChE,KAAK,qBAAqBA,EAAMvC,CAAK,EAC9B,KACT,CAEA,iBAAiBuC,EAAM,CACrB,OAAI,KAAK,UAAYA,KAAQ,KAAK,SACzB,KAAK,SAASA,CAAI,EAEpB,KAAK,sBAAsB,IAAIA,CAAI,CAC5C,CAEA,iBAAiBA,EAAMvC,EAAOqM,EAAS,CAAA,EAAI,CACzC,OAAI,KAAK,UAAY9J,KAAQ,KAAK,UAChC,KAAK,SAASA,CAAI,EAAIvC,EACtB,KAAK,UAAU,cAAa,EAC5B,KAAK,qBAAqBuC,EAAMvC,EAAOqM,CAAM,EACtC,OAET,KAAK,sBAAsB,IAAI9J,EAAMvC,CAAK,EAC1C,KAAK,qBAAqBuC,EAAMvC,EAAOqM,CAAM,EACtC,KACT,CAUA,eAAerM,EAAO,CACpB,OAAI,UAAU,SAAW,EAAU,KAAK,mBAAmB,gBAAgB,EACpE,KAAK,mBAAmB,iBAAkB,OAAOA,CAAK,CAAC,CAChE,CAUA,cAAcA,EAAO,CACnB,OAAI,UAAU,SAAW,EAAU,KAAK,mBAAmB,eAAe,EACnE,KAAK,mBAAmB,gBAAiB,OAAOA,CAAK,CAAC,CAC/D,CAUA,iBAAiBA,EAAO,CACtB,OAAI,UAAU,SAAW,EAAU,KAAK,mBAAmB,kBAAkB,EACtE,KAAK,mBAAmB,mBAAoB,OAAOA,CAAK,CAAC,CAClE,CAUA,gBAAgBA,EAAO,CACrB,OAAI,UAAU,SAAW,EAAU,KAAK,mBAAmB,iBAAiB,EACrE,KAAK,mBAAmB,kBAAmB,OAAOA,CAAK,CAAC,CACjE,CAUA,iBAAiBA,EAAO,CACtB,OAAI,UAAU,SAAW,EAAU,KAAK,mBAAmB,kBAAkB,EACtE,KAAK,mBAAmB,mBAAoB,OAAOA,CAAK,CAAC,CAClE,CAUA,gBAAgBA,EAAO,CACrB,OAAI,UAAU,SAAW,EAAU,KAAK,mBAAmB,iBAAiB,EACrE,KAAK,mBAAmB,kBAAmB,OAAOA,CAAK,CAAC,CACjE,CAUA,cAAcA,EAAO,CACnB,OAAI,UAAU,SAAW,EAAU,KAAK,mBAAmB,eAAe,EACnE,KAAK,mBAAmB,gBAAiB,OAAOA,CAAK,CAAC,CAC/D,CAUA,aAAaA,EAAO,CAClB,OAAI,UAAU,SAAW,EAAU,KAAK,mBAAmB,cAAc,EAClE,KAAK,mBAAmB,eAAgB,OAAOA,CAAK,CAAC,CAC9D,CAUA,qBAAqBA,EAAO,CAC1B,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,mBAAmB,sBAAsB,EACjF,MAAME,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,mBAAmB,uBAAwBA,CAAO,EADxB,IAExC,CAUA,sBAAsBF,EAAO,CAC3B,OAAI,UAAU,SAAW,EAAU,KAAK,mBAAmB,uBAAuB,EAC3E,KAAK,mBAAmB,wBAAyB,OAAOA,CAAK,CAAC,CACvE,CAUA,qBAAqBA,EAAO,CAC1B,OAAI,UAAU,SAAW,EAAU,KAAK,mBAAmB,sBAAsB,EAC1E,KAAK,mBAAmB,uBAAwB,OAAOA,CAAK,CAAC,CACtE,CAUA,iBAAiB4kC,EAAO,CACtB,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,mBAAmB,kBAAkB,EAC7E,MAAMrkC,EAAamyL,GAAoB9tJ,CAAK,EAC5C,GAAI,CAACrkC,EACH,MAAM,IAAI,MAAM,6EAA6E,EAE/F,OAAO,KAAK,mBAAmB,mBAAoBA,CAAU,CAC/D,CAUA,yBAAyBP,EAAO,CAC9B,OAAI,UAAU,SAAW,EAAU,KAAK,mBAAmB,0BAA0B,EAC9E,KAAK,mBAAmB,2BAA4B,EAAQA,CAAM,CAC3E,CAUA,iBAAiBA,EAAO,CACtB,OAAI,UAAU,SAAW,EAAU,KAAK,mBAAmB,kBAAkB,EACtE,KAAK,mBAAmB,mBAAoB,OAAOA,CAAK,CAAC,CAClE,CAUA,6BAA6BA,EAAO,CAClC,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMqK,EAAU,KAAK,mBAAmB,8BAA8B,EACtE,OAAOA,GAAW,KAAO,GAAOA,IAAY,EAC9C,CACA,OAAO,KAAK,mBAAmB,+BAAgCrK,IAAU,EAAK,CAChF,CAUA,mBAAmBA,EAAO,CACxB,OAAI,UAAU,SAAW,EAAU,KAAK,mBAAmB,oBAAoB,EACxE,KAAK,mBAAmB,qBAAsB,EAAQA,CAAM,CACrE,CAUA,eAAeA,EAAO,CACpB,OAAI,UAAU,SAAW,EAAU,KAAK,mBAAmB,gBAAgB,EACpE,KAAK,mBAAmB,iBAAkB,EAAQA,CAAM,CACjE,CAUA,kBAAkBA,EAAO,CACvB,OAAI,UAAU,SAAW,EAAU,KAAK,mBAAmB,mBAAmB,EACvE,KAAK,mBAAmB,oBAAqB,EAAQA,CAAM,CACpE,CAUA,cAAcA,EAAO,CACnB,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMqK,EAAU,KAAK,mBAAmB,eAAe,EACvD,OAAOA,GAAW,KAAO,GAAQA,IAAY,EAC/C,CACA,OAAO,KAAK,mBAAmB,gBAAiB,EAAQrK,CAAM,CAChE,CAUA,YAAYA,EAAO,CACjB,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMqK,EAAU,KAAK,mBAAmB,aAAa,EACrD,OAAOA,GAAW,KAAO,GAAOA,IAAY,EAC9C,CACA,OAAO,KAAK,mBAAmB,cAAerK,IAAU,EAAK,CAC/D,CAUA,YAAYA,EAAO,CACjB,OAAI,UAAU,SAAW,EACP,KAAK,mBAAmB,aAAa,IAClC,GAEd,KAAK,mBAAmB,cAAeA,IAAU,EAAI,CAC9D,CAUA,qBAAqBA,EAAO,CAC1B,OAAI,UAAU,SAAW,EAChB2yL,GAAwB,KAAK,mBAAmB,sBAAsB,EAAGx9J,EAA8B,EAEzG,KAAK,mBAAmB,uBAAwBw9J,GAAwB3yL,EAAOm1B,EAA8B,CAAC,CACvH,CAUA,sBAAsBn1B,EAAO,CAC3B,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,qBAAoB,EAAG,CAAC,EAChE,MAAMwC,EAAO,KAAK,qBAAoB,EACtC,OAAAA,EAAK,CAAC,EAAI,OAAOxC,CAAK,EACf,KAAK,qBAAqBwC,CAAI,CACvC,CAUA,sBAAsBxC,EAAO,CAC3B,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,qBAAoB,EAAG,CAAC,EAChE,MAAMwC,EAAO,KAAK,qBAAoB,EACtC,OAAAA,EAAK,CAAC,EAAI,OAAOxC,CAAK,EACf,KAAK,qBAAqBwC,CAAI,CACvC,CAUA,sBAAsBxC,EAAO,CAC3B,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,qBAAoB,EAAG,CAAC,EAChE,MAAMwC,EAAO,KAAK,qBAAoB,EACtC,OAAAA,EAAK,CAAC,EAAI,OAAOxC,CAAK,EACf,KAAK,qBAAqBwC,CAAI,CACvC,CAUA,iBAAiBoiC,EAAO,CACtB,GAAI,UAAU,SAAW,EACvB,OAAOguJ,GAAgB,KAAK,mBAAmB,kBAAkB,EAAGx9J,EAA0B,EAEhG,MAAM70B,EAAamyL,GAAoB9tJ,CAAK,EAC5C,GAAI,CAACrkC,EACH,MAAM,IAAI,MAAM,6EAA6E,EAE/F,OAAO,KAAK,mBAAmB,mBAAoBA,CAAU,CAC/D,CAUA,sBAAsBqkC,EAAO,CAC3B,GAAI,UAAU,SAAW,EACvB,OAAOguJ,GAAgB,KAAK,mBAAmB,uBAAuB,EAAGv9J,EAAgC,EAE3G,MAAM90B,EAAamyL,GAAoB9tJ,CAAK,EAC5C,GAAI,CAACrkC,EACH,MAAM,IAAI,MAAM,kFAAkF,EAEpG,OAAO,KAAK,mBAAmB,wBAAyBA,CAAU,CACpE,CAUA,yBAAyBqkC,EAAO,CAC9B,GAAI,UAAU,SAAW,EACvB,OAAOguJ,GAAgB,KAAK,mBAAmB,0BAA0B,EAAGt9J,EAAmC,EAEjH,MAAM/0B,EAAamyL,GAAoB9tJ,CAAK,EAC5C,GAAI,CAACrkC,EACH,MAAM,IAAI,MAAM,qFAAqF,EAEvG,OAAO,KAAK,mBAAmB,2BAA4BA,CAAU,CACvE,CAUA,sBAAsBP,EAAO,CAC3B,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMqK,EAAU,OAAO,KAAK,mBAAmB,uBAAuB,CAAC,EACvE,OAAO,OAAO,SAASA,CAAO,EAAIA,EAAUkrB,EAC9C,CACA,MAAMr1B,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,mBAAmB,wBAAyB,KAAK,IAAI,EAAGA,CAAO,CAAC,EADtC,IAExC,CAUA,sBAAsBF,EAAO,CAC3B,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMqK,EAAU,OAAO,KAAK,mBAAmB,uBAAuB,CAAC,EACvE,OAAO,OAAO,SAASA,CAAO,EAAIA,EAAUmrB,EAC9C,CACA,MAAMt1B,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,mBAAmB,wBAAyB,KAAK,IAAI,EAAGA,CAAO,CAAC,EADtC,IAExC,CAUA,oBAAoB0kC,EAAO,CACzB,GAAI,UAAU,SAAW,EACvB,OAAOguJ,GAAgB,KAAK,mBAAmB,qBAAqB,EAAGn9J,EAA6B,EAEtG,MAAMl1B,EAAamyL,GAAoB9tJ,CAAK,EAC5C,GAAI,CAACrkC,EACH,MAAM,IAAI,MAAM,gFAAgF,EAElG,OAAO,KAAK,mBAAmB,sBAAuBA,CAAU,CAClE,CAUA,uBAAuBP,EAAO,CAC5B,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMqK,EAAU,OAAO,KAAK,mBAAmB,wBAAwB,CAAC,EACxE,OAAO,OAAO,SAASA,CAAO,EAAIA,EAAUqrB,EAC9C,CACA,MAAMx1B,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,mBAAmB,yBAA0B,KAAK,IAAI,EAAGA,CAAO,CAAC,EADvC,IAExC,CAUA,gBAAgBF,EAAO,CACrB,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMqK,EAAU,OAAO,KAAK,mBAAmB,iBAAiB,CAAC,EACjE,OAAO,OAAO,SAASA,CAAO,EAAIA,EAAUsrB,EAC9C,CACA,MAAMz1B,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,mBAAmB,kBAAmB,KAAK,IAAI,EAAGA,CAAO,CAAC,EADhC,IAExC,CAUA,wBAAwBF,EAAO,CAC7B,OAAI,UAAU,SAAW,EACP,KAAK,mBAAmB,yBAAyB,IAC9C,GAEd,KAAK,mBAAmB,0BAA2B,EAAQA,CAAM,CAC1E,CAUA,sBAAsBA,EAAO,CAC3B,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMqK,EAAU,KAAK,mBAAmB,uBAAuB,EAC/D,OAAOA,GAAW,KAAO,GAAOA,IAAY,EAC9C,CACA,OAAO,KAAK,mBAAmB,wBAAyBrK,IAAU,EAAK,CACzE,CAUA,sBAAsBA,EAAO,CAC3B,OAAI,UAAU,SAAW,EACP,KAAK,mBAAmB,uBAAuB,IAC5C,GAEd,KAAK,mBAAmB,wBAAyBA,IAAU,EAAI,CACxE,CAUA,yBAAyBA,EAAO,CAC9B,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMqK,EAAU,OAAO,KAAK,mBAAmB,0BAA0B,CAAC,EAC1E,OAAO,OAAO,SAASA,CAAO,EAAIA,EAAUurB,EAC9C,CACA,MAAM11B,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,mBAAmB,2BAA4B,KAAK,IAAI,EAAGA,CAAO,CAAC,EADzC,IAExC,CAUA,uBAAuBF,EAAO,CAC5B,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMqK,EAAU,OAAO,KAAK,mBAAmB,wBAAwB,CAAC,EACxE,OAAO,OAAO,SAASA,CAAO,EAAIA,EAAUwrB,EAC9C,CACA,MAAM31B,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,mBAAmB,yBAA0B,KAAK,IAAI,EAAGA,CAAO,CAAC,EADvC,IAExC,CAUA,qBAAqBF,EAAO,CAC1B,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMqK,EAAU,OAAO,KAAK,mBAAmB,sBAAsB,CAAC,EACtE,OAAO,OAAO,SAASA,CAAO,EAAIA,EAAUyrB,EAC9C,CACA,MAAM51B,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,mBAAmB,uBAAwB,KAAK,IAAI,EAAGA,CAAO,CAAC,EADrC,IAExC,CAUA,qBAAqBF,EAAO,CAC1B,GAAI,UAAU,SAAW,EACvB,OAAOi1B,GACL,KAAK,mBAAmB,sBAAsB,EAC9CF,EACR,EAEI,MAAMx0B,EAAa00B,GAA8Bj1B,EAAO,IAAI,EAC5D,OAAKO,EACE,KAAK,mBAAmB,uBAAwBA,CAAU,EADzC,IAE1B,CAUA,+BAA+BP,EAAO,CACpC,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMqK,EAAU,OAAO,KAAK,mBAAmB,gCAAgC,CAAC,EAChF,OAAO,OAAO,SAASA,CAAO,EAAIA,EAAU0rB,EAC9C,CACA,MAAM71B,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,mBAAmB,iCAAkC,KAAK,IAAI,EAAGA,CAAO,CAAC,EAD/C,IAExC,CAUA,+BAA+BF,EAAO,CACpC,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMqK,EAAU,OAAO,KAAK,mBAAmB,gCAAgC,CAAC,EAChF,OAAO,OAAO,SAASA,CAAO,EAAIA,EAAU2rB,EAC9C,CACA,MAAM91B,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,mBAAmB,iCAAkC,KAAK,IAAI,EAAGA,CAAO,CAAC,EAD/C,IAExC,CAUA,wBAAwBF,EAAO,CAC7B,GAAI,UAAU,SAAW,EACvB,OAAO60B,GACL,KAAK,mBAAmB,yBAAyB,EACjDd,EACR,EAEI,MAAMxzB,EAAas0B,GAAiC70B,EAAO,IAAI,EAC/D,OAAKO,EACE,KAAK,mBAAmB,0BAA2BA,CAAU,EAD5C,IAE1B,CAUA,oBAAoBK,EAAS,CAC3B,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAM6C,EAAS,CAAE,GAAI,KAAK,4BAA8B04L,EAA+B,EACjFprG,EAAU,KAAK,sBAAwB,KAC7C,MAAO,CACL,GAAGttF,EACH,2BAA4BA,EAAO,oBACnC,aAAcA,EAAO,kBACrB,OAAQ,KAAK,UAAU,YAAY,4BAA8B,GACjE,oBAAqB,KAAK,UAAU,YAAY,oBAAsB,GACtE,OAAQstF,GAAS,QAAU,KAC3B,aAAc,OAAO,SAASA,GAAS,YAAY,EAAIA,EAAQ,aAAe,KAC9E,sBAAuB,OAAO,SAASA,GAAS,qBAAqB,EAAIA,EAAQ,sBAAwB,KACzG,wBAAyB,MAAM,QAAQA,GAAS,mBAAmB,EAAIA,EAAQ,oBAAoB,OAAS,CACpH,CACI,CACA,MAAM1mF,EAAU,KAAK,4BAA8B8xL,GAC7C35L,EAAO+7L,GAAmCl0L,EAASzJ,CAAO,EAChE,YAAK,2BAA6B4B,EAClC,KAAK,UAAY,CAAA,EACjB,KAAK,QAAQ,oBAAsB,CAAE,GAAGA,CAAI,EACxC,KAAK,uBACHA,EAAK,UAAY,KACnB,KAAK,qBAAqB,YAAc,OAAO,kBAC/C,KAAK,wBAAwB,YAAY,EACzC,KAAK,iCAAgC,EACrC,KAAK,8BAA8B,GAAO,WAAY,CAAE,cAAe,GAAO,GAEhF,KAAK,qBAAqB,OAASA,EAAK,QAAU,KAAK,qBAAqB,QAAU,UAAY,YAEpG,KAAK,uCAAsC,EAC3C,KAAK,WAAW,gBAAa,EACtB,IACT,CAUA,2BAA2BxC,EAAO,CAChC,OAAI,UAAU,SAAW,EAAU,KAAK,oBAAmB,EAAG,SAC9D,KAAK,oBAAoB,CAAE,QAAS,EAAQA,CAAM,CAAE,EAC7C,KACT,CAUA,wCAAwCA,EAAO,CAC7C,OAAI,UAAU,SAAW,EAAU,KAAK,oBAAmB,EAAG,sBAC9D,KAAK,oBAAoB,CAAE,qBAAsB,OAAOA,CAAK,CAAC,CAAE,EACzD,KACT,CAUA,8CAA8CA,EAAO,CACnD,OAAI,UAAU,SAAW,EAAU,KAAK,oBAAmB,EAAG,qBAC9D,KAAK,oBAAoB,CAAE,oBAAqB,OAAOA,CAAK,CAAC,CAAE,EACxD,KACT,CAUA,mCAAmCA,EAAO,CACxC,OAAI,UAAU,SAAW,EAAU,KAAK,oBAAmB,EAAG,iBAC9D,KAAK,oBAAoB,CAAE,gBAAiB,OAAOA,CAAK,CAAC,CAAE,EACpD,KACT,CAUA,qCAAqCA,EAAO,CAC1C,OAAI,UAAU,SAAW,EAAU,KAAK,oBAAmB,EAAG,mBAC9D,KAAK,oBAAoB,CAAE,kBAAmB,OAAOA,CAAK,CAAC,CAAE,EACtD,KACT,CAUA,oCAAoCA,EAAO,CACzC,OAAI,UAAU,SAAW,EAAU,KAAK,oBAAmB,EAAG,kBAC9D,KAAK,oBAAoB,CAAE,iBAAkB,EAAQA,CAAM,CAAE,EACtD,KACT,CAUA,oCAAoCA,EAAO,CACzC,OAAI,UAAU,SAAW,EAAU,KAAK,oBAAmB,EAAG,kBAC9D,KAAK,oBAAoB,CAAE,iBAAkB,EAAQA,CAAM,CAAE,EACtD,KACT,CAUA,WAAW4kC,EAAO,CAChB,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,iBAAiB,YAAY,EACrE,MAAMrkC,EAAamyL,GAAoB9tJ,CAAK,EAC5C,GAAI,CAACrkC,EACH,MAAM,IAAI,MAAM,uEAAuE,EAEzF,OAAO,KAAK,iBAAiB,aAAcA,CAAU,CACvD,CAUA,WAAWqkC,EAAO,CAChB,OAAI,UAAU,SAAW,EAAU,KAAK,WAAU,EAC3C,KAAK,WAAWA,CAAK,CAC9B,CAUA,cAAc5kC,EAAO,CACnB,GAAI,UAAU,SAAW,EACvB,OAAOM,GAA2B,KAAK,SAAS,cAAe,CAC7D,iBAAkB,KAAK,SAAS,mBAAqB,EAC7D,CAAO,EAEH,MAAMG,EAASH,GAA2BN,EAAO,CAC/C,iBAAkB,KAAK,SAAS,mBAAqB,EAC3D,CAAK,EACD,YAAK,QAAQ,cAAgBQ,GAA4BC,EAAQ,CAC/D,iBAAkB,KAAK,SAAS,mBAAqB,EAC3D,CAAK,EACD,KAAK,QAAQ,iBAAmB,GAChC,KAAK,QAAQ,mBAAmB,KAAK,QAAQ,aAAa,EAC1D,KAAK,qBAAqB,gBAAiBA,CAAM,EAC1C,IACT,CASA,YAAa,CACX,OAAOotD,GAAkB,KAAK,UAAU,QAAU,IAAI,CACxD,CAWA,eAAejtD,EAASq4M,EAAe,GAAI,CACzC,GAAI,UAAU,SAAW,EACvB,OAAO,KAAK,wBAAuB,EAErC,GAAI,CAACr4M,GAAW,OAAOA,GAAY,SAAU,OAAO,KACpD,MAAMs4M,EAAmB,KAAK,wBAAuB,EAC/CvsM,EAAW,KAAK,UAAUusM,CAAgB,EAChD,KAAK,qBAAuBvc,GAA6B,KAAK,sBAAwBjB,GAAyB96L,CAAO,EACtH,MAAMu4M,GAAqB,KAAK,qBAAqB,YAAc,MAAQD,EAAiB,YAAc,GACpGE,EAAgB,KAAK,qBAAqB,eAAiBF,EAAiB,cAC7E,KAAK,UAAU,KAAK,qBAAqB,mBAAqB,IAAI,IAAM,KAAK,UAAUA,EAAiB,mBAAqB,IAAI,EAClI,KAAK,qBAAqB,QAAU,KACtC,KAAK,sBAAsB,YAAc,GAEvCE,IACF,KAAK,sBAAsB,mBAAqB,OAAO,mBAErDD,GAAqB,KAAK,UAAU,QAAQ,OAAS,MACvD,KAAK,WAAW,gBAAa,EAE/B,KAAK,kBAAkB,EAAK,EAC5B,MAAM32M,EAAO,KAAK,wBAAuB,EACzC,GAAI,KAAK,UAAUA,CAAI,IAAMmK,IAC3B,KAAK,yBAAwB,EACzBssM,EAAa,aAAe,IAAS,OAAO,KAAK,QAAQ,KAAQ,YAAY,CAC/E,MAAM11M,EAAS01M,EAAa,QAAU,UAChCn0D,EAAgBm0D,EAAa,eAAiB5jB,GAA4B9xL,EAAQ01M,CAAY,EACpG,UAAW91M,KAAOiyL,GACX,OAAO,UAAU,eAAe,KAAKx0L,EAASuC,CAAG,GAClD,KAAK,UAAU+1M,IAAmB/1M,CAAG,CAAC,IAAM,KAAK,UAAUX,IAAOW,CAAG,CAAC,GAC1E,KAAK,OAAO,IAAI,mBAAmBA,CAAG,GAAI6sK,GAAkBxtK,EAAKW,CAAG,CAAC,EAAG,CACtE,OAAAI,EACA,OAAQ01M,EAAa,QAAU,kBAC/B,cAAAn0D,EACA,aAAc,GACd,WAAYm0D,EAAa,YAAc,IACvC,QAASA,EAAa,SAAW,EAC7C,CAAW,CAEL,CAEF,OAAI,KAAK,qBAAqB,UAAY,IACxC,KAAK,WAAW,gBAAa,EAE3B,KAAK,qBAAqB,eAAiB,IAC7C,KAAK,WAAW,gBAAa,EAE3B,KAAK,qBAAqB,QAAU,IAAQ,KAAK,UAAU,QAAQ,OAAS,MAC9E,KAAK,WAAW,gBAAa,EAExB,IACT,CAWA,kBAAkBjwM,EAAapI,EAAU,GAAI,CAC3C,GAAI,UAAU,SAAW,EACvB,MAAO,CAAC,GAAI,KAAK,sBAAsB,mBAAqB,CAAA,CAAG,EAEjE,MAAML,EAAa87L,GAAuBrzL,CAAW,EAC/CqwM,GAAgBz4M,EAAQ,SAAW,IAAQA,EAAQ,eAAiB,KAASL,GAAY,OAAS,EACxG,KAAK,eAAe,CAClB,kBAAmBA,EACnB,aAAA84M,EACA,GAAIA,GAAgB,OAAO,SAASz4M,EAAQ,sBAAsB,EAAI,CAAE,uBAAwBA,EAAQ,sBAAsB,EAAK,CAAA,EACnI,GAAIy4M,EAAe,CAAE,QAAS,EAAK,EAAK,CAAA,CAC9C,CAAK,EACD,MAAM7R,EAAY,OAAO,SAAS5mM,EAAQ,SAAS,EAC/C,OAAOA,EAAQ,SAAS,EACxB,OAAO,SAASA,EAAQ,UAAU,EAChC,OAAOA,EAAQ,UAAU,EACzB,EACAikM,EAAgBtkM,GAAY,OAAS,GAAKK,EAAQ,gBAAkB,GACpEmkM,EAAUnkM,EAAQ,SAAW,KAAK,sBAAsB,YAAc,GACtE8tD,EAAa9tD,EAAQ,YAAc,KAAK,sBAAsB,oBAC9DiJ,EAAS,KAAK,oBAAoB,CACtC,YAAatJ,GAAY,OAASA,EAAa,OAC/C,SAAU,EACV,WAAY,KAAK,sBAAsB,mBAAqBu6L,GAC5D,oBAAqBv6L,GAAY,OAAS,EAC1C,cAAAskM,EACA,aAAcjkM,EAAQ,cAAgB,CAACikM,EACvC,kBAAmBjkM,EAAQ,mBAAqB,CAACikM,EACjD,cAAejkM,EAAQ,gBAAkBikM,EAAgB,GAAQ,QACjE,UAAA2C,EACA,aAAc5mM,EAAQ,aACtB,iBAAkBA,EAAQ,iBAC1B,mBAAoBA,EAAQ,mBAC5B,QAAAmkM,EACA,WAAAr2I,CACN,CAAK,EACKo2I,EAAW,KAAK,wBAAwBj7L,EAAQ,CACpD,UAAWtJ,GAAY,OAAS,WAAa,OAC7C,UAAAinM,EACA,aAAc5mM,EAAQ,aACtB,iBAAkBA,EAAQ,iBAC1B,mBAAoBA,EAAQ,kBAClC,CAAK,EACD,OAAIy4M,EACF,KAAK,wBAAwBvU,EAAU,CAAE,QAAAC,EAAS,WAAAr2I,CAAU,CAAE,EAE9D,KAAK,sCAAsCo2I,EAAU,CAAE,QAAAC,EAAS,WAAAr2I,CAAU,CAAE,EAEvE,IACT,CAWA,kBAAkB1lD,EAAapI,EAAU,GAAI,CAC3C,GAAI,UAAU,SAAW,EACvB,OAAO,KAAK,sBAAsB,eAAiB,GAC/C,CAAC,GAAI,KAAK,sBAAsB,mBAAqB,CAAA,CAAG,EACxD,CAAA,EAEN,MAAML,EAAa87L,GAAuBrzL,CAAW,EACrD,OAAKzI,GAAY,OAYV,KAAK,kBAAkBA,EAAY,CACxC,GAAGK,EACH,OAAQ,GACR,uBAAwB,OAAO,SAASA,EAAQ,sBAAsB,EAClE,OAAOA,EAAQ,sBAAsB,EACpC,KAAK,sBAAsB,wBAA0B86L,GAAwB,uBAClF,UAAW,OAAO,SAAS96L,EAAQ,SAAS,EACxC,OAAOA,EAAQ,SAAS,EACxB,OAAO,SAASA,EAAQ,UAAU,EAChC,OAAOA,EAAQ,UAAU,EACzB,IACZ,CAAK,GAtBC,KAAK,eAAe,CAAE,kBAAmB,KAAM,aAAc,GAAO,EACpE,KAAK,oCAAmC,EACpCA,EAAQ,QAAU,IACpB,KAAK,aAAa,CAChB,QAASA,EAAQ,SAAW,KAAK,sBAAsB,YAAc,GACrE,WAAYA,EAAQ,YAAc,KAAK,sBAAsB,oBAC7D,iBAAkBA,EAAQ,kBAAoB,EACxD,CAAS,EAEI,KAcX,CAWA,cAAcstD,EAAMttD,EAAU,GAAI,CAChC,MAAM61B,EAAS,KAAK,UAAU,QAAU,KACxC,GAAI,CAACA,GAAU,CAACy3B,GAAQ,OAAOA,GAAS,SAAU,OAAO,MAEvDttD,EAAQ,SAAW,MAChBA,EAAQ,SAAW,eACnBA,EAAQ,SAAW,OACnBA,EAAQ,SAAW,IACnB,OAAO,UAAU,eAAe,KAAKstD,EAAM,UAAU,KAExD,KAAK,gCAA+B,EACpC,KAAK,oCAAmC,GAE1C,MAAM42I,EAAWh3I,GAAgBD,GAAkBp3B,CAAM,EAAGy3B,CAAI,EAChE,MAAI,yBAA0Bz3B,IAAW71B,EAAQ,QAAUA,EAAQ,SAAW,MAC5E61B,EAAO,qBAAuB,CAC5B,OAAQ71B,EAAQ,QAAU,cAC1B,KAAM,MACN,OAAQ,OAAO,UAAU,eAAe,KAAKstD,EAAM,MAAM,EACrD,OACA,OAAO,UAAU,eAAe,KAAKA,EAAM,UAAU,EACnD,QACA,MACN,KAAM42I,EAAS,MAAQruK,EAAO,IACtC,GAEIw3B,GAAgBx3B,EAAQquK,EAAU,CAAE,OAAQlkM,EAAQ,SAAW,GAAO,EAEpEA,EAAQ,aAAe,IACpB,OAAO,KAAK,QAAQ,KAAQ,YAC5By0L,GAA4Bz0L,EAAQ,OAAQA,CAAO,GAEtD,KAAK,OAAO,IAAI,cAAe,KAAK,qBAAqB,CAAE,gBAAiB,EAAK,CAAE,EAAG,CACpF,OAAQA,EAAQ,SAAW,OAAS,UAAaA,EAAQ,QAAU,UACnE,OAAQA,EAAQ,QAAU,cAC1B,cAAe,GACf,aAAc,GACd,WAAYA,EAAQ,YAAc,IAClC,QAASA,EAAQ,SAAW,EACpC,CAAO,GAECA,EAAQ,SAAW,MAAQA,EAAQ,SAAW,eAAiBA,EAAQ,SAAW,OAASA,EAAQ,SAAW,KAChH,KAAK,8CAA8C,CACjD,OAAQA,EAAQ,QAAU,cAC1B,OAAQ,OAAO,UAAU,eAAe,KAAKstD,EAAM,MAAM,EAAI,OAAS,OAAO,UAAU,eAAe,KAAKA,EAAM,UAAU,EAAI,QAAU,KACjJ,CAAO,EAECttD,EAAQ,gBAAkB,IAC5B,KAAK,WAAW,gBAAa,EAExB,IACT,CAWA,MAAM,iBAAiBstD,EAAMttD,EAAU,GAAI,CACzC,MAAM61B,EAAS,KAAK,UAAU,QAAU,KACxC,GAAI,CAACA,GAAU,CAACy3B,GAAQ,OAAOA,GAAS,SAAU,OAAO,KACzD,KAAK,oCAAmC,EACxC,MAAMG,EAAWP,GAAgBD,GAAkBp3B,CAAM,EAAG71B,EAAQ,UAAY,EAAE,EAC5E0tD,EAASR,GAAgBO,EAAUH,CAAI,EAC7C,aAAM,KAAK,oCAAoC,WAAWz3B,EAAQ,CAChE,SAAA43B,EACA,OAAAC,EACA,WAAY1tD,EAAQ,YAAcg6L,EACxC,CAAK,GACGh6L,EAAQ,SAAW,MAAQA,EAAQ,SAAW,eAAiBA,EAAQ,SAAW,OAASA,EAAQ,SAAW,KAChH,KAAK,8CAA8C,CACjD,OAAQA,EAAQ,QAAU,cAC1B,OAAQ,OAAO,UAAU,eAAe,KAAKstD,EAAM,MAAM,EAAI,OAAS,OAAO,UAAU,eAAe,KAAKA,EAAM,UAAU,EAAI,QAAU,KACjJ,CAAO,EAECttD,EAAQ,gBAAkB,IAC5B,KAAK,WAAW,gBAAa,EAExB,IACT,CASA,sBAAuB,CACrB,YAAK,6BAA6B,OAAI,EAC/B,IACT,CASA,MAAO,CACL,OAAO,KAAK,SAAS,OAAS,KAAO,KAAO,IAC9C,CAWA,MAAM,QAAQE,EAAMF,EAAU,GAAI,CAChC,MAAMgL,EAAW9K,IAAS,KAAO,KAAO,KAClCi1K,EAAe,KAAK,KAAI,EAC9B,GAAInqK,IAAamqK,EAAc,OAAO,KAClC,KAAK,wBACP,KAAK,sBAAsB,UAAY,GACvC,KAAK,oCAAmC,GAG1C,GAAI,CACF,MAAMyuB,EAAiB,KAAK,YAAS,GAAQ,CAAE,OAAQ,UAAW,SAAU,IAAI,EAC1EsS,EAAiBtS,EAAe,SAAW,WAAcA,EAAe,UAAY,KAAQ,KAClG,GAAIA,EAAe,SAAW,YAAc5jM,EAAQ,eAAiB,GACnE,GAAI,CACF,MAAM,KAAK,+BAA8B,CAC3C,OAASiE,EAAO,CACd,QAAQ,KAAK,kGAAmGA,CAAK,CACvH,CAGF,KAAK,QAAQ,KAAO+G,EACpB,MAAM0lM,EAAiB1wM,EAAQ,aAAegL,IAAa,KAAO,cAAgB,gBAClF,KAAK,QAAQ,WAAa0lM,EAC1B,IAAIgI,EAAuB,GACvB1tM,IAAa,MAAQ,KAAK,sBAAsB,QAAU,KAC5D,KAAK,qBAAqB,MAAQ,GAClC0tM,EAAuB,IAErB1tM,IAAa,MACf,KAAK,gCAA+B,EAEtC,KAAK,kBAAkB,EAAK,EAC5B,KAAK,0BAA0BA,CAAQ,EACvC,KAAK,SAAS,uBACZ+tL,GAA2B,KAAK,QAAQ,OAAQ,KAAK,QAAQ,KAAM/tL,CAAQ,CACnF,EAEM,MAAM2tM,EAAgB,KAAK,yBAAyB3tM,CAAQ,EAC5D,GACEmqK,IAAiB,MACdnqK,IAAa,MACb,KAAK,mBAAmBwnB,GAC3B,CACA,MAAMjoB,EAAkBquL,GAAqC,KAAK,OAAO,EAEzE,MADiB,KAAK,SAAS,sBAAmB,GAAQ,KAAK,SAAS,kBAAoB,OAC5E,0BAA0B,KAAK,8BAA8B,CAAE,MAAO,SAAU,EAAGruL,CAAe,CACpH,CACIouM,GAAiB34M,EAAQ,SAAW,IACtC,KAAK,qBAAqB,MAAM,EAElC,KAAK,SAAS,gBAAa,EAC3B,KAAK,6BAA6B,KAAK,QAAS,CAAE,mBAAoB,GAAO,EAC7E,KAAK,WAAW,kBAAe,EAC/B,KAAK,WAAW,gBAAgB,MAAM,EACtC,KAAK,WAAW,gBAAa,EAC7B,KAAK,SAAS,sBAAsB,MAAM,EAC1C,KAAK,qBAAkB,EAEvB,MAAM61B,EAAS,KAAK,UAAU,QAAU,KAClC+iL,EAAgB54M,EAAQ,UAAY,GAC1C,GAAI61B,EAAQ,CACV,MAAM5sB,EAAS,KAAK,oBAAoBjJ,EAAQ,OAAS,CAAA,CAAE,GAAK,KAChE,GAAIgL,IAAa,KAAM,CACrB,MAAM6tM,EAAO,KAAK,4BAA4B5vM,EAAQynM,CAAc,EAChEmI,EACED,EACF,MAAM,KAAK,oCAAoC,WAAW/iL,EAAQ,CAChE,SAAUgjL,EAAK,UACf,OAAQA,EAAK,QACb,WAAY74M,EAAQ,kBAAoBg6L,EACxD,CAAe,EAED3sI,GAAgBx3B,EAAQgjL,EAAK,OAAO,EAGtCxrJ,GAAgBx3B,EAAQ,CACtB,GAAGo3B,GAAkBp3B,CAAM,EAC3B,KAAM,KACN,WAAY66K,CAC1B,CAAa,CAEL,KAAO,CACL,MAAMmI,EAAO,KAAK,4BAA4B5vM,CAAM,EACpD,GAAI4vM,EAAM,CACR,GAAID,EAAe,CACjB,MAAM9qJ,EAAa9tD,EAAQ,kBAAoBg6L,GAE/C,MADmB,KAAK,kCAAiC,EACxC,WAAWnkK,EAAQ,CAClC,SAAUgjL,EAAK,UACf,OAAQA,EAAK,QACb,WAAY/qJ,EAAa,EACzC,CAAe,CACH,CACI9tD,EAAQ,eAAiB,IAC3B,MAAM,KAAK,sCAAsC,EAAGk2M,CAAc,EAEhE0C,EACF,MAAM,KAAK,oCAAoC,WAAW/iL,EAAQ,CAChE,SAAUgjL,EAAK,YACf,OAAQA,EAAK,QACb,YAAa74M,EAAQ,kBAAoBg6L,IAAmC,EAC5F,CAAe,EAED3sI,GAAgBx3B,EAAQgjL,EAAK,OAAO,CAExC,MACM74M,EAAQ,eAAiB,IAC3B,MAAM,KAAK,sCAAsC,EAAGk2M,CAAc,EAEpE7oJ,GAAgBx3B,EAAQ,CACtB,GAAGo3B,GAAkBp3B,CAAM,EAC3B,KAAM,KACN,WAAY66K,CAC1B,CAAa,CAEL,CACF,CAEA,OAAIiI,GACF,KAAK,mBAAmB,KAAK,OAAO,EAElCD,GACF,KAAK,yBAAwB,EAE/B,KAAK,KAAK3sE,GAAO,aAAc,CAC7B,KAAM/gI,EACN,aAAAmqK,EACA,WAAYu7B,CACpB,CAAO,EACG1wM,EAAQ,aAAe,IAAS,OAAO,KAAK,QAAQ,KAAQ,YAC9D,KAAK,OAAO,IAAI,kBAAmBgL,EAAU,CAC3C,OAAQhL,EAAQ,SAAW,OAAS,UAAaA,EAAQ,QAAU,UACnE,OAAQA,EAAQ,QAAU,OAC1B,cAAeA,EAAQ,eAAiB,GACxC,aAAc,GACd,WAAYA,EAAQ,YAAc,EAClC,QAASA,EAAQ,SAAW,EACtC,CAAS,EAEI,IACT,QAAC,CACK,KAAK,wBACP,KAAK,sBAAsB,UAAY,IAEzC,KAAK,kBAAkB,EAAK,EAC5B,KAAK,WAAW,gBAAa,CAC/B,CACF,CAgBA,QAAQA,EAAS,CACf,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAM6C,EAAS,KAAK,gBAAkBm4L,GAChCz7F,EAAkB47F,GAA8Bt4L,EAAO,SAAUA,EAAO,eAAe,EACvFi2M,EAAiB1d,GAA6B77F,EAAiB18F,EAAO,cAAc,EAC7Dw4L,GAA4B,CAAE,GAAGx4L,EAAQ,gBAAA08F,EAAiB,eAAAu5G,CAAc,CAAE,EACvG,MAAMvkH,EAAY,KAAK,iBAAiB,YAAc,IAAQukH,IAAmB,WACjF,MAAO,CACL,GAAGj2M,EACH,gBAAA08F,EACA,eAAAu5G,EACA,UAAAvkH,EACA,YAAa,MAAM,QAAQ,KAAK,iBAAiB,WAAW,EAAI,CAAC,GAAG,KAAK,gBAAgB,WAAW,EAAI,KACxG,eAAgB+mG,GAA6B,CAAE,GAAGz4L,EAAQ,gBAAA08F,EAAiB,eAAAu5G,CAAc,EAAI,KAAK,eAAe,CACzH,CACI,CAEA,GAAI94M,GAAW,MAAQA,IAAY,GACjC,YAAK,eAAiB,CAAE,GAAG,KAAK,eAAgB,QAAS,EAAK,EAC9D,KAAK,gBAAkB,CAAE,GAAG,KAAK,gBAAiB,YAAa,IAAI,EACnE,KAAK,uBAAyB,EAC9B,KAAK,2BAA0B,EAC/B,KAAK,WAAW,gBAAa,EACtB,KAGT,GAAI,OAAOA,GAAY,SACrB,MAAM,IAAI,UAAU,oDAAoD,EAI1E,MAAM4B,EAAO,CAAE,GADC,KAAK,gBAAkBo5L,EACd,EA2BzB,GAzBI,OAAO,UAAU,eAAe,KAAKh7L,EAAS,SAAS,IAAG4B,EAAK,QAAU5B,EAAQ,UAAY,IAC7F,OAAO,UAAU,eAAe,KAAKA,EAAS,SAAS,IAAG4B,EAAK,QAAU5B,EAAQ,UAAY,IAC7F,OAAO,UAAU,eAAe,KAAKA,EAAS,cAAc,IAC9D4B,EAAK,aAAeiN,GAAM+uF,GAAe59F,EAAQ,aAAc4B,EAAK,YAAY,EAAG,IAAM,CAAG,GAE1F,OAAO,UAAU,eAAe,KAAK5B,EAAS,cAAc,IAC9D4B,EAAK,aAAeiN,GAAM+uF,GAAe59F,EAAQ,aAAc4B,EAAK,YAAY,EAAG,IAAM,CAAG,GAE1F,OAAO,UAAU,eAAe,KAAK5B,EAAS,aAAa,IAAG4B,EAAK,YAAc5B,EAAQ,cAAgB,IACzG,OAAO,UAAU,eAAe,KAAKA,EAAS,eAAe,IAAG4B,EAAK,cAAgB5B,EAAQ,gBAAkB,IAC/G,OAAO,UAAU,eAAe,KAAKA,EAAS,sBAAsB,IACtE4B,EAAK,cAAgB5B,EAAQ,uBAAyB,IAEpD,OAAO,UAAU,eAAe,KAAKA,EAAS,oBAAoB,IACpE4B,EAAK,cAAgB5B,EAAQ,qBAAuB,IAElD,OAAO,UAAU,eAAe,KAAKA,EAAS,WAAW,IAC3D4B,EAAK,UAAYiN,GAAM+uF,GAAe59F,EAAQ,UAAW4B,EAAK,SAAS,EAAG,IAAM,GAAI,GAElF,OAAO,UAAU,eAAe,KAAK5B,EAAS,aAAa,IAC7D4B,EAAK,YAAciN,GAAM+uF,GAAe59F,EAAQ,YAAa4B,EAAK,WAAW,EAAG,EAAG,GAAG,GAEpF,OAAO,UAAU,eAAe,KAAK5B,EAAS,eAAe,IAC/D4B,EAAK,YAAciN,GAAM+uF,GAAe59F,EAAQ,cAAe4B,EAAK,WAAW,EAAG,EAAG,GAAG,GAEtF,OAAO,UAAU,eAAe,KAAK5B,EAAS,UAAU,GAAK,OAAOA,EAAQ,UAAa,SAAU,CACrG,MAAM41E,EAAU51E,EAAQ,SAAS,KAAI,EACjC41E,IAASh0E,EAAK,SAAWg0E,EAC/B,CACA,GAAI,OAAO,UAAU,eAAe,KAAK51E,EAAS,iBAAiB,GAAK,OAAOA,EAAQ,iBAAoB,SAAU,CACnH,MAAM41E,EAAU51E,EAAQ,gBAAgB,KAAI,EACxC41E,IAASh0E,EAAK,SAAWg0E,EAC/B,CACA,GAAI,OAAO,UAAU,eAAe,KAAK51E,EAAS,iBAAiB,GAAK,OAAOA,EAAQ,iBAAoB,SAAU,CACnH,MAAM41E,EAAU51E,EAAQ,gBAAgB,KAAI,EACxC41E,IAASh0E,EAAK,gBAAkBg0E,EACtC,CACA,GAAI,OAAO,UAAU,eAAe,KAAK51E,EAAS,mBAAmB,GAAK,OAAOA,EAAQ,mBAAsB,SAAU,CACvH,MAAM41E,EAAU51E,EAAQ,kBAAkB,KAAI,EAC1C41E,IAASh0E,EAAK,gBAAkBg0E,EACtC,CAsCA,GArCI,OAAO,UAAU,eAAe,KAAK51E,EAAS,aAAa,IAAG4B,EAAK,YAAc5B,EAAQ,cAAgB,IACzG,OAAO,UAAU,eAAe,KAAKA,EAAS,yBAAyB,IACzE4B,EAAK,YAAc5B,EAAQ,0BAA4B,IAErD,OAAO,UAAU,eAAe,KAAKA,EAAS,gBAAgB,IAChE4B,EAAK,eAAiB5B,EAAQ,iBAAmB,WAAa,WAAa,cAEzE,OAAO,UAAU,eAAe,KAAKA,EAAS,SAAS,IACzD4B,EAAK,QAAUiN,GAAM+uF,GAAe59F,EAAQ,QAAS4B,EAAK,OAAO,EAAG,MAAO,CAAC,GAE1E,OAAO,UAAU,eAAe,KAAK5B,EAAS,gBAAgB,IAChE4B,EAAK,QAAUiN,GAAM+uF,GAAe59F,EAAQ,eAAgB4B,EAAK,OAAO,EAAG,MAAO,CAAC,GAEjF,OAAO,UAAU,eAAe,KAAK5B,EAAS,eAAe,IAC/D4B,EAAK,cAAgBiN,GAAM+uF,GAAe59F,EAAQ,cAAe4B,EAAK,aAAa,EAAG,KAAM,GAAG,GAE7F,OAAO,UAAU,eAAe,KAAK5B,EAAS,sBAAsB,IACtE4B,EAAK,cAAgBiN,GAAM+uF,GAAe59F,EAAQ,qBAAsB4B,EAAK,aAAa,EAAG,KAAM,GAAG,GAEpG,OAAO,UAAU,eAAe,KAAK5B,EAAS,eAAe,IAC/D4B,EAAK,cAAgBiN,GAAM+uF,GAAe59F,EAAQ,cAAe4B,EAAK,aAAa,EAAG,EAAG,CAAC,GAExF,OAAO,UAAU,eAAe,KAAK5B,EAAS,sBAAsB,IACtE4B,EAAK,cAAgBiN,GAAM+uF,GAAe59F,EAAQ,qBAAsB4B,EAAK,aAAa,EAAG,EAAG,CAAC,GAE/F,OAAO,UAAU,eAAe,KAAK5B,EAAS,gBAAgB,IAChE4B,EAAK,eAAiB5B,EAAQ,iBAAmB,IAE/C,OAAO,UAAU,eAAe,KAAKA,EAAS,uBAAuB,IACvE4B,EAAK,eAAiB5B,EAAQ,wBAA0B,IAEtD,OAAO,UAAU,eAAe,KAAKA,EAAS,2BAA2B,IAC3E4B,EAAK,0BAA4B5B,EAAQ,4BAA8B,IAErE,OAAO,UAAU,eAAe,KAAKA,EAAS,kCAAkC,IAClF4B,EAAK,0BAA4B5B,EAAQ,mCAAqC,IAE5E,OAAO,UAAU,eAAe,KAAKA,EAAS,UAAU,GAAK,OAAOA,EAAQ,UAAa,SAAU,CACrG,MAAM41E,EAAU51E,EAAQ,SAAS,KAAI,EACjC41E,IAASh0E,EAAK,SAAWg0E,EAC/B,CACA,GAAI,OAAO,UAAU,eAAe,KAAK51E,EAAS,iBAAiB,GAAK,OAAOA,EAAQ,iBAAoB,SAAU,CACnH,MAAM41E,EAAU51E,EAAQ,gBAAgB,KAAI,EACxC41E,IAASh0E,EAAK,SAAWg0E,EAC/B,CACA,GAAI,OAAO,UAAU,eAAe,KAAK51E,EAAS,mBAAmB,GAAK,OAAOA,EAAQ,mBAAsB,SAAU,CACvH,MAAM41E,EAAU51E,EAAQ,kBAAkB,KAAI,EAC1C41E,IAASh0E,EAAK,kBAAoBg0E,EACxC,CACA,GAAI,OAAO,UAAU,eAAe,KAAK51E,EAAS,0BAA0B,GAAK,OAAOA,EAAQ,0BAA6B,SAAU,CACrI,MAAM41E,EAAU51E,EAAQ,yBAAyB,KAAI,EACjD41E,IAASh0E,EAAK,kBAAoBg0E,EACxC,CACA,GAAI,OAAO,UAAU,eAAe,KAAK51E,EAAS,kBAAkB,GAAK,OAAOA,EAAQ,kBAAqB,SAAU,CACrH,MAAM41E,EAAU51E,EAAQ,iBAAiB,KAAI,EACzC41E,IAASh0E,EAAK,iBAAmBg0E,EACvC,CACA,GAAI,OAAO,UAAU,eAAe,KAAK51E,EAAS,yBAAyB,GAAK,OAAOA,EAAQ,yBAA4B,SAAU,CACnI,MAAM41E,EAAU51E,EAAQ,wBAAwB,KAAI,EAChD41E,IAASh0E,EAAK,iBAAmBg0E,EACvC,CACA,OAAI,OAAO,UAAU,eAAe,KAAK51E,EAAS,mBAAmB,GAAK,OAAOA,EAAQ,mBAAsB,WAC7G4B,EAAK,kBAAoB5B,EAAQ,mBAE/B,OAAO,UAAU,eAAe,KAAKA,EAAS,0BAA0B,GAAK,OAAOA,EAAQ,0BAA6B,WAC3H4B,EAAK,kBAAoB5B,EAAQ,0BAGnC4B,EAAK,gBAAkBu5L,GAA8Bv5L,EAAK,SAAUA,EAAK,eAAe,EACxFA,EAAK,eAAiBw5L,GAA6Bx5L,EAAK,gBAAiBA,EAAK,cAAc,EAE5F,KAAK,eAAiBA,EAClBA,EAAK,iBAAmB,aAC1B,KAAK,gBAAkB,CAAE,GAAG,KAAK,gBAAiB,UAAW,GAAO,YAAa,IAAI,GAEvF,KAAK,uBAAyB,EAC9B,KAAK,2BAA0B,EAC/B,KAAK,WAAW,gBAAa,EACtB,IACT,CAUA,eAAexC,EAAO,CACpB,OAAI,UAAU,SAAW,EAAU,KAAK,QAAO,EAAG,UAAY,GACvD,KAAK,QAAQ,CAAE,QAASA,IAAU,EAAI,CAAE,CACjD,CAUA,aAAaA,EAAO,CAClB,OAAI,UAAU,SAAW,EAAU,KAAK,QAAO,EAAG,aAC3C,KAAK,QAAQ,CAAE,aAAcA,CAAK,CAAE,CAC7C,CAUA,mBAAmBA,EAAO,CACxB,OAAI,UAAU,SAAW,EAAU,KAAK,QAAO,EAAG,cAAgB,GAC3D,KAAK,QAAQ,CAAE,YAAaA,IAAU,EAAI,CAAE,CACrD,CAUA,qBAAqBA,EAAO,CAC1B,OAAI,UAAU,SAAW,EAAU,KAAK,QAAO,EAAG,gBAAkB,GAC7D,KAAK,QAAQ,CAAE,cAAeA,IAAU,EAAI,CAAE,CACvD,CAUA,iBAAiBA,EAAO,CACtB,OAAI,UAAU,SAAW,EAAU,KAAK,QAAO,EAAG,UAC3C,KAAK,QAAQ,CAAE,UAAWA,CAAK,CAAE,CAC1C,CAUA,cAAcA,EAAO,CACnB,OAAI,UAAU,SAAW,EAAU,KAAK,QAAO,EAAG,YAC3C,KAAK,QAAQ,CAAE,YAAaA,CAAK,CAAE,CAC5C,CAUA,gBAAgBA,EAAO,CACrB,OAAI,UAAU,SAAW,EAAU,KAAK,QAAO,EAAG,SAC3C,KAAK,QAAQ,CAAE,SAAUA,CAAK,CAAE,CACzC,CAUA,kBAAkBA,EAAO,CACvB,OAAI,UAAU,SAAW,EAAU,KAAK,QAAO,EAAG,gBAC3C,KAAK,QAAQ,CAAE,gBAAiBA,CAAK,CAAE,CAChD,CAUA,mBAAmBA,EAAO,CACxB,OAAI,UAAU,SAAW,EAAU,KAAK,QAAO,EAAG,cAAgB,GAC3D,KAAK,QAAQ,CAAE,YAAaA,IAAU,EAAI,CAAE,CACrD,CAUA,gBAAgBA,EAAO,CACrB,OAAI,UAAU,SAAW,EAAU,KAAK,QAAO,EAAG,SAC3C,KAAK,QAAQ,CAAE,SAAUA,CAAK,CAAE,CACzC,CAUA,yBAAyBA,EAAO,CAC9B,OAAI,UAAU,SAAW,EAAU,KAAK,QAAO,EAAG,kBAC3C,KAAK,QAAQ,CAAE,kBAAmBA,CAAK,CAAE,CAClD,CASA,kBAAmB,CACjB,YAAK,WAAW,gBAAa,EACtB,IACT,CASA,kBAAmB,CACjB,YAAK,WAAW,gBAAa,EACtB,IACT,CAUA,qBAAqBc,EAAM,CACzB,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,mBAAmB,sBAAsB,EACjF,MAAM0B,EAAO,OAAO1B,GAAQ,EAAE,EACxBi3D,EAAa,KAAK,UAAU,YAAc,KAChD,OAAIA,GAAY,6BAA+B,CAACA,EAAW,4BAA4Bv1D,CAAI,EAClF,KAEF,KAAK,mBAAmB,uBAAwBA,CAAI,CAC7D,CAcA,OAAO5B,EAAS,CACd,MAAMs2I,EAAiB,KAAK,UAAU,QAAU,KAChD,OAAI,UAAU,SAAW,EAChBA,GAAgB,YAAc,KAAK,2BAA0B,EAElEA,GACFA,EAAe,OAAOt2I,CAAO,EACtB,MAEF,KAAK,6BAA6BA,GAAkB,CAAE,QAAS,GAAO,mBAAoB,EAAK,CAAY,CACpH,CAEA,4BAA6B,CAC3B,OAAO,KAAK,SAAS,YAAS,GAAQ,CAAE,QAAS,EAAK,CACxD,CAEA,6BAA6BA,EAAS,CAAE,OAAAowK,EAAS,EAAK,EAAK,CAAA,EAAI,CAC7D,GAAIpwK,GAAW,KACb,KAAK,SAAS,YAAY,CAAE,QAAS,GAAO,mBAAoB,GAAO,UAC9D,OAAOA,GAAY,SAC5B,KAAK,SAAS,YAAYA,CAAO,MAEjC,OAAM,IAAI,UAAU,2CAA2C,EAEjE,YAAK,SAAS,sBAAsB,KAAK,EACzC,KAAK,WAAW,gBAAa,EACxBowK,GAAQ,KAAK,mBAAkB,EAC7B,IACT,CAEA,6BAA8B,CAC5B,OAAO,KAAK,UAAU,YAAS,GAAQ,CAAE,QAAS,EAAI,CACxD,CAEA,8BAA8BpwK,EAAS,CAAE,OAAAowK,EAAS,EAAK,EAAK,CAAA,EAAI,CAC9D,GAAIpwK,IAAY,IAASA,GAAW,KAClC,KAAK,UAAU,YAAY,CAAE,QAAS,EAAK,CAAE,UACpC,OAAOA,GAAY,SAC5B,KAAK,UAAU,YAAYA,CAAO,MAElC,OAAM,IAAI,UAAU,oDAAoD,EAE1E,YAAK,WAAW,gBAAa,EACxBowK,GAAQ,KAAK,mBAAkB,EAC7B,IACT,CAEA,gBAAgBpwK,EAAU,GAAI,CAC5B,OAAO,KAAK,UAAU,cAAcA,CAAO,GAAK,CAAA,CAClD,CAWA,QAAQA,EAAS,CACf,MAAMusI,EAAkB,KAAK,UAAU,SAAW,KAClD,OAAI,UAAU,SAAW,EAChBA,GAAiB,aAAe,KAAK,4BAA2B,EAErEA,GACFA,EAAgB,QAAQvsI,CAAO,EACxB,MAEF,KAAK,8BAA8BA,CAAO,CACnD,CAUA,eAAeZ,EAAO,CACpB,OAAI,UAAU,SAAW,EAAU,KAAK,QAAO,GAAI,UAAY,GACxD,KAAK,QAAQ,CAAE,QAASA,IAAU,EAAI,CAAE,CACjD,CAEA,yBAA0B,CACxB,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAuHT,CAEA,oBAAoBsoG,EAAK,CAAE,KAAA/lG,EAAM,MAAAmjB,EAAO,UAAAqtF,EAAY,GAAI,KAAA4mG,EAAO,GAAI,KAAAh0H,EAAO,EAAE,EAAI,CAC9E,MAAM6vB,EAASlN,EAAI,cAAc,QAAQ,EACzC,OAAAkN,EAAO,KAAO,SACdA,EAAO,UAAY,iCAAiCzC,CAAS,GAAG,KAAI,EACpEyC,EAAO,QAAQ,mBAAqBjzG,EACpCizG,EAAO,aAAa,aAAc9vF,CAAK,EACvC8vF,EAAO,MAAQ9vF,EACXi0L,EAAMnkG,EAAO,UAAYmkG,EACxBnkG,EAAO,YAAc7vB,EACnB6vB,CACT,CAEA,gCAAiC,CAC/B,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAYT,CAEA,yBAAyBlN,EAAK,CAAE,MAAA5iF,EAAO,IAAA0oI,CAAG,EAAI,CAC5C,MAAM54C,EAASlN,EAAI,cAAc,QAAQ,EACzC,OAAAkN,EAAO,KAAO,SACdA,EAAO,UAAY,qCACnBA,EAAO,QAAQ,IAAM44C,EACrB54C,EAAO,aAAa,OAAQ,UAAU,EACtCA,EAAO,YAAc9vF,EACd8vF,CACT,CAEA,qBAAqB44C,EAAK,CACxB,MAAMjJ,EAAM,KAAK,QAAQ,MAAM,eAAe,aAAe,WAAW,QAAU,WAC5Ey0D,EAAS,OAAOz0D,GAAK,MAAS,WAChCA,EAAI,KAAKiJ,EAAK,SAAU,qBAAqB,EAC7C,KACJ,OAAIwrD,GAAU,OAAOA,GAAW,WAAUA,EAAO,OAAS,MACnDA,CACT,CAEA,qBAAsB,CACpB,MAAMn2M,EAAS,KAAK,sBAAwB83L,GAC5C,GAAI93L,EAAO,UAAY,IAAQ,CAAC,KAAK,QAAQ,KAC3C,YAAK,+BAA+B,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAC,CAAE,EACrE,KAET,MAAM6kG,EAAM,KAAK,OAAO,KAAK,gBAAkB,OAAO,SAAa,IAAc,SAAW,MAC5F,GAAI,CAACA,GAAO,OAAOA,EAAI,eAAkB,WAAY,OAAO,KAE5D,KAAK,sBAAqB,EAE1B,MAAM3tF,EAAO2tF,EAAI,cAAc,KAAK,EACpC3tF,EAAK,UAAY,wBACjBA,EAAK,QAAQ,MAAQ,KAAK,2BAA0B,EACpDA,EAAK,MAAM,YAAY,sBAAuB,GAAGlX,EAAO,UAAU,IAAI,EACtEkX,EAAK,MAAM,YAAY,qBAAsB,GAAGlX,EAAO,GAAG,IAAI,EAE9D,MAAMm0B,EAAQ0wE,EAAI,cAAc,OAAO,EACvC1wE,EAAM,YAAc,KAAK,wBAAuB,EAChDjd,EAAK,YAAYid,CAAK,EAEtB,MAAM+lG,EAAU,CAAA,EAChB,IAAIk8E,EAAa,KACjBl8E,EAAQ,OAAS,KAAK,oBAAoBr1B,EAAK,CAC7C,KAAM,SACN,MAAO,eACP,UAAW,wCACX,KAAM,KAAK,+BAA8B,CAC/C,CAAK,EACDq1B,EAAQ,OAAO,aAAa,gBAAiB,MAAM,EACnDA,EAAQ,OAAO,aAAa,gBAAiB,OAAO,EACpDhjH,EAAK,YAAYgjH,EAAQ,MAAM,EAC/Bk8E,EAAavxG,EAAI,cAAc,KAAK,EACpCuxG,EAAW,UAAY,8BACvBA,EAAW,aAAa,OAAQ,MAAM,EACtCA,EAAW,OAAS,GACpB,MAAMC,EAAgB,KAAK,yBAAyBxxG,EAAK,CACvD,MAAO,qBACP,IAAKkzF,EACX,CAAK,EACKue,EAAc,KAAK,yBAAyBzxG,EAAK,CACrD,MAAO,mBACP,IAAKmzF,EACX,CAAK,EACDoe,EAAW,YAAYC,CAAa,EACpCD,EAAW,YAAYE,CAAW,EAClCp/L,EAAK,YAAYk/L,CAAU,EACvBp2M,EAAO,UACTk6H,EAAQ,QAAU,KAAK,oBAAoBr1B,EAAK,CAC9C,KAAM,WACN,MAAO,uBACP,UAAW,qCACX,KAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAOd,CAAO,EACD3tF,EAAK,YAAYgjH,EAAQ,OAAO,GAE9Bl6H,EAAO,SACTk6H,EAAQ,OAAS,KAAK,oBAAoBr1B,EAAK,CAC7C,KAAM,SACN,MAAO,eACP,UAAW,uCACnB,CAAO,EACD3tF,EAAK,YAAYgjH,EAAQ,MAAM,GAE7Bl6H,EAAO,OACTk6H,EAAQ,OAAS,KAAK,oBAAoBr1B,EAAK,CAC7C,KAAM,UACN,MAAO,UACP,UAAW,sCACX,KAAM,GACd,CAAO,EACDq1B,EAAQ,QAAU,KAAK,oBAAoBr1B,EAAK,CAC9C,KAAM,WACN,MAAO,WACP,UAAW,sCACX,KAAM,GACd,CAAO,EACD3tF,EAAK,YAAYgjH,EAAQ,MAAM,EAC/BhjH,EAAK,YAAYgjH,EAAQ,OAAO,GAGlC,MAAMq8E,EAAc/kG,GAAY,CAC1B,OAAOA,GAAY,YAAY,KAAK,sBAAsB,KAAKA,CAAO,CAC5E,EACMglG,EAAe,CAACzkG,EAAQn2F,EAAMhb,IAAY,CAC1C,CAACmxG,GAAU,OAAOA,EAAO,kBAAqB,aAClDA,EAAO,iBAAiBn2F,EAAMhb,CAAO,EACrC21M,EAAW,IAAMxkG,EAAO,sBAAsBn2F,EAAMhb,CAAO,CAAC,EAC9D,EAEM61M,EAAqBC,GAAS,CAC9B,CAACN,GAAc,CAACl8E,EAAQ,SAC5Bk8E,EAAW,OAASM,IAAS,GAC7Bx8E,EAAQ,OAAO,aAAa,gBAAiBw8E,IAAS,GAAO,OAAS,OAAO,EAC7Ex8E,EAAQ,OAAO,WAAW,SAAS,YAAaw8E,IAAS,EAAI,EAC/D,EACMC,EAAehsD,GAAQ,CAC3B8rD,EAAkB,EAAK,EACvB,KAAK,qBAAqB9rD,CAAG,CAC/B,EAiCA,GA/BA6rD,EAAat8E,EAAQ,OAAQ,QAAUt7H,GAAU,CAC/CA,GAAO,iBAAc,EACrBA,GAAO,kBAAe,EACtB63M,EAAkBL,GAAY,SAAW,EAAI,CAC/C,CAAC,EACDI,EAAaH,EAAe,QAAS,IAAMM,EAAY5e,EAAwB,CAAC,EAChFye,EAAaF,EAAa,QAAS,IAAMK,EAAY3e,EAAuB,CAAC,EAC7Ewe,EAAat8E,EAAQ,QAAS,QAAS,IAAM,CAC3C,MAAMn7H,EAAO,KAAK,iBAAc,EAAK,UAAY,GACjD,KAAK,iBAAiB,CAAE,QAASA,EAAM,aAAc,GAAO,kBAAmB,KAAM,EACrF,KAAK,mBAAkB,EACnBA,GACF,KAAK,sBAAsB,CACzB,QAAS,KAAK,sBAAsB,YAAc,GAClD,iBAAkB,KAAK,OAAI,IAAS,IAC9C,CAAS,CAEL,CAAC,EACDy3M,EAAat8E,EAAQ,OAAQ,QAAS,IAAM,CAC1B,KAAK,4BAA2B,EACnC,KAAK,aAAa,gBAAgB,EAC1C,KAAK,cAAW,EACrB,KAAK,mBAAkB,CACzB,CAAC,EACDs8E,EAAat8E,EAAQ,OAAQ,QAAS,IAAM,KAAK,gBAAgB,CAAC,CAAC,EACnEs8E,EAAat8E,EAAQ,QAAS,QAAS,IAAM,KAAK,gBAAgB,EAAE,CAAC,EAErEq8E,EAAW,KAAK,KAAKrtE,GAAO,sBAAuB,IAAM,KAAK,mBAAkB,CAAE,CAAC,EACnFqtE,EAAW,KAAK,KAAKrtE,GAAO,aAAc,IAAM,KAAK,mBAAkB,CAAE,CAAC,EAC1EqtE,EAAW,KAAK,KAAKrtE,GAAO,YAAa,IAAM,KAAK,mBAAkB,CAAE,CAAC,EACzEqtE,EAAW,KAAK,KAAKrtE,GAAO,eAAgB,IAAM,KAAK,mBAAkB,CAAE,CAAC,EACxE,OAAOrkC,EAAI,kBAAqB,WAAY,CAC9C,MAAM+xG,EAAmBh4M,GAAU,CACjC,GAAIw3M,GAAY,SAAW,GAAM,OACjC,MAAM/3M,EAASO,GAAO,QAAU,KAC5BP,GAAU,OAAO6Y,EAAK,UAAa,YAAcA,EAAK,SAAS7Y,CAAM,GACzEo4M,EAAkB,EAAK,CACzB,EACA5xG,EAAI,iBAAiB,cAAe+xG,CAAe,EACnDL,EAAW,IAAM1xG,EAAI,sBAAsB,cAAe+xG,CAAe,CAAC,CAC5E,CAEA,OAAI,OAAO,KAAK,OAAO,UAAa,WAAY,KAAK,OAAO,SAAS,iBAAkB1/L,CAAI,EACtF,KAAK,OAAO,KAAK,YAAYA,CAAI,EACtC,KAAK,eAAiB,CAAE,KAAAA,EAAM,QAAAgjH,CAAO,EACrC,KAAK,8BAA6B,EAClC,KAAK,kCAAiC,EACtC,KAAK,mBAAkB,EAChBhjH,CACT,CAEA,4BAA6B,CAE3B,OADgB,OAAO,KAAK,IAAI,OAAU,UAAY,KAAK,GAAG,MAAQ,KAAK,GAAG,MAAQ,OACpE,KAAK,sBAAsB,OAAS4gL,GAAuB,KAC/E,CAEA,wBAAwB7jG,EAAQ,KAAM,CACpC,MAAM/8E,EAAO,KAAK,gBAAgB,MAAQ,KAC1C,OAAKA,GACLA,EAAK,QAAQ,MAAS,OAAO+8E,GAAU,UAAYA,EAASA,EAAQ,KAAK,2BAA0B,EAC5F,MAFW,IAGpB,CAEA,uBAAwB,CACtB,UAAWud,KAAW,KAAK,uBAAyB,CAAA,EAAIA,IAAO,EAC/D,KAAK,sBAAwB,CAAA,EACzB,KAAK,gBAAgB,OACnB,OAAO,KAAK,QAAQ,aAAgB,WAAY,KAAK,OAAO,YAAY,gBAAgB,EACvF,KAAK,eAAe,KAAK,SAAM,GAEtC,KAAK,eAAiB,KACtB,KAAK,+BAA+B,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAC,CAAE,CAC9E,CAEA,6BAA8B,CAC5B,MAAMxpG,EAAY,KAAK,WAAa,KAIpC,OAHc,OAAOA,GAAW,gBAAmB,WAC/CA,EAAU,eAAc,EACvBA,GAAW,gBAAkB,GAAQ,UAAY,aACrC,SACnB,CAEA,oBAAqB,CACnB,MAAMkyH,EAAU,KAAK,gBAAgB,SAAW,CAAA,EAChD,GAAIA,EAAQ,QAAS,CACnB,MAAM3wH,EAAS,KAAK,iBAAc,EAAK,UAAY,GACnD2wH,EAAQ,QAAQ,WAAW,SAAS,YAAa3wH,CAAM,EACvD2wH,EAAQ,QAAQ,eAAe,eAAgB,OAAO3wH,CAAM,CAAC,EAC7D,MAAM0Y,EAAQ1Y,EAAS,iBAAmB,kBAC1C2wH,EAAQ,QAAQ,MAAQj4G,EACxBi4G,EAAQ,QAAQ,eAAe,aAAcj4G,CAAK,CACpD,CACA,GAAIi4G,EAAQ,OAAQ,CAClB,MAAMkN,EAAU,KAAK,4BAA2B,EAChDlN,EAAQ,OAAO,WAAW,SAAS,YAAakN,CAAO,EACvDlN,EAAQ,OAAO,eAAe,eAAgB,OAAOkN,CAAO,CAAC,EAC7D,MAAMnlH,EAAQmlH,EAAU,eAAiB,aACzClN,EAAQ,OAAO,MAAQj4G,EACvBi4G,EAAQ,OAAO,eAAe,aAAcj4G,CAAK,EACjDi4G,EAAQ,OAAO,UAAYkN,EACvB;AAAA;AAAA;AAAA;AAAA,QAKA;AAAA;AAAA;AAAA,OAIN,CACA,KAAK,wBAAuB,CAC9B,CAEA,gBAAgB90F,EAAW,CACzB,MAAMtf,EAAS,KAAK,UAAU,QAAU,KACxC,GAAI,CAACA,EAAQ,MAAO,GACpB,MAAMwB,EAAS,KAAK,sBAAsB,YAAcsjK,GAAuB,WACzE5rK,EAAQomB,GAAa,EAAI9d,EAAU,EAAIA,EACvCi2B,EAAO,KAAK,aAAU,GAAQL,GAAkBp3B,CAAM,EAC5D,GAAIy3B,GAAM,OAAS,KAAM,CACvB,MAAM7jD,EAAU,OAAO,SAAS6jD,EAAK,QAAQ,EAAIA,EAAK,SAAW,OAAOz3B,EAAO,QAAQ,EACvF,GAAI,CAAC,OAAO,SAASpsB,CAAO,EAAG,MAAO,GACtC,MAAMC,EAAM,KAAK,IAAI,KAAM,OAAOmsB,EAAO,aAAe,IAAI,CAAC,EACvD/mB,EAAM,KAAK,IAAIpF,EAAK,OAAOmsB,EAAO,aAAe,OAAO,iBAAiB,CAAC,EAC1EsxK,EAAet4L,GAAMpF,EAAUslB,EAAOrlB,EAAKoF,CAAG,EACpD,GAAI,KAAK,IAAIq4L,EAAe19L,CAAO,GAAK,KAAM,MAAO,GACrD,KAAK,gBAAgB,CAAE,SAAU09L,CAAY,EAAI,CAAE,OAAQ,KAAM,CACnE,KAAO,CACL,MAAM19L,EAAU,OAAO,SAAS6jD,GAAM,IAAI,EAAIA,EAAK,KAAO,OAAOz3B,EAAO,IAAI,EAC5E,GAAI,CAAC,OAAO,SAASpsB,CAAO,EAAG,MAAO,GACtC,MAAMC,EAAM,KAAK,IAAI,KAAM,OAAOmsB,EAAO,SAAW,IAAI,CAAC,EACnD/mB,EAAM,KAAK,IAAIpF,EAAK,OAAOmsB,EAAO,SAAW,OAAO,iBAAiB,CAAC,EACtEmxK,EAAWn4L,GAAMpF,EAAUslB,EAAOrlB,EAAKoF,CAAG,EAChD,GAAI,KAAK,IAAIk4L,EAAWv9L,CAAO,GAAK,KAAM,MAAO,GACjD,KAAK,gBAAgB,CAAE,KAAMu9L,CAAQ,EAAI,CAAE,OAAQ,KAAM,CAC3D,CACA,YAAK,mBAAkB,EAChB,EACT,CAEA,+BAAgC,CAC9B,MAAMjtL,EAAO,KAAK,gBAAgB,MAAQ,KAC1C,GAAI,CAACA,GAAM,MAAO,OAClB,MAAMlX,EAAS,KAAK,sBAAwB83L,GACtCqG,EAAUpzG,GAAgB,KAAK,kBAAkB,EACjDrsD,EAAWqsD,GAAgB,KAAK,QAAQ,cAAc,EACtD4F,EAAY,CAChB,IAAK,KAAK,IAAIwtG,EAAQ,IAAKz/J,EAAS,GAAG,EACvC,MAAO,KAAK,IAAIy/J,EAAQ,MAAOz/J,EAAS,KAAK,EAC7C,OAAQ,KAAK,IAAIy/J,EAAQ,OAAQz/J,EAAS,MAAM,EAChD,KAAM,KAAK,IAAIy/J,EAAQ,KAAMz/J,EAAS,IAAI,CAChD,EACIxnB,EAAK,MAAM,IAAM,GAAGy5E,EAAU,IAAM3wF,EAAO,MAAM,KACjDkX,EAAK,MAAM,MAAQ,GAAGy5E,EAAU,MAAQ3wF,EAAO,MAAM,IACvD,CAEA,mCAAoC,CAClC,MAAMA,EAAS,KAAK,sBAAwB83L,GAC5C,GAAI93L,EAAO,UAAY,IAAQA,EAAO,qBAAuB,IAAQ,CAAC,KAAK,gBAAgB,KAAM,CAC/F,KAAK,+BAA+B,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAC,CAAE,EAC5E,MACF,CACA,KAAK,+BAA+B,CAClC,IAAK,EACL,MAAOA,EAAO,OAASA,EAAO,WAAaA,EAAO,IAAMA,EAAO,aAC/D,OAAQ,EACR,KAAM,CACZ,CAAK,CACH,CAEA,+BAA+BxB,EAAQ,CACrC,KAAK,4BAA8BusF,GAAgBvsF,CAAM,EACzD,KAAK,oBAAmB,CAC1B,CAEA,qBAAsB,CACpB,MAAMO,EAAO4wL,GAAmB,KAAK,mBAAoB,KAAK,2BAA2B,EACnF3wL,EAAO,KAAK,gBAAkB,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAC,EAC1E,OACEA,EAAK,MAAQD,EAAK,KACfC,EAAK,QAAUD,EAAK,OACpBC,EAAK,SAAWD,EAAK,QACrBC,EAAK,OAASD,EAAK,MAEtB,KAAK,8BAA6B,EAC3B,OAET,KAAK,eAAiBA,EACtB,KAAK,8BAA6B,EAClC,KAAK,WAAW,gBAAa,EACtB,KACT,CAcA,cAAcP,EAAQ,CACpB,GAAI,UAAU,SAAW,EAAG,MAAO,CAAE,GAAG,KAAK,cAAc,EAC3D,MAAMO,EAAOgsF,GAAgBvsF,CAAM,EAC7BQ,EAAO,KAAK,oBAAsB,CAAE,IAAK,EAAG,MAAO,EAAG,OAAQ,EAAG,KAAM,CAAC,EAC9E,OACEA,EAAK,MAAQD,EAAK,KACfC,EAAK,QAAUD,EAAK,OACpBC,EAAK,SAAWD,EAAK,QACrBC,EAAK,OAASD,EAAK,KAEf,MAET,KAAK,mBAAqBA,EACnB,KAAK,oBAAmB,EACjC,CAUA,cAAcxC,EAAO,CACnB,MAAMk3I,EAAiB,KAAK,UAAU,QAAU,KAChD,OAAI,UAAU,SAAW,EAAUA,GAAgB,UAAO,GAAS,KAAK,WAAU,IAAO,OACzFA,GAAgB,UAAUl3I,CAAK,EAC3Bk3I,EAAuB,KACpB,KAAK,WAAWl3I,IAAU,GAAO,OAAS,KAAK,EACxD,CAUA,WAAWA,EAAO,CAChB,MAAMk3I,EAAiB,KAAK,UAAU,QAAU,KAChD,GAAI,UAAU,SAAW,EAAG,CAC1B,GAAIA,EAAgB,OAAOA,EAAe,KAAI,EAC9C,MAAMxhC,EAAS,KAAK,SAAM,GAAQ,CAAE,QAAS,EAAK,EAClD,OAAIA,EAAO,UAAY,GAAa,MAC7BA,EAAO,gBAAkB,gBAAkB,gBAAkB,MACtE,CACA,GAAIwhC,EACF,OAAAA,EAAe,KAAKl3I,CAAK,EAClB,KAET,MAAMq2B,EAAM,OAAOr2B,GAAS,EAAE,EAAE,KAAI,EAAG,YAAW,EAClD,OAAIq2B,IAAQ,YAAcA,IAAQ,iBAAmBA,IAAQ,gBACpD,KAAK,OAAO,CAAE,QAAS,GAAM,cAAe,gBAAiB,EAElEA,IAAQ,OAASA,IAAQ,QAAUA,IAAQ,YAAcA,IAAQ,QAC5D,KAAK,OAAO,CAAE,QAAS,EAAK,CAAE,EAEhC,KAAK,OAAO,CAAE,QAAS,GAAM,cAAe,SAAU,CAC/D,CAUA,iBAAiBr2B,EAAO,CACtB,GAAI,UAAU,SAAW,EAAG,OAAO,OAAO,KAAK,OAAM,GAAI,YAAc,CAAC,EACxE,MAAME,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,OAAO,CAAE,WAAY,KAAK,IAAI,EAAG,KAAK,MAAMA,CAAO,CAAC,CAAC,CAAE,EAD7B,IAExC,CAUA,6BAA6BF,EAAO,CAClC,OAAI,UAAU,SAAW,EAAU,KAAK,OAAM,GAAI,yBAA2B,GACtE,KAAK,OAAO,CAAE,uBAAwBA,IAAU,EAAI,CAAE,CAC/D,CAUA,oBAAoBA,EAAO,CACzB,GAAI,UAAU,SAAW,EAAG,OAAO,OAAO,KAAK,OAAM,GAAI,eAAiB,CAAC,EAC3E,MAAME,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,OAAO,CAAE,cAAe,KAAK,IAAI,IAAMA,CAAO,EAAG,EADvB,IAExC,CAUA,sBAAsBF,EAAO,CAC3B,GAAI,UAAU,SAAW,EAAG,OAAO,OAAO,KAAK,OAAM,GAAI,mBAAqB,CAAC,EAC/E,MAAME,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,OAAO,CAAE,kBAAmB,KAAK,IAAI,EAAGA,CAAO,EAAG,EADxB,IAExC,CAUA,mBAAmBF,EAAO,CACxB,GAAI,UAAU,SAAW,EAAG,OAAO,OAAO,KAAK,OAAM,GAAI,cAAgB,CAAC,EAC1E,MAAME,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,OAAO,CAAE,aAAc,KAAK,IAAI,EAAGA,CAAO,EAAG,EADnB,IAExC,CAUA,yBAAyBF,EAAO,CAC9B,GAAI,UAAU,SAAW,EAAG,OAAO,OAAO,KAAK,OAAM,GAAI,oBAAsB,CAAC,EAChF,MAAME,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,OAAO,CAAE,mBAAoBA,CAAO,CAAE,EADZ,IAExC,CAUA,eAAeF,EAAO,CACpB,GAAI,UAAU,SAAW,EAAG,OAAO,OAAO,KAAK,OAAM,GAAI,UAAY,CAAC,EACtE,MAAME,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,OAAO,CAAE,SAAUA,CAAO,CAAE,EADF,IAExC,CAUA,eAAeF,EAAO,CACpB,GAAI,UAAU,SAAW,EAAG,OAAO,OAAO,KAAK,OAAM,GAAI,UAAY,CAAC,EACtE,MAAME,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,OAAO,CAAE,SAAU,KAAK,IAAI,EAAG,KAAK,MAAMA,CAAO,CAAC,CAAC,CAAE,EAD3B,IAExC,CAUA,cAAcF,EAAO,CACnB,GAAI,UAAU,SAAW,EAAG,OAAO,OAAO,KAAK,OAAM,GAAI,SAAW,CAAC,EACrE,MAAME,EAAU,OAAOF,CAAK,EAC5B,OAAK,OAAO,SAASE,CAAO,EACrB,KAAK,OAAO,CAAE,QAAS,KAAK,IAAI,EAAG,KAAK,MAAMA,CAAO,CAAC,CAAC,CAAE,EAD1B,IAExC,CAUA,UAAU0kC,EAAO,CACf,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,OAAM,GAAI,MAAQ,KAC1D,GAAI,OAAOA,GAAU,UAAYA,EAAM,KAAI,EAAI,OAAO,KAAK,OAAO,CAAE,KAAMA,EAAM,KAAI,CAAE,CAAE,EACxF,MAAMrkC,EAAamyL,GAAoB9tJ,CAAK,EAC5C,GAAIrkC,EAAY,OAAO,KAAK,OAAO,CAAE,KAAMA,EAAY,EACvD,MAAM,IAAI,MAAM,4DAA4D,CAC9E,CAUA,kBAAkBqkC,EAAO,CACvB,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,OAAM,GAAI,cAAgB,KAClE,GAAI,OAAOA,GAAU,UAAYA,EAAM,KAAI,EAAI,OAAO,KAAK,OAAO,CAAE,aAAcA,EAAM,KAAI,CAAE,CAAE,EAChG,MAAMrkC,EAAamyL,GAAoB9tJ,CAAK,EAC5C,GAAIrkC,EAAY,OAAO,KAAK,OAAO,CAAE,aAAcA,EAAY,EAC/D,MAAM,IAAI,MAAM,oEAAoE,CACtF,CAUA,gBAAgBP,EAAO,CACrB,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,OAAM,GAAI,YAAc,GAChE,MAAMwC,EAAO,OAAOxC,GAAS,EAAE,EAAE,KAAI,EACrC,OAAO,KAAK,OAAO,CAAE,WAAYwC,CAAI,CAAE,CACzC,CAUA,YAAYxC,EAAO,CACjB,GAAI,UAAU,SAAW,EAAG,OAAO,KAAK,OAAM,GAAI,QAAU,KAC5D,GAAI,OAAOA,GAAU,WAAY,OAAO,KAAK,OAAO,CAAE,OAAQA,EAAO,EACrE,MAAMwC,EAAOxC,GAAS,KAAO,KAAO,OAAOA,CAAK,EAAE,KAAI,EACtD,OAAO,KAAK,OAAO,CAAE,OAAQwC,GAAQ,IAAI,CAAE,CAC7C,CAYA,MAAM,QAAQ5B,EAAU,GAAI,CAC1B,GAAI,KAAK,eAAgB,OAAO,KAAK,eACrC,KAAK,MAAM,IAAI,SAAU,kCAAmC,CAC1D,oBAAqB,EAC3B,CAAK,EACD,KAAK,gBAAkB,SAAY,CACjC,GAAI,KAAK,aAAc,CACrB,MAAM45E,EAAa,KAAK,WAAW,iBAAgB,EAC7CK,EAAa,KAAK,WAAW,iBAAiB,CAAE,WAAAL,CAAU,CAAE,EAClE,KAAK,QAAQ,aAAa,CAAE,WAAAA,EAAY,WAAAK,CAAU,CAAE,EACpD,KAAK,aAAe,EACtB,CACA,KAAK,WAAW,kBAAe,CACjC,GAAC,EACD,GAAI,CACF,MAAM,KAAK,cACb,OAASh2E,EAAO,CACd,WAAK,eAAiB,KACtB,KAAK,MAAM,IAAI,SAAU,iBAAkB,CAAE,MAAAA,EAAO,EAC9CA,CACR,CACA,OAAO,KAAK,cACd,CAUA,aAAa+0L,EAAc,CACzB,MAAM0gB,EAAgB,KAAK,kBAAiB,EAC5C,GAAItoB,GAAiB4H,CAAY,EAC/B,OAAI0gB,GAAiB1gB,EAAa,UAAY0gB,IAC5C1gB,EAAa,QAAU0gB,GAElB1gB,EAET,GAAIA,GAAc,OAAS,aAAeA,GAAc,OAAS,WAAY,CAC3E,MAAMb,EAAmB,CACvB,GAAIa,EAAa,SAAW,GAC5B,KAAM,KAAK,QAAQ,MAAQ,KAC3B,OAAQ,IAChB,EACY2gB,EAAazhB,GAAwCwhB,EAAevhB,CAAgB,EAC1F,YAAK,MAAM,IAAI,SAAU,yBAA0B,CAAE,GAAGwhB,EAAY,OAAQ,OAAW,EAChF,IAAInnL,GAAeknL,EAAe,KAAK,QAASC,CAAU,CACnE,CACA,GAAI3gB,GAAc,OAAS,SAAU,CACnC,MAAM4gB,EAAgB,CAAE,GAAI5gB,EAAa,SAAW,CAAA,EAAK,KAAM,KAAK,QAAQ,MAAQ,IAAI,EACxF,YAAK,MAAM,IAAI,SAAU,sBAAuB4gB,CAAa,EACtD,IAAI3xM,GAAayxM,EAAe,KAAK,QAASE,CAAa,CACpE,CACA,GAAI5gB,GAAc,OAAS,aAAeA,GAAc,OAAS,cAAe,CAC9E,MAAM4gB,EAAgB,CAAE,GAAI5gB,EAAa,SAAW,CAAA,EAAK,KAAM,KAAK,QAAQ,MAAQ,KAAM,OAAQ,IAAI,EACtG,YAAK,MAAM,IAAI,SAAU,2BAA4B4gB,CAAa,EAC3D,IAAIhwM,GAAgB8vM,EAAe,KAAK,QAASE,CAAa,CACvE,CACA,MAAMphJ,EAAI,KAAK,OAAO,KAAK,MACrBiS,EAAI,KAAK,OAAO,KAAK,OAC3B,YAAK,MAAM,IAAI,SAAU,sBAAuB,CAAE,MAAOjS,EAAG,OAAQiS,EAAG,EAChE,IAAInjE,GAAaoyM,EAAe,KAAK,QAAS,CACnD,OAAQ,CAAC,CAAClhJ,EAAI,GAAK,CAACiS,EAAI,GAAKjS,EAAI,GAAKiS,EAAI,EAAG,CACnD,CAAK,CACH,CAWA,SAAS3jE,EAAO+yM,EAAa,CAC3B,MAAMlzK,EAAQ,KAAK,QAAQ,SAAS7/B,CAAK,EACzC,YAAK,MAAM,IAAI,SAAU,eAAgB,CAAE,MAAAA,EAAO,EAClD,KAAK,QAAQ,kBAAkB6/B,CAAK,EACpC,KAAK,QAAQ,qBAAqBoyJ,GAA2B,KAAK,QAAQ,OAAQ,KAAK,OAAO,KAAM,KAAK,QAAQ,IAAI,CAAC,EAClH8gB,GACFA,EAAYlzK,EAAO,KAAK,OAAO,EAEjC,KAAK,QAAQ,mBAAkB,EAC/B,KAAK,SAAS,mBAAmB,WAAW,EAC5C,KAAK,kBAAkB,EAAK,EAC5B,KAAK,SAAS,6BAA0B,EACxC,KAAK,aAAe,GACpB,KAAK,qBAAqB,MAAM,EAChC,KAAK,UAAU,cAAc,MAAM,EACnC,KAAK,UAAU,gBAAe,EAC9B,KAAK,SAAS,sBAAsB,WAAW,EACxCA,CACT,CAWA,SAASt+B,EAAOwxM,EAAa,CAC3B,MAAMlxM,EAAc,KAAK,QAAQ,SAASN,CAAK,EAC/C,YAAK,MAAM,IAAI,SAAU,eAAgB,CAAE,MAAOM,GAAa,QAAU,EAAG,EAC5E,KAAK,QAAQ,kBAAkBA,CAAW,EACtCkxM,GACFA,EAAYlxM,EAAa,KAAK,OAAO,EAEvC,KAAK,QAAQ,mBAAkB,EAC/B,KAAK,SAAS,mBAAmB,WAAW,EAC5C,KAAK,kBAAkB,EAAK,EAC5B,KAAK,aAAe,GACpB,KAAK,qBAAqB,MAAM,EAChC,KAAK,UAAU,cAAc,MAAM,EACnC,KAAK,UAAU,gBAAe,EAC9B,KAAK,SAAS,sBAAsB,WAAW,EACxCA,CACT,CAEA,qBAAqB,CACnB,MAAAg+B,EACA,MAAAt+B,EACA,SAAA8D,EAAW,GACX,WAAAopE,EAAa,GACb,WAAAjzE,EAAa,GACb,OAAAc,EAAS,iBACb,EAAM,GAAI,CACN,MAAM02M,EAAgBnzK,GAAS,MAAQA,IAAU,GAC3CozK,EAAgB1xM,GAAS,MAAQA,IAAU,GAC3C2xM,EAAeF,GAAiBnzK,IAAU,GAAOA,EAAQ,KACzDszK,EAAeF,GAAiB1xM,IAAU,GAAOA,EAAQ,KACzD6xM,EAAe,KACfC,EAAe,KAEjBL,IACF,KAAK,MAAM,IAAI,SAAU,wBAAyB,CAAE,MAAOnzK,EAAM,QAAUA,EAAM,MAAQA,CAAK,CAAE,EAC5FqzK,GAAc,KAAK,QAAQ,kBAAkBA,CAAY,EAC7D,KAAK,QAAQ,qBAAqBjhB,GAA2B,KAAK,QAAQ,OAAQ,KAAK,OAAO,KAAM,KAAK,QAAQ,IAAI,CAAC,GAEpHghB,IACF,KAAK,MAAM,IAAI,SAAU,wBAAyB,CAAE,MAAO1xM,EAAM,QAAUA,EAAM,MAAQA,CAAK,CAAE,EAC5F4xM,GAAc,KAAK,QAAQ,kBAAkBA,CAAY,GAE/D,KAAK,QAAQ,mBAAkB,GAC3BH,GAAiBC,GAAiB5tM,GAAYopE,GAAcjzE,IAC9D,KAAK,SAAS,mBAAmBc,CAAM,EAEzC,KAAK,kBAAkB,EAAK,GACxB02M,GAAiB3tM,IACnB,KAAK,SAAS,6BAA0B,GAEtCA,GAAYopE,GAAcjzE,KAC5B,KAAK,8BAA8B,CAAE,MAAO,GAAM,aAAc,GAAO,EACvE,KAAK,+BAA4B,GAEnC,KAAK,aAAe,GACpB,KAAK,qBAAqB,MAAM,EAChC,KAAK,UAAU,cAAc,MAAM,EACnC,KAAK,UAAU,gBAAe,EAC9B,KAAK,UAAU,cAAa,EAC5B,KAAK,SAAS,sBAAsB,iBAAiB,EACrD,KAAK,KAAKypI,GAAO,iBAAkB,CACjC,WAAY,KAAK,SAAW,KAC5B,QAAS,KAAK,SAAW,KACzB,aAAAmuE,EACA,aAAAC,EACA,UAAW,KAAK,SAAS,WAAa,KACtC,UAAW,KAAK,SAAS,WAAa,KACtC,KAAM,GACN,OAAA/2M,CACN,CAAK,CACH,CAUA,uBAAuBhE,EAAO,CAC5B,OAAI,UAAU,SAAW,EAAU,KAAK,yBAAyB,UAAY,IAC7E,KAAK,0BAA4B,CAAA,EACjC,KAAK,wBAAwB,QAAUA,IAAU,GACjD,KAAK,UAAY,CAAA,EACjB,KAAK,QAAQ,uBAAyB,KAAK,wBAAwB,QACnE,KAAK,uBAAuB,yBAA0B,KAAK,wBAAwB,OAAO,EACtF,KAAK,wBAAwB,SAAS,KAAK,gDAA6C,EAC5F,KAAK,WAAW,gBAAa,EACtB,KACT,CAEA,sCAAuC,CACrC,OAAO,KAAK,yBAAyB,UAAY,EACnD,CAEA,yBAAyBylC,EAAS7kC,EAAU,GAAI,CAC9C,GAAI,CAAC,KAAK,qCAAoC,GAAM,CAAC6kC,EAAS,OAAO,KACrE,MAAMv+B,EAAU,KAAK,oBAAiB,GAAQ,KAAK,SAAW,KAC9D,GAAI,OAAOA,GAAS,+BAAkC,WAAY,OAAO,KACzE,MAAM5B,EAAS4B,EAAQ,8BAA8Bu+B,CAAO,EAC5D,OAAIngC,GAAQ,SAAS,KAAK,WAAW,gBAAa,EAEhD1E,EAAQ,iBAAmB,IACxB,OAAOsG,EAAQ,uCAA0C,YAEzCA,EAAQ,sCAAsCu+B,EAAS,CAAE,UAAW7kC,EAAQ,WAAa,OAAQ,GACpG,SAAS,KAAK,WAAW,gBAAa,EAEjD0E,CACT,CAEA,yBAAyBmgC,EAAS,CAChC,GAAI,CAAC,KAAK,qCAAoC,GAAM,CAACA,EAAS,OAAO,KACrE,MAAMv+B,EAAU,KAAK,oBAAiB,GAAQ,KAAK,SAAW,KAC9D,GAAI,OAAOA,GAAS,+BAAkC,WAAY,OAAO,KACzE,MAAM5B,EAAS4B,EAAQ,8BAA8Bu+B,CAAO,EAC5D,OAAIngC,GAAQ,SAAS,KAAK,WAAW,gBAAa,EAC3CA,CACT,CAEA,+CAAgD,CAC9C,GAAI,CAAC,KAAK,uCAAwC,OAClD,MAAMw8F,EAAc,KAAK,iBAAmB,KACxCA,GAAa,OAAO,MACtB,KAAK,yBAAyB,MAAM,KAAKA,EAAY,KAAK,EAAG,CAC3D,eAAgB,KAAK,yBAAyB,mCAAqC,IAAQ,KAAK,2BAA6B,EACrI,CAAO,EAECA,GAAa,OAAO,MAAM,KAAK,yBAAyB,MAAM,KAAKA,EAAY,KAAK,CAAC,EACzF,MAAM7qE,EAAY,KAAK,WAAW,MAAM,WAAW,GAAG,OAAS,KAC3DA,GAAW,eAAe,MAC5B,KAAK,yBAAyB,MAAM,KAAKA,EAAU,aAAa,EAAG,CACjE,eAAgB,KAAK,yBAAyB,gCAAkC,IAC3E,KAAK,UAAU,YAAY,gCAAkC,EAC1E,CAAO,EAECA,GAAW,eAAe,MAAM,KAAK,yBAAyB,MAAM,KAAKA,EAAU,aAAa,CAAC,CACvG,CAaA,UAAUwO,EAAS/N,EAAM92B,EAAU,CAAA,EAAI,CACrC,MAAME,EAAOF,EAAQ,MAAQ,UACvBZ,EAAS,OAAOwyL,GAAiB96J,EAAM,KAAK,YAAY,MAAM,CAAC,IAAM,EAC3E,YAAK,QAAQ,iBAAiB,IAAM,CAClC,MAAMjwB,EAAO,KAAK,QAAQ,uBAAuB5B,EAAoB,GAAG,KACxE,GAAI,CAAC4B,EAAM,OACX,MAAMuzM,EAAa,OAAOvzM,EAAK,CAAC,GAAM,SAChCwzM,EAAWD,EAAa,OAAOh7M,CAAK,EAAI,KAC9CoyL,GAAa3sJ,EAAUnyB,GAAU,CAC/B,MAAMlB,EAAK,OAAOkB,CAAK,EACvB,GAAI,CAAC,OAAO,SAASlB,CAAE,GAAKA,EAAK,EAAG,OACpC,MAAM/H,EAAU5C,EAAK2K,CAAE,IAAM4oM,EAAa,GAAK,GAC/C,OAAQl6M,EAAI,CACV,IAAK,MACH2G,EAAK2K,CAAE,EAAI4oM,EAAc3wM,EAAU4wM,GAAc5wM,EAAUrK,KAAW,EACtE,MACF,IAAK,SACHyH,EAAK2K,CAAE,EAAI4oM,EAAc3wM,EAAW,CAAC4wM,GAAe5wM,EAAW,CAACrK,KAAY,EAC5E,MACF,IAAK,SACHyH,EAAK2K,CAAE,EAAI4oM,EAAc3wM,EAAU4wM,GAAc5wM,EAAUrK,KAAW,EACtE,MACF,QACEyH,EAAK2K,CAAE,EAAI4oM,EAAaC,EAAWj7M,EACnC,KACZ,CACM,CAAC,EACD,KAAK,QAAQ,mBAAmB6F,EAAoB,CACtD,CAAC,EACG/E,IAAS,UAAad,EAAQ,KAAK,YAAY,OAAO,cACxD,KAAK,2BAA2BylC,EAAS,CACvC,eAAgB,KAAK,yBAAyB,mCAAqC,IAAQ,KAAK,2BAA6B,EACrI,CAAO,EACD,KAAK,gDAA6C,GAEhD3kC,IAAS,UAAad,EAAQ,KAAK,YAAY,OAAO,UACxD,KAAK,2BAA2BylC,EAAS,CACvC,eAAgB,KAAK,yBAAyB,gCAAkC,IAC3E,KAAK,UAAU,YAAY,gCAAkC,EAC1E,CAAO,EAEH,KAAK,UAAU,gBAAe,EAC9B,KAAK,SAAS,sBAAsB,YAAY,EACzC,IACT,CAaA,UAAUA,EAAS/N,EAAM92B,EAAU,CAAA,EAAI,CACrC,MAAME,EAAOF,EAAQ,MAAQ,UACvBZ,EAAS,OAAOwyL,GAAiB96J,EAAM,KAAK,YAAY,MAAM,CAAC,IAAM,EAC3E,YAAK,QAAQ,iBAAiB,IAAM,CAClC,MAAMjwB,EAAO,KAAK,QAAQ,uBAAuBtB,EAAoB,GAAG,KACxE,GAAI,CAACsB,EAAM,OACX,MAAMuzM,EAAa,OAAOvzM,EAAK,CAAC,GAAM,SAChCwzM,EAAWD,EAAa,OAAOh7M,CAAK,EAAI,KAC9CoyL,GAAa3sJ,EAAUnyB,GAAU,CAC/B,MAAMlB,EAAK,OAAOkB,CAAK,EACvB,GAAI,CAAC,OAAO,SAASlB,CAAE,GAAKA,EAAK,EAAG,OACpC,MAAM/H,EAAU5C,EAAK2K,CAAE,IAAM4oM,EAAa,GAAK,GAC/C,OAAQl6M,EAAI,CACV,IAAK,MACH2G,EAAK2K,CAAE,EAAI4oM,EAAc3wM,EAAU4wM,GAAc5wM,EAAUrK,KAAW,EACtE,MACF,IAAK,SACHyH,EAAK2K,CAAE,EAAI4oM,EAAc3wM,EAAW,CAAC4wM,GAAe5wM,EAAW,CAACrK,KAAY,EAC5E,MACF,IAAK,SACHyH,EAAK2K,CAAE,EAAI4oM,EAAc3wM,EAAU4wM,GAAc5wM,EAAUrK,KAAW,EACtE,MACF,QACEyH,EAAK2K,CAAE,EAAI4oM,EAAaC,EAAWj7M,EACnC,KACZ,CACM,CAAC,EACD,KAAK,QAAQ,mBAAmBmG,EAAoB,CACtD,CAAC,EACGrF,IAAS,UAAad,GAAS,KAAK,YAAY,OAAO,YAAc,KAAK,YAAY,OAAO,YAC/F,KAAK,2BAA2BylC,CAAO,EAClCzlC,EAAQ,KAAK,YAAY,OAAO,aAAoB,KAAK,gDAA6C,GAE7G,KAAK,UAAU,gBAAe,EACvB,IACT,CAWA,eAAesT,EAAOokB,EAAM,CAC1B,MAAMwjL,EAAgB5nM,GAAS,MAAQ,OAAOA,CAAK,EAAI,EAAI,WAAc,OAAOA,CAAK,IAAM,EACrF6nM,EAAYzjL,IAAS,QACrB13B,EAAS,OAAOwyL,GAAiB96J,EAAM,KAAK,YAAY,MAAM,CAAC,IAAM,EACrEs0B,EAAQ,KAAK,UAAU,YAAc,KAC3C,OAAIA,GAAS,qBAAsBA,GACjCA,EAAM,iBAAmBkvJ,EACzBlvJ,EAAM,iBAAmBhsD,EACzBgsD,EAAM,qBAAuBmvJ,GAAaD,IAAkB,WACxDA,IAAkB,aACpB,KAAK,2BAA2B,CAACA,CAAa,EAAG,CAC/C,eAAgB,KAAK,yBAAyB,6BAA+B,IACxElvJ,EAAM,8BAAgC,EACrD,CAAS,EACD,KAAK,gDAA6C,GAEpD,KAAK,UAAU,cAAa,EACrB,OAET,KAAK,wBAAwB,IAAI,mBAAoBkvJ,CAAa,EAClE,KAAK,wBAAwB,IAAI,mBAAoBl7M,CAAK,EAC1D,KAAK,wBAAwB,IAAI,uBAAwBm7M,GAAaD,IAAkB,UAAU,EAC9FA,IAAkB,aACpB,KAAK,2BAA2B,CAACA,CAAa,CAAC,EAC/C,KAAK,gDAA6C,GAE7C,KACT,CAWA,eAAe5nM,EAAOokB,EAAM,CAC1B,MAAMwjL,EAAgB5nM,GAAS,MAAQ,OAAOA,CAAK,EAAI,EAAI,WAAc,OAAOA,CAAK,IAAM,EACrF6nM,EAAYzjL,IAAS,QACrB13B,EAAS,OAAOwyL,GAAiB96J,EAAM,KAAK,YAAY,MAAM,CAAC,IAAM,EACrEs0B,EAAQ,KAAK,UAAU,YAAc,KAC3C,OAAIA,GAAS,qBAAsBA,GACjCA,EAAM,iBAAmBkvJ,EACzBlvJ,EAAM,iBAAmBhsD,EACzBgsD,EAAM,qBAAuBmvJ,GAAaD,IAAkB,WACxDA,IAAkB,aACpB,KAAK,2BAA2B,CAACA,CAAa,CAAC,EAC/C,KAAK,gDAA6C,GAEpD,KAAK,UAAU,cAAa,EACrB,OAET,KAAK,wBAAwB,IAAI,mBAAoBA,CAAa,EAClE,KAAK,wBAAwB,IAAI,mBAAoBl7M,CAAK,EAC1D,KAAK,wBAAwB,IAAI,uBAAwBm7M,GAAaD,IAAkB,UAAU,EAC9FA,IAAkB,aACpB,KAAK,2BAA2B,CAACA,CAAa,CAAC,EAC/C,KAAK,gDAA6C,GAE7C,KACT,CAEA,oBAAoB33M,EAAQ,CAAE,MAAAgkC,EAAQ,CAAA,EAAI,MAAAt+B,EAAQ,CAAA,CAAE,EAAK,GAAI,CAC3D,MAAM9F,EAAM,OAAOI,GAAU,EAAE,EAAE,KAAI,EACrC,OAAKJ,GACL,KAAK,kBAAkB,IAAIA,EAAK,CAC9B,MAAO,IAAI,IAAI,MAAM,KAAKokC,GAAS,CAAA,CAAE,EAAE,IAAI,MAAM,EAAE,OAAQn1B,GAAO,OAAO,UAAUA,CAAE,GAAKA,GAAM,CAAC,CAAC,EAClG,MAAO,IAAI,IAAI,MAAM,KAAKnJ,GAAS,CAAA,CAAE,EAAE,IAAI,MAAM,EAAE,OAAQmJ,GAAO,OAAO,UAAUA,CAAE,GAAKA,GAAM,CAAC,CAAC,CACxG,CAAK,EACM,KAAK,uBAAsB,GALjB,IAMnB,CAEA,gCAAgCR,EAAS,CACvC,MAAM1K,EAAU,KAAK,oBAAiB,GAAQ,KAAK,SAAW,KACxDqgC,EAAQ,IAAI,IAAI,MAAM,KAAK31B,GAAW,CAAA,CAAE,EAAE,IAAI,MAAM,EAAE,OAAQQ,GAAO,OAAO,UAAUA,CAAE,GAAKA,GAAM,CAAC,CAAC,EAC3G,MAAI,CAAClL,GAAW,CAACqgC,EAAM,KAAa,CAAA,EAC7BrgC,EAAQ,mBAAmB,IAAM,CACtC,MAAM8K,EAAM9K,EAAQ,aAAe,CAAA,EAC7B+B,EAAQ/B,EAAQ,WAAa,KACnC,GAAI,CAAC+B,EAAO,MAAO,CAAA,EACnB,MAAM0vF,EAAU,CAAA,EAChB,UAAWE,KAAW7mF,EAAK,CACzB,MAAM4nB,EAAO,OAAOi/D,CAAO,EACrBt1F,EAAS,OAAO0F,EAAM2wB,EAAO,CAAC,CAAC,EAC/B93B,EAAS,OAAOmH,EAAM2wB,EAAO,EAAI,CAAC,CAAC,GACrC2N,EAAM,IAAIhkC,CAAM,GAAKgkC,EAAM,IAAIzlC,CAAM,IAAG62F,EAAQ,KAAK/+D,CAAI,CAC/D,CACA,OAAO++D,CACT,CAAC,GAAK,CAAA,CACR,CAEA,sBAAsBp1F,EAAQ,CAC5B,MAAMJ,EAAM,OAAOI,GAAU,EAAE,EAAE,KAAI,EACrC,MAAI,CAACJ,GAAO,CAAC,KAAK,mBAAmB,IAAIA,CAAG,EAAU,MACtD,KAAK,kBAAkB,OAAOA,CAAG,EAC1B,KAAK,uBAAsB,EACpC,CAEA,wBAAyB,CACvB,MAAMi4M,EAAY,IAAI,IAChBC,EAAY,IAAI,IACtB,UAAWrtL,KAAS,KAAK,mBAAmB,SAAM,GAAQ,CAAA,EAAI,CAC5D,UAAW5b,KAAM4b,EAAM,OAAS,CAAA,EAAIotL,EAAU,IAAIhpM,CAAE,EACpD,UAAWA,KAAM4b,EAAM,OAAS,CAAA,EAAIqtL,EAAU,IAAIjpM,CAAE,CACtD,CACA,GAAI,KAAK,2BAA6B,GACpC,UAAWwnB,KAAQ,KAAK,gCAAgCwhL,CAAS,EAAGC,EAAU,IAAIzhL,CAAI,EAExF,MAAMn3B,EAAO,KAAK,iBAAmB,CAAE,MAAO,IAAI,IAAO,MAAO,IAAI,GAAK,EACnE64M,EAAc,MAAM,KAAK74M,EAAK,KAAK,EAAE,OAAQ2P,GAAO,CAACgpM,EAAU,IAAIhpM,CAAE,CAAC,EACtEmpM,EAAW,MAAM,KAAKH,CAAS,EAAE,OAAQhpM,GAAO,CAAC3P,EAAK,MAAM,IAAI2P,CAAE,CAAC,EACnEopM,EAAc,MAAM,KAAK/4M,EAAK,KAAK,EAAE,OAAQ2P,GAAO,CAACipM,EAAU,IAAIjpM,CAAE,CAAC,EACtEqpM,EAAW,MAAM,KAAKJ,CAAS,EAAE,OAAQjpM,GAAO,CAAC3P,EAAK,MAAM,IAAI2P,CAAE,CAAC,EACzE,OAAIkpM,EAAY,QAAQ,KAAK,UAAUA,EAAa,cAAe,CAAE,KAAM,SAAU,EACjFC,EAAS,QAAQ,KAAK,UAAUA,EAAU,cAAe,CAAE,KAAM,MAAO,EACxEC,EAAY,QAAQ,KAAK,UAAUA,EAAa,cAAe,CAAE,KAAM,SAAU,EACjFC,EAAS,QAAQ,KAAK,UAAUA,EAAU,cAAe,CAAE,KAAM,MAAO,EAC5E,KAAK,gBAAkB,CAAE,MAAOL,EAAW,MAAOC,CAAS,EAC3D,KAAK,gDAA6C,EAClD,KAAK,OAAO,mBAAoB,CAC9B,MAAO,MAAM,KAAKD,CAAS,EAC3B,MAAO,MAAM,KAAKC,CAAS,EAC3B,WAAYE,EACZ,aAAcD,EACd,WAAYG,EACZ,aAAcD,CACpB,CAAK,EACM,IACT,CAUA,wBAAwBx7M,EAAO,CAC7B,OAAI,UAAU,SAAW,EAAU,KAAK,2BAA6B,IACrE,KAAK,yBAA2BA,IAAU,GAC1C,KAAK,UAAY,CAAA,EACjB,KAAK,QAAQ,wBAA0B,KAAK,yBAC5C,KAAK,uBAAsB,EAC3B,KAAK,uBAAuB,0BAA2B,KAAK,wBAAwB,EACpF,KAAK,WAAW,gBAAa,EACtB,KACT,CAWA,eAAe83B,EAAMF,EAAO,CAC1B,GAAI,UAAU,OAAS,EAAG,CACxB,MAAMo0B,EAAQ,KAAK,UAAU,WACvB14C,EAAQ,OAAOm/K,GAAiB36J,EAAM,KAAK,YAAY,MAAM,CAAC,EACpE,GAAI,CAAC,OAAO,UAAUxkB,CAAK,GAAKA,EAAQ,EAAG,OAAO,KAClD,GAAI,CAAC04C,EACH,OAAO,KAAK,kBAAkB,WAAW,IAAI14C,CAAK,GAAK,KAEzD,GAAIA,GAAS04C,EAAM,eAAgB,OAAO,KAC1C,MAAM90B,EAAI5jB,EAAQ,EACZooM,EAAY1vJ,EAAM,6BAA+B,EACvD,MAAO,CACL,QAASA,EAAM,eAAe90B,EAAI,CAAC,EACnC,WAAY80B,EAAM,eAAe90B,EAAI,CAAC,EACtC,WAAY80B,EAAM,eAAe90B,EAAI,CAAC,EACtC,QAAS80B,EAAM,eAAe90B,EAAI,CAAC,IAAM,EACzC,eAAiBwkL,GAAapoM,EAAS,KAAO,EAC9C,SAAU,MAAM,KAAK04C,EAAM,kBAAkB,MAAM90B,EAAGA,EAAI,CAAC,CAAC,EAC5D,SAAU,MAAM,KAAK80B,EAAM,kBAAkB,MAAM90B,EAAGA,EAAI,CAAC,CAAC,CACpE,CACI,CACA,MAAMykL,EAAelpB,GAAiB36J,EAAM,KAAK,YAAY,MAAM,EACnE,OAAI,KAAK,kBAAkB,WACzB,KAAK,iBAAiB,UAAU,IAAI6jL,EAAc/jL,CAAK,EAEzD,KAAK,UAAU,YAAY,oBAAoB+jL,EAAc/jL,CAAK,EAEhE,KAAK,2BAA6B,IAC/B+jL,IAAiBlpB,GAAiB,cAAe,KAAK,YAAY,MAAM,GAE3E,KAAK,eAAe76J,CAAK,EAE3B,KAAK,UAAU,cAAa,EACrB,IACT,CAUA,iBAAiBA,EAAO,CACtB,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMo0B,EAAQ,KAAK,UAAU,WAC7B,OAAKA,EACE,CACL,QAASA,EAAM,iBAAiB,CAAC,EACjC,WAAYA,EAAM,iBAAiB,CAAC,EACpC,WAAYA,EAAM,iBAAiB,CAAC,EACpC,QAASA,EAAM,iBAAiB,CAAC,IAAM,EACvC,SAAU,MAAM,KAAKA,EAAM,oBAAoB,MAAM,EAAG,CAAC,CAAC,EAC1D,SAAU,MAAM,KAAKA,EAAM,oBAAoB,MAAM,EAAG,CAAC,CAAC,CAClE,EARyB,KAAK,kBAAkB,aAAe,IAS3D,CACI,KAAK,mBACP,KAAK,iBAAiB,YAAcp0B,GAEtC,MAAMo0B,EAAQ,KAAK,UAAU,WAC7B,OAAAA,GAAO,sBAAsBp0B,CAAK,EAC9Bo0B,GAASp0B,GAAO,UAAY,KAAOo0B,EAAM,wBAA0B,IACvE,KAAK,UAAU,cAAa,EACrB,IACT,CAWA,eAAel0B,EAAMF,EAAO,CAC1B,GAAI,UAAU,OAAS,EAAG,CACxB,MAAMo0B,EAAQ,KAAK,UAAU,WACvB14C,EAAQ,OAAOm/K,GAAiB36J,EAAM,KAAK,YAAY,MAAM,CAAC,EACpE,GAAI,CAAC,OAAO,UAAUxkB,CAAK,GAAKA,EAAQ,EAAG,OAAO,KAClD,GAAI,CAAC04C,EACH,OAAO,KAAK,kBAAkB,WAAW,IAAI14C,CAAK,GAAK,KAEzD,GAAIA,GAAS04C,EAAM,eAAgB,OAAO,KAC1C,MAAM90B,EAAI5jB,EAAQ,EACZooM,EAAY1vJ,EAAM,6BAA+B,EACvD,MAAO,CACL,SAAUA,EAAM,eAAe90B,EAAI,CAAC,EACpC,WAAY80B,EAAM,eAAe90B,EAAI,CAAC,EACtC,QAAS80B,EAAM,eAAe90B,EAAI,CAAC,IAAM,EACzC,eAAiBwkL,GAAapoM,EAAS,KAAO,EAC9C,SAAU,MAAM,KAAK04C,EAAM,kBAAkB,MAAM90B,EAAGA,EAAI,CAAC,CAAC,EAC5D,SAAU,MAAM,KAAK80B,EAAM,kBAAkB,MAAM90B,EAAGA,EAAI,CAAC,CAAC,CACpE,CACI,CACA,MAAMykL,EAAelpB,GAAiB36J,EAAM,KAAK,YAAY,MAAM,EACnE,OAAI,KAAK,kBAAkB,WACzB,KAAK,iBAAiB,UAAU,IAAI6jL,EAAc/jL,CAAK,EAEzD,KAAK,UAAU,YAAY,oBAAoB+jL,EAAc/jL,CAAK,EAEhE,KAAK,2BAA6B,IAC/B+jL,IAAiBlpB,GAAiB,cAAe,KAAK,YAAY,MAAM,GAE3E,KAAK,eAAe76J,CAAK,EAE3B,KAAK,UAAU,cAAa,EACrB,IACT,CAUA,iBAAiBA,EAAO,CACtB,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMo0B,EAAQ,KAAK,UAAU,WAC7B,OAAKA,EACE,CACL,SAAUA,EAAM,iBAAiB,CAAC,EAClC,WAAYA,EAAM,iBAAiB,CAAC,EACpC,QAASA,EAAM,iBAAiB,CAAC,IAAM,EACvC,SAAU,MAAM,KAAKA,EAAM,oBAAoB,MAAM,EAAG,CAAC,CAAC,EAC1D,SAAU,MAAM,KAAKA,EAAM,oBAAoB,MAAM,EAAG,CAAC,CAAC,CAClE,EAPyB,KAAK,kBAAkB,aAAe,IAQ3D,CACI,KAAK,mBACP,KAAK,iBAAiB,YAAcp0B,GAEtC,MAAMo0B,EAAQ,KAAK,UAAU,WAC7B,OAAAA,GAAO,sBAAsBp0B,CAAK,EAC9Bo0B,GAASp0B,GAAO,UAAY,KAAOo0B,EAAM,wBAA0B,IACvE,KAAK,UAAU,cAAa,EACrB,IACT,CAUA,eAAep0B,EAAO,CACpB,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMo0B,EAAQ,KAAK,UAAU,WAC7B,MAAI,CAACA,GAAS,CAACA,EAAM,gBAAkB,CAACA,EAAM,mBAAqB,CAACA,EAAM,kBACjE,KAAK,kBAAkB,WAAa,KAEtC,CACL,QAASA,EAAM,eAAe,CAAC,EAC/B,WAAYA,EAAM,eAAe,CAAC,EAClC,WAAYA,EAAM,eAAe,CAAC,EAClC,cAAeA,EAAM,yBAA2B,GAChD,SAAU,MAAM,KAAKA,EAAM,kBAAkB,MAAM,EAAG,CAAC,CAAC,EACxD,SAAU,MAAM,KAAKA,EAAM,kBAAkB,MAAM,EAAG,CAAC,CAAC,CAChE,CACI,CACA,OAAI,KAAK,mBAAkB,KAAK,iBAAiB,UAAYp0B,GAC7D,KAAK,UAAU,YAAY,oBAAoBA,CAAK,EACpD,KAAK,UAAU,cAAa,EACrB,IACT,CAUA,eAAeA,EAAO,CACpB,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAMo0B,EAAQ,KAAK,UAAU,WAC7B,MAAI,CAACA,GAAS,CAACA,EAAM,gBAAkB,CAACA,EAAM,mBAAqB,CAACA,EAAM,kBACjE,KAAK,kBAAkB,WAAa,KAEtC,CACL,SAAUA,EAAM,eAAe,CAAC,EAChC,WAAYA,EAAM,eAAe,CAAC,EAClC,cAAeA,EAAM,yBAA2B,GAChD,SAAU,MAAM,KAAKA,EAAM,kBAAkB,MAAM,EAAG,CAAC,CAAC,EACxD,SAAU,MAAM,KAAKA,EAAM,kBAAkB,MAAM,EAAG,CAAC,CAAC,CAChE,CACI,CACA,OAAI,KAAK,mBAAkB,KAAK,iBAAiB,UAAYp0B,GAC7D,KAAK,UAAU,YAAY,oBAAoBA,CAAK,EACpD,KAAK,UAAU,cAAa,EACrB,IACT,CAEA,4BAA6B,CAC3B,MAAMs4I,EAAY,KAAK,iBAAiB,aAAa,GAAK,KACpDC,EAAY,KAAK,iBAAiB,aAAa,GAAK,KAC1D,OAAID,GAAW,KAAK,eAAeA,CAAS,EACxCC,GAAW,KAAK,eAAeA,CAAS,EACrC,IACT,CAUA,wBAAwBnwK,EAAO,CAC7B,OAAI,UAAU,SAAW,EAAU,KAAK,2BAA6B,IACrE,KAAK,yBAA2BA,IAAU,GAC1C,KAAK,UAAY,CAAA,EACjB,KAAK,QAAQ,wBAA0B,KAAK,yBACxC,KAAK,0BAA0B,KAAK,2BAA0B,EAClE,KAAK,uBAAuB,0BAA2B,KAAK,wBAAwB,EACpF,KAAK,WAAW,gBAAa,EACtB,KACT,CASA,kBAAmB,CACjB,OAAI,KAAK,mBACP,KAAK,iBAAiB,UAAU,MAAK,EACrC,KAAK,iBAAiB,UAAU,MAAK,EACrC,KAAK,iBAAiB,YAAc,KACpC,KAAK,iBAAiB,YAAc,KACpC,KAAK,iBAAiB,UAAY,KAClC,KAAK,iBAAiB,UAAY,MAEpC,KAAK,UAAU,YAAY,mBAAgB,EAC3C,KAAK,UAAU,cAAa,EACrB,IACT,CAYA,QAAQ,CAAE,WAAAw6E,EAAY,WAAAK,CAAU,EAAK,CAAA,EAAI,CACvC,OAAI,UAAU,SAAW,EAChB,CAAE,WAAY,KAAK,WAAY,WAAY,KAAK,UAAU,EAE/DL,IAAe,MAAQK,IAAe,MACxC,KAAK,MAAM,IAAI,SAAU,+BAA+B,EACxD,KAAK,WAAa,IAAI2B,GAAiB,OAAQ,KAAK,QAAS,IAAM,CACjE,KAAK,iBAAgB,CACvB,EAAG,KAAK,KAAK,EACb,KAAK,WAAa,IAAIA,GAAiB,OAAQ,KAAK,QAAS,IAAM,CACjE,KAAK,iBAAgB,CACvB,EAAG,KAAK,KAAK,EACb,KAAK,aAAe,GACpB,KAAK,KAAKmwD,GAAO,gBAAiB,CAChC,KAAM2mD,GAA+B,KAAK,UAAU,EACpD,KAAMA,GAA+B,KAAK,UAAU,CAC5D,CAAO,EACD,KAAK,WAAW,kBAAe,EAC/B,KAAK,UAAU,gBAAe,EACvB,OAEL94G,IACF,KAAK,MAAM,IAAI,SAAU,uBAAuB,EAChD,KAAK,WAAW,WAAWA,CAAU,GAEnCK,IACF,KAAK,MAAM,IAAI,SAAU,uBAAuB,EAChD,KAAK,WAAW,WAAWA,CAAU,GAEvC,KAAK,aAAe,GACpB,KAAK,KAAK8xD,GAAO,gBAAiB,CAChC,KAAM2mD,GAA+B,KAAK,UAAU,EACpD,KAAMA,GAA+B,KAAK,UAAU,CAC1D,CAAK,EACD,KAAK,UAAU,gBAAe,EACvB,KACT,CAUA,OAAOrvL,EAAQ,CACb,GAAI,UAAU,SAAW,EACvB,OAAO,KAAK,QAEd,GAAI,CAAC+tL,GAAiB/tL,CAAM,EAC1B,MAAM,IAAI,MAAM,0CAA0C,EAE5D,MAAM23M,EAAU,KAAK,6BAA4B,EAC3CC,EAAa,KAAK,6BAA6B53M,CAAM,EACrD63M,EAAiCF,EAAQ,kBAC1CC,EAAW,SAAW,WAE3B,OAAID,EAAQ,SAAW,CAACE,EACtB,KAAK,6BAA4B,EACxBF,EAAQ,UACjB,KAAK,sBAAwB,MAE3BA,EAAQ,aAAeA,EAAQ,cAAgBA,EAAQ,gBACzDA,EAAQ,YAAY,UAAO,EAExBE,GACHF,EAAQ,gBAAgB,UAAO,EAGjC,KAAK,QAAU,KAAK,oBAAoB33M,CAAM,EAC9C,KAAK,MAAM,IAAI,SAAU,kBAAmB,CAAE,OAAQA,GAAQ,aAAa,KAAM,EACjF,KAAK,QAAQ,kBAAmBmD,GAAY,KAAK,oBAAoBA,CAAO,CAAC,EAC7E,KAAK,MAAM,IAAI,SAAU,kCAAkC,EAC3D,KAAK,QAAQ,aAAU,EACvB,KAAK,QAAQ,SAAS,KAAK,OAAO,IAAI,EACjC00M,EAIH,KAAK,4BAA4B,CAC/B,eAAgBF,EAAQ,eACxB,iBAAkBA,EAAQ,iBAC1B,WAAY,KAAK,OACzB,CAAO,GAPD,KAAK,6BAA6B,KAAK,QAAS,CAAE,mBAAoB,GAAM,EAC5E,KAAK,6BAA6B,KAAK,QAAS,CAAE,mBAAoB,GAAO,GAQ/E,KAAK,MAAM,IAAI,SAAU,iCAAkC,KAAK,OAAO,IAAI,EAC3E,KAAK,UAAU,UAAU,KAAK,OAAO,EACrC,KAAK,mBAAmB,KAAK,OAAO,EACpC,KAAK,UAAU,cAAc,MAAM,EACnC,KAAK,UAAU,cAAa,EACrB,IACT,CAYA,kCAAkCh7M,EAAU,GAAI,CAC9C,MAAMsG,EAAUtG,EAAQ,SAAW,KAAK,SAAW,KAC7CE,GAAQF,EAAQ,MAAQ,KAAK,SAAS,QAAU,KAAO,KAAO,KAC9Dm7M,EAAgB,CACpB,MAAOr2M,GACP,MAAO,oBACP,UAAW,CACjB,EACUs2M,EAAe,CACnB,MAAOrlC,GACP,MAAO71K,IAAS,KAAO,6BAA+B,+BACtD,UAAWA,IAAS,KAAO,EAAI,CACrC,EACI,GAAI,CAACoG,GAAW,OAAOA,EAAQ,uBAA0B,WACvD,MAAO,CAAC60M,EAAeC,CAAY,EAGrC,MAAMp7L,EAAQ,IAAI,IAAI1Z,EAAQ,wBAAqB,GAAQ,CAAA,CAAE,EAC7D0Z,EAAM,IAAIlb,EAAuB,EAEjC,MAAM4kI,EAAU,CAAC0xE,CAAY,EAC7B,UAAWz5M,KAAQqe,EAAO,CACxB,MAAMo1D,EAAO9uE,EAAQ,uBAAuB3E,CAAI,GAAK,KAC/C86C,EAAY,OAAO24B,GAAM,WAAa,CAAC,EACzC,CAAC,OAAO,SAAS34B,CAAS,GAAMA,IAAc,GAAKA,IAAc,GACjE24B,GAAM,UAAY,IACjBgkH,GAAqChkH,GAAM,IAAI,GACpDs0D,EAAQ,KAAK,CACX,MAAO/nI,EACP,MAAOA,IAASmD,GAA0B,oBAAsB,GAAGnD,CAAI,KAAK86C,CAAS,KACrF,UAAAA,CACR,CAAO,CACH,CAEA,OAAAitF,EAAQ,KAAK,CAACzvH,EAAGC,IACXD,EAAE,QAAUnV,GAAgC,GAC5CoV,EAAE,QAAUpV,GAAgC,EAC5CmV,EAAE,QAAU87J,GAAsC,GAClD77J,EAAE,QAAU67J,GAAsC,EAC/C,OAAO97J,EAAE,KAAK,EAAE,cAAc,OAAOC,EAAE,KAAK,CAAC,CACrD,EAEMwvH,EAAQ,OAASA,EAAU,CAACyxE,EAAeC,CAAY,CAChE,CAYA,oCAAoCz5M,EAAM3B,EAAU,GAAI,CACtD,MAAMsG,EAAUtG,EAAQ,SAAW,KAAK,SAAW,KAC7CuG,EAAU,KAAK,SAAW,KAC1BqvE,EAAU,OAAOj0E,GAAS,SAAWA,EAAK,KAAI,EAAK,GACzD,GAAI,CAAC2E,GAAW,CAACsvE,EAAS,MAAO,GAEjC,MAAM6L,EAAas3G,GACjB,KAAK,SAAS,OACd,KAAK,QAAQ,KACb,KAAK,SAAS,IACpB,EACI,GAAInjH,IAAYmgG,GAA+B,CAC7CxvK,GAAS,sBAAsBzB,GAAyB84C,GAAAA,cAAc,MAAO,CAAC,EAE9E,IAAIl3C,EAAQ,GACZ,MAAM20M,EAAkB,IAAM,CAE5B,MAAM9kK,GADejwC,EAAQ,yBAAyBxB,EAAuB,GAAK,OACjD,MAAQ,KACnCsD,EAAc9B,EAAQ,aAAe,KAC3C,GAAI,CAACiwC,GAAc,CAACnuC,GAAa,OAAQ,OAEzC,MAAMM,EAAS,MAAM,QAAQ+4E,EAAW,MAAM,EAAIA,EAAW,OAAS,CAAC,EAAG,EAAG,CAAC,EACxEpE,EAAK,OAAO,SAAS30E,EAAO,CAAC,CAAC,EAAIA,EAAO,CAAC,EAAI,EAC9C40E,EAAK,OAAO,SAAS50E,EAAO,CAAC,CAAC,EAAIA,EAAO,CAAC,EAAI,EAC9C60E,EAAK,OAAO,SAAS70E,EAAO,CAAC,CAAC,EAAIA,EAAO,CAAC,EAAI,EAC9CuwL,EAAWx3G,EAAW,OAAS,KAAO,KAAO,KAY7C65H,GAXOriB,IAAa,KACtB,KAAK,IACH,EACA,OAAOx3G,EAAW,KAAK,GAAK,EAC5B,OAAOA,EAAW,MAAM,GAAK,EAC7B,OAAOA,EAAW,KAAK,GAAK,CAC1C,EACY,KAAK,IAAI,EAAG,KAAK,IACf,OAAOA,EAAW,KAAK,GAAK,EAC5B,OAAOA,EAAW,MAAM,GAAK,CAC3C,CAAa,GACmB,GAExB,QAASn5E,EAAI,EAAGA,EAAIF,EAAY,OAAQE,GAAK,EAAG,CAE9C,MAAMR,EADSM,EAAYE,CAAC,EACJ,EACxBiuC,EAAWzuC,CAAM,EAAIu1E,GAAO,KAAK,SAAW,EAAI,GAAKi+H,EACrD/kK,EAAWzuC,EAAS,CAAC,EAAIw1E,GAAO,KAAK,SAAW,EAAI,GAAKg+H,EACzD/kK,EAAWzuC,EAAS,CAAC,EAAImxL,IAAa,KAClC17G,GAAO,KAAK,OAAM,EAAK,EAAI,GAAK+9H,EAChC,EACJ50M,EAAQ,EACV,CACF,EAQA,OANI,OAAOJ,EAAQ,kBAAqB,WACtCA,EAAQ,iBAAiB+0M,CAAe,EAExCA,EAAe,EAGZ30M,GAEL,KAAK,2BAA2B,CAAE,iBAAkB,GAAO,oBAAqB,GAAM,EACtFH,GAAS,qBAAkB,EAC3BA,GAAS,qBAAqBzB,EAAuB,EACrD,KAAK,kBAAkB,EAAK,EAC5B,KAAK,SAAS,2BAAwB,EACtC,KAAK,WAAW,kBAAe,EAC/B,KAAK,WAAW,gBAAa,EAC7B,KAAK,SAAS,sBAAsB,wBAAwB,EACrD,IAVY,EAWrB,CAEA,MAAMswE,EAAO9uE,EAAQ,uBAAuBsvE,CAAO,GAAK,KAClDn5B,EAAY,OAAO24B,GAAM,WAAa,CAAC,EAC7C,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,2BAA2BQ,CAAO,GAAG,EAEvD,GAAI,CAACwjH,GAAqChkH,EAAK,IAAI,GAAKA,EAAK,UAAY,IAAS34B,IAAc,GAAKA,IAAc,EACjH,MAAM,IAAI,MAAM,mBAAmBm5B,CAAO,+CAA+C,EAG3FrvE,GAAS,sBAAsBzB,GAAyB84C,GAAAA,cAAc,MAAO,CAAC,EAE9E,IAAIl3C,EAAQ,GACZ,MAAMK,EAAQ,IAAM,CAClB,MAAMme,EAAe5e,EAAQ,yBAAyBsvE,CAAO,GAAK,KAC5D2lI,EAAej1M,EAAQ,yBAAyBxB,EAAuB,GAAK,KAC5E+yD,EAAa3yC,GAAc,MAAQ,KACnCqxB,EAAaglK,GAAc,MAAQ,KACzC,GAAI,CAAC1jJ,GAAc,CAACthB,EAAY,OAEhC,MAAMtK,EAAc,KAAK,MAAM4rB,EAAW,OAASpb,CAAS,EACtDm6J,EAAc,KAAK,MAAMrgK,EAAW,OAAS,CAAC,EAC9CzvC,EAAQ,KAAK,IAAImlC,EAAa2qK,CAAW,EAC/C,GAAI,EAAA9vM,GAAS,GAEb,QAAS4L,EAAQ,EAAGA,EAAQ5L,EAAO4L,GAAS,EAAG,CAC7C,MAAMmE,EAAenE,EAAQ+pC,EACvB3lC,EAAepE,EAAQ,EACvB,EAAI,OAAOmlD,EAAWhhD,CAAY,CAAC,EACnC7O,EAAI,OAAO6vD,EAAWhhD,EAAe,CAAC,CAAC,EACvC3M,EAAIuyC,IAAc,EAAI,OAAOob,EAAWhhD,EAAe,CAAC,CAAC,EAAI,EAC/D,CAAC,OAAO,SAAS,CAAC,GAAK,CAAC,OAAO,SAAS7O,CAAC,GAAK,CAAC,OAAO,SAASkC,CAAC,IACpEqsC,EAAWz/B,CAAY,EAAI,EAC3By/B,EAAWz/B,EAAe,CAAC,EAAI9O,EAC/BuuC,EAAWz/B,EAAe,CAAC,EAAI5M,EAC/BxD,EAAQ,GACV,CACF,EAQA,OANI,OAAOJ,EAAQ,kBAAqB,WACtCA,EAAQ,iBAAiBS,CAAK,EAE9BA,EAAK,EAGFL,GAEL,KAAK,2BAA2B,CAAE,iBAAkB,GAAO,oBAAqB,GAAM,EACtFH,GAAS,qBAAkB,EAC3BA,GAAS,qBAAqBzB,EAAuB,EACrD,KAAK,kBAAkB,EAAK,EAC5B,KAAK,SAAS,2BAAwB,EACtC,KAAK,WAAW,kBAAe,EAC/B,KAAK,WAAW,gBAAa,EAC7B,KAAK,SAAS,sBAAsB,2BAA2B,EACxD,IAVY,EAWrB,CAYA,UAAU9E,EAAS,CACjB,GAAI,UAAU,SAAW,EACvB,MAAO,CACL,OAAQ,KAAK,kBAAkB,QAAU,UACzC,SAAU,KAAK,kBAAkB,UAAY,IACrD,EAKI,GAHIA,GAAW,OACbA,EAAU,CAAE,OAAQ,UAAW,SAAU,IAAI,GAE3C,OAAOA,GAAY,SACrB,MAAM,IAAI,UAAU,8CAA8C,EAEpE,YAAK,6BAA6B,KAAK,QAAS,CAAE,mBAAoB,GAAO,EAC7E,KAAK,iCAAgC,EACrC,KAAK,kBAAkB,EAAK,EAC5B,KAAK,UAAU,gBAAe,EAC9B,KAAK,UAAU,cAAa,EAC5B,KAAK,SAAS,sBAAsB,kBAAkB,EAC/C,IACT,CAWA,MAAM,0BAA0BA,EAAU,GAAI,CAC5C,MAAMo3B,EAAWp3B,GAAS,UAAY,KAAK,kBAAkB,UAAY,KAAK,yBAA2B,KACzG,GAAI,CAACo3B,EAAU,OAAO,KACtB,MAAMvrB,EAAU,KAAK,8BAA8B7L,CAAO,EAC1D,GAAI,OAAOo3B,EAAS,uBAA0B,WAC5C,OAAOA,EAAS,sBAAsBvrB,CAAO,EAE/C,IAAIhF,EAAO,KAMX,OALI,OAAOuwB,EAAS,qBAAwB,WAC1CvwB,EAAOuwB,EAAS,oBAAoBvrB,CAAO,EAClC,OAAOurB,EAAS,iBAAoB,aAC7CvwB,EAAOuwB,EAAS,gBAAgBvrB,CAAO,GAErC,CAAChF,GAAQ,CAAC,OAAO,SAASA,EAAK,MAAM,GAAKA,EAAK,QAAU,EAAU,KAChE,IAAI,aAAaA,CAAI,CAC9B,CAaA,MAAM,sBAAsBmK,EAAShR,EAAU,GAAI,CACjD,MAAMoR,EAAMsqL,GAA+B1qL,CAAO,EAC5ClK,EAAQsK,EAAI,OACZzO,EAAS,KAAK,kBAAoB,CAAE,OAAQ,UAAW,SAAU,IAAI,EACrEy0B,EAAWp3B,GAAS,UAAY2C,EAAO,UAAY,KAAK,yBAA2B,KACnF+O,EAAM1R,GAAS,eAAe,aAAeA,EAAQ,IAAM,KACjE,GAAIo3B,IAAap3B,GAAS,UAAY2C,EAAO,SAAW,YAAa,CACnE,MAAMkJ,EAAU,KAAK,8BAA8B7L,CAAO,EAC1D,GAAI,OAAOo3B,EAAS,2BAA8B,WAAY,CAC5D,MAAM1yB,EAAS,MAAM0yB,EAAS,0BAA0BvrB,EAASuF,EAAKpR,CAAO,EAC7E,GAAI0E,GAAQ,WAAa,GACvB,MAAO,CACL,IAAKA,EAAO,KAAO,YAAY,KAAK0M,CAAG,EACvC,UAAW,KACX,MAAO,OAAO,SAAS1M,EAAO,KAAK,EAAIA,EAAO,MAAQoC,EACtD,QAAS,OAAO,SAASpC,EAAO,OAAO,EAAIA,EAAO,QAAU0yB,EAAS,SAAW,EAChF,OAAQ1yB,EAAO,QAAU,oBACzB,SAAU,EACtB,EAEQ,GAAIA,GAAQ,qBAAqB,aAC/B,MAAO,CACL,IAAKA,EAAO,KAAO,YAAY,KAAK0M,CAAG,EACvC,UAAW1M,EAAO,UAClB,MAAO,OAAO,SAASA,EAAO,KAAK,EAAIA,EAAO,MAAQoC,EACtD,QAAS,OAAO,SAASpC,EAAO,OAAO,EAAIA,EAAO,QAAU0yB,EAAS,SAAW,EAChF,OAAQ1yB,EAAO,QAAU,UACrC,CAEM,CACA,IAAImC,EAAO,KAMX,GALI,OAAOuwB,EAAS,qBAAwB,WAC1CvwB,EAAOuwB,EAAS,oBAAoBvrB,CAAO,EAClC,OAAOurB,EAAS,iBAAoB,aAC7CvwB,EAAOuwB,EAAS,gBAAgBvrB,CAAO,GAErChF,GAAQ,OAAO,SAASA,EAAK,MAAM,GAAKA,EAAK,OAAS,EACxD,MAAO,CACL,IAAK,YAAY,KAAKuK,CAAG,EACzB,UAAWwqL,GAA8B/0L,EAAMuK,EAAKM,CAAG,EACvD,MAAA5K,EACA,QAAS,OAAO,SAASswB,EAAS,OAAO,EAAIA,EAAS,QAAU,EAChE,OAAQ,eAClB,EAEM,MAAM3wB,EAAW,MAAM,KAAK,0BAA0B,CAAE,GAAGzG,EAAS,SAAAo3B,EAAU,EAC9E,MAAO,CACL,IAAK,YAAY,KAAKhmB,CAAG,EACzB,UAAWwqL,GAA8Bn1L,EAAU2K,EAAKM,CAAG,EAC3D,MAAA5K,EACA,QAAS,OAAO,SAASswB,EAAS,OAAO,EAAIA,EAAS,QAAU,EAChE,OAAQ,mBAChB,CACI,CAEA,MAAM9wB,EAAU,KAAK,oBAAiB,GAAQ,KAAK,SAAW,KAC9D,IAAIkB,EAAY,KAChB,MAAM4mB,EAAO,IAAM,CACjB,MAAMvnB,EAAOP,GAAS,yBAAyBxB,EAAuB,GAAG,MAAQ,KACjF0C,EAAYo0L,GAA8B/0L,EAAMuK,EAAKM,CAAG,CAC1D,EACA,OAAI,OAAOpL,GAAS,kBAAqB,WACvCA,EAAQ,iBAAiB8nB,CAAI,EAE7BA,EAAI,EAEC,CACL,IAAK,YAAY,KAAKhd,CAAG,EACzB,UAAW5J,GAAam0L,GAAkBjqL,EAAK5K,EAAQ,CAAC,EACxD,MAAAA,EACA,QAAS,OAAO,SAASR,GAAS,0BAA0BxB,EAAuB,CAAC,EAChFwB,EAAQ,wBAAwBxB,EAAuB,EACvD,EACJ,OAAQ,SACd,CACE,CAYA,MAAM,qBAAqB2F,EAAQzK,EAAU,GAAI,CAC/C,MAAMwR,EAAK,KAAK,MAAM,OAAO/G,CAAM,CAAC,EAC9B+wM,EAAS,OAAO,SAAShqM,CAAE,GAAKA,GAAM,EAAIA,EAAK,GAC/CE,EAAM1R,GAAS,eAAe,cAAgBA,EAAQ,IAAI,QAAU,EACtEA,EAAQ,IACR,IAAI,aAAa,CAAC,EAChB0E,EAAS82M,GAAU,EACrB,MAAM,KAAK,sBAAsB,CAACA,CAAM,EAAG,CAAE,GAAGx7M,EAAS,IAAA0R,CAAG,CAAE,EAC9D,KACJ,OAAKhN,IACHgN,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAI,EACTA,EAAI,CAAC,EAAI,GAEJ,CACL,GAAI8pM,EACJ,SAAU92M,GAAQ,WAAagN,EAC/B,QAAShN,GAAQ,SAAW,EAC5B,OAAQA,GAAQ,QAAU,SAChC,CACE,CAYA,MAAM,qBAAqBsM,EAAShR,EAAU,GAAI,CAChD,MAAMoR,EAAMsqL,GAA+B1qL,CAAO,EAC5ClK,EAAQsK,EAAI,OACZzO,EAAS,KAAK,kBAAoB,CAAE,OAAQ,UAAW,SAAU,IAAI,EACrEy0B,EAAWp3B,GAAS,UAAY2C,EAAO,UAAY,KAAK,yBAA2B,KACnF+O,EAAM1R,GAAS,eAAe,aAAeA,EAAQ,IAAM,KACjE,GAAIo3B,IAAap3B,GAAS,UAAY2C,EAAO,SAAW,aAAe,OAAOy0B,EAAS,0BAA6B,WAAY,CAC9H,MAAMvrB,EAAU,KAAK,8BAA8B7L,CAAO,EACpD0E,EAAS,MAAM0yB,EAAS,yBAAyBvrB,EAASuF,EAAKpR,CAAO,EAC5E,GAAI0E,GAAQ,WAAa,GACvB,MAAO,CACL,SAAU,KACV,MAAO,OAAO,SAASA,EAAO,KAAK,EAAIA,EAAO,MAAQ,EACtD,QAAS,OAAO,SAASA,EAAO,OAAO,EAAIA,EAAO,QAAU0yB,EAAS,SAAW,EAChF,OAAQ1yB,EAAO,QAAU,oBACzB,SAAU,EACpB,EAEM,GAAIA,GAAQ,oBAAoB,aAC9B,MAAO,CACL,SAAUA,EAAO,SACjB,MAAO,OAAO,SAASA,EAAO,KAAK,EAAIA,EAAO,MAAQoC,EACtD,QAAS,OAAO,SAASpC,EAAO,OAAO,EAAIA,EAAO,QAAU0yB,EAAS,SAAW,EAChF,OAAQ1yB,EAAO,QAAU,UACnC,CAEI,CACA,MAAM8C,EAAY,MAAM,KAAK,sBAAsB4J,EAAKpR,CAAO,EACzD0E,EAASm3L,GAA2Br0L,GAAW,UAAWA,GAAW,OAASV,EAAO4K,CAAG,EAC9F,MAAO,CACL,SAAUhN,EAAO,SACjB,MAAOA,EAAO,MACd,QAAS8C,GAAW,SAAW,EAC/B,OAAQA,GAAW,QAAU,SACnC,CACE,CAWA,MAAM,+BAA+BxH,EAAU,GAAI,CACjD,MAAMo3B,EAAWp3B,GAAS,UAAY,KAAK,kBAAkB,UAAY,KAAK,yBAA2B,KACzG,GAAI,CAACo3B,EAAU,MAAO,GACtB,MAAMvrB,EAAU,KAAK,8BAA8B7L,CAAO,EAC1D,IAAI0G,EAAQ,GACZ,GAAI,OAAO0wB,EAAS,mCAAsC,WACxD1wB,EAAQ,MAAM0wB,EAAS,kCAAkCvrB,CAAO,MAC3D,CACL,MAAMpF,EAAW,MAAM,KAAK,0BAA0B,CAAE,GAAGzG,EAAS,SAAAo3B,EAAU,EAC9E1wB,EAAQ,KAAK,oBAAoBD,CAAQ,CAC3C,CACA,OAAKC,GACL,KAAK,SAAS,qBAAkB,EAChC,KAAK,kBAAkB,EAAK,EAC5B,KAAK,WAAW,kBAAe,EAC/B,KAAK,WAAW,gBAAa,EACtB,IALY,EAMrB,CAaA,cAAc1G,EAAS,CACrB,GAAI,UAAU,SAAW,EAAG,CAC1B,MAAM6C,EAAS,KAAK,sBAAwBk4L,GACtC2Y,EAAe9V,GAAiC/6L,CAAM,EAC5D,MAAO,CACL,GAAGA,EACH,aAAA6wM,EACA,iBAAkBA,IAAiB,WACnC,gBAAiB7wM,EAAO,WACxB,OAAQ,KAAK,uBAAuB,SAAW,GAC/C,OAAQquB,GAAQ,KAAK,uBAAuB,OAAQ,CAAC,EACrD,oBAAqB,OAAO,SAAS,KAAK,uBAAuB,mBAAmB,EAChF,KAAK,sBAAsB,oBAC3B,KAAK,gCAAgC,YAAY,KAAK,CAClE,CACI,CACA,IAAIuqL,EAAUz7M,EAOd,GANI,OAAOy7M,GAAY,WACrBA,EAAU,CAAE,KAAMA,EAAS,QAAS,EAAI,GAEtCA,GAAW,OACbA,EAAU,CAAE,QAAS,EAAK,GAExB,OAAOA,GAAY,SACrB,MAAM,IAAI,UAAU,gEAAgE,EAEtF,MAAMhyM,EAAU,KAAK,sBAAwB,CAAE,GAAGsxL,EAA+B,EAC3En5L,EAAO,CAAE,GAAG6H,CAAO,EACrB,OAAO,UAAU,eAAe,KAAKgyM,EAAS,SAAS,IACzD75M,EAAK,QAAU65M,EAAQ,UAAY,IAErC,MAAMC,EACJ,OAAO,UAAU,eAAe,KAAKD,EAAS,cAAc,GACzD,OAAO,UAAU,eAAe,KAAKA,EAAS,kBAAkB,EAE/DE,EAA4B,OAAO,UAAU,eAAe,KAAKF,EAAS,kBAAkB,EAC5FG,EAAyB,OAAO,UAAU,eAAe,KAAKH,EAAS,iBAAiB,GAE5F,OAAO,UAAU,eAAe,KAAKA,EAAS,MAAM,GACjD,OAAO,UAAU,eAAe,KAAKA,EAAS,MAAM,KAEvD75M,EAAK,KAAO27L,GAA2Bke,EAAQ,MAAQA,EAAQ,IAAI,GAEjEC,IACF95M,EAAK,aAAe47L,GAClBie,EAAQ,cAAgBA,EAAQ,iBAChC7d,GAAiCn0L,CAAO,CAChD,EACM7H,EAAK,iBAAmBA,EAAK,eAAiB,YAE5C+5M,IACF/5M,EAAK,iBAAmB65M,EAAQ,mBAAqB,GACrD75M,EAAK,aAAeA,EAAK,iBAAmB,WAAa,UAGzD,OAAO,UAAU,eAAe,KAAK65M,EAAS,YAAY,GACvD,OAAO,UAAU,eAAe,KAAKA,EAAS,UAAU,GACxD,OAAO,UAAU,eAAe,KAAKA,EAAS,iBAAiB,KAElE75M,EAAK,WAAag0I,GAChB6lE,EAAQ,iBAAmBA,EAAQ,YAAcA,EAAQ,SACzDhyM,EAAQ,WACR,EACA,GACR,GAEQmyM,GAA0B,CAACF,GAAyB,CAACC,IACvD/5M,EAAK,aAAe,QACpBA,EAAK,iBAAmB,IAEtB,OAAO,UAAU,eAAe,KAAK65M,EAAS,yBAAyB,IACzE75M,EAAK,wBAA0Bo6L,GAC7Byf,EAAQ,wBACRhyM,EAAQ,wBACR,EACA,GACR,GAEQ,OAAO,UAAU,eAAe,KAAKgyM,EAAS,0BAA0B,IAC1E75M,EAAK,yBAA2Bg0I,GAC9B6lE,EAAQ,yBACRhyM,EAAQ,yBACR,IACA,GACR,GAEQ,OAAO,UAAU,eAAe,KAAKgyM,EAAS,uBAAuB,IACvE75M,EAAK,sBAAwBg0I,GAC3B6lE,EAAQ,sBACRhyM,EAAQ,sBACR,EACA,EACR,GAEQ,OAAO,UAAU,eAAe,KAAKgyM,EAAS,uBAAuB,IACvE75M,EAAK,sBAAwBg0I,GAC3B6lE,EAAQ,sBACRhyM,EAAQ,sBACR,EACA,GACR,GAEQ,OAAO,UAAU,eAAe,KAAKgyM,EAAS,uBAAuB,IACvE75M,EAAK,sBAAwBg0I,GAC3B6lE,EAAQ,sBACRhyM,EAAQ,sBACR,EACA,GACR,GAEQ,OAAO,UAAU,eAAe,KAAKgyM,EAAS,QAAQ,IACxD75M,EAAK,OAAS67L,GAA6Bge,EAAQ,OAAQhyM,EAAQ,MAAM,GAEvE,OAAO,UAAU,eAAe,KAAKgyM,EAAS,WAAW,IAC3D75M,EAAK,UAAYg0I,GAA2B6lE,EAAQ,UAAWhyM,EAAQ,SAAS,GAE9E,OAAO,UAAU,eAAe,KAAKgyM,EAAS,sBAAsB,IACtE75M,EAAK,qBAAuBg0I,GAC1B6lE,EAAQ,qBACRhyM,EAAQ,oBAChB,GAEI7H,EAAK,aAAe47L,GAClB57L,EAAK,aACLA,EAAK,mBAAqB,GAAO,WAAa,OACpD,EACIA,EAAK,iBAAmBA,EAAK,eAAiB,WAC9CA,EAAK,KAAO,MACZ,MAAMi6M,EAActe,GAA2B9zL,EAAQ,IAAI,IAAM8zL,GAA2B37L,EAAK,IAAI,EAC/F4yG,EAAW/qG,EAAQ,UAAY,IAAQ7H,EAAK,UAAY,GAC9D,YAAK,qBAAuBA,EACxBi6M,GAAernG,EACjB,KAAK,2BAA2B,CAAE,iBAAkB,EAAI,CAAE,EACjD,KAAK,wBACd,KAAK,sBAAsB,oBAAsB,KAAK,gCAAgC,YAAY,KAAK,GAEzG,KAAK,iCAAgC,EACrC,KAAK,UAAU,cAAa,EACrB,IACT,CAWA,UAAUnxG,EAAQ,CAAE,OAAO,KAAK,OAAOA,CAAM,CAAG,CAShD,aAAarD,EAAS,CAAE,OAAO,KAAK,UAAUA,CAAO,CAAG,CASxD,iBAAiBA,EAAS,CAAE,OAAO,KAAK,cAAcA,CAAO,CAAG,CAShE,WAAWA,EAAS,CAAE,OAAO,KAAK,QAAQA,CAAO,CAAG,CASpD,UAAUA,EAAS,CAAE,OAAO,KAAK,OAAOA,CAAO,CAAG,CASlD,WAAWA,EAAS,CAAE,OAAO,KAAK,QAAQA,CAAO,CAAG,CASpD,WAAW45K,EAAS,CAAE,OAAO,KAAK,QAAQA,CAAO,CAAG,CAWpD,aAAa/0I,EAAS/N,EAAM92B,EAAS,CAAE,OAAO,KAAK,UAAU6kC,EAAS/N,EAAM92B,CAAO,CAAG,CAWtF,aAAa6kC,EAAS/N,EAAM92B,EAAS,CAAE,OAAO,KAAK,UAAU6kC,EAAS/N,EAAM92B,CAAO,CAAG,CAUtF,kBAAkBk3B,EAAMF,EAAO,CAAE,OAAO,KAAK,eAAeE,EAAMF,CAAK,CAAG,CAU1E,kBAAkBE,EAAMF,EAAO,CAAE,OAAO,KAAK,eAAeE,EAAMF,CAAK,CAAG,CAS1E,oBAAoBA,EAAO,CAAE,OAAO,KAAK,iBAAiBA,CAAK,CAAG,CASlE,oBAAoBA,EAAO,CAAE,OAAO,KAAK,iBAAiBA,CAAK,CAAG,CASlE,kBAAkBA,EAAO,CAAE,OAAO,KAAK,eAAeA,CAAK,CAAG,CAS9D,kBAAkBA,EAAO,CAAE,OAAO,KAAK,eAAeA,CAAK,CAAG,CAS9D,2BAA2B53B,EAAO,CAAE,OAAO,KAAK,wBAAwBA,CAAK,CAAG,CAShF,2BAA2BA,EAAO,CAAE,OAAO,KAAK,wBAAwBA,CAAK,CAAG,CAWhF,YAAY08M,EAAO,KAAMnzL,EAAS,KAAM,CACtC,MAAMozL,EAAgB,OAAOD,GAAS,SAAWA,EAAO,KAClDE,EAAkBrzL,IAAWozL,EAAgB,KAAOD,GAC1D,YAAK,UAAU,iBAAiB,GAAM,MAAM,EAC5C,KAAK,qBAAqB,MAAM,EAChC,KAAK,UAAU,cAAc,MAAM,GAC/BC,GAAiBC,IACnB,KAAK,MAAM,IAAI,SAAU,qBAAsB,CAAE,KAAMD,EAAe,OAAQC,EAAiB,EAE1F,IACT,CAUA,WAAW54M,EAAS,OAAQ,CAC1B,YAAK,UAAU,iBAAiB,GAAOA,CAAM,EACtC,IACT,CASA,eAAgB,CACd,YAAK,UAAU,cAAa,EACrB,IACT,CASA,kBAAmB,CACjB,GAAI,CAAC,KAAK,gBAAiB,CACzB,QAAQ,KAAK,iFAAiF,EAC9F,MACF,CACA,GAAI,CAAC,KAAK,4BAA6B,CACrC,QAAQ,KAAK,6DAA6D,EAC1E,MACF,CASA,MAAMc,EAAY,YAAY,IAAG,EACjC,GAAI,KAAK,6BAA6BA,CAAS,EAAG,CAChD,KAAK,+BAA8B,EACnC,MACF,CACA,KAAK,+BAA+B,CAAE,MAAO,EAAI,CAAE,EACnD,KAAK,4BAA4BA,CAAS,EAC1C,KAAK,gCAA+B,EAGpC,MAAMgvB,EAAQ,CACZ,QAHoB,KAAK,kBAAiB,EAI1C,UAAAhvB,EACA,OAAQ,KAAK,UAAU,MAC7B,EACI,KAAK,kBAAkB,OAAOgvB,EAAO,EAAI,EACrC,KAAK,UAAY,OAAO,KAAK,SAAS,QAAW,aACnD,KAAK,SAAS,aAAemf,GAAY,KAAK,SAAS,YAAY,EACnE,KAAK,SAAS,OAAOnf,EAAO,KAAK,IAAI,EAEzC,CAYA,wBAAwB6yC,EAAgB,SAAUC,EAAgB,KAAMhmE,EAAU,GAAI,CAChF,CAAC,KAAK,kBAAoB,KAAK,WACjC,KAAK,iBAAmB,IAAI2kE,GAAiB,KAAK,QAAQ,GAE5D,KAAK,kBAAkB,OAAOoB,EAAeC,EAAehmE,CAAO,EACnE,MAAMi8M,EAAgB,CACpB,WAAYj8M,EAAQ,YAAc,KAAK,uBAAuB,WAC9D,OAAQA,EAAQ,kBAAoB,KAAK,uBAAuB,OAChE,UAAWA,EAAQ,qBAAuB,KAAK,uBAAuB,SAC5E,EACI,YAAK,uBAAyBi8M,EAC9B,KAAK,UAAU,0BAA0BA,CAAa,EAC/C,KAAK,gBACd,CAUA,yBAAyB72K,EAAO,CAC9B,KAAK,kBAAkB,QAAQA,CAAK,CACtC,CASA,MAAM,yBAA0B,CAC9B,GAAI,CAAC,KAAK,iBAAkB,OAAO,KAEnC,MAAMlS,EAAQ,CACZ,QAFoB,KAAK,kBAAiB,EAG1C,UAAW,YAAY,IAAG,EAC1B,OAAQ,KAAK,UAAU,MAC7B,EACI,OAAO,KAAK,iBAAiB,OAAOA,EAAO,EAAI,CACjD,CAWA,MAAM,iBAAiBi1B,EAASC,EAAS,CACvC,OAAK,KAAK,kBACV,MAAM,KAAK,wBAAuB,EAC3B,KAAK,iBAAiB,KAAKD,EAASC,CAAO,GAFf,CAAE,KAAM,GAAI,KAAM,EAAE,CAGzD,CASA,gCAAiC,CAC/B,MAAM77C,EAAW,IAAI,IAEf2vM,EAA8BC,GAAY,CAC9C,GAAI,CAACA,GAAS,YAAa,OAC3B,MAAMv7L,EAAUu7L,EAAQ,YAClBC,EAAWD,EAAQ,UAAY,CAAA,EACjCv7L,EAAQ,MAAMrU,EAAS,IAAIqU,EAAQ,KAAMw7L,EAAS,MAAQ,CAAC,EAC3Dx7L,EAAQ,MAAMrU,EAAS,IAAIqU,EAAQ,KAAMw7L,EAAS,MAAQ,CAAC,EAC3Dx7L,EAAQ,cAAc,MAAMrU,EAAS,IAAIqU,EAAQ,aAAa,KAAMw7L,EAAS,WAAa,CAAC,EAC3Fx7L,EAAQ,cAAc,MAAMrU,EAAS,IAAIqU,EAAQ,aAAa,KAAMw7L,EAAS,WAAa,CAAC,CACjG,EAEAF,EAA2B,KAAK,gBAAgB,EAChDA,EAA2B,KAAK,mBAAmB,EAE/C,KAAK,UAAU,cACjB3vM,EAAS,IAAI,KAAK,SAAS,aAAc,KAAK,UAAU,cAAgB,CAAC,EAG3E,MAAM4qD,EAAa,KAAK,UAAU,WAClC,OAAIA,GAAY,qBACd5qD,EAAS,IAAI4qD,EAAW,oBAAqBA,EAAW,UAAU,4BAA8B,CAAC,EAE/FA,GAAY,kBAAkB,OAChC5qD,EAAS,IAAI4qD,EAAW,iBAAiB,MAAOA,EAAW,UAAU,2BAA6B,CAAC,EAEjGA,GAAY,kBAAkB,QAChC5qD,EAAS,IAAI4qD,EAAW,iBAAiB,OAAQA,EAAW,UAAU,2BAA6B,CAAC,EAG/F5qD,CACT,CAUA,2BAA4B,CAC1B,MAAM6oE,EAAO,CAAA,EAEPq9B,EAAM,CAAClwG,EAAKnD,IAAU,CACrBmD,IACL6yE,EAAK7yE,CAAG,EAAInD,EACd,EAEMi9M,EAAuB,CAACn7M,EAAQ2mG,EAAQ,CAAA,IACvC3mG,EAME,CAAE,GALI,CACX,KAAMA,EAAO,MAAQ,KACrB,MAAOA,EAAO,OAAS,KACvB,OAAQA,EAAO,QAAU,IACjC,EACwB,GAAG2mG,CAAK,EANN,CAAE,QAAS,EAAG,GAAGA,CAAK,EAStCy0G,EAAa,CAACH,EAAS74K,IAAY,CACvC,GAAI,CAAC64K,GAAS,YAAa,OAC3B,MAAMv7L,EAAUu7L,EAAQ,YAClBC,EAAWD,EAAQ,UAAY,CAAA,EAC/B39I,EAAW29I,EAAQ,eAAiB,KACpC19I,EAAW09I,EAAQ,eAAiB,KACtC39I,GAAY59C,EAAQ,MACtB6xF,EACE,cAAcj0C,CAAQ,SAASl7B,CAAO,GACtC,CAAE,GAAG+4K,EAAqBz7L,EAAQ,IAAI,EAAG,QAASw7L,EAAS,MAAQ,CAAC,CAC9E,EAEU39I,GAAY79C,EAAQ,MACtB6xF,EACE,cAAch0C,CAAQ,SAASn7B,CAAO,GACtC,CAAE,GAAG+4K,EAAqBz7L,EAAQ,IAAI,EAAG,QAASw7L,EAAS,MAAQ,CAAC,CAC9E,EAEUD,EAAQ,SAAS,aAAe,KAC9B39I,GAAY59C,EAAQ,cAAc,MACpC6xF,EACE,cAAcj0C,CAAQ,SAASl7B,CAAO,SACtC,CAAE,GAAG+4K,EAAqBz7L,EAAQ,aAAa,IAAI,EAAG,QAASw7L,EAAS,WAAa,CAAC,CAClG,EAEY39I,GAAY79C,EAAQ,cAAc,MACpC6xF,EACE,cAAch0C,CAAQ,SAASn7B,CAAO,SACtC,CAAE,GAAG+4K,EAAqBz7L,EAAQ,aAAa,IAAI,EAAG,QAASw7L,EAAS,WAAa,CAAC,CAClG,EAGI,EAEAE,EAAW,KAAK,iBAAkB,UAAU,EAC5CA,EAAW,KAAK,oBAAqB,SAAS,EAE9C,MAAMh4L,EAAS,KAAK,UAAU,QAAU,KAClC47B,EAAe,KAAK,UAAU,cAAgB,KAChD57B,GAAQ,OAAS,UACnBmuF,EACEvyD,EAAe,sBAAwB,uBACvC,CAAE,GAAGm8J,EAAqBn8J,EAAc,CAAE,KAAM,QAAQ,CAAE,EAAG,QAAS57B,EAAO,UAAU,YAAc,CAAC,CAC9G,EACMmuF,EAAI,uBAAwB,CAAE,KAAM,SAAU,QAASnuF,EAAO,UAAU,oBAAsB,EAAG,GACxFA,GAAQ,OAAS,UAC1BmuF,EACEvyD,EAAe,uBAAyB,0BACxC,CAAE,GAAGm8J,EAAqBn8J,EAAc,CAAE,KAAM,QAAQ,CAAE,EAAG,QAAS57B,EAAO,UAAU,YAAc,CAAC,CAC9G,EACMmuF,EACE,sBACA,CACE,KAAM,SACN,MAAOvyD,GAAc,OAAS,KAAK,MAAM,OAAS,KAClD,OAAQA,GAAc,QAAU,KAAK,MAAM,QAAU,KACrD,QAAS57B,EAAO,UAAU,YAAc,CAClD,CACA,EACMmuF,EAAI,wBAAyB,CAAE,KAAM,SAAU,QAASnuF,EAAO,UAAU,oBAAsB,EAAG,GACzF,KAAK,UACdmuF,EAAI,cAAe,CAAE,KAAM,UAAW,QAAS,KAAK,UAAU,cAAgB,EAAG,EAGnF,MAAMt7C,EAAa,KAAK,UAAU,WAClC,OAAIA,GAAY,qBACds7C,EACE,oCACA,CACE,KAAM,SACN,MAAOt7C,EAAW,cAAc,OAAS,KACzC,OAAQA,EAAW,cAAc,QAAU,KAC3C,QAASA,EAAW,UAAU,4BAA8B,CACtE,CACA,EAEQA,GAAY,kBAAkB,OAChCs7C,EACE,+BACA,CACE,KAAM,SACN,MAAOt7C,EAAW,kBAAkB,OAAS,KAC7C,OAAQA,EAAW,kBAAkB,QAAU,KAC/C,OAAQA,EAAW,kBAAkB,OAAO,QAAU,KACtD,QAASA,EAAW,UAAU,2BAA6B,CACrE,CACA,EAEQA,GAAY,kBAAkB,QAChCs7C,EACE,gCACA,CACE,KAAM,SACN,MAAOt7C,EAAW,kBAAkB,OAAS,KAC7C,OAAQA,EAAW,kBAAkB,QAAU,KAC/C,OAAQA,EAAW,kBAAkB,QAAQ,QAAU,KACvD,QAASA,EAAW,UAAU,2BAA6B,CACrE,CACA,EAGWie,CACT,CAUA,wBAAyB,CACvB,MAAM9N,EAAU,CAAA,EAEVi1I,EAAW,CAACh6M,EAAK0qB,IAAY,CAC5B1qB,IACL+kE,EAAQ/kE,CAAG,EAAI0qB,GAAW,EAC5B,EAEMqvL,EAAa,CAACH,EAAS74K,IAAY,CACvC,GAAI,CAAC64K,GAAS,YAAa,OAC3B,MAAMv7L,EAAUu7L,EAAQ,YAClBC,EAAWD,EAAQ,UAAY,CAAA,EAC/B39I,EAAW29I,EAAQ,eAAiB,KACpC19I,EAAW09I,EAAQ,eAAiB,KACtC39I,GAAY59C,EAAQ,MACtB27L,EAAS,cAAc/9I,CAAQ,SAASl7B,CAAO,GAAI84K,EAAS,MAAQ,CAAC,EAEnE39I,GAAY79C,EAAQ,MACtB27L,EAAS,cAAc99I,CAAQ,SAASn7B,CAAO,GAAI84K,EAAS,MAAQ,CAAC,EAEnED,EAAQ,SAAS,aAAe,KAC9B39I,GAAY59C,EAAQ,cAAc,MACpC27L,EAAS,cAAc/9I,CAAQ,SAASl7B,CAAO,SAAU84K,EAAS,WAAa,CAAC,EAE9E39I,GAAY79C,EAAQ,cAAc,MACpC27L,EAAS,cAAc99I,CAAQ,SAASn7B,CAAO,SAAU84K,EAAS,WAAa,CAAC,EAGtF,EAEAE,EAAW,KAAK,iBAAkB,UAAU,EAC5CA,EAAW,KAAK,oBAAqB,SAAS,EAE9C,MAAMh4L,EAAS,KAAK,UAAU,QAAU,KAClC47B,EAAe,KAAK,UAAU,cAAgB,KAChD57B,GAAQ,OAAS,UACnBi4L,EAASr8J,EAAe,sBAAwB,uBAAwB57B,EAAO,UAAU,YAAc,CAAC,EACxGi4L,EAAS,uBAAwBj4L,EAAO,UAAU,oBAAsB,CAAC,GAChEA,GAAQ,OAAS,UAC1Bi4L,EAASr8J,EAAe,uBAAyB,0BAA2B57B,EAAO,UAAU,YAAc,CAAC,EAC5Gi4L,EAAS,sBAAuBj4L,EAAO,UAAU,YAAc,CAAC,EAChEi4L,EAAS,wBAAyBj4L,EAAO,UAAU,oBAAsB,CAAC,GACjE,KAAK,UACdi4L,EAAS,cAAe,KAAK,UAAU,cAAgB,CAAC,EAG1D,MAAMplJ,EAAa,KAAK,UAAU,WAClC,OAAIA,GAAY,qBACdolJ,EAAS,oCAAqCplJ,EAAW,UAAU,4BAA8B,CAAC,EAEhGA,GAAY,kBAAkB,OAChColJ,EAAS,+BAAgCplJ,EAAW,UAAU,2BAA6B,CAAC,EAE1FA,GAAY,kBAAkB,QAChColJ,EAAS,gCAAiCplJ,EAAW,UAAU,2BAA6B,CAAC,EAGxFmQ,CACT,CAUA,6BAA8B,CAC5B,OAAO,KAAK,0BAAyB,CACvC,CAUA,kBAAkBtnE,EAAU,GAAI,CAC9B,YAAK,SAAS,KAAK,QAAU,GAC7B,KAAK,SAAS,KAAK,aAAeA,EAAQ,eAAiB,IAASA,EAAQ,aAAe,GAC3F,KAAK,qBAAqBA,CAAO,EACjC,KAAK,oBAAmB,EACjB,IACT,CAUA,kBAAkBA,EAAU,GAAI,CAC9B,YAAK,SAAS,KAAK,QAAU,GAC7B,KAAK,SAAS,KAAK,aAAeA,EAAQ,eAAiB,IAASA,EAAQ,aAAe,GAC3F,KAAK,qBAAqBA,CAAO,EACjC,KAAK,oBAAmB,EACjB,IACT,CASA,oBAAqB,CACnB,YAAK,SAAS,KAAK,QAAU,GAC7B,KAAK,oBAAmB,EACjB,IACT,CASA,oBAAqB,CACnB,YAAK,SAAS,KAAK,QAAU,GAC7B,KAAK,oBAAmB,EACjB,IACT,CAEA,qBAAqBA,EAAU,GAAI,CACjC,GAAKA,EACL,IAAIA,EAAQ,iBAAmB,KAAM,CACnC,MAAM+uB,EAAQ,OAAO/uB,EAAQ,eAAe,EACxC,OAAO,SAAS+uB,CAAK,GAAKA,EAAQ,IACpC,KAAK,SAAS,QAAQ,gBAAkBA,EAE5C,CAIA,GAHI/uB,EAAQ,YAAc,OACxB,KAAK,SAAS,QAAQ,WAAaA,EAAQ,aAAe,IAExDA,EAAQ,QAAU,KAAM,CAC1B,MAAM6qF,EAAS,OAAO7qF,EAAQ,MAAM,EAChC,OAAO,SAAS6qF,CAAM,GAAKA,EAAS,IACtC,KAAK,SAAS,QAAQ,OAAS,KAAK,MAAMA,CAAM,EAEpD,CAIA,GAHI7qF,EAAQ,yBAA2B,OACrC,KAAK,SAAS,QAAQ,wBAA0BA,EAAQ,0BAA4B,IAElFA,EAAQ,sBAAwB,KAAM,CACxC,MAAM2tB,EAAY,OAAO3tB,EAAQ,oBAAoB,EACjD,OAAO,SAAS2tB,CAAS,GAAKA,GAAa,IAC7C,KAAK,SAAS,QAAQ,qBAAuBA,EAEjD,CACA,GAAI3tB,EAAQ,2BAA6B,KAAM,CAC7C,MAAM69J,EAAK,OAAO79J,EAAQ,yBAAyB,EAC/C,OAAO,SAAS69J,CAAE,GAAKA,GAAM,IAC/B,KAAK,SAAS,QAAQ,0BAA4BA,EAEtD,EACF,CAEA,qBAAsB,CACpB,MAAM2+C,EAAc,KAAK,SAAS,KAAK,QACjCC,EAAc,KAAK,SAAS,KAAK,QACvC,GAAI,CAACD,GAAe,CAACC,EAAa,CAChC,KAAK,wBAAuB,EAC5B,KAAK,YAAY,UAAU,EAC3B,KAAK,qBAAqB,UAAO,EACjC,KAAK,oBAAsB,KAC3B,KAAK,gCAA+B,EACpC,MACF,CACA,GAAI,CAAC,KAAK,SAAU,CAClB,KAAK,OAAO,OAAO,IAAM,KAAK,oBAAmB,CAAE,EACnD,MACF,CACK,KAAK,sBACR,KAAK,oBAAsB,IAAI93I,GAAiB,KAAK,QAAQ,GAE/D,KAAK,oBAAoB,OAAO63I,EAAc,SAAW,KAAMC,EAAc,SAAW,KAAM,CAC5F,gBAAiB,KAAK,SAAS,QAAQ,gBACvC,WAAY,KAAK,SAAS,QAAQ,WAClC,WAAY,EAClB,CAAK,EACD,KAAK,oBAAoB,OAAO,KAAK,IAAI,EACzC,KAAK,wBAAuB,EAC5B,KAAK,wBAAwB,QAAQ,EACrC,KAAK,gCAA+B,EACpC,KAAK,UAAU,cAAa,CAC9B,CAEA,iCAAkC,CAChC,MAAMC,EAAS,KAAK,wBAA0B,CAAE,WAAY,GAAO,OAAQ,IAAsB,EAE3FC,EADiB,KAAK,wBAAuB,EAE/C,CAAE,WAAY,GAAM,OAAQ,KAAK,SAAS,QAAQ,QAAU,EAAiB,EAC7E,CAAE,WAAY,GAAO,OAAQ,IAAsB,EAEvD,GAAI,EADeD,EAAO,aAAe,IAAQC,EAAQ,aAAe,IACvD,CACf,KAAK,UAAU,0BAA0B,CAAE,WAAY,EAAK,CAAE,EAC9D,MACF,CACA,MAAMC,EAAgB,CAAA,EAClBF,EAAO,aAAe,IAAME,EAAc,KAAKF,EAAO,MAAM,EAC5DC,EAAQ,aAAe,IAAMC,EAAc,KAAKD,EAAQ,MAAM,EAClE,MAAME,EAAeD,EAAc,IAAKx9M,GAAW,OAAO,SAASA,CAAK,GAAKA,EAAQ,EAAIA,EAAQ,EAAG,EAC9F09M,EAAiB,KAAK,IAAI,GAAGD,CAAY,EAE/C,KAAK,UAAU,0BAA0B,CAAE,WAAY,GAAM,OAAQC,EAAgB,UADnE,EAC8E,CAClG,CAEA,uBAAwB,CACtB,OAAO,KAAK,QAAQ,QAAU,KAAK,UAAU,QAAU,IACzD,CAEA,yBAA0B,CACxB,OACG,KAAK,SAAS,KAAK,UAAY,IAAQ,KAAK,SAAS,KAAK,eAAiB,IACxE,KAAK,SAAS,KAAK,UAAY,IAAQ,KAAK,SAAS,KAAK,eAAiB,EAEnF,CAEA,iBAAiBC,EAAQ,CACvB,GAAI,CAACA,EAAQ,OAAO,KACpB,MAAMP,EAAc,KAAK,SAAS,KAAK,UAAY,IAAQ,KAAK,SAAS,KAAK,eAAiB,GACzFC,EAAc,KAAK,SAAS,KAAK,UAAY,IAAQ,KAAK,SAAS,KAAK,eAAiB,GACzFO,EAAUR,EAAcO,EAAO,KAAO,GACtCE,EAAUR,EAAcM,EAAO,KAAO,GACtCG,EAAYH,EAAO,UACnBI,EAAYJ,EAAO,UACzB,OAAIC,EAAU,GAAKC,EAAU,EAAU,CAAE,KAAM,KAAM,MAAO,GAAI,MAAO,IAAI,EACxD,KAAK,SAAS,QAAQ,aAAe,IACtCD,GAAW,GAAKC,GAAW,GAAK,OAAO,SAASC,CAAS,GAAK,OAAO,SAASC,CAAS,EAChGD,GAAaC,EAChB,CAAE,KAAM,OAAQ,MAAOH,EAAS,MAAOE,CAAS,EAChD,CAAE,KAAM,OAAQ,MAAOD,EAAS,MAAOE,CAAS,EAElDH,GAAW,EAAU,CAAE,KAAM,OAAQ,MAAOA,EAAS,MAAO,OAAO,SAASE,CAAS,EAAIA,EAAY,IAAI,EACtG,CAAE,KAAM,OAAQ,MAAOD,EAAS,MAAO,OAAO,SAASE,CAAS,EAAIA,EAAY,IAAI,CAC7F,CAEA,wBAAwB/5M,EAAS,SAAU,CACzC,GAAI,CAAC,KAAK,0BAA2B,CAC/B,KAAK,SAAS,qBAChB,aAAa,KAAK,SAAS,kBAAkB,EAC7C,KAAK,SAAS,mBAAqB,MAEjC,KAAK,SAAS,kBAChB,aAAa,KAAK,SAAS,eAAe,EAC1C,KAAK,SAAS,gBAAkB,MAElC,KAAK,SAAS,OAAS,GACvB,KAAK,YAAYA,CAAM,EACvB,MACF,CACA,MAAMvB,EAAO,KAAK,SAAS,MAC3B,GAAIA,EAAK,OAAS,QAAU,KAAK,SAAS,KAAK,eAAiB,GAAO,CACrE,KAAK,YAAYuB,CAAM,EACvB,MACF,CACIvB,EAAK,OAAS,QAAU,KAAK,SAAS,KAAK,eAAiB,IAC9D,KAAK,YAAYuB,CAAM,CAE3B,CAEA,yBAA0B,CACxB,MAAM28C,EAAS,KAAK,sBAAqB,EACrC,CAACA,GAAU,KAAK,4BACpBA,EAAO,iBAAiB,cAAe,KAAK,sBAAsB,KAAM,CAAE,QAAS,GAAM,EACzFA,EAAO,iBAAiB,cAAe,KAAK,sBAAsB,KAAM,CAAE,QAAS,GAAM,EACzFA,EAAO,iBAAiB,YAAa,KAAK,sBAAsB,GAAI,CAAE,QAAS,GAAM,EACrFA,EAAO,iBAAiB,gBAAiB,KAAK,sBAAsB,OAAQ,CAAE,QAAS,GAAM,EAC7FA,EAAO,iBAAiB,eAAgB,KAAK,sBAAsB,MAAO,CAAE,QAAS,GAAM,EAC3FA,EAAO,iBAAiB,QAAS,KAAK,sBAAsB,MAAO,CAAE,QAAS,GAAM,EACpFA,EAAO,iBAAiB,QAAS,KAAK,sBAAsB,KAAK,EACjEA,EAAO,iBAAiB,WAAY,KAAK,sBAAsB,QAAQ,EACvE,KAAK,0BAA4B,GACnC,CAEA,yBAA0B,CACxB,MAAMA,EAAS,KAAK,sBAAqB,EACrC,CAACA,GAAU,CAAC,KAAK,4BACrBA,EAAO,oBAAoB,cAAe,KAAK,sBAAsB,IAAI,EACzEA,EAAO,oBAAoB,cAAe,KAAK,sBAAsB,IAAI,EACzEA,EAAO,oBAAoB,YAAa,KAAK,sBAAsB,EAAE,EACrEA,EAAO,oBAAoB,gBAAiB,KAAK,sBAAsB,MAAM,EAC7EA,EAAO,oBAAoB,eAAgB,KAAK,sBAAsB,KAAK,EAC3EA,EAAO,oBAAoB,QAAS,KAAK,sBAAsB,KAAK,EACpEA,EAAO,oBAAoB,QAAS,KAAK,sBAAsB,KAAK,EACpEA,EAAO,oBAAoB,WAAY,KAAK,sBAAsB,QAAQ,EAC1E,KAAK,0BAA4B,GACnC,CAEA,mBAAmBt+C,EAAO,CACxB,MAAM8xD,EAAI,KAAK,SAAS,QACpBA,EAAE,SAAS,OAAS,IACtBA,EAAE,MAAQ,GACVA,EAAE,YAAc,IAElBA,EAAE,OAAS,GACXA,EAAE,SAAS,IAAI9xD,EAAM,UAAW,CAC9B,UAAWA,EAAM,UACjB,YAAaA,EAAM,aAAe,QAClC,aAAcA,EAAM,SAAW,EAC/B,aAAcA,EAAM,SAAW,EAC/B,QAASA,EAAM,SAAW,EAC1B,QAASA,EAAM,SAAW,CAChC,CAAK,CAEH,CAEA,MAAM,iBAAiBA,EAAO,CAC5B,MAAM8xD,EAAI,KAAK,SAAS,QAClBzK,EAAUyK,EAAE,SAAS,IAAI9xD,GAAO,SAAS,EAC3CqnD,GAAWA,EAAQ,cAAgB,UACrCyK,EAAE,YAAc,YAAY,IAAG,GAE7B9xD,GAAO,OAAS,iBAAmBqnD,GAAWA,EAAQ,cAAgB,SAAW,CAACyK,EAAE,OAAS,CAACA,EAAE,aAClG,MAAM,KAAK,gBAAgB9xD,EAAOqnD,CAAO,EAE3CyK,EAAE,SAAS,OAAO9xD,GAAO,SAAS,EAClC8xD,EAAE,OAASA,EAAE,SAAS,KAAO,CAC/B,CAEA,mBAAmB9xD,EAAO,CACxB,MAAMs+C,EAAS,KAAK,sBAAqB,EACzC,GAAI,CAACA,EAAQ,OACb,MAAMwT,EAAI,KAAK,SAAS,QAClBzK,EAAUyK,EAAE,SAAS,IAAI9xD,EAAM,SAAS,EAC9C,GAAIqnD,EAAS,CACX,MAAM3F,EAAc,MAAM,KAAKoQ,EAAE,SAAS,OAAM,EAAKnmC,IAAW,CAC9D,UAAWA,EAAM,UACjB,QAASA,EAAM,aACf,QAASA,EAAM,YACvB,EAAQ,EACF07B,EAAQ,QAAUrnD,EAAM,SAAW,EACnCqnD,EAAQ,QAAUrnD,EAAM,SAAW,EACZyhD,GACrBC,EACAoQ,EAAE,SAAS,OAAM,EACjB,KAAK,SAAS,QAAQ,sBAAwB,CACtD,EACyB,QACjBA,EAAE,MAAQ,GACVA,EAAE,YAAc,GAEpB,CACA,MAAMvxD,EAAO+9C,EAAO,sBAAqB,EACnCh4C,EAAItG,EAAM,QAAUO,EAAK,KACzBgG,EAAIvG,EAAM,QAAUO,EAAK,IAC/B,KAAK,SAAS,QAAU,CACtB,EAAA+F,EACA,EAAAC,EACA,QAASvG,EAAM,QACf,QAASA,EAAM,QACf,OAAQsG,GAAK,GAAKC,GAAK,GAAKD,GAAK/F,EAAK,OAASgG,GAAKhG,EAAK,MAC/D,EACI,MAAMo7M,EAAc,MAAM,KAAK7pJ,EAAE,SAAS,QAAQ,EAAE,KAAMnmC,GAAUA,EAAM,cAAgB,OAAO,EAEjG,GAAK3rB,EAAM,SAAWA,EAAM,UAAY,GAAM27M,EAAa,CACzD,KAAK,SAAS,cAAgB,GAC9B,KAAK,YAAY,QAAQ,EACzB,MACF,CACA,KAAK,SAAS,cAAgB,GAC9B,KAAK,mBAAkB,CACzB,CAEA,qBAAsB,CACpB,KAAK,SAAS,QAAQ,OAAS,GAC/B,KAAK,SAAS,cAAgB,GAC1B,KAAK,SAAS,qBAChB,aAAa,KAAK,SAAS,kBAAkB,EAC7C,KAAK,SAAS,mBAAqB,MAErC,KAAK,SAAS,QAAQ,OAAS,GAC/B,KAAK,SAAS,QAAQ,SAAS,MAAK,EACpC,KAAK,YAAY,OAAO,CAC1B,CAEA,aAAajrI,EAAG,CAEd,KAAK,SAAS,cAAgB,GAC9B,KAAK,SAAS,QAAQ,YAAc,GACpC,KAAK,SAAS,QAAQ,YAAc,YAAY,IAAG,EACnD,KAAK,YAAY,QAAQ,EACzB,KAAK,6BAA4B,CACnC,CAEA,MAAM,gBAAgB1wE,EAAOqnD,EAAS,CACpC,MAAMyK,EAAI,KAAK,SAAS,QAClB1vD,EAAM,YAAY,IAAG,EAC3B0vD,EAAE,yBAA2B1vD,EAAM,IACnC,MAAMslD,GAAM1nD,EAAM,SAAW,IAAM8xD,EAAE,gBAAkB,GACjDnK,GAAM3nD,EAAM,SAAW,IAAM8xD,EAAE,gBAAkB,GACjD8pJ,EAAW,OAAO,SAAS9pJ,EAAE,SAAS,GAAK1vD,EAAM0vD,EAAE,WAAa,KAAO,KAAK,MAAMpK,EAAIC,CAAE,GAAK,GACnGmK,EAAE,UAAY1vD,EACd0vD,EAAE,eAAiB9xD,EAAM,SAAWqnD,GAAS,SAAW,EACxDyK,EAAE,eAAiB9xD,EAAM,SAAWqnD,GAAS,SAAW,EACxD,MAAM,KAAK,oBAAoB,CAC7B,GAAGrnD,EACH,OAAQ,EACR,OAAQA,EAAM,SAAW,GACzB,QAASA,EAAM,UAAY,GAC3B,QAASA,EAAM,UAAY,GAC3B,SAAUA,EAAM,WAAa,GAC7B,QAASA,EAAM,SAAWqnD,GAAS,SAAW,EAC9C,QAASrnD,EAAM,SAAWqnD,GAAS,SAAW,EAC9C,YAAa,OACnB,EAAOu0J,EAAU,CAAE,UAAW,GAAM,CAClC,CAEA,MAAM,oBAAoB57M,EAAO47M,EAAUr9M,EAAU,CAAA,EAAI,CACvD,GAAI,CAAC,KAAK,oBAAqB,OAC/B,MAAMoiF,EAAYpiF,EAAQ,YAAc,GAClCs9M,EAA0B,KAAK,SAAS,QAAQ,0BAA4B,GAC5E/pJ,EAAI,KAAK,SAAS,QAClB1vD,EAAM,YAAY,IAAG,EAC3B,GAAI,CAACu+E,GAAa,OAAO,SAAS7uB,EAAE,wBAAwB,GAAK1vD,GAAO0vD,EAAE,yBACxE,OAEF,GAAI+pJ,GAA2B,CAACD,EAAU,CACxC,MAAME,EAAkB,KAAK,SAAS,QAAQ,2BAA6B,IACrEC,EAAgB,OAAO,SAASjqJ,EAAE,WAAW,GAAK1vD,EAAM0vD,EAAE,aAAegqJ,EAC/E,GAAIhqJ,EAAE,aAAeA,EAAE,OAASiqJ,EAC9B,MAEJ,CACA,MAAMz9J,EAAS,KAAK,sBAAqB,EACzC,GAAI,CAACA,EAAQ,OACb,MAAM/9C,EAAO+9C,EAAO,sBAAqB,EACnCh4C,EAAItG,EAAM,QAAUO,EAAK,KACzBgG,EAAIvG,EAAM,QAAUO,EAAK,IAC/B,MAAM,KAAK,2BAA0B,EACrC,MAAM+6M,EAAS,MAAM,KAAK,oBAAoB,KAAKh1M,EAAGC,CAAC,EAEjDuiB,EADM,KAAK,mBAAmBwyL,CAAM,GAClB,CAAE,KAAM,KAAM,MAAO,GAAI,MAAO,IAAI,EACtDU,EAAa,CACjB,KAAMlzL,EAAS,KACf,MAAOA,EAAS,MAChB,KAAMA,EAAS,OAAS,OAASA,EAAS,MAAQ,GAClD,KAAMA,EAAS,OAAS,OAASA,EAAS,MAAQ,GAClD,MAAOA,EAAS,OAAS,KACzB,EAAAxiB,EACA,EAAAC,EACA,QAASvG,EAAM,QACf,QAASA,EAAM,QACf,UAAW,CACT,OAAQA,EAAM,OACd,QAASA,EAAM,QACf,QAASA,EAAM,QACf,SAAUA,EAAM,QACxB,EACM,OAAQA,EAAM,MACpB,EAEI,KAAK,KAAK47M,EAAWtxE,GAAO,eAAiBA,GAAO,YAAa0xE,CAAU,EAEvElzL,EAAS,OAAS,QAAUA,EAAS,OAAS,EAChD,KAAK,KAAK8yL,EAAWtxE,GAAO,cAAgBA,GAAO,WAAY0xE,CAAU,EAChElzL,EAAS,OAAS,QAAUA,EAAS,OAAS,GACvD,KAAK,KAAK8yL,EAAWtxE,GAAO,cAAgBA,GAAO,WAAY0xE,CAAU,CAE7E,CAEA,oBAAoB9yJ,EAAe,KAAM,EACnCA,GAAc,QAAU,CAAC,KAAK,4BAChC,KAAK,yBAA2BA,GAAgB,MAE9C,KAAK,gBAAkB,OAC3B,KAAK,eAAiB,sBAAuBnnD,GAAO,CAClD,KAAK,eAAiB,KACtB,MAAMk6M,EAAe,KAAK,0BAA4B,KACtD,KAAK,yBAA2B,KAChC,MAAM7nL,EAAS,KAAK,UAAU,QAAU,KAClCpqB,EAAS,CACb,UAAWjI,EACX,OAAAqyB,EACA,OAAQ6nL,GAAc,QAAU,KAChC,OAAQA,GAAc,QAAU,KAChC,OAAQA,EACR,MAAO7nL,EACH,CACE,KAAMA,EAAO,KACb,WAAYA,EAAO,WACnB,KAAMA,EAAO,KACb,SAAUA,EAAO,SACjB,SAAUA,EAAO,SAAW,CAAE,GAAGA,EAAO,QAAQ,EAAK,IACnE,EACY,IACZ,EACM,KAAK,KAAKk2G,GAAO,YAAatgI,CAAM,EAEpC,KAAK,SAAS,cAAgB,GAC9B,MAAM8nD,EAAI,KAAK,SAAS,QACxBA,EAAE,iBAAmB,YAAY,IAAG,EAChCA,EAAE,SACJA,EAAE,YAAc,IAElB,KAAK,YAAY,QAAQ,EACzB,KAAK,6BAA4B,CACnC,CAAC,EACH,CAEA,8BAA+B,CACxB,KAAK,4BACN,KAAK,SAAS,iBAChB,aAAa,KAAK,SAAS,eAAe,EAE5C,KAAK,SAAS,gBAAkB,WAAW,IAAM,CAC/C,KAAK,SAAS,gBAAkB,KAChC,KAAK,SAAS,cAAgB,GAC1B,KAAK,SAAS,QAAQ,QACxB,KAAK,mBAAkB,CAE3B,EAAG,EAAE,EACP,CAEA,oBAAqB,CACd,KAAK,2BACN,KAAK,SAAS,MAAQ,OAC1B,KAAK,SAAS,KAAO,sBAAsB,IAAM,CAC/C,KAAK,SAAS,KAAO,KAChB,KAAK,cAAa,CACzB,CAAC,EACH,CAEA,MAAM,4BAA6B,CACjC,GAAI,CAAC,KAAK,oBAAqB,OAC/B,MAAM1qD,EAAO,KAAK,WAAW,cAAgB,KACvCmqM,EAAgB,KAAK,kBAAiB,EAGtC9/K,EAAQ,CACZ,GAAIrqB,GAAQ,KACZ,QAASmqM,EACT,UAAW,YAAY,IAAG,EAC1B,OAAQ,KAAK,UAAU,MAC7B,EACI,MAAM,KAAK,oBAAoB,OAAO9/K,EAAO,EAAI,CACnD,CAEA,mBAAmB6pL,EAAQ,CACzB,GAAI,CAACA,EAAQ,OAAO,KACpB,MAAMP,EAAc,KAAK,SAAS,KAAK,QACjCC,EAAc,KAAK,SAAS,KAAK,QACjCO,EAAUR,EAAcO,EAAO,KAAO,GACtCE,EAAUR,EAAcM,EAAO,KAAO,GACtCG,EAAYH,EAAO,UACnBI,EAAYJ,EAAO,UACzB,OAAIC,EAAU,GAAKC,EAAU,EAAU,CAAE,KAAM,KAAM,MAAO,GAAI,MAAO,IAAI,EACxD,KAAK,SAAS,QAAQ,aAAe,IACtCD,GAAW,GAAKC,GAAW,GAAK,OAAO,SAASC,CAAS,GAAK,OAAO,SAASC,CAAS,EAChGD,GAAaC,EAChB,CAAE,KAAM,OAAQ,MAAOH,EAAS,MAAOE,CAAS,EAChD,CAAE,KAAM,OAAQ,MAAOD,EAAS,MAAOE,CAAS,EAElDH,GAAW,EAAU,CAAE,KAAM,OAAQ,MAAOA,EAAS,MAAO,OAAO,SAASE,CAAS,EAAIA,EAAY,IAAI,EACtG,CAAE,KAAM,OAAQ,MAAOD,EAAS,MAAO,OAAO,SAASE,CAAS,EAAIA,EAAY,IAAI,CAC7F,CAEA,MAAM,eAAgB,CAGpB,GAFI,CAAC,KAAK,qBACN,CAAC,KAAK,2BACN,KAAK,SAAS,cAAe,OACjC,GAAI,CAAC,KAAK,SAAS,QAAQ,OAAQ,CACjC,KAAK,YAAY,SAAS,EAC1B,MACF,CACA,MAAMtyH,EAAS,KAAK,SAAS,QAAQ,QAAU,GACzClnF,EAAWknF,EAAS,EAAK,IAAOA,EAAU,EAC1ChnF,EAAM,YAAY,IAAG,EAC3B,GAAIF,EAAW,GAAKE,EAAM,KAAK,SAAS,cAAgBF,EAAU,CAChE,GAAI,CAAC,KAAK,SAAS,mBAAoB,CACrC,MAAMmoK,EAAY,KAAK,IAAI,EAAGnoK,GAAYE,EAAM,KAAK,SAAS,cAAc,EAC5E,KAAK,SAAS,mBAAqB,WAAW,IAAM,CAClD,KAAK,SAAS,mBAAqB,KACnC,KAAK,mBAAkB,CACzB,EAAGioK,CAAS,CACd,CACA,MACF,CACA,GAAI,KAAK,SAAS,UAAW,CAC3B,KAAK,SAAS,OAAS,GACvB,MACF,CACA,KAAK,SAAS,UAAY,GAC1B,KAAK,SAAS,cAAgBjoK,EAC9B,GAAI,CACF,MAAM,KAAK,2BAA0B,EACrC,KAAM,CAAE,EAAAkE,EAAG,EAAAC,EAAG,QAAAmgD,EAAS,QAAAC,GAAY,KAAK,SAAS,QAC3C20J,EAAS,MAAM,KAAK,oBAAoB,KAAKh1M,EAAGC,CAAC,EACjDsvF,EAAM,KAAK,iBAAiBylH,CAAM,EAClCl7M,EAAO,KAAK,SAAS,MACrBD,EAAO01F,GAAO,CAAE,KAAM,KAAM,MAAO,GAAI,MAAO,IAAI,EACxD,GAAIz1F,EAAK,OAASD,EAAK,MAAQC,EAAK,QAAUD,EAAK,MAAO,OACtDC,EAAK,OAAS,QAAUA,EAAK,OAAS,EACxC,KAAK,KAAKkqI,GAAO,WAAY,CAAE,MAAO,MAAO,MAAOlqI,EAAK,MAAO,MAAOA,EAAK,MAAO,EAAAkG,EAAG,EAAAC,EAAG,QAAAmgD,EAAS,QAAAC,EAAS,EAClGvmD,EAAK,OAAS,QAAUA,EAAK,OAAS,GAC/C,KAAK,KAAKkqI,GAAO,WAAY,CAAE,MAAO,MAAO,MAAOlqI,EAAK,MAAO,MAAOA,EAAK,MAAO,EAAAkG,EAAG,EAAAC,EAAG,QAAAmgD,EAAS,QAAAC,EAAS,EAEzGxmD,EAAK,OAAS,QAAUA,EAAK,OAAS,EACxC,KAAK,KAAKmqI,GAAO,WAAY,CAAE,MAAO,KAAM,MAAOnqI,EAAK,MAAO,MAAOA,EAAK,MAAO,EAAAmG,EAAG,EAAAC,EAAG,QAAAmgD,EAAS,QAAAC,EAAS,EACjGxmD,EAAK,OAAS,QAAUA,EAAK,OAAS,GAC/C,KAAK,KAAKmqI,GAAO,WAAY,CAAE,MAAO,KAAM,MAAOnqI,EAAK,MAAO,MAAOA,EAAK,MAAO,EAAAmG,EAAG,EAAAC,EAAG,QAAAmgD,EAAS,QAAAC,EAAS,EAE5G,KAAK,SAAS,MAAQ,CAAE,GAAGxmD,CAAI,EAC/B,KAAK,SAAS,sBAAsB,cAAc,EAClD,KAAK,WAAW,gBAAa,CAC/B,QAAC,CACC,KAAK,SAAS,UAAY,GACtB,KAAK,SAAS,SAChB,KAAK,SAAS,OAAS,GACvB,KAAK,mBAAkB,EAE3B,CACF,CAEA,YAAYwB,EAAQ,CAClB,MAAMvB,EAAO,KAAK,SAAS,MACrB,CAAE,EAAAkG,EAAG,EAAAC,EAAG,QAAAmgD,EAAS,QAAAC,CAAO,EAAK,KAAK,SAAS,SAAW,CAAA,EACxDvmD,EAAK,OAAS,QAAUA,EAAK,OAAS,EACxC,KAAK,KAAKkqI,GAAO,WAAY,CAC3B,MAAO,MACP,MAAOlqI,EAAK,MACZ,MAAOA,EAAK,MACZ,OAAAuB,EACA,EAAA2E,EACA,EAAAC,EACA,QAAAmgD,EACA,QAAAC,CACR,CAAO,EACQvmD,EAAK,OAAS,QAAUA,EAAK,OAAS,GAC/C,KAAK,KAAKkqI,GAAO,WAAY,CAC3B,MAAO,MACP,MAAOlqI,EAAK,MACZ,MAAOA,EAAK,MACZ,OAAAuB,EACA,EAAA2E,EACA,EAAAC,EACA,QAAAmgD,EACA,QAAAC,CACR,CAAO,EAEH,KAAK,SAAS,MAAQ,CAAE,KAAM,KAAM,MAAO,GAAI,MAAO,IAAI,EAC1D,KAAK,SAAS,sBAAsB,aAAa,EACjD,KAAK,WAAW,gBAAa,CAC/B,CAEA,MAAM,uBAAwB,CAC5B,MAAMg5H,EAAY,KAAK,SAAS,IAAO,OAAK,aAC5C,GAAIA,IAAc,IAASA,GAAa,KAAM,OAAO,KACrD,GAAI,KAAK,GAAI,OAAO,KAAK,GACzB,MAAMsS,EAAYtS,IAAc,GAC5B,CAAA,EACCA,GAAa,OAAOA,GAAc,SAAWA,EAAY,CAAA,EACxDu8B,EAAa3qB,GAAmBU,EAAW,OAAO,EAClDkqB,EAAc,KAAK,yBAA2B,CAACD,EACjD,CAAE,MAAO,KAAK,eAAiB,MAAM,EACrC,CAAA,EACEz3F,EAAK,IAAIi9B,GAAS,CAAE,OAAQ,KAAM,GAAGy6D,EAAa,GAAGlqB,EAAW,EACtE,KAAK,GAAKxtE,EACV,KAAK,wBAAwB,KAAK,oBAAoB,cAAgB,KAAK,eAAiB,MAAM,EAClG,KAAK,wBAAwBA,EAAG,KAAK,EACrC,MAAM/b,EAAS,OAAO,UAAU,eAAe,KAAKupF,EAAW,QAAQ,EACnEA,EAAU,OACTtS,IAAc,GACnB,YAAK,wBAAwBl7D,EAAI/b,EAAQupF,EAAU,cAAgBA,EAAU,eAAiB,EAAE,EAChG,KAAK,uCAAsC,EACpCxtE,CACT,CAEA,wCAAyC,CACvC,KAAK,mCAAqC,EAC5C,CAEA,uCAAwC,CAClC,OAAO,KAAK,SAAS,0BAA6B,YACtD,KAAK,QAAQ,yBAAyB,EAAI,CAC5C,CAEA,wBAAwBA,EAAI/b,EAAQ0zG,EAAe,CAAA,EAAI,CACrD,GAAI,CAAC33F,GAAM/b,IAAW,IAASA,GAAU,KAAM,OAK/C,MAAMxqG,GAHiBwqG,IAAW,IAAQA,IAAW,WAAaA,IAAW,MADvD,CAAC,OAAQ,UAAW,UAAW,SAAU,UAAW,SAAU,SAAU,WAAW,EAGpG,MAAM,QAAQA,CAAM,EAAIA,EAAS,CAACA,CAAM,GACX,MAAK,EACnC,KAAK,cAAgB,CAACxqG,EAAW,KAAMytB,GAAU,OAAOA,GAAS,EAAE,EAAE,KAAI,EAAG,YAAW,IAAO,OAAO,GACvGztB,EAAW,KAAK,OAAO,EAEzB,MAAMm+M,EAAW,CACf,KAAM,kBACN,MAAO,kBACP,KAAM,kBACN,QAAS,qBACT,OAAQ,oBACR,QAAS,qBACT,OAAQ,oBACR,QAAS,oBACT,OAAQ,oBACR,UAAW,uBACX,QAAS,qBACT,MAAO,kBACb,EACI,UAAW1wL,KAASztB,EAAY,CAC9B,MAAM4C,EAAM,OAAO6qB,GAAS,EAAE,EAAE,KAAI,EAAG,YAAW,EAC5CixI,EAASy/C,EAASv7M,CAAG,EACvB,CAAC87J,GAAU,OAAOn4C,EAAGm4C,CAAM,GAAM,YACrCn4C,EAAGm4C,CAAM,EAAEw/C,IAAet7M,CAAG,GAAK,CAAA,CAAE,CACtC,CACF,CASA,SAAU,CACR,GAAI,MAAK,WACT,MAAK,WAAa,GAClB,KAAK,uBAAsB,EAC3B,KAAK,0BAAuB,EAC5B,KAAK,wBAA0B,KAC/B,KAAK,oBAAoB,UAAO,EAChC,KAAK,oBAAoB,eAAY,EACjC,KAAK,qBACP,KAAK,mBAAmB,QAAU,KAClC,KAAK,mBAAmB,aAAe,MAEzC,KAAK,UAAU,KAAI,EACnB,KAAK,WAAW,UAAO,EACvB,KAAK,wBAAwB,iBAAiB,EAC9C,KAAK,wBAAwB,YAAY,EACzC,KAAK,wBAAwB,KAAK,yBAA2B,KAAK,kBAAkB,UAAY,IAAI,EACpG,KAAK,wBAA0B,KAC/B,KAAK,SAAS,UAAO,EACrB,UAAW6qB,KAAS,KAAK,gBAAgB,OAAM,EAC7C,KAAK,oBAAoBA,EAAM,KAAMA,EAAM,SAAUA,EAAM,OAAO,EAClEA,EAAM,oBAAiB,EA8BzB,GA5BA,KAAK,gBAAgB,MAAK,EAC1B,KAAK,wBAAwB,MAAK,EAClC,KAAK,sBAAsB,MAAK,EAC5B,KAAK,uBACP,KAAK,qBAAoB,EACzB,KAAK,qBAAuB,MAE9B,KAAK,qCAAkC,EACvC,KAAK,mCAAqC,KAC1C,KAAK,wBAAuB,EAC5B,KAAK,sBAAqB,EAC1B,KAAK,iBAAiB,SAAM,EAC5B,KAAK,gBAAkB,KACvB,KAAK,kBAAkB,UAAO,EAC9B,KAAK,qBAAqB,UAAO,EACjC,KAAK,oBAAsB,KAC3B,KAAK,SAAS,UAAO,EACrB,KAAK,IAAI,UAAO,EAChB,KAAK,GAAK,KACN,KAAK,cAAgB,OAAO,OAAW,KAAe,OAAO,WAAa,MAC5E,OAAO,OAAO,SAEhB,KAAK,UAAU,UAAO,EACtB,KAAK,cAAgB,KACrB,KAAK,SAAS,UAAO,EACrB,KAAK,QAAU,KACf,KAAK,UAAU,UAAO,EACtB,KAAK,SAAW,KACZ,KAAK,SAAS,0BAA4B,IAAS,KAAK,SAAW,OAAO,KAAK,QAAQ,SAAY,WACrG,GAAI,CACF,KAAK,QAAQ,QAAO,CACtB,OAASnpB,EAAO,CACdsH,GACE,KACA,0BACA,kDACA,CAAE,MAAAtH,CAAK,CACjB,CACM,CAEF,KAAK,QAAU,KACf,KAAK,OAAO,QAAO,EACrB,CACF","x_google_ignoreList":[43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97]}