{"version":3,"file":"html2canvas-pro.cjs","names":["colorType","color","parseDisplayValue","colorType","angle","angleType","angle","angleType","colorType","colorType","transform","rotate","color","MIX_BLEND_MODE","VALID_VALUES","fillSides","colorType","colorType","colorType","colorType","transform","colorType","source","MIX_BLEND_MODE","MIX_BLEND_MODE","MIX_BLEND_MODE","nav","MIX_BLEND_MODE"],"sources":["../src/config.ts","../src/core/validator.ts","../src/core/performance-monitor.ts","../src/css/layout/bounds.ts","../src/core/util.ts","../src/css/syntax/token-constants.ts","../src/css/syntax/token-singletons.ts","../src/css/syntax/tokenizer.ts","../src/css/syntax/parser.ts","../src/css/types/safe-eval.ts","../src/css/types/color-math.ts","../src/css/types/color-spaces/srgb.ts","../src/css/types/length.ts","../src/css/types/length-percentage.ts","../src/css/types/angle.ts","../src/css/types/color-utilities.ts","../src/css/types/color-spaces/p3.ts","../src/css/types/color-spaces/a98.ts","../src/css/types/color-spaces/pro-photo.ts","../src/css/types/color-spaces/rec2020.ts","../src/css/types/functions/color-mix.ts","../src/css/types/color.ts","../src/dom/node-type-guards.ts","../src/css/property-descriptors/list-style-type.ts","../src/core/bitwise.ts","../src/css/types/functions/counter.ts","../src/css/property-descriptors/display.ts","../src/css/property-descriptors/float.ts","../src/css/property-descriptors/overflow.ts","../src/css/property-descriptors/text-decoration-color.ts","../src/css/property-descriptors/text-decoration-line.ts","../src/css/property-descriptors/content.ts","../src/css/property-descriptors/quotes.ts","../src/css/property-descriptors/counter-increment.ts","../src/css/property-descriptors/counter-reset.ts","../src/css/property-descriptors/background-clip.ts","../src/css/property-descriptors/background-color.ts","../src/css/types/functions/gradient.ts","../src/css/types/functions/linear-gradient.ts","../src/css/types/functions/-prefix-linear-gradient.ts","../src/css/types/functions/-webkit-gradient.ts","../src/css/types/functions/radial-gradient.ts","../src/css/types/functions/-prefix-radial-gradient.ts","../src/css/types/functions/repeating-linear-gradient.ts","../src/css/types/functions/repeating-radial-gradient.ts","../src/css/types/functions/conic-gradient.ts","../src/css/types/functions/image-set.ts","../src/css/types/image.ts","../src/css/property-descriptors/background-image.ts","../src/css/property-descriptors/background-origin.ts","../src/css/property-descriptors/background-position.ts","../src/css/property-descriptors/background-repeat.ts","../src/css/property-descriptors/background-size.ts","../src/css/property-descriptors/border-color.ts","../src/css/property-descriptors/border-radius.ts","../src/css/property-descriptors/border-style.ts","../src/css/property-descriptors/border-width.ts","../src/css/property-descriptors/clip-path.ts","../src/css/property-descriptors/color.ts","../src/css/property-descriptors/direction.ts","../src/css/property-descriptors/font-family.ts","../src/css/property-descriptors/font-size.ts","../src/css/property-descriptors/letter-spacing.ts","../src/css/property-descriptors/line-break.ts","../src/css/property-descriptors/line-height.ts","../src/css/property-descriptors/list-style-image.ts","../src/css/property-descriptors/list-style-position.ts","../src/css/property-descriptors/margin.ts","../src/css/property-descriptors/overflow-wrap.ts","../src/css/property-descriptors/padding.ts","../src/css/property-descriptors/text-align.ts","../src/css/property-descriptors/position.ts","../src/css/property-descriptors/text-shadow.ts","../src/css/property-descriptors/text-transform.ts","../src/css/property-descriptors/transform.ts","../src/css/property-descriptors/transform-origin.ts","../src/css/property-descriptors/rotate.ts","../src/css/property-descriptors/visibility.ts","../src/css/property-descriptors/word-break.ts","../src/css/property-descriptors/white-space.ts","../src/css/property-descriptors/writing-mode.ts","../src/css/property-descriptors/z-index.ts","../src/css/types/time.ts","../src/css/property-descriptors/opacity.ts","../src/css/property-descriptors/text-decoration-style.ts","../src/css/property-descriptors/text-decoration-thickness.ts","../src/css/property-descriptors/text-underline-offset.ts","../src/css/property-descriptors/font-weight.ts","../src/css/property-descriptors/font-variant.ts","../src/css/property-descriptors/font-style.ts","../src/css/property-descriptors/duration.ts","../src/css/property-descriptors/box-shadow.ts","../src/css/property-descriptors/paint-order.ts","../src/css/property-descriptors/webkit-text-stroke-color.ts","../src/css/property-descriptors/webkit-text-stroke-width.ts","../src/css/property-descriptors/webkit-line-clamp.ts","../src/css/property-descriptors/object-fit.ts","../src/css/property-descriptors/text-overflow.ts","../src/css/property-descriptors/image-rendering.ts","../src/css/property-descriptors/mix-blend-mode.ts","../src/css/property-descriptors/filter.ts","../src/css/property-descriptors/font-variant-ligatures.ts","../src/css/property-descriptors/zoom.ts","../src/css/property-descriptors/object-position.ts","../src/css/property-descriptors/background-blend-mode.ts","../src/css/property-descriptors/border-image-source.ts","../src/css/property-descriptors/border-image-slice.ts","../src/css/property-descriptors/border-image-repeat.ts","../src/css/property-descriptors/box-decoration-break.ts","../src/css/property-descriptors/accent-color.ts","../src/css/property-descriptors/webkit-text-fill-color.ts","../src/css/property-descriptors/isolation.ts","../src/css/property-descriptors/outline.ts","../src/css/property-descriptors/backdrop-filter.ts","../src/css/property-descriptors/mask.ts","../src/css/property-descriptors/text-emphasis.ts","../src/css/property-descriptors/border-image-width.ts","../src/css/property-descriptors/webkit-box-reflect.ts","../src/css/property-descriptors/translate.ts","../src/css/property-descriptors/scale.ts","../src/core/constants.ts","../src/css/parse.ts","../src/css/grouped/border-styles.ts","../src/css/grouped/background-styles.ts","../src/css/grouped/font-styles.ts","../src/css/grouped/layout-styles.ts","../src/css/index.ts","../src/core/debugger.ts","../src/dom/adopted-styles.ts","../src/dom/slot-cloner.ts","../src/dom/copy-css-styles.ts","../src/dom/pseudo-content.ts","../src/core/abort-helper.ts","../src/dom/iframe-mount.ts","../src/dom/document-cloner.ts","../src/dom/dom-normalizer.ts","../src/dom/element-container.ts","../src/core/features.ts","../src/css/layout/text.ts","../src/dom/text-container.ts","../src/dom/replaced-elements/image-element-container.ts","../src/dom/replaced-elements/canvas-element-container.ts","../src/dom/replaced-elements/svg-element-container.ts","../src/dom/elements/li-element-container.ts","../src/dom/elements/ol-element-container.ts","../src/dom/replaced-elements/input-element-container.ts","../src/dom/elements/select-element-container.ts","../src/dom/elements/textarea-element-container.ts","../src/dom/replaced-elements/iframe-element-container.ts","../src/dom/node-parser.ts","../src/render/path.ts","../src/render/vector.ts","../src/render/bezier-curve.ts","../src/render/bound-curves.ts","../src/render/effects.ts","../src/render/stacking-context.ts","../src/render/canvas/gradient-rasterizer.ts","../src/render/box-sizing.ts","../src/render/background.ts","../src/render/canvas/filter-surface.ts","../src/render/canvas/surface-bounds.ts","../src/render/canvas/text/text-decoration-renderer.ts","../src/render/canvas/font-utils.ts","../src/render/canvas/text-renderer.ts","../src/render/canvas/canvas-path.ts","../src/core/lru-map.ts","../src/render/canvas/background-renderer.ts","../src/render/border.ts","../src/render/canvas/border-renderer.ts","../src/render/canvas/border-image-renderer.ts","../src/render/canvas/effects-renderer.ts","../src/render/canvas/mask-renderer.ts","../src/render/object-fit.ts","../src/render/canvas/content-renderer.ts","../src/render/canvas/box-shadow-geometry.ts","../src/render/canvas/box-shadow-transform.ts","../src/render/canvas/box-shadow-painter.ts","../src/render/canvas/text-clip-renderer.ts","../src/render/canvas/canvas-renderer.ts","../src/render/canvas/foreignobject-renderer.ts","../src/core/logger.ts","../src/core/cache-storage.ts","../src/core/origin-checker.ts","../src/core/context.ts","../src/core/config-assembler.ts","../src/core/background-parser.ts","../src/core/render-element.ts","../src/index.ts"],"sourcesContent":["import { Cache } from './core/cache-storage';\n\n/**\n * Configuration options for Html2Canvas\n *\n * This class manages global configuration without using module-level static variables.\n * Each html2canvas invocation can have its own configuration instance.\n */\nexport interface ConfigOptions {\n    /**\n     * Window object to use for DOM operations\n     */\n    window?: Window;\n\n    /**\n     * CSP nonce for inline styles\n     * See: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP\n     */\n    cspNonce?: string;\n\n    /**\n     * Cache instance to reuse across multiple calls\n     * Useful for avoiding redundant image loads\n     */\n    cache?: Cache;\n}\n\n/**\n * Html2Canvas Configuration\n *\n * Manages configuration state for html2canvas rendering.\n * Eliminates the need for global static variables.\n */\nexport class Html2CanvasConfig {\n    readonly window: Window;\n    readonly cspNonce?: string;\n    readonly cache?: Cache;\n\n    constructor(options: ConfigOptions = {}) {\n        const resolvedWindow = options.window || (typeof window !== 'undefined' ? window : undefined);\n\n        if (!resolvedWindow) {\n            throw new Error('Window object is required but not available');\n        }\n\n        this.window = resolvedWindow;\n        this.cspNonce = options.cspNonce;\n        this.cache = options.cache;\n    }\n\n    /**\n     * Create configuration from an element\n     * Extracts window from element's owner document\n     */\n    static fromElement(element: HTMLElement, options: Partial<ConfigOptions> = {}): Html2CanvasConfig {\n        const ownerDocument = element.ownerDocument;\n\n        if (!ownerDocument) {\n            throw new Error('Element is not attached to a document');\n        }\n\n        const defaultView = ownerDocument.defaultView;\n\n        if (!defaultView) {\n            throw new Error('Document is not attached to a window');\n        }\n\n        return new Html2CanvasConfig({\n            window: defaultView,\n            ...options\n        });\n    }\n\n    /**\n     * Clone configuration with override options\n     */\n    clone(options: Partial<ConfigOptions> = {}): Html2CanvasConfig {\n        return new Html2CanvasConfig({\n            window: options.window || this.window,\n            cspNonce: options.cspNonce ?? this.cspNonce,\n            cache: options.cache ?? this.cache\n        });\n    }\n}\n","/**\n * Input Validator\n *\n * Provides validation and sanitization for user inputs to prevent security vulnerabilities\n * including SSRF, XSS, and injection attacks.\n */\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n    valid: boolean;\n    error?: string;\n    sanitized?: unknown;\n}\n\n/**\n * Validator configuration\n */\nexport interface ValidatorConfig {\n    /**\n     * Allowed proxy domains for SSRF prevention\n     * If empty, no domain restrictions\n     */\n    allowedProxyDomains?: string[];\n\n    /**\n     * Allow localhost/127.0.0.1 as proxy URL. Only set for development or test (e.g. Karma reftests).\n     * @default false\n     */\n    allowLocalhostProxy?: boolean;\n\n    /**\n     * Maximum allowed image timeout in milliseconds\n     */\n    maxImageTimeout?: number;\n\n    /**\n     * Whether to allow data URLs\n     */\n    allowDataUrls?: boolean;\n\n    /**\n     * Custom validation function\n     */\n    /** Custom validation function. Receives the raw value and its semantic type. */\n    customValidator?: (value: unknown, type: string) => ValidationResult;\n}\n\n/**\n * Input Validator\n *\n * Validates and sanitizes user inputs for security and correctness.\n */\nexport class Validator {\n    private readonly config: ValidatorConfig;\n\n    constructor(config: ValidatorConfig = {}) {\n        this.config = {\n            maxImageTimeout: 300000, // 5 minutes default\n            allowDataUrls: true,\n            ...config\n        };\n    }\n\n    /**\n     * Validate a URL\n     *\n     * @param url - URL to validate\n     * @param context - Context for validation (e.g., 'proxy', 'image')\n     * @returns Validation result\n     */\n    validateUrl(url: string, context: 'proxy' | 'image' | 'general' = 'general'): ValidationResult {\n        if (!url || typeof url !== 'string') {\n            return {\n                valid: false,\n                error: 'URL must be a non-empty string'\n            };\n        }\n\n        // Check for data URLs\n        if (url.startsWith('data:')) {\n            if (!this.config.allowDataUrls) {\n                return {\n                    valid: false,\n                    error: 'Data URLs are not allowed'\n                };\n            }\n            return { valid: true, sanitized: url };\n        }\n\n        // Check for blob URLs\n        if (url.startsWith('blob:')) {\n            return { valid: true, sanitized: url };\n        }\n\n        // Validate URL format\n        try {\n            const parsedUrl = new URL(url);\n\n            // Only allow http and https protocols\n            if (!['http:', 'https:'].includes(parsedUrl.protocol)) {\n                return {\n                    valid: false,\n                    error: `Protocol ${parsedUrl.protocol} is not allowed. Only http and https are permitted.`\n                };\n            }\n\n            // For proxy URLs, check domain whitelist\n            if (context === 'proxy' && this.config.allowedProxyDomains && this.config.allowedProxyDomains.length > 0) {\n                const hostname = parsedUrl.hostname.toLowerCase();\n                const isAllowed = this.config.allowedProxyDomains.some((domain) => {\n                    const normalizedDomain = domain.toLowerCase();\n                    return hostname === normalizedDomain || hostname.endsWith('.' + normalizedDomain);\n                });\n\n                if (!isAllowed) {\n                    return {\n                        valid: false,\n                        error: `Proxy domain ${parsedUrl.hostname} is not in the allowed list`\n                    };\n                }\n            }\n\n            // Check for localhost/private IPs to prevent SSRF (skip when allowLocalhostProxy for dev/test)\n            if (context === 'proxy') {\n                if (!this.config.allowLocalhostProxy) {\n                    const hostname = parsedUrl.hostname.toLowerCase();\n\n                    // Check for localhost\n                    if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1') {\n                        return {\n                            valid: false,\n                            error: 'Localhost is not allowed for proxy URLs'\n                        };\n                    }\n\n                    // For private IP ranges (simplified check)\n                    if (this.isPrivateIP(hostname)) {\n                        return {\n                            valid: false,\n                            error: 'Private IP addresses are not allowed for proxy URLs'\n                        };\n                    }\n\n                    // For link-local addresses\n                    if (hostname.startsWith('169.254.') || hostname.startsWith('fe80:')) {\n                        return {\n                            valid: false,\n                            error: 'Link-local addresses are not allowed for proxy URLs'\n                        };\n                    }\n                }\n\n                // Static hostname checks are best-effort: a proxy operator must\n                // additionally pin/resolve proxy targets server-side, since\n                // client-side validation cannot defend against DNS rebinding.\n                return { valid: true, sanitized: url };\n            }\n\n            return { valid: true, sanitized: url };\n        } catch (e) {\n            return {\n                valid: false,\n                error: `Invalid URL format: ${e instanceof Error ? e.message : 'Unknown error'}`\n            };\n        }\n    }\n\n    /**\n     * Check if a hostname is a private IP address\n     */\n    private isPrivateIP(hostname: string): boolean {\n        // IPv4 private ranges\n        const privateIPv4Patterns = [\n            /^0\\./, // 0.0.0.0/8 (This network)\n            /^10\\./, // 10.0.0.0/8 (Private)\n            /^100\\.(6[4-9]|[7-9][0-9]|1[0-1][0-9]|12[0-7])\\./, // 100.64.0.0/10 (CGNAT)\n            /^127\\./, // 127.0.0.0/8 (Loopback)\n            /^169\\.254\\./, // 169.254.0.0/16 (Link-local)\n            /^172\\.(1[6-9]|2[0-9]|3[0-1])\\./, // 172.16.0.0/12 (Private)\n            /^192\\.0\\.0\\./, // 192.0.0.0/24 (IETF Protocol Assignments)\n            /^192\\.0\\.2\\./, // 192.0.2.0/24 (TEST-NET-1)\n            /^192\\.168\\./, // 192.168.0.0/16 (Private)\n            /^198\\.(1[8-9])\\./, // 198.18.0.0/15 (Network benchmark)\n            /^198\\.51\\.100\\./, // 198.51.100.0/24 (TEST-NET-2)\n            /^203\\.0\\.113\\./, // 203.0.113.0/24 (TEST-NET-3)\n            /^2(2[4-9]|3[0-9])\\./, // 224.0.0.0/4 (Multicast)\n            /^24[0-9]\\./, // 240.0.0.0/4 (Reserved)\n            /^255\\.255\\.255\\.255$/ // 255.255.255.255/32 (Broadcast)\n        ];\n\n        // Check IPv4\n        if (privateIPv4Patterns.some((pattern) => pattern.test(hostname))) {\n            return true;\n        }\n\n        // IPv6 private ranges and special addresses\n        if (hostname.includes(':')) {\n            return this.isPrivateIPv6(hostname);\n        }\n\n        return false;\n    }\n\n    /**\n     * Check if an IPv6 address is private or special\n     * Handles compressed IPv6 addresses (e.g., ::1, fc00::1)\n     */\n    private isPrivateIPv6(hostname: string): boolean {\n        const normalizedHost = hostname.toLowerCase().trim();\n        // Remove square brackets if present (e.g., [::1])\n        const addr = normalizedHost.replace(/^\\[|\\]$/g, '');\n        // Remove zone ID if present (e.g., fe80::1%eth0)\n        const addrWithoutZone = addr.split('%')[0] ?? addr;\n        // Loopback ::1 (also matches 0:0:0:0:0:0:0:1)\n        if (/^(0:){7}1$/.test(addrWithoutZone) || addrWithoutZone === '::1') {\n            return true;\n        }\n        // Unspecified address :: (also matches 0:0:0:0:0:0:0:0)\n        if (/^(0:){7}0$/.test(addrWithoutZone) || addrWithoutZone === '::') {\n            return true;\n        }\n        // Expand :: compression to check prefixes\n        // This handles cases like fc00::1, fe80::, etc.\n        const expandedAddr = this.expandIPv6(addrWithoutZone);\n        if (!expandedAddr) {\n            // If we can't expand it, fall back to prefix matching\n            return this.isPrivateIPv6Prefix(addrWithoutZone);\n        }\n        // fc00::/7 (Unique Local Address)\n        // Check if first byte is in range fc00-fdff\n        const firstByte = parseInt(expandedAddr.substring(0, 2), 16);\n        if (firstByte >= 0xfc && firstByte <= 0xfd) {\n            return true;\n        }\n        // fe80::/10 (Link-local)\n        // First 10 bits should be 1111 1110 10\n        if (firstByte === 0xfe) {\n            const secondByte = parseInt(expandedAddr.substring(2, 4), 16);\n            // Check if bits 11-12 are 10 (0x80-0xbf)\n            if (secondByte >= 0x80 && secondByte <= 0xbf) {\n                return true;\n            }\n        }\n        // ff00::/8 (Multicast)\n        if (firstByte === 0xff) {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * Expand compressed IPv6 address to full form\n     * e.g., \"::1\" -> \"0000:0000:0000:0000:0000:0000:0000:0001\"\n     */\n    private expandIPv6(addr: string): string | null {\n        try {\n            // Handle :: compression\n            if (addr.includes('::')) {\n                const parts = addr.split('::');\n                if (parts.length > 2) {\n                    return null; // Invalid: more than one ::\n                }\n                const leftParts = parts[0] ? parts[0].split(':') : [];\n                const rightParts = parts[1] ? parts[1].split(':') : [];\n                const missingParts = 8 - leftParts.length - rightParts.length;\n                if (missingParts < 0) {\n                    return null; // Invalid\n                }\n                const middleParts = Array(missingParts).fill('0000');\n                const allParts = [...leftParts, ...middleParts, ...rightParts];\n                return allParts.map((p) => p.padStart(4, '0')).join(':');\n            } else {\n                // No compression, just normalize\n                const parts = addr.split(':');\n                if (parts.length !== 8) {\n                    return null; // Invalid\n                }\n                return parts.map((p) => p.padStart(4, '0')).join(':');\n            }\n        } catch {\n            return null;\n        }\n    }\n\n    /**\n     * Fallback prefix matching for IPv6 when expansion fails\n     */\n    private isPrivateIPv6Prefix(addr: string): boolean {\n        // fc00::/7 (Unique Local Address)\n        if (/^fc[0-9a-f]{0,2}:?/i.test(addr) || /^fd[0-9a-f]{0,2}:?/i.test(addr)) {\n            return true;\n        }\n        // fe80::/10 (Link-local)\n        if (/^fe[89ab][0-9a-f]:?/i.test(addr)) {\n            return true;\n        }\n        // ff00::/8 (Multicast)\n        if (/^ff[0-9a-f]{0,2}:?/i.test(addr)) {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * Validate CSP nonce\n     *\n     * @param nonce - CSP nonce to validate\n     * @returns Validation result\n     */\n    validateCspNonce(nonce: string): ValidationResult {\n        if (!nonce || typeof nonce !== 'string') {\n            return {\n                valid: false,\n                error: 'CSP nonce must be a non-empty string'\n            };\n        }\n\n        // Basic format validation - nonce should be base64-like\n        // Typical format: base64 string, often 32+ characters\n        if (nonce.length < 16) {\n            return {\n                valid: false,\n                error: 'CSP nonce is too short (minimum 16 characters recommended)'\n            };\n        }\n\n        // Check for suspicious characters\n        if (!/^[A-Za-z0-9+/=_-]+$/.test(nonce)) {\n            return {\n                valid: false,\n                error: 'CSP nonce contains invalid characters'\n            };\n        }\n\n        return { valid: true, sanitized: nonce };\n    }\n\n    /**\n     * Validate image timeout\n     *\n     * @param timeout - Timeout in milliseconds\n     * @returns Validation result\n     */\n    validateImageTimeout(timeout: number): ValidationResult {\n        if (typeof timeout !== 'number' || isNaN(timeout)) {\n            return {\n                valid: false,\n                error: 'Image timeout must be a number'\n            };\n        }\n\n        if (timeout < 0) {\n            return {\n                valid: false,\n                error: 'Image timeout cannot be negative'\n            };\n        }\n\n        if (this.config.maxImageTimeout && timeout > this.config.maxImageTimeout) {\n            return {\n                valid: false,\n                error: `Image timeout ${timeout}ms exceeds maximum allowed ${this.config.maxImageTimeout}ms`\n            };\n        }\n\n        return { valid: true, sanitized: timeout };\n    }\n\n    /**\n     * Validate window dimensions\n     *\n     * @param width - Window width\n     * @param height - Window height\n     * @returns Validation result\n     */\n    validateDimensions(width: number, height: number): ValidationResult {\n        if (typeof width !== 'number' || typeof height !== 'number') {\n            return {\n                valid: false,\n                error: 'Dimensions must be numbers'\n            };\n        }\n\n        if (isNaN(width) || isNaN(height)) {\n            return {\n                valid: false,\n                error: 'Dimensions cannot be NaN'\n            };\n        }\n\n        if (width <= 0 || height <= 0) {\n            return {\n                valid: false,\n                error: 'Dimensions must be positive'\n            };\n        }\n\n        // Reasonable maximum to prevent memory issues\n        const MAX_DIMENSION = 32767; // Common canvas limit\n        if (width > MAX_DIMENSION || height > MAX_DIMENSION) {\n            return {\n                valid: false,\n                error: `Dimensions exceed maximum allowed (${MAX_DIMENSION}px)`\n            };\n        }\n\n        return { valid: true, sanitized: { width, height } };\n    }\n\n    /**\n     * Validate scale factor\n     *\n     * @param scale - Scale factor\n     * @returns Validation result\n     */\n    validateScale(scale: number): ValidationResult {\n        if (typeof scale !== 'number' || isNaN(scale)) {\n            return {\n                valid: false,\n                error: 'Scale must be a number'\n            };\n        }\n\n        if (scale <= 0) {\n            return {\n                valid: false,\n                error: 'Scale must be positive'\n            };\n        }\n\n        // Reasonable scale limits\n        if (scale > 10) {\n            return {\n                valid: false,\n                error: 'Scale factor too large (maximum 10x)'\n            };\n        }\n\n        return { valid: true, sanitized: scale };\n    }\n\n    /**\n     * Validate HTML element\n     *\n     * @param element - Element to validate\n     * @returns Validation result\n     */\n    validateElement(element: unknown): ValidationResult {\n        if (!element) {\n            return {\n                valid: false,\n                error: 'Element is required'\n            };\n        }\n\n        if (typeof element !== 'object') {\n            return {\n                valid: false,\n                error: 'Element must be an object'\n            };\n        }\n\n        // Accept real HTMLElement, or any element-like object with the minimal shape\n        // required by the implementation (ownerDocument + defaultView) for backward\n        // compatibility and test environments.\n        const el = element as Record<string, unknown>;\n        if (typeof HTMLElement !== 'undefined' && element instanceof HTMLElement) {\n            // Real DOM element\n            if (!element.ownerDocument) {\n                return { valid: false, error: 'Element must be attached to a document' };\n            }\n            return { valid: true };\n        }\n\n        // Duck-typing: accept object with ownerDocument and defaultView (minimal contract)\n        if (!el.ownerDocument) {\n            return {\n                valid: false,\n                error: 'Element must be attached to a document (ownerDocument required)'\n            };\n        }\n        if (!(el.ownerDocument as Record<string, unknown>).defaultView) {\n            return {\n                valid: false,\n                error: 'Document must be attached to a window (ownerDocument.defaultView required)'\n            };\n        }\n\n        return { valid: true };\n    }\n\n    /**\n     * Validate entire options object\n     *\n     * @param options - Options to validate\n     * @returns Validation result with all errors\n     */\n    validateOptions(options: Record<string, unknown>): ValidationResult {\n        const errors: string[] = [];\n\n        const proxyUrl = options.proxy as string | undefined | null;\n        if (proxyUrl !== undefined && proxyUrl !== null && typeof proxyUrl === 'string' && proxyUrl.length > 0) {\n            const proxyResult = this.validateUrl(proxyUrl, 'proxy');\n            if (!proxyResult.valid) {\n                errors.push(`Proxy: ${proxyResult.error}`);\n            }\n        }\n\n        // Validate image timeout\n        if (options.imageTimeout !== undefined) {\n            const timeoutResult = this.validateImageTimeout(options.imageTimeout as number);\n            if (!timeoutResult.valid) {\n                errors.push(`Image timeout: ${timeoutResult.error}`);\n            }\n        } // Validate dimensions\n        if (options.width !== undefined || options.height !== undefined) {\n            const width = (options.width as number) ?? 800;\n            const height = (options.height as number) ?? 600;\n            const dimensionsResult = this.validateDimensions(width, height);\n            if (!dimensionsResult.valid) {\n                errors.push(`Dimensions: ${dimensionsResult.error}`);\n            }\n        }\n\n        // Validate scale\n        if (options.scale !== undefined) {\n            const scaleResult = this.validateScale(options.scale as number);\n            if (!scaleResult.valid) {\n                errors.push(`Scale: ${scaleResult.error}`);\n            }\n        }\n\n        // Validate CSP nonce\n        if (options.cspNonce !== undefined) {\n            const nonceResult = this.validateCspNonce(options.cspNonce as string);\n            if (!nonceResult.valid) {\n                errors.push(`CSP nonce: ${nonceResult.error}`);\n            }\n        }\n\n        // Custom validation\n        if (this.config.customValidator) {\n            const customResult = this.config.customValidator(options, 'options');\n            if (!customResult.valid) {\n                errors.push(`Custom validation: ${customResult.error}`);\n            }\n        }\n\n        if (errors.length > 0) {\n            return {\n                valid: false,\n                error: errors.join('; ')\n            };\n        }\n\n        return { valid: true };\n    }\n}\n\n/**\n * Create a default validator instance\n */\nexport function createDefaultValidator(config: ValidatorConfig = {}): Validator {\n    return new Validator({\n        allowDataUrls: true,\n        maxImageTimeout: 300000, // 5 minutes\n        ...config\n    });\n}\n\n/**\n * Create a strict validator with security-focused settings\n */\nexport function createStrictValidator(allowedProxyDomains: string[]): Validator {\n    return new Validator({\n        allowedProxyDomains,\n        allowDataUrls: false,\n        maxImageTimeout: 60000 // 1 minute\n    });\n}\n","import { Context } from './context';\n\n/**\n * Performance Metric\n *\n * Represents a single performance measurement\n */\nexport interface PerformanceMetric {\n    name: string;\n    startTime: number;\n    endTime?: number;\n    duration?: number;\n    metadata?: Record<string, unknown>;\n}\n\n/**\n * Performance Summary\n *\n * Aggregated performance data\n */\nexport interface PerformanceSummary {\n    totalDuration: number;\n    metrics: PerformanceMetric[];\n    breakdown: Array<{\n        name: string;\n        duration: number;\n        percentage: string;\n    }>;\n}\n\n/**\n * Performance Monitor\n *\n * Tracks performance metrics throughout the rendering pipeline.\n * Provides insights into where time is spent during rendering.\n *\n * Usage:\n * ```typescript\n * const monitor = new PerformanceMonitor(context);\n *\n * monitor.start('clone');\n * await cloneDocument();\n * monitor.end('clone');\n *\n * const summary = monitor.getSummary();\n * ```\n */\nexport class PerformanceMonitor {\n    private readonly activeMetrics: Map<string, PerformanceMetric> = new Map();\n    private readonly completedMetrics: PerformanceMetric[] = [];\n    private readonly enabled: boolean;\n    private readonly getTime: () => number;\n\n    constructor(\n        private readonly context: Context | null,\n        enabled: boolean = true\n    ) {\n        this.enabled = enabled;\n\n        // Fallback for environments without performance.now()\n        this.getTime =\n            typeof performance !== 'undefined' && typeof performance.now === 'function'\n                ? () => performance.now()\n                : () => Date.now();\n    }\n\n    /**\n     * Start measuring a performance metric\n     *\n     * @param name - Unique name for this metric\n     * @param metadata - Optional metadata to attach\n     */\n    start(name: string, metadata?: Record<string, unknown>): void {\n        if (!this.enabled) {\n            return;\n        }\n\n        if (this.activeMetrics.has(name)) {\n            this.context?.logger.warn(`Performance metric '${name}' already started. Overwriting.`);\n        }\n\n        this.activeMetrics.set(name, {\n            name,\n            startTime: this.getTime(),\n            metadata\n        });\n    }\n\n    /**\n     * End measuring a performance metric\n     *\n     * @param name - Name of the metric to end\n     * @returns The completed metric, or undefined if not found\n     */\n    end(name: string): PerformanceMetric | undefined {\n        if (!this.enabled) {\n            return undefined;\n        }\n\n        const metric = this.activeMetrics.get(name);\n\n        if (!metric) {\n            this.context?.logger.warn(`Performance metric '${name}' not found. Was start() called?`);\n            return undefined;\n        }\n\n        metric.endTime = this.getTime();\n        metric.duration = metric.endTime - metric.startTime;\n\n        this.completedMetrics.push(metric);\n        this.activeMetrics.delete(name);\n\n        this.context?.logger.debug(`⏱️  ${name}: ${metric.duration.toFixed(2)}ms`, metric.metadata);\n\n        return metric;\n    }\n\n    /**\n     * Measure a synchronous function\n     *\n     * @param name - Name for this measurement\n     * @param fn - Function to measure\n     * @param metadata - Optional metadata\n     * @returns The function's return value\n     */\n    measure<T>(name: string, fn: () => T, metadata?: Record<string, unknown>): T {\n        this.start(name, metadata);\n        try {\n            const result = fn();\n            this.end(name);\n            return result;\n        } catch (error) {\n            this.end(name);\n            throw error;\n        }\n    }\n\n    /**\n     * Measure an asynchronous function\n     *\n     * @param name - Name for this measurement\n     * @param fn - Async function to measure\n     * @param metadata - Optional metadata\n     * @returns Promise resolving to the function's return value\n     */\n    async measureAsync<T>(name: string, fn: () => Promise<T>, metadata?: Record<string, unknown>): Promise<T> {\n        this.start(name, metadata);\n        try {\n            const result = await fn();\n            this.end(name);\n            return result;\n        } catch (error) {\n            this.end(name);\n            throw error;\n        }\n    }\n\n    /**\n     * Get all completed metrics\n     *\n     * @returns Array of completed performance metrics\n     */\n    getMetrics(): PerformanceMetric[] {\n        return [...this.completedMetrics];\n    }\n\n    /**\n     * Get a specific metric by name\n     *\n     * @param name - Metric name\n     * @returns The metric, or undefined if not found\n     */\n    getMetric(name: string): PerformanceMetric | undefined {\n        return this.completedMetrics.find((m) => m.name === name);\n    }\n\n    /**\n     * Get performance summary\n     *\n     * @returns Aggregated performance data\n     */\n    getSummary(): PerformanceSummary {\n        const totalDuration = this.completedMetrics.reduce((sum, metric) => sum + (metric.duration || 0), 0);\n\n        const breakdown = this.completedMetrics.map((metric) => ({\n            name: metric.name,\n            duration: metric.duration || 0,\n            percentage: totalDuration > 0 ? (((metric.duration || 0) / totalDuration) * 100).toFixed(1) + '%' : '0%'\n        }));\n\n        return {\n            totalDuration,\n            metrics: this.getMetrics(),\n            breakdown\n        };\n    }\n\n    /**\n     * Log performance summary to console\n     */\n    logSummary(): void {\n        if (!this.enabled || this.completedMetrics.length === 0 || !this.context) {\n            return;\n        }\n\n        const summary = this.getSummary();\n\n        this.context.logger.info(`\\n📊 Performance Summary (Total: ${summary.totalDuration.toFixed(2)}ms):`);\n\n        summary.breakdown\n            .sort((a, b) => b.duration - a.duration)\n            .forEach((item) => {\n                this.context!.logger.info(\n                    `  ${item.name.padEnd(20)} ${item.duration.toFixed(2).padStart(8)}ms  ${item.percentage.padStart(6)}`\n                );\n            });\n    }\n\n    /**\n     * Clear all metrics\n     */\n    clear(): void {\n        this.activeMetrics.clear();\n        this.completedMetrics.splice(0);\n    }\n\n    /**\n     * Check if monitoring is enabled\n     */\n    isEnabled(): boolean {\n        return this.enabled;\n    }\n\n    /**\n     * Get active (uncompleted) metrics\n     * Useful for debugging leaked measurements\n     */\n    getActiveMetrics(): string[] {\n        return Array.from(this.activeMetrics.keys());\n    }\n}\n","import { Context } from '../../core/context';\n\nexport class Bounds {\n    constructor(\n        readonly left: number,\n        readonly top: number,\n        readonly width: number,\n        readonly height: number\n    ) {}\n\n    add(x: number, y: number, w: number, h: number): Bounds {\n        return new Bounds(this.left + x, this.top + y, this.width + w, this.height + h);\n    }\n\n    static fromClientRect(context: Context, clientRect: ClientRect): Bounds {\n        return new Bounds(\n            clientRect.left + context.windowBounds.left,\n            clientRect.top + context.windowBounds.top,\n            clientRect.width,\n            clientRect.height\n        );\n    }\n\n    static fromDOMRectList(context: Context, domRectList: DOMRectList): Bounds {\n        const rects = Array.from(domRectList);\n\n        // First try to find a rect with non-zero width\n        let domRect = rects.find((rect) => rect.width !== 0);\n\n        // If not found, try to find a rect with non-zero height\n        // This handles cases like inline-flex with single child where width might be 0\n        if (!domRect) {\n            domRect = rects.find((rect) => rect.height !== 0);\n        }\n\n        // If still not found but rects exist, use the first rect\n        // Position info (left, top) might still be valid even if dimensions are 0\n        if (!domRect && rects.length > 0) {\n            domRect = rects[0];\n        }\n\n        return domRect\n            ? new Bounds(\n                  domRect.left + context.windowBounds.left,\n                  domRect.top + context.windowBounds.top,\n                  domRect.width,\n                  domRect.height\n              )\n            : Bounds.EMPTY;\n    }\n\n    static EMPTY = new Bounds(0, 0, 0, 0);\n}\n\nexport const parseBounds = (context: Context, node: Element): Bounds => {\n    return Bounds.fromClientRect(context, node.getBoundingClientRect());\n};\n\nexport const parseDocumentSize = (document: Document): Bounds => {\n    const body = document.body;\n    const documentElement = document.documentElement;\n\n    if (!body || !documentElement) {\n        throw new Error(`Unable to get document size`);\n    }\n    const width = Math.max(\n        Math.max(body.scrollWidth, documentElement.scrollWidth),\n        Math.max(body.offsetWidth, documentElement.offsetWidth),\n        Math.max(body.clientWidth, documentElement.clientWidth)\n    );\n\n    const height = Math.max(\n        Math.max(body.scrollHeight, documentElement.scrollHeight),\n        Math.max(body.offsetHeight, documentElement.offsetHeight),\n        Math.max(body.clientHeight, documentElement.clientHeight)\n    );\n\n    return new Bounds(0, 0, width, height);\n};\n","export const SMALL_IMAGE = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\n\n/**\n * Indexed access where the shape/arity is guaranteed by construction (the CSS\n * grammar or a preceding length check). Throws on the impossible case instead\n * of silently propagating `undefined`.\n */\nexport const at = <T>(items: readonly T[], index: number): T => {\n    const value = items[index];\n    if (value === undefined) {\n        throw new Error(`Missing element at index ${index}`);\n    }\n    return value;\n};\n","// CSS tokenizer code-point constants and character-classification predicates.\n// Pure functions with no runtime dependencies — usable without the Tokenizer class.\n\nconst LINE_FEED = 0x000a;\nconst SOLIDUS = 0x002f;\nconst REVERSE_SOLIDUS = 0x005c;\nconst CHARACTER_TABULATION = 0x0009;\nconst SPACE = 0x0020;\nconst QUOTATION_MARK = 0x0022;\nconst EQUALS_SIGN = 0x003d;\nconst NUMBER_SIGN = 0x0023;\nconst DOLLAR_SIGN = 0x0024;\nconst PERCENTAGE_SIGN = 0x0025;\nconst APOSTROPHE = 0x0027;\nconst LEFT_PARENTHESIS = 0x0028;\nconst RIGHT_PARENTHESIS = 0x0029;\nconst LOW_LINE = 0x005f;\nconst HYPHEN_MINUS = 0x002d;\nconst EXCLAMATION_MARK = 0x0021;\nconst LESS_THAN_SIGN = 0x003c;\nconst GREATER_THAN_SIGN = 0x003e;\nconst COMMERCIAL_AT = 0x0040;\nconst LEFT_SQUARE_BRACKET = 0x005b;\nconst RIGHT_SQUARE_BRACKET = 0x005d;\nconst CIRCUMFLEX_ACCENT = 0x005e;\nconst LEFT_CURLY_BRACKET = 0x007b;\nconst QUESTION_MARK = 0x003f;\nconst RIGHT_CURLY_BRACKET = 0x007d;\nconst VERTICAL_LINE = 0x007c;\nconst TILDE = 0x007e;\nconst CONTROL = 0x0080;\nconst REPLACEMENT_CHARACTER = 0xfffd;\nconst ASTERISK = 0x002a;\nconst PLUS_SIGN = 0x002b;\nconst COMMA = 0x002c;\nconst COLON = 0x003a;\nconst SEMICOLON = 0x003b;\nconst FULL_STOP = 0x002e;\nconst NULL = 0x0000;\nconst BACKSPACE = 0x0008;\nconst LINE_TABULATION = 0x000b;\nconst SHIFT_OUT = 0x000e;\nconst INFORMATION_SEPARATOR_ONE = 0x001f;\nconst DELETE = 0x007f;\nconst EOF = -1;\nconst ZERO = 0x0030;\nconst a = 0x0061;\nconst e = 0x0065;\nconst f = 0x0066;\nconst u = 0x0075;\nconst z = 0x007a;\nconst A = 0x0041;\nconst E = 0x0045;\nconst F = 0x0046;\nconst U = 0x0055;\nconst Z = 0x005a;\n\n/** Re-exported code-point constants used by the Tokenizer class internally. */\nexport {\n    LINE_FEED,\n    SOLIDUS,\n    REVERSE_SOLIDUS,\n    CHARACTER_TABULATION,\n    SPACE,\n    QUOTATION_MARK,\n    EQUALS_SIGN,\n    NUMBER_SIGN,\n    DOLLAR_SIGN,\n    PERCENTAGE_SIGN,\n    APOSTROPHE,\n    LEFT_PARENTHESIS,\n    RIGHT_PARENTHESIS,\n    LOW_LINE,\n    HYPHEN_MINUS,\n    EXCLAMATION_MARK,\n    LESS_THAN_SIGN,\n    GREATER_THAN_SIGN,\n    COMMERCIAL_AT,\n    LEFT_SQUARE_BRACKET,\n    RIGHT_SQUARE_BRACKET,\n    CIRCUMFLEX_ACCENT,\n    LEFT_CURLY_BRACKET,\n    QUESTION_MARK,\n    RIGHT_CURLY_BRACKET,\n    VERTICAL_LINE,\n    TILDE,\n    CONTROL,\n    REPLACEMENT_CHARACTER,\n    ASTERISK,\n    PLUS_SIGN,\n    COMMA,\n    COLON,\n    SEMICOLON,\n    FULL_STOP,\n    NULL,\n    BACKSPACE,\n    LINE_TABULATION,\n    SHIFT_OUT,\n    INFORMATION_SEPARATOR_ONE,\n    DELETE,\n    EOF,\n    ZERO,\n    a,\n    e,\n    f,\n    u,\n    z,\n    A,\n    E,\n    F,\n    U,\n    Z\n};\n\nimport { at } from '../../core/util';\n\nconst isDigit = (codePoint: number) => codePoint >= ZERO && codePoint <= 0x0039;\nconst isSurrogateCodePoint = (codePoint: number) => codePoint >= 0xd800 && codePoint <= 0xdfff;\nconst isHex = (codePoint: number) =>\n    isDigit(codePoint) || (codePoint >= A && codePoint <= F) || (codePoint >= a && codePoint <= f);\nconst isLowerCaseLetter = (codePoint: number) => codePoint >= a && codePoint <= z;\nconst isUpperCaseLetter = (codePoint: number) => codePoint >= A && codePoint <= Z;\nconst isLetter = (codePoint: number) => isLowerCaseLetter(codePoint) || isUpperCaseLetter(codePoint);\nconst isNonASCIICodePoint = (codePoint: number) => codePoint >= CONTROL;\nconst isWhiteSpace = (codePoint: number): boolean =>\n    codePoint === LINE_FEED || codePoint === CHARACTER_TABULATION || codePoint === SPACE;\nconst isNameStartCodePoint = (codePoint: number): boolean =>\n    isLetter(codePoint) || isNonASCIICodePoint(codePoint) || codePoint === LOW_LINE;\nconst isNameCodePoint = (codePoint: number): boolean =>\n    isNameStartCodePoint(codePoint) || isDigit(codePoint) || codePoint === HYPHEN_MINUS;\nconst isNonPrintableCodePoint = (codePoint: number): boolean => {\n    return (\n        (codePoint >= NULL && codePoint <= BACKSPACE) ||\n        codePoint === LINE_TABULATION ||\n        (codePoint >= SHIFT_OUT && codePoint <= INFORMATION_SEPARATOR_ONE) ||\n        codePoint === DELETE\n    );\n};\nconst isValidEscape = (c1: number, c2: number): boolean => {\n    if (c1 !== REVERSE_SOLIDUS) {\n        return false;\n    }\n\n    return c2 !== LINE_FEED;\n};\nconst isIdentifierStart = (c1: number, c2: number, c3: number): boolean => {\n    if (c1 === HYPHEN_MINUS) {\n        return isNameStartCodePoint(c2) || isValidEscape(c2, c3);\n    } else if (isNameStartCodePoint(c1)) {\n        return true;\n    } else if (c1 === REVERSE_SOLIDUS && isValidEscape(c1, c2)) {\n        return true;\n    }\n    return false;\n};\n\nconst isNumberStart = (c1: number, c2: number, c3: number): boolean => {\n    if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) {\n        if (isDigit(c2)) {\n            return true;\n        }\n\n        return c2 === FULL_STOP && isDigit(c3);\n    }\n\n    if (c1 === FULL_STOP) {\n        return isDigit(c2);\n    }\n\n    return isDigit(c1);\n};\n\n/** Re-exported character-classification predicates. */\nexport {\n    isDigit,\n    isSurrogateCodePoint,\n    isHex,\n    isLowerCaseLetter,\n    isUpperCaseLetter,\n    isLetter,\n    isNonASCIICodePoint,\n    isWhiteSpace,\n    isNameStartCodePoint,\n    isNameCodePoint,\n    isNonPrintableCodePoint,\n    isValidEscape,\n    isIdentifierStart,\n    isNumberStart\n};\n\nconst stringToNumber = (codePoints: number[]): number => {\n    let c = 0;\n    let sign = 1;\n    if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) {\n        if (codePoints[c] === HYPHEN_MINUS) {\n            sign = -1;\n        }\n        c++;\n    }\n\n    const integers: number[] = [];\n\n    while (isDigit(codePoints[c] ?? NaN)) {\n        integers.push(at(codePoints, c));\n        c++;\n    }\n\n    const int = integers.length ? parseInt(String.fromCodePoint(...integers), 10) : 0;\n\n    if (codePoints[c] === FULL_STOP) {\n        c++;\n    }\n\n    const fraction = [];\n    while (isDigit(codePoints[c] ?? NaN)) {\n        fraction.push(at(codePoints, c));\n        c++;\n    }\n\n    const fracd = fraction.length;\n    const frac = fracd ? parseInt(String.fromCodePoint(...fraction), 10) : 0;\n\n    if (codePoints[c] === E || codePoints[c] === e) {\n        c++;\n    }\n\n    let expsign = 1;\n\n    if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) {\n        if (codePoints[c] === HYPHEN_MINUS) {\n            expsign = -1;\n        }\n        c++;\n    }\n\n    const exponent: number[] = [];\n\n    while (isDigit(codePoints[c] ?? NaN)) {\n        exponent.push(at(codePoints, c));\n        c++;\n    }\n\n    const exp = exponent.length ? parseInt(String.fromCodePoint(...exponent), 10) : 0;\n\n    return sign * (int + frac * Math.pow(10, -fracd)) * Math.pow(10, expsign * exp);\n};\n\n/** Re-exported helper: converts an array of code points to a JS number. */\nexport { stringToNumber };\n","// Singleton token objects used by the CSS tokenizer.\n// Reusing immutable objects avoids allocations for single-character tokens.\nimport { TokenType } from './token-types';\nimport type { Token } from './token-types';\n\nexport const LEFT_PARENTHESIS_TOKEN: Token = {\n    type: TokenType.LEFT_PARENTHESIS_TOKEN\n};\nexport const RIGHT_PARENTHESIS_TOKEN: Token = {\n    type: TokenType.RIGHT_PARENTHESIS_TOKEN\n};\nexport const COMMA_TOKEN: Token = { type: TokenType.COMMA_TOKEN };\nexport const SUFFIX_MATCH_TOKEN: Token = { type: TokenType.SUFFIX_MATCH_TOKEN };\nexport const PREFIX_MATCH_TOKEN: Token = { type: TokenType.PREFIX_MATCH_TOKEN };\nexport const COLUMN_TOKEN: Token = { type: TokenType.COLUMN_TOKEN };\nexport const DASH_MATCH_TOKEN: Token = { type: TokenType.DASH_MATCH_TOKEN };\nexport const INCLUDE_MATCH_TOKEN: Token = { type: TokenType.INCLUDE_MATCH_TOKEN };\nexport const LEFT_CURLY_BRACKET_TOKEN: Token = {\n    type: TokenType.LEFT_CURLY_BRACKET_TOKEN\n};\nexport const RIGHT_CURLY_BRACKET_TOKEN: Token = {\n    type: TokenType.RIGHT_CURLY_BRACKET_TOKEN\n};\nexport const SUBSTRING_MATCH_TOKEN: Token = { type: TokenType.SUBSTRING_MATCH_TOKEN };\nexport const BAD_URL_TOKEN: Token = { type: TokenType.BAD_URL_TOKEN };\nexport const BAD_STRING_TOKEN: Token = { type: TokenType.BAD_STRING_TOKEN };\nexport const CDO_TOKEN: Token = { type: TokenType.CDO_TOKEN };\nexport const CDC_TOKEN: Token = { type: TokenType.CDC_TOKEN };\nexport const COLON_TOKEN: Token = { type: TokenType.COLON_TOKEN };\nexport const SEMICOLON_TOKEN: Token = { type: TokenType.SEMICOLON_TOKEN };\nexport const LEFT_SQUARE_BRACKET_TOKEN: Token = {\n    type: TokenType.LEFT_SQUARE_BRACKET_TOKEN\n};\nexport const RIGHT_SQUARE_BRACKET_TOKEN: Token = {\n    type: TokenType.RIGHT_SQUARE_BRACKET_TOKEN\n};\nexport const WHITESPACE_TOKEN: Token = { type: TokenType.WHITESPACE_TOKEN };\nexport const EOF_TOKEN: Token = { type: TokenType.EOF_TOKEN };\n","// https://www.w3.org/TR/css-syntax-3\n\nimport { TokenType, FLAG_UNRESTRICTED, FLAG_ID, FLAG_INTEGER, FLAG_NUMBER } from './token-types';\nimport type {\n    CSSToken,\n    StringValueToken,\n    UnicodeRangeToken,\n    NumberValueToken,\n    DimensionToken,\n    Token\n} from './token-types';\nimport {\n    QUOTATION_MARK,\n    NUMBER_SIGN,\n    EQUALS_SIGN,\n    DOLLAR_SIGN,\n    APOSTROPHE,\n    LEFT_PARENTHESIS,\n    RIGHT_PARENTHESIS,\n    ASTERISK,\n    COMMA,\n    HYPHEN_MINUS,\n    GREATER_THAN_SIGN,\n    FULL_STOP,\n    SOLIDUS,\n    COLON,\n    SEMICOLON,\n    LESS_THAN_SIGN,\n    EXCLAMATION_MARK,\n    COMMERCIAL_AT,\n    LEFT_SQUARE_BRACKET,\n    REVERSE_SOLIDUS,\n    RIGHT_SQUARE_BRACKET,\n    CIRCUMFLEX_ACCENT,\n    LEFT_CURLY_BRACKET,\n    RIGHT_CURLY_BRACKET,\n    PLUS_SIGN,\n    VERTICAL_LINE,\n    TILDE,\n    EOF,\n    QUESTION_MARK,\n    ZERO,\n    PERCENTAGE_SIGN,\n    REPLACEMENT_CHARACTER,\n    F,\n    E,\n    e,\n    u,\n    U,\n    LINE_FEED\n} from './token-constants';\nimport {\n    isDigit,\n    isHex,\n    isWhiteSpace,\n    isNameCodePoint,\n    isNonPrintableCodePoint,\n    isValidEscape,\n    isIdentifierStart,\n    isNameStartCodePoint,\n    isSurrogateCodePoint,\n    isNumberStart,\n    stringToNumber\n} from './token-constants';\nimport {\n    LEFT_PARENTHESIS_TOKEN,\n    RIGHT_PARENTHESIS_TOKEN,\n    COMMA_TOKEN,\n    SUFFIX_MATCH_TOKEN,\n    PREFIX_MATCH_TOKEN,\n    COLUMN_TOKEN,\n    DASH_MATCH_TOKEN,\n    INCLUDE_MATCH_TOKEN,\n    LEFT_CURLY_BRACKET_TOKEN,\n    RIGHT_CURLY_BRACKET_TOKEN,\n    SUBSTRING_MATCH_TOKEN,\n    BAD_URL_TOKEN,\n    BAD_STRING_TOKEN,\n    CDO_TOKEN,\n    CDC_TOKEN,\n    COLON_TOKEN,\n    SEMICOLON_TOKEN,\n    LEFT_SQUARE_BRACKET_TOKEN,\n    RIGHT_SQUARE_BRACKET_TOKEN,\n    WHITESPACE_TOKEN,\n    EOF_TOKEN\n} from './token-singletons';\n\n// ── Re-export the full public surface from sub-modules ──────────────────\n// This preserves every existing import path. Consumers that currently write\n//   import { TokenType, CSSToken, Tokenizer } from './tokenizer'\n// continue to work without changes.\nexport { TokenType } from './token-types';\nexport type {\n    Token,\n    StringValueToken,\n    HashToken,\n    NumberValueToken,\n    DimensionToken,\n    UnicodeRangeToken,\n    CSSToken\n} from './token-types';\nexport { FLAG_UNRESTRICTED, FLAG_ID, FLAG_INTEGER, FLAG_NUMBER } from './token-types';\nexport {\n    isDigit,\n    isHex,\n    isWhiteSpace,\n    isNameCodePoint,\n    isValidEscape,\n    isIdentifierStart,\n    isNameStartCodePoint,\n    isNumberStart\n} from './token-constants';\nexport {\n    COMMA_TOKEN,\n    COLON_TOKEN,\n    SEMICOLON_TOKEN,\n    LEFT_PARENTHESIS_TOKEN,\n    RIGHT_PARENTHESIS_TOKEN,\n    LEFT_CURLY_BRACKET_TOKEN,\n    RIGHT_CURLY_BRACKET_TOKEN,\n    LEFT_SQUARE_BRACKET_TOKEN,\n    RIGHT_SQUARE_BRACKET_TOKEN,\n    WHITESPACE_TOKEN,\n    EOF_TOKEN,\n    BAD_URL_TOKEN,\n    BAD_STRING_TOKEN,\n    CDC_TOKEN,\n    CDO_TOKEN,\n    PREFIX_MATCH_TOKEN,\n    SUFFIX_MATCH_TOKEN,\n    SUBSTRING_MATCH_TOKEN,\n    DASH_MATCH_TOKEN,\n    INCLUDE_MATCH_TOKEN,\n    COLUMN_TOKEN\n} from './token-singletons';\n\nexport class Tokenizer {\n    private static _pool: Tokenizer[] = [];\n    private static readonly MAX_POOL_SIZE = 40;\n\n    static get(): Tokenizer {\n        return Tokenizer._pool.pop() || new Tokenizer();\n    }\n\n    static release(tokenizer: Tokenizer): void {\n        if (Tokenizer._pool.length < Tokenizer.MAX_POOL_SIZE) {\n            tokenizer._reset();\n            Tokenizer._pool.push(tokenizer);\n        }\n    }\n\n    private _value: number[];\n    /**\n     * Read cursor into `_value`. Consumption advances the cursor instead of\n     * shifting the array — `Array.shift()` per code point makes tokenising a\n     * long value O(n²) (a 200 KB inline data-URI background alone would cost\n     * billions of operations, and background-image values are never parse-\n     * cached). `write()` compacts already-consumed prefix bytes.\n     */\n    private _cursor: number;\n\n    constructor() {\n        this._value = [];\n        this._cursor = 0;\n    }\n\n    private _reset(): void {\n        this._value = [];\n        this._cursor = 0;\n    }\n\n    write(chunk: string): void {\n        if (this._cursor > 0) {\n            this._value = this._value.slice(this._cursor);\n            this._cursor = 0;\n        }\n        this._value = this._value.concat([...chunk].map((char) => char.codePointAt(0) as number));\n    }\n\n    read(): CSSToken[] {\n        const tokens = [];\n        let token = this.consumeToken();\n        while (token !== EOF_TOKEN) {\n            tokens.push(token);\n            token = this.consumeToken();\n        }\n        return tokens;\n    }\n\n    private consumeToken(): CSSToken {\n        const codePoint = this.consumeCodePoint();\n\n        switch (codePoint) {\n            case QUOTATION_MARK:\n                return this.consumeStringToken(QUOTATION_MARK);\n            case NUMBER_SIGN: {\n                const c1 = this.peekCodePoint(0);\n                const c2 = this.peekCodePoint(1);\n                const c3 = this.peekCodePoint(2);\n                if (isNameCodePoint(c1) || isValidEscape(c2, c3)) {\n                    const flags = isIdentifierStart(c1, c2, c3) ? FLAG_ID : FLAG_UNRESTRICTED;\n                    const value = this.consumeName();\n\n                    return { type: TokenType.HASH_TOKEN, value, flags };\n                }\n                break;\n            }\n            case DOLLAR_SIGN:\n                if (this.peekCodePoint(0) === EQUALS_SIGN) {\n                    this.consumeCodePoint();\n                    return SUFFIX_MATCH_TOKEN;\n                }\n                break;\n            case APOSTROPHE:\n                return this.consumeStringToken(APOSTROPHE);\n            case LEFT_PARENTHESIS:\n                return LEFT_PARENTHESIS_TOKEN;\n            case RIGHT_PARENTHESIS:\n                return RIGHT_PARENTHESIS_TOKEN;\n            case ASTERISK:\n                if (this.peekCodePoint(0) === EQUALS_SIGN) {\n                    this.consumeCodePoint();\n                    return SUBSTRING_MATCH_TOKEN;\n                }\n                break;\n            case PLUS_SIGN:\n                if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) {\n                    this.reconsumeCodePoint(codePoint);\n                    return this.consumeNumericToken();\n                }\n                break;\n            case COMMA:\n                return COMMA_TOKEN;\n            case HYPHEN_MINUS: {\n                const e1 = codePoint;\n                const e2 = this.peekCodePoint(0);\n                const e3 = this.peekCodePoint(1);\n\n                if (isNumberStart(e1, e2, e3)) {\n                    this.reconsumeCodePoint(codePoint);\n                    return this.consumeNumericToken();\n                }\n\n                if (isIdentifierStart(e1, e2, e3)) {\n                    this.reconsumeCodePoint(codePoint);\n                    return this.consumeIdentLikeToken();\n                }\n\n                if (e2 === HYPHEN_MINUS && e3 === GREATER_THAN_SIGN) {\n                    this.consumeCodePoint();\n                    this.consumeCodePoint();\n                    return CDC_TOKEN;\n                }\n                break;\n            }\n            case FULL_STOP:\n                if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) {\n                    this.reconsumeCodePoint(codePoint);\n                    return this.consumeNumericToken();\n                }\n                break;\n            case SOLIDUS:\n                if (this.peekCodePoint(0) === ASTERISK) {\n                    this.consumeCodePoint();\n                    while (true) {\n                        let c = this.consumeCodePoint();\n                        if (c === ASTERISK) {\n                            c = this.consumeCodePoint();\n                            if (c === SOLIDUS) {\n                                return this.consumeToken();\n                            }\n                        }\n                        if (c === EOF) {\n                            return this.consumeToken();\n                        }\n                    }\n                }\n                break;\n            case COLON:\n                return COLON_TOKEN;\n            case SEMICOLON:\n                return SEMICOLON_TOKEN;\n            case LESS_THAN_SIGN:\n                if (\n                    this.peekCodePoint(0) === EXCLAMATION_MARK &&\n                    this.peekCodePoint(1) === HYPHEN_MINUS &&\n                    this.peekCodePoint(2) === HYPHEN_MINUS\n                ) {\n                    this.consumeCodePoint();\n                    this.consumeCodePoint();\n                    this.consumeCodePoint();\n                    return CDO_TOKEN;\n                }\n                break;\n            case COMMERCIAL_AT: {\n                const a1 = this.peekCodePoint(0);\n                const a2 = this.peekCodePoint(1);\n                const a3 = this.peekCodePoint(2);\n                if (isIdentifierStart(a1, a2, a3)) {\n                    const value = this.consumeName();\n                    return { type: TokenType.AT_KEYWORD_TOKEN, value };\n                }\n                break;\n            }\n            case LEFT_SQUARE_BRACKET:\n                return LEFT_SQUARE_BRACKET_TOKEN;\n            case REVERSE_SOLIDUS:\n                if (isValidEscape(codePoint, this.peekCodePoint(0))) {\n                    this.reconsumeCodePoint(codePoint);\n                    return this.consumeIdentLikeToken();\n                }\n                break;\n            case RIGHT_SQUARE_BRACKET:\n                return RIGHT_SQUARE_BRACKET_TOKEN;\n            case CIRCUMFLEX_ACCENT:\n                if (this.peekCodePoint(0) === EQUALS_SIGN) {\n                    this.consumeCodePoint();\n                    return PREFIX_MATCH_TOKEN;\n                }\n                break;\n            case LEFT_CURLY_BRACKET:\n                return LEFT_CURLY_BRACKET_TOKEN;\n            case RIGHT_CURLY_BRACKET:\n                return RIGHT_CURLY_BRACKET_TOKEN;\n            case u:\n            case U: {\n                const u1 = this.peekCodePoint(0);\n                const u2 = this.peekCodePoint(1);\n                if (u1 === PLUS_SIGN && (isHex(u2) || u2 === QUESTION_MARK)) {\n                    this.consumeCodePoint();\n                    return this.consumeUnicodeRangeToken();\n                }\n                this.reconsumeCodePoint(codePoint);\n                return this.consumeIdentLikeToken();\n            }\n            case VERTICAL_LINE:\n                if (this.peekCodePoint(0) === EQUALS_SIGN) {\n                    this.consumeCodePoint();\n                    return DASH_MATCH_TOKEN;\n                }\n                if (this.peekCodePoint(0) === VERTICAL_LINE) {\n                    this.consumeCodePoint();\n                    return COLUMN_TOKEN;\n                }\n                break;\n            case TILDE:\n                if (this.peekCodePoint(0) === EQUALS_SIGN) {\n                    this.consumeCodePoint();\n                    return INCLUDE_MATCH_TOKEN;\n                }\n                break;\n            case EOF:\n                return EOF_TOKEN;\n        }\n\n        if (isWhiteSpace(codePoint)) {\n            this.consumeWhiteSpace();\n            return WHITESPACE_TOKEN;\n        }\n\n        if (isDigit(codePoint)) {\n            this.reconsumeCodePoint(codePoint);\n            return this.consumeNumericToken();\n        }\n\n        if (isNameStartCodePoint(codePoint)) {\n            this.reconsumeCodePoint(codePoint);\n            return this.consumeIdentLikeToken();\n        }\n\n        return { type: TokenType.DELIM_TOKEN, value: String.fromCodePoint(codePoint) };\n    }\n\n    private consumeCodePoint(): number {\n        const value = this._value[this._cursor];\n\n        if (value === undefined) {\n            return -1;\n        }\n        this._cursor++;\n        return value;\n    }\n\n    private reconsumeCodePoint(codePoint: number) {\n        // Reconsuming always rewinds the code point that was just consumed;\n        // the defensive splice covers hypothetical out-of-order callers.\n        if (this._cursor > 0 && this._value[this._cursor - 1] === codePoint) {\n            this._cursor--;\n        } else {\n            this._value.splice(this._cursor, 0, codePoint);\n        }\n    }\n\n    private peekCodePoint(delta: number): number {\n        const codePoint = this._value[this._cursor + delta];\n        return codePoint !== undefined ? codePoint : -1;\n    }\n\n    private consumeUnicodeRangeToken(): UnicodeRangeToken {\n        const digits = [];\n        let codePoint = this.consumeCodePoint();\n        while (isHex(codePoint) && digits.length < 6) {\n            digits.push(codePoint);\n            codePoint = this.consumeCodePoint();\n        }\n        let questionMarks = false;\n        while (codePoint === QUESTION_MARK && digits.length < 6) {\n            digits.push(codePoint);\n            codePoint = this.consumeCodePoint();\n            questionMarks = true;\n        }\n\n        if (questionMarks) {\n            const start = parseInt(\n                String.fromCodePoint(...digits.map((digit) => (digit === QUESTION_MARK ? ZERO : digit))),\n                16\n            );\n            const end = parseInt(\n                String.fromCodePoint(...digits.map((digit) => (digit === QUESTION_MARK ? F : digit))),\n                16\n            );\n            return { type: TokenType.UNICODE_RANGE_TOKEN, start, end };\n        }\n\n        const start = parseInt(String.fromCodePoint(...digits), 16);\n        if (codePoint === HYPHEN_MINUS && isHex(this.peekCodePoint(0))) {\n            codePoint = this.consumeCodePoint();\n            const endDigits = [];\n            while (isHex(codePoint) && endDigits.length < 6) {\n                endDigits.push(codePoint);\n                codePoint = this.consumeCodePoint();\n            }\n            const end = parseInt(String.fromCodePoint(...endDigits), 16);\n\n            return { type: TokenType.UNICODE_RANGE_TOKEN, start, end };\n        } else {\n            return { type: TokenType.UNICODE_RANGE_TOKEN, start, end: start };\n        }\n    }\n\n    private consumeIdentLikeToken(): StringValueToken | Token {\n        const value = this.consumeName();\n        if (value.toLowerCase() === 'url' && this.peekCodePoint(0) === LEFT_PARENTHESIS) {\n            this.consumeCodePoint();\n            return this.consumeUrlToken();\n        } else if (this.peekCodePoint(0) === LEFT_PARENTHESIS) {\n            this.consumeCodePoint();\n            return { type: TokenType.FUNCTION_TOKEN, value };\n        }\n\n        return { type: TokenType.IDENT_TOKEN, value };\n    }\n\n    private consumeUrlToken(): StringValueToken | Token {\n        const value = [];\n        this.consumeWhiteSpace();\n\n        if (this.peekCodePoint(0) === EOF) {\n            return { type: TokenType.URL_TOKEN, value: '' };\n        }\n\n        const next = this.peekCodePoint(0);\n        if (next === APOSTROPHE || next === QUOTATION_MARK) {\n            const stringToken = this.consumeStringToken(this.consumeCodePoint());\n            if (stringToken.type === TokenType.STRING_TOKEN) {\n                this.consumeWhiteSpace();\n\n                if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) {\n                    this.consumeCodePoint();\n                    return { type: TokenType.URL_TOKEN, value: (stringToken as StringValueToken).value };\n                }\n            }\n\n            this.consumeBadUrlRemnants();\n            return BAD_URL_TOKEN;\n        }\n\n        while (true) {\n            const codePoint = this.consumeCodePoint();\n            if (codePoint === EOF || codePoint === RIGHT_PARENTHESIS) {\n                return { type: TokenType.URL_TOKEN, value: String.fromCodePoint(...value) };\n            } else if (isWhiteSpace(codePoint)) {\n                this.consumeWhiteSpace();\n                if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) {\n                    this.consumeCodePoint();\n                    return { type: TokenType.URL_TOKEN, value: String.fromCodePoint(...value) };\n                }\n                this.consumeBadUrlRemnants();\n                return BAD_URL_TOKEN;\n            } else if (\n                codePoint === QUOTATION_MARK ||\n                codePoint === APOSTROPHE ||\n                codePoint === LEFT_PARENTHESIS ||\n                isNonPrintableCodePoint(codePoint)\n            ) {\n                this.consumeBadUrlRemnants();\n                return BAD_URL_TOKEN;\n            } else if (codePoint === REVERSE_SOLIDUS) {\n                if (isValidEscape(codePoint, this.peekCodePoint(0))) {\n                    value.push(this.consumeEscapedCodePoint());\n                } else {\n                    this.consumeBadUrlRemnants();\n                    return BAD_URL_TOKEN;\n                }\n            } else {\n                value.push(codePoint);\n            }\n        }\n    }\n\n    private consumeWhiteSpace(): void {\n        while (isWhiteSpace(this.peekCodePoint(0))) {\n            this.consumeCodePoint();\n        }\n    }\n\n    private consumeBadUrlRemnants(): void {\n        while (true) {\n            const codePoint = this.consumeCodePoint();\n            if (codePoint === RIGHT_PARENTHESIS || codePoint === EOF) {\n                return;\n            }\n\n            if (isValidEscape(codePoint, this.peekCodePoint(0))) {\n                this.consumeEscapedCodePoint();\n            }\n        }\n    }\n\n    private consumeStringSlice(count: number): string {\n        const SLICE_STACK_SIZE = 50000;\n        let value = '';\n        const end = this._cursor + count;\n        let from = this._cursor;\n        while (from < end) {\n            const to = Math.min(end, from + SLICE_STACK_SIZE);\n            value += String.fromCodePoint(...this._value.slice(from, to));\n            from = to;\n        }\n        // Drop the terminator (the closing quote, or the backslash when the\n        // caller continues with consumeEscapedCodePoint).\n        this._cursor = end + 1;\n\n        return value;\n    }\n\n    private consumeStringToken(endingCodePoint: number): StringValueToken | Token {\n        let value = '';\n        let i = 0;\n\n        do {\n            const codePoint = this._value[this._cursor + i];\n            if (codePoint === EOF || codePoint === undefined || codePoint === endingCodePoint) {\n                value += this.consumeStringSlice(i);\n                return { type: TokenType.STRING_TOKEN, value };\n            }\n\n            if (codePoint === LINE_FEED) {\n                this._cursor += i;\n                return BAD_STRING_TOKEN;\n            }\n\n            if (codePoint === REVERSE_SOLIDUS) {\n                const next = this._value[this._cursor + i + 1];\n                if (next !== EOF && next !== undefined) {\n                    if (next === LINE_FEED) {\n                        value += this.consumeStringSlice(i);\n                        i = -1;\n                        this._cursor++;\n                    } else if (isValidEscape(codePoint, next)) {\n                        value += this.consumeStringSlice(i);\n                        value += String.fromCodePoint(this.consumeEscapedCodePoint());\n                        i = -1;\n                    }\n                }\n            }\n\n            i++;\n        } while (true);\n    }\n\n    private consumeNumber(): [number, number] {\n        const repr = [];\n        let type = FLAG_INTEGER;\n        let c1 = this.peekCodePoint(0);\n        if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) {\n            repr.push(this.consumeCodePoint());\n        }\n\n        while (isDigit(this.peekCodePoint(0))) {\n            repr.push(this.consumeCodePoint());\n        }\n        c1 = this.peekCodePoint(0);\n        let c2 = this.peekCodePoint(1);\n        if (c1 === FULL_STOP && isDigit(c2)) {\n            repr.push(this.consumeCodePoint(), this.consumeCodePoint());\n            type = FLAG_NUMBER;\n            while (isDigit(this.peekCodePoint(0))) {\n                repr.push(this.consumeCodePoint());\n            }\n        }\n\n        c1 = this.peekCodePoint(0);\n        c2 = this.peekCodePoint(1);\n        const c3 = this.peekCodePoint(2);\n        if ((c1 === E || c1 === e) && (((c2 === PLUS_SIGN || c2 === HYPHEN_MINUS) && isDigit(c3)) || isDigit(c2))) {\n            repr.push(this.consumeCodePoint(), this.consumeCodePoint());\n            type = FLAG_NUMBER;\n            while (isDigit(this.peekCodePoint(0))) {\n                repr.push(this.consumeCodePoint());\n            }\n        }\n\n        return [stringToNumber(repr), type];\n    }\n\n    private consumeNumericToken(): NumberValueToken | DimensionToken {\n        const [number, flags] = this.consumeNumber();\n        const c1 = this.peekCodePoint(0);\n        const c2 = this.peekCodePoint(1);\n        const c3 = this.peekCodePoint(2);\n\n        if (isIdentifierStart(c1, c2, c3)) {\n            const unit = this.consumeName();\n            return { type: TokenType.DIMENSION_TOKEN, number, flags, unit };\n        }\n\n        if (c1 === PERCENTAGE_SIGN) {\n            this.consumeCodePoint();\n            return { type: TokenType.PERCENTAGE_TOKEN, number, flags };\n        }\n\n        return { type: TokenType.NUMBER_TOKEN, number, flags };\n    }\n\n    private consumeEscapedCodePoint(): number {\n        const codePoint = this.consumeCodePoint();\n\n        if (isHex(codePoint)) {\n            let hex = String.fromCodePoint(codePoint);\n            while (isHex(this.peekCodePoint(0)) && hex.length < 6) {\n                hex += String.fromCodePoint(this.consumeCodePoint());\n            }\n\n            if (isWhiteSpace(this.peekCodePoint(0))) {\n                this.consumeCodePoint();\n            }\n\n            const hexCodePoint = parseInt(hex, 16);\n\n            if (hexCodePoint === 0 || isSurrogateCodePoint(hexCodePoint) || hexCodePoint > 0x10ffff) {\n                return REPLACEMENT_CHARACTER;\n            }\n\n            return hexCodePoint;\n        }\n\n        if (codePoint === EOF) {\n            return REPLACEMENT_CHARACTER;\n        }\n\n        return codePoint;\n    }\n\n    private consumeName(): string {\n        let result = '';\n        while (true) {\n            const codePoint = this.consumeCodePoint();\n            if (isNameCodePoint(codePoint)) {\n                result += String.fromCodePoint(codePoint);\n            } else if (isValidEscape(codePoint, this.peekCodePoint(0))) {\n                result += String.fromCodePoint(this.consumeEscapedCodePoint());\n            } else {\n                this.reconsumeCodePoint(codePoint);\n                return result;\n            }\n        }\n    }\n}\n","import {\n    CSSToken,\n    DimensionToken,\n    EOF_TOKEN,\n    NumberValueToken,\n    StringValueToken,\n    Tokenizer,\n    TokenType\n} from './tokenizer';\n\nexport type CSSBlockType =\n    TokenType.LEFT_PARENTHESIS_TOKEN | TokenType.LEFT_SQUARE_BRACKET_TOKEN | TokenType.LEFT_CURLY_BRACKET_TOKEN;\n\nexport interface CSSBlock {\n    type: CSSBlockType;\n    values: CSSValue[];\n}\n\nexport interface CSSFunction {\n    type: TokenType.FUNCTION;\n    name: string;\n    values: CSSValue[];\n}\n\nexport type CSSValue = CSSFunction | CSSToken | CSSBlock;\n\nexport class Parser {\n    private _tokens: CSSToken[];\n\n    constructor(tokens: CSSToken[]) {\n        this._tokens = tokens;\n    }\n\n    static create(value: string): Parser {\n        const tokenizer = new Tokenizer();\n        tokenizer.write(value);\n        return new Parser(tokenizer.read());\n    }\n\n    static parseValue(value: string): CSSValue {\n        return Parser.create(value).parseComponentValue();\n    }\n\n    static parseValues(value: string): CSSValue[] {\n        return Parser.create(value).parseComponentValues();\n    }\n\n    parseComponentValue(): CSSValue {\n        let token = this.consumeToken();\n        while (token.type === TokenType.WHITESPACE_TOKEN) {\n            token = this.consumeToken();\n        }\n\n        if (token.type === TokenType.EOF_TOKEN) {\n            throw new SyntaxError(`Error parsing CSS component value, unexpected EOF`);\n        }\n\n        this.reconsumeToken(token);\n        const value = this.consumeComponentValue();\n\n        do {\n            token = this.consumeToken();\n        } while (token.type === TokenType.WHITESPACE_TOKEN);\n\n        if (token.type === TokenType.EOF_TOKEN) {\n            return value;\n        }\n\n        throw new SyntaxError(`Error parsing CSS component value, multiple values found when expecting only one`);\n    }\n\n    parseComponentValues(): CSSValue[] {\n        const values = [];\n        while (true) {\n            const value = this.consumeComponentValue();\n            if (value.type === TokenType.EOF_TOKEN) {\n                return values;\n            }\n            values.push(value);\n        }\n    }\n\n    private consumeComponentValue(): CSSValue {\n        const token = this.consumeToken();\n\n        switch (token.type) {\n            case TokenType.LEFT_CURLY_BRACKET_TOKEN:\n            case TokenType.LEFT_SQUARE_BRACKET_TOKEN:\n            case TokenType.LEFT_PARENTHESIS_TOKEN:\n                return this.consumeSimpleBlock(token.type);\n            case TokenType.FUNCTION_TOKEN:\n                return this.consumeFunction(token);\n        }\n\n        return token;\n    }\n\n    private consumeSimpleBlock(type: CSSBlockType): CSSBlock {\n        const block: CSSBlock = { type, values: [] };\n\n        let token = this.consumeToken();\n        while (true) {\n            if (token.type === TokenType.EOF_TOKEN || isEndingTokenFor(token, type)) {\n                return block;\n            }\n\n            this.reconsumeToken(token);\n            block.values.push(this.consumeComponentValue());\n            token = this.consumeToken();\n        }\n    }\n\n    private consumeFunction(functionToken: StringValueToken): CSSFunction {\n        const cssFunction: CSSFunction = {\n            name: functionToken.value,\n            values: [],\n            type: TokenType.FUNCTION\n        };\n\n        while (true) {\n            const token = this.consumeToken();\n            if (token.type === TokenType.EOF_TOKEN || token.type === TokenType.RIGHT_PARENTHESIS_TOKEN) {\n                return cssFunction;\n            }\n\n            this.reconsumeToken(token);\n            cssFunction.values.push(this.consumeComponentValue());\n        }\n    }\n\n    private consumeToken(): CSSToken {\n        const token = this._tokens.shift();\n        return typeof token === 'undefined' ? EOF_TOKEN : token;\n    }\n\n    private reconsumeToken(token: CSSToken): void {\n        this._tokens.unshift(token);\n    }\n}\n\nexport const isDimensionToken = (token: CSSValue): token is DimensionToken => token.type === TokenType.DIMENSION_TOKEN;\nexport const isNumberToken = (token: CSSValue): token is NumberValueToken => token.type === TokenType.NUMBER_TOKEN;\nexport const isIdentToken = (token: CSSValue): token is StringValueToken => token.type === TokenType.IDENT_TOKEN;\nexport const isStringToken = (token: CSSValue): token is StringValueToken => token.type === TokenType.STRING_TOKEN;\nexport const isIdentWithValue = (token: CSSValue, value: string): boolean =>\n    isIdentToken(token) && token.value === value;\n\nexport const nonWhiteSpace = (token: CSSValue): boolean => token.type !== TokenType.WHITESPACE_TOKEN;\nexport const nonFunctionArgSeparator = (token: CSSValue): boolean =>\n    token.type !== TokenType.WHITESPACE_TOKEN && token.type !== TokenType.COMMA_TOKEN;\n\nexport const parseFunctionArgs = (tokens: CSSValue[]): CSSValue[][] => {\n    const args: CSSValue[][] = [];\n    let arg: CSSValue[] = [];\n    tokens.forEach((token) => {\n        if (token.type === TokenType.COMMA_TOKEN) {\n            // Skip empty arguments (e.g. \"1px,,2px\") instead of throwing —\n            // real-world computed styles can produce them.\n            if (arg.length) {\n                args.push(arg);\n                arg = [];\n            }\n            return;\n        }\n\n        if (token.type !== TokenType.WHITESPACE_TOKEN) {\n            arg.push(token);\n        }\n    });\n    if (arg.length) {\n        args.push(arg);\n    }\n\n    return args;\n};\n\nconst isEndingTokenFor = (token: CSSToken, type: CSSBlockType): boolean => {\n    if (type === TokenType.LEFT_CURLY_BRACKET_TOKEN && token.type === TokenType.RIGHT_CURLY_BRACKET_TOKEN) {\n        return true;\n    }\n    if (type === TokenType.LEFT_SQUARE_BRACKET_TOKEN && token.type === TokenType.RIGHT_SQUARE_BRACKET_TOKEN) {\n        return true;\n    }\n\n    return type === TokenType.LEFT_PARENTHESIS_TOKEN && token.type === TokenType.RIGHT_PARENTHESIS_TOKEN;\n};\n","import { at } from '../../core/util';\n/**\n * Safe arithmetic expression evaluator — replaces `new Function()`.\n *\n * Supports only: numbers, +, -, *, /, parentheses.\n * Does NOT execute arbitrary code. Returns NaN on any illegal token.\n */\n\n// Regex that matches a token: number (int or float) | operator | parentheses\nconst ARITH_TOKEN_RE = /(\\d+(?:\\.\\d+)?|[+\\-*/()])/g;\n\nconst safeEvalArithmetic = (expr: string): number => {\n    const tokens = expr.match(ARITH_TOKEN_RE);\n    if (!tokens) {\n        return NaN;\n    }\n\n    // Shunting-yard algorithm: infix → postfix (RPN), then evaluate.\n    const output: (number | string)[] = [];\n    const ops: string[] = [];\n    const precedence: Record<string, number> = { '+': 1, '-': 1, '*': 2, '/': 2 };\n\n    for (const tok of tokens) {\n        if (/^\\d+(?:\\.\\d+)?$/.test(tok)) {\n            output.push(parseFloat(tok));\n        } else if (tok === '(') {\n            ops.push(tok);\n        } else if (tok === ')') {\n            while (ops.length && ops[ops.length - 1] !== '(') {\n                output.push(ops.pop()!);\n            }\n            if (!ops.length) return NaN; // mismatched parens\n            ops.pop(); // discard '('\n        } else {\n            // operator: + - * /\n            while (ops.length && (precedence[at(ops, ops.length - 1)] ?? 0) >= (precedence[tok] ?? 0)) {\n                output.push(ops.pop()!);\n            }\n            ops.push(tok);\n        }\n    }\n\n    while (ops.length) {\n        const op = ops.pop()!;\n        if (op === '(') return NaN; // mismatched parens\n        output.push(op);\n    }\n\n    // Evaluate RPN\n    const stack: number[] = [];\n    for (const item of output) {\n        if (typeof item === 'number') {\n            stack.push(item);\n        } else {\n            const b = stack.pop();\n            const a = stack.pop();\n            if (a === undefined || b === undefined) return NaN;\n            switch (item) {\n                case '+':\n                    stack.push(a + b);\n                    break;\n                case '-':\n                    stack.push(a - b);\n                    break;\n                case '*':\n                    stack.push(a * b);\n                    break;\n                case '/':\n                    stack.push(b === 0 ? NaN : a / b);\n                    break;\n                default:\n                    return NaN;\n            }\n        }\n    }\n\n    return stack.length === 1 ? (stack[0] ?? NaN) : NaN;\n};\n\nexport default safeEvalArithmetic;\n","/**\n * Color mathematics utilities\n * Extracted to break circular dependency between srgb.ts and color-utilities.ts\n */\n\n/**\n * Clamp a value between min and max\n */\nexport const clamp = (value: number, min: number, max: number): number => {\n    return Math.min(Math.max(value, min), max);\n};\n\n/** An RGB triple. */\nexport type RGB3 = [number, number, number];\n/** An RGBA color as separate components. */\nexport type RGBA4 = [number, number, number, number];\n/** A 3x3 matrix stored row-major as nine numbers. */\nexport type Matrix3x3 = [number, number, number, number, number, number, number, number, number];\n\n/**\n * Multiply two 3x3 matrices\n */\nexport const multiplyMatrices = (A: Matrix3x3, B: RGB3): RGB3 => {\n    return [\n        A[0] * B[0] + A[1] * B[1] + A[2] * B[2],\n        A[3] * B[0] + A[4] * B[1] + A[5] * B[2],\n        A[6] * B[0] + A[7] * B[1] + A[8] * B[2]\n    ];\n};\n","/**\n * SRGB related functions\n */\n\nimport { clamp, multiplyMatrices, RGB3, RGBA4 } from '../color-math';\n\n/**\n * Convert XYZ to linear-light sRGB\n *\n * @param xyz\n */\nexport const xyz2rgbLinear = (xyz: [number, number, number]): [number, number, number] => {\n    return multiplyMatrices(\n        [\n            3.2409699419045226, -1.537383177570094, -0.4986107602930034, -0.9692436362808796, 1.8759675015077202,\n            0.04155505740717559, 0.05563007969699366, -0.20397695888897652, 1.0569715142428786\n        ],\n        xyz\n    );\n};\n\n/**\n * Convert XYZ to linear-light sRGB\n *\n * @param xyz\n */\nexport const rgbLinear2xyz = (xyz: [number, number, number]): [number, number, number] => {\n    return multiplyMatrices(\n        [\n            0.41239079926595934, 0.357584339383878, 0.1804807884018343, 0.21263900587151027, 0.715168678767756,\n            0.07219231536073371, 0.01933081871559182, 0.11919477979462598, 0.9505321522496607\n        ],\n        xyz\n    );\n};\n\n/**\n * Convert sRGB to RGB\n *\n * @param rgb\n */\nexport const srgbLinear2rgb = (rgb: RGB3): RGB3 => {\n    const [r, g, b] = rgb;\n    const transfer = (c: number): number => {\n        const sign = c < 0 ? -1 : 1,\n            abs = Math.abs(c);\n\n        return abs > 0.0031308 ? sign * (1.055 * abs ** (1 / 2.4) - 0.055) : 12.92 * c;\n    };\n    return [transfer(r), transfer(g), transfer(b)];\n};\n\n/**\n * Convert RGB to sRGB\n *\n * @param rgb\n */\nexport const rgb2rgbLinear = (rgb: RGB3): RGB3 => {\n    const [r, g, b] = rgb;\n    const transfer = (c: number): number => {\n        const sign = c < 0 ? -1 : 1,\n            abs = Math.abs(c);\n\n        return abs <= 0.04045 ? c / 12.92 : sign * ((abs + 0.055) / 1.055) ** 2.4;\n    };\n    return [transfer(r), transfer(g), transfer(b)];\n};\n\n/**\n * XYZ to SRGB\n *\n * @param args\n */\nexport const srgbFromXYZ = (args: RGBA4): RGBA4 => {\n    const [r, g, b] = srgbLinear2rgb(xyz2rgbLinear([args[0], args[1], args[2]]));\n    return [r, g, b, args[3]];\n};\n\n/**\n * XYZ to SRGB-Linear\n * @param args\n */\nexport const srgbLinearFromXYZ = (args: RGBA4): RGBA4 => {\n    const [r, g, b] = xyz2rgbLinear([args[0], args[1], args[2]]);\n    return [\n        clamp(Math.round(r * 255), 0, 255),\n        clamp(Math.round(g * 255), 0, 255),\n        clamp(Math.round(b * 255), 0, 255),\n        args[3]\n    ];\n};\n","import { CSSValue } from '../syntax/parser';\nimport { DimensionToken, NumberValueToken, TokenType } from '../syntax/tokenizer';\n\nexport type Length = DimensionToken | NumberValueToken;\n\nexport const isLength = (token: CSSValue): token is Length =>\n    token.type === TokenType.NUMBER_TOKEN || token.type === TokenType.DIMENSION_TOKEN;\n","import { DimensionToken, FLAG_INTEGER, NumberValueToken, TokenType } from '../syntax/tokenizer';\nimport { at } from '../../core/util';\nimport { CSSValue, CSSFunction, isDimensionToken } from '../syntax/parser';\nimport { isLength } from './length';\nimport safeEvalArithmetic from './safe-eval';\n/**\n * Internal token representing a calc() expression that has both a percentage\n * component and a pixel offset. Created at parse time and resolved at render\n * time once the container size is known.\n *\n * Extends NumberValueToken so it is structurally assignable wherever\n * LengthPercentage (DimensionToken | NumberValueToken) is expected,\n * avoiding widespread type changes.\n */\nexport interface CalcWithPercentage extends NumberValueToken {\n    type: TokenType.NUMBER_TOKEN;\n    /** The percentage coefficient (extracted from the calc expression). */\n    _calcPercentage: number;\n    /** The pixel offset (extracted from the calc expression). */\n    _calcPixelOffset: number;\n}\n\nexport type LengthPercentage = DimensionToken | NumberValueToken;\nexport type LengthPercentageTuple = [LengthPercentage] | [LengthPercentage, LengthPercentage];\n\nexport const isLengthPercentage = (token: CSSValue): token is LengthPercentage =>\n    token.type === TokenType.PERCENTAGE_TOKEN || isLength(token) || isCalcWithPercentage(token);\n\n/**\n * Check if a token is a CalcWithPercentage deferred token.\n * Accepts CSSValue (structural duck-type check) for use in type guards.\n */\nexport const isCalcWithPercentage = (token: CSSValue): token is CalcWithPercentage =>\n    token.type === TokenType.NUMBER_TOKEN && (token as CalcWithPercentage)._calcPercentage !== undefined;\n\n/**\n * Check if a token is a calc() function\n */\nexport const isCalcFunction = (token: CSSValue): token is CSSFunction =>\n    token.type === TokenType.FUNCTION && token.name === 'calc';\n\n/**\n * Parse a calc() token and produce a LengthPercentage.\n *\n * Uses two-point evaluation to extract the percentage coefficient and pixel\n * offset from a calc() expression so it can be resolved later at render time\n * when the container size is known.\n *\n *   evaluate(0)   → pixelOffset\n *   evaluate(100) → percentage + pixelOffset   →  percentage = evaluate(100) - pixelOffset\n *\n * If the expression has no percentage component, returns a plain NUMBER_TOKEN\n * for backwards compatibility.\n */\nexport const parseCalcForLengthPercentage = (calcToken: CSSFunction): LengthPercentage | null => {\n    const withZero = evaluateCalcToLengthPercentage(calcToken, 0);\n    if (!withZero) return null;\n\n    const withHundred = evaluateCalcToLengthPercentage(calcToken, 100);\n    if (!withHundred) return null;\n\n    const pixelOffset = (withZero as NumberValueToken).number;\n    const percentage = (withHundred as NumberValueToken).number - pixelOffset;\n\n    // If there's no percentage component, return a plain NUMBER_TOKEN\n    if (percentage === 0) {\n        return withZero;\n    }\n\n    return {\n        type: TokenType.NUMBER_TOKEN,\n        number: pixelOffset,\n        flags: FLAG_INTEGER,\n        _calcPercentage: percentage,\n        _calcPixelOffset: pixelOffset\n    } as LengthPercentage;\n};\n\n/**\n * Convenience helper for parsing an optional calc() or length-percentage value.\n * Used by property descriptors that accept both calc() and regular length-percentage tokens.\n * Returns null if the value is neither a calc() function nor a length-percentage token.\n */\nexport const parseOptionalCalcOrLength = (value: CSSValue): LengthPercentage | null => {\n    if (isCalcFunction(value)) {\n        return parseCalcForLengthPercentage(value);\n    }\n    return isLengthPercentage(value) ? value : null;\n};\n\n/**\n * Evaluate a calc() expression and convert to LengthPercentage token\n * Supports basic arithmetic: +, -, *, /\n * Note: Percentages in calc() are converted based on a context value\n */\nexport const evaluateCalcToLengthPercentage = (calcToken: CSSFunction, contextValue = 0): LengthPercentage | null => {\n    // Build expression string from tokens\n    const buildExpression = (values: CSSValue[]): string | null => {\n        let expression = '';\n\n        for (const value of values) {\n            if (value.type === TokenType.WHITESPACE_TOKEN) {\n                continue;\n            }\n\n            if (value.type === TokenType.FUNCTION) {\n                if (value.name === 'calc') {\n                    const nested = buildExpression(value.values);\n                    if (nested === null) return null;\n                    expression += `(${nested})`;\n                } else {\n                    return null;\n                }\n            } else if (value.type === TokenType.NUMBER_TOKEN) {\n                expression += value.number.toString();\n            } else if (value.type === TokenType.DIMENSION_TOKEN) {\n                // Convert units to px\n                if (value.unit === 'px') {\n                    expression += value.number.toString();\n                } else if (value.unit === 'rem' || value.unit === 'em') {\n                    expression += (value.number * 16).toString();\n                } else {\n                    expression += value.number.toString();\n                }\n            } else if (value.type === TokenType.PERCENTAGE_TOKEN) {\n                // Convert percentage to absolute value based on context\n                expression += ((value.number / 100) * contextValue).toString();\n            } else if (value.type === TokenType.DELIM_TOKEN) {\n                const op = value.value;\n                if (op === '+' || op === '-' || op === '*' || op === '/') {\n                    expression += ` ${op} `;\n                } else if (op === '(') {\n                    expression += '(';\n                } else if (op === ')') {\n                    expression += ')';\n                }\n            }\n        }\n\n        return expression;\n    };\n\n    try {\n        const expression = buildExpression(calcToken.values);\n        if (expression === null || expression.trim() === '') {\n            return null;\n        }\n\n        // Evaluate the expression\n        // Uses safe arithmetic evaluator instead of new Function() for CodeQL\n        const result = safeEvalArithmetic(expression);\n\n        if (typeof result === 'number' && !isNaN(result)) {\n            // Return as a number token in px\n            return {\n                type: TokenType.NUMBER_TOKEN,\n                number: result,\n                flags: FLAG_INTEGER\n            };\n        }\n    } catch (e) {\n        return null;\n    }\n\n    return null;\n};\nexport const parseLengthPercentageTuple = (tokens: LengthPercentage[]): LengthPercentageTuple =>\n    tokens.length > 1 ? [at(tokens, 0), at(tokens, 1)] : [at(tokens, 0)];\nexport const ZERO_LENGTH: NumberValueToken = {\n    type: TokenType.NUMBER_TOKEN,\n    number: 0,\n    flags: FLAG_INTEGER\n};\n\nexport const FIFTY_PERCENT: NumberValueToken = {\n    type: TokenType.PERCENTAGE_TOKEN,\n    number: 50,\n    flags: FLAG_INTEGER\n};\n\nexport const HUNDRED_PERCENT: NumberValueToken = {\n    type: TokenType.PERCENTAGE_TOKEN,\n    number: 100,\n    flags: FLAG_INTEGER\n};\n\nexport const getAbsoluteValueForTuple = (\n    tuple: LengthPercentageTuple,\n    width: number,\n    height: number\n): [number, number] => {\n    const [x, y] = tuple;\n    return [getAbsoluteValue(x, width), getAbsoluteValue(typeof y !== 'undefined' ? y : x, height)];\n};\nexport const getAbsoluteValue = (token: LengthPercentage, parent: number): number => {\n    if (isCalcWithPercentage(token)) {\n        return (token._calcPercentage / 100) * parent + token._calcPixelOffset;\n    }\n\n    if (token.type === TokenType.PERCENTAGE_TOKEN) {\n        return (token.number / 100) * parent;\n    }\n\n    if (isDimensionToken(token)) {\n        switch (token.unit) {\n            case 'rem':\n            case 'em':\n                // NOTE: Assumes a 16px root font-size for rem/em units. A fully\n                // accurate implementation would require access to the element's\n                // computed font-size (em) or the root element's font-size (rem),\n                // which are not available in this pure-resolution function.\n                return 16 * token.number;\n            case 'px':\n            default:\n                return token.number;\n        }\n    }\n\n    return token.number;\n};\n","import { CSSValue, isIdentToken } from '../syntax/parser';\nimport { TokenType } from '../syntax/tokenizer';\nimport { ITypeDescriptor } from '../type-descriptor';\nimport { HUNDRED_PERCENT, ZERO_LENGTH } from './length-percentage';\nimport { GradientCorner } from './image';\nimport { Context } from '../../core/context';\n\nconst DEG = 'deg';\nconst GRAD = 'grad';\nconst RAD = 'rad';\nconst TURN = 'turn';\n\nexport const angle: ITypeDescriptor<number> = {\n    name: 'angle',\n    parse: (_context: Context, value: CSSValue): number => {\n        if (value.type === TokenType.DIMENSION_TOKEN) {\n            switch (value.unit) {\n                case DEG:\n                    return (Math.PI * value.number) / 180;\n                case GRAD:\n                    return (Math.PI / 200) * value.number;\n                case RAD:\n                    return value.number;\n                case TURN:\n                    return Math.PI * 2 * value.number;\n            }\n        }\n\n        throw new Error(`Unsupported angle type`);\n    }\n};\n\nexport const isAngle = (value: CSSValue): boolean => {\n    if (value.type === TokenType.DIMENSION_TOKEN) {\n        if (value.unit === DEG || value.unit === GRAD || value.unit === RAD || value.unit === TURN) {\n            return true;\n        }\n    }\n    return false;\n};\n\nexport const parseNamedSide = (tokens: CSSValue[]): number | GradientCorner => {\n    const sideOrCorner = tokens\n        .filter(isIdentToken)\n        .map((ident) => ident.value)\n        .join(' ');\n\n    switch (sideOrCorner) {\n        case 'to bottom right':\n        case 'to right bottom':\n        case 'left top':\n        case 'top left':\n            return [ZERO_LENGTH, ZERO_LENGTH];\n        case 'to top':\n        case 'bottom':\n            return deg(0);\n        case 'to bottom left':\n        case 'to left bottom':\n        case 'right top':\n        case 'top right':\n            return [ZERO_LENGTH, HUNDRED_PERCENT];\n        case 'to right':\n        case 'left':\n            return deg(90);\n        case 'to top left':\n        case 'to left top':\n        case 'right bottom':\n        case 'bottom right':\n            return [HUNDRED_PERCENT, HUNDRED_PERCENT];\n        case 'to bottom':\n        case 'top':\n            return deg(180);\n        case 'to top right':\n        case 'to right top':\n        case 'left bottom':\n        case 'bottom left':\n            return [HUNDRED_PERCENT, ZERO_LENGTH];\n        case 'to left':\n        case 'right':\n            return deg(270);\n    }\n\n    return 0;\n};\n\nexport const deg = (deg: number): number => (Math.PI * deg) / 180;\n","import { Context } from '../../core/context';\nimport { CSSValue, isDimensionToken, isNumberToken, nonFunctionArgSeparator } from '../syntax/parser';\nimport { rgb2rgbLinear, rgbLinear2xyz, srgbLinear2rgb, xyz2rgbLinear } from './color-spaces/srgb';\nimport { TokenType } from '../syntax/tokenizer';\nimport { angle, deg } from './angle';\nimport { getAbsoluteValue, isLengthPercentage } from './length-percentage';\nimport { clamp, multiplyMatrices, RGB3, RGBA4 } from './color-math';\nimport { at } from '../../core/util';\n\ntype Color = number;\n\nexport const isTransparent = (color: Color): boolean => (0xff & color) === 0;\n\nexport const asString = (color: Color): string => {\n    const alpha = 0xff & color;\n    const blue = 0xff & (color >> 8);\n    const green = 0xff & (color >> 16);\n    const red = 0xff & (color >> 24);\n    return alpha < 255 ? `rgba(${red},${green},${blue},${alpha / 255})` : `rgb(${red},${green},${blue})`;\n};\n\nexport const pack = (r: number, g: number, b: number, a: number): Color =>\n    ((r << 24) | (g << 16) | (b << 8) | (Math.round(a * 255) << 0)) >>> 0;\n\nexport const getTokenColorValue = (token: CSSValue, i: number): number => {\n    if (token.type === TokenType.NUMBER_TOKEN) {\n        return token.number;\n    }\n\n    if (token.type === TokenType.PERCENTAGE_TOKEN) {\n        const max = i === 3 ? 1 : 255;\n        return i === 3 ? (token.number / 100) * max : Math.round((token.number / 100) * max);\n    }\n\n    return 0;\n};\n\nexport const isRelativeTransform = (tokens: CSSValue[]): boolean => {\n    const first = tokens[0];\n    return (first && first.type === TokenType.IDENT_TOKEN ? first.value : 'unknown') === 'from';\n};\n\n// Re-export from color-math to maintain backward compatibility\nexport { clamp, multiplyMatrices };\n\nexport const packSrgb = (args: RGBA4): number => {\n    return pack(\n        clamp(Math.round(args[0] * 255), 0, 255),\n        clamp(Math.round(args[1] * 255), 0, 255),\n        clamp(Math.round(args[2] * 255), 0, 255),\n        clamp(args[3], 0, 1)\n    );\n};\n\nexport const packSrgbLinear = (args: RGBA4): number => {\n    const [r, g, b, a] = args;\n    const rgb = srgbLinear2rgb([r, g, b]);\n    return pack(\n        clamp(Math.round(rgb[0] * 255), 0, 255),\n        clamp(Math.round(rgb[1] * 255), 0, 255),\n        clamp(Math.round(rgb[2] * 255), 0, 255),\n        a\n    );\n};\n\nexport const packXYZ = (args: RGBA4): number => {\n    const srgb_linear = xyz2rgbLinear([args[0], args[1], args[2]]);\n    return packSrgbLinear([srgb_linear[0], srgb_linear[1], srgb_linear[2], args[3]]);\n};\n\nexport const packLab = (_context: Context, args: CSSValue[]): number => {\n    if (isRelativeTransform(args.filter(nonFunctionArgSeparator))) {\n        throw new Error('Relative color not supported for lab()');\n    }\n    const [extractedL, a, b, alpha] = extractLabComponents(args),\n        // lab() lightness is on a 0..100 scale in BOTH number and percentage\n        // form (unlike oklab's 0..1); extractLabComponents normalizes\n        // percentages to oklab's scale, so rescale when the source token was\n        // a percentage.\n        l = isPercentageLightness(args) ? extractedL * 100 : extractedL,\n        rgb = srgbLinear2rgb(xyz2rgbLinear(lab2xyz([l, a, b])));\n\n    return pack(\n        clamp(Math.round(rgb[0] * 255), 0, 255),\n        clamp(Math.round(rgb[1] * 255), 0, 255),\n        clamp(Math.round(rgb[2] * 255), 0, 255),\n        alpha\n    );\n};\n\nconst isPercentageLightness = (args: CSSValue[]): boolean => {\n    const t0 = args.filter(nonFunctionArgSeparator)[0];\n    return t0 !== undefined && t0.type === TokenType.PERCENTAGE_TOKEN;\n};\n\nexport const packOkLab = (_context: Context, args: CSSValue[]): number => {\n    if (isRelativeTransform(args.filter(nonFunctionArgSeparator))) {\n        throw new Error('Relative color not supported for oklab()');\n    }\n    const [l, a, b, alpha] = extractLabComponents(args),\n        rgb = srgbLinear2rgb(xyz2rgbLinear(oklab2xyz([l, a, b])));\n\n    return pack(\n        clamp(Math.round(rgb[0] * 255), 0, 255),\n        clamp(Math.round(rgb[1] * 255), 0, 255),\n        clamp(Math.round(rgb[2] * 255), 0, 255),\n        alpha\n    );\n};\n\nexport const packOkLch = (_context: Context, args: CSSValue[]): number => {\n    if (isRelativeTransform(args.filter(nonFunctionArgSeparator))) {\n        throw new Error('Relative color not supported for oklch()');\n    }\n    const [l, c, h, alpha] = extractOkLchComponents(args),\n        rgb = srgbLinear2rgb(xyz2rgbLinear(oklab2xyz(lch2lab([l, c, h]))));\n\n    return pack(\n        clamp(Math.round(rgb[0] * 255), 0, 255),\n        clamp(Math.round(rgb[1] * 255), 0, 255),\n        clamp(Math.round(rgb[2] * 255), 0, 255),\n        alpha\n    );\n};\n\nexport const packLch = (_context: Context, args: CSSValue[]): number => {\n    if (isRelativeTransform(args.filter(nonFunctionArgSeparator))) {\n        throw new Error('Relative color not supported for lch()');\n    }\n    const [l, c, h, a] = extractLchComponents(args),\n        rgb = srgbLinear2rgb(xyz2rgbLinear(lab2xyz(lch2lab([l, c, h]))));\n\n    return pack(\n        clamp(Math.round(rgb[0] * 255), 0, 255),\n        clamp(Math.round(rgb[1] * 255), 0, 255),\n        clamp(Math.round(rgb[2] * 255), 0, 255),\n        a\n    );\n};\n\nexport const extractHslComponents = (context: Context, args: CSSValue[]): RGBA4 => {\n    const tokens = args.filter(nonFunctionArgSeparator),\n        hue = tokens[0],\n        saturation = tokens[1],\n        lightness = tokens[2],\n        // hsl() accepts both the legacy comma syntax (alpha at index 3) and\n        // the modern space/slash syntax (alpha at index 4, after the `/`).\n        slash = tokens[3],\n        alpha =\n            slash !== undefined && slash.type === TokenType.DELIM_TOKEN && slash.value === '/' ? tokens[4] : tokens[3],\n        h = hue\n            ? (hue.type === TokenType.NUMBER_TOKEN ? deg(hue.number) : angle.parse(context, hue)) / (Math.PI * 2)\n            : 0,\n        s = saturation !== undefined && isLengthPercentage(saturation) ? saturation.number / 100 : 0,\n        l = lightness !== undefined && isLengthPercentage(lightness) ? lightness.number / 100 : 0,\n        a = alpha !== undefined && isLengthPercentage(alpha) ? getAbsoluteValue(alpha, 1) : 1;\n    return [h, s, l, a];\n};\n\nexport const packHSL = (context: Context, args: CSSValue[]): number => {\n    if (isRelativeTransform(args)) {\n        throw new Error('Relative color not supported for hsl()');\n    }\n    const [h, s, l, a] = extractHslComponents(context, args),\n        rgb = hsl2rgb([h, s, l]);\n    return pack(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255, a);\n};\n\nexport const extractLchComponents = (args: CSSValue[]): RGBA4 => {\n    const tokens = args.filter(nonFunctionArgSeparator),\n        t0 = tokens[0],\n        t1 = tokens[1],\n        t2 = tokens[2],\n        t4 = tokens[4],\n        l = t0 !== undefined && isLengthPercentage(t0) ? t0.number : 0,\n        c = t1 !== undefined && isLengthPercentage(t1) ? t1.number : 0,\n        h = t2 !== undefined && (isNumberToken(t2) || isDimensionToken(t2)) ? t2.number : 0,\n        a = t4 !== undefined && isLengthPercentage(t4) ? getAbsoluteValue(t4, 1) : 1;\n\n    return [l, c, h, a];\n};\n\nexport const extractLabComponents = (args: CSSValue[]): RGBA4 => {\n    const tokens = args.filter(nonFunctionArgSeparator),\n        t0 = tokens[0],\n        t1 = tokens[1],\n        t2 = tokens[2],\n        t4 = tokens[4],\n        l =\n            t0 !== undefined\n                ? t0.type === TokenType.PERCENTAGE_TOKEN\n                    ? t0.number / 100\n                    : isNumberToken(t0)\n                      ? t0.number\n                      : 0\n                : 0,\n        a =\n            t1 !== undefined\n                ? t1.type === TokenType.PERCENTAGE_TOKEN\n                    ? t1.number / 100\n                    : isNumberToken(t1)\n                      ? t1.number\n                      : 0\n                : 0,\n        b = t2 !== undefined && (isNumberToken(t2) || isDimensionToken(t2)) ? t2.number : 0,\n        alpha = t4 !== undefined && isLengthPercentage(t4) ? getAbsoluteValue(t4, 1) : 1;\n\n    return [l, a, b, alpha];\n};\n\nexport const extractOkLchComponents = (args: CSSValue[]): RGBA4 => {\n    const tokens = args.filter(nonFunctionArgSeparator),\n        t0 = tokens[0],\n        t1 = tokens[1],\n        t2 = tokens[2],\n        t4 = tokens[4],\n        l =\n            t0 !== undefined\n                ? t0.type === TokenType.PERCENTAGE_TOKEN\n                    ? t0.number / 100\n                    : isNumberToken(t0)\n                      ? t0.number\n                      : 0\n                : 0,\n        c =\n            t1 !== undefined\n                ? t1.type === TokenType.PERCENTAGE_TOKEN\n                    ? t1.number / 100\n                    : isNumberToken(t1)\n                      ? t1.number\n                      : 0\n                : 0,\n        h = t2 !== undefined && (isNumberToken(t2) || isDimensionToken(t2)) ? t2.number : 0,\n        a = t4 !== undefined && isLengthPercentage(t4) ? getAbsoluteValue(t4, 1) : 1;\n\n    return [l, c, h, a];\n};\n\n/**\n * Convert D65 to D50\n *\n * @param xyz\n */\nexport const d65toD50 = (xyz: [number, number, number]): [number, number, number] => {\n    return multiplyMatrices(\n        [\n            1.0479297925449969, 0.022946870601609652, -0.05019226628920524, 0.02962780877005599, 0.9904344267538799,\n            -0.017073799063418826, -0.009243040646204504, 0.015055191490298152, 0.7518742814281371\n        ],\n        xyz\n    );\n};\n\n/**\n * Convert D50 to D65\n *\n * @param xyz\n */\nexport const d50toD65 = (xyz: [number, number, number]): [number, number, number] => {\n    return multiplyMatrices(\n        [\n            0.955473421488075, -0.02309845494876471, 0.06325924320057072, -0.0283697093338637, 1.0099953980813041,\n            0.021041441191917323, 0.012314014864481998, -0.020507649298898964, 1.330365926242124\n        ],\n        xyz\n    );\n};\n\nexport const hue2rgb = (t1: number, t2: number, hue: number): number => {\n    if (hue < 0) {\n        hue += 1;\n    }\n    if (hue >= 1) {\n        hue -= 1;\n    }\n\n    if (hue < 1 / 6) {\n        return (t2 - t1) * hue * 6 + t1;\n    } else if (hue < 1 / 2) {\n        return t2;\n    } else if (hue < 2 / 3) {\n        return (t2 - t1) * 6 * (2 / 3 - hue) + t1;\n    } else {\n        return t1;\n    }\n};\n\nexport const hsl2rgb = ([h, s, l]: [number, number, number]): [number, number, number] => {\n    // Achromatic: return the 0..1 grey like every other branch — callers\n    // scale by 255. (Returning l*255 here double-scaled the channels.)\n    if (s === 0) {\n        return [l, l, l];\n    }\n    const t2 = l <= 0.5 ? l * (s + 1) : l + s - l * s,\n        t1 = l * 2 - t2,\n        r = hue2rgb(t1, t2, h + 1 / 3),\n        g = hue2rgb(t1, t2, h),\n        b = hue2rgb(t1, t2, h - 1 / 3);\n\n    return [r, g, b];\n};\n\n/**\n * Convert lch to OKLab\n *\n * @param l\n * @param c\n * @param h\n */\nexport const lch2lab = ([l, c, h]: [number, number, number]): [number, number, number] => {\n    if (c < 0) {\n        c = 0;\n    }\n    if (isNaN(h)) {\n        h = 0;\n    }\n    return [l, c * Math.cos((h * Math.PI) / 180), c * Math.sin((h * Math.PI) / 180)];\n};\n\n/**\n * Convert OKLab to XYZ relative to D65\n *\n * @param lab\n */\nexport const oklab2xyz = (lab: [number, number, number]): [number, number, number] => {\n    const LMSg = multiplyMatrices(\n            [\n                1, 0.3963377773761749, 0.2158037573099136, 1, -0.1055613458156586, -0.0638541728258133, 1,\n                -0.0894841775298119, -1.2914855480194092\n            ],\n            lab\n        ),\n        LMS: RGB3 = [LMSg[0] ** 3, LMSg[1] ** 3, LMSg[2] ** 3];\n\n    return multiplyMatrices(\n        [\n            1.2268798758459243, -0.5578149944602171, 0.2813910456659647, -0.0405757452148008, 1.112286803280317,\n            -0.0717110580655164, -0.0763729366746601, -0.4214933324022432, 1.5869240198367816\n        ],\n        LMS\n    );\n};\n\n/**\n * Convert Lab to D50-adapted XYZ\n *\n * @param lab\n */\nexport const lab2xyz = (lab: [number, number, number]): [number, number, number] => {\n    const fy = (lab[0] + 16) / 116,\n        fx = lab[1] / 500 + fy,\n        fz = fy - lab[2] / 200,\n        k = 24389 / 27,\n        e = 24 / 116,\n        xyz: RGB3 = [\n            ((fx > e ? fx ** 3 : (116 * fx - 16) / k) * 0.3457) / 0.3585,\n            lab[0] > 8 ? fy ** 3 : lab[0] / k,\n            ((fz > e ? fz ** 3 : (116 * fz - 16) / k) * (1.0 - 0.3457 - 0.3585)) / 0.3585\n        ];\n\n    return d50toD65([xyz[0], xyz[1], xyz[2]]);\n};\n\n/**\n * Convert RGB to XYZ\n *\n * @param _context\n * @param args\n */\nexport const rgbToXyz = (_context: Context, args: CSSValue[]): [number, number, number, number] => {\n    const tokens = args.filter(nonFunctionArgSeparator);\n\n    if (tokens.length === 3 || tokens.length === 4) {\n        const r = getTokenColorValue(at(tokens, 0), 0),\n            g = getTokenColorValue(at(tokens, 1), 1),\n            b = getTokenColorValue(at(tokens, 2), 2),\n            a = tokens.length === 4 ? getTokenColorValue(at(tokens, 3), 3) : 1,\n            rgb_linear = rgb2rgbLinear([r / 255, g / 255, b / 255]),\n            [x, y, z] = rgbLinear2xyz([rgb_linear[0], rgb_linear[1], rgb_linear[2]]);\n        return [x, y, z, a];\n    }\n\n    return [0, 0, 0, 1];\n};\n\n/**\n * HSL to XYZ\n *\n * @param context\n * @param args\n */\nexport const hslToXyz = (context: Context, args: CSSValue[]): [number, number, number, number] => {\n    const [h, s, l, a] = extractHslComponents(context, args),\n        rgb_linear = rgb2rgbLinear(hsl2rgb([h, s, l])),\n        [x, y, z] = rgbLinear2xyz([rgb_linear[0], rgb_linear[1], rgb_linear[2]]);\n\n    return [x, y, z, a];\n};\n\n/**\n * LAB to XYZ\n *\n * @param _context\n * @param args\n */\nexport const labToXyz = (_context: Context, args: CSSValue[]): [number, number, number, number] => {\n    const [l, a, b, alpha] = extractLabComponents(args),\n        [x, y, z] = lab2xyz([l, a, b]);\n    return [x, y, z, alpha];\n};\n\n/**\n * LCH to XYZ\n *\n * @param _context\n * @param args\n */\nexport const lchToXyz = (_context: Context, args: CSSValue[]): [number, number, number, number] => {\n    const [l, c, h, alpha] = extractLchComponents(args),\n        [x, y, z] = lab2xyz(lch2lab([l, c, h]));\n    return [x, y, z, alpha];\n};\n\n/**\n * OKLch to XYZ\n *\n * @param _context\n * @param args\n */\nexport const oklchToXyz = (_context: Context, args: CSSValue[]): [number, number, number, number] => {\n    const [l, c, h, alpha] = extractOkLchComponents(args),\n        [x, y, z] = oklab2xyz(lch2lab([l, c, h]));\n    return [x, y, z, alpha];\n};\n\n/**\n * OKLab to XYZ\n *\n * @param _context\n * @param args\n */\nexport const oklabToXyz = (_context: Context, args: CSSValue[]): [number, number, number, number] => {\n    const [l, c, h, alpha] = extractLabComponents(args),\n        [x, y, z] = oklab2xyz([l, c, h]);\n    return [x, y, z, alpha];\n};\n\n/**\n * XYZ-50 to XYZ\n *\n * @param args\n */\nexport const xyz50ToXYZ = (args: RGBA4 | RGB3): RGB3 => {\n    return d50toD65([args[0], args[1], args[2]]);\n};\n\n/**\n * Does nothing, required for SUPPORTED_COLOR_SPACES_FROM_XYZ in the _color() function\n *\n * @param args\n */\nexport const xyzFromXYZ = (args: [number, number, number, number]): [number, number, number, number] => {\n    return args;\n};\n\n/**\n * XYZ-65 to XYZ-50\n *\n * @param args\n */\nexport const xyz50FromXYZ = (args: [number, number, number, number]): [number, number, number, number] => {\n    const [x, y, z] = d65toD50([args[0], args[2], args[3]]);\n    return [x, y, z, args[3]];\n};\n\n/**\n * Convert XYZ to SRGB and Pack\n *\n * @param args\n */\nexport const convertXyz = (args: RGBA4): number => {\n    return packXYZ([args[0], args[1], args[2], args[3]]);\n};\n\n/**\n * Convert XYZ-50 to SRGB and Pack\n *\n * @param args\n */\nexport const convertXyz50 = (args: RGBA4): number => {\n    const xyz = xyz50ToXYZ([args[0], args[1], args[2]]);\n    return packXYZ([xyz[0], xyz[1], xyz[2], args[3]]);\n};\n","/**\n * Display-P3 related functions\n */\n\nimport { srgbLinear2rgb } from './srgb';\nimport { RGB3, RGBA4 } from '../color-math';\nimport { multiplyMatrices, packXYZ } from '../color-utilities';\n\n/**\n * Convert P3 Linear to xyz\n *\n * @param p3l\n */\nexport const p3LinearToXyz = (p3l: [number, number, number]): [number, number, number] => {\n    return multiplyMatrices(\n        [\n            0.4865709486482162, 0.26566769316909306, 0.1982172852343625, 0.2289745640697488, 0.6917385218365064,\n            0.079286914093745, 0.0, 0.04511338185890264, 1.043944368900976\n        ],\n        p3l\n    );\n};\n/**\n * Convert XYZ to P3 Linear\n *\n * @param xyz\n */\nexport const xyzToP3Linear = (xyz: [number, number, number]): [number, number, number] => {\n    return multiplyMatrices(\n        [\n            2.493496911941425, -0.9313836179191239, -0.40271078445071684, -0.8294889695615747, 1.7626640603183463,\n            0.023624685841943577, 0.03584583024378447, -0.07617238926804182, 0.9568845240076872\n        ],\n        xyz\n    );\n};\n\n/**\n * Convert P3 to P3 linear\n *\n * @param p3\n */\nexport const p32p3Linear = (p3: RGB3): RGB3 => {\n    const transfer = (c: number): number => {\n        const sign = c < 0 ? -1 : 1,\n            abs = c * sign;\n\n        if (abs <= 0.04045) {\n            return c / 12.92;\n        }\n\n        return sign * ((c + 0.055) / 1.055) ** 2.4 || 0;\n    };\n    return [transfer(p3[0]), transfer(p3[1]), transfer(p3[2])];\n};\n\n/**\n * Convert P3 Linear to P3\n *\n * @param p3l\n */\nexport const p3Linear2p3 = (p3l: RGB3): RGB3 => {\n    return srgbLinear2rgb(p3l);\n};\n\n/**\n * Convert P3 to XYZ\n *\n * @param args\n */\nexport const p3ToXYZ = (args: RGB3): RGB3 => {\n    const p3_linear = p32p3Linear([args[0], args[1], args[2]]);\n    return p3LinearToXyz([p3_linear[0], p3_linear[1], p3_linear[2]]);\n};\n\n/**\n * Convert XYZ to P3\n *\n * @param args\n */\nexport const p3FromXYZ = (args: [number, number, number, number]): [number, number, number, number] => {\n    const [r, g, b] = p3Linear2p3(xyzToP3Linear([args[0], args[1], args[2]]));\n    return [r, g, b, args[3]];\n};\n\n/**\n * Convert P3 to SRGB and Pack\n *\n * @param args\n */\nexport const convertP3 = (args: RGBA4): number => {\n    const xyz = p3ToXYZ([args[0], args[1], args[2]]);\n    return packXYZ([xyz[0], xyz[1], xyz[2], args[3]]);\n};\n","/**\n * A98-RGB related functions\n */\n\nimport { multiplyMatrices, packSrgbLinear } from '../color-utilities';\nimport { RGBA4 } from '../color-math';\nimport { xyz2rgbLinear } from './srgb';\n\n/**\n * Convert XYZ to a98 linear\n *\n * @param xyz\n */\nexport const xyz2a98Linear = (xyz: [number, number, number]): [number, number, number] => {\n    return multiplyMatrices(\n        [\n            2.0415879038107465, -0.5650069742788596, -0.34473135077832956, -0.9692436362808795, 1.8759675015077202,\n            0.04155505740717557, 0.013444280632031142, -0.11836239223101838, 1.0151749943912054\n        ],\n        xyz\n    );\n};\n\n/**\n * Convert XYZ to a98 linear\n *\n * @param a98\n */\nexport const a98Linear2xyz = (a98: [number, number, number]): [number, number, number] => {\n    return multiplyMatrices(\n        [\n            0.5766690429101305, 0.1855582379065463, 0.1882286462349947, 0.29734497525053605, 0.6273635662554661,\n            0.0752914584939978, 0.02703136138641234, 0.07068885253582723, 0.9913375368376388\n        ],\n        a98\n    );\n};\n\n/**\n * Convert A98 RGB to rgb linear\n *\n * @param rgb\n */\nexport const a982a98Linear = (rgb: [number, number, number]): [number, number, number] => {\n    const mapped = rgb.map((c: number) => {\n        const sign = c < 0 ? -1 : 1,\n            abs = Math.abs(c);\n        return sign * abs ** (563 / 256);\n    });\n\n    return [mapped[0] ?? 0, mapped[1] ?? 0, mapped[2] ?? 0];\n};\n\n/**\n * Convert A98 RGB Linear to A98\n *\n * @param rgb\n */\nexport const a98Linear2a98 = (rgb: [number, number, number]): [number, number, number] => {\n    const mapped = rgb.map((c: number) => {\n        const sign = c < 0 ? -1 : 1,\n            abs = Math.abs(c);\n        return sign * abs ** (256 / 563);\n    });\n\n    return [mapped[0] ?? 0, mapped[1] ?? 0, mapped[2] ?? 0];\n};\n\n/**\n * Convert XYZ to A98\n *\n * @param args\n */\nexport const a98FromXYZ = (args: [number, number, number, number]): [number, number, number, number] => {\n    const [r, g, b] = a98Linear2a98(xyz2a98Linear([args[0], args[1], args[2]]));\n    return [r, g, b, args[3]];\n};\n\n/**\n * Convert A98 to XYZ and Pack\n *\n * @param args\n */\nexport const convertA98rgb = (args: RGBA4): number => {\n    const srgb_linear = xyz2rgbLinear(a98Linear2xyz(a982a98Linear([args[0], args[1], args[2]])));\n    return packSrgbLinear([srgb_linear[0], srgb_linear[1], srgb_linear[2], args[3]]);\n};\n","/**\n * Pro Photo related functions\n */\n\nimport { d50toD65, d65toD50, multiplyMatrices, packXYZ } from '../color-utilities';\nimport { RGB3, RGBA4 } from '../color-math';\n\n/**\n * Convert linear-light display-p3 to XYZ D65\n *\n * @param p3\n */\nexport const proPhotoLinearToXyz = (p3: [number, number, number]): [number, number, number] => {\n    return multiplyMatrices(\n        [\n            0.7977666449006423, 0.13518129740053308, 0.0313477341283922, 0.2880748288194013, 0.711835234241873,\n            0.00008993693872564, 0.0, 0.0, 0.8251046025104602\n        ],\n        p3\n    );\n};\n\n/**\n * Convert XYZ D65 to linear-light display-p3\n *\n * @param xyz\n */\nexport const xyzToProPhotoLinear = (xyz: [number, number, number]): [number, number, number] => {\n    return multiplyMatrices(\n        [\n            1.3457868816471583, -0.25557208737979464, -0.05110186497554526, -0.5446307051249019, 1.5082477428451468,\n            0.02052744743642139, 0.0, 0.0, 1.2119675456389452\n        ],\n        xyz\n    );\n};\n\n/**\n * Convert Pro-Photo to Pro-Photo Linear\n *\n * @param p3\n */\nexport const proPhotoToProPhotoLinear = (p3: RGB3): RGB3 => {\n    const [p30, p31, p32] = p3;\n    const transfer = (c: number): number => {\n        return c < 16 / 512 ? c / 16 : c ** 1.8;\n    };\n    return [transfer(p30), transfer(p31), transfer(p32)];\n};\n\n/**\n * Convert Pro-Photo Linear to Pro-Photo\n *\n * @param p3\n */\nexport const proPhotoLinearToProPhoto = (p3: RGB3): RGB3 => {\n    const [p30, p31, p32] = p3;\n    const transfer = (c: number): number => {\n        return c > 1 / 512 ? c ** (1 / 1.8) : c * 16;\n    };\n    return [transfer(p30), transfer(p31), transfer(p32)];\n};\n\n/**\n * Convert Pro-Photo to XYZ\n *\n * @param args\n */\nexport const proPhotoToXYZ = (args: RGB3): RGB3 => {\n    const prophoto_linear = proPhotoToProPhotoLinear([args[0], args[1], args[2]]);\n    return d50toD65(proPhotoLinearToXyz([prophoto_linear[0], prophoto_linear[1], prophoto_linear[2]]));\n};\n\n/**\n * Convert XYZ to Pro-Photo\n *\n * @param args\n */\nexport const proPhotoFromXYZ = (args: [number, number, number, number]): [number, number, number, number] => {\n    const [r, g, b] = proPhotoLinearToProPhoto(xyzToProPhotoLinear(d65toD50([args[0], args[1], args[2]])));\n    return [r, g, b, args[3]];\n};\n\n/**\n * Convert Pro-Photo to XYZ and Pack\n *\n * @param args\n */\nexport const convertProPhoto = (args: RGBA4): number => {\n    const xyz = proPhotoToXYZ([args[0], args[1], args[2]]);\n    return packXYZ([xyz[0], xyz[1], xyz[2], args[3]]);\n};\n","/**\n * REC2020 related functions\n */\n\nimport { multiplyMatrices, packXYZ } from '../color-utilities';\nimport { RGB3, RGBA4 } from '../color-math';\n\nconst _a = 1.09929682680944;\nconst _b = 0.018053968510807;\n\n/**\n * Convert rec2020 to rec2020 linear\n *\n * @param rgb\n */\nexport const rec20202rec2020Linear = (rgb: RGB3): RGB3 => {\n    const transfer = (c: number): number => (c < _b * 4.5 ? c / 4.5 : Math.pow((c + _a - 1) / _a, 1 / 0.45));\n    return [transfer(rgb[0]), transfer(rgb[1]), transfer(rgb[2])];\n};\n\n/**\n * Convert rec2020 linear to rec2020\n *\n * @param rgb\n */\nexport const rec2020Linear2rec2020 = (rgb: RGB3): RGB3 => {\n    const transfer = (c: number): number => (c >= _b ? _a * Math.pow(c, 0.45) - (_a - 1) : 4.5 * c);\n    return [transfer(rgb[0]), transfer(rgb[1]), transfer(rgb[2])];\n};\n\n/**\n * Convert rec2020 linear to XYZ D65\n *\n * @param rec\n */\nexport const rec2020LinearToXyz = (rec: [number, number, number]): [number, number, number] => {\n    return multiplyMatrices(\n        [\n            0.6369580483012914, 0.14461690358620832, 0.1688809751641721, 0.2627002120112671, 0.6779980715188708,\n            0.05930171646986196, 0.0, 0.028072693049087428, 1.060985057710791\n        ],\n        rec\n    );\n};\n\n/**\n * Convert XYZ D65 to rec2020 linear\n *\n * @param xyz\n */\nexport const xyzToRec2020Linear = (xyz: [number, number, number]): [number, number, number] => {\n    return multiplyMatrices(\n        [\n            1.716651187971268, -0.355670783776392, -0.25336628137366, -0.666684351832489, 1.616481236634939,\n            0.0157685458139111, 0.017639857445311, -0.042770613257809, 0.942103121235474\n        ],\n        xyz\n    );\n};\n\n/**\n * Convert Rec2020 to XYZ\n *\n * @param args\n */\nexport const rec2020ToXYZ = (args: RGB3): RGB3 => {\n    const rec2020_linear = rec20202rec2020Linear([args[0], args[1], args[2]]);\n    return rec2020LinearToXyz([rec2020_linear[0], rec2020_linear[1], rec2020_linear[2]]);\n};\n\n/**\n * Convert XYZ to Rec2020\n *\n * @param args\n */\nexport const rec2020FromXYZ = (args: [number, number, number, number]): [number, number, number, number] => {\n    const [r, g, b] = rec2020Linear2rec2020(xyzToRec2020Linear([args[0], args[1], args[2]]));\n    return [r, g, b, args[3]];\n};\n\n/**\n * Convert Rec2020 to SRGB and Pack\n *\n * @param args\n */\nexport const convertRec2020 = (args: RGBA4): number => {\n    const xyz = rec2020ToXYZ([args[0], args[1], args[2]]);\n    return packXYZ([xyz[0], xyz[1], xyz[2], args[3]]);\n};\n","import { Color, TRANSPARENT_COLOR, color as colorType } from '../color';\nimport { Context } from '../../../core/context';\nimport { CSSValue, isIdentToken } from '../../syntax/parser';\nimport { TokenType } from '../../syntax/tokenizer';\nimport { at } from '../../../core/util';\nimport { Matrix3x3, multiplyMatrices, RGB3, RGBA4 } from '../color-math';\nimport {\n    d50toD65,\n    d65toD50,\n    hsl2rgb,\n    lab2xyz,\n    lch2lab,\n    oklab2xyz,\n    packSrgb,\n    packSrgbLinear,\n    packXYZ\n} from '../color-utilities';\nimport { rgbLinear2xyz, rgb2rgbLinear, srgbLinear2rgb, xyz2rgbLinear } from '../color-spaces/srgb';\n\n/**\n * CSS Color 5 `color-mix(in <space>, <color> <percentage>?, <color> <percentage>?).\n *\n * Modern browsers resolve color-mix() at computed-value time into `color(...)` /\n * `lab()` / `oklab()` forms, which the existing color parser already handles —\n * this parser covers option overrides and engines that keep the raw function.\n *\n * Interpolation follows css-color-4 §12: coordinates are premultiplied by\n * alpha, mixed in the requested space, then un-premultiplied; polar spaces\n * (hsl, lch, oklch) interpolate the hue angle separately with the named hue\n * method (default `shorter`). Unsupported forms degrade to transparent instead\n * of throwing so a single exotic declaration cannot fail the whole capture.\n */\n\ntype SpaceName = 'srgb' | 'srgb-linear' | 'lab' | 'oklab' | 'lch' | 'oklch' | 'hsl' | 'xyz' | 'xyz-d50' | 'xyz-d65';\n\ntype HueMethod = 'shorter' | 'longer' | 'increasing' | 'decreasing';\n\nconst HUE_DEG_INDEX: Partial<Record<SpaceName, number>> = { lch: 2, oklch: 2, hsl: 0 };\n\n// Forward matrices from color-utilities' oklab2xyz, inverted numerically so\n// the round-trip stays exact even if the constants are ever updated.\nconst XYZ_FROM_LMS: Matrix3x3 = [\n    1.2268798758459243, -0.5578149944602171, 0.2813910456659647, -0.0405757452148008, 1.112286803280317,\n    -0.0717110580655164, -0.0763729366746601, -0.4214933324022432, 1.5869240198367816\n];\nconst LMS_FROM_OKLAB: Matrix3x3 = [\n    1, 0.3963377773761749, 0.2158037573099136, 1, -0.1055613458156586, -0.0638541728258133, 1, -0.0894841775298119,\n    -1.2914855480194092\n];\n\nconst matrix3Inverse = (m: Matrix3x3): Matrix3x3 => {\n    const a = m[0],\n        b = m[1],\n        c = m[2],\n        d = m[3],\n        e = m[4],\n        f = m[5],\n        g = m[6],\n        h = m[7],\n        i = m[8];\n    const det = a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g);\n    return [\n        (e * i - f * h) / det,\n        (c * h - b * i) / det,\n        (b * f - c * e) / det,\n        (f * g - d * i) / det,\n        (a * i - c * g) / det,\n        (c * d - a * f) / det,\n        (d * h - e * g) / det,\n        (b * g - a * h) / det,\n        (a * e - b * d) / det\n    ];\n};\n\nconst XYZ_TO_LMS = matrix3Inverse(XYZ_FROM_LMS);\nconst OKLAB_FROM_LMS = matrix3Inverse(LMS_FROM_OKLAB);\n\n// CIE Lab constants (mirroring color-utilities' lab2xyz, which outputs D65 XYZ\n// after adapting from D50).\nconst LAB_K = 24389 / 27;\nconst LAB_E = 24 / 116;\nconst LAB_E3 = LAB_E * LAB_E * LAB_E;\nconst LAB_X_SCALE = 0.3457 / 0.3585;\nconst LAB_Z_SCALE = (1 - 0.3457 - 0.3585) / 0.3585;\n\nconst unpackSrgb = (color: Color): RGB3 => [\n    (0xff & (color >> 24)) / 255,\n    (0xff & (color >> 16)) / 255,\n    (0xff & (color >> 8)) / 255\n];\n\n/** Inverse of color-utilities' lab2xyz: D65 XYZ → CIE Lab (0..100 scale). */\nexport const xyzD65ToLab = (xyz: RGB3): RGB3 => {\n    const [x50, y50, z50] = d65toD50([xyz[0], xyz[1], xyz[2]]);\n    const xi = x50 / LAB_X_SCALE;\n    const yi = y50;\n    const zi = z50 / LAB_Z_SCALE;\n    const fx = xi > LAB_E3 ? Math.cbrt(xi) : (LAB_K * xi + 16) / 116;\n    const fy = yi > LAB_E3 ? Math.cbrt(yi) : (LAB_K * yi + 16) / 116;\n    const fz = zi > LAB_E3 ? Math.cbrt(zi) : (LAB_K * zi + 16) / 116;\n    return [116 * fy - 16, 500 * (fx - fy), 200 * (fy - fz)];\n};\n\n/** D65 XYZ → OKLab via the inverted forward matrices. */\nexport const xyzD65ToOklab = (xyz: RGB3): RGB3 => {\n    const lms = multiplyMatrices(XYZ_TO_LMS, xyz);\n    const lmsCbrt: RGB3 = [Math.cbrt(lms[0]), Math.cbrt(lms[1]), Math.cbrt(lms[2])];\n    return multiplyMatrices(OKLAB_FROM_LMS, lmsCbrt);\n};\n\n/** Lab/Oklab rectangular coordinates → polar LCH (hue in degrees). */\nconst labToLch = (lab: RGB3): RGB3 => {\n    const c = Math.hypot(lab[1], lab[2]);\n    const h = (Math.atan2(lab[2], lab[1]) * 180) / Math.PI;\n    return [lab[0], c, (h + 360) % 360];\n};\n\n/** Gamma sRGB (0..1) → HSL with hue in turns (0..1), matching hsl2rgb input. */\nconst rgbToHslTurns = (rgb: RGB3): RGB3 => {\n    const r = rgb[0],\n        g = rgb[1],\n        b = rgb[2];\n    const max = Math.max(r, g, b);\n    const min = Math.min(r, g, b);\n    const l = (max + min) / 2;\n    if (max === min) {\n        return [0, 0, l];\n    }\n    const d = max - min;\n    const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n    let h: number;\n    if (max === r) {\n        h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n    } else if (max === g) {\n        h = ((b - r) / d + 2) / 6;\n    } else {\n        h = ((r - g) / d + 4) / 6;\n    }\n    return [h, s, l];\n};\n\n/** Packed color → coordinates in the given space, alpha kept on a 0..1 scale. */\nconst toCoords = (color: Color, space: SpaceName): RGBA4 => {\n    const a = (0xff & color) / 255;\n    const rgb = unpackSrgb(color);\n    const linear = rgb2rgbLinear(rgb);\n    const xyz = rgbLinear2xyz(linear);\n    let coords: RGB3;\n    switch (space) {\n        case 'srgb':\n            coords = rgb;\n            break;\n        case 'srgb-linear':\n            coords = linear;\n            break;\n        case 'xyz':\n        case 'xyz-d65':\n            coords = xyz;\n            break;\n        case 'xyz-d50':\n            coords = d65toD50(xyz);\n            break;\n        case 'lab':\n            coords = xyzD65ToLab(xyz);\n            break;\n        case 'oklab':\n            coords = xyzD65ToOklab(xyz);\n            break;\n        case 'lch':\n            coords = labToLch(xyzD65ToLab(xyz));\n            break;\n        case 'oklch':\n            coords = labToLch(xyzD65ToOklab(xyz));\n            break;\n        case 'hsl':\n            // hue stored in degrees like the other polar spaces\n            coords = [rgbToHslTurns(rgb)[0] * 360, rgbToHslTurns(rgb)[1], rgbToHslTurns(rgb)[2]];\n            break;\n    }\n    return [coords[0], coords[1], coords[2], a];\n};\n\n/** Coordinates in the given space → packed color. */\nconst fromCoords = (coords: RGBA4, space: SpaceName): Color => {\n    const c0 = coords[0],\n        c1 = coords[1],\n        c2 = coords[2],\n        a = coords[3];\n    switch (space) {\n        case 'srgb':\n            return packSrgb([c0, c1, c2, a]);\n        case 'srgb-linear':\n            return packSrgbLinear([c0, c1, c2, a]);\n        case 'xyz':\n        case 'xyz-d65':\n            return packXYZ([c0, c1, c2, a]);\n        case 'xyz-d50':\n            return packXYZ([...d50toD65([c0, c1, c2]), a]);\n        case 'lab':\n            return packViaXyz(lab2xyz([c0, c1, c2]), a);\n        case 'oklab':\n            return packViaXyz(oklab2xyz([c0, c1, c2]), a);\n        case 'lch':\n            return packViaXyz(lab2xyz(lch2lab([c0, c1, c2])), a);\n        case 'oklch':\n            return packViaXyz(oklab2xyz(lch2lab([c0, c1, c2])), a);\n        case 'hsl': {\n            const rgb = hsl2rgb([c0 / 360, c1, c2]);\n            return packSrgb([rgb[0], rgb[1], rgb[2], a]);\n        }\n    }\n};\n\nconst packViaXyz = (xyz: RGB3, a: number): Color => {\n    const rgb = srgbLinear2rgb(xyz2rgbLinear(xyz));\n    return packSrgb([rgb[0], rgb[1], rgb[2], a]);\n};\n\n/**\n * Interpolate a hue angle in degrees per css-color-4 §12.4. `weight1` and\n * `weight2` are the (normalized) mix weights; the hue travels from h1 towards\n * h2 by the shared fraction. Exported for unit tests.\n */\nexport const interpolateHue = (\n    h1: number,\n    h2: number,\n    weight1: number,\n    weight2: number,\n    method: HueMethod = 'shorter'\n): number => {\n    const wSum = weight1 + weight2;\n    if (wSum === 0) {\n        return h1;\n    }\n    let d = (((h2 - h1) % 360) + 360) % 360;\n    switch (method) {\n        case 'shorter':\n            if (d > 180) d -= 360;\n            break;\n        case 'longer':\n            if (d < 180) d -= 360;\n            break;\n        case 'increasing':\n            break;\n        case 'decreasing':\n            if (d > 0) d -= 360;\n            break;\n    }\n    return h1 + d * (weight2 / wSum);\n};\n\ntype MixComponent = { color: Color; percentage: number | null };\n\nconst parseMixComponent = (context: Context, tokens: CSSValue[]): MixComponent => {\n    let colorToken: CSSValue | undefined;\n    let percentage: number | null = null;\n    for (const token of tokens) {\n        if (token.type === TokenType.WHITESPACE_TOKEN || token.type === TokenType.COMMA_TOKEN) {\n            continue;\n        }\n        if (token.type === TokenType.PERCENTAGE_TOKEN) {\n            percentage = token.number;\n        } else if (isIdentToken(token) && token.value === 'none') {\n            // `none` behaves as 0% for the percentage component per spec\n            if (percentage === null) percentage = 0;\n        } else if (colorToken === undefined) {\n            colorToken = token;\n        } else {\n            throw new Error(`Unexpected token in color-mix() component`);\n        }\n    }\n    if (colorToken === undefined) {\n        throw new Error('color-mix() component is missing a color');\n    }\n    const token: CSSValue = colorToken;\n    return { color: colorType.parse(context, token), percentage };\n};\n\nconst SUPPORTED_SPACES: SpaceName[] = [\n    'srgb',\n    'srgb-linear',\n    'lab',\n    'oklab',\n    'lch',\n    'oklch',\n    'hsl',\n    'xyz',\n    'xyz-d50',\n    'xyz-d65'\n];\n\nconst mixCoords = (\n    c1: ReturnType<typeof toCoords>,\n    c2: ReturnType<typeof toCoords>,\n    w1: number,\n    w2: number,\n    space: SpaceName,\n    hueMethod: HueMethod\n): ReturnType<typeof toCoords> => {\n    const hueIdx = HUE_DEG_INDEX[space];\n    // Hue is not premultiplied; every other coordinate is (css-color-4 §12.3).\n    const p1: RGBA4 = [c1[0] * c1[3], c1[1] * c1[3], c1[2] * c1[3], c1[3]];\n    const p2: RGBA4 = [c2[0] * c2[3], c2[1] * c2[3], c2[2] * c2[3], c2[3]];\n    const alpha = w1 * p1[3] + w2 * p2[3];\n    if (alpha <= 0) {\n        return [0, 0, 0, 0];\n    }\n    const out: RGBA4 = [0, 0, 0, alpha];\n    for (let i = 0; i < 3; i++) {\n        if (i === hueIdx) {\n            continue;\n        }\n        out[i] = (w1 * at(p1, i) + w2 * at(p2, i)) / alpha;\n    }\n    if (hueIdx !== undefined) {\n        let h1 = at(c1, hueIdx);\n        let h2 = at(c2, hueIdx);\n        // A powerless (zero-chroma/saturation) hue takes the other's hue.\n        // For hsl the polar partner is saturation (index 1); for lch/oklch\n        // it is chroma (index 1 as well).\n        if (c1[1] === 0) h1 = h2;\n        if (c2[1] === 0) h2 = h1;\n        out[hueIdx] = interpolateHue(h1, h2, w1, w2, hueMethod);\n    }\n    return out;\n};\n\nconst computeColorMix = (context: Context, args: CSSValue[]): Color => {\n    const groups: CSSValue[][] = [[]];\n    for (const token of args) {\n        if (token.type === TokenType.COMMA_TOKEN) {\n            groups.push([]);\n        } else {\n            groups[groups.length - 1]!.push(token);\n        }\n    }\n    const meaningful = groups.map((group) => group.filter((t) => t.type !== TokenType.WHITESPACE_TOKEN));\n    if (meaningful.length !== 3) {\n        throw new Error('color-mix() requires exactly two color components');\n    }\n\n    const header = meaningful[0];\n    const inKeyword = header ? header[0] : undefined;\n    const hasInKeyword = inKeyword !== undefined && isIdentToken(inKeyword) && inKeyword.value === 'in';\n    if (!header || header.length < 2 || !hasInKeyword) {\n        throw new Error('color-mix() requires an interpolation space after `in`');\n    }\n    const spaceIdent = header[1];\n    if (!spaceIdent || !isIdentToken(spaceIdent)) {\n        throw new Error('color-mix() space must be an identifier');\n    }\n    const space = spaceIdent.value as SpaceName;\n    if (SUPPORTED_SPACES.indexOf(space) === -1) {\n        throw new Error(`Unsupported color-mix() interpolation space \"${space}\"`);\n    }\n\n    let hueMethod: HueMethod = 'shorter';\n    const rest = header.slice(2);\n    if (rest.length > 0) {\n        const method = rest[0];\n        const hueKeyword = rest[1];\n        if (\n            !method ||\n            !hueKeyword ||\n            !isIdentToken(method) ||\n            !isIdentToken(hueKeyword) ||\n            hueKeyword.value !== 'hue'\n        ) {\n            throw new Error('Unsupported color-mix() hue method syntax');\n        }\n        if (['shorter', 'longer', 'increasing', 'decreasing'].indexOf(method.value) === -1) {\n            throw new Error(`Unsupported color-mix() hue method \"${method.value}\"`);\n        }\n        hueMethod = method.value as HueMethod;\n    }\n\n    const group1 = meaningful[1];\n    const group2 = meaningful[2];\n    if (!group1 || !group2) {\n        throw new Error('color-mix() requires exactly two color components');\n    }\n    const component1 = parseMixComponent(context, group1);\n    const component2 = parseMixComponent(context, group2);\n\n    let p1 = component1.percentage;\n    let p2 = component2.percentage;\n    if (p1 === null && p2 === null) {\n        p1 = 50;\n        p2 = 50;\n    } else if (p1 === null) {\n        p1 = 100 - (p2 ?? 0);\n    } else if (p2 === null) {\n        p2 = 100 - p1;\n    } else {\n        const sum = p1 + p2;\n        if (sum > 0) {\n            p1 = (p1 / sum) * 100;\n            p2 = (p2 / sum) * 100;\n        }\n    }\n    const weight1 = (p1 ?? 0) / 100;\n    const weight2 = (p2 ?? 0) / 100;\n\n    const mixed = mixCoords(\n        toCoords(component1.color, space),\n        toCoords(component2.color, space),\n        weight1,\n        weight2,\n        space,\n        hueMethod\n    );\n    return fromCoords(mixed, space);\n};\n\nexport const colorMix = (context: Context, args: CSSValue[]): Color => {\n    try {\n        return computeColorMix(context, args);\n    } catch (e) {\n        // Unsupported form: degrade to transparent (the spec's \"invalid at\n        // computed-value time\" behavior) instead of failing the capture.\n        context.logger.warn(`Unsupported color-mix() value: ${e instanceof Error ? e.message : e}`);\n        return TRANSPARENT_COLOR;\n    }\n};\n","import { CSSValue, isIdentToken, isNumberToken, nonFunctionArgSeparator, Parser } from '../syntax/parser';\nimport { HashToken, TokenType } from '../syntax/tokenizer';\nimport safeEvalArithmetic from './safe-eval';\nimport { ITypeDescriptor } from '../type-descriptor';\nimport { Context } from '../../core/context';\nimport { at } from '../../core/util';\nimport { RGBA4 } from './color-math';\nimport { srgbFromXYZ, srgbLinearFromXYZ } from './color-spaces/srgb';\nimport {\n    packSrgbLinear,\n    packSrgb,\n    packHSL,\n    packLch,\n    packOkLch,\n    packOkLab,\n    packLab,\n    isRelativeTransform,\n    pack,\n    getTokenColorValue,\n    convertXyz,\n    convertXyz50,\n    rgbToXyz,\n    hslToXyz,\n    labToXyz,\n    lchToXyz,\n    oklabToXyz,\n    oklchToXyz,\n    xyzFromXYZ,\n    xyz50FromXYZ\n} from './color-utilities';\nimport { convertP3, p3FromXYZ } from './color-spaces/p3';\nimport { a98FromXYZ, convertA98rgb } from './color-spaces/a98';\nimport { convertProPhoto, proPhotoFromXYZ } from './color-spaces/pro-photo';\nimport { convertRec2020, rec2020FromXYZ } from './color-spaces/rec2020';\nimport { colorMix } from './functions/color-mix';\n\nexport type Color = number;\n\nexport const color: ITypeDescriptor<Color> = {\n    name: 'color',\n    parse: (context: Context, value: CSSValue): Color => {\n        if (value.type === TokenType.FUNCTION) {\n            const colorFunction = SUPPORTED_COLOR_FUNCTIONS[value.name];\n            if (typeof colorFunction === 'undefined') {\n                throw new Error(`Attempting to parse an unsupported color function \"${value.name}\"`);\n            }\n            return colorFunction(context, value.values);\n        }\n\n        if (value.type === TokenType.HASH_TOKEN) {\n            const [r, g, b, a] = hash2rgb(value);\n            return pack(r, g, b, a);\n        }\n\n        if (value.type === TokenType.IDENT_TOKEN) {\n            const namedColor = COLORS[value.value.toUpperCase()];\n            if (typeof namedColor !== 'undefined') {\n                return namedColor;\n            }\n        }\n\n        return TRANSPARENT_COLOR;\n    }\n};\n\nconst hash2rgb = (token: HashToken): [number, number, number, number] => {\n    if (token.value.length === 3) {\n        const r = token.value.substring(0, 1);\n        const g = token.value.substring(1, 2);\n        const b = token.value.substring(2, 3);\n        return [parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), 1];\n    }\n\n    if (token.value.length === 4) {\n        const r = token.value.substring(0, 1);\n        const g = token.value.substring(1, 2);\n        const b = token.value.substring(2, 3);\n        const a = token.value.substring(3, 4);\n        return [parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), parseInt(a + a, 16) / 255];\n    }\n\n    if (token.value.length === 6) {\n        const r = token.value.substring(0, 2);\n        const g = token.value.substring(2, 4);\n        const b = token.value.substring(4, 6);\n        return [parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), 1];\n    }\n\n    if (token.value.length === 8) {\n        const r = token.value.substring(0, 2);\n        const g = token.value.substring(2, 4);\n        const b = token.value.substring(4, 6);\n        const a = token.value.substring(6, 8);\n        return [parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), parseInt(a, 16) / 255];\n    }\n\n    return [0, 0, 0, 1];\n};\n\nconst rgb = (_context: Context, args: CSSValue[]): number => {\n    const tokens = args.filter(nonFunctionArgSeparator);\n\n    if (isRelativeTransform(tokens)) {\n        throw new Error('Relative color not supported for rgb()');\n    }\n\n    if (tokens.length === 3 || tokens.length === 4) {\n        const r = getTokenColorValue(at(tokens, 0), 0);\n        const g = getTokenColorValue(at(tokens, 1), 1);\n        const b = getTokenColorValue(at(tokens, 2), 2);\n        const a = tokens.length === 4 ? getTokenColorValue(at(tokens, 3), 3) : 1;\n        return pack(r, g, b, a);\n    }\n\n    // Handle modern CSS syntax with / separator: rgb(r g b / alpha)\n    // tokens[0] = r, tokens[1] = g, tokens[2] = b, tokens[3] = '/', tokens[4] = alpha\n    if (tokens.length === 5) {\n        const delim = at(tokens, 3);\n        if (delim.type === TokenType.DELIM_TOKEN && delim.value === '/') {\n            const r = getTokenColorValue(at(tokens, 0), 0);\n            const g = getTokenColorValue(at(tokens, 1), 1);\n            const b = getTokenColorValue(at(tokens, 2), 2);\n            const a = getTokenColorValue(at(tokens, 4), 3);\n            return pack(r, g, b, a);\n        }\n    }\n\n    return 0;\n};\n\n/**\n * Handle the CSS color() function\n *\n * @param context\n * @param args\n */\nconst _color = (context: Context, args: CSSValue[]) => {\n    const tokens = args.filter(nonFunctionArgSeparator),\n        token_1 = tokens[0],\n        token_1_value = token_1 && token_1.type === TokenType.IDENT_TOKEN ? token_1.value : 'unknown',\n        is_absolute = !isRelativeTransform(tokens);\n\n    if (is_absolute) {\n        const color_space = token_1_value,\n            colorSpaceFunction = SUPPORTED_COLOR_SPACES_ABSOLUTE[color_space];\n        if (typeof colorSpaceFunction === 'undefined') {\n            throw new Error(`Attempting to parse an unsupported color space \"${color_space}\" for color() function`);\n        }\n        const t1 = at(tokens, 1),\n            t2 = at(tokens, 2),\n            t3 = at(tokens, 3),\n            t4 = tokens[4],\n            t5 = tokens[5],\n            c1 = isNumberToken(t1) ? t1.number : 0,\n            c2 = isNumberToken(t2) ? t2.number : 0,\n            c3 = isNumberToken(t3) ? t3.number : 0,\n            a =\n                t4 !== undefined &&\n                t4.type === TokenType.DELIM_TOKEN &&\n                t4.value === '/' &&\n                t5 !== undefined &&\n                isNumberToken(t5)\n                    ? t5.number\n                    : 1;\n\n        return colorSpaceFunction([c1, c2, c3, a]);\n    } else {\n        const extractComponent = (color: [number, number, number, number], token: CSSValue) => {\n            if (isNumberToken(token)) {\n                return token.number;\n            }\n\n            const posFromVal = (value: string): number => {\n                return value === 'r' || value === 'x' ? 0 : value === 'g' || value === 'y' ? 1 : 2;\n            };\n\n            if (isIdentToken(token)) {\n                const position = posFromVal(token.value);\n                return at(color, position);\n            }\n\n            const parseCalc = (args: CSSValue[]): string => {\n                const parts = args.filter(nonFunctionArgSeparator);\n                let expression = '(';\n                for (const part of parts) {\n                    expression +=\n                        part.type === TokenType.FUNCTION && part.name === 'calc'\n                            ? parseCalc(part.values)\n                            : isNumberToken(part)\n                              ? part.number\n                              : part.type === TokenType.DELIM_TOKEN || isIdentToken(part)\n                                ? part.value\n                                : '';\n                }\n                expression += ')';\n                return expression;\n            };\n\n            if (token.type === TokenType.FUNCTION) {\n                const args = token.values.filter(nonFunctionArgSeparator);\n                if (token.name === 'calc') {\n                    const expression = parseCalc(args)\n                        .replace(/r|x/, color[0].toString())\n                        .replace(/g|y/, color[1].toString())\n                        .replace(/b|z/, color[2].toString());\n\n                    return safeEvalArithmetic(expression);\n                }\n            }\n\n            return null;\n        };\n\n        const from_token = at(tokens, 1),\n            from_colorspace =\n                from_token.type === TokenType.FUNCTION\n                    ? from_token.name\n                    : isIdentToken(from_token) || from_token.type === TokenType.HASH_TOKEN\n                      ? 'rgb'\n                      : 'unknown',\n            to_token = at(tokens, 2),\n            to_colorspace = isIdentToken(to_token) ? to_token.value : 'unknown';\n\n        let from =\n            from_token.type === TokenType.FUNCTION ? from_token.values : isIdentToken(from_token) ? [from_token] : [];\n\n        if (isIdentToken(from_token)) {\n            const named_color = COLORS[from_token.value.toUpperCase()];\n            if (typeof named_color === 'undefined') {\n                throw new Error(`Attempting to use unknown color in relative color 'from'`);\n            } else {\n                const _c = parseColor(context, from_token.value),\n                    alpha = 0xff & _c,\n                    blue = 0xff & (_c >> 8),\n                    green = 0xff & (_c >> 16),\n                    red = 0xff & (_c >> 24);\n                from = [\n                    { type: TokenType.NUMBER_TOKEN, number: red, flags: 1 },\n                    { type: TokenType.NUMBER_TOKEN, number: green, flags: 1 },\n                    { type: TokenType.NUMBER_TOKEN, number: blue, flags: 1 },\n                    { type: TokenType.NUMBER_TOKEN, number: alpha > 1 ? alpha / 255 : alpha, flags: 1 }\n                ];\n            }\n        } else if (from_token.type === TokenType.HASH_TOKEN) {\n            const [red, green, blue, alpha] = hash2rgb(from_token);\n            from = [\n                { type: TokenType.NUMBER_TOKEN, number: red, flags: 1 },\n                { type: TokenType.NUMBER_TOKEN, number: green, flags: 1 },\n                { type: TokenType.NUMBER_TOKEN, number: blue, flags: 1 },\n                { type: TokenType.NUMBER_TOKEN, number: alpha > 1 ? alpha / 255 : alpha, flags: 1 }\n            ];\n        }\n\n        if (from.length === 0) {\n            throw new Error(`Attempting to use unknown color in relative color 'from'`);\n        }\n\n        if (to_colorspace === 'unknown') {\n            throw new Error(`Attempting to use unknown colorspace in relative color 'to'`);\n        }\n\n        const fromColorToXyz = SUPPORTED_COLOR_SPACES_TO_XYZ[from_colorspace],\n            toColorFromXyz = SUPPORTED_COLOR_SPACES_FROM_XYZ[to_colorspace],\n            toColorPack = SUPPORTED_COLOR_SPACES_ABSOLUTE[to_colorspace];\n\n        if (typeof fromColorToXyz === 'undefined') {\n            throw new Error(`Attempting to parse an unsupported color space \"${from_colorspace}\" for color() function`);\n        }\n        if (typeof toColorFromXyz === 'undefined') {\n            throw new Error(`Attempting to parse an unsupported color space \"${to_colorspace}\" for color() function`);\n        }\n\n        const from_color: [number, number, number, number] = fromColorToXyz(context, from),\n            from_final_colorspace: [number, number, number, number] = toColorFromXyz(from_color),\n            c1 = extractComponent(from_final_colorspace, at(tokens, 3)),\n            c2 = extractComponent(from_final_colorspace, at(tokens, 4)),\n            c3 = extractComponent(from_final_colorspace, at(tokens, 5)),\n            t6 = tokens[6],\n            t7 = tokens[7],\n            a =\n                t6 !== undefined &&\n                t6.type === TokenType.DELIM_TOKEN &&\n                t6.value === '/' &&\n                t7 !== undefined &&\n                isNumberToken(t7)\n                    ? t7.number\n                    : 1;\n        if (c1 === null || c2 === null || c3 === null) {\n            throw new Error(`Invalid relative color in color() function`);\n        }\n        if (typeof toColorPack === 'undefined') {\n            throw new Error(`Attempting to parse an unsupported color space \"${to_colorspace}\" for color() function`);\n        }\n\n        return toColorPack([c1, c2, c3, a]);\n    }\n};\n\nconst SUPPORTED_COLOR_SPACES_ABSOLUTE: {\n    [key: string]: (args: RGBA4) => number;\n} = {\n    srgb: packSrgb,\n    'srgb-linear': packSrgbLinear,\n    'display-p3': convertP3,\n    'a98-rgb': convertA98rgb,\n    'prophoto-rgb': convertProPhoto,\n    xyz: convertXyz,\n    'xyz-d50': convertXyz50,\n    'xyz-d65': convertXyz,\n    rec2020: convertRec2020\n};\n\nconst SUPPORTED_COLOR_SPACES_TO_XYZ: {\n    [key: string]: (context: Context, args: CSSValue[]) => [number, number, number, number];\n} = {\n    rgb: rgbToXyz,\n    hsl: hslToXyz,\n    lab: labToXyz,\n    lch: lchToXyz,\n    oklab: oklabToXyz,\n    oklch: oklchToXyz\n};\n\nconst SUPPORTED_COLOR_SPACES_FROM_XYZ: {\n    [key: string]: (args: [number, number, number, number]) => [number, number, number, number];\n} = {\n    srgb: srgbFromXYZ,\n    'srgb-linear': srgbLinearFromXYZ,\n    'display-p3': p3FromXYZ,\n    'a98-rgb': a98FromXYZ,\n    'prophoto-rgb': proPhotoFromXYZ,\n    xyz: xyzFromXYZ,\n    'xyz-d50': xyz50FromXYZ,\n    'xyz-d65': xyzFromXYZ,\n    rec2020: rec2020FromXYZ\n};\n\nconst SUPPORTED_COLOR_FUNCTIONS: {\n    [key: string]: (context: Context, args: CSSValue[]) => number;\n} = {\n    hsl: packHSL,\n    hsla: packHSL,\n    rgb: rgb,\n    rgba: rgb,\n    lch: packLch,\n    oklch: packOkLch,\n    oklab: packOkLab,\n    lab: packLab,\n    color: _color,\n    'color-mix': colorMix\n};\n\nexport const parseColor = (context: Context, value: string): Color =>\n    color.parse(context, Parser.create(value).parseComponentValue());\n\nexport const TRANSPARENT_COLOR: Color = 0x00000000;\n\nexport const COLORS: { [key: string]: Color } = {\n    ALICEBLUE: 0xf0f8ffff,\n    ANTIQUEWHITE: 0xfaebd7ff,\n    AQUA: 0x00ffffff,\n    AQUAMARINE: 0x7fffd4ff,\n    AZURE: 0xf0ffffff,\n    BEIGE: 0xf5f5dcff,\n    BISQUE: 0xffe4c4ff,\n    BLACK: 0x000000ff,\n    BLANCHEDALMOND: 0xffebcdff,\n    BLUE: 0x0000ffff,\n    BLUEVIOLET: 0x8a2be2ff,\n    BROWN: 0xa52a2aff,\n    BURLYWOOD: 0xdeb887ff,\n    CADETBLUE: 0x5f9ea0ff,\n    CHARTREUSE: 0x7fff00ff,\n    CHOCOLATE: 0xd2691eff,\n    CORAL: 0xff7f50ff,\n    CORNFLOWERBLUE: 0x6495edff,\n    CORNSILK: 0xfff8dcff,\n    CRIMSON: 0xdc143cff,\n    CYAN: 0x00ffffff,\n    DARKBLUE: 0x00008bff,\n    DARKCYAN: 0x008b8bff,\n    DARKGOLDENROD: 0xb886bbff,\n    DARKGRAY: 0xa9a9a9ff,\n    DARKGREEN: 0x006400ff,\n    DARKGREY: 0xa9a9a9ff,\n    DARKKHAKI: 0xbdb76bff,\n    DARKMAGENTA: 0x8b008bff,\n    DARKOLIVEGREEN: 0x556b2fff,\n    DARKORANGE: 0xff8c00ff,\n    DARKORCHID: 0x9932ccff,\n    DARKRED: 0x8b0000ff,\n    DARKSALMON: 0xe9967aff,\n    DARKSEAGREEN: 0x8fbc8fff,\n    DARKSLATEBLUE: 0x483d8bff,\n    DARKSLATEGRAY: 0x2f4f4fff,\n    DARKSLATEGREY: 0x2f4f4fff,\n    DARKTURQUOISE: 0x00ced1ff,\n    DARKVIOLET: 0x9400d3ff,\n    DEEPPINK: 0xff1493ff,\n    DEEPSKYBLUE: 0x00bfffff,\n    DIMGRAY: 0x696969ff,\n    DIMGREY: 0x696969ff,\n    DODGERBLUE: 0x1e90ffff,\n    FIREBRICK: 0xb22222ff,\n    FLORALWHITE: 0xfffaf0ff,\n    FORESTGREEN: 0x228b22ff,\n    FUCHSIA: 0xff00ffff,\n    GAINSBORO: 0xdcdcdcff,\n    GHOSTWHITE: 0xf8f8ffff,\n    GOLD: 0xffd700ff,\n    GOLDENROD: 0xdaa520ff,\n    GRAY: 0x808080ff,\n    GREEN: 0x008000ff,\n    GREENYELLOW: 0xadff2fff,\n    GREY: 0x808080ff,\n    HONEYDEW: 0xf0fff0ff,\n    HOTPINK: 0xff69b4ff,\n    INDIANRED: 0xcd5c5cff,\n    INDIGO: 0x4b0082ff,\n    IVORY: 0xfffff0ff,\n    KHAKI: 0xf0e68cff,\n    LAVENDER: 0xe6e6faff,\n    LAVENDERBLUSH: 0xfff0f5ff,\n    LAWNGREEN: 0x7cfc00ff,\n    LEMONCHIFFON: 0xfffacdff,\n    LIGHTBLUE: 0xadd8e6ff,\n    LIGHTCORAL: 0xf08080ff,\n    LIGHTCYAN: 0xe0ffffff,\n    LIGHTGOLDENRODYELLOW: 0xfafad2ff,\n    LIGHTGRAY: 0xd3d3d3ff,\n    LIGHTGREEN: 0x90ee90ff,\n    LIGHTGREY: 0xd3d3d3ff,\n    LIGHTPINK: 0xffb6c1ff,\n    LIGHTSALMON: 0xffa07aff,\n    LIGHTSEAGREEN: 0x20b2aaff,\n    LIGHTSKYBLUE: 0x87cefaff,\n    LIGHTSLATEGRAY: 0x778899ff,\n    LIGHTSLATEGREY: 0x778899ff,\n    LIGHTSTEELBLUE: 0xb0c4deff,\n    LIGHTYELLOW: 0xffffe0ff,\n    LIME: 0x00ff00ff,\n    LIMEGREEN: 0x32cd32ff,\n    LINEN: 0xfaf0e6ff,\n    MAGENTA: 0xff00ffff,\n    MAROON: 0x800000ff,\n    MEDIUMAQUAMARINE: 0x66cdaaff,\n    MEDIUMBLUE: 0x0000cdff,\n    MEDIUMORCHID: 0xba55d3ff,\n    MEDIUMPURPLE: 0x9370dbff,\n    MEDIUMSEAGREEN: 0x3cb371ff,\n    MEDIUMSLATEBLUE: 0x7b68eeff,\n    MEDIUMSPRINGGREEN: 0x00fa9aff,\n    MEDIUMTURQUOISE: 0x48d1ccff,\n    MEDIUMVIOLETRED: 0xc71585ff,\n    MIDNIGHTBLUE: 0x191970ff,\n    MINTCREAM: 0xf5fffaff,\n    MISTYROSE: 0xffe4e1ff,\n    MOCCASIN: 0xffe4b5ff,\n    NAVAJOWHITE: 0xffdeadff,\n    NAVY: 0x000080ff,\n    OLDLACE: 0xfdf5e6ff,\n    OLIVE: 0x808000ff,\n    OLIVEDRAB: 0x6b8e23ff,\n    ORANGE: 0xffa500ff,\n    ORANGERED: 0xff4500ff,\n    ORCHID: 0xda70d6ff,\n    PALEGOLDENROD: 0xeee8aaff,\n    PALEGREEN: 0x98fb98ff,\n    PALETURQUOISE: 0xafeeeeff,\n    PALEVIOLETRED: 0xdb7093ff,\n    PAPAYAWHIP: 0xffefd5ff,\n    PEACHPUFF: 0xffdab9ff,\n    PERU: 0xcd853fff,\n    PINK: 0xffc0cbff,\n    PLUM: 0xdda0ddff,\n    POWDERBLUE: 0xb0e0e6ff,\n    PURPLE: 0x800080ff,\n    REBECCAPURPLE: 0x663399ff,\n    RED: 0xff0000ff,\n    ROSYBROWN: 0xbc8f8fff,\n    ROYALBLUE: 0x4169e1ff,\n    SADDLEBROWN: 0x8b4513ff,\n    SALMON: 0xfa8072ff,\n    SANDYBROWN: 0xf4a460ff,\n    SEAGREEN: 0x2e8b57ff,\n    SEASHELL: 0xfff5eeff,\n    SIENNA: 0xa0522dff,\n    SILVER: 0xc0c0c0ff,\n    SKYBLUE: 0x87ceebff,\n    SLATEBLUE: 0x6a5acdff,\n    SLATEGRAY: 0x708090ff,\n    SLATEGREY: 0x708090ff,\n    SNOW: 0xfffafaff,\n    SPRINGGREEN: 0x00ff7fff,\n    STEELBLUE: 0x4682b4ff,\n    TAN: 0xd2b48cff,\n    TEAL: 0x008080ff,\n    THISTLE: 0xd8bfd8ff,\n    TOMATO: 0xff6347ff,\n    TRANSPARENT: TRANSPARENT_COLOR,\n    TURQUOISE: 0x40e0d0ff,\n    VIOLET: 0xee82eeff,\n    WHEAT: 0xf5deb3ff,\n    WHITE: 0xffffffff,\n    WHITESMOKE: 0xf5f5f5ff,\n    YELLOW: 0xffff00ff,\n    YELLOWGREEN: 0x9acd32ff\n};\n","/**\n * DOM Node Type Guards\n *\n * All DOM node type guards consolidated here to eliminate duplication\n * and provide a single source of truth for node type checking.\n */\n\n// --- Generic node type guards ---\n\nexport const isElementNode = (node: Node): node is Element => node.nodeType === Node.ELEMENT_NODE;\nexport const isTextNode = (node: Node): node is Text => node.nodeType === Node.TEXT_NODE;\n\nexport const isSVGElementNode = (element: Element): element is SVGElement =>\n    typeof (element as SVGElement).className === 'object';\n\nexport const isHTMLElementNode = (node: Node): node is HTMLElement =>\n    isElementNode(node) && typeof (node as HTMLElement).style !== 'undefined' && !isSVGElementNode(node);\n\n// --- Tag name based type guards ---\n\nexport const isInputElement = (node: Element): node is HTMLInputElement => node.tagName === 'INPUT';\nexport const isHTMLElement = (node: Element): node is HTMLHtmlElement => node.tagName === 'HTML';\nexport const isSVGElement = (node: Element): node is SVGSVGElement => node.tagName === 'svg';\nexport const isBodyElement = (node: Element): node is HTMLBodyElement => node.tagName === 'BODY';\nexport const isCanvasElement = (node: Element): node is HTMLCanvasElement => node.tagName === 'CANVAS';\nexport const isVideoElement = (node: Element): node is HTMLVideoElement => node.tagName === 'VIDEO';\nexport const isImageElement = (node: Element): node is HTMLImageElement => node.tagName === 'IMG';\nexport const isIFrameElement = (node: Element): node is HTMLIFrameElement => node.tagName === 'IFRAME';\nexport const isStyleElement = (node: Element): node is HTMLStyleElement => node.tagName === 'STYLE';\nexport const isScriptElement = (node: Element): node is HTMLScriptElement => node.tagName === 'SCRIPT';\nexport const isTextareaElement = (node: Element): node is HTMLTextAreaElement => node.tagName === 'TEXTAREA';\nexport const isSelectElement = (node: Element): node is HTMLSelectElement => node.tagName === 'SELECT';\nexport const isSlotElement = (node: Element): node is HTMLSlotElement => node.tagName === 'SLOT';\nexport const isLIElement = (node: Element): node is HTMLLIElement => node.tagName === 'LI';\nexport const isOLElement = (node: Element): node is HTMLOListElement => node.tagName === 'OL';\n\nexport const isCustomElement = (element: Element): element is HTMLElement =>\n    !isSVGElementNode(element) && element.tagName.indexOf('-') > 0;\n\nconst VOID_OR_REPLACED_TAGS = new Set([\n    'IMG',\n    'VIDEO',\n    'AUDIO',\n    'CANVAS',\n    'IFRAME',\n    'INPUT',\n    'TEXTAREA',\n    'SELECT',\n    'BR',\n    'HR',\n    'META',\n    'LINK',\n    'BASE',\n    'COL',\n    'SOURCE',\n    'TRACK',\n    'WBR',\n    'AREA',\n    'PARAM',\n    'EMBED',\n    'OBJECT'\n]);\n\n/**\n * Check if an element can have ::before / ::after pseudo-elements.\n * Per the CSS spec, replaced elements and void elements cannot have pseudo-elements.\n * SVG elements also do not support pseudo-elements.\n */\nexport const canHavePseudoElements = (element: Element): boolean =>\n    !isSVGElementNode(element) && !VOID_OR_REPLACED_TAGS.has(element.tagName);\n","import { Context } from '../../core/context';\nimport { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nexport const enum LIST_STYLE_TYPE {\n    NONE = -1,\n    DISC = 0,\n    CIRCLE = 1,\n    SQUARE = 2,\n    DECIMAL = 3,\n    CJK_DECIMAL = 4,\n    DECIMAL_LEADING_ZERO = 5,\n    LOWER_ROMAN = 6,\n    UPPER_ROMAN = 7,\n    LOWER_GREEK = 8,\n    LOWER_ALPHA = 9,\n    UPPER_ALPHA = 10,\n    ARABIC_INDIC = 11,\n    ARMENIAN = 12,\n    BENGALI = 13,\n    CAMBODIAN = 14,\n    CJK_EARTHLY_BRANCH = 15,\n    CJK_HEAVENLY_STEM = 16,\n    CJK_IDEOGRAPHIC = 17,\n    DEVANAGARI = 18,\n    ETHIOPIC_NUMERIC = 19,\n    GEORGIAN = 20,\n    GUJARATI = 21,\n    GURMUKHI = 22,\n    HIRAGANA = 23,\n    HIRAGANA_IROHA = 24,\n    JAPANESE_FORMAL = 25,\n    JAPANESE_INFORMAL = 26,\n    KANNADA = 27,\n    KATAKANA = 28,\n    KATAKANA_IROHA = 29,\n    KHMER = 30,\n    KOREAN_HANGUL_FORMAL = 31,\n    KOREAN_HANJA_FORMAL = 32,\n    KOREAN_HANJA_INFORMAL = 33,\n    LAO = 34,\n    LOWER_ARMENIAN = 35,\n    MALAYALAM = 36,\n    MONGOLIAN = 37,\n    MYANMAR = 38,\n    ORIYA = 39,\n    PERSIAN = 40,\n    SIMP_CHINESE_FORMAL = 41,\n    SIMP_CHINESE_INFORMAL = 42,\n    TAMIL = 43,\n    TELUGU = 44,\n    THAI = 45,\n    TIBETAN = 46,\n    TRAD_CHINESE_FORMAL = 47,\n    TRAD_CHINESE_INFORMAL = 48,\n    UPPER_ARMENIAN = 49,\n    DISCLOSURE_OPEN = 50,\n    DISCLOSURE_CLOSED = 51,\n    // This was originally 22, duplicating GURMUKHI.\n    HEBREW = 52\n}\n\nexport const listStyleType: IPropertyIdentValueDescriptor<LIST_STYLE_TYPE> = {\n    name: 'list-style-type',\n    initialValue: 'none',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, type: string) => {\n        switch (type) {\n            case 'disc':\n                return LIST_STYLE_TYPE.DISC;\n            case 'circle':\n                return LIST_STYLE_TYPE.CIRCLE;\n            case 'square':\n                return LIST_STYLE_TYPE.SQUARE;\n            case 'decimal':\n                return LIST_STYLE_TYPE.DECIMAL;\n            case 'cjk-decimal':\n                return LIST_STYLE_TYPE.CJK_DECIMAL;\n            case 'decimal-leading-zero':\n                return LIST_STYLE_TYPE.DECIMAL_LEADING_ZERO;\n            case 'lower-roman':\n                return LIST_STYLE_TYPE.LOWER_ROMAN;\n            case 'upper-roman':\n                return LIST_STYLE_TYPE.UPPER_ROMAN;\n            case 'lower-greek':\n                return LIST_STYLE_TYPE.LOWER_GREEK;\n            case 'lower-alpha':\n                return LIST_STYLE_TYPE.LOWER_ALPHA;\n            case 'upper-alpha':\n                return LIST_STYLE_TYPE.UPPER_ALPHA;\n            case 'arabic-indic':\n                return LIST_STYLE_TYPE.ARABIC_INDIC;\n            case 'armenian':\n                return LIST_STYLE_TYPE.ARMENIAN;\n            case 'bengali':\n                return LIST_STYLE_TYPE.BENGALI;\n            case 'cambodian':\n                return LIST_STYLE_TYPE.CAMBODIAN;\n            case 'cjk-earthly-branch':\n                return LIST_STYLE_TYPE.CJK_EARTHLY_BRANCH;\n            case 'cjk-heavenly-stem':\n                return LIST_STYLE_TYPE.CJK_HEAVENLY_STEM;\n            case 'cjk-ideographic':\n                return LIST_STYLE_TYPE.CJK_IDEOGRAPHIC;\n            case 'devanagari':\n                return LIST_STYLE_TYPE.DEVANAGARI;\n            case 'ethiopic-numeric':\n                return LIST_STYLE_TYPE.ETHIOPIC_NUMERIC;\n            case 'georgian':\n                return LIST_STYLE_TYPE.GEORGIAN;\n            case 'gujarati':\n                return LIST_STYLE_TYPE.GUJARATI;\n            case 'gurmukhi':\n                return LIST_STYLE_TYPE.GURMUKHI;\n            case 'hebrew':\n                return LIST_STYLE_TYPE.HEBREW;\n            case 'hiragana':\n                return LIST_STYLE_TYPE.HIRAGANA;\n            case 'hiragana-iroha':\n                return LIST_STYLE_TYPE.HIRAGANA_IROHA;\n            case 'japanese-formal':\n                return LIST_STYLE_TYPE.JAPANESE_FORMAL;\n            case 'japanese-informal':\n                return LIST_STYLE_TYPE.JAPANESE_INFORMAL;\n            case 'kannada':\n                return LIST_STYLE_TYPE.KANNADA;\n            case 'katakana':\n                return LIST_STYLE_TYPE.KATAKANA;\n            case 'katakana-iroha':\n                return LIST_STYLE_TYPE.KATAKANA_IROHA;\n            case 'khmer':\n                return LIST_STYLE_TYPE.KHMER;\n            case 'korean-hangul-formal':\n                return LIST_STYLE_TYPE.KOREAN_HANGUL_FORMAL;\n            case 'korean-hanja-formal':\n                return LIST_STYLE_TYPE.KOREAN_HANJA_FORMAL;\n            case 'korean-hanja-informal':\n                return LIST_STYLE_TYPE.KOREAN_HANJA_INFORMAL;\n            case 'lao':\n                return LIST_STYLE_TYPE.LAO;\n            case 'lower-armenian':\n                return LIST_STYLE_TYPE.LOWER_ARMENIAN;\n            case 'malayalam':\n                return LIST_STYLE_TYPE.MALAYALAM;\n            case 'mongolian':\n                return LIST_STYLE_TYPE.MONGOLIAN;\n            case 'myanmar':\n                return LIST_STYLE_TYPE.MYANMAR;\n            case 'oriya':\n                return LIST_STYLE_TYPE.ORIYA;\n            case 'persian':\n                return LIST_STYLE_TYPE.PERSIAN;\n            case 'simp-chinese-formal':\n                return LIST_STYLE_TYPE.SIMP_CHINESE_FORMAL;\n            case 'simp-chinese-informal':\n                return LIST_STYLE_TYPE.SIMP_CHINESE_INFORMAL;\n            case 'tamil':\n                return LIST_STYLE_TYPE.TAMIL;\n            case 'telugu':\n                return LIST_STYLE_TYPE.TELUGU;\n            case 'thai':\n                return LIST_STYLE_TYPE.THAI;\n            case 'tibetan':\n                return LIST_STYLE_TYPE.TIBETAN;\n            case 'trad-chinese-formal':\n                return LIST_STYLE_TYPE.TRAD_CHINESE_FORMAL;\n            case 'trad-chinese-informal':\n                return LIST_STYLE_TYPE.TRAD_CHINESE_INFORMAL;\n            case 'upper-armenian':\n                return LIST_STYLE_TYPE.UPPER_ARMENIAN;\n            case 'disclosure-open':\n                return LIST_STYLE_TYPE.DISCLOSURE_OPEN;\n            case 'disclosure-closed':\n                return LIST_STYLE_TYPE.DISCLOSURE_CLOSED;\n            case 'none':\n            default:\n                return LIST_STYLE_TYPE.NONE;\n        }\n    }\n};\n","export const contains = (bit: number, value: number): boolean => (bit & value) !== 0;\n","import { LIST_STYLE_TYPE } from '../../property-descriptors/list-style-type';\nimport { at } from '../../../core/util';\nimport { contains } from '../../../core/bitwise';\nimport { CSSParsedCounterDeclaration } from '../../index';\n\nexport class CounterState {\n    private readonly counters: { [key: string]: number[] } = {};\n\n    getCounterValue(name: string): number {\n        const counter = this.counters[name];\n\n        if (counter && counter.length) {\n            return at(counter, counter.length - 1);\n        }\n        return 1;\n    }\n\n    getCounterValues(name: string): readonly number[] {\n        const counter = this.counters[name];\n        return counter ? counter : [];\n    }\n\n    pop(counters: string[]): void {\n        counters.forEach((counter) => this.counters[counter]?.pop());\n    }\n\n    parse(style: CSSParsedCounterDeclaration): string[] {\n        const counterIncrement = style.counterIncrement;\n        const counterReset = style.counterReset;\n        let canReset = true;\n\n        if (counterIncrement !== null) {\n            counterIncrement.forEach((entry) => {\n                const counter = this.counters[entry.counter];\n                if (counter && entry.increment !== 0) {\n                    canReset = false;\n                    if (!counter.length) {\n                        counter.push(1);\n                    }\n                    const lastIndex = Math.max(0, counter.length - 1);\n                    counter[lastIndex] = (counter[lastIndex] ?? 0) + entry.increment;\n                }\n            });\n        }\n\n        const counterNames: string[] = [];\n        if (canReset) {\n            counterReset.forEach((entry) => {\n                let counter = this.counters[entry.counter];\n                counterNames.push(entry.counter);\n                if (!counter) {\n                    counter = this.counters[entry.counter] = [];\n                }\n                counter.push(entry.reset);\n            });\n        }\n\n        return counterNames;\n    }\n}\n\ninterface CounterSymbols {\n    integers: number[];\n    values: string[];\n}\n\nconst ROMAN_UPPER: CounterSymbols = {\n    integers: [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1],\n    values: ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I']\n};\n\nconst ARMENIAN: CounterSymbols = {\n    integers: [\n        9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 900, 800, 700, 600, 500, 400, 300, 200, 100, 90, 80, 70,\n        60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1\n    ],\n    values: [\n        'Ք',\n        'Փ',\n        'Ւ',\n        'Ց',\n        'Ր',\n        'Տ',\n        'Վ',\n        'Ս',\n        'Ռ',\n        'Ջ',\n        'Պ',\n        'Չ',\n        'Ո',\n        'Շ',\n        'Ն',\n        'Յ',\n        'Մ',\n        'Ճ',\n        'Ղ',\n        'Ձ',\n        'Հ',\n        'Կ',\n        'Ծ',\n        'Խ',\n        'Լ',\n        'Ի',\n        'Ժ',\n        'Թ',\n        'Ը',\n        'Է',\n        'Զ',\n        'Ե',\n        'Դ',\n        'Գ',\n        'Բ',\n        'Ա'\n    ]\n};\n\nconst HEBREW: CounterSymbols = {\n    integers: [\n        10000, 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 400, 300, 200, 100, 90, 80, 70, 60, 50, 40, 30, 20,\n        19, 18, 17, 16, 15, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1\n    ],\n    values: [\n        'י׳',\n        'ט׳',\n        'ח׳',\n        'ז׳',\n        'ו׳',\n        'ה׳',\n        'ד׳',\n        'ג׳',\n        'ב׳',\n        'א׳',\n        'ת',\n        'ש',\n        'ר',\n        'ק',\n        'צ',\n        'פ',\n        'ע',\n        'ס',\n        'נ',\n        'מ',\n        'ל',\n        'כ',\n        'יט',\n        'יח',\n        'יז',\n        'טז',\n        'טו',\n        'י',\n        'ט',\n        'ח',\n        'ז',\n        'ו',\n        'ה',\n        'ד',\n        'ג',\n        'ב',\n        'א'\n    ]\n};\n\nconst GEORGIAN: CounterSymbols = {\n    integers: [\n        10000, 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 900, 800, 700, 600, 500, 400, 300, 200, 100, 90,\n        80, 70, 60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1\n    ],\n    values: [\n        'ჵ',\n        'ჰ',\n        'ჯ',\n        'ჴ',\n        'ხ',\n        'ჭ',\n        'წ',\n        'ძ',\n        'ც',\n        'ჩ',\n        'შ',\n        'ყ',\n        'ღ',\n        'ქ',\n        'ფ',\n        'ჳ',\n        'ტ',\n        'ს',\n        'რ',\n        'ჟ',\n        'პ',\n        'ო',\n        'ჲ',\n        'ნ',\n        'მ',\n        'ლ',\n        'კ',\n        'ი',\n        'თ',\n        'ჱ',\n        'ზ',\n        'ვ',\n        'ე',\n        'დ',\n        'გ',\n        'ბ',\n        'ა'\n    ]\n};\n\nconst createAdditiveCounter = (\n    value: number,\n    min: number,\n    max: number,\n    symbols: CounterSymbols,\n    fallback: LIST_STYLE_TYPE,\n    suffix: string\n) => {\n    if (value < min || value > max) {\n        return createCounterText(value, fallback, suffix.length > 0);\n    }\n\n    return (\n        symbols.integers.reduce((string, integer, index) => {\n            while (value >= integer) {\n                value -= integer;\n                string += symbols.values[index];\n            }\n            return string;\n        }, '') + suffix\n    );\n};\n\nconst createCounterStyleWithSymbolResolver = (\n    value: number,\n    codePointRangeLength: number,\n    isNumeric: boolean,\n    resolver: (codePoint: number) => string\n): string => {\n    let string = '';\n\n    do {\n        if (!isNumeric) {\n            value--;\n        }\n        string = resolver(value) + string;\n        value /= codePointRangeLength;\n    } while (value * codePointRangeLength >= codePointRangeLength);\n\n    return string;\n};\n\nconst createCounterStyleFromRange = (\n    value: number,\n    codePointRangeStart: number,\n    codePointRangeEnd: number,\n    isNumeric: boolean,\n    suffix: string\n): string => {\n    const codePointRangeLength = codePointRangeEnd - codePointRangeStart + 1;\n\n    return (\n        (value < 0 ? '-' : '') +\n        (createCounterStyleWithSymbolResolver(Math.abs(value), codePointRangeLength, isNumeric, (codePoint) =>\n            String.fromCodePoint(Math.floor(codePoint % codePointRangeLength) + codePointRangeStart)\n        ) +\n            suffix)\n    );\n};\n\nconst createCounterStyleFromSymbols = (value: number, symbols: string, suffix = '. '): string => {\n    const codePointRangeLength = symbols.length;\n    return (\n        createCounterStyleWithSymbolResolver(\n            Math.abs(value),\n            codePointRangeLength,\n            false,\n            // Upstream parity: an out-of-range index (e.g. cjk-decimal 0) joins\n            // the string as `undefined`; preserved verbatim — do not \"fix\"\n            // without an upstream reference (see counter.test.ts).\n            (codePoint) => String(symbols[Math.floor(codePoint % codePointRangeLength)])\n        ) + suffix\n    );\n};\n\nconst CJK_ZEROS = 1 << 0;\nconst CJK_TEN_COEFFICIENTS = 1 << 1;\nconst CJK_TEN_HIGH_COEFFICIENTS = 1 << 2;\nconst CJK_HUNDRED_COEFFICIENTS = 1 << 3;\n\nconst createCJKCounter = (\n    value: number,\n    numbers: string,\n    multipliers: string,\n    negativeSign: string,\n    suffix: string,\n    flags: number\n): string => {\n    if (value < -9999 || value > 9999) {\n        return createCounterText(value, LIST_STYLE_TYPE.CJK_DECIMAL, suffix.length > 0);\n    }\n    let tmp = Math.abs(value);\n    let string = suffix;\n\n    if (tmp === 0) {\n        return numbers[0] + string;\n    }\n\n    for (let digit = 0; tmp > 0 && digit <= 4; digit++) {\n        const coefficient = tmp % 10;\n\n        if (coefficient === 0 && contains(flags, CJK_ZEROS) && string !== '') {\n            string = numbers[coefficient] + string;\n        } else if (\n            coefficient > 1 ||\n            (coefficient === 1 && digit === 0) ||\n            (coefficient === 1 && digit === 1 && contains(flags, CJK_TEN_COEFFICIENTS)) ||\n            (coefficient === 1 && digit === 1 && contains(flags, CJK_TEN_HIGH_COEFFICIENTS) && value > 100) ||\n            (coefficient === 1 && digit > 1 && contains(flags, CJK_HUNDRED_COEFFICIENTS))\n        ) {\n            string = (numbers[coefficient] ?? '') + (digit > 0 ? (multipliers[digit - 1] ?? '') : '') + string;\n        } else if (coefficient === 1 && digit > 0) {\n            string = (multipliers[digit - 1] ?? '') + string;\n        }\n        tmp = Math.floor(tmp / 10);\n    }\n\n    return (value < 0 ? negativeSign : '') + string;\n};\n\nconst CHINESE_INFORMAL_MULTIPLIERS = '十百千萬';\nconst CHINESE_FORMAL_MULTIPLIERS = '拾佰仟萬';\nconst JAPANESE_NEGATIVE = 'マイナス';\nconst KOREAN_NEGATIVE = '마이너스';\n\nexport const createCounterText = (value: number, type: LIST_STYLE_TYPE, appendSuffix: boolean): string => {\n    const defaultSuffix = appendSuffix ? '. ' : '';\n    const cjkSuffix = appendSuffix ? '、' : '';\n    const koreanSuffix = appendSuffix ? ', ' : '';\n    const spaceSuffix = appendSuffix ? ' ' : '';\n    switch (type) {\n        case LIST_STYLE_TYPE.DISC:\n            return '•' + spaceSuffix;\n        case LIST_STYLE_TYPE.CIRCLE:\n            return '◦' + spaceSuffix;\n        case LIST_STYLE_TYPE.SQUARE:\n            return '◾' + spaceSuffix;\n        case LIST_STYLE_TYPE.DECIMAL_LEADING_ZERO:\n            const string = createCounterStyleFromRange(value, 48, 57, true, defaultSuffix);\n            return string.length < 4 ? `0${string}` : string;\n        case LIST_STYLE_TYPE.CJK_DECIMAL:\n            return createCounterStyleFromSymbols(value, '〇一二三四五六七八九', cjkSuffix);\n        case LIST_STYLE_TYPE.LOWER_ROMAN:\n            return createAdditiveCounter(\n                value,\n                1,\n                3999,\n                ROMAN_UPPER,\n                LIST_STYLE_TYPE.DECIMAL,\n                defaultSuffix\n            ).toLowerCase();\n        case LIST_STYLE_TYPE.UPPER_ROMAN:\n            return createAdditiveCounter(value, 1, 3999, ROMAN_UPPER, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);\n        case LIST_STYLE_TYPE.LOWER_GREEK:\n            return createCounterStyleFromRange(value, 945, 969, false, defaultSuffix);\n        case LIST_STYLE_TYPE.LOWER_ALPHA:\n            return createCounterStyleFromRange(value, 97, 122, false, defaultSuffix);\n        case LIST_STYLE_TYPE.UPPER_ALPHA:\n            return createCounterStyleFromRange(value, 65, 90, false, defaultSuffix);\n        case LIST_STYLE_TYPE.ARABIC_INDIC:\n            return createCounterStyleFromRange(value, 1632, 1641, true, defaultSuffix);\n        case LIST_STYLE_TYPE.ARMENIAN:\n        case LIST_STYLE_TYPE.UPPER_ARMENIAN:\n            return createAdditiveCounter(value, 1, 9999, ARMENIAN, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);\n        case LIST_STYLE_TYPE.LOWER_ARMENIAN:\n            return createAdditiveCounter(\n                value,\n                1,\n                9999,\n                ARMENIAN,\n                LIST_STYLE_TYPE.DECIMAL,\n                defaultSuffix\n            ).toLowerCase();\n        case LIST_STYLE_TYPE.BENGALI:\n            return createCounterStyleFromRange(value, 2534, 2543, true, defaultSuffix);\n        case LIST_STYLE_TYPE.CAMBODIAN:\n        case LIST_STYLE_TYPE.KHMER:\n            return createCounterStyleFromRange(value, 6112, 6121, true, defaultSuffix);\n        case LIST_STYLE_TYPE.CJK_EARTHLY_BRANCH:\n            return createCounterStyleFromSymbols(value, '子丑寅卯辰巳午未申酉戌亥', cjkSuffix);\n        case LIST_STYLE_TYPE.CJK_HEAVENLY_STEM:\n            return createCounterStyleFromSymbols(value, '甲乙丙丁戊己庚辛壬癸', cjkSuffix);\n        case LIST_STYLE_TYPE.CJK_IDEOGRAPHIC:\n        case LIST_STYLE_TYPE.TRAD_CHINESE_INFORMAL:\n            return createCJKCounter(\n                value,\n                '零一二三四五六七八九',\n                CHINESE_INFORMAL_MULTIPLIERS,\n                '負',\n                cjkSuffix,\n                CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS\n            );\n        case LIST_STYLE_TYPE.TRAD_CHINESE_FORMAL:\n            return createCJKCounter(\n                value,\n                '零壹貳參肆伍陸柒捌玖',\n                CHINESE_FORMAL_MULTIPLIERS,\n                '負',\n                cjkSuffix,\n                CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS\n            );\n        case LIST_STYLE_TYPE.SIMP_CHINESE_INFORMAL:\n            return createCJKCounter(\n                value,\n                '零一二三四五六七八九',\n                CHINESE_INFORMAL_MULTIPLIERS,\n                '负',\n                cjkSuffix,\n                CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS\n            );\n        case LIST_STYLE_TYPE.SIMP_CHINESE_FORMAL:\n            return createCJKCounter(\n                value,\n                '零壹贰叁肆伍陆柒捌玖',\n                CHINESE_FORMAL_MULTIPLIERS,\n                '负',\n                cjkSuffix,\n                CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS\n            );\n        case LIST_STYLE_TYPE.JAPANESE_INFORMAL:\n            return createCJKCounter(value, '〇一二三四五六七八九', '十百千万', JAPANESE_NEGATIVE, cjkSuffix, 0);\n        case LIST_STYLE_TYPE.JAPANESE_FORMAL:\n            return createCJKCounter(\n                value,\n                '零壱弐参四伍六七八九',\n                '拾百千万',\n                JAPANESE_NEGATIVE,\n                cjkSuffix,\n                CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS\n            );\n        case LIST_STYLE_TYPE.KOREAN_HANGUL_FORMAL:\n            return createCJKCounter(\n                value,\n                '영일이삼사오육칠팔구',\n                '십백천만',\n                KOREAN_NEGATIVE,\n                koreanSuffix,\n                CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS\n            );\n        case LIST_STYLE_TYPE.KOREAN_HANJA_INFORMAL:\n            return createCJKCounter(value, '零一二三四五六七八九', '十百千萬', KOREAN_NEGATIVE, koreanSuffix, 0);\n        case LIST_STYLE_TYPE.KOREAN_HANJA_FORMAL:\n            return createCJKCounter(\n                value,\n                '零壹貳參四五六七八九',\n                '拾百千',\n                KOREAN_NEGATIVE,\n                koreanSuffix,\n                CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS\n            );\n        case LIST_STYLE_TYPE.DEVANAGARI:\n            return createCounterStyleFromRange(value, 0x966, 0x96f, true, defaultSuffix);\n        case LIST_STYLE_TYPE.GEORGIAN:\n            return createAdditiveCounter(value, 1, 19999, GEORGIAN, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);\n        case LIST_STYLE_TYPE.GUJARATI:\n            return createCounterStyleFromRange(value, 0xae6, 0xaef, true, defaultSuffix);\n        case LIST_STYLE_TYPE.GURMUKHI:\n            return createCounterStyleFromRange(value, 0xa66, 0xa6f, true, defaultSuffix);\n        case LIST_STYLE_TYPE.HEBREW:\n            return createAdditiveCounter(value, 1, 10999, HEBREW, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);\n        case LIST_STYLE_TYPE.HIRAGANA:\n            return createCounterStyleFromSymbols(\n                value,\n                'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん'\n            );\n        case LIST_STYLE_TYPE.HIRAGANA_IROHA:\n            return createCounterStyleFromSymbols(\n                value,\n                'いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす'\n            );\n        case LIST_STYLE_TYPE.KANNADA:\n            return createCounterStyleFromRange(value, 0xce6, 0xcef, true, defaultSuffix);\n        case LIST_STYLE_TYPE.KATAKANA:\n            return createCounterStyleFromSymbols(\n                value,\n                'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン',\n                cjkSuffix\n            );\n        case LIST_STYLE_TYPE.KATAKANA_IROHA:\n            return createCounterStyleFromSymbols(\n                value,\n                'イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス',\n                cjkSuffix\n            );\n        case LIST_STYLE_TYPE.LAO:\n            return createCounterStyleFromRange(value, 0xed0, 0xed9, true, defaultSuffix);\n        case LIST_STYLE_TYPE.MONGOLIAN:\n            return createCounterStyleFromRange(value, 0x1810, 0x1819, true, defaultSuffix);\n        case LIST_STYLE_TYPE.MYANMAR:\n            return createCounterStyleFromRange(value, 0x1040, 0x1049, true, defaultSuffix);\n        case LIST_STYLE_TYPE.ORIYA:\n            return createCounterStyleFromRange(value, 0xb66, 0xb6f, true, defaultSuffix);\n        case LIST_STYLE_TYPE.PERSIAN:\n            return createCounterStyleFromRange(value, 0x6f0, 0x6f9, true, defaultSuffix);\n        case LIST_STYLE_TYPE.TAMIL:\n            return createCounterStyleFromRange(value, 0xbe6, 0xbef, true, defaultSuffix);\n        case LIST_STYLE_TYPE.TELUGU:\n            return createCounterStyleFromRange(value, 0xc66, 0xc6f, true, defaultSuffix);\n        case LIST_STYLE_TYPE.THAI:\n            return createCounterStyleFromRange(value, 0xe50, 0xe59, true, defaultSuffix);\n        case LIST_STYLE_TYPE.TIBETAN:\n            return createCounterStyleFromRange(value, 0xf20, 0xf29, true, defaultSuffix);\n        case LIST_STYLE_TYPE.DECIMAL:\n        default:\n            return createCounterStyleFromRange(value, 48, 57, true, defaultSuffix);\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken } from '../syntax/parser';\nimport { Context } from '../../core/context';\nexport const enum DISPLAY {\n    NONE = 0,\n    BLOCK = 1 << 1,\n    INLINE = 1 << 2,\n    RUN_IN = 1 << 3,\n    FLOW = 1 << 4,\n    FLOW_ROOT = 1 << 5,\n    TABLE = 1 << 6,\n    FLEX = 1 << 7,\n    GRID = 1 << 8,\n    RUBY = 1 << 9,\n    SUBGRID = 1 << 10,\n    LIST_ITEM = 1 << 11,\n    TABLE_ROW_GROUP = 1 << 12,\n    TABLE_HEADER_GROUP = 1 << 13,\n    TABLE_FOOTER_GROUP = 1 << 14,\n    TABLE_ROW = 1 << 15,\n    TABLE_CELL = 1 << 16,\n    TABLE_COLUMN_GROUP = 1 << 17,\n    TABLE_COLUMN = 1 << 18,\n    TABLE_CAPTION = 1 << 19,\n    RUBY_BASE = 1 << 20,\n    RUBY_TEXT = 1 << 21,\n    RUBY_BASE_CONTAINER = 1 << 22,\n    RUBY_TEXT_CONTAINER = 1 << 23,\n    CONTENTS = 1 << 24,\n    INLINE_BLOCK = 1 << 25,\n    INLINE_LIST_ITEM = 1 << 26,\n    INLINE_TABLE = 1 << 27,\n    INLINE_FLEX = 1 << 28,\n    INLINE_GRID = 1 << 29\n}\n\nexport type Display = number;\n\nexport const display: IPropertyListDescriptor<Display> = {\n    name: 'display',\n    initialValue: 'inline-block',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): Display => {\n        return tokens.filter(isIdentToken).reduce((bit, token) => {\n            return bit | parseDisplayValue(token.value);\n        }, DISPLAY.NONE);\n    }\n};\n\nconst parseDisplayValue = (display: string): Display => {\n    switch (display) {\n        case 'block':\n        case '-webkit-box':\n            return DISPLAY.BLOCK;\n        case 'inline':\n            return DISPLAY.INLINE;\n        case 'run-in':\n            return DISPLAY.RUN_IN;\n        case 'flow':\n            return DISPLAY.FLOW;\n        case 'flow-root':\n            return DISPLAY.FLOW_ROOT;\n        case 'table':\n            return DISPLAY.TABLE;\n        case 'flex':\n        case '-webkit-flex':\n            return DISPLAY.FLEX;\n        case 'grid':\n        case '-ms-grid':\n            return DISPLAY.GRID;\n        case 'ruby':\n            return DISPLAY.RUBY;\n        case 'subgrid':\n            return DISPLAY.SUBGRID;\n        case 'list-item':\n            return DISPLAY.LIST_ITEM;\n        case 'table-row-group':\n            return DISPLAY.TABLE_ROW_GROUP;\n        case 'table-header-group':\n            return DISPLAY.TABLE_HEADER_GROUP;\n        case 'table-footer-group':\n            return DISPLAY.TABLE_FOOTER_GROUP;\n        case 'table-row':\n            return DISPLAY.TABLE_ROW;\n        case 'table-cell':\n            return DISPLAY.TABLE_CELL;\n        case 'table-column-group':\n            return DISPLAY.TABLE_COLUMN_GROUP;\n        case 'table-column':\n            return DISPLAY.TABLE_COLUMN;\n        case 'table-caption':\n            return DISPLAY.TABLE_CAPTION;\n        case 'ruby-base':\n            return DISPLAY.RUBY_BASE;\n        case 'ruby-text':\n            return DISPLAY.RUBY_TEXT;\n        case 'ruby-base-container':\n            return DISPLAY.RUBY_BASE_CONTAINER;\n        case 'ruby-text-container':\n            return DISPLAY.RUBY_TEXT_CONTAINER;\n        case 'contents':\n            return DISPLAY.CONTENTS;\n        case 'inline-block':\n            return DISPLAY.INLINE_BLOCK;\n        case 'inline-list-item':\n            return DISPLAY.INLINE_LIST_ITEM;\n        case 'inline-table':\n            return DISPLAY.INLINE_TABLE;\n        case 'inline-flex':\n            return DISPLAY.INLINE_FLEX;\n        case 'inline-grid':\n            return DISPLAY.INLINE_GRID;\n    }\n\n    return DISPLAY.NONE;\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\nexport const enum FLOAT {\n    NONE = 0,\n    LEFT = 1,\n    RIGHT = 2,\n    INLINE_START = 3,\n    INLINE_END = 4\n}\n\nexport const float: IPropertyIdentValueDescriptor<FLOAT> = {\n    name: 'float',\n    initialValue: 'none',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, float: string) => {\n        switch (float) {\n            case 'left':\n                return FLOAT.LEFT;\n            case 'right':\n                return FLOAT.RIGHT;\n            case 'inline-start':\n                return FLOAT.INLINE_START;\n            case 'inline-end':\n                return FLOAT.INLINE_END;\n        }\n        return FLOAT.NONE;\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken } from '../syntax/parser';\nimport { Context } from '../../core/context';\nexport const enum OVERFLOW {\n    VISIBLE = 0,\n    HIDDEN = 1,\n    SCROLL = 2,\n    CLIP = 3,\n    AUTO = 4\n}\n\nexport const overflow: IPropertyListDescriptor<OVERFLOW[]> = {\n    name: 'overflow',\n    initialValue: 'visible',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): OVERFLOW[] => {\n        return tokens.filter(isIdentToken).map((overflow) => {\n            switch (overflow.value) {\n                case 'hidden':\n                    return OVERFLOW.HIDDEN;\n                case 'scroll':\n                    return OVERFLOW.SCROLL;\n                case 'clip':\n                    return OVERFLOW.CLIP;\n                case 'auto':\n                    return OVERFLOW.AUTO;\n                case 'visible':\n                default:\n                    return OVERFLOW.VISIBLE;\n            }\n        });\n    }\n};\n","import { IPropertyTypeValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\n\nexport const textDecorationColor: IPropertyTypeValueDescriptor = {\n    name: `text-decoration-color`,\n    initialValue: 'transparent',\n    prefix: false,\n    type: PropertyDescriptorParsingType.TYPE_VALUE,\n    format: 'color'\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken } from '../syntax/parser';\nimport { Context } from '../../core/context';\n\nexport const enum TEXT_DECORATION_LINE {\n    NONE = 0,\n    UNDERLINE = 1,\n    OVERLINE = 2,\n    LINE_THROUGH = 3,\n    BLINK = 4\n}\n\nexport type TextDecorationLine = TEXT_DECORATION_LINE[];\n\nexport const textDecorationLine: IPropertyListDescriptor<TextDecorationLine> = {\n    name: 'text-decoration-line',\n    initialValue: 'none',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): TextDecorationLine => {\n        return tokens\n            .filter(isIdentToken)\n            .map((token) => {\n                switch (token.value) {\n                    case 'underline':\n                        return TEXT_DECORATION_LINE.UNDERLINE;\n                    case 'overline':\n                        return TEXT_DECORATION_LINE.OVERLINE;\n                    case 'line-through':\n                        return TEXT_DECORATION_LINE.LINE_THROUGH;\n                    case 'none':\n                        return TEXT_DECORATION_LINE.BLINK;\n                }\n                return TEXT_DECORATION_LINE.NONE;\n            })\n            .filter((line) => line !== TEXT_DECORATION_LINE.NONE);\n    }\n};\n","import { TokenType } from '../syntax/tokenizer';\nimport { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue } from '../syntax/parser';\nimport { Context } from '../../core/context';\n\nexport type Content = CSSValue[];\n\nexport const content: IPropertyListDescriptor<Content> = {\n    name: 'content',\n    initialValue: 'none',\n    type: PropertyDescriptorParsingType.LIST,\n    prefix: false,\n    parse: (_context: Context, tokens: CSSValue[]) => {\n        if (tokens.length === 0) {\n            return [];\n        }\n\n        const first = tokens[0];\n\n        if (first && first.type === TokenType.IDENT_TOKEN && first.value === 'none') {\n            return [];\n        }\n\n        return tokens;\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { at } from '../../core/util';\nimport { CSSValue, isStringToken } from '../syntax/parser';\nimport { TokenType } from '../syntax/tokenizer';\nimport { Context } from '../../core/context';\n\nexport interface QUOTE {\n    open: string;\n    close: string;\n}\n\nexport type Quotes = QUOTE[] | null;\n\nexport const quotes: IPropertyListDescriptor<Quotes> = {\n    name: 'quotes',\n    initialValue: 'none',\n    prefix: true,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]) => {\n        if (tokens.length === 0) {\n            return null;\n        }\n\n        const first = tokens[0];\n\n        if (first && first.type === TokenType.IDENT_TOKEN && first.value === 'none') {\n            return null;\n        }\n\n        const quotes = [];\n        const filtered = tokens.filter(isStringToken);\n\n        if (filtered.length % 2 !== 0) {\n            return null;\n        }\n\n        for (let i = 0; i < filtered.length; i += 2) {\n            const open = at(filtered, i).value;\n            const close = at(filtered, i + 1).value;\n            quotes.push({ open, close });\n        }\n\n        return quotes;\n    }\n};\n\nexport const getQuote = (quotes: Quotes, depth: number, open: boolean): string => {\n    if (!quotes) {\n        return '';\n    }\n\n    const quote = quotes[Math.min(depth, quotes.length - 1)];\n    if (!quote) {\n        return '';\n    }\n\n    return open ? quote.open : quote.close;\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isNumberToken, nonWhiteSpace } from '../syntax/parser';\nimport { TokenType } from '../syntax/tokenizer';\nimport { Context } from '../../core/context';\n\nexport interface COUNTER_INCREMENT {\n    counter: string;\n    increment: number;\n}\n\nexport type CounterIncrement = COUNTER_INCREMENT[] | null;\n\n/** Shared counter-ID parsing: returns next number or a fallback default. */\nexport const parseCounterValue = (tokens: CSSValue[], defaultNumber: number): [string, number][] => {\n    const entries: [string, number][] = [];\n    const filtered = tokens.filter(nonWhiteSpace);\n\n    for (let i = 0; i < filtered.length; i++) {\n        const counter = filtered[i];\n        const next = filtered[i + 1];\n        if (counter && counter.type === TokenType.IDENT_TOKEN) {\n            const num = next && isNumberToken(next) ? next.number : defaultNumber;\n            entries.push([counter.value, num]);\n        }\n    }\n\n    return entries;\n};\n\nexport const counterIncrement: IPropertyListDescriptor<CounterIncrement> = {\n    name: 'counter-increment',\n    initialValue: 'none',\n    prefix: true,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]) => {\n        if (tokens.length === 0) {\n            return null;\n        }\n\n        const first = tokens[0];\n        if (first && first.type === TokenType.IDENT_TOKEN && first.value === 'none') {\n            return null;\n        }\n\n        return parseCounterValue(tokens, 1).map(([counter, increment]) => ({ counter, increment }));\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue } from '../syntax/parser';\nimport { Context } from '../../core/context';\nimport { parseCounterValue } from './counter-increment';\n\nexport interface COUNTER_RESET {\n    counter: string;\n    reset: number;\n}\n\nexport type CounterReset = COUNTER_RESET[];\n\nexport const counterReset: IPropertyListDescriptor<CounterReset> = {\n    name: 'counter-reset',\n    initialValue: 'none',\n    prefix: true,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]) => {\n        if (tokens.length === 0) {\n            return [];\n        }\n\n        return parseCounterValue(tokens, 0)\n            .filter(([counter]) => counter !== 'none')\n            .map(([counter, reset]) => ({ counter, reset }));\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken } from '../syntax/parser';\nimport { Context } from '../../core/context';\nexport const enum BACKGROUND_CLIP {\n    BORDER_BOX = 0,\n    PADDING_BOX = 1,\n    CONTENT_BOX = 2,\n    TEXT = 3\n}\n\nexport type BackgroundClip = BACKGROUND_CLIP[];\n\nexport const backgroundClip: IPropertyListDescriptor<BackgroundClip> = {\n    name: 'background-clip',\n    initialValue: 'border-box',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): BackgroundClip => {\n        return tokens.map((token) => {\n            if (isIdentToken(token)) {\n                switch (token.value) {\n                    case 'padding-box':\n                        return BACKGROUND_CLIP.PADDING_BOX;\n                    case 'content-box':\n                        return BACKGROUND_CLIP.CONTENT_BOX;\n                    case 'text':\n                        return BACKGROUND_CLIP.TEXT;\n                }\n            }\n            return BACKGROUND_CLIP.BORDER_BOX;\n        });\n    }\n};\n","import { IPropertyTypeValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\n\nexport const backgroundColor: IPropertyTypeValueDescriptor = {\n    name: `background-color`,\n    initialValue: 'transparent',\n    prefix: false,\n    type: PropertyDescriptorParsingType.TYPE_VALUE,\n    format: 'color'\n};\n","import { CSSValue } from '../../syntax/parser';\nimport { at } from '../../../core/util';\nimport {\n    CSSRadialExtent,\n    CSSRadialGradientImage,\n    CSSRadialShape,\n    GradientColorStop,\n    GradientCorner,\n    UnprocessedGradientColorStop\n} from '../image';\nimport { color as colorType } from '../color';\nimport { getAbsoluteValue, HUNDRED_PERCENT, isLengthPercentage, ZERO_LENGTH } from '../length-percentage';\nimport { Context } from '../../../core/context';\n\nexport const parseColorStop = (context: Context, args: CSSValue[]): UnprocessedGradientColorStop => {\n    const color = colorType.parse(context, at(args, 0));\n    const stop = args[1];\n    return stop && isLengthPercentage(stop) ? { color, stop } : { color, stop: null };\n};\n\nexport const processColorStops = (stops: UnprocessedGradientColorStop[], lineLength: number): GradientColorStop[] => {\n    // Work on a copy: callers pass shared parsed declarations, and resolving\n    // the implicit first/last stops must not mutate them (it would also make\n    // identical gradient cache keys diverge after the first render).\n    const resolvedStops: UnprocessedGradientColorStop[] = stops.map((stop) => ({ color: stop.color, stop: stop.stop }));\n    const first = at(resolvedStops, 0);\n    const last = at(resolvedStops, resolvedStops.length - 1);\n    if (first.stop === null) {\n        first.stop = ZERO_LENGTH;\n    }\n\n    if (last.stop === null) {\n        last.stop = HUNDRED_PERCENT;\n    }\n\n    const processStops: (number | null)[] = [];\n    let previous = 0;\n    for (let i = 0; i < resolvedStops.length; i++) {\n        const stop = at(resolvedStops, i).stop;\n        if (stop !== null) {\n            const absoluteValue = getAbsoluteValue(stop, lineLength);\n            if (absoluteValue > previous) {\n                processStops.push(absoluteValue);\n            } else {\n                processStops.push(previous);\n            }\n            previous = absoluteValue;\n        } else {\n            processStops.push(null);\n        }\n    }\n\n    let gapBegin = null;\n    for (let i = 0; i < processStops.length; i++) {\n        const stop = at(processStops, i);\n        if (stop === null) {\n            if (gapBegin === null) {\n                gapBegin = i;\n            }\n        } else if (gapBegin !== null) {\n            const gapLength = i - gapBegin;\n            const beforeGap = processStops[gapBegin - 1] as number;\n            const gapValue = (stop - beforeGap) / (gapLength + 1);\n            for (let g = 1; g <= gapLength; g++) {\n                processStops[gapBegin + g - 1] = gapValue * g;\n            }\n            gapBegin = null;\n        }\n    }\n\n    return resolvedStops.map(({ color }, i) => {\n        return { color, stop: Math.max(Math.min(1, (processStops[i] as number) / lineLength), 0) };\n    });\n};\n\nconst getAngleFromCorner = (corner: GradientCorner, width: number, height: number): number => {\n    const centerX = width / 2;\n    const centerY = height / 2;\n    const x = getAbsoluteValue(corner[0], width) - centerX;\n    const y = centerY - getAbsoluteValue(corner[1], height);\n\n    return (Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2);\n};\n\nexport const calculateGradientDirection = (\n    angle: number | GradientCorner,\n    width: number,\n    height: number\n): [number, number, number, number, number] => {\n    const radian = typeof angle === 'number' ? angle : getAngleFromCorner(angle, width, height);\n\n    const lineLength = Math.abs(width * Math.sin(radian)) + Math.abs(height * Math.cos(radian));\n\n    const halfWidth = width / 2;\n    const halfHeight = height / 2;\n    const halfLineLength = lineLength / 2;\n\n    const yDiff = Math.sin(radian - Math.PI / 2) * halfLineLength;\n    const xDiff = Math.cos(radian - Math.PI / 2) * halfLineLength;\n\n    return [lineLength, halfWidth - xDiff, halfWidth + xDiff, halfHeight - yDiff, halfHeight + yDiff];\n};\n\nconst distance = (a: number, b: number): number => Math.sqrt(a * a + b * b);\n\nconst findCorner = (width: number, height: number, x: number, y: number, closest: boolean): [number, number] => {\n    const corners: [number, number][] = [\n        [0, 0],\n        [0, height],\n        [width, 0],\n        [width, height]\n    ];\n\n    return corners.reduce<{ optimumCorner: [number, number] | null; optimumDistance: number }>(\n        (stat, corner) => {\n            const [cx, cy] = corner;\n            const d = distance(x - cx, y - cy);\n            if (closest ? d < stat.optimumDistance : d > stat.optimumDistance) {\n                return {\n                    optimumCorner: corner,\n                    optimumDistance: d\n                };\n            }\n\n            return stat;\n        },\n        {\n            optimumDistance: closest ? Infinity : -Infinity,\n            optimumCorner: null\n        }\n    ).optimumCorner as [number, number];\n};\n\nexport const calculateRadius = (\n    gradient: CSSRadialGradientImage,\n    x: number,\n    y: number,\n    width: number,\n    height: number\n): [number, number] => {\n    let rx = 0;\n    let ry = 0;\n\n    switch (gradient.size) {\n        case CSSRadialExtent.CLOSEST_SIDE:\n            // The ending shape is sized so that that it exactly meets the side of the gradient box closest to the gradient’s center.\n            // If the shape is an ellipse, it exactly meets the closest side in each dimension.\n            if (gradient.shape === CSSRadialShape.CIRCLE) {\n                rx = ry = Math.min(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height));\n            } else if (gradient.shape === CSSRadialShape.ELLIPSE) {\n                rx = Math.min(Math.abs(x), Math.abs(x - width));\n                ry = Math.min(Math.abs(y), Math.abs(y - height));\n            }\n            break;\n\n        case CSSRadialExtent.CLOSEST_CORNER:\n            // The ending shape is sized so that that it passes through the corner of the gradient box closest to the gradient’s center.\n            // If the shape is an ellipse, the ending shape is given the same aspect-ratio it would have if closest-side were specified.\n            if (gradient.shape === CSSRadialShape.CIRCLE) {\n                rx = ry = Math.min(\n                    distance(x, y),\n                    distance(x, y - height),\n                    distance(x - width, y),\n                    distance(x - width, y - height)\n                );\n            } else if (gradient.shape === CSSRadialShape.ELLIPSE) {\n                // Compute the ratio ry/rx (which is to be the same as for \"closest-side\")\n                const c = Math.min(Math.abs(y), Math.abs(y - height)) / Math.min(Math.abs(x), Math.abs(x - width));\n                const [cx, cy] = findCorner(width, height, x, y, true);\n                rx = distance(cx - x, (cy - y) / c);\n                ry = c * rx;\n            }\n            break;\n\n        case CSSRadialExtent.FARTHEST_SIDE:\n            // Same as closest-side, except the ending shape is sized based on the farthest side(s)\n            if (gradient.shape === CSSRadialShape.CIRCLE) {\n                rx = ry = Math.max(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height));\n            } else if (gradient.shape === CSSRadialShape.ELLIPSE) {\n                rx = Math.max(Math.abs(x), Math.abs(x - width));\n                ry = Math.max(Math.abs(y), Math.abs(y - height));\n            }\n            break;\n\n        case CSSRadialExtent.FARTHEST_CORNER:\n            // Same as closest-corner, except the ending shape is sized based on the farthest corner.\n            // If the shape is an ellipse, the ending shape is given the same aspect ratio it would have if farthest-side were specified.\n            if (gradient.shape === CSSRadialShape.CIRCLE) {\n                rx = ry = Math.max(\n                    distance(x, y),\n                    distance(x, y - height),\n                    distance(x - width, y),\n                    distance(x - width, y - height)\n                );\n            } else if (gradient.shape === CSSRadialShape.ELLIPSE) {\n                // Compute the ratio ry/rx (which is to be the same as for \"farthest-side\")\n                const c = Math.max(Math.abs(y), Math.abs(y - height)) / Math.max(Math.abs(x), Math.abs(x - width));\n                const [cx, cy] = findCorner(width, height, x, y, false);\n                rx = distance(cx - x, (cy - y) / c);\n                ry = c * rx;\n            }\n            break;\n    }\n\n    if (Array.isArray(gradient.size)) {\n        const size = gradient.size;\n        rx = getAbsoluteValue(at(size, 0), width);\n        ry = size.length === 2 ? getAbsoluteValue(at(size, 1), height) : rx;\n    }\n\n    return [rx, ry];\n};\n","import { CSSValue, parseFunctionArgs } from '../../syntax/parser';\nimport { TokenType } from '../../syntax/tokenizer';\nimport { isAngle, angle as angleType, parseNamedSide, deg } from '../angle';\nimport { CSSImageType, CSSLinearGradientImage, GradientCorner, UnprocessedGradientColorStop } from '../image';\nimport { parseColorStop } from './gradient';\nimport { Context } from '../../../core/context';\n\nexport const linearGradient = (context: Context, tokens: CSSValue[]): CSSLinearGradientImage => {\n    let angle: number | GradientCorner = deg(180);\n    const stops: UnprocessedGradientColorStop[] = [];\n\n    parseFunctionArgs(tokens).forEach((arg, i) => {\n        if (i === 0) {\n            const firstToken = arg[0];\n            if (firstToken && firstToken.type === TokenType.IDENT_TOKEN && firstToken.value === 'to') {\n                angle = parseNamedSide(arg);\n                return;\n            } else if (firstToken && isAngle(firstToken)) {\n                angle = angleType.parse(context, firstToken);\n                return;\n            }\n        }\n        const colorStop = parseColorStop(context, arg);\n        stops.push(colorStop);\n    });\n\n    return { angle, stops, type: CSSImageType.LINEAR_GRADIENT };\n};\n","import { CSSValue, parseFunctionArgs } from '../../syntax/parser';\nimport { CSSImageType, CSSLinearGradientImage, GradientCorner, UnprocessedGradientColorStop } from '../image';\nimport { TokenType } from '../../syntax/tokenizer';\nimport { isAngle, angle as angleType, parseNamedSide, deg } from '../angle';\nimport { parseColorStop } from './gradient';\nimport { Context } from '../../../core/context';\n\nexport const prefixLinearGradient = (context: Context, tokens: CSSValue[]): CSSLinearGradientImage => {\n    let angle: number | GradientCorner = deg(180);\n    const stops: UnprocessedGradientColorStop[] = [];\n\n    parseFunctionArgs(tokens).forEach((arg, i) => {\n        if (i === 0) {\n            const firstToken = arg[0];\n            if (\n                firstToken &&\n                firstToken.type === TokenType.IDENT_TOKEN &&\n                ['top', 'left', 'right', 'bottom'].indexOf(firstToken.value) !== -1\n            ) {\n                angle = parseNamedSide(arg);\n                return;\n            } else if (firstToken && isAngle(firstToken)) {\n                angle = (angleType.parse(context, firstToken) + deg(270)) % deg(360);\n                return;\n            }\n        }\n        const colorStop = parseColorStop(context, arg);\n        stops.push(colorStop);\n    });\n\n    return {\n        angle,\n        stops,\n        type: CSSImageType.LINEAR_GRADIENT\n    };\n};\n","import { CSSValue, isIdentToken, isNumberToken, nonFunctionArgSeparator, parseFunctionArgs } from '../../syntax/parser';\nimport { at } from '../../../core/util';\nimport {\n    CSSImageType,\n    CSSLinearGradientImage,\n    CSSRadialExtent,\n    CSSRadialGradientImage,\n    CSSRadialShape,\n    CSSRadialSize,\n    UnprocessedGradientColorStop\n} from '../image';\nimport { deg } from '../angle';\nimport { TokenType } from '../../syntax/tokenizer';\nimport { color as colorType } from '../color';\nimport { HUNDRED_PERCENT, LengthPercentage, ZERO_LENGTH } from '../length-percentage';\nimport { Context } from '../../../core/context';\n\nexport const webkitGradient = (\n    context: Context,\n    tokens: CSSValue[]\n): CSSLinearGradientImage | CSSRadialGradientImage => {\n    const angle = deg(180);\n    const stops: UnprocessedGradientColorStop[] = [];\n    let type = CSSImageType.LINEAR_GRADIENT;\n    const shape: CSSRadialShape = CSSRadialShape.CIRCLE;\n    const size: CSSRadialSize = CSSRadialExtent.FARTHEST_CORNER;\n    const position: LengthPercentage[] = [];\n    parseFunctionArgs(tokens).forEach((arg, i) => {\n        const firstToken = arg[0];\n        if (!firstToken) {\n            return;\n        }\n        if (i === 0) {\n            if (isIdentToken(firstToken) && firstToken.value === 'linear') {\n                type = CSSImageType.LINEAR_GRADIENT;\n                return;\n            } else if (isIdentToken(firstToken) && firstToken.value === 'radial') {\n                type = CSSImageType.RADIAL_GRADIENT;\n                return;\n            }\n        }\n\n        if (firstToken.type === TokenType.FUNCTION) {\n            if (firstToken.name === 'from') {\n                const color = colorType.parse(context, at(firstToken.values, 0));\n                stops.push({ stop: ZERO_LENGTH, color });\n            } else if (firstToken.name === 'to') {\n                const color = colorType.parse(context, at(firstToken.values, 0));\n                stops.push({ stop: HUNDRED_PERCENT, color });\n            } else if (firstToken.name === 'color-stop') {\n                const values = firstToken.values.filter(nonFunctionArgSeparator);\n                if (values.length === 2) {\n                    const color = colorType.parse(context, at(values, 1));\n                    const stop = at(values, 0);\n                    if (isNumberToken(stop)) {\n                        stops.push({\n                            stop: { type: TokenType.PERCENTAGE_TOKEN, number: stop.number * 100, flags: stop.flags },\n                            color\n                        });\n                    }\n                }\n            }\n        }\n    });\n\n    return type === CSSImageType.LINEAR_GRADIENT\n        ? {\n              angle: (angle + deg(180)) % deg(360),\n              stops,\n              type\n          }\n        : { size, shape, stops, position, type };\n};\n","import { CSSValue, isIdentToken, parseFunctionArgs } from '../../syntax/parser';\nimport {\n    CSSImageType,\n    CSSRadialExtent,\n    CSSRadialGradientImage,\n    CSSRadialShape,\n    CSSRadialSize,\n    UnprocessedGradientColorStop\n} from '../image';\nimport { parseColorStop } from './gradient';\nimport {\n    FIFTY_PERCENT,\n    HUNDRED_PERCENT,\n    isLengthPercentage,\n    LengthPercentage,\n    ZERO_LENGTH\n} from '../length-percentage';\nimport { isLength } from '../length';\nimport { Context } from '../../../core/context';\nexport const CLOSEST_SIDE = 'closest-side';\nexport const FARTHEST_SIDE = 'farthest-side';\nexport const CLOSEST_CORNER = 'closest-corner';\nexport const FARTHEST_CORNER = 'farthest-corner';\nexport const CIRCLE = 'circle';\nexport const ELLIPSE = 'ellipse';\nexport const COVER = 'cover';\nexport const CONTAIN = 'contain';\n\nexport const radialGradient = (context: Context, tokens: CSSValue[]): CSSRadialGradientImage => {\n    let shape: CSSRadialShape = CSSRadialShape.ELLIPSE;\n    let size: CSSRadialSize = CSSRadialExtent.FARTHEST_CORNER;\n    const stops: UnprocessedGradientColorStop[] = [];\n    const position: LengthPercentage[] = [];\n    parseFunctionArgs(tokens).forEach((arg, i) => {\n        let isColorStop = true;\n        if (i === 0) {\n            let isAtPosition = false;\n            isColorStop = arg.reduce((acc, token) => {\n                if (isAtPosition) {\n                    if (isIdentToken(token)) {\n                        switch (token.value) {\n                            case 'center':\n                                position.push(FIFTY_PERCENT);\n                                return acc;\n                            case 'top':\n                            case 'left':\n                                position.push(ZERO_LENGTH);\n                                return acc;\n                            case 'right':\n                            case 'bottom':\n                                position.push(HUNDRED_PERCENT);\n                                return acc;\n                        }\n                    } else if (isLengthPercentage(token) || isLength(token)) {\n                        position.push(token);\n                    }\n                } else if (isIdentToken(token)) {\n                    switch (token.value) {\n                        case CIRCLE:\n                            shape = CSSRadialShape.CIRCLE;\n                            return false;\n                        case ELLIPSE:\n                            shape = CSSRadialShape.ELLIPSE;\n                            return false;\n                        case 'at':\n                            isAtPosition = true;\n                            return false;\n                        case CLOSEST_SIDE:\n                            size = CSSRadialExtent.CLOSEST_SIDE;\n                            return false;\n                        case COVER:\n                        case FARTHEST_SIDE:\n                            size = CSSRadialExtent.FARTHEST_SIDE;\n                            return false;\n                        case CONTAIN:\n                        case CLOSEST_CORNER:\n                            size = CSSRadialExtent.CLOSEST_CORNER;\n                            return false;\n                        case FARTHEST_CORNER:\n                            size = CSSRadialExtent.FARTHEST_CORNER;\n                            return false;\n                    }\n                } else if (isLength(token) || isLengthPercentage(token)) {\n                    if (!Array.isArray(size)) {\n                        size = [];\n                    }\n                    size.push(token);\n                    return false;\n                }\n                return acc;\n            }, isColorStop);\n        }\n\n        if (isColorStop) {\n            const colorStop = parseColorStop(context, arg);\n            stops.push(colorStop);\n        }\n    });\n\n    return { size, shape, stops, position, type: CSSImageType.RADIAL_GRADIENT };\n};\n","import { CSSValue, isIdentToken, parseFunctionArgs } from '../../syntax/parser';\nimport {\n    CSSImageType,\n    CSSRadialExtent,\n    CSSRadialGradientImage,\n    CSSRadialShape,\n    CSSRadialSize,\n    UnprocessedGradientColorStop\n} from '../image';\nimport { parseColorStop } from './gradient';\nimport {\n    FIFTY_PERCENT,\n    HUNDRED_PERCENT,\n    isLengthPercentage,\n    LengthPercentage,\n    ZERO_LENGTH\n} from '../length-percentage';\nimport { isLength } from '../length';\nimport {\n    CIRCLE,\n    CLOSEST_CORNER,\n    CLOSEST_SIDE,\n    CONTAIN,\n    COVER,\n    ELLIPSE,\n    FARTHEST_CORNER,\n    FARTHEST_SIDE\n} from './radial-gradient';\nimport { Context } from '../../../core/context';\n\nexport const prefixRadialGradient = (context: Context, tokens: CSSValue[]): CSSRadialGradientImage => {\n    let shape: CSSRadialShape = CSSRadialShape.ELLIPSE;\n    let size: CSSRadialSize = CSSRadialExtent.FARTHEST_CORNER;\n    const stops: UnprocessedGradientColorStop[] = [];\n    const position: LengthPercentage[] = [];\n\n    parseFunctionArgs(tokens).forEach((arg, i) => {\n        let isColorStop = true;\n        if (i === 0) {\n            isColorStop = arg.reduce((acc, token) => {\n                if (isIdentToken(token)) {\n                    switch (token.value) {\n                        case 'center':\n                            position.push(FIFTY_PERCENT);\n                            return false;\n                        case 'top':\n                        case 'left':\n                            position.push(ZERO_LENGTH);\n                            return false;\n                        case 'right':\n                        case 'bottom':\n                            position.push(HUNDRED_PERCENT);\n                            return false;\n                    }\n                } else if (isLengthPercentage(token) || isLength(token)) {\n                    position.push(token);\n                    return false;\n                }\n\n                return acc;\n            }, isColorStop);\n        } else if (i === 1) {\n            isColorStop = arg.reduce((acc, token) => {\n                if (isIdentToken(token)) {\n                    switch (token.value) {\n                        case CIRCLE:\n                            shape = CSSRadialShape.CIRCLE;\n                            return false;\n                        case ELLIPSE:\n                            shape = CSSRadialShape.ELLIPSE;\n                            return false;\n                        case CONTAIN:\n                        case CLOSEST_SIDE:\n                            size = CSSRadialExtent.CLOSEST_SIDE;\n                            return false;\n                        case FARTHEST_SIDE:\n                            size = CSSRadialExtent.FARTHEST_SIDE;\n                            return false;\n                        case CLOSEST_CORNER:\n                            size = CSSRadialExtent.CLOSEST_CORNER;\n                            return false;\n                        case COVER:\n                        case FARTHEST_CORNER:\n                            size = CSSRadialExtent.FARTHEST_CORNER;\n                            return false;\n                    }\n                } else if (isLength(token) || isLengthPercentage(token)) {\n                    if (!Array.isArray(size)) {\n                        size = [];\n                    }\n                    size.push(token);\n                    return false;\n                }\n\n                return acc;\n            }, isColorStop);\n        }\n\n        if (isColorStop) {\n            const colorStop = parseColorStop(context, arg);\n            stops.push(colorStop);\n        }\n    });\n\n    return { size, shape, stops, position, type: CSSImageType.RADIAL_GRADIENT };\n};\n","import { CSSValue } from '../../syntax/parser';\nimport { CSSImageType, CSSLinearGradientImage } from '../image';\nimport { linearGradient } from './linear-gradient';\nimport { Context } from '../../../core/context';\n\nexport const repeatingLinearGradient = (context: Context, tokens: CSSValue[]): CSSLinearGradientImage => {\n    const gradient = linearGradient(context, tokens);\n    return { ...gradient, type: CSSImageType.REPEATING_LINEAR_GRADIENT };\n};\n","import { CSSValue } from '../../syntax/parser';\nimport { CSSImageType, CSSRadialGradientImage } from '../image';\nimport { radialGradient } from './radial-gradient';\nimport { Context } from '../../../core/context';\n\n/**\n * repeating-radial-gradient shares the radial-gradient grammar exactly; only\n * the image type differs, which switches the renderer to periodic stops.\n */\nexport const repeatingRadialGradient = (context: Context, tokens: CSSValue[]): CSSRadialGradientImage => {\n    const gradient = radialGradient(context, tokens);\n    return {\n        ...gradient,\n        type: CSSImageType.REPEATING_RADIAL_GRADIENT\n    };\n};\n","import { CSSValue, isIdentToken, parseFunctionArgs } from '../../syntax/parser';\nimport { CSSConicGradientImage, CSSImageType, UnprocessedGradientColorStop } from '../image';\nimport { parseColorStop } from './gradient';\nimport { angle } from '../angle';\nimport {\n    FIFTY_PERCENT,\n    HUNDRED_PERCENT,\n    isLengthPercentage,\n    LengthPercentage,\n    ZERO_LENGTH\n} from '../length-percentage';\nimport { Context } from '../../../core/context';\n\n/**\n * conic-gradient( [ from <angle> ]? [ at <position> ]?, <color-stop-list> )\n *\n * The gradient sweeps clockwise from `from <angle>` (0deg = 12 o'clock)\n * around `at <position>` (default: center). The first comma-separated group\n * may carry the from/at clauses; every following group is a color stop.\n */\nexport const conicGradient = (context: Context, tokens: CSSValue[]): CSSConicGradientImage => {\n    let fromAngle = 0;\n    const position: LengthPercentage[] = [];\n    const stops: UnprocessedGradientColorStop[] = [];\n\n    const args = parseFunctionArgs(tokens);\n    args.forEach((arg, i) => {\n        let isColorStop = true;\n        if (i === 0) {\n            let afterFrom = false;\n            let afterAt = false;\n            // The reduce result tracks whether the group ended as a plain\n            // color stop: clause keywords and their values consume tokens and\n            // keep the accumulator false, so `at top` is never parsed as one.\n            isColorStop = arg.reduce((acc, token) => {\n                if (isIdentToken(token)) {\n                    switch (token.value) {\n                        case 'from':\n                            afterFrom = true;\n                            afterAt = false;\n                            return false;\n                        case 'at':\n                            afterFrom = false;\n                            afterAt = true;\n                            return false;\n                        case 'center':\n                            position.push(FIFTY_PERCENT);\n                            return acc;\n                        case 'top':\n                        case 'left':\n                            position.push(ZERO_LENGTH);\n                            return acc;\n                        case 'right':\n                        case 'bottom':\n                            position.push(HUNDRED_PERCENT);\n                            return acc;\n                    }\n                }\n                if (afterFrom) {\n                    fromAngle = angle.parse(context, token);\n                    return false;\n                }\n                if (afterAt && isLengthPercentage(token)) {\n                    position.push(token);\n                    return acc;\n                }\n                return acc;\n            }, true);\n        }\n        if (isColorStop && arg.length > 0) {\n            stops.push(parseColorStop(context, arg));\n        }\n    });\n\n    return {\n        type: CSSImageType.CONIC_GRADIENT,\n        angle: fromAngle,\n        position,\n        stops\n    };\n};\n\n/**\n * repeating-conic-gradient shares the conic-gradient grammar exactly; only\n * the image type differs, which switches the renderer to periodic stops\n * stacked across the full sweep.\n */\nexport const repeatingConicGradient = (context: Context, tokens: CSSValue[]): CSSConicGradientImage => {\n    const gradient = conicGradient(context, tokens);\n    return {\n        ...gradient,\n        type: CSSImageType.REPEATING_CONIC_GRADIENT\n    };\n};\n","import { CSSValue, isDimensionToken, isNumberToken, parseFunctionArgs } from '../../syntax/parser';\nimport { TokenType } from '../../syntax/tokenizer';\nimport { ICSSImage, image } from '../image';\nimport { Context } from '../../../core/context';\nimport { at } from '../../../core/util';\n\ninterface ImageSetCandidate {\n    imageToken: CSSValue;\n    resolution: number;\n}\n\nconst parseResolution = (token: CSSValue | undefined): number => {\n    if (!token) return 1;\n    if (isDimensionToken(token)) {\n        // Chrome serialises computed values with the dppx unit; `x` is the\n        // authoring alias for the same dimension.\n        if (token.unit === 'dppx' || token.unit === 'x') return token.number;\n    }\n    if (isNumberToken(token)) {\n        return token.number; // unitless numbers mean `x` multiples\n    }\n    return 1;\n};\n\n/**\n * image-set(url(a.png) 1x, url(b.png) 2x)\n *\n * Browsers keep image-set in the computed value, so the candidate matching\n * the current devicePixelRatio is selected here: the smallest resolution >=\n * DPR, falling back to the largest candidate below it.\n */\nexport const imageSet = (context: Context, tokens: CSSValue[]): ICSSImage => {\n    const args = parseFunctionArgs(tokens);\n    const dpr = context.config.window.devicePixelRatio || 1;\n\n    const candidates: ImageSetCandidate[] = [];\n    for (const arg of args) {\n        const imageToken = arg.find((t) => t.type === TokenType.URL_TOKEN || t.type === TokenType.FUNCTION);\n        if (!imageToken) continue;\n        const resolutionToken = arg.find((t) => isDimensionToken(t) || isNumberToken(t));\n        candidates.push({ imageToken, resolution: parseResolution(resolutionToken) });\n    }\n    if (candidates.length === 0) {\n        throw new Error('image-set() requires at least one image candidate');\n    }\n\n    const satisfying = candidates\n        .filter((candidate) => candidate.resolution >= dpr)\n        .sort((a, b) => a.resolution - b.resolution);\n    // Nothing satisfies the DPR: use the largest candidate (upscaled).\n    const chosen = at(\n        satisfying.length > 0 ? satisfying : candidates.slice().sort((a, b) => b.resolution - a.resolution),\n        0\n    );\n\n    return image.parse(context, chosen.imageToken);\n};\n","import { CSSValue } from '../syntax/parser';\nimport { TokenType } from '../syntax/tokenizer';\nimport { Color } from './color';\nimport { linearGradient } from './functions/linear-gradient';\nimport { prefixLinearGradient } from './functions/-prefix-linear-gradient';\nimport { ITypeDescriptor } from '../type-descriptor';\nimport { LengthPercentage } from './length-percentage';\nimport { webkitGradient } from './functions/-webkit-gradient';\nimport { radialGradient } from './functions/radial-gradient';\nimport { prefixRadialGradient } from './functions/-prefix-radial-gradient';\nimport { repeatingLinearGradient } from './functions/repeating-linear-gradient';\nimport { repeatingRadialGradient } from './functions/repeating-radial-gradient';\nimport { conicGradient, repeatingConicGradient } from './functions/conic-gradient';\nimport { imageSet } from './functions/image-set';\nimport { Context } from '../../core/context';\n\nexport const enum CSSImageType {\n    URL,\n    LINEAR_GRADIENT,\n    RADIAL_GRADIENT,\n    REPEATING_LINEAR_GRADIENT,\n    REPEATING_RADIAL_GRADIENT,\n    CONIC_GRADIENT,\n    REPEATING_CONIC_GRADIENT\n}\n\nexport const isLinearGradient = (background: ICSSImage): background is CSSLinearGradientImage => {\n    return background.type === CSSImageType.LINEAR_GRADIENT;\n};\n\nexport const isRadialGradient = (background: ICSSImage): background is CSSRadialGradientImage => {\n    return background.type === CSSImageType.RADIAL_GRADIENT;\n};\n\nexport const isRepeatingLinearGradient = (background: ICSSImage): background is CSSLinearGradientImage => {\n    return background.type === CSSImageType.REPEATING_LINEAR_GRADIENT;\n};\n\nexport const isRepeatingRadialGradient = (background: ICSSImage): background is CSSRadialGradientImage => {\n    return background.type === CSSImageType.REPEATING_RADIAL_GRADIENT;\n};\n\nexport const isConicGradient = (background: ICSSImage): background is CSSConicGradientImage => {\n    return background.type === CSSImageType.CONIC_GRADIENT;\n};\n\nexport const isRepeatingConicGradient = (background: ICSSImage): background is CSSConicGradientImage => {\n    return background.type === CSSImageType.REPEATING_CONIC_GRADIENT;\n};\n\nexport interface UnprocessedGradientColorStop {\n    color: Color;\n    stop: LengthPercentage | null;\n}\n\nexport interface GradientColorStop {\n    color: Color;\n    stop: number;\n}\n\nexport interface ICSSImage {\n    type: CSSImageType;\n}\n\nexport interface CSSURLImage extends ICSSImage {\n    url: string;\n    type: CSSImageType.URL;\n}\n\n// interface ICSSGeneratedImage extends ICSSImage {}\n\nexport type GradientCorner = [LengthPercentage, LengthPercentage];\n\ninterface ICSSGradientImage extends ICSSImage {\n    stops: UnprocessedGradientColorStop[];\n}\n\nexport interface CSSLinearGradientImage extends ICSSGradientImage {\n    angle: number | GradientCorner;\n    type: CSSImageType.LINEAR_GRADIENT | CSSImageType.REPEATING_LINEAR_GRADIENT;\n}\n\nexport const enum CSSRadialShape {\n    CIRCLE,\n    ELLIPSE\n}\n\nexport const enum CSSRadialExtent {\n    CLOSEST_SIDE,\n    FARTHEST_SIDE,\n    CLOSEST_CORNER,\n    FARTHEST_CORNER\n}\n\nexport type CSSRadialSize = CSSRadialExtent | LengthPercentage[];\n\nexport interface CSSRadialGradientImage extends ICSSGradientImage {\n    type: CSSImageType.RADIAL_GRADIENT | CSSImageType.REPEATING_RADIAL_GRADIENT;\n    shape: CSSRadialShape;\n    size: CSSRadialSize;\n    position: LengthPercentage[];\n}\n\n/**\n * conic-gradient( [ from <angle> ]? [ at <position> ]?, <color-stop-list> )\n * `angle` is the `from` angle in radians, measured clockwise from 12 o'clock.\n */\nexport interface CSSConicGradientImage extends ICSSGradientImage {\n    type: CSSImageType.CONIC_GRADIENT | CSSImageType.REPEATING_CONIC_GRADIENT;\n    angle: number;\n    position: LengthPercentage[];\n}\n\nexport const image: ITypeDescriptor<ICSSImage> = {\n    name: 'image',\n    parse: (context: Context, value: CSSValue): ICSSImage => {\n        if (value.type === TokenType.URL_TOKEN) {\n            const image: CSSURLImage = { url: value.value, type: CSSImageType.URL };\n            context.cache.addImage(value.value);\n            return image;\n        }\n\n        if (value.type === TokenType.FUNCTION) {\n            const imageFunction = SUPPORTED_IMAGE_FUNCTIONS[value.name];\n            if (typeof imageFunction === 'undefined') {\n                throw new Error(`Attempting to parse an unsupported image function \"${value.name}\"`);\n            }\n            return imageFunction(context, value.values);\n        }\n\n        throw new Error(`Unsupported image type ${value.type}`);\n    }\n};\n\nexport function isSupportedImage(value: CSSValue): boolean {\n    return (\n        !(value.type === TokenType.IDENT_TOKEN && value.value === 'none') &&\n        (value.type !== TokenType.FUNCTION || !!SUPPORTED_IMAGE_FUNCTIONS[value.name])\n    );\n}\n\nconst SUPPORTED_IMAGE_FUNCTIONS: Record<string, (context: Context, args: CSSValue[]) => ICSSImage> = {\n    'linear-gradient': linearGradient,\n    '-moz-linear-gradient': prefixLinearGradient,\n    '-ms-linear-gradient': prefixLinearGradient,\n    '-o-linear-gradient': prefixLinearGradient,\n    '-webkit-linear-gradient': prefixLinearGradient,\n    'radial-gradient': radialGradient,\n    '-moz-radial-gradient': prefixRadialGradient,\n    '-ms-radial-gradient': prefixRadialGradient,\n    '-o-radial-gradient': prefixRadialGradient,\n    '-webkit-radial-gradient': prefixRadialGradient,\n    '-webkit-gradient': webkitGradient,\n    'repeating-linear-gradient': repeatingLinearGradient,\n    '-webkit-repeating-linear-gradient': repeatingLinearGradient,\n    '-moz-repeating-linear-gradient': repeatingLinearGradient,\n    '-ms-repeating-linear-gradient': repeatingLinearGradient,\n    '-o-repeating-linear-gradient': repeatingLinearGradient,\n    'repeating-radial-gradient': repeatingRadialGradient,\n    '-webkit-repeating-radial-gradient': repeatingRadialGradient,\n    '-moz-repeating-radial-gradient': repeatingRadialGradient,\n    'conic-gradient': conicGradient,\n    '-webkit-conic-gradient': conicGradient,\n    '-moz-conic-gradient': conicGradient,\n    'repeating-conic-gradient': repeatingConicGradient,\n    '-webkit-repeating-conic-gradient': repeatingConicGradient,\n    '-moz-repeating-conic-gradient': repeatingConicGradient,\n    'image-set': imageSet,\n    '-webkit-image-set': imageSet\n};\n","import { TokenType } from '../syntax/tokenizer';\nimport { ICSSImage, image, isSupportedImage } from '../types/image';\nimport { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, nonFunctionArgSeparator } from '../syntax/parser';\nimport { Context } from '../../core/context';\n\nexport const backgroundImage: IPropertyListDescriptor<ICSSImage[]> = {\n    name: 'background-image',\n    initialValue: 'none',\n    type: PropertyDescriptorParsingType.LIST,\n    prefix: false,\n    skipCache: true,\n    parse: (context: Context, tokens: CSSValue[]) => {\n        if (tokens.length === 0) {\n            return [];\n        }\n\n        const first = tokens[0];\n\n        if (first && first.type === TokenType.IDENT_TOKEN && first.value === 'none') {\n            return [];\n        }\n\n        return tokens\n            .filter((value) => nonFunctionArgSeparator(value) && isSupportedImage(value))\n            .map((value) => image.parse(context, value));\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken } from '../syntax/parser';\nimport { Context } from '../../core/context';\n\nexport const enum BACKGROUND_ORIGIN {\n    BORDER_BOX = 0,\n    PADDING_BOX = 1,\n    CONTENT_BOX = 2\n}\n\nexport type BackgroundOrigin = BACKGROUND_ORIGIN[];\n\nexport const backgroundOrigin: IPropertyListDescriptor<BackgroundOrigin> = {\n    name: 'background-origin',\n    initialValue: 'border-box',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): BackgroundOrigin => {\n        return tokens.map((token) => {\n            if (isIdentToken(token)) {\n                switch (token.value) {\n                    case 'padding-box':\n                        return BACKGROUND_ORIGIN.PADDING_BOX;\n                    case 'content-box':\n                        return BACKGROUND_ORIGIN.CONTENT_BOX;\n                }\n            }\n            return BACKGROUND_ORIGIN.BORDER_BOX;\n        });\n    }\n};\n","import { PropertyDescriptorParsingType, IPropertyListDescriptor } from '../property-descriptor';\nimport { CSSValue, parseFunctionArgs } from '../syntax/parser';\nimport {\n    parseOptionalCalcOrLength,\n    LengthPercentageTuple,\n    parseLengthPercentageTuple\n} from '../types/length-percentage';\nimport { Context } from '../../core/context';\nexport type BackgroundPosition = BackgroundImagePosition[];\n\nexport type BackgroundImagePosition = LengthPercentageTuple;\n\nexport const backgroundPosition: IPropertyListDescriptor<BackgroundPosition> = {\n    name: 'background-position',\n    initialValue: '0% 0%',\n    type: PropertyDescriptorParsingType.LIST,\n    prefix: false,\n    parse: (_context: Context, tokens: CSSValue[]): BackgroundPosition => {\n        return parseFunctionArgs(tokens)\n            .map((values: CSSValue[]) => {\n                // Convert calc() to length-percentage tokens, keep other length-percentage as is\n                return values.map(parseOptionalCalcOrLength).filter((v): v is NonNullable<typeof v> => v !== null);\n            })\n            .map(parseLengthPercentageTuple);\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken, parseFunctionArgs } from '../syntax/parser';\nimport { Context } from '../../core/context';\nexport type BackgroundRepeat = BACKGROUND_REPEAT[];\n\nexport const enum BACKGROUND_REPEAT {\n    REPEAT = 0,\n    NO_REPEAT = 1,\n    REPEAT_X = 2,\n    REPEAT_Y = 3\n}\n\nexport const backgroundRepeat: IPropertyListDescriptor<BackgroundRepeat> = {\n    name: 'background-repeat',\n    initialValue: 'repeat',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): BackgroundRepeat => {\n        return parseFunctionArgs(tokens)\n            .map((values) =>\n                values\n                    .filter(isIdentToken)\n                    .map((token) => token.value)\n                    .join(' ')\n            )\n            .map(parseBackgroundRepeat);\n    }\n};\n\nconst parseBackgroundRepeat = (value: string): BACKGROUND_REPEAT => {\n    switch (value) {\n        case 'no-repeat':\n            return BACKGROUND_REPEAT.NO_REPEAT;\n        case 'repeat-x':\n        case 'repeat no-repeat':\n            return BACKGROUND_REPEAT.REPEAT_X;\n        case 'repeat-y':\n        case 'no-repeat repeat':\n            return BACKGROUND_REPEAT.REPEAT_Y;\n        case 'repeat':\n        default:\n            return BACKGROUND_REPEAT.REPEAT;\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken, parseFunctionArgs } from '../syntax/parser';\nimport { isLengthPercentage, parseOptionalCalcOrLength, LengthPercentage } from '../types/length-percentage';\nimport { StringValueToken } from '../syntax/tokenizer';\nimport { Context } from '../../core/context';\n\nexport enum BACKGROUND_SIZE {\n    AUTO = 'auto',\n    CONTAIN = 'contain',\n    COVER = 'cover'\n}\n\nexport type BackgroundSizeInfo = LengthPercentage | StringValueToken;\nexport type BackgroundSize = BackgroundSizeInfo[][];\n\nexport const backgroundSize: IPropertyListDescriptor<BackgroundSize> = {\n    name: 'background-size',\n    initialValue: '0',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): BackgroundSize => {\n        return parseFunctionArgs(tokens).map((values) =>\n            values\n                .map((value) => (isBackgroundSizeInfoToken(value) ? value : parseOptionalCalcOrLength(value)))\n                .filter((v): v is NonNullable<typeof v> => v !== null)\n        );\n    }\n};\n\nconst isBackgroundSizeInfoToken = (value: CSSValue): value is BackgroundSizeInfo =>\n    isIdentToken(value) || isLengthPercentage(value);\n","import { IPropertyTypeValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nconst borderColorForSide = (side: string): IPropertyTypeValueDescriptor => ({\n    name: `border-${side}-color`,\n    initialValue: 'transparent',\n    prefix: false,\n    type: PropertyDescriptorParsingType.TYPE_VALUE,\n    format: 'color'\n});\n\nexport const borderTopColor: IPropertyTypeValueDescriptor = borderColorForSide('top');\nexport const borderRightColor: IPropertyTypeValueDescriptor = borderColorForSide('right');\nexport const borderBottomColor: IPropertyTypeValueDescriptor = borderColorForSide('bottom');\nexport const borderLeftColor: IPropertyTypeValueDescriptor = borderColorForSide('left');\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue } from '../syntax/parser';\nimport { isLengthPercentage, LengthPercentageTuple, parseLengthPercentageTuple } from '../types/length-percentage';\nimport { Context } from '../../core/context';\nexport type BorderRadius = LengthPercentageTuple;\n\nconst borderRadiusForSide = (side: string): IPropertyListDescriptor<BorderRadius> => ({\n    name: `border-${side}-radius`,\n    initialValue: '0 0',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): BorderRadius =>\n        parseLengthPercentageTuple(tokens.filter(isLengthPercentage))\n});\n\nexport const borderTopLeftRadius: IPropertyListDescriptor<BorderRadius> = borderRadiusForSide('top-left');\nexport const borderTopRightRadius: IPropertyListDescriptor<BorderRadius> = borderRadiusForSide('top-right');\nexport const borderBottomRightRadius: IPropertyListDescriptor<BorderRadius> = borderRadiusForSide('bottom-right');\nexport const borderBottomLeftRadius: IPropertyListDescriptor<BorderRadius> = borderRadiusForSide('bottom-left');\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\nexport const enum BORDER_STYLE {\n    NONE = 0,\n    SOLID = 1,\n    DASHED = 2,\n    DOTTED = 3,\n    DOUBLE = 4\n}\n\nconst borderStyleForSide = (side: string): IPropertyIdentValueDescriptor<BORDER_STYLE> => ({\n    name: `border-${side}-style`,\n    initialValue: 'solid',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, style: string): BORDER_STYLE => {\n        switch (style) {\n            case 'none':\n                return BORDER_STYLE.NONE;\n            case 'dashed':\n                return BORDER_STYLE.DASHED;\n            case 'dotted':\n                return BORDER_STYLE.DOTTED;\n            case 'double':\n                return BORDER_STYLE.DOUBLE;\n        }\n        return BORDER_STYLE.SOLID;\n    }\n});\n\nexport const borderTopStyle: IPropertyIdentValueDescriptor<BORDER_STYLE> = borderStyleForSide('top');\nexport const borderRightStyle: IPropertyIdentValueDescriptor<BORDER_STYLE> = borderStyleForSide('right');\nexport const borderBottomStyle: IPropertyIdentValueDescriptor<BORDER_STYLE> = borderStyleForSide('bottom');\nexport const borderLeftStyle: IPropertyIdentValueDescriptor<BORDER_STYLE> = borderStyleForSide('left');\n","import { IPropertyValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isDimensionToken } from '../syntax/parser';\nimport { Context } from '../../core/context';\nconst borderWidthForSide = (side: string): IPropertyValueDescriptor<number> => ({\n    name: `border-${side}-width`,\n    initialValue: '0',\n    type: PropertyDescriptorParsingType.VALUE,\n    prefix: false,\n    parse: (_context: Context, token: CSSValue): number => {\n        if (isDimensionToken(token)) {\n            return token.number;\n        }\n        return 0;\n    }\n});\n\nexport const borderTopWidth: IPropertyValueDescriptor<number> = borderWidthForSide('top');\nexport const borderRightWidth: IPropertyValueDescriptor<number> = borderWidthForSide('right');\nexport const borderBottomWidth: IPropertyValueDescriptor<number> = borderWidthForSide('bottom');\nexport const borderLeftWidth: IPropertyValueDescriptor<number> = borderWidthForSide('left');\n","import { IPropertyValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { at } from '../../core/util';\nimport { CSSValue, isIdentToken, isIdentWithValue, nonWhiteSpace, parseFunctionArgs } from '../syntax/parser';\nimport { StringValueToken, TokenType } from '../syntax/tokenizer';\nimport {\n    LengthPercentage,\n    FIFTY_PERCENT,\n    HUNDRED_PERCENT,\n    ZERO_LENGTH,\n    isLengthPercentage\n} from '../types/length-percentage';\nimport { Context } from '../../core/context';\n\nexport const enum CLIP_PATH_TYPE {\n    NONE = 0,\n    INSET = 1,\n    CIRCLE = 2,\n    ELLIPSE = 3,\n    POLYGON = 4,\n    PATH = 5,\n    XYWH = 6\n}\n\n/** Radius keyword or length-percentage for circle/ellipse. */\nexport type ShapeRadius = LengthPercentage | 'closest-side' | 'farthest-side';\n\nexport interface NoneClipPath {\n    type: CLIP_PATH_TYPE.NONE;\n}\n\n/**\n * inset(top right bottom left [ round <border-radius> ]?)\n * Amounts to cut from each side of the reference box.\n */\nexport interface InsetClipPath {\n    type: CLIP_PATH_TYPE.INSET;\n    top: LengthPercentage;\n    right: LengthPercentage;\n    bottom: LengthPercentage;\n    left: LengthPercentage;\n}\n\n/**\n * circle( [ <shape-radius> ]? [ at <position> ]? )\n */\nexport interface CircleClipPath {\n    type: CLIP_PATH_TYPE.CIRCLE;\n    radius: ShapeRadius;\n    cx: LengthPercentage;\n    cy: LengthPercentage;\n}\n\n/**\n * ellipse( [ <shape-radius>{2} ]? [ at <position> ]? )\n */\nexport interface EllipseClipPath {\n    type: CLIP_PATH_TYPE.ELLIPSE;\n    rx: ShapeRadius;\n    ry: ShapeRadius;\n    cx: LengthPercentage;\n    cy: LengthPercentage;\n}\n\n/**\n * polygon( [ <fill-rule>, ]? [ <length-percentage> <length-percentage> ]# )\n */\nexport interface PolygonClipPath {\n    type: CLIP_PATH_TYPE.POLYGON;\n    points: [LengthPercentage, LengthPercentage][];\n}\n\n/**\n * path( [ <fill-rule>, ]? <string> )\n * The string contains SVG path data in the element's local coordinate space.\n */\nexport interface PathClipPath {\n    type: CLIP_PATH_TYPE.PATH;\n    d: string;\n}\n\n/**\n * xywh( <length-percentage>{2} <length-percentage>{2} [ round <'border-radius'> ]? )\n * A rectangle at (x, y) with the given width and height, from the top-left\n * corner of the reference box. The optional round clause is parsed but\n * ignored (same as inset).\n */\nexport interface XywhClipPath {\n    type: CLIP_PATH_TYPE.XYWH;\n    x: LengthPercentage;\n    y: LengthPercentage;\n    width: LengthPercentage;\n    height: LengthPercentage;\n}\n\nexport type ClipPathValue =\n    NoneClipPath | InsetClipPath | CircleClipPath | EllipseClipPath | PolygonClipPath | PathClipPath | XywhClipPath;\n\nconst NONE: NoneClipPath = { type: CLIP_PATH_TYPE.NONE };\n\n/**\n * Parse a shape-radius token: <length-percentage> | closest-side | farthest-side.\n * Defaults to 'closest-side' when no tokens are provided.\n */\nconst parseShapeRadius = (tokens: CSSValue[]): ShapeRadius => {\n    const [first] = tokens;\n    if (!first) return 'closest-side';\n    if (isIdentToken(first)) {\n        // Any unrecognised keyword (e.g. 'closest-corner') intentionally falls back to\n        // 'closest-side' as the CSS spec requires unknown values to be treated as invalid\n        // and the initial value of <shape-radius> is 'closest-side'.\n        return first.value === 'farthest-side' ? 'farthest-side' : 'closest-side';\n    }\n    return isLengthPercentage(first) ? first : 'closest-side';\n};\n\n/**\n * Parse a CSS <position> as (cx, cy), each as a LengthPercentage.\n *\n * Supports the **1–2 value** subset of the CSS `<position>` syntax.\n * The 4-value form (`at left 10px top 20px`) is not supported and will be\n * parsed on a best-effort basis.\n *\n * Axis assignment rules:\n *   - `left` / `right`  → x-axis (cx)\n *   - `top`  / `bottom` → y-axis (cy)\n *   - `center` or a <length-percentage> → fills the first unset axis, in order\n *\n * Examples:\n *   \"at left\"        → cx=0,    cy=50%   (left is x; y defaults to center)\n *   \"at top\"         → cx=50%,  cy=0     (top is y; x defaults to center)\n *   \"at center 30%\"  → cx=50%,  cy=30%\n *   \"at 30% center\"  → cx=30%,  cy=50%\n *   \"at left top\"    → cx=0,    cy=0\n *   \"at top left\"    → cx=0,    cy=0     (keyword order is irrelevant)\n *\n * Unset axes fall back to 50%.\n */\nconst parsePosition = (tokens: CSSValue[]): { cx: LengthPercentage; cy: LengthPercentage } => {\n    let cx: LengthPercentage | null = null;\n    let cy: LengthPercentage | null = null;\n\n    for (const token of tokens) {\n        if (isIdentToken(token)) {\n            switch (token.value) {\n                case 'left':\n                    cx = ZERO_LENGTH;\n                    break;\n                case 'right':\n                    cx = HUNDRED_PERCENT;\n                    break;\n                case 'top':\n                    cy = ZERO_LENGTH;\n                    break;\n                case 'bottom':\n                    cy = HUNDRED_PERCENT;\n                    break;\n                case 'center':\n                    // `center` fills whichever axis has not yet been claimed.\n                    if (cx === null) cx = FIFTY_PERCENT;\n                    else if (cy === null) cy = FIFTY_PERCENT;\n                    break;\n            }\n        } else if (isLengthPercentage(token)) {\n            // Length-percentages are assigned in source order.\n            if (cx === null) cx = token;\n            else if (cy === null) cy = token;\n        }\n    }\n\n    return { cx: cx ?? FIFTY_PERCENT, cy: cy ?? FIFTY_PERCENT };\n};\n\n/**\n * inset( <length-percentage>{1,4} [ round <'border-radius'> ]? )\n * The 1-4 shorthand follows the same expansion as margin/padding:\n *   1 value  → all four sides\n *   2 values → top/bottom | left/right\n *   3 values → top | left/right | bottom\n *   4 values → top | right | bottom | left\n * The optional `round` clause (border-radius) is parsed but ignored.\n */\nconst parseInset = (values: CSSValue[]): InsetClipPath => {\n    const lengths: LengthPercentage[] = [];\n    for (const token of values) {\n        if (token.type === TokenType.WHITESPACE_TOKEN) continue;\n        if (isIdentToken(token) && token.value === 'round') break;\n        if (isLengthPercentage(token)) lengths.push(token);\n    }\n    const v0 = lengths[0] ?? ZERO_LENGTH;\n    const v1 = lengths[1] ?? v0;\n    const v2 = lengths[2] ?? v0;\n    const v3 = lengths[3] ?? v1;\n    return { type: CLIP_PATH_TYPE.INSET, top: v0, right: v1, bottom: v2, left: v3 };\n};\n\n/**\n * circle( [ <shape-radius> ]? [ at <position> ]? )\n */\nconst parseCircle = (values: CSSValue[]): CircleClipPath => {\n    const nonWs = values.filter(nonWhiteSpace);\n    const atIdx = nonWs.findIndex((t) => isIdentWithValue(t, 'at'));\n    const radiusTokens = atIdx === -1 ? nonWs : nonWs.slice(0, atIdx);\n    const posTokens = atIdx === -1 ? [] : nonWs.slice(atIdx + 1);\n    return {\n        type: CLIP_PATH_TYPE.CIRCLE,\n        radius: parseShapeRadius(radiusTokens),\n        ...parsePosition(posTokens)\n    };\n};\n\n/**\n * ellipse( [ <shape-radius>{2} ]? [ at <position> ]? )\n */\nconst parseEllipse = (values: CSSValue[]): EllipseClipPath => {\n    const nonWs = values.filter(nonWhiteSpace);\n    const atIdx = nonWs.findIndex((t) => isIdentWithValue(t, 'at'));\n    const radiusTokens = atIdx === -1 ? nonWs : nonWs.slice(0, atIdx);\n    const posTokens = atIdx === -1 ? [] : nonWs.slice(atIdx + 1);\n    return {\n        type: CLIP_PATH_TYPE.ELLIPSE,\n        rx: parseShapeRadius(radiusTokens.slice(0, 1)),\n        ry: parseShapeRadius(radiusTokens.slice(1, 2)),\n        ...parsePosition(posTokens)\n    };\n};\n\n/**\n * polygon( [ <fill-rule>, ]? [ <length-percentage> <length-percentage> ]# )\n * Each comma-separated group defines one vertex (x y).\n * A leading fill-rule keyword (nonzero/evenodd) is skipped.\n */\nconst parsePolygon = (values: CSSValue[]): PolygonClipPath => {\n    const args = parseFunctionArgs(values);\n    const points: [LengthPercentage, LengthPercentage][] = [];\n    for (const arg of args) {\n        if (arg.length === 1 && arg[0] && isIdentToken(arg[0])) continue; // skip fill-rule\n        const lengths = arg.filter(isLengthPercentage);\n        if (lengths.length >= 2) {\n            points.push([at(lengths, 0), at(lengths, 1)]);\n        }\n    }\n    return { type: CLIP_PATH_TYPE.POLYGON, points };\n};\n\n/**\n * path( [ <fill-rule>, ]? <string> )\n * The string value is the SVG path data (coordinates in the element's local space).\n */\nconst parsePath = (values: CSSValue[]): PathClipPath | NoneClipPath => {\n    const stringToken = values.find((t) => t.type === TokenType.STRING_TOKEN) as StringValueToken | undefined;\n    if (!stringToken) return NONE;\n    return { type: CLIP_PATH_TYPE.PATH, d: stringToken.value };\n};\n\n/**\n * xywh( <length-percentage>{2} <length-percentage>{2} [ round <'border-radius'> ]? )\n * Values are x, y, width, height in that order. All four are required for a\n * valid shape; anything else falls back to NONE.\n */\nconst parseXywh = (values: CSSValue[]): XywhClipPath | NoneClipPath => {\n    const lengths: LengthPercentage[] = [];\n    for (const token of values) {\n        if (token.type === TokenType.WHITESPACE_TOKEN) continue;\n        if (isIdentToken(token) && token.value === 'round') break;\n        if (isLengthPercentage(token)) lengths.push(token);\n    }\n    if (lengths.length < 4) return NONE;\n    return {\n        type: CLIP_PATH_TYPE.XYWH,\n        x: at(lengths, 0),\n        y: at(lengths, 1),\n        width: at(lengths, 2),\n        height: at(lengths, 3)\n    };\n};\n\n/**\n * rect( [ <length-percentage> | auto ]{4} [ round <'border-radius'> ]? )\n * Distances from the top/right/bottom/left edges — the same shape as inset,\n * except `auto` means zero inset for top/left and full extent for\n * right/bottom. Expressed as an InsetClipPath, so it reuses the inset\n * renderer untouched.\n */\nconst parseRect = (values: CSSValue[]): InsetClipPath | NoneClipPath => {\n    const lengths: (LengthPercentage | 'auto')[] = [];\n    for (const token of values) {\n        if (token.type === TokenType.WHITESPACE_TOKEN) continue;\n        if (isIdentToken(token)) {\n            if (token.value === 'round') break;\n            if (token.value === 'auto') {\n                lengths.push('auto');\n                continue;\n            }\n            return NONE;\n        }\n        if (isLengthPercentage(token)) lengths.push(token);\n    }\n    if (lengths.length !== 4) return NONE;\n\n    // auto resolves per-edge at parse time using absolute percentages.\n    const resolve = (value: LengthPercentage | 'auto', edge: 'top' | 'right' | 'bottom' | 'left'): LengthPercentage => {\n        if (value !== 'auto') return value;\n        return edge === 'top' || edge === 'left' ? ZERO_LENGTH : HUNDRED_PERCENT;\n    };\n    return {\n        type: CLIP_PATH_TYPE.INSET,\n        top: resolve(at(lengths, 0), 'top'),\n        right: resolve(at(lengths, 1), 'right'),\n        bottom: resolve(at(lengths, 2), 'bottom'),\n        left: resolve(at(lengths, 3), 'left')\n    };\n};\n\nexport const clipPath: IPropertyValueDescriptor<ClipPathValue> = {\n    name: 'clip-path',\n    initialValue: 'none',\n    prefix: false,\n    type: PropertyDescriptorParsingType.VALUE,\n    parse: (_context: Context, token: CSSValue): ClipPathValue => {\n        if (isIdentToken(token) && token.value === 'none') {\n            return NONE;\n        }\n\n        if (token.type === TokenType.FUNCTION) {\n            switch (token.name) {\n                case 'inset':\n                    return parseInset(token.values);\n                case 'circle':\n                    return parseCircle(token.values);\n                case 'ellipse':\n                    return parseEllipse(token.values);\n                case 'polygon':\n                    return parsePolygon(token.values);\n                case 'path':\n                    return parsePath(token.values);\n                case 'xywh':\n                    return parseXywh(token.values);\n                case 'rect':\n                    return parseRect(token.values);\n            }\n        }\n\n        return NONE;\n    }\n};\n","import { IPropertyTypeValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\n\nexport const color: IPropertyTypeValueDescriptor = {\n    name: `color`,\n    initialValue: 'transparent',\n    prefix: false,\n    type: PropertyDescriptorParsingType.TYPE_VALUE,\n    format: 'color'\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\n\nexport const enum DIRECTION {\n    LTR = 0,\n    RTL = 1\n}\n\nexport const direction: IPropertyIdentValueDescriptor<DIRECTION> = {\n    name: 'direction',\n    initialValue: 'ltr',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, direction: string) => {\n        switch (direction) {\n            case 'rtl':\n                return DIRECTION.RTL;\n            case 'ltr':\n            default:\n                return DIRECTION.LTR;\n        }\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue } from '../syntax/parser';\nimport { TokenType } from '../syntax/tokenizer';\nimport { Context } from '../../core/context';\n\nexport type FONT_FAMILY = string;\n\nexport type FontFamily = FONT_FAMILY[];\n\nexport const fontFamily: IPropertyListDescriptor<FontFamily> = {\n    name: `font-family`,\n    initialValue: '',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]) => {\n        const accumulator: string[] = [];\n        const results: string[] = [];\n        const quoted: boolean[] = [];\n        let isQuoted = false;\n        tokens.forEach((token) => {\n            switch (token.type) {\n                case TokenType.IDENT_TOKEN:\n                    accumulator.push(token.value);\n                    break;\n                case TokenType.STRING_TOKEN:\n                    isQuoted = true;\n                    accumulator.push(token.value);\n                    break;\n                case TokenType.NUMBER_TOKEN:\n                    accumulator.push(token.number.toString());\n                    break;\n                case TokenType.COMMA_TOKEN:\n                    results.push(accumulator.join(' '));\n                    quoted.push(isQuoted);\n                    isQuoted = false;\n                    accumulator.length = 0;\n                    break;\n            }\n        });\n        if (accumulator.length) {\n            results.push(accumulator.join(' '));\n            quoted.push(isQuoted);\n        }\n        return results.map((result, index) =>\n            quoted[index] || result.indexOf(' ') !== -1\n                ? `'${result\n                      .replace(/\\\\/g, '\\\\\\\\')\n                      .replace(/'/g, \"\\\\'\")\n                      .replace(/\\n/g, '\\\\a ')\n                      .replace(/\\r/g, '\\\\d ')\n                      .replace(/\\f/g, '\\\\c ')}'`\n                : result\n        );\n    }\n};\n","import { IPropertyTypeValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\n\nexport const fontSize: IPropertyTypeValueDescriptor = {\n    name: `font-size`,\n    initialValue: '0',\n    prefix: false,\n    type: PropertyDescriptorParsingType.TYPE_VALUE,\n    format: 'length'\n};\n","import { IPropertyValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue } from '../syntax/parser';\nimport { TokenType } from '../syntax/tokenizer';\nimport { Context } from '../../core/context';\nexport const letterSpacing: IPropertyValueDescriptor<number> = {\n    name: 'letter-spacing',\n    initialValue: '0',\n    prefix: false,\n    type: PropertyDescriptorParsingType.VALUE,\n    parse: (_context: Context, token: CSSValue) => {\n        if (token.type === TokenType.IDENT_TOKEN && token.value === 'normal') {\n            return 0;\n        }\n\n        if (token.type === TokenType.NUMBER_TOKEN) {\n            return token.number;\n        }\n\n        if (token.type === TokenType.DIMENSION_TOKEN) {\n            return token.number;\n        }\n\n        return 0;\n    }\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\nexport enum LINE_BREAK {\n    NORMAL = 'normal',\n    STRICT = 'strict'\n}\n\nexport const lineBreak: IPropertyIdentValueDescriptor<LINE_BREAK> = {\n    name: 'line-break',\n    initialValue: 'normal',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, lineBreak: string): LINE_BREAK => {\n        switch (lineBreak) {\n            case 'strict':\n                return LINE_BREAK.STRICT;\n            case 'normal':\n            default:\n                return LINE_BREAK.NORMAL;\n        }\n    }\n};\n","import { IPropertyTokenValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken } from '../syntax/parser';\nimport { TokenType } from '../syntax/tokenizer';\nimport { getAbsoluteValue, isLengthPercentage } from '../types/length-percentage';\nexport const lineHeight: IPropertyTokenValueDescriptor = {\n    name: 'line-height',\n    initialValue: 'normal',\n    prefix: false,\n    type: PropertyDescriptorParsingType.TOKEN_VALUE\n};\n\nexport const computeLineHeight = (token: CSSValue, fontSize: number): number => {\n    if (isIdentToken(token) && token.value === 'normal') {\n        return 1.2 * fontSize;\n    } else if (token.type === TokenType.NUMBER_TOKEN) {\n        return fontSize * token.number;\n    } else if (isLengthPercentage(token)) {\n        return getAbsoluteValue(token, fontSize);\n    }\n\n    return fontSize;\n};\n","import { TokenType } from '../syntax/tokenizer';\nimport { ICSSImage, image, isSupportedImage } from '../types/image';\nimport { IPropertyValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue } from '../syntax/parser';\nimport { Context } from '../../core/context';\n\nexport const listStyleImage: IPropertyValueDescriptor<ICSSImage | null> = {\n    name: 'list-style-image',\n    initialValue: 'none',\n    type: PropertyDescriptorParsingType.VALUE,\n    prefix: false,\n    skipCache: true,\n    parse: (context: Context, token: CSSValue) => {\n        if (token.type === TokenType.IDENT_TOKEN && token.value === 'none') {\n            return null;\n        }\n\n        // image.parse throws on unsupported image functions (e.g.\n        // repeating-conic-gradient, cross-fade()), which would fail the whole\n        // capture. Skip the marker image instead, like background-image does.\n        if (!isSupportedImage(token)) {\n            return null;\n        }\n\n        return image.parse(context, token);\n    }\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\nexport const enum LIST_STYLE_POSITION {\n    INSIDE = 0,\n    OUTSIDE = 1\n}\n\nexport const listStylePosition: IPropertyIdentValueDescriptor<LIST_STYLE_POSITION> = {\n    name: 'list-style-position',\n    initialValue: 'outside',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, position: string) => {\n        switch (position) {\n            case 'inside':\n                return LIST_STYLE_POSITION.INSIDE;\n            case 'outside':\n            default:\n                return LIST_STYLE_POSITION.OUTSIDE;\n        }\n    }\n};\n","import { IPropertyTokenValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\n\nconst marginForSide = (side: string): IPropertyTokenValueDescriptor => ({\n    name: `margin-${side}`,\n    initialValue: '0',\n    prefix: false,\n    type: PropertyDescriptorParsingType.TOKEN_VALUE\n});\n\nexport const marginTop: IPropertyTokenValueDescriptor = marginForSide('top');\nexport const marginRight: IPropertyTokenValueDescriptor = marginForSide('right');\nexport const marginBottom: IPropertyTokenValueDescriptor = marginForSide('bottom');\nexport const marginLeft: IPropertyTokenValueDescriptor = marginForSide('left');\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\nexport const enum OVERFLOW_WRAP {\n    NORMAL = 'normal',\n    BREAK_WORD = 'break-word'\n}\n\nexport const overflowWrap: IPropertyIdentValueDescriptor<OVERFLOW_WRAP> = {\n    name: 'overflow-wrap',\n    initialValue: 'normal',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, overflow: string) => {\n        switch (overflow) {\n            case 'break-word':\n                return OVERFLOW_WRAP.BREAK_WORD;\n            case 'normal':\n            default:\n                return OVERFLOW_WRAP.NORMAL;\n        }\n    }\n};\n","import { IPropertyTypeValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\n\nconst paddingForSide = (side: string): IPropertyTypeValueDescriptor => ({\n    name: `padding-${side}`,\n    initialValue: '0',\n    prefix: false,\n    type: PropertyDescriptorParsingType.TYPE_VALUE,\n    format: 'length-percentage'\n});\n\nexport const paddingTop: IPropertyTypeValueDescriptor = paddingForSide('top');\nexport const paddingRight: IPropertyTypeValueDescriptor = paddingForSide('right');\nexport const paddingBottom: IPropertyTypeValueDescriptor = paddingForSide('bottom');\nexport const paddingLeft: IPropertyTypeValueDescriptor = paddingForSide('left');\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\nexport const enum TEXT_ALIGN {\n    LEFT = 0,\n    CENTER = 1,\n    RIGHT = 2\n}\n\nexport const textAlign: IPropertyIdentValueDescriptor<TEXT_ALIGN> = {\n    name: 'text-align',\n    initialValue: 'left',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, textAlign: string) => {\n        switch (textAlign) {\n            case 'right':\n                return TEXT_ALIGN.RIGHT;\n            case 'center':\n            case 'justify':\n                return TEXT_ALIGN.CENTER;\n            case 'left':\n            default:\n                return TEXT_ALIGN.LEFT;\n        }\n    }\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\nexport const enum POSITION {\n    STATIC = 0,\n    RELATIVE = 1,\n    ABSOLUTE = 2,\n    FIXED = 3,\n    STICKY = 4\n}\n\nexport const position: IPropertyIdentValueDescriptor<POSITION> = {\n    name: 'position',\n    initialValue: 'static',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, position: string) => {\n        switch (position) {\n            case 'relative':\n                return POSITION.RELATIVE;\n            case 'absolute':\n                return POSITION.ABSOLUTE;\n            case 'fixed':\n                return POSITION.FIXED;\n            case 'sticky':\n                return POSITION.STICKY;\n        }\n\n        return POSITION.STATIC;\n    }\n};\n","import { PropertyDescriptorParsingType, IPropertyListDescriptor } from '../property-descriptor';\nimport { at } from '../../core/util';\nimport { CSSValue, isIdentWithValue, parseFunctionArgs } from '../syntax/parser';\nimport { ZERO_LENGTH } from '../types/length-percentage';\nimport { TRANSPARENT_COLOR, color as colorType, type Color } from '../types/color';\nimport { isLength, Length } from '../types/length';\nimport { Context } from '../../core/context';\n\nexport type TextShadow = TextShadowItem[];\ninterface TextShadowItem {\n    color: Color;\n    offsetX: Length;\n    offsetY: Length;\n    blur: Length;\n}\n\nexport const textShadow: IPropertyListDescriptor<TextShadow> = {\n    name: 'text-shadow',\n    initialValue: 'none',\n    type: PropertyDescriptorParsingType.LIST,\n    prefix: false,\n    parse: (context: Context, tokens: CSSValue[]): TextShadow => {\n        if (tokens.length === 1 && isIdentWithValue(at(tokens, 0), 'none')) {\n            return [];\n        }\n\n        return parseFunctionArgs(tokens).map((values: CSSValue[]) => {\n            const shadow: TextShadowItem = {\n                color: TRANSPARENT_COLOR,\n                offsetX: ZERO_LENGTH,\n                offsetY: ZERO_LENGTH,\n                blur: ZERO_LENGTH\n            };\n            let c = 0;\n            for (let i = 0; i < values.length; i++) {\n                const token = values[i];\n                if (!token) continue;\n                if (isLength(token)) {\n                    if (c === 0) {\n                        shadow.offsetX = token;\n                    } else if (c === 1) {\n                        shadow.offsetY = token;\n                    } else {\n                        shadow.blur = token;\n                    }\n                    c++;\n                } else {\n                    shadow.color = colorType.parse(context, token);\n                }\n            }\n            return shadow;\n        });\n    }\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\nexport const enum TEXT_TRANSFORM {\n    NONE = 0,\n    LOWERCASE = 1,\n    UPPERCASE = 2,\n    CAPITALIZE = 3\n}\n\nexport const textTransform: IPropertyIdentValueDescriptor<TEXT_TRANSFORM> = {\n    name: 'text-transform',\n    initialValue: 'none',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, textTransform: string) => {\n        switch (textTransform) {\n            case 'uppercase':\n                return TEXT_TRANSFORM.UPPERCASE;\n            case 'lowercase':\n                return TEXT_TRANSFORM.LOWERCASE;\n            case 'capitalize':\n                return TEXT_TRANSFORM.CAPITALIZE;\n        }\n\n        return TEXT_TRANSFORM.NONE;\n    }\n};\n","import { IPropertyValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { at } from '../../core/util';\nimport { CSSValue } from '../syntax/parser';\nimport { NumberValueToken, TokenType } from '../syntax/tokenizer';\nimport { Context } from '../../core/context';\nimport { angle } from '../types/angle';\nexport type Matrix = [number, number, number, number, number, number];\nexport type Transform = Matrix | null;\n\nexport const transform: IPropertyValueDescriptor<Transform> = {\n    name: 'transform',\n    initialValue: 'none',\n    prefix: true,\n    type: PropertyDescriptorParsingType.VALUE,\n    parse: (_context: Context, token: CSSValue) => {\n        if (token.type === TokenType.IDENT_TOKEN && token.value === 'none') {\n            return null;\n        }\n\n        if (token.type === TokenType.FUNCTION) {\n            const transformFunction = SUPPORTED_TRANSFORM_FUNCTIONS[token.name];\n            if (typeof transformFunction === 'undefined') {\n                throw new Error(`Attempting to parse an unsupported transform function \"${token.name}\"`);\n            }\n            return transformFunction(_context, token.values);\n        }\n\n        return null;\n    }\n};\n\nconst matrix = (_context: Context, args: CSSValue[]): Transform => {\n    const values = args\n        .filter((arg): arg is NumberValueToken => arg.type === TokenType.NUMBER_TOKEN)\n        .map((arg) => arg.number);\n\n    return values.length === 6 ? (values as Matrix) : null;\n};\n\n// doesn't support 3D transforms at the moment\nconst matrix3d = (_context: Context, args: CSSValue[]): Transform => {\n    const values = args\n        .filter((arg): arg is NumberValueToken => arg.type === TokenType.NUMBER_TOKEN)\n        .map((arg) => arg.number);\n\n    if (values.length !== 16) {\n        return null;\n    }\n\n    // Row-major 3D matrix; only the 2D-relevant components are retained.\n    return [at(values, 0), at(values, 1), at(values, 4), at(values, 5), at(values, 12), at(values, 13)];\n};\n\nconst rotate = (context: Context, args: CSSValue[]): Transform => {\n    if (args.length !== 1) {\n        return null;\n    }\n\n    const arg = at(args, 0);\n    let radians = 0;\n\n    if (arg.type === TokenType.NUMBER_TOKEN && arg.number === 0) {\n        radians = 0;\n    } else if (arg.type === TokenType.DIMENSION_TOKEN) {\n        radians = angle.parse(context, arg);\n    } else {\n        return null;\n    }\n\n    const cos = Math.cos(radians);\n    const sin = Math.sin(radians);\n\n    return [cos, sin, -sin, cos, 0, 0];\n};\n\nconst SUPPORTED_TRANSFORM_FUNCTIONS: {\n    [key: string]: (context: Context, args: CSSValue[]) => Transform;\n} = {\n    matrix: matrix,\n    matrix3d: matrix3d,\n    rotate: rotate\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue } from '../syntax/parser';\nimport { isLengthPercentage, LengthPercentage } from '../types/length-percentage';\nimport { FLAG_INTEGER, TokenType } from '../syntax/tokenizer';\nimport { Context } from '../../core/context';\nimport { at } from '../../core/util';\nexport type TransformOrigin = [LengthPercentage, LengthPercentage];\n\nconst DEFAULT_VALUE: LengthPercentage = {\n    type: TokenType.PERCENTAGE_TOKEN,\n    number: 50,\n    flags: FLAG_INTEGER\n};\nconst DEFAULT: TransformOrigin = [DEFAULT_VALUE, DEFAULT_VALUE];\n\nexport const transformOrigin: IPropertyListDescriptor<TransformOrigin> = {\n    name: 'transform-origin',\n    initialValue: '50% 50%',\n    prefix: true,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]) => {\n        const origins: LengthPercentage[] = tokens.filter(isLengthPercentage);\n\n        if (origins.length !== 2) {\n            return DEFAULT;\n        }\n\n        return [at(origins, 0), at(origins, 1)];\n    }\n};\n","import { IPropertyValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue } from '../syntax/parser';\nimport { TokenType } from '../syntax/tokenizer';\nimport { Context } from '../../core/context';\nimport { angle } from '../types/angle';\n\nexport type Rotate = number | null;\n\nexport const rotate: IPropertyValueDescriptor<Rotate> = {\n    name: 'rotate',\n    initialValue: 'none',\n    prefix: false,\n    type: PropertyDescriptorParsingType.VALUE,\n    parse: (_context: Context, token: CSSValue): Rotate => {\n        if (token.type === TokenType.IDENT_TOKEN && token.value === 'none') {\n            return null;\n        }\n\n        if (token.type === TokenType.NUMBER_TOKEN) {\n            if (token.number === 0) {\n                return 0;\n            }\n        }\n\n        if (token.type === TokenType.DIMENSION_TOKEN) {\n            // Parse angle and convert to degrees for storage\n            const radians = angle.parse(_context, token);\n            // Store as degrees for consistency\n            return (radians * 180) / Math.PI;\n        }\n\n        return null;\n    }\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\nexport const enum VISIBILITY {\n    VISIBLE = 0,\n    HIDDEN = 1,\n    COLLAPSE = 2\n}\n\nexport const visibility: IPropertyIdentValueDescriptor<VISIBILITY> = {\n    name: 'visibility',\n    initialValue: 'none',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, visibility: string) => {\n        switch (visibility) {\n            case 'hidden':\n                return VISIBILITY.HIDDEN;\n            case 'collapse':\n                return VISIBILITY.COLLAPSE;\n            case 'visible':\n            default:\n                return VISIBILITY.VISIBLE;\n        }\n    }\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\nexport enum WORD_BREAK {\n    NORMAL = 'normal',\n    BREAK_ALL = 'break-all',\n    KEEP_ALL = 'keep-all'\n}\n\nexport const wordBreak: IPropertyIdentValueDescriptor<WORD_BREAK> = {\n    name: 'word-break',\n    initialValue: 'normal',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, wordBreak: string): WORD_BREAK => {\n        switch (wordBreak) {\n            case 'break-all':\n                return WORD_BREAK.BREAK_ALL;\n            case 'keep-all':\n                return WORD_BREAK.KEEP_ALL;\n            case 'normal':\n            default:\n                return WORD_BREAK.NORMAL;\n        }\n    }\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\n\nexport enum WHITE_SPACE {\n    NORMAL = 'normal',\n    PRE = 'pre',\n    NOWRAP = 'nowrap',\n    PRE_WRAP = 'pre-wrap',\n    PRE_LINE = 'pre-line'\n}\n\nexport const whiteSpace: IPropertyIdentValueDescriptor<WHITE_SPACE> = {\n    name: 'white-space',\n    initialValue: 'normal',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, value: string): WHITE_SPACE => {\n        switch (value) {\n            case 'pre':\n                return WHITE_SPACE.PRE;\n            case 'nowrap':\n                return WHITE_SPACE.NOWRAP;\n            case 'pre-wrap':\n                return WHITE_SPACE.PRE_WRAP;\n            case 'pre-line':\n                return WHITE_SPACE.PRE_LINE;\n            case 'normal':\n            default:\n                return WHITE_SPACE.NORMAL;\n        }\n    }\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\n\nexport const enum WRITING_MODE {\n    HORIZONTAL_TB = 0,\n    VERTICAL_RL = 1,\n    VERTICAL_LR = 2,\n    SIDEWAYS_RL = 3,\n    SIDEWAYS_LR = 4\n}\n\nexport const isVerticalWritingMode = (writingMode: WRITING_MODE): boolean => writingMode !== WRITING_MODE.HORIZONTAL_TB;\n\nexport const isSidewaysWritingMode = (writingMode: WRITING_MODE): boolean =>\n    writingMode === WRITING_MODE.SIDEWAYS_RL || writingMode === WRITING_MODE.SIDEWAYS_LR;\n\nexport const writingMode: IPropertyIdentValueDescriptor<WRITING_MODE> = {\n    name: 'writing-mode',\n    initialValue: 'horizontal-tb',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, writingMode: string): WRITING_MODE => {\n        switch (writingMode) {\n            case 'vertical-rl':\n                return WRITING_MODE.VERTICAL_RL;\n            case 'vertical-lr':\n                return WRITING_MODE.VERTICAL_LR;\n            case 'sideways-rl':\n                return WRITING_MODE.SIDEWAYS_RL;\n            case 'sideways-lr':\n                return WRITING_MODE.SIDEWAYS_LR;\n            case 'horizontal-tb':\n            default:\n                return WRITING_MODE.HORIZONTAL_TB;\n        }\n    }\n};\n","import { IPropertyValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isNumberToken } from '../syntax/parser';\nimport { TokenType } from '../syntax/tokenizer';\nimport { Context } from '../../core/context';\n\ninterface zIndex {\n    order: number;\n    auto: boolean;\n}\n\nexport const zIndex: IPropertyValueDescriptor<zIndex> = {\n    name: 'z-index',\n    initialValue: 'auto',\n    prefix: false,\n    type: PropertyDescriptorParsingType.VALUE,\n    parse: (_context: Context, token: CSSValue): zIndex => {\n        if (token.type === TokenType.IDENT_TOKEN) {\n            return { auto: true, order: 0 };\n        }\n\n        if (isNumberToken(token)) {\n            return { auto: false, order: token.number };\n        }\n\n        throw new Error(`Invalid z-index number parsed`);\n    }\n};\n","import { CSSValue } from '../syntax/parser';\nimport { TokenType } from '../syntax/tokenizer';\nimport { ITypeDescriptor } from '../type-descriptor';\nimport { Context } from '../../core/context';\n\nexport const time: ITypeDescriptor<number> = {\n    name: 'time',\n    parse: (_context: Context, value: CSSValue): number => {\n        if (value.type === TokenType.DIMENSION_TOKEN) {\n            switch (value.unit.toLowerCase()) {\n                case 's':\n                    return 1000 * value.number;\n                case 'ms':\n                    return value.number;\n            }\n        }\n\n        throw new Error(`Unsupported time type`);\n    }\n};\n","import { IPropertyValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isNumberToken } from '../syntax/parser';\nimport { Context } from '../../core/context';\nexport const opacity: IPropertyValueDescriptor<number> = {\n    name: 'opacity',\n    initialValue: '1',\n    type: PropertyDescriptorParsingType.VALUE,\n    prefix: false,\n    parse: (_context: Context, token: CSSValue): number => {\n        if (isNumberToken(token)) {\n            return token.number;\n        }\n        return 1;\n    }\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\n\nexport const enum TEXT_DECORATION_STYLE {\n    SOLID = 0,\n    DOUBLE = 1,\n    DOTTED = 2,\n    DASHED = 3,\n    WAVY = 4\n}\n\nexport const textDecorationStyle: IPropertyIdentValueDescriptor<TEXT_DECORATION_STYLE> = {\n    name: 'text-decoration-style',\n    initialValue: 'solid',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, style: string): TEXT_DECORATION_STYLE => {\n        switch (style) {\n            case 'double':\n                return TEXT_DECORATION_STYLE.DOUBLE;\n            case 'dotted':\n                return TEXT_DECORATION_STYLE.DOTTED;\n            case 'dashed':\n                return TEXT_DECORATION_STYLE.DASHED;\n            case 'wavy':\n                return TEXT_DECORATION_STYLE.WAVY;\n            case 'solid':\n            default:\n                return TEXT_DECORATION_STYLE.SOLID;\n        }\n    }\n};\n","import { IPropertyValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken, isDimensionToken } from '../syntax/parser';\nimport { Context } from '../../core/context';\n\nexport type TextDecorationThickness = number | 'auto' | 'from-font';\n\nexport const textDecorationThickness: IPropertyValueDescriptor<TextDecorationThickness> = {\n    name: 'text-decoration-thickness',\n    initialValue: 'auto',\n    prefix: false,\n    type: PropertyDescriptorParsingType.VALUE,\n    parse: (_context: Context, token: CSSValue): TextDecorationThickness => {\n        if (isIdentToken(token)) {\n            switch (token.value) {\n                case 'auto':\n                    return 'auto';\n                case 'from-font':\n                    return 'from-font';\n            }\n        }\n\n        if (isDimensionToken(token)) {\n            // Convert to pixels\n            return token.number;\n        }\n\n        // Default to auto\n        return 'auto';\n    }\n};\n","import { IPropertyValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken, isDimensionToken } from '../syntax/parser';\nimport { Context } from '../../core/context';\n\nexport type TextUnderlineOffset = number | 'auto';\n\nexport const textUnderlineOffset: IPropertyValueDescriptor<TextUnderlineOffset> = {\n    name: 'text-underline-offset',\n    initialValue: 'auto',\n    prefix: false,\n    type: PropertyDescriptorParsingType.VALUE,\n    parse: (_context: Context, token: CSSValue): TextUnderlineOffset => {\n        if (isIdentToken(token)) {\n            if (token.value === 'auto') {\n                return 'auto';\n            }\n        }\n\n        if (isDimensionToken(token)) {\n            // Return pixel value\n            return token.number;\n        }\n\n        // Default to auto\n        return 'auto';\n    }\n};\n","import { IPropertyValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken, isNumberToken } from '../syntax/parser';\nimport { Context } from '../../core/context';\nexport const fontWeight: IPropertyValueDescriptor<number> = {\n    name: 'font-weight',\n    initialValue: 'normal',\n    type: PropertyDescriptorParsingType.VALUE,\n    prefix: false,\n    parse: (_context: Context, token: CSSValue): number => {\n        if (isNumberToken(token)) {\n            return token.number;\n        }\n\n        if (isIdentToken(token)) {\n            switch (token.value) {\n                case 'bold':\n                    return 700;\n                case 'normal':\n                default:\n                    return 400;\n            }\n        }\n\n        return 400;\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken } from '../syntax/parser';\nimport { Context } from '../../core/context';\nexport const fontVariant: IPropertyListDescriptor<string[]> = {\n    name: 'font-variant',\n    initialValue: 'none',\n    type: PropertyDescriptorParsingType.LIST,\n    prefix: false,\n    parse: (_context: Context, tokens: CSSValue[]): string[] => {\n        return tokens.filter(isIdentToken).map((token) => token.value);\n    }\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\nexport const enum FONT_STYLE {\n    NORMAL = 'normal',\n    ITALIC = 'italic',\n    OBLIQUE = 'oblique'\n}\n\nexport const fontStyle: IPropertyIdentValueDescriptor<FONT_STYLE> = {\n    name: 'font-style',\n    initialValue: 'normal',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, overflow: string) => {\n        switch (overflow) {\n            case 'oblique':\n                return FONT_STYLE.OBLIQUE;\n            case 'italic':\n                return FONT_STYLE.ITALIC;\n            case 'normal':\n            default:\n                return FONT_STYLE.NORMAL;\n        }\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\nimport { CSSValue, isDimensionToken } from '../syntax/parser';\nimport { time } from '../types/time';\n\nexport const duration: IPropertyListDescriptor<number[]> = {\n    name: 'duration',\n    initialValue: '0s',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (context: Context, tokens: CSSValue[]) => {\n        return tokens.filter(isDimensionToken).map((token) => time.parse(context, token));\n    }\n};\n","import { PropertyDescriptorParsingType, IPropertyListDescriptor } from '../property-descriptor';\nimport { at } from '../../core/util';\nimport { CSSValue, isIdentWithValue, parseFunctionArgs } from '../syntax/parser';\nimport { ZERO_LENGTH } from '../types/length-percentage';\nimport { color, Color } from '../types/color';\nimport { isLength, Length } from '../types/length';\nimport { Context } from '../../core/context';\n\nexport type BoxShadow = BoxShadowItem[];\ninterface BoxShadowItem {\n    inset: boolean;\n    color: Color;\n    offsetX: Length;\n    offsetY: Length;\n    blur: Length;\n    spread: Length;\n}\n\nexport const boxShadow: IPropertyListDescriptor<BoxShadow> = {\n    name: 'box-shadow',\n    initialValue: 'none',\n    type: PropertyDescriptorParsingType.LIST,\n    prefix: false,\n    parse: (context: Context, tokens: CSSValue[]): BoxShadow => {\n        if (tokens.length === 1 && isIdentWithValue(at(tokens, 0), 'none')) {\n            return [];\n        }\n\n        return parseFunctionArgs(tokens).map((values: CSSValue[]) => {\n            const shadow: BoxShadowItem = {\n                color: 0x000000ff,\n                offsetX: ZERO_LENGTH,\n                offsetY: ZERO_LENGTH,\n                blur: ZERO_LENGTH,\n                spread: ZERO_LENGTH,\n                inset: false\n            };\n            let c = 0;\n            for (let i = 0; i < values.length; i++) {\n                const token = values[i];\n                if (!token) continue;\n                if (isIdentWithValue(token, 'inset')) {\n                    shadow.inset = true;\n                } else if (isLength(token)) {\n                    if (c === 0) {\n                        shadow.offsetX = token;\n                    } else if (c === 1) {\n                        shadow.offsetY = token;\n                    } else if (c === 2) {\n                        shadow.blur = token;\n                    } else {\n                        shadow.spread = token;\n                    }\n                    c++;\n                } else {\n                    shadow.color = color.parse(context, token);\n                }\n            }\n            return shadow;\n        });\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken } from '../syntax/parser';\nimport { Context } from '../../core/context';\nexport const enum PAINT_ORDER_LAYER {\n    FILL,\n    STROKE,\n    MARKERS\n}\n\nexport type PaintOrder = PAINT_ORDER_LAYER[];\n\nexport const paintOrder: IPropertyListDescriptor<PaintOrder> = {\n    name: 'paint-order',\n    initialValue: 'normal',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): PaintOrder => {\n        const DEFAULT_VALUE = [PAINT_ORDER_LAYER.FILL, PAINT_ORDER_LAYER.STROKE, PAINT_ORDER_LAYER.MARKERS];\n        const layers: PaintOrder = [];\n\n        tokens.filter(isIdentToken).forEach((token) => {\n            switch (token.value) {\n                case 'stroke':\n                    layers.push(PAINT_ORDER_LAYER.STROKE);\n                    break;\n                case 'fill':\n                    layers.push(PAINT_ORDER_LAYER.FILL);\n                    break;\n                case 'markers':\n                    layers.push(PAINT_ORDER_LAYER.MARKERS);\n                    break;\n            }\n        });\n        DEFAULT_VALUE.forEach((value) => {\n            if (layers.indexOf(value) === -1) {\n                layers.push(value);\n            }\n        });\n\n        return layers;\n    }\n};\n","import { IPropertyTypeValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nexport const webkitTextStrokeColor: IPropertyTypeValueDescriptor = {\n    name: `-webkit-text-stroke-color`,\n    initialValue: 'currentcolor',\n    prefix: false,\n    type: PropertyDescriptorParsingType.TYPE_VALUE,\n    format: 'color'\n};\n","import { CSSValue, isDimensionToken } from '../syntax/parser';\nimport { IPropertyValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\nexport const webkitTextStrokeWidth: IPropertyValueDescriptor<number> = {\n    name: `-webkit-text-stroke-width`,\n    initialValue: '0',\n    type: PropertyDescriptorParsingType.VALUE,\n    prefix: false,\n    parse: (_context: Context, token: CSSValue): number => {\n        if (isDimensionToken(token)) {\n            return token.number;\n        }\n        return 0;\n    }\n};\n","import { IPropertyValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue } from '../syntax/parser';\nimport { TokenType } from '../syntax/tokenizer';\nimport { Context } from '../../core/context';\n\n/**\n * -webkit-line-clamp property descriptor\n * Used with display: -webkit-box and -webkit-box-orient: vertical\n * to limit text to a specific number of lines\n */\nexport const webkitLineClamp: IPropertyValueDescriptor<number> = {\n    name: '-webkit-line-clamp',\n    initialValue: 'none',\n    prefix: true,\n    type: PropertyDescriptorParsingType.VALUE,\n    parse: (_context: Context, token: CSSValue) => {\n        // 'none' means no line clamping\n        if (token.type === TokenType.IDENT_TOKEN && token.value === 'none') {\n            return 0;\n        }\n\n        // Number value specifies the number of lines\n        if (token.type === TokenType.NUMBER_TOKEN) {\n            return Math.max(0, Math.floor(token.number));\n        }\n\n        // Default to 0 (no clamping)\n        return 0;\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken } from '../syntax/parser';\nimport { Context } from '../../core/context';\nexport const enum OBJECT_FIT {\n    FILL = 0,\n    CONTAIN = 1 << 1,\n    COVER = 1 << 2,\n    NONE = 1 << 3,\n    SCALE_DOWN = 1 << 4\n}\n\nexport type ObjectFit = number;\n\nexport const objectFit: IPropertyListDescriptor<ObjectFit> = {\n    name: 'object-fit',\n    initialValue: 'fill',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): ObjectFit => {\n        return tokens.filter(isIdentToken).reduce((bit, token) => {\n            return bit | parseDisplayValue(token.value);\n        }, OBJECT_FIT.FILL);\n    }\n};\n\nconst parseDisplayValue = (display: string): ObjectFit => {\n    switch (display) {\n        case 'contain':\n            return OBJECT_FIT.CONTAIN;\n        case 'cover':\n            return OBJECT_FIT.COVER;\n        case 'none':\n            return OBJECT_FIT.NONE;\n        case 'scale-down':\n            return OBJECT_FIT.SCALE_DOWN;\n    }\n\n    return OBJECT_FIT.FILL;\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\n\nexport const enum TEXT_OVERFLOW {\n    CLIP = 0,\n    ELLIPSIS = 1\n}\n\nexport const textOverflow: IPropertyIdentValueDescriptor<TEXT_OVERFLOW> = {\n    name: 'text-overflow',\n    initialValue: 'clip',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, textOverflow: string) => {\n        switch (textOverflow) {\n            case 'ellipsis':\n                return TEXT_OVERFLOW.ELLIPSIS;\n            case 'clip':\n            default:\n                return TEXT_OVERFLOW.CLIP;\n        }\n    }\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\n\nexport enum IMAGE_RENDERING {\n    AUTO = 0,\n    CRISP_EDGES = 1,\n    PIXELATED = 2,\n    SMOOTH = 3\n}\n\nexport const imageRendering: IPropertyIdentValueDescriptor<IMAGE_RENDERING> = {\n    name: 'image-rendering',\n    initialValue: 'auto',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, value: string): IMAGE_RENDERING => {\n        switch (value.toLowerCase()) {\n            case 'crisp-edges':\n            case '-webkit-crisp-edges':\n            case '-moz-crisp-edges':\n                return IMAGE_RENDERING.CRISP_EDGES;\n            case 'pixelated':\n            case '-webkit-optimize-contrast':\n                return IMAGE_RENDERING.PIXELATED;\n            case 'smooth':\n            case 'high-quality':\n                return IMAGE_RENDERING.SMOOTH;\n            case 'auto':\n            default:\n                return IMAGE_RENDERING.AUTO;\n        }\n    }\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\n\nexport const MIX_BLEND_MODE = {\n    NORMAL: 'normal',\n    MULTIPLY: 'multiply',\n    SCREEN: 'screen',\n    OVERLAY: 'overlay',\n    DARKEN: 'darken',\n    LIGHTEN: 'lighten',\n    COLOR_DODGE: 'color-dodge',\n    COLOR_BURN: 'color-burn',\n    HARD_LIGHT: 'hard-light',\n    SOFT_LIGHT: 'soft-light',\n    DIFFERENCE: 'difference',\n    EXCLUSION: 'exclusion',\n    HUE: 'hue',\n    SATURATION: 'saturation',\n    COLOR: 'color',\n    LUMINOSITY: 'luminosity'\n} as const;\n\nexport type MixBlendMode = (typeof MIX_BLEND_MODE)[keyof typeof MIX_BLEND_MODE];\n\nconst VALID_VALUES = new Set<string>(Object.values(MIX_BLEND_MODE));\n\nexport const mixBlendMode: IPropertyIdentValueDescriptor<MixBlendMode> = {\n    name: 'mix-blend-mode',\n    initialValue: 'normal',\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    prefix: false,\n    parse: (_context: Context, token: string): MixBlendMode => {\n        return VALID_VALUES.has(token) ? (token as MixBlendMode) : MIX_BLEND_MODE.NORMAL;\n    }\n};\n","import { PropertyDescriptorParsingType, IPropertyListDescriptor } from '../property-descriptor';\nimport { at } from '../../core/util';\nimport { CSSValue, CSSFunction } from '../syntax/parser';\nimport { TokenType } from '../syntax/tokenizer';\nimport { Context } from '../../core/context';\n\nexport type FilterValue = string | null;\n\nexport const filter: IPropertyListDescriptor<FilterValue> = {\n    name: 'filter',\n    initialValue: 'none',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): FilterValue => {\n        if (tokens.length === 1) {\n            const first = at(tokens, 0);\n            if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {\n                return null;\n            }\n        }\n\n        const parts: string[] = [];\n        for (const token of tokens) {\n            if (token.type === TokenType.URL_TOKEN) {\n                // url(#svgfilter) references: url() tokenises as a URL token,\n                // not a function — carry it through so the legacy renderer\n                // hands the reference to ctx.filter (native SVG support).\n                parts.push(`url(\"${token.value}\")`);\n                continue;\n            }\n            if (token.type === TokenType.FUNCTION) {\n                const fn = token as CSSFunction;\n                // Reconstruct the function string from its name + values\n                const renderedArgs = renderFilterArgs(fn.values);\n                // Canvas API supports the same CSS filter string format\n                switch (fn.name) {\n                    case 'blur':\n                        parts.push(`blur(${renderedArgs})`);\n                        break;\n                    case 'brightness':\n                    case 'contrast':\n                    case 'invert':\n                    case 'opacity':\n                    case 'saturate':\n                    case 'sepia':\n                        parts.push(`${fn.name}(${renderedArgs})`);\n                        break;\n                    case 'grayscale':\n                        parts.push(`grayscale(${renderedArgs})`);\n                        break;\n                    case 'hue-rotate':\n                        parts.push(`hue-rotate(${renderedArgs})`);\n                        break;\n                    case 'drop-shadow':\n                        parts.push(`drop-shadow(${renderedArgs})`);\n                        break;\n                    default:\n                        // Pass url() references and unknown functions through\n                        // verbatim: the surface compositor rejects chains it\n                        // cannot express (falling back to the legacy path),\n                        // and the legacy path feeds ctx.filter, which applies\n                        // SVG references natively where supported.\n                        parts.push(`${fn.name}(${renderedArgs})`);\n                        break;\n                }\n            }\n        }\n\n        return parts.length > 0 ? parts.join(' ') : null;\n    }\n};\n\n/**\n * Render filter function arguments back into a CSS string suitable for Canvas API.\n * Canvas 2D `ctx.filter` accepts the same CSS filter function strings.\n */\nconst renderFilterArgs = (values: CSSValue[]): string => {\n    const parts: string[] = [];\n    for (const v of values) {\n        if (v.type === TokenType.WHITESPACE_TOKEN) {\n            parts.push(' ');\n            continue;\n        }\n        if (v.type === TokenType.FUNCTION) {\n            parts.push(`${v.name}(${renderFilterArgs(v.values)})`);\n        } else if (v.type === TokenType.COMMA_TOKEN) {\n            parts.push(',');\n        } else if (v.type === TokenType.DELIM_TOKEN) {\n            parts.push(v.value);\n        } else if (v.type === TokenType.DIMENSION_TOKEN) {\n            parts.push(`${v.number}${v.unit}`);\n        } else if (v.type === TokenType.NUMBER_TOKEN) {\n            parts.push(`${v.number}`);\n        } else if (v.type === TokenType.PERCENTAGE_TOKEN) {\n            parts.push(`${v.number}%`);\n        } else if (v.type === TokenType.IDENT_TOKEN) {\n            parts.push(v.value);\n        } else if (v.type === TokenType.HASH_TOKEN) {\n            parts.push(`#${v.value}`);\n        }\n    }\n    return parts.join('').trim();\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\n\nexport const enum FONT_VARIANT_LIGATURES {\n    NORMAL = 0,\n    NONE = 1,\n    COMMON_LIGATURES = 2,\n    NO_COMMON_LIGATURES = 3,\n    DISCRETIONARY_LIGATURES = 4,\n    NO_DISCRETIONARY_LIGATURES = 5,\n    HISTORICAL_LIGATURES = 6,\n    NO_HISTORICAL_LIGATURES = 7,\n    CONTEXTUAL = 8,\n    NO_CONTEXTUAL = 9\n}\n\nexport const fontVariantLigatures: IPropertyIdentValueDescriptor<FONT_VARIANT_LIGATURES> = {\n    name: 'font-variant-ligatures',\n    initialValue: 'normal',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, value: string): FONT_VARIANT_LIGATURES => {\n        switch (value) {\n            case 'none':\n                return FONT_VARIANT_LIGATURES.NONE;\n            case 'common-ligatures':\n                return FONT_VARIANT_LIGATURES.COMMON_LIGATURES;\n            case 'no-common-ligatures':\n                return FONT_VARIANT_LIGATURES.NO_COMMON_LIGATURES;\n            case 'discretionary-ligatures':\n                return FONT_VARIANT_LIGATURES.DISCRETIONARY_LIGATURES;\n            case 'no-discretionary-ligatures':\n                return FONT_VARIANT_LIGATURES.NO_DISCRETIONARY_LIGATURES;\n            case 'historical-ligatures':\n                return FONT_VARIANT_LIGATURES.HISTORICAL_LIGATURES;\n            case 'no-historical-ligatures':\n                return FONT_VARIANT_LIGATURES.NO_HISTORICAL_LIGATURES;\n            case 'contextual':\n                return FONT_VARIANT_LIGATURES.CONTEXTUAL;\n            case 'no-contextual':\n                return FONT_VARIANT_LIGATURES.NO_CONTEXTUAL;\n            case 'normal':\n            default:\n                return FONT_VARIANT_LIGATURES.NORMAL;\n        }\n    }\n};\n","import { PropertyDescriptorParsingType, IPropertyValueDescriptor } from '../property-descriptor';\nimport { CSSValue } from '../syntax/parser';\nimport { TokenType } from '../syntax/tokenizer';\nimport { Context } from '../../core/context';\n\nexport type Zoom = number;\n\nexport const zoom: IPropertyValueDescriptor<Zoom> = {\n    name: 'zoom',\n    initialValue: '1',\n    type: PropertyDescriptorParsingType.VALUE,\n    prefix: false,\n    parse: (_context: Context, token: CSSValue): Zoom => {\n        if (token.type === TokenType.PERCENTAGE_TOKEN) {\n            return Math.max(0, token.number / 100);\n        }\n        if (token.type === TokenType.NUMBER_TOKEN) {\n            return Math.max(0, token.number);\n        }\n        return 1;\n    }\n};\n","import { PropertyDescriptorParsingType, IPropertyListDescriptor } from '../property-descriptor';\nimport { at } from '../../core/util';\nimport { CSSValue, isIdentToken } from '../syntax/parser';\nimport {\n    isLengthPercentage,\n    LengthPercentage,\n    ZERO_LENGTH,\n    FIFTY_PERCENT,\n    HUNDRED_PERCENT\n} from '../types/length-percentage';\nimport { Context } from '../../core/context';\n\nexport type ObjectPosition = [LengthPercentage, LengthPercentage];\n\nexport const objectPosition: IPropertyListDescriptor<ObjectPosition> = {\n    name: 'object-position',\n    initialValue: '50% 50%',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): ObjectPosition => {\n        const result: LengthPercentage[] = [];\n        let i = 0;\n\n        while (i < tokens.length && result.length < 2) {\n            const token = tokens[i];\n            if (!token) {\n                break;\n            }\n            if (isIdentToken(token)) {\n                switch (token.value) {\n                    case 'left':\n                    case 'top':\n                        result.push(ZERO_LENGTH);\n                        break;\n                    case 'center':\n                        result.push(FIFTY_PERCENT);\n                        break;\n                    case 'right':\n                    case 'bottom':\n                        result.push(HUNDRED_PERCENT);\n                        break;\n                }\n            } else if (isLengthPercentage(token)) {\n                result.push(token);\n            }\n            i++;\n        }\n\n        // Fill to 2 values with defaults\n        while (result.length < 2) {\n            result.push(FIFTY_PERCENT);\n        }\n\n        return [at(result, 0), at(result, 1)];\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken, nonFunctionArgSeparator } from '../syntax/parser';\nimport { Context } from '../../core/context';\n\nexport const MIX_BLEND_MODE = {\n    NORMAL: 'normal',\n    MULTIPLY: 'multiply',\n    SCREEN: 'screen',\n    OVERLAY: 'overlay',\n    DARKEN: 'darken',\n    LIGHTEN: 'lighten',\n    COLOR_DODGE: 'color-dodge',\n    COLOR_BURN: 'color-burn',\n    HARD_LIGHT: 'hard-light',\n    SOFT_LIGHT: 'soft-light',\n    DIFFERENCE: 'difference',\n    EXCLUSION: 'exclusion',\n    HUE: 'hue',\n    SATURATION: 'saturation',\n    COLOR: 'color',\n    LUMINOSITY: 'luminosity'\n} as const;\n\nexport type BackgroundBlendMode = BlendModeValue[];\n\ntype BlendModeValue = (typeof MIX_BLEND_MODE)[keyof typeof MIX_BLEND_MODE];\n\nconst VALID_VALUES = new Set<string>(Object.values(MIX_BLEND_MODE));\n\nexport const backgroundBlendMode: IPropertyListDescriptor<BackgroundBlendMode> = {\n    name: 'background-blend-mode',\n    initialValue: 'normal',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): BackgroundBlendMode => {\n        const modes: BackgroundBlendMode = [];\n        const filtered = tokens.filter(nonFunctionArgSeparator);\n\n        for (const token of filtered) {\n            if (isIdentToken(token)) {\n                if (VALID_VALUES.has(token.value)) {\n                    modes.push(token.value as BlendModeValue);\n                }\n            }\n        }\n\n        return modes.length > 0 ? modes : ['normal'];\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { at } from '../../core/util';\nimport { CSSValue, nonFunctionArgSeparator } from '../syntax/parser';\nimport { image, ICSSImage, isSupportedImage } from '../types/image';\nimport { Context } from '../../core/context';\n\nexport type BorderImageSource = ICSSImage | null;\n\nexport const borderImageSource: IPropertyListDescriptor<BorderImageSource> = {\n    name: 'border-image-source',\n    initialValue: 'none',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    skipCache: true,\n    parse: (context: Context, tokens: CSSValue[]): BorderImageSource => {\n        if (tokens.length === 0) {\n            return null;\n        }\n\n        const filtered = tokens.filter((t) => nonFunctionArgSeparator(t) && isSupportedImage(t));\n        if (filtered.length === 0) {\n            return null;\n        }\n\n        return image.parse(context, at(filtered, 0));\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { at } from '../../core/util';\nimport { CSSValue, isIdentToken, nonWhiteSpace } from '../syntax/parser';\nimport { TokenType } from '../syntax/tokenizer';\nimport { Context } from '../../core/context';\n\nexport interface BorderImageSlice {\n    top: number;\n    right: number;\n    bottom: number;\n    left: number;\n    fill: boolean;\n    unit: 'number' | 'percent';\n}\n\nconst fillSides = (sides: number[]): [number, number, number, number] => {\n    const result = [...sides];\n    if (result.length === 1) {\n        const only = at(result, 0);\n        result.push(only, only, only);\n    } else if (result.length === 2) {\n        result.push(at(result, 0), at(result, 1));\n    } else if (result.length === 3) {\n        result.push(at(result, 1));\n    }\n    return [at(result, 0), at(result, 1), at(result, 2), at(result, 3)];\n};\n\nexport const borderImageSlice: IPropertyListDescriptor<BorderImageSlice> = {\n    name: 'border-image-slice',\n    initialValue: '100%',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): BorderImageSlice => {\n        const filtered = tokens.filter(nonWhiteSpace);\n        const values: number[] = [];\n        let fill = false;\n        let unit: 'number' | 'percent' = 'percent';\n\n        for (const token of filtered) {\n            if (isIdentToken(token) && token.value === 'fill') {\n                fill = true;\n                continue;\n            }\n            if (token.type === TokenType.NUMBER_TOKEN) {\n                values.push(token.number);\n                unit = 'number';\n            } else if (token.type === TokenType.PERCENTAGE_TOKEN) {\n                values.push(token.number);\n                unit = 'percent';\n            }\n        }\n\n        const [top, right, bottom, left] = fillSides(values.length > 0 ? values : [100]);\n\n        return { top, right, bottom, left, fill, unit };\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken, nonWhiteSpace } from '../syntax/parser';\nimport { Context } from '../../core/context';\n\nexport enum BORDER_IMAGE_REPEAT {\n    STRETCH = 0,\n    REPEAT = 1,\n    ROUND = 2,\n    SPACE = 3\n}\n\nexport interface BorderImageRepeat {\n    horizontal: BORDER_IMAGE_REPEAT;\n    vertical: BORDER_IMAGE_REPEAT;\n}\n\nconst parseRepeatValue = (value: string): BORDER_IMAGE_REPEAT => {\n    switch (value) {\n        case 'repeat':\n            return BORDER_IMAGE_REPEAT.REPEAT;\n        case 'round':\n            return BORDER_IMAGE_REPEAT.ROUND;\n        case 'space':\n            return BORDER_IMAGE_REPEAT.SPACE;\n        case 'stretch':\n        default:\n            return BORDER_IMAGE_REPEAT.STRETCH;\n    }\n};\n\nexport const borderImageRepeat: IPropertyListDescriptor<BorderImageRepeat> = {\n    name: 'border-image-repeat',\n    initialValue: 'stretch',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): BorderImageRepeat => {\n        const filtered = tokens.filter(nonWhiteSpace);\n        const values: BORDER_IMAGE_REPEAT[] = [];\n\n        for (const token of filtered) {\n            if (isIdentToken(token)) {\n                values.push(parseRepeatValue(token.value));\n            }\n        }\n\n        const horizontal = values[0] ?? BORDER_IMAGE_REPEAT.STRETCH;\n        const vertical = values[1] ?? horizontal;\n\n        return { horizontal, vertical };\n    }\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\n\nexport const enum BOX_DECORATION_BREAK {\n    SLICE = 0,\n    CLONE = 1\n}\n\nexport const boxDecorationBreak: IPropertyIdentValueDescriptor<BOX_DECORATION_BREAK> = {\n    name: 'box-decoration-break',\n    initialValue: 'slice',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, token: string): BOX_DECORATION_BREAK => {\n        switch (token) {\n            case 'clone':\n                return BOX_DECORATION_BREAK.CLONE;\n            case 'slice':\n            default:\n                return BOX_DECORATION_BREAK.SLICE;\n        }\n    }\n};\n","import { IPropertyValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken } from '../syntax/parser';\nimport { color as colorType, type Color } from '../types/color';\nimport { Context } from '../../core/context';\n\n/** `null` represents the `auto` keyword: browser-default control colour. */\nexport type AccentColor = Color | null;\n\nexport const accentColor: IPropertyValueDescriptor<AccentColor> = {\n    name: 'accent-color',\n    initialValue: 'auto',\n    prefix: false,\n    type: PropertyDescriptorParsingType.VALUE,\n    parse: (context: Context, token: CSSValue): AccentColor => {\n        if (isIdentToken(token) && token.value === 'auto') {\n            return null;\n        }\n        return colorType.parse(context, token);\n    }\n};\n","import { IPropertyValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isIdentToken } from '../syntax/parser';\nimport { color as colorType, type Color } from '../types/color';\nimport { Context } from '../../core/context';\n\n/**\n * `null` represents `currentcolor`: the text renderer falls back to `color`.\n * Computed styles resolve currentcolor in browsers, but jsdom and older\n * engines may hand us the keyword verbatim.\n */\nexport type WebkitTextFillColor = Color | null;\n\nexport const webkitTextFillColor: IPropertyValueDescriptor<WebkitTextFillColor> = {\n    name: '-webkit-text-fill-color',\n    initialValue: 'currentcolor',\n    prefix: true,\n    type: PropertyDescriptorParsingType.VALUE,\n    parse: (context: Context, token: CSSValue): WebkitTextFillColor => {\n        if (isIdentToken(token) && token.value === 'currentcolor') {\n            return null;\n        }\n        return colorType.parse(context, token);\n    }\n};\n","import { IPropertyIdentValueDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { Context } from '../../core/context';\n\nexport const enum ISOLATION {\n    AUTO = 0,\n    ISOLATE = 1\n}\n\nexport const isolation: IPropertyIdentValueDescriptor<ISOLATION> = {\n    name: 'isolation',\n    initialValue: 'auto',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, value: string): ISOLATION => {\n        // `isolate` creates a stacking context so blended descendants cannot\n        // composite against content outside the group.\n        return value === 'isolate' ? ISOLATION.ISOLATE : ISOLATION.AUTO;\n    }\n};\n","import {\n    IPropertyValueDescriptor,\n    IPropertyIdentValueDescriptor,\n    PropertyDescriptorParsingType\n} from '../property-descriptor';\nimport { CSSValue, isIdentToken, isDimensionToken, isNumberToken } from '../syntax/parser';\nimport { color as colorType, type Color } from '../types/color';\nimport { borderTopWidth } from './border-width';\nimport { Context } from '../../core/context';\n\nexport const enum OUTLINE_STYLE {\n    NONE,\n    AUTO,\n    SOLID,\n    DASHED,\n    DOTTED,\n    DOUBLE\n}\n\nexport type OutlineColor = Color | null; // null = currentcolor / invert / auto\n\nexport const outlineStyle: IPropertyIdentValueDescriptor<OUTLINE_STYLE> = {\n    name: 'outline-style',\n    initialValue: 'none',\n    prefix: false,\n    type: PropertyDescriptorParsingType.IDENT_VALUE,\n    parse: (_context: Context, value: string): OUTLINE_STYLE => {\n        switch (value) {\n            case 'solid':\n                return OUTLINE_STYLE.SOLID;\n            case 'dashed':\n                return OUTLINE_STYLE.DASHED;\n            case 'dotted':\n                return OUTLINE_STYLE.DOTTED;\n            case 'double':\n                return OUTLINE_STYLE.DOUBLE;\n            case 'auto':\n                // The browser focus ring is only drawn for focused elements;\n                // a static capture has no focused look to reproduce.\n                return OUTLINE_STYLE.AUTO;\n            default:\n                return OUTLINE_STYLE.NONE;\n        }\n    }\n};\n\nexport const outlineColor: IPropertyValueDescriptor<OutlineColor> = {\n    name: 'outline-color',\n    initialValue: 'currentcolor',\n    prefix: false,\n    type: PropertyDescriptorParsingType.VALUE,\n    parse: (context: Context, token: CSSValue): OutlineColor => {\n        if (isIdentToken(token) && (token.value === 'currentcolor' || token.value === 'invert')) {\n            return null;\n        }\n        return colorType.parse(context, token);\n    }\n};\n\n// Computed outline-width / outline-offset resolve to absolute pixel lengths,\n// so the numeric value is used directly (same convention as border widths).\nexport const outlineWidth: IPropertyValueDescriptor<number> = {\n    name: 'outline-width',\n    initialValue: 'medium',\n    prefix: false,\n    type: PropertyDescriptorParsingType.VALUE,\n    parse: borderTopWidth.parse\n};\n\nexport const outlineOffset: IPropertyValueDescriptor<number> = {\n    name: 'outline-offset',\n    initialValue: '0px',\n    prefix: false,\n    type: PropertyDescriptorParsingType.VALUE,\n    parse: (_context: Context, token: CSSValue): number => {\n        return isDimensionToken(token) || isNumberToken(token) ? token.number : 0;\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { filter, type FilterValue } from './filter';\nimport { Context } from '../../core/context';\n\n/**\n * backdrop-filter shares the filter value grammar and canvas filter string\n * reconstruction. Rendering captures the already-painted backdrop region and\n * applies the filter surface pipeline to it.\n */\nexport type BackdropFilter = FilterValue;\n\nexport const backdropFilter: IPropertyListDescriptor<BackdropFilter> = {\n    name: 'backdrop-filter',\n    initialValue: 'none',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (context: Context, tokens): BackdropFilter => filter.parse(context, tokens)\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { backgroundImage } from './background-image';\nimport { backgroundPosition, type BackgroundPosition } from './background-position';\nimport { backgroundRepeat, type BackgroundRepeat } from './background-repeat';\nimport { backgroundSize, type BackgroundSize } from './background-size';\nimport { ICSSImage } from '../types/image';\n\n/**\n * CSS Masking (mask-image / mask-position / mask-repeat / mask-size).\n *\n * Value grammars are identical to their background counterparts, so the\n * background parsers are reused verbatim — including the addImage side\n * effect that requires `skipCache` on mask-image. -webkit-mask-* aliases\n * resolve to these properties in computed style.\n *\n * mask-mode/mask-clip/mask-origin/mask-composite are accepted by the browser\n * but not parsed here; rendering assumes the default alpha masking with\n * `add` layer compositing.\n */\n\nexport type MaskImage = ICSSImage[];\nexport type MaskPosition = BackgroundPosition;\nexport type MaskRepeat = BackgroundRepeat;\nexport type MaskSize = BackgroundSize;\n\nexport const maskImage: IPropertyListDescriptor<MaskImage> = {\n    name: 'mask-image',\n    initialValue: 'none',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    skipCache: true,\n    parse: backgroundImage.parse\n};\n\nexport const maskPosition: IPropertyListDescriptor<MaskPosition> = {\n    name: 'mask-position',\n    initialValue: '0%',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: backgroundPosition.parse\n};\n\nexport const maskRepeat: IPropertyListDescriptor<MaskRepeat> = {\n    name: 'mask-repeat',\n    initialValue: 'repeat',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: backgroundRepeat.parse\n};\n\nexport const maskSize: IPropertyListDescriptor<MaskSize> = {\n    name: 'mask-size',\n    initialValue: 'auto',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: backgroundSize.parse\n};\n","import {\n    IPropertyListDescriptor,\n    IPropertyValueDescriptor,\n    PropertyDescriptorParsingType\n} from '../property-descriptor';\nimport { CSSValue, isIdentToken, nonWhiteSpace } from '../syntax/parser';\nimport { StringValueToken, TokenType } from '../syntax/tokenizer';\nimport { color as colorType, type Color } from '../types/color';\nimport { at } from '../../core/util';\nimport { Context } from '../../core/context';\n\nexport type TextEmphasisShape = 'dot' | 'circle' | 'double-circle' | 'triangle' | 'sesame';\n\n/**\n * `null` — `none`. A string — custom mark character(s). Otherwise the keyword\n * pair resolved from the computed value (e.g. \"filled circle\").\n */\nexport type TextEmphasisStyle = { fill: boolean; shape: TextEmphasisShape } | string | null;\n\nconst SHAPES: TextEmphasisShape[] = ['dot', 'circle', 'double-circle', 'triangle', 'sesame'];\n\nexport const textEmphasisStyle: IPropertyListDescriptor<TextEmphasisStyle> = {\n    name: 'text-emphasis-style',\n    initialValue: 'none',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): TextEmphasisStyle => {\n        const values = tokens.filter(nonWhiteSpace);\n        if (values.length === 0) {\n            return null;\n        }\n        const first = at(values, 0);\n        if (first.type === TokenType.STRING_TOKEN) {\n            // Custom string styles serialize as a quoted string.\n            return (first as StringValueToken).value;\n        }\n        if (isIdentToken(first)) {\n            if (first.value === 'none') {\n                return null;\n            }\n            if (\n                first.value !== 'filled' &&\n                first.value !== 'open' &&\n                SHAPES.indexOf(first.value as TextEmphasisShape) === -1\n            ) {\n                return first.value;\n            }\n        }\n\n        let fill = true; // initial value: filled\n        let shape: TextEmphasisShape = 'circle';\n        for (const token of values) {\n            if (!isIdentToken(token)) continue;\n            if (token.value === 'filled') {\n                fill = true;\n            } else if (token.value === 'open') {\n                fill = false;\n            } else if (SHAPES.indexOf(token.value as TextEmphasisShape) !== -1) {\n                shape = token.value as TextEmphasisShape;\n            }\n        }\n        return { fill, shape };\n    }\n};\n\n/** `null` = currentcolor; the renderer falls back to the text colour. */\nexport type TextEmphasisColor = Color | null;\n\nexport const textEmphasisColor: IPropertyValueDescriptor<TextEmphasisColor> = {\n    name: 'text-emphasis-color',\n    initialValue: 'currentcolor',\n    prefix: false,\n    type: PropertyDescriptorParsingType.VALUE,\n    parse: (context: Context, token: CSSValue): TextEmphasisColor => {\n        if (isIdentToken(token) && token.value === 'currentcolor') {\n            return null;\n        }\n        return colorType.parse(context, token);\n    }\n};\n\nexport interface TextEmphasisPosition {\n    /** Marks above the text (over) or below (under). */\n    over: boolean;\n    /** Vertical-writing side for horizontal default; kept for completeness. */\n    right: boolean;\n}\n\nexport const textEmphasisPosition: IPropertyListDescriptor<TextEmphasisPosition> = {\n    name: 'text-emphasis-position',\n    initialValue: 'over right',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): TextEmphasisPosition => {\n        let over = true;\n        let right = true;\n        for (const token of tokens) {\n            if (!isIdentToken(token)) continue;\n            switch (token.value) {\n                case 'over':\n                    over = true;\n                    break;\n                case 'under':\n                    over = false;\n                    break;\n                case 'right':\n                    right = true;\n                    break;\n                case 'left':\n                    right = false;\n                    break;\n            }\n        }\n        return { over, right };\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { at } from '../../core/util';\nimport { CSSValue, isIdentToken } from '../syntax/parser';\nimport { TokenType } from '../syntax/tokenizer';\nimport { Context } from '../../core/context';\n\nexport type BorderImageWidthSide =\n    | { kind: 'auto' }\n    | { kind: 'length'; value: number }\n    | { kind: 'percentage'; value: number }\n    | { kind: 'number'; value: number };\n\nconst fillSides = <T>(sides: T[]): [T, T, T, T] => {\n    const result = [...sides];\n    if (result.length === 1) {\n        const only = at(result, 0);\n        result.push(only, only, only);\n    } else if (result.length === 2) {\n        result.push(at(result, 0), at(result, 1));\n    } else if (result.length === 3) {\n        result.push(at(result, 1));\n    }\n    return [at(result, 0), at(result, 1), at(result, 2), at(result, 3)];\n};\n\nconst parseSide = (token: CSSValue): BorderImageWidthSide | null => {\n    if (isIdentToken(token) && token.value === 'auto') {\n        return { kind: 'auto' };\n    }\n    if (token.type === TokenType.NUMBER_TOKEN) {\n        return { kind: 'number', value: token.number };\n    }\n    if (token.type === TokenType.DIMENSION_TOKEN && token.unit === 'px') {\n        return { kind: 'length', value: token.number };\n    }\n    if (token.type === TokenType.PERCENTAGE_TOKEN) {\n        return { kind: 'percentage', value: token.number };\n    }\n    return null;\n};\n\nconst parseSides = (\n    tokens: CSSValue[]\n): [BorderImageWidthSide, BorderImageWidthSide, BorderImageWidthSide, BorderImageWidthSide] | null => {\n    const sides: BorderImageWidthSide[] = [];\n    for (const token of tokens) {\n        if (token.type === TokenType.WHITESPACE_TOKEN) continue;\n        const side = parseSide(token);\n        if (!side) return null;\n        sides.push(side);\n    }\n    if (sides.length === 0 || sides.length > 4) return null;\n    return fillSides(sides);\n};\n\n/**\n * border-image-width controls the width of the nine-slice border areas.\n * `auto` (= the corresponding border width), `number` (multiples of the\n * border width), lengths and percentages of the border image area are all\n * resolved against the border widths at render time.\n */\nexport const borderImageWidth: IPropertyListDescriptor<{\n    top: BorderImageWidthSide;\n    right: BorderImageWidthSide;\n    bottom: BorderImageWidthSide;\n    left: BorderImageWidthSide;\n}> = {\n    name: 'border-image-width',\n    initialValue: 'auto',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens) => {\n        const sides = parseSides(tokens);\n        const auto: BorderImageWidthSide = { kind: 'auto' };\n        const fallback = { top: auto, right: auto, bottom: auto, left: auto };\n        return sides ? { top: sides[0], right: sides[1], bottom: sides[2], left: sides[3] } : fallback;\n    }\n};\n\nexport interface BorderImageOutset {\n    top: BorderImageWidthSide;\n    right: BorderImageWidthSide;\n    bottom: BorderImageWidthSide;\n    left: BorderImageWidthSide;\n}\n\n/**\n * border-image-outset pushes the border image area outside the border box.\n * Only lengths and numbers (multiples of the border width) are valid here.\n */\nexport const borderImageOutset: IPropertyListDescriptor<BorderImageOutset> = {\n    name: 'border-image-outset',\n    initialValue: '0px',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens) => {\n        const sides = parseSides(tokens);\n        const zero: BorderImageWidthSide = { kind: 'length', value: 0 };\n        const zeroSides = { top: zero, right: zero, bottom: zero, left: zero };\n        return sides ? { top: sides[0], right: sides[1], bottom: sides[2], left: sides[3] } : zeroSides;\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { CSSValue, isDimensionToken, isIdentToken } from '../syntax/parser';\nimport { TokenType } from '../syntax/tokenizer';\nimport { ICSSImage, image, isSupportedImage } from '../types/image';\nimport { Context } from '../../core/context';\n\nexport type BoxReflectDirection = 'below' | 'above' | 'left' | 'right';\n\nexport interface BoxReflect {\n    direction: BoxReflectDirection;\n    /** Gap between the element and its reflection, in pixels. */\n    offset: number;\n    /** Optional mask applied to the reflection (element coordinate space). */\n    mask: ICSSImage | null;\n}\n\nexport type BoxReflectValue = BoxReflect | null;\n\n/**\n * -webkit-box-reflect: <direction> <offset>? <mask-image>?\n *\n * Chrome serialises the computed value with the mask's border-image\n * bookkeeping appended (e.g. \"... linear-gradient(...) 0 fill / auto /\n * 0 stretch\"), so tokens after the image are parsed and ignored.\n */\nexport const webkitBoxReflect: IPropertyListDescriptor<BoxReflectValue> = {\n    name: '-webkit-box-reflect',\n    initialValue: 'none',\n    prefix: true,\n    type: PropertyDescriptorParsingType.LIST,\n    skipCache: true, // mask url() must reach the image cache on every pass\n    parse: (context: Context, tokens: CSSValue[]): BoxReflectValue => {\n        let direction: BoxReflectDirection | null = null;\n        let offset = 0;\n        let mask: ICSSImage | null = null;\n\n        for (const token of tokens) {\n            if (token.type === TokenType.WHITESPACE_TOKEN) continue;\n            if (direction === null && isIdentToken(token)) {\n                if (\n                    token.value === 'below' ||\n                    token.value === 'above' ||\n                    token.value === 'left' ||\n                    token.value === 'right'\n                ) {\n                    direction = token.value;\n                    continue;\n                }\n                if (token.value === 'none') {\n                    return null;\n                }\n            }\n            if (offset === 0 && isDimensionToken(token) && token.unit === 'px') {\n                offset = token.number;\n                continue;\n            }\n            if (mask === null && isSupportedImage(token)) {\n                mask = image.parse(context, token);\n                continue;\n            }\n            // Anything else (the mask's border-image bookkeeping) is ignored.\n        }\n\n        if (direction === null) {\n            return null;\n        }\n        return { direction, offset, mask };\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { at } from '../../core/util';\nimport { CSSValue } from '../syntax/parser';\nimport { isLengthPercentage, LengthPercentage, ZERO_LENGTH } from '../types/length-percentage';\nimport { Context } from '../../core/context';\n\n/**\n * CSS Transforms Level 2 independent `translate` property.\n * Computed values: `none`, `<length-percentage>`, `<length-percentage> <length-percentage>`\n * (a third z length may appear in computed values and is ignored — 2D renderer).\n * Percentages are resolved against the element bounds at paint time.\n */\nexport type TranslateValue = [LengthPercentage, LengthPercentage] | null;\n\nexport const translate: IPropertyListDescriptor<TranslateValue> = {\n    name: 'translate',\n    initialValue: 'none',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): TranslateValue => {\n        const values: LengthPercentage[] = [];\n        for (const token of tokens) {\n            if (isLengthPercentage(token)) {\n                values.push(token);\n            }\n        }\n        if (values.length === 0) {\n            return null;\n        }\n        return [at(values, 0), values.length > 1 ? at(values, 1) : ZERO_LENGTH];\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\nimport { at } from '../../core/util';\nimport { CSSValue, isNumberToken } from '../syntax/parser';\nimport { Context } from '../../core/context';\n\n/**\n * CSS Transforms Level 2 independent `scale` property.\n * Computed values: `none`, `<number>` (both axes), `<number> <number>` (x y).\n * Unlike a missing value in `transform: scale()`, a single value scales both\n * axes; y defaults to x per the individual-property grammar.\n */\nexport type ScaleValue = [number, number] | null;\n\nexport const scale: IPropertyListDescriptor<ScaleValue> = {\n    name: 'scale',\n    initialValue: 'none',\n    prefix: false,\n    type: PropertyDescriptorParsingType.LIST,\n    parse: (_context: Context, tokens: CSSValue[]): ScaleValue => {\n        const numbers: number[] = [];\n        for (const token of tokens) {\n            if (isNumberToken(token)) {\n                numbers.push(token.number);\n            }\n        }\n        if (numbers.length === 0) {\n            return null;\n        }\n        return [at(numbers, 0), numbers.length > 1 ? at(numbers, 1) : at(numbers, 0)];\n    }\n};\n","/**\n * Shared numeric constants used across html2canvas-pro.\n * Centralising magic numbers for maintainability.\n */\n\n/** Maximum entries in the CSS parse cache per descriptor (LRU). */\nexport const PARSE_CACHE_MAX_PER_DESCRIPTOR = 200;\n\n/** Maximum cached background-image patterns per render session (LRU). */\nexport const PATTERN_CACHE_MAX = 50;\n\n/** Maximum size of the image-resource cache (entries). */\nexport const DEFAULT_IMAGE_CACHE_SIZE = 100;\n\n/** Maximum allowed image-resource cache size. */\nexport const MAX_IMAGE_CACHE_SIZE = 10_000;\n\n/** Default image-load timeout in milliseconds. */\nexport const DEFAULT_IMAGE_TIMEOUT_MS = 15_000;\n\n/** Z-axis mask offset used during box-shadow rendering. */\nexport const SHADOW_MASK_OFFSET = 10_000;\n\n/** Polling interval (ms) when waiting for the cloned iframe to become ready. */\nexport const IFRAME_READY_POLL_MS = 50;\n\n/**\n * Total time (ms) to wait for the cloned iframe document to become ready\n * after its load event. A missed deadline resolves with a warning (the\n * capture continues with a possibly incomplete document).\n */\nexport const CLONE_READY_TIMEOUT_MS = 30_000;\n\n/**\n * Hard ceiling (ms) for the cloned iframe's load event itself. If the event\n * never fires, the mount is rejected instead of hanging forever.\n */\nexport const IFRAME_LOAD_WATCHDOG_MS = 60_000;\n\n/** Deferred resolution delay (ms) for inline XML images that may fail to parse. */\nexport const INLINE_IMAGE_RESOLVE_DELAY_MS = 500;\n\n/** Maximum characters logged for image/resource keys. */\nexport const RESOURCE_KEY_LOG_LENGTH = 256;\n","/**\n * CSS property registry and value parser.\n *\n * Owns the canonical list of parsed standard properties (the single place to\n * register a new CSS property: add the descriptor import and one table row)\n * and the shared LRU parse cache that turns computed style strings into\n * strongly-typed values.\n *\n * Extracted from css/index.ts so the declaration data class stays free of\n * parsing machinery.\n */\n\nimport { CSSPropertyDescriptor, PropertyDescriptorParsingType } from './property-descriptor';\nimport { backgroundClip } from './property-descriptors/background-clip';\nimport { backgroundColor } from './property-descriptors/background-color';\nimport { backgroundImage } from './property-descriptors/background-image';\nimport { backgroundOrigin } from './property-descriptors/background-origin';\nimport { backgroundPosition } from './property-descriptors/background-position';\nimport { backgroundRepeat } from './property-descriptors/background-repeat';\nimport { backgroundSize } from './property-descriptors/background-size';\nimport {\n    borderBottomColor,\n    borderLeftColor,\n    borderRightColor,\n    borderTopColor\n} from './property-descriptors/border-color';\nimport {\n    borderBottomLeftRadius,\n    borderBottomRightRadius,\n    borderTopLeftRadius,\n    borderTopRightRadius\n} from './property-descriptors/border-radius';\nimport {\n    borderBottomStyle,\n    borderLeftStyle,\n    borderRightStyle,\n    borderTopStyle\n} from './property-descriptors/border-style';\nimport {\n    borderBottomWidth,\n    borderLeftWidth,\n    borderRightWidth,\n    borderTopWidth\n} from './property-descriptors/border-width';\nimport { clipPath } from './property-descriptors/clip-path';\nimport { color } from './property-descriptors/color';\nimport { direction } from './property-descriptors/direction';\nimport { display } from './property-descriptors/display';\nimport { fontFamily } from './property-descriptors/font-family';\nimport { fontSize } from './property-descriptors/font-size';\nimport { letterSpacing } from './property-descriptors/letter-spacing';\nimport { lineBreak } from './property-descriptors/line-break';\nimport { lineHeight } from './property-descriptors/line-height';\nimport { listStyleImage } from './property-descriptors/list-style-image';\nimport { listStylePosition } from './property-descriptors/list-style-position';\nimport { listStyleType } from './property-descriptors/list-style-type';\nimport { marginBottom, marginLeft, marginRight, marginTop } from './property-descriptors/margin';\nimport { overflowWrap } from './property-descriptors/overflow-wrap';\nimport { paddingBottom, paddingLeft, paddingRight, paddingTop } from './property-descriptors/padding';\nimport { textAlign } from './property-descriptors/text-align';\nimport { position } from './property-descriptors/position';\nimport { textShadow } from './property-descriptors/text-shadow';\nimport { textTransform } from './property-descriptors/text-transform';\nimport { transform } from './property-descriptors/transform';\nimport { transformOrigin } from './property-descriptors/transform-origin';\nimport { rotate } from './property-descriptors/rotate';\nimport { visibility } from './property-descriptors/visibility';\nimport { wordBreak } from './property-descriptors/word-break';\nimport { whiteSpace } from './property-descriptors/white-space';\nimport { writingMode } from './property-descriptors/writing-mode';\nimport { zIndex } from './property-descriptors/z-index';\nimport { isIdentToken, Parser } from './syntax/parser';\nimport { Tokenizer } from './syntax/tokenizer';\nimport { color as colorType } from './types/color';\nimport { angle } from './types/angle';\nimport { image } from './types/image';\nimport { time } from './types/time';\nimport { opacity } from './property-descriptors/opacity';\nimport { textDecorationStyle } from './property-descriptors/text-decoration-style';\nimport { textDecorationThickness } from './property-descriptors/text-decoration-thickness';\nimport { textUnderlineOffset } from './property-descriptors/text-underline-offset';\nimport { isLengthPercentage, ZERO_LENGTH } from './types/length-percentage';\nimport { isLength } from './types/length';\nimport { fontWeight } from './property-descriptors/font-weight';\nimport { fontVariant } from './property-descriptors/font-variant';\nimport { fontStyle } from './property-descriptors/font-style';\nimport { duration } from './property-descriptors/duration';\nimport { boxShadow } from './property-descriptors/box-shadow';\nimport { paintOrder } from './property-descriptors/paint-order';\nimport { webkitTextStrokeColor } from './property-descriptors/webkit-text-stroke-color';\nimport { webkitTextStrokeWidth } from './property-descriptors/webkit-text-stroke-width';\nimport { webkitLineClamp } from './property-descriptors/webkit-line-clamp';\nimport { Context } from '../core/context';\nimport { objectFit } from './property-descriptors/object-fit';\nimport { textOverflow } from './property-descriptors/text-overflow';\nimport { imageRendering } from './property-descriptors/image-rendering';\nimport { mixBlendMode } from './property-descriptors/mix-blend-mode';\nimport { filter } from './property-descriptors/filter';\nimport { fontVariantLigatures } from './property-descriptors/font-variant-ligatures';\nimport { zoom } from './property-descriptors/zoom';\nimport { objectPosition } from './property-descriptors/object-position';\nimport { backgroundBlendMode } from './property-descriptors/background-blend-mode';\nimport { borderImageSource } from './property-descriptors/border-image-source';\nimport { borderImageSlice } from './property-descriptors/border-image-slice';\nimport { borderImageRepeat } from './property-descriptors/border-image-repeat';\nimport { boxDecorationBreak } from './property-descriptors/box-decoration-break';\nimport { accentColor } from './property-descriptors/accent-color';\nimport { webkitTextFillColor } from './property-descriptors/webkit-text-fill-color';\nimport { isolation } from './property-descriptors/isolation';\nimport { outlineColor, outlineOffset, outlineStyle, outlineWidth } from './property-descriptors/outline';\nimport { backdropFilter } from './property-descriptors/backdrop-filter';\nimport { maskImage, maskPosition, maskRepeat, maskSize } from './property-descriptors/mask';\nimport { textEmphasisColor, textEmphasisPosition, textEmphasisStyle } from './property-descriptors/text-emphasis';\nimport { borderImageOutset, borderImageWidth } from './property-descriptors/border-image-width';\nimport { webkitBoxReflect } from './property-descriptors/webkit-box-reflect';\nimport { translate } from './property-descriptors/translate';\nimport { scale } from './property-descriptors/scale';\nimport { PARSE_CACHE_MAX_PER_DESCRIPTOR } from '../core/constants';\n\nexport const STANDARD_PROPERTIES: [string, CSSPropertyDescriptor<unknown>, string][] = [\n    ['animationDuration', duration, 'animationDuration'],\n    ['backgroundClip', backgroundClip, 'backgroundClip'],\n    ['backgroundColor', backgroundColor, 'backgroundColor'],\n    ['backgroundImage', backgroundImage, 'backgroundImage'],\n    ['backgroundOrigin', backgroundOrigin, 'backgroundOrigin'],\n    ['backgroundPosition', backgroundPosition, 'backgroundPosition'],\n    ['backgroundRepeat', backgroundRepeat, 'backgroundRepeat'],\n    ['backgroundSize', backgroundSize, 'backgroundSize'],\n    ['borderTopColor', borderTopColor, 'borderTopColor'],\n    ['borderRightColor', borderRightColor, 'borderRightColor'],\n    ['borderBottomColor', borderBottomColor, 'borderBottomColor'],\n    ['borderLeftColor', borderLeftColor, 'borderLeftColor'],\n    ['borderTopLeftRadius', borderTopLeftRadius, 'borderTopLeftRadius'],\n    ['borderTopRightRadius', borderTopRightRadius, 'borderTopRightRadius'],\n    ['borderBottomRightRadius', borderBottomRightRadius, 'borderBottomRightRadius'],\n    ['borderBottomLeftRadius', borderBottomLeftRadius, 'borderBottomLeftRadius'],\n    ['borderTopStyle', borderTopStyle, 'borderTopStyle'],\n    ['borderRightStyle', borderRightStyle, 'borderRightStyle'],\n    ['borderBottomStyle', borderBottomStyle, 'borderBottomStyle'],\n    ['borderLeftStyle', borderLeftStyle, 'borderLeftStyle'],\n    ['borderTopWidth', borderTopWidth, 'borderTopWidth'],\n    ['borderRightWidth', borderRightWidth, 'borderRightWidth'],\n    ['borderBottomWidth', borderBottomWidth, 'borderBottomWidth'],\n    ['borderLeftWidth', borderLeftWidth, 'borderLeftWidth'],\n    ['boxShadow', boxShadow, 'boxShadow'],\n    ['clipPath', clipPath, 'clipPath'],\n    ['color', color, 'color'],\n    ['direction', direction, 'direction'],\n    ['display', display, 'display'],\n    ['fontFamily', fontFamily, 'fontFamily'],\n    ['fontSize', fontSize, 'fontSize'],\n    ['fontStyle', fontStyle, 'fontStyle'],\n    ['fontVariant', fontVariant, 'fontVariant'],\n    ['fontWeight', fontWeight, 'fontWeight'],\n    ['letterSpacing', letterSpacing, 'letterSpacing'],\n    ['lineBreak', lineBreak, 'lineBreak'],\n    ['lineHeight', lineHeight, 'lineHeight'],\n    ['listStyleImage', listStyleImage, 'listStyleImage'],\n    ['listStylePosition', listStylePosition, 'listStylePosition'],\n    ['listStyleType', listStyleType, 'listStyleType'],\n    ['marginTop', marginTop, 'marginTop'],\n    ['marginRight', marginRight, 'marginRight'],\n    ['marginBottom', marginBottom, 'marginBottom'],\n    ['marginLeft', marginLeft, 'marginLeft'],\n    ['opacity', opacity, 'opacity'],\n    ['overflowWrap', overflowWrap, 'overflowWrap'],\n    ['paddingTop', paddingTop, 'paddingTop'],\n    ['paddingRight', paddingRight, 'paddingRight'],\n    ['paddingBottom', paddingBottom, 'paddingBottom'],\n    ['paddingLeft', paddingLeft, 'paddingLeft'],\n    ['paintOrder', paintOrder, 'paintOrder'],\n    ['position', position, 'position'],\n    ['textAlign', textAlign, 'textAlign'],\n    ['textDecorationStyle', textDecorationStyle, 'textDecorationStyle'],\n    ['textDecorationThickness', textDecorationThickness, 'textDecorationThickness'],\n    ['textUnderlineOffset', textUnderlineOffset, 'textUnderlineOffset'],\n    ['textShadow', textShadow, 'textShadow'],\n    ['textTransform', textTransform, 'textTransform'],\n    ['textOverflow', textOverflow, 'textOverflow'],\n    ['transform', transform, 'transform'],\n    ['transformOrigin', transformOrigin, 'transformOrigin'],\n    ['rotate', rotate, 'rotate'],\n    ['translate', translate, 'translate'],\n    ['scale', scale, 'scale'],\n    ['visibility', visibility, 'visibility'],\n    ['webkitTextStrokeColor', webkitTextStrokeColor, 'webkitTextStrokeColor'],\n    ['webkitTextStrokeWidth', webkitTextStrokeWidth, 'webkitTextStrokeWidth'],\n    ['webkitLineClamp', webkitLineClamp, 'webkitLineClamp'],\n    ['wordBreak', wordBreak, 'wordBreak'],\n    ['whiteSpace', whiteSpace, 'whiteSpace'],\n    ['writingMode', writingMode, 'writingMode'],\n    ['zIndex', zIndex, 'zIndex'],\n    ['objectFit', objectFit, 'objectFit'],\n    ['imageRendering', imageRendering, 'imageRendering'],\n    ['mixBlendMode', mixBlendMode, 'mixBlendMode'],\n    ['filter', filter, 'filter'],\n    ['fontVariantLigatures', fontVariantLigatures, 'fontVariantLigatures'],\n    ['zoom', zoom, 'zoom'],\n    ['objectPosition', objectPosition, 'objectPosition'],\n    ['backgroundBlendMode', backgroundBlendMode, 'backgroundBlendMode'],\n    ['borderImageSource', borderImageSource, 'borderImageSource'],\n    ['borderImageSlice', borderImageSlice, 'borderImageSlice'],\n    ['borderImageRepeat', borderImageRepeat, 'borderImageRepeat'],\n    ['boxDecorationBreak', boxDecorationBreak, 'boxDecorationBreak'],\n    ['accentColor', accentColor, 'accentColor'],\n    ['webkitTextFillColor', webkitTextFillColor, 'webkitTextFillColor'],\n    ['isolation', isolation, 'isolation'],\n    ['outlineColor', outlineColor, 'outlineColor'],\n    ['outlineStyle', outlineStyle, 'outlineStyle'],\n    ['outlineWidth', outlineWidth, 'outlineWidth'],\n    ['outlineOffset', outlineOffset, 'outlineOffset'],\n    ['backdropFilter', backdropFilter, 'backdropFilter'],\n    ['maskImage', maskImage, 'maskImage'],\n    ['maskPosition', maskPosition, 'maskPosition'],\n    ['maskRepeat', maskRepeat, 'maskRepeat'],\n    ['maskSize', maskSize, 'maskSize'],\n    ['textEmphasisStyle', textEmphasisStyle, 'textEmphasisStyle'],\n    ['textEmphasisColor', textEmphasisColor, 'textEmphasisColor'],\n    ['textEmphasisPosition', textEmphasisPosition, 'textEmphasisPosition'],\n    ['borderImageWidth', borderImageWidth, 'borderImageWidth'],\n    ['borderImageOutset', borderImageOutset, 'borderImageOutset'],\n    ['webkitBoxReflect', webkitBoxReflect, 'webkitBoxReflect']\n];\n\nconst parseCache = new Map<CSSPropertyDescriptor<any>, Map<string, unknown>>();\n\nexport const parse = (context: Context, descriptor: CSSPropertyDescriptor<any>, style?: string | null) => {\n    let rawValue = style !== null && typeof style !== 'undefined' ? style.toString() : descriptor.initialValue;\n\n    // A whitespace-only (or empty) computed value makes the tokenizer emit only an\n    // EOF token, which parseComponentValue() turns into a \"unexpected EOF\" SyntaxError.\n    // Some browsers produce such values for web-component shadow styles (see #225);\n    // fall back to the descriptor's initialValue so capture never crashes on them.\n    if (rawValue.trim() === '') {\n        rawValue = descriptor.initialValue;\n    }\n\n    let valueCache = parseCache.get(descriptor);\n    if (valueCache) {\n        const cached = valueCache.get(rawValue);\n        if (cached !== undefined) {\n            valueCache.delete(rawValue);\n            valueCache.set(rawValue, cached);\n            return cached;\n        }\n    }\n\n    const tokenizer = Tokenizer.get();\n    tokenizer.write(rawValue);\n    const parser = new Parser(tokenizer.read());\n    Tokenizer.release(tokenizer);\n\n    // Use IIFE so TS infers the return type of each branch (no `let result: any`)\n    const result = (() => {\n        switch (descriptor.type) {\n            case PropertyDescriptorParsingType.IDENT_VALUE: {\n                const token = parser.parseComponentValue();\n                return descriptor.parse(context, isIdentToken(token) ? token.value : descriptor.initialValue);\n            }\n            case PropertyDescriptorParsingType.VALUE:\n                return descriptor.parse(context, parser.parseComponentValue());\n            case PropertyDescriptorParsingType.LIST:\n                return descriptor.parse(context, parser.parseComponentValues());\n            case PropertyDescriptorParsingType.TOKEN_VALUE:\n                return parser.parseComponentValue();\n            case PropertyDescriptorParsingType.TYPE_VALUE:\n                switch (descriptor.format) {\n                    case 'angle':\n                        return angle.parse(context, parser.parseComponentValue());\n                    case 'color':\n                        return colorType.parse(context, parser.parseComponentValue());\n                    case 'image':\n                        return image.parse(context, parser.parseComponentValue());\n                    case 'length': {\n                        const length = parser.parseComponentValue();\n                        return isLength(length) ? length : ZERO_LENGTH;\n                    }\n                    case 'length-percentage': {\n                        const value = parser.parseComponentValue();\n                        return isLengthPercentage(value) ? value : ZERO_LENGTH;\n                    }\n                    case 'time':\n                        return time.parse(context, parser.parseComponentValue());\n                }\n        }\n    })();\n\n    if (!valueCache) {\n        valueCache = new Map();\n        parseCache.set(descriptor, valueCache);\n    }\n    // Skip caching for descriptors whose parse() has the critical side effect\n    // of calling context.cache.addImage() which must run on every render pass\n    // (different cache instances per html2canvas call). Two paths:\n    // 1. Per-descriptor skipCache flag (backgroundImage, listStyleImage,\n    //    borderImageSource — all call image.parse() internally).\n    // 2. TYPE_VALUE + format 'image' — the image type descriptor itself,\n    //    which calls addImage() directly.\n    const skipCache =\n        descriptor.skipCache ||\n        (descriptor.type === PropertyDescriptorParsingType.TYPE_VALUE && descriptor.format === 'image');\n    if (!skipCache) {\n        if (valueCache.size >= PARSE_CACHE_MAX_PER_DESCRIPTOR) {\n            const oldestKey = valueCache.keys().next().value;\n            if (oldestKey !== undefined) {\n                valueCache.delete(oldestKey);\n            }\n        }\n        valueCache.set(rawValue, result);\n    }\n\n    return result;\n};\n","import type { CSSParsedDeclaration } from '../index';\n\n/**\n * Read-only grouped accessor for border-related CSS properties.\n *\n * Convenience accessors only — the render pipeline reads the top-level\n * parsed fields directly. Some underlying properties are parsed but not\n * rendered; see docs/features.md \"Known unsupported CSS features\".\n *\n * Provides structured access: `styles.border.topColor` as an alternative\n * to the flat `styles.borderTopColor`. Both forms remain valid.\n */\nexport class BorderStyles {\n    constructor(private readonly styles: CSSParsedDeclaration) {}\n\n    get topColor() {\n        return this.styles.borderTopColor;\n    }\n    get rightColor() {\n        return this.styles.borderRightColor;\n    }\n    get bottomColor() {\n        return this.styles.borderBottomColor;\n    }\n    get leftColor() {\n        return this.styles.borderLeftColor;\n    }\n\n    get topStyle() {\n        return this.styles.borderTopStyle;\n    }\n    get rightStyle() {\n        return this.styles.borderRightStyle;\n    }\n    get bottomStyle() {\n        return this.styles.borderBottomStyle;\n    }\n    get leftStyle() {\n        return this.styles.borderLeftStyle;\n    }\n\n    get topWidth() {\n        return this.styles.borderTopWidth;\n    }\n    get rightWidth() {\n        return this.styles.borderRightWidth;\n    }\n    get bottomWidth() {\n        return this.styles.borderBottomWidth;\n    }\n    get leftWidth() {\n        return this.styles.borderLeftWidth;\n    }\n\n    get topLeftRadius() {\n        return this.styles.borderTopLeftRadius;\n    }\n    get topRightRadius() {\n        return this.styles.borderTopRightRadius;\n    }\n    get bottomRightRadius() {\n        return this.styles.borderBottomRightRadius;\n    }\n    get bottomLeftRadius() {\n        return this.styles.borderBottomLeftRadius;\n    }\n\n    get imageSource() {\n        return this.styles.borderImageSource;\n    }\n    get imageSlice() {\n        return this.styles.borderImageSlice;\n    }\n    get imageRepeat() {\n        return this.styles.borderImageRepeat;\n    }\n\n    get boxShadow() {\n        return this.styles.boxShadow;\n    }\n}\n","import type { CSSParsedDeclaration } from '../index';\n\n/**\n * Read-only grouped accessor for background-related CSS properties.\n *\n * Convenience accessors only — the render pipeline reads the top-level\n * parsed fields directly. Some underlying properties are parsed but not\n * rendered; see docs/features.md \"Known unsupported CSS features\".\n */\nexport class BackgroundStyles {\n    constructor(private readonly styles: CSSParsedDeclaration) {}\n\n    get color() {\n        return this.styles.backgroundColor;\n    }\n    get image() {\n        return this.styles.backgroundImage;\n    }\n    get clip() {\n        return this.styles.backgroundClip;\n    }\n    get origin() {\n        return this.styles.backgroundOrigin;\n    }\n    get position() {\n        return this.styles.backgroundPosition;\n    }\n    get repeat() {\n        return this.styles.backgroundRepeat;\n    }\n    get size() {\n        return this.styles.backgroundSize;\n    }\n    get blendMode() {\n        return this.styles.backgroundBlendMode;\n    }\n}\n","import type { CSSParsedDeclaration } from '../index';\n\n/**\n * Read-only grouped accessor for font/text-related CSS properties.\n *\n * Convenience accessors only — the render pipeline reads the top-level\n * parsed fields directly. Some underlying properties are parsed but not\n * rendered; see docs/features.md \"Known unsupported CSS features\".\n */\nexport class FontStyles {\n    constructor(private readonly styles: CSSParsedDeclaration) {}\n\n    get family() {\n        return this.styles.fontFamily;\n    }\n    get size() {\n        return this.styles.fontSize;\n    }\n    get style() {\n        return this.styles.fontStyle;\n    }\n    get variant() {\n        return this.styles.fontVariant;\n    }\n    get weight() {\n        return this.styles.fontWeight;\n    }\n    get ligatures() {\n        return this.styles.fontVariantLigatures;\n    }\n\n    get color() {\n        return this.styles.color;\n    }\n    get letterSpacing() {\n        return this.styles.letterSpacing;\n    }\n    get lineHeight() {\n        return this.styles.lineHeight;\n    }\n    get textAlign() {\n        return this.styles.textAlign;\n    }\n    get textTransform() {\n        return this.styles.textTransform;\n    }\n    get textOverflow() {\n        return this.styles.textOverflow;\n    }\n    get textShadow() {\n        return this.styles.textShadow;\n    }\n    get textDecorationColor() {\n        return this.styles.textDecorationColor;\n    }\n    get textDecorationLine() {\n        return this.styles.textDecorationLine;\n    }\n    get textDecorationStyle() {\n        return this.styles.textDecorationStyle;\n    }\n    get textDecorationThickness() {\n        return this.styles.textDecorationThickness;\n    }\n    get textUnderlineOffset() {\n        return this.styles.textUnderlineOffset;\n    }\n    get wordBreak() {\n        return this.styles.wordBreak;\n    }\n    get lineBreak() {\n        return this.styles.lineBreak;\n    }\n    get overflowWrap() {\n        return this.styles.overflowWrap;\n    }\n    get writingMode() {\n        return this.styles.writingMode;\n    }\n    get direction() {\n        return this.styles.direction;\n    }\n\n    get webkitTextStrokeColor() {\n        return this.styles.webkitTextStrokeColor;\n    }\n    get webkitTextStrokeWidth() {\n        return this.styles.webkitTextStrokeWidth;\n    }\n    get webkitLineClamp() {\n        return this.styles.webkitLineClamp;\n    }\n\n    get paintOrder() {\n        return this.styles.paintOrder;\n    }\n}\n","import type { CSSParsedDeclaration } from '../index';\n\n/**\n * Read-only grouped accessor for layout/display/positioning CSS properties.\n *\n * Convenience accessors only — the render pipeline reads the top-level\n * parsed fields directly. Some underlying properties are parsed but not\n * rendered; see docs/features.md \"Known unsupported CSS features\".\n */\nexport class LayoutStyles {\n    constructor(private readonly styles: CSSParsedDeclaration) {}\n\n    get display() {\n        return this.styles.display;\n    }\n    get position() {\n        return this.styles.position;\n    }\n    get float() {\n        return this.styles.float;\n    }\n    // Explicit return type avoids name clash with z-index descriptor export.\n    get zIndex(): CSSParsedDeclaration['zIndex'] {\n        return this.styles.zIndex;\n    }\n\n    get marginTop() {\n        return this.styles.marginTop;\n    }\n    get marginRight() {\n        return this.styles.marginRight;\n    }\n    get marginBottom() {\n        return this.styles.marginBottom;\n    }\n    get marginLeft() {\n        return this.styles.marginLeft;\n    }\n\n    get paddingTop() {\n        return this.styles.paddingTop;\n    }\n    get paddingRight() {\n        return this.styles.paddingRight;\n    }\n    get paddingBottom() {\n        return this.styles.paddingBottom;\n    }\n    get paddingLeft() {\n        return this.styles.paddingLeft;\n    }\n\n    get overflowX() {\n        return this.styles.overflowX;\n    }\n    get overflowY() {\n        return this.styles.overflowY;\n    }\n\n    get opacity() {\n        return this.styles.opacity;\n    }\n    get visibility() {\n        return this.styles.visibility;\n    }\n\n    get transform() {\n        return this.styles.transform;\n    }\n    get transformOrigin() {\n        return this.styles.transformOrigin;\n    }\n    get rotate() {\n        return this.styles.rotate;\n    }\n    get zoom() {\n        return this.styles.zoom;\n    }\n\n    get clipPath() {\n        return this.styles.clipPath;\n    }\n    get mixBlendMode() {\n        return this.styles.mixBlendMode;\n    }\n    get filter() {\n        return this.styles.filter;\n    }\n    get imageRendering() {\n        return this.styles.imageRendering;\n    }\n\n    get objectFit() {\n        return this.styles.objectFit;\n    }\n    get objectPosition() {\n        return this.styles.objectPosition;\n    }\n    get boxDecorationBreak() {\n        return this.styles.boxDecorationBreak;\n    }\n\n    get listStyleImage() {\n        return this.styles.listStyleImage;\n    }\n    get listStylePosition() {\n        return this.styles.listStylePosition;\n    }\n    get listStyleType() {\n        return this.styles.listStyleType;\n    }\n\n    get animationDuration() {\n        return this.styles.animationDuration;\n    }\n\n    isVisible() {\n        return this.styles.isVisible();\n    }\n    isTransparent() {\n        return this.styles.isTransparent();\n    }\n    isTransformed() {\n        return this.styles.isTransformed();\n    }\n    isPositioned() {\n        return this.styles.isPositioned();\n    }\n    isPositionedWithZIndex() {\n        return this.styles.isPositionedWithZIndex();\n    }\n    isFloating() {\n        return this.styles.isFloating();\n    }\n    isInlineLevel() {\n        return this.styles.isInlineLevel();\n    }\n}\n","import { CSSValue } from './syntax/parser';\nimport { Color } from './types/color';\nimport { isTransparent } from './types/color-utilities';\nimport { DISPLAY } from './property-descriptors/display';\nimport { float, FLOAT } from './property-descriptors/float';\nimport { overflow, OVERFLOW } from './property-descriptors/overflow';\nimport { textDecorationColor } from './property-descriptors/text-decoration-color';\nimport { textDecorationLine } from './property-descriptors/text-decoration-line';\nimport { content } from './property-descriptors/content';\nimport { quotes } from './property-descriptors/quotes';\nimport { counterIncrement } from './property-descriptors/counter-increment';\nimport { counterReset } from './property-descriptors/counter-reset';\nimport { contains } from '../core/bitwise';\nimport { Context } from '../core/context';\nimport { parse, STANDARD_PROPERTIES } from './parse';\nimport { BorderStyles } from './grouped/border-styles';\nimport { BackgroundStyles } from './grouped/background-styles';\nimport { FontStyles } from './grouped/font-styles';\nimport { LayoutStyles } from './grouped/layout-styles';\n\n// Descriptors referenced by the special-case declarations below and by the\n// pseudo/counter declaration classes.\nimport { position, POSITION } from './property-descriptors/position';\nimport { visibility, VISIBILITY } from './property-descriptors/visibility';\nimport { letterSpacing } from './property-descriptors/letter-spacing';\nimport { lineBreak } from './property-descriptors/line-break';\nimport { listStyleImage } from './property-descriptors/list-style-image';\nimport { listStylePosition } from './property-descriptors/list-style-position';\nimport { listStyleType } from './property-descriptors/list-style-type';\nimport { opacity } from './property-descriptors/opacity';\nimport { textShadow } from './property-descriptors/text-shadow';\nimport { textTransform } from './property-descriptors/text-transform';\nimport { textDecorationStyle } from './property-descriptors/text-decoration-style';\nimport { textDecorationThickness } from './property-descriptors/text-decoration-thickness';\nimport { textUnderlineOffset } from './property-descriptors/text-underline-offset';\nimport { paintOrder } from './property-descriptors/paint-order';\nimport { webkitLineClamp } from './property-descriptors/webkit-line-clamp';\nimport { wordBreak } from './property-descriptors/word-break';\nimport { whiteSpace } from './property-descriptors/white-space';\nimport { writingMode } from './property-descriptors/writing-mode';\nimport { zIndex } from './property-descriptors/z-index';\nimport { MixBlendMode } from './property-descriptors/mix-blend-mode';\nimport { filter } from './property-descriptors/filter';\nimport { zoom } from './property-descriptors/zoom';\nimport { ClipPathValue } from './property-descriptors/clip-path';\nimport {\n    borderBottomLeftRadius,\n    borderBottomRightRadius,\n    borderTopLeftRadius,\n    borderTopRightRadius\n} from './property-descriptors/border-radius';\nimport {\n    borderBottomStyle,\n    borderLeftStyle,\n    borderRightStyle,\n    borderTopStyle\n} from './property-descriptors/border-style';\nimport {\n    borderBottomWidth,\n    borderLeftWidth,\n    borderRightWidth,\n    borderTopWidth\n} from './property-descriptors/border-width';\nimport { backgroundClip } from './property-descriptors/background-clip';\nimport { backgroundImage } from './property-descriptors/background-image';\nimport { backgroundOrigin } from './property-descriptors/background-origin';\nimport { backgroundPosition } from './property-descriptors/background-position';\nimport { backgroundRepeat } from './property-descriptors/background-repeat';\nimport { backgroundSize } from './property-descriptors/background-size';\nimport { boxShadow } from './property-descriptors/box-shadow';\nimport { direction } from './property-descriptors/direction';\nimport { display } from './property-descriptors/display';\nimport { fontFamily } from './property-descriptors/font-family';\nimport { fontStyle } from './property-descriptors/font-style';\nimport { fontVariant } from './property-descriptors/font-variant';\nimport { fontWeight } from './property-descriptors/font-weight';\nimport { duration } from './property-descriptors/duration';\nimport { overflowWrap } from './property-descriptors/overflow-wrap';\nimport { textAlign } from './property-descriptors/text-align';\nimport { transform } from './property-descriptors/transform';\nimport { transformOrigin } from './property-descriptors/transform-origin';\nimport { rotate } from './property-descriptors/rotate';\nimport { translate } from './property-descriptors/translate';\nimport { scale } from './property-descriptors/scale';\nimport { LengthPercentage } from './types/length-percentage';\nimport { webkitTextStrokeWidth } from './property-descriptors/webkit-text-stroke-width';\nimport { objectFit } from './property-descriptors/object-fit';\nimport { textOverflow } from './property-descriptors/text-overflow';\nimport { imageRendering } from './property-descriptors/image-rendering';\nimport { fontVariantLigatures } from './property-descriptors/font-variant-ligatures';\nimport { objectPosition } from './property-descriptors/object-position';\nimport { backgroundBlendMode } from './property-descriptors/background-blend-mode';\nimport { borderImageSource } from './property-descriptors/border-image-source';\nimport { borderImageSlice } from './property-descriptors/border-image-slice';\nimport { borderImageRepeat } from './property-descriptors/border-image-repeat';\nimport { boxDecorationBreak } from './property-descriptors/box-decoration-break';\nimport { type AccentColor } from './property-descriptors/accent-color';\nimport { type WebkitTextFillColor } from './property-descriptors/webkit-text-fill-color';\nimport { type ISOLATION } from './property-descriptors/isolation';\nimport { type OUTLINE_STYLE, type OutlineColor } from './property-descriptors/outline';\nimport { type FilterValue } from './property-descriptors/filter';\nimport { type MaskImage, type MaskPosition, type MaskRepeat, type MaskSize } from './property-descriptors/mask';\nimport {\n    type TextEmphasisColor,\n    type TextEmphasisPosition as TextEmphasisPositionValue,\n    type TextEmphasisStyle\n} from './property-descriptors/text-emphasis';\nimport { type BorderImageOutset, type BorderImageWidthSide } from './property-descriptors/border-image-width';\nimport { type BoxReflectValue } from './property-descriptors/webkit-box-reflect';\n\nexport class CSSParsedDeclaration {\n    animationDuration!: ReturnType<typeof duration.parse>;\n    backgroundClip!: ReturnType<typeof backgroundClip.parse>;\n    backgroundColor!: Color;\n    backgroundImage!: ReturnType<typeof backgroundImage.parse>;\n    backgroundOrigin!: ReturnType<typeof backgroundOrigin.parse>;\n    backgroundPosition!: ReturnType<typeof backgroundPosition.parse>;\n    backgroundRepeat!: ReturnType<typeof backgroundRepeat.parse>;\n    backgroundSize!: ReturnType<typeof backgroundSize.parse>;\n    borderTopColor!: Color;\n    borderRightColor!: Color;\n    borderBottomColor!: Color;\n    borderLeftColor!: Color;\n    borderTopLeftRadius!: ReturnType<typeof borderTopLeftRadius.parse>;\n    borderTopRightRadius!: ReturnType<typeof borderTopRightRadius.parse>;\n    borderBottomRightRadius!: ReturnType<typeof borderBottomRightRadius.parse>;\n    borderBottomLeftRadius!: ReturnType<typeof borderBottomLeftRadius.parse>;\n    borderTopStyle!: ReturnType<typeof borderTopStyle.parse>;\n    borderRightStyle!: ReturnType<typeof borderRightStyle.parse>;\n    borderBottomStyle!: ReturnType<typeof borderBottomStyle.parse>;\n    borderLeftStyle!: ReturnType<typeof borderLeftStyle.parse>;\n    borderTopWidth!: ReturnType<typeof borderTopWidth.parse>;\n    borderRightWidth!: ReturnType<typeof borderRightWidth.parse>;\n    borderBottomWidth!: ReturnType<typeof borderBottomWidth.parse>;\n    borderLeftWidth!: ReturnType<typeof borderLeftWidth.parse>;\n    boxShadow!: ReturnType<typeof boxShadow.parse>;\n    clipPath!: ClipPathValue;\n    color!: Color;\n    direction!: ReturnType<typeof direction.parse>;\n    display!: ReturnType<typeof display.parse>;\n    float!: ReturnType<typeof float.parse>;\n    fontFamily!: ReturnType<typeof fontFamily.parse>;\n    fontSize!: LengthPercentage;\n    fontStyle!: ReturnType<typeof fontStyle.parse>;\n    fontVariant!: ReturnType<typeof fontVariant.parse>;\n    fontWeight!: ReturnType<typeof fontWeight.parse>;\n    letterSpacing!: ReturnType<typeof letterSpacing.parse>;\n    lineBreak!: ReturnType<typeof lineBreak.parse>;\n    lineHeight!: CSSValue;\n    listStyleImage!: ReturnType<typeof listStyleImage.parse>;\n    listStylePosition!: ReturnType<typeof listStylePosition.parse>;\n    listStyleType!: ReturnType<typeof listStyleType.parse>;\n    marginTop!: CSSValue;\n    marginRight!: CSSValue;\n    marginBottom!: CSSValue;\n    marginLeft!: CSSValue;\n    opacity!: ReturnType<typeof opacity.parse>;\n    overflowX!: OVERFLOW;\n    overflowY!: OVERFLOW;\n    overflowWrap!: ReturnType<typeof overflowWrap.parse>;\n    paddingTop!: LengthPercentage;\n    paddingRight!: LengthPercentage;\n    paddingBottom!: LengthPercentage;\n    paddingLeft!: LengthPercentage;\n    paintOrder!: ReturnType<typeof paintOrder.parse>;\n    position!: ReturnType<typeof position.parse>;\n    textAlign!: ReturnType<typeof textAlign.parse>;\n    textDecorationColor!: Color;\n    textDecorationLine!: ReturnType<typeof textDecorationLine.parse>;\n    textDecorationStyle!: ReturnType<typeof textDecorationStyle.parse>;\n    textDecorationThickness!: ReturnType<typeof textDecorationThickness.parse>;\n    textUnderlineOffset!: ReturnType<typeof textUnderlineOffset.parse>;\n    textShadow!: ReturnType<typeof textShadow.parse>;\n    textTransform!: ReturnType<typeof textTransform.parse>;\n    textOverflow!: ReturnType<typeof textOverflow.parse>;\n    transform!: ReturnType<typeof transform.parse>;\n    transformOrigin!: ReturnType<typeof transformOrigin.parse>;\n    rotate!: ReturnType<typeof rotate.parse>;\n    translate!: ReturnType<typeof translate.parse>;\n    scale!: ReturnType<typeof scale.parse>;\n    visibility!: ReturnType<typeof visibility.parse>;\n    webkitTextStrokeColor!: Color;\n    webkitTextStrokeWidth!: ReturnType<typeof webkitTextStrokeWidth.parse>;\n    webkitLineClamp!: ReturnType<typeof webkitLineClamp.parse>;\n    wordBreak!: ReturnType<typeof wordBreak.parse>;\n    whiteSpace!: ReturnType<typeof whiteSpace.parse>;\n    writingMode!: ReturnType<typeof writingMode.parse>;\n    zIndex!: ReturnType<typeof zIndex.parse>;\n    objectFit!: ReturnType<typeof objectFit.parse>;\n    imageRendering!: ReturnType<typeof imageRendering.parse>;\n    mixBlendMode!: MixBlendMode;\n    filter!: ReturnType<typeof filter.parse>;\n    fontVariantLigatures!: ReturnType<typeof fontVariantLigatures.parse>;\n    zoom!: ReturnType<typeof zoom.parse>;\n    objectPosition!: ReturnType<typeof objectPosition.parse>;\n    backgroundBlendMode!: ReturnType<typeof backgroundBlendMode.parse>;\n    borderImageSource!: ReturnType<typeof borderImageSource.parse>;\n    borderImageSlice!: ReturnType<typeof borderImageSlice.parse>;\n    borderImageRepeat!: ReturnType<typeof borderImageRepeat.parse>;\n    boxDecorationBreak!: ReturnType<typeof boxDecorationBreak.parse>;\n    accentColor!: AccentColor;\n    webkitTextFillColor!: WebkitTextFillColor;\n    isolation!: ISOLATION;\n    outlineColor!: OutlineColor;\n    outlineStyle!: OUTLINE_STYLE;\n    outlineWidth!: number;\n    outlineOffset!: number;\n    backdropFilter!: FilterValue;\n    maskImage!: MaskImage;\n    maskPosition!: MaskPosition;\n    maskRepeat!: MaskRepeat;\n    maskSize!: MaskSize;\n    textEmphasisStyle!: TextEmphasisStyle;\n    textEmphasisColor!: TextEmphasisColor;\n    textEmphasisPosition!: TextEmphasisPositionValue;\n    borderImageWidth!: {\n        top: BorderImageWidthSide;\n        right: BorderImageWidthSide;\n        bottom: BorderImageWidthSide;\n        left: BorderImageWidthSide;\n    };\n    borderImageOutset!: BorderImageOutset;\n    webkitBoxReflect!: BoxReflectValue;\n\n    // ── Grouped read-only accessors ──────────────────────────────\n    private _border?: BorderStyles;\n    private _background?: BackgroundStyles;\n    private _font?: FontStyles;\n    private _layout?: LayoutStyles;\n\n    get border(): BorderStyles {\n        return this._border ?? (this._border = new BorderStyles(this));\n    }\n    get background(): BackgroundStyles {\n        return this._background ?? (this._background = new BackgroundStyles(this));\n    }\n    get font(): FontStyles {\n        return this._font ?? (this._font = new FontStyles(this));\n    }\n    get layout(): LayoutStyles {\n        return this._layout ?? (this._layout = new LayoutStyles(this));\n    }\n\n    constructor(context: Context, declaration: CSSStyleDeclaration) {\n        // Fast path: display:none elements are invisible and their descendants\n        // are never rendered. Parse only initial values instead of full computed styles.\n        if (declaration.display === 'none') {\n            this.display = DISPLAY.NONE;\n            for (const [key, descriptor] of STANDARD_PROPERTIES) {\n                if (key !== 'display') {\n                    (this as Record<string, unknown>)[key] = parse(context, descriptor, undefined);\n                }\n            }\n            Object.assign(this, parseSpecialDeclarations(context, null));\n            return;\n        }\n\n        for (const [key, descriptor, cssProp] of STANDARD_PROPERTIES) {\n            (this as Record<string, unknown>)[key] = parse(\n                context,\n                descriptor,\n                (declaration as unknown as Record<string, string | undefined>)[cssProp]\n            );\n        }\n\n        // Special cases that need different CSS property names or fallback values\n        Object.assign(this, parseSpecialDeclarations(context, declaration));\n    }\n\n    isVisible(): boolean {\n        return this.display > 0 && this.opacity > 0 && this.visibility === VISIBILITY.VISIBLE;\n    }\n\n    isTransparent(): boolean {\n        return isTransparent(this.backgroundColor);\n    }\n\n    isTransformed(): boolean {\n        return this.transform !== null || this.rotate !== null || this.translate !== null || this.scale !== null;\n    }\n\n    isPositioned(): boolean {\n        return this.position !== POSITION.STATIC;\n    }\n\n    isPositionedWithZIndex(): boolean {\n        return this.isPositioned() && !this.zIndex.auto;\n    }\n\n    isFloating(): boolean {\n        return this.float !== FLOAT.NONE;\n    }\n\n    isInlineLevel(): boolean {\n        return (\n            contains(this.display, DISPLAY.INLINE) ||\n            contains(this.display, DISPLAY.INLINE_BLOCK) ||\n            contains(this.display, DISPLAY.INLINE_FLEX) ||\n            contains(this.display, DISPLAY.INLINE_GRID) ||\n            contains(this.display, DISPLAY.INLINE_LIST_ITEM) ||\n            contains(this.display, DISPLAY.INLINE_TABLE)\n        );\n    }\n}\n\n/**\n * Special cases that need different CSS property names or fallback values.\n * Shared by the full parse path and the display:none fast path (which passes\n * `null` to fall back to initial values).\n */\nconst parseSpecialDeclarations = (context: Context, declaration: CSSStyleDeclaration | null) => {\n    const value = (prop: string, fallback?: string): string | undefined => {\n        if (!declaration) {\n            return undefined;\n        }\n        const source = declaration as unknown as Record<string, string | undefined>;\n        return source[prop] ?? fallback;\n    };\n\n    // overflow returns a tuple that must be split into X/Y\n    const overflowTuple = parse(context, overflow, value('overflow'));\n    return {\n        float: parse(context, float, value('cssFloat')),\n        textDecorationColor: parse(context, textDecorationColor, value('textDecorationColor', value('color'))),\n        textDecorationLine: parse(context, textDecorationLine, value('textDecorationLine', value('textDecoration'))),\n        overflowX: overflowTuple[0],\n        overflowY: overflowTuple[overflowTuple.length > 1 ? 1 : 0]\n    };\n};\n\nexport class CSSParsedPseudoDeclaration {\n    content: ReturnType<typeof content.parse>;\n    quotes: ReturnType<typeof quotes.parse>;\n\n    constructor(context: Context, declaration: CSSStyleDeclaration) {\n        this.content = parse(context, content, declaration.content);\n        this.quotes = parse(context, quotes, declaration.quotes);\n    }\n}\n\nexport class CSSParsedCounterDeclaration {\n    counterIncrement: ReturnType<typeof counterIncrement.parse>;\n    counterReset: ReturnType<typeof counterReset.parse>;\n\n    constructor(context: Context, declaration: CSSStyleDeclaration) {\n        this.counterIncrement = parse(context, counterIncrement, declaration.counterIncrement);\n        this.counterReset = parse(context, counterReset, declaration.counterReset);\n    }\n}\n","const elementDebuggerAttribute = 'data-html2canvas-debug';\nexport const enum DebuggerType {\n    NONE,\n    ALL,\n    CLONE,\n    PARSE,\n    RENDER\n}\n\nconst getElementDebugType = (element: Element): DebuggerType => {\n    if (typeof element.getAttribute !== 'function') {\n        return DebuggerType.NONE;\n    }\n    const attribute = element.getAttribute(elementDebuggerAttribute);\n    switch (attribute) {\n        case 'all':\n            return DebuggerType.ALL;\n        case 'clone':\n            return DebuggerType.CLONE;\n        case 'parse':\n            return DebuggerType.PARSE;\n        case 'render':\n            return DebuggerType.RENDER;\n        default:\n            return DebuggerType.NONE;\n    }\n};\n\nexport const isDebugging = (element: Element, type: Omit<DebuggerType, DebuggerType.NONE>): boolean => {\n    const elementType = getElementDebugType(element);\n    return elementType === DebuggerType.ALL || type === elementType;\n};\n","/**\n * Constructable stylesheet cloning (adoptedStyleSheets).\n *\n * `adoptedStyleSheets` on a Document or ShadowRoot is the standard way Lit,\n * React and other frameworks inject component styles, but the sheets are not\n * part of the node tree — cloneNode never carries them. A shadow root that\n * relies on adopted sheets (and whose computed styles are not inlined per\n * element, i.e. copyStyles is false) would otherwise lose those rules in the\n * clone. The rules are re-materialised as a regular <style> element, which\n * also cascades last like the spec treats adopted sheets.\n */\n\n/**\n * Serialize the CSS rules of the given sheets into one stylesheet string.\n * Sheets that cannot be read (e.g. detached) are skipped rather than failing\n * the render.\n */\nexport const serializeStyleSheetRules = (sheets: readonly CSSStyleSheet[]): string => {\n    let css = '';\n    for (const sheet of sheets) {\n        try {\n            const rules = sheet.cssRules;\n            for (let i = 0; i < rules.length; i++) {\n                const rule = rules[i];\n                if (rule && typeof rule.cssText === 'string') {\n                    css += rule.cssText;\n                }\n            }\n        } catch (e) {\n            // Unreadable sheet (SecurityError or detached): skip it.\n        }\n    }\n    return css;\n};\n\n/**\n * Build a <style> element carrying the rules of the given adopted sheets, or\n * null when there is nothing to clone. `styleDocument` must be the document\n * the clone lives in.\n */\nexport const createAdoptedStylesElement = (\n    styleDocument: Document,\n    sheets: readonly CSSStyleSheet[],\n    nonce?: string\n): HTMLStyleElement | null => {\n    const css = serializeStyleSheetRules(sheets);\n    if (!css) {\n        return null;\n    }\n    const style = styleDocument.createElement('style');\n    style.textContent = css;\n    if (nonce) {\n        style.nonce = nonce;\n    }\n    return style;\n};\n","import { isElementNode, isScriptElement, isSlotElement, isStyleElement } from './node-type-guards';\nimport { Context } from '../core/context';\nimport { createAdoptedStylesElement } from './adopted-styles';\n\n/** Options subset needed by SlotCloner */\nexport interface SlotClonerOptions {\n    ignoreElements?: (element: Element) => boolean;\n    copyStyles: boolean;\n    /** CSP nonce applied to synthesized <style> elements (adopted sheets). */\n    cspNonce?: string;\n}\n\n/** Exported for reuse in document-cloner.ts */\nexport const IGNORE_ATTRIBUTE = 'data-html2canvas-ignore';\n\n/**\n * Handles shadow DOM child cloning, slot assignment, and light DOM traversal.\n * Extracted from DocumentCloner to reduce file size and improve separation of concerns.\n */\nexport class SlotCloner {\n    constructor(\n        private readonly cloneNodeFn: (node: Node, copyStyles: boolean) => Node,\n        private readonly options: SlotClonerOptions,\n        private readonly context: Context\n    ) {}\n\n    appendChildNode(clone: HTMLElement | SVGElement, child: Node, copyStyles: boolean): void {\n        this.safeAppendClonedChild(clone, child, copyStyles);\n    }\n\n    /**\n     * Clone child nodes from source element to clone element.\n     * Handles shadow DOM, slots, and light DOM appropriately.\n     */\n    cloneChildNodes(node: Element, clone: HTMLElement | SVGElement, copyStyles: boolean): void {\n        if (node.shadowRoot && clone.shadowRoot) {\n            // Both original and clone have shadow roots - clone shadow DOM content\n            this.cloneShadowDOMChildren(node.shadowRoot, clone.shadowRoot, copyStyles);\n            // Also clone light DOM (slot content sources)\n            this.cloneLightDOMChildren(node, clone, copyStyles);\n        } else if (node.shadowRoot && !clone.shadowRoot) {\n            // Original has shadow root but clone doesn't (creation failed)\n            // Fallback: clone shadow DOM content as light DOM to preserve content\n            this.cloneShadowDOMAsLightDOM(node.shadowRoot, clone, copyStyles);\n        } else {\n            // No shadow DOM - just clone light DOM children\n            this.cloneLightDOMChildren(node, clone, copyStyles);\n        }\n    }\n\n    /**\n     * Check if a child node should be cloned based on filtering rules.\n     * Filters out: scripts, ignored elements, and optionally styles.\n     */\n    private shouldCloneChild(child: Node): boolean {\n        return (\n            !isElementNode(child) ||\n            (!isScriptElement(child) &&\n                !child.hasAttribute(IGNORE_ATTRIBUTE) &&\n                (typeof this.options.ignoreElements !== 'function' || !this.options.ignoreElements(child)))\n        );\n    }\n\n    /**\n     * Check if a style element should be cloned based on copyStyles option.\n     */\n    private shouldCloneStyleElement(child: Node): boolean {\n        return !this.options.copyStyles || !isElementNode(child) || !isStyleElement(child);\n    }\n\n    /**\n     * Safely append a cloned child to a target, applying all filtering rules.\n     */\n    private safeAppendClonedChild(\n        target: ShadowRoot | HTMLElement | SVGElement,\n        child: Node,\n        copyStyles: boolean\n    ): void {\n        if (this.shouldCloneChild(child) && this.shouldCloneStyleElement(child)) {\n            target.appendChild(this.cloneNodeFn(child, copyStyles));\n        }\n    }\n\n    /**\n     * Clone assigned nodes from a slot element to the target.\n     */\n    private cloneAssignedNodes(assignedNodes: Node[], target: ShadowRoot, copyStyles: boolean): void {\n        assignedNodes.forEach((node) => {\n            this.safeAppendClonedChild(target, node, copyStyles);\n        });\n    }\n\n    /**\n     * Clone fallback content from a slot element when no nodes are assigned.\n     */\n    private cloneSlotFallbackContent(slot: Element, target: ShadowRoot, copyStyles: boolean): void {\n        for (let child = slot.firstChild; child; child = child.nextSibling) {\n            this.safeAppendClonedChild(target, child, copyStyles);\n        }\n    }\n\n    /**\n     * Handle cloning of a slot element, including assigned nodes or fallback content.\n     */\n    private cloneSlotElement(slot: Element, targetShadowRoot: ShadowRoot, copyStyles: boolean): void {\n        if (!isSlotElement(slot)) {\n            return;\n        }\n\n        const slotElement = slot as HTMLSlotElement;\n\n        // Defensive check: ensure assignedNodes method exists\n        if (typeof slotElement.assignedNodes !== 'function') {\n            this.context.logger.warn('HTMLSlotElement.assignedNodes is not available', slot);\n            this.cloneSlotFallbackContent(slot, targetShadowRoot, copyStyles);\n            return;\n        }\n\n        const assignedNodes = slotElement.assignedNodes();\n\n        // Defensive check: ensure assignedNodes returns an array\n        if (!assignedNodes || !Array.isArray(assignedNodes)) {\n            this.context.logger.warn('assignedNodes() did not return a valid array', slot);\n            this.cloneSlotFallbackContent(slot, targetShadowRoot, copyStyles);\n            return;\n        }\n\n        if (assignedNodes.length > 0) {\n            // Clone assigned nodes\n            this.cloneAssignedNodes(assignedNodes, targetShadowRoot, copyStyles);\n        } else {\n            // Clone fallback content\n            this.cloneSlotFallbackContent(slot, targetShadowRoot, copyStyles);\n        }\n    }\n\n    /**\n     * Clone shadow DOM children to the target shadow root.\n     */\n    private cloneShadowDOMChildren(shadowRoot: ShadowRoot, targetShadowRoot: ShadowRoot, copyStyles: boolean): void {\n        for (let child = shadowRoot.firstChild; child; child = child.nextSibling) {\n            if (isElementNode(child) && isSlotElement(child)) {\n                // Handle slot elements specially\n                this.cloneSlotElement(child, targetShadowRoot, copyStyles);\n            } else {\n                // Clone regular elements\n                this.safeAppendClonedChild(targetShadowRoot, child, copyStyles);\n            }\n        }\n        this.appendAdoptedStyleSheets(shadowRoot, targetShadowRoot, copyStyles);\n    }\n\n    /**\n     * Clone light DOM children to the target element.\n     */\n    private cloneLightDOMChildren(node: Element, clone: HTMLElement | SVGElement, copyStyles: boolean): void {\n        for (let child = node.firstChild; child; child = child.nextSibling) {\n            this.appendChildNode(clone, child, copyStyles);\n        }\n    }\n\n    /**\n     * Clone slot element as light DOM when shadow root creation failed.\n     */\n    private cloneSlotElementAsLightDOM(slot: Element, clone: HTMLElement | SVGElement, copyStyles: boolean): void {\n        if (!isSlotElement(slot)) {\n            return;\n        }\n\n        const slotElement = slot as HTMLSlotElement;\n\n        if (typeof slotElement.assignedNodes !== 'function') {\n            // Fallback: clone slot's children\n            for (let child = slot.firstChild; child; child = child.nextSibling) {\n                this.appendChildNode(clone, child, copyStyles);\n            }\n            return;\n        }\n\n        const assignedNodes = slotElement.assignedNodes();\n\n        if (assignedNodes && Array.isArray(assignedNodes) && assignedNodes.length > 0) {\n            // Clone assigned nodes as light DOM\n            assignedNodes.forEach((node) => this.appendChildNode(clone, node, copyStyles));\n        } else {\n            // Clone fallback content as light DOM\n            for (let child = slot.firstChild; child; child = child.nextSibling) {\n                this.appendChildNode(clone, child, copyStyles);\n            }\n        }\n    }\n\n    /**\n     * Clone shadow DOM content as light DOM when shadow root creation failed.\n     * This is a fallback mechanism to ensure content is not lost.\n     */\n    private cloneShadowDOMAsLightDOM(\n        shadowRoot: ShadowRoot,\n        clone: HTMLElement | SVGElement,\n        copyStyles: boolean\n    ): void {\n        for (let child = shadowRoot.firstChild; child; child = child.nextSibling) {\n            if (isElementNode(child) && isSlotElement(child)) {\n                this.cloneSlotElementAsLightDOM(child, clone, copyStyles);\n            } else {\n                this.appendChildNode(clone, child, copyStyles);\n            }\n        }\n        this.appendAdoptedStyleSheets(shadowRoot, clone, copyStyles);\n    }\n\n    /**\n     * Re-materialise the shadow root's constructable stylesheets (adoptedStyleSheets)\n     * as a <style> element in the clone — cloneNode never carries them.\n     *\n     * Skipped when computed styles are inlined per element (copyStyles), mirroring\n     * how <style> elements inside shadow roots are dropped in that mode.\n     */\n    private appendAdoptedStyleSheets(\n        shadowRoot: ShadowRoot,\n        target: ShadowRoot | HTMLElement | SVGElement,\n        copyStyles: boolean\n    ): void {\n        if (copyStyles) {\n            return;\n        }\n        const sheets = shadowRoot.adoptedStyleSheets;\n        if (!sheets || sheets.length === 0) {\n            return;\n        }\n        // The style element must live in the clone's document; a ShadowRoot has\n        // no ownerDocument of its own, so go through its host.\n        const styleDocument = 'host' in target ? target.host.ownerDocument : target.ownerDocument;\n        if (!styleDocument) {\n            return;\n        }\n        const style = createAdoptedStylesElement(styleDocument, sheets, this.options.cspNonce);\n        if (style) {\n            target.appendChild(style);\n        }\n    }\n}\n","/**\n * Computed-style copying for cloned elements.\n *\n * Copies every computed CSS property of the source element onto the clone's\n * inline style so the clone renders identically without stylesheets (the\n * clone iframe only carries the <style> tags the cloner could read).\n */\n\nconst ignoredStyleProperties = [\n    'all', // #2476\n    'd', // #2483\n    'content' // Safari shows pseudoelements if content is set\n];\n\nexport const copyCSSStyles = <T extends HTMLElement | SVGElement>(style: CSSStyleDeclaration, target: T): T => {\n    const parts: string[] = [];\n    for (let i = style.length - 1; i >= 0; i--) {\n        const property = style.item(i);\n        // fix: Chrome_138 ignore custom properties\n        if (ignoredStyleProperties.indexOf(property) === -1 && !property.startsWith('--')) {\n            const value = style.getPropertyValue(property);\n            if (value) {\n                const priority = style.getPropertyPriority(property);\n                parts.push(priority ? `${property}:${value} !${priority}` : `${property}:${value}`);\n            }\n        }\n    }\n    if (parts.length > 0) {\n        target.style.cssText = parts.join(';') + ';';\n    }\n    return target;\n};\n","/**\n * Pseudo-element (::before / ::after) content resolution.\n *\n * Extracted from DocumentCloner: the cloner creates surrogate\n * `<html2canvaspseudoelement>` nodes carrying the pseudo's computed styles and\n * resolved content tokens (strings, url() images, attr(), counter(s), and\n * quotes) as children of the cloning element. The hide classes ensure the\n * surrogate itself is never painted; only its children are.\n */\n\nimport { isIdentToken, nonFunctionArgSeparator } from '../css/syntax/parser';\nimport { TokenType } from '../css/syntax/tokenizer';\nimport { CounterState, createCounterText } from '../css/types/functions/counter';\nimport { LIST_STYLE_TYPE, listStyleType } from '../css/property-descriptors/list-style-type';\nimport { CSSParsedCounterDeclaration, CSSParsedPseudoDeclaration } from '../css/index';\nimport { getQuote } from '../css/property-descriptors/quotes';\nimport { Context } from '../core/context';\nimport { copyCSSStyles } from './copy-css-styles';\nimport { isSVGElementNode } from './node-type-guards';\n\nexport enum PseudoElementType {\n    BEFORE,\n    AFTER\n}\n\nconst PSEUDO_BEFORE = ':before';\nconst PSEUDO_AFTER = ':after';\nconst PSEUDO_HIDE_ELEMENT_CLASS_BEFORE = '___html2canvas___pseudoelement_before';\nconst PSEUDO_HIDE_ELEMENT_CLASS_AFTER = '___html2canvas___pseudoelement_after';\n\nconst PSEUDO_HIDE_ELEMENT_STYLE = `{\n    content: \"\" !important;\n    display: none !important;\n}`;\n\n/**\n * Inject the stylesheet that hides pseudo-element surrogate containers.\n * Called on the cloned <body> so the surrogates themselves never render.\n */\nexport const createPseudoHideStyles = (body: HTMLElement, cspNonce?: string): void => {\n    createStyles(\n        body,\n        `.${PSEUDO_HIDE_ELEMENT_CLASS_BEFORE}${PSEUDO_BEFORE}${PSEUDO_HIDE_ELEMENT_STYLE}\n         .${PSEUDO_HIDE_ELEMENT_CLASS_AFTER}${PSEUDO_AFTER}${PSEUDO_HIDE_ELEMENT_STYLE}`,\n        cspNonce\n    );\n};\n\nconst createStyles = (body: HTMLElement, styles: string, cspNonce?: string): void => {\n    const document = body.ownerDocument;\n    if (document) {\n        const style = document.createElement('style');\n        style.textContent = styles;\n        if (cspNonce) {\n            style.nonce = cspNonce;\n        }\n        body.appendChild(style);\n    }\n};\n\n/**\n * Resolves computed `content` of ::before/::after into surrogate DOM nodes.\n *\n * One instance per DocumentCloner: `quoteDepth` tracks open-quote/close-quote\n * pairing across the whole clone walk, shared with the cloner's counter state.\n */\nexport class PseudoContentResolver {\n    private quoteDepth = 0;\n\n    constructor(\n        private readonly context: Context,\n        private readonly counters: CounterState\n    ) {}\n\n    resolvePseudoContent(\n        node: Element,\n        clone: Element,\n        style: CSSStyleDeclaration,\n        pseudoElt: PseudoElementType\n    ): HTMLElement | void {\n        if (!style) {\n            return;\n        }\n\n        const value = style.content;\n        const document = clone.ownerDocument;\n        if (!document || !value || value === 'none' || value === '-moz-alt-content' || style.display === 'none') {\n            return;\n        }\n\n        this.counters.parse(new CSSParsedCounterDeclaration(this.context, style));\n        const declaration = new CSSParsedPseudoDeclaration(this.context, style);\n\n        const anonymousReplacedElement = document.createElement('html2canvaspseudoelement');\n        copyCSSStyles(style, anonymousReplacedElement);\n\n        declaration.content.forEach((token) => {\n            if (token.type === TokenType.STRING_TOKEN) {\n                anonymousReplacedElement.appendChild(document.createTextNode(token.value));\n            } else if (token.type === TokenType.URL_TOKEN) {\n                const img = document.createElement('img');\n                img.src = token.value;\n                img.style.opacity = '1';\n                anonymousReplacedElement.appendChild(img);\n            } else if (token.type === TokenType.FUNCTION) {\n                if (token.name === 'attr') {\n                    const attr = token.values.filter(isIdentToken);\n                    if (attr.length && attr[0]) {\n                        anonymousReplacedElement.appendChild(\n                            document.createTextNode(node.getAttribute(attr[0].value) || '')\n                        );\n                    }\n                } else if (token.name === 'counter') {\n                    const [counter, counterStyle] = token.values.filter(nonFunctionArgSeparator);\n                    if (counter && isIdentToken(counter)) {\n                        const counterState = this.counters.getCounterValue(counter.value);\n                        const counterType =\n                            counterStyle && isIdentToken(counterStyle)\n                                ? listStyleType.parse(this.context, counterStyle.value)\n                                : LIST_STYLE_TYPE.DECIMAL;\n\n                        anonymousReplacedElement.appendChild(\n                            document.createTextNode(createCounterText(counterState, counterType, false))\n                        );\n                    }\n                } else if (token.name === 'counters') {\n                    const [counter, delim, counterStyle] = token.values.filter(nonFunctionArgSeparator);\n                    if (counter && isIdentToken(counter)) {\n                        const counterStates = this.counters.getCounterValues(counter.value);\n                        const counterType =\n                            counterStyle && isIdentToken(counterStyle)\n                                ? listStyleType.parse(this.context, counterStyle.value)\n                                : LIST_STYLE_TYPE.DECIMAL;\n                        const separator = delim && delim.type === TokenType.STRING_TOKEN ? delim.value : '';\n                        const text = counterStates\n                            .map((value) => createCounterText(value, counterType, false))\n                            .join(separator);\n\n                        anonymousReplacedElement.appendChild(document.createTextNode(text));\n                    }\n                }\n            } else if (token.type === TokenType.IDENT_TOKEN) {\n                switch (token.value) {\n                    case 'open-quote':\n                        anonymousReplacedElement.appendChild(\n                            document.createTextNode(getQuote(declaration.quotes, this.quoteDepth++, true))\n                        );\n                        break;\n                    case 'close-quote': {\n                        // Per CSS, close-quote at depth 0 renders nothing and\n                        // must not drive the depth negative: an unbalanced\n                        // close-quote would otherwise shift every later quote\n                        // level by one.\n                        const hasOpenQuote = this.quoteDepth > 0;\n                        this.quoteDepth = Math.max(0, this.quoteDepth - 1);\n                        if (hasOpenQuote) {\n                            anonymousReplacedElement.appendChild(\n                                document.createTextNode(getQuote(declaration.quotes, this.quoteDepth, false))\n                            );\n                        }\n                        break;\n                    }\n                    default:\n                        // safari doesn't parse string tokens correctly because of lack of quotes\n                        anonymousReplacedElement.appendChild(document.createTextNode(token.value));\n                }\n            }\n        });\n\n        anonymousReplacedElement.className = `${PSEUDO_HIDE_ELEMENT_CLASS_BEFORE} ${PSEUDO_HIDE_ELEMENT_CLASS_AFTER}`;\n        const newClassName =\n            pseudoElt === PseudoElementType.BEFORE\n                ? ` ${PSEUDO_HIDE_ELEMENT_CLASS_BEFORE}`\n                : ` ${PSEUDO_HIDE_ELEMENT_CLASS_AFTER}`;\n\n        if (isSVGElementNode(clone)) {\n            clone.className.baseValue += newClassName;\n        } else {\n            clone.className += newClassName;\n        }\n\n        return anonymousReplacedElement;\n    }\n}\n","/**\n * AbortSignal helper utilities.\n */\n\n/**\n * Throw a DOMException if the given AbortSignal is already aborted.\n * Used at checkpoints throughout the rendering pipeline to support\n * cancellable renders.\n *\n * @param signal - The AbortSignal to check. If undefined or not aborted, this is a no-op.\n * @throws {DOMException} With name 'AbortError' if the signal has been aborted.\n */\nexport const throwIfAborted = (signal?: AbortSignal): void => {\n    if (signal?.aborted) {\n        throw new DOMException('The operation was aborted.', 'AbortError');\n    }\n};\n","/**\n * Mounts the cloned document into a hidden iframe and waits for it to become\n * paintable.\n *\n * Extracted from DocumentCloner so the cloner only owns node-cloning strategy;\n * this module owns the iframe lifecycle: container creation, document.write,\n * Trusted Types, load polling, webfont/image readiness, the onclone hook and\n * WebKit scroll-anchoring compensation.\n */\n\nimport { Bounds } from '../css/layout/bounds';\nimport { Context } from '../core/context';\nimport { CLONE_READY_TIMEOUT_MS, IFRAME_LOAD_WATCHDOG_MS, IFRAME_READY_POLL_MS } from '../core/constants';\nimport { throwIfAborted } from '../core/abort-helper';\nimport { IGNORE_ATTRIBUTE } from './slot-cloner';\n\nexport interface CloneMountOptions {\n    /** Cloned <html> root to adopt into the iframe document. */\n    documentElement: HTMLElement;\n    /** Clone of the render target; must exist before mounting. */\n    clonedReferenceElement: HTMLElement | undefined;\n    /** nodeName of the original render target, for error messages. */\n    referenceElementName: string;\n    /** [clonedNode, scrollLeft, scrollTop] pairs captured during cloning. */\n    scrolledElements: [Element, number, number][];\n    /** Consumer hook, invoked with the cloned document before measuring. */\n    onclone?: (document: Document, element: HTMLElement) => void;\n    /** Mount the iframe inside a shadow root instead of <body>. */\n    container?: HTMLElement | ShadowRoot;\n    /**\n     * Aborting rejects the mount (iframe poll, font/image waits) with an\n     * AbortError instead of waiting out the readiness windows.\n     */\n    signal?: AbortSignal;\n}\n\n/**\n * Trusted Types factory (trustedTypes object) for document.write in strict CSP environments.\n */\ntype TrustedTypesFactoryLike = {\n    getPolicy?: (name: string) => unknown;\n    createPolicy: (name: string, config: object) => unknown;\n};\n\ntype TrustedTypePolicyLike = { createHTML: (s: string) => string };\n\n// Named policies cannot be created twice and lookups are realm-scoped, so\n// cache one policy per trustedTypes factory instead of attempting\n// createPolicy on every render (a second attempt throws TypeError).\nconst trustedTypePolicies = new WeakMap<TrustedTypesFactoryLike, TrustedTypePolicyLike | null>();\n\n/**\n * Resolve the Trusted Types policy used for writing the clone document.\n * Returns null when Trusted Types are unavailable or the policy could not be\n * created — document.write is not a Trusted Types sink, so the plain string\n * stays functional in both cases.\n * @internal – exported for testing only.\n */\nexport const resolveTrustedTypesPolicy = (ownerWindow: Window | null): TrustedTypePolicyLike | null => {\n    const factory = ownerWindow && (ownerWindow as Window & { trustedTypes?: TrustedTypesFactoryLike }).trustedTypes;\n    if (!factory) {\n        return null;\n    }\n    if (trustedTypePolicies.has(factory)) {\n        return trustedTypePolicies.get(factory) ?? null;\n    }\n    let policy: TrustedTypePolicyLike | null = null;\n    try {\n        const existing = factory.getPolicy?.('html2canvas-pro') as TrustedTypePolicyLike | undefined;\n        policy =\n            existing ??\n            (factory.createPolicy('html2canvas-pro', { createHTML: (s: string) => s }) as TrustedTypePolicyLike);\n    } catch (e) {\n        // Duplicate policy name or refused creation: cache the failure so\n        // subsequent renders skip the attempt instead of throwing again.\n        policy = null;\n    }\n    trustedTypePolicies.set(factory, policy);\n    return policy;\n};\n\nexport const createIFrameContainer = (\n    ownerDocument: Document,\n    bounds: Bounds,\n    customContainer?: HTMLElement | ShadowRoot\n): HTMLIFrameElement => {\n    const cloneIframeContainer = ownerDocument.createElement('iframe');\n\n    cloneIframeContainer.className = 'html2canvas-container';\n    cloneIframeContainer.style.visibility = 'hidden';\n    cloneIframeContainer.style.position = 'fixed';\n    cloneIframeContainer.style.left = '-10000px';\n    cloneIframeContainer.style.top = '0px';\n    cloneIframeContainer.style.border = '0';\n    cloneIframeContainer.width = bounds.width.toString();\n    cloneIframeContainer.height = bounds.height.toString();\n    cloneIframeContainer.scrolling = 'no'; // ios won't scroll without it\n    cloneIframeContainer.setAttribute(IGNORE_ATTRIBUTE, 'true');\n\n    // Use custom container if provided, otherwise use body\n    const container = customContainer || ownerDocument.body;\n    container.appendChild(cloneIframeContainer);\n\n    return cloneIframeContainer;\n};\n\nconst imageReady = (img: HTMLImageElement): Promise<Event | void | string> => {\n    return new Promise((resolve) => {\n        if (img.complete) {\n            resolve();\n            return;\n        }\n        if (!img.src) {\n            resolve();\n            return;\n        }\n        img.onload = resolve;\n        img.onerror = resolve;\n    });\n};\n\nconst imagesReady = (document: HTMLDocument): Promise<unknown[]> => {\n    return Promise.all([].slice.call(document.images, 0).map(imageReady));\n};\n\nconst iframeLoader = (\n    iframe: HTMLIFrameElement,\n    logger?: { warn: (msg: string) => void },\n    signal?: AbortSignal\n): Promise<HTMLIFrameElement> => {\n    return new Promise((resolve, reject) => {\n        const cloneWindow = iframe.contentWindow;\n\n        if (!cloneWindow) {\n            return reject(`No window assigned for iframe`);\n        }\n\n        const documentClone = cloneWindow.document;\n        let interval: ReturnType<typeof setInterval> | undefined;\n\n        // The load event is assigned synchronously right after iframe\n        // creation and always fires for a document.write mount — but a\n        // browser quirk must degrade to an error, not a hung render.\n        const watchdog = setTimeout(() => {\n            if (interval) {\n                clearInterval(interval);\n            }\n            reject(new Error(`Cloned iframe did not fire its load event within ${IFRAME_LOAD_WATCHDOG_MS}ms`));\n        }, IFRAME_LOAD_WATCHDOG_MS);\n\n        const onAbort = (): void => {\n            if (interval) {\n                clearInterval(interval);\n            }\n            clearTimeout(watchdog);\n            reject(new DOMException('The operation was aborted.', 'AbortError'));\n        };\n\n        cloneWindow.onload = iframe.onload = () => {\n            cloneWindow.onload = iframe.onload = null;\n            const maxAttempts = Math.ceil(CLONE_READY_TIMEOUT_MS / IFRAME_READY_POLL_MS);\n            let attempts = 0;\n            interval = setInterval(() => {\n                attempts++;\n                if (signal?.aborted) {\n                    onAbort();\n                } else if (documentClone.body.childNodes.length > 0 && documentClone.readyState === 'complete') {\n                    clearInterval(interval);\n                    interval = undefined;\n                    clearTimeout(watchdog);\n                    resolve(iframe);\n                } else if (attempts >= maxAttempts) {\n                    clearInterval(interval);\n                    interval = undefined;\n                    // Resolve anyway to avoid hanging, but say so: a timeout\n                    // here means the clone may be an empty document and the\n                    // capture will come out blank.\n                    logger?.warn(\n                        `Cloned iframe did not become ready within ${CLONE_READY_TIMEOUT_MS / 1000} seconds; continuing with a possibly incomplete document`\n                    );\n                    resolve(iframe);\n                }\n            }, IFRAME_READY_POLL_MS);\n        };\n\n        if (signal) {\n            if (signal.aborted) {\n                onAbort();\n            } else {\n                signal.addEventListener('abort', onAbort, { once: true });\n            }\n        }\n    });\n};\n\n/**\n * Serialise a document type declaration to an HTML string.\n * @internal – exported for testing only, not part of the public API.\n */\nexport const serializeDoctype = (doctype?: DocumentType | null): string => {\n    let str = '';\n    if (doctype) {\n        str += '<!DOCTYPE ';\n        if (doctype.name) {\n            str += doctype.name;\n        }\n        if (doctype.internalSubset) {\n            str += ' ' + doctype.internalSubset.replace(/\"/g, '&quot;').replace(/>/g, '&gt;');\n        }\n        if (doctype.publicId) {\n            str += ' PUBLIC \"' + doctype.publicId.replace(/\"/g, '&quot;') + '\"';\n            if (doctype.systemId) {\n                str += ' \"' + doctype.systemId.replace(/\"/g, '&quot;') + '\"';\n            }\n        } else if (doctype.systemId) {\n            str += ' SYSTEM \"' + doctype.systemId.replace(/\"/g, '&quot;') + '\"';\n        }\n        str += '>';\n    }\n    return str;\n};\n\nconst restoreOwnerScroll = (ownerDocument: Document | null, x: number, y: number) => {\n    if (\n        ownerDocument &&\n        ownerDocument.defaultView &&\n        (x !== ownerDocument.defaultView.pageXOffset || y !== ownerDocument.defaultView.pageYOffset)\n    ) {\n        ownerDocument.defaultView.scrollTo(x, y);\n    }\n};\n\nconst restoreNodeScroll = ([element, x, y]: [Element, number, number]) => {\n    element.scrollLeft = x;\n    element.scrollTop = y;\n};\n\n/**\n * Point the clone's relative URLs at the source document.\n * @internal – exported for testing only, not part of the public API.\n */\nexport const addBase = (targetELement: HTMLElement, baseUri: string) => {\n    const baseNode = targetELement.ownerDocument.createElement('base');\n    baseNode.href = baseUri;\n    const headEle = targetELement.getElementsByTagName('head').item(0);\n    headEle?.insertBefore(baseNode, headEle?.firstChild ?? null);\n};\n\nexport const mountCloneInIFrame = (\n    context: Context,\n    ownerDocument: Document,\n    windowSize: Bounds,\n    mount: CloneMountOptions\n): Promise<HTMLIFrameElement> => {\n    const iframe: HTMLIFrameElement = createIFrameContainer(ownerDocument, windowSize, mount.container);\n\n    if (!iframe.contentWindow) {\n        throw new Error('Unable to find iframe window');\n    }\n\n    const scrollX = (ownerDocument.defaultView as Window).pageXOffset;\n    const scrollY = (ownerDocument.defaultView as Window).pageYOffset;\n\n    const cloneWindow = iframe.contentWindow;\n    const documentClone: Document = cloneWindow.document;\n\n    /* Chrome doesn't detect relative background-images assigned in inline <style> sheets when fetched through getComputedStyle\n     if window url is about:blank, we can assign the url to current by writing onto the document\n     */\n\n    const iframeLoad = iframeLoader(iframe, context.logger, mount.signal).then(async () => {\n        mount.scrolledElements.forEach(restoreNodeScroll);\n        if (cloneWindow) {\n            cloneWindow.scrollTo(windowSize.left, windowSize.top);\n        }\n\n        const onclone = mount.onclone;\n\n        const referenceElement = mount.clonedReferenceElement;\n\n        if (typeof referenceElement === 'undefined') {\n            throw new Error(`Error finding the ${mount.referenceElementName} in the cloned document`);\n        }\n\n        throwIfAborted(mount.signal);\n        if (documentClone.fonts && documentClone.fonts.ready) {\n            await documentClone.fonts.ready;\n        }\n        throwIfAborted(mount.signal);\n\n        if (/(AppleWebKit)/g.test(navigator.userAgent)) {\n            await imagesReady(documentClone);\n            throwIfAborted(mount.signal);\n        }\n\n        if (typeof onclone === 'function') {\n            await Promise.resolve().then(() => onclone(documentClone, referenceElement));\n        }\n\n        // onclone can change layout above the viewport and trigger browser scroll\n        // anchoring. Reapply the requested offset after the callback so element\n        // bounds stay aligned with the window bounds used by the renderer.\n        cloneWindow.scrollTo(windowSize.left, windowSize.top);\n        if (\n            /AppleWebKit/g.test(navigator.userAgent) &&\n            (cloneWindow.scrollY !== windowSize.top || cloneWindow.scrollX !== windowSize.left)\n        ) {\n            context.logger.warn('Unable to restore scroll position for cloned document');\n            context.adjustWindowBounds(cloneWindow.scrollX - windowSize.left, cloneWindow.scrollY - windowSize.top);\n        }\n\n        return iframe;\n    });\n    /**\n     * The base URI used for resolving relative URLs (e.g. background-image) in the clone.\n     * Must come from the source document: the iframe document is about:blank, so\n     * documentClone.baseURI would break getComputedStyle() for relative background URLs.\n     */\n    const baseUri = ownerDocument.baseURI;\n    documentClone.open();\n    // rawHTML is always a static, internally-generated string:\n    // serializeDoctype(ownerDocument.doctype) + '<html></html>'\n    // No user-controlled input — safe for document.write in the sandbox iframe.\n    // The doctype comes from the source document, not the global one.\n    const rawHTML = serializeDoctype(ownerDocument.doctype) + '<html></html>';\n    try {\n        const policy = resolveTrustedTypesPolicy(ownerDocument.defaultView);\n        const html = policy ? policy.createHTML(rawHTML) : rawHTML;\n        // CodeQL:no - rawHTML is a static internal string, never user-controlled\n        documentClone.write(html);\n    } catch (_e) {\n        // CodeQL:no - rawHTML is a static internal string, never user-controlled\n        documentClone.write(rawHTML);\n    }\n    // Chrome scrolls the parent document for some reason after the write to the cloned window???\n    restoreOwnerScroll(ownerDocument, scrollX, scrollY);\n    /**\n     * IMPORTANT: documentClone.close() MUST be called BEFORE adoptNode().\n     *\n     * In Chrome, calling adoptNode() while the document is still \"open\"\n     * (between document.open() and document.close()) causes CSS rules with\n     * uppercase characters in class names (e.g. \".MyClass\") to not match\n     * correctly. Chrome's CSS engine only enters a fully-resolved matching\n     * mode once the document is closed.\n     *\n     * Correct order: open() → write() → close() → adoptNode() → replaceChild()\n     *\n     * Timing: close() queues the iframe 'load' event; because JS is single-threaded,\n     * the synchronous adoptNode() and replaceChild() below complete before that\n     * event is dispatched. iframeLoader's setInterval will therefore see the body\n     * already populated on its first tick.\n     */\n    documentClone.close();\n    const adoptedNode = documentClone.adoptNode(mount.documentElement);\n    addBase(adoptedNode, baseUri);\n    documentClone.replaceChild(adoptedNode, documentClone.documentElement);\n\n    return iframeLoad;\n};\n","import { Bounds } from '../css/layout/bounds';\nimport {\n    isBodyElement,\n    isCanvasElement,\n    isCustomElement,\n    isElementNode,\n    isHTMLElementNode,\n    isIFrameElement,\n    isImageElement,\n    isSelectElement,\n    isStyleElement,\n    isSVGElementNode,\n    isTextareaElement,\n    isTextNode,\n    isVideoElement,\n    canHavePseudoElements\n} from './node-type-guards';\nimport { CounterState } from '../css/types/functions/counter';\nimport { CSSParsedCounterDeclaration } from '../css/index';\nimport { Context } from '../core/context';\nimport { DebuggerType, isDebugging } from '../core/debugger';\nimport { SlotCloner } from './slot-cloner';\nimport { copyCSSStyles } from './copy-css-styles';\nimport { createAdoptedStylesElement } from './adopted-styles';\nimport { PseudoContentResolver, PseudoElementType, createPseudoHideStyles } from './pseudo-content';\n\nimport { mountCloneInIFrame } from './iframe-mount';\n\n// Re-exported for backwards compatibility: existing consumers import these\n// from the cloner module.\nexport { copyCSSStyles } from './copy-css-styles';\nexport { serializeDoctype } from './iframe-mount';\n\nexport interface CloneOptions {\n    ignoreElements?: (element: Element) => boolean;\n    onclone?: (document: Document, element: HTMLElement) => void;\n    allowTaint?: boolean;\n    iframeContainer?: HTMLElement | ShadowRoot;\n}\n\nexport interface WindowOptions {\n    scrollX: number;\n    scrollY: number;\n    windowWidth: number;\n    windowHeight: number;\n}\n\nexport type CloneConfigurations = CloneOptions & {\n    inlineImages: boolean;\n    copyStyles: boolean;\n    cspNonce?: string;\n    /** Aborting rejects the iframe mount instead of waiting out readiness windows. */\n    signal?: AbortSignal;\n};\n\n/**\n * Find the parent ShadowRoot of an element, if any\n * @param element - The element to check\n * @returns The parent ShadowRoot or null\n */\nconst findParentShadowRoot = (element: Element): ShadowRoot | null => {\n    let current: Node | null = element;\n    while (current) {\n        // Check if we've reached a shadow root boundary\n        if (current.parentNode && (current.parentNode as ShadowRoot).host) {\n            return current.parentNode as ShadowRoot;\n        }\n        // Use getRootNode to check if we're in a shadow root\n        const root = current.getRootNode();\n        if (root && root !== current.ownerDocument && (root as ShadowRoot).host) {\n            return root as ShadowRoot;\n        }\n        current = current.parentNode;\n    }\n    return null;\n};\n\nexport class DocumentCloner {\n    private readonly scrolledElements: [Element, number, number][];\n    private readonly referenceElement: HTMLElement;\n    clonedReferenceElement?: HTMLElement;\n    private readonly documentElement: HTMLElement;\n    private readonly counters: CounterState;\n    private readonly pseudoContents: PseudoContentResolver;\n    private readonly slotCloner: SlotCloner;\n\n    constructor(\n        private readonly context: Context,\n        element: HTMLElement,\n        private readonly options: CloneConfigurations\n    ) {\n        this.scrolledElements = [];\n        this.referenceElement = element;\n        this.counters = new CounterState();\n        this.pseudoContents = new PseudoContentResolver(context, this.counters);\n        this.slotCloner = new SlotCloner(\n            (node, copyStyles) => this.cloneNode(node, copyStyles),\n            {\n                ignoreElements: options.ignoreElements,\n                copyStyles: options.copyStyles ?? true,\n                cspNonce: options.cspNonce\n            },\n            context\n        );\n        if (!element.ownerDocument) {\n            throw new Error('Cloned element does not have an owner document');\n        }\n\n        // Auto-detect Shadow Root if not explicitly provided\n        if (!this.options.iframeContainer) {\n            const shadowRoot = findParentShadowRoot(element);\n            if (shadowRoot) {\n                this.options.iframeContainer = shadowRoot;\n            }\n        }\n\n        this.documentElement = this.cloneNode(element.ownerDocument.documentElement, false) as HTMLElement;\n        this.appendDocumentAdoptedStyles(element.ownerDocument);\n    }\n\n    /**\n     * Re-materialise the source document's constructable stylesheets\n     * (document.adoptedStyleSheets) as a <style> at the end of the clone's\n     * <head>: cloneNode never carries them, and they cascade after all author\n     * sheets, which appending last approximates.\n     *\n     * Skipped when computed styles are inlined per element (copyStyles), like\n     * the other stylesheet-cloning paths.\n     */\n    private appendDocumentAdoptedStyles(ownerDocument: Document): void {\n        if (this.options.copyStyles) {\n            return;\n        }\n        const sheets = ownerDocument.adoptedStyleSheets;\n        if (!sheets || sheets.length === 0) {\n            return;\n        }\n        const head = this.documentElement.getElementsByTagName('head').item(0);\n        if (!head) {\n            return;\n        }\n        // The clone subtree is still owned by the source document until\n        // adoptNode() runs in the iframe mount, so create the element there.\n        const style = createAdoptedStylesElement(\n            this.documentElement.ownerDocument ?? ownerDocument,\n            sheets,\n            this.options.cspNonce\n        );\n        if (style) {\n            head.appendChild(style);\n        }\n    }\n\n    toIFrame(ownerDocument: Document, windowSize: Bounds): Promise<HTMLIFrameElement> {\n        return mountCloneInIFrame(this.context, ownerDocument, windowSize, {\n            documentElement: this.documentElement,\n            clonedReferenceElement: this.clonedReferenceElement,\n            referenceElementName: this.referenceElement.nodeName,\n            scrolledElements: this.scrolledElements,\n            onclone: this.options.onclone,\n            container: this.options.iframeContainer,\n            signal: this.options.signal\n        });\n    }\n\n    createElementClone<T extends HTMLElement | SVGElement>(node: T): HTMLElement | SVGElement {\n        if (isDebugging(node, DebuggerType.CLONE)) {\n            debugger;\n        }\n        if (isCanvasElement(node)) {\n            return this.createCanvasClone(node);\n        }\n        if (isVideoElement(node)) {\n            return this.createVideoClone(node);\n        }\n        if (isStyleElement(node)) {\n            return this.createStyleClone(node);\n        }\n\n        const clone = node.cloneNode(false) as T;\n        if (isImageElement(clone)) {\n            if (isImageElement(node) && node.currentSrc && node.currentSrc !== node.src) {\n                clone.src = node.currentSrc;\n                clone.srcset = '';\n            }\n\n            if (clone.loading === 'lazy') {\n                clone.loading = 'eager';\n            }\n        }\n\n        if (isCustomElement(clone) && !isSVGElementNode(clone)) {\n            return this.createCustomElementClone(node as HTMLElement, clone as HTMLElement);\n        }\n\n        return clone;\n    }\n\n    createCustomElementClone(originalNode: HTMLElement, clonedNode: HTMLElement): HTMLElement {\n        const clone = document.createElement('div');\n        clone.className = clonedNode.className;\n        copyCSSStyles(clonedNode.style, clone);\n\n        // Copy all attributes onto the fresh <div> (except class/style which are\n        // handled above). Without this, attributes such as `slot=\"suffix\"` are\n        // dropped and slotted custom elements lose their slot assignment in the\n        // cloned shadow DOM, so their content is never rendered (issue #226).\n        // Iterate by index: `NamedNodeMap` is not guaranteed to be iterable\n        // across TypeScript DOM lib versions (TS2488 on older libs).\n        const attributes = clonedNode.attributes;\n        for (let i = 0; i < attributes.length; i++) {\n            const attr = attributes.item(i);\n            if (attr && attr.name !== 'class' && attr.name !== 'style') {\n                clone.setAttribute(attr.name, attr.value);\n            }\n        }\n\n        // Clone shadow DOM if it exists. The shadow root must be detected on the\n        // ORIGINAL element: `clonedNode` comes from `cloneNode(false)`, which only\n        // preserves the shadow root when it was created with `clonable: true` (or\n        // by frameworks that set it). For other components (e.g. Shoelace / Web\n        // Awesome) the clone has no shadow root, so without this check the clone\n        // falls back to flattening the shadow content and the slotted light-DOM\n        // label content is lost.\n        // Fix for Issue #108: This is critical for Web Components with slots to work correctly\n        if (originalNode.shadowRoot) {\n            try {\n                clone.attachShadow({ mode: 'open' });\n                // The actual shadow DOM content will be cloned in cloneChildNodes\n            } catch (e) {\n                // Some elements cannot have shadow roots attached\n                // This can happen if the element doesn't support shadow DOM\n                this.context.logger.error('Failed to attach shadow root to custom element clone:', e);\n            }\n        }\n\n        return clone;\n    }\n\n    createStyleClone(node: HTMLStyleElement): HTMLStyleElement {\n        try {\n            const sheet = node.sheet as CSSStyleSheet | undefined;\n            if (sheet && sheet.cssRules) {\n                const css: string = [].slice.call(sheet.cssRules, 0).reduce((css: string, rule: CSSRule) => {\n                    if (rule && typeof rule.cssText === 'string') {\n                        return css + rule.cssText;\n                    }\n                    return css;\n                }, '');\n                const style = node.cloneNode(false) as HTMLStyleElement;\n                style.textContent = css;\n                if (this.options.cspNonce) {\n                    style.nonce = this.options.cspNonce;\n                }\n                return style;\n            }\n        } catch (e) {\n            // accessing node.sheet.cssRules throws a DOMException\n            this.context.logger.error('Unable to access cssRules property', e);\n            if ((e as { name?: string }).name !== 'SecurityError') {\n                throw e;\n            }\n        }\n        const cloned = node.cloneNode(false) as HTMLStyleElement;\n        if (this.options.cspNonce) {\n            cloned.nonce = this.options.cspNonce;\n        }\n        return cloned;\n    }\n\n    createCanvasClone(canvas: HTMLCanvasElement): HTMLImageElement | HTMLCanvasElement {\n        if (this.options.inlineImages && canvas.ownerDocument) {\n            const img = canvas.ownerDocument.createElement('img');\n            try {\n                img.src = canvas.toDataURL();\n                return img;\n            } catch (e) {\n                this.context.logger.info(`Unable to inline canvas contents, canvas is tainted`, canvas);\n            }\n        }\n\n        const clonedCanvas = canvas.cloneNode(false) as HTMLCanvasElement;\n\n        try {\n            clonedCanvas.width = canvas.width;\n            clonedCanvas.height = canvas.height;\n            const ctx = canvas.getContext('2d');\n            const clonedCtx = clonedCanvas.getContext('2d', { willReadFrequently: true });\n            if (clonedCtx) {\n                if (!this.options.allowTaint && ctx) {\n                    clonedCtx.putImageData(ctx.getImageData(0, 0, canvas.width, canvas.height), 0, 0);\n                } else {\n                    const gl = canvas.getContext('webgl2') ?? canvas.getContext('webgl');\n                    if (gl) {\n                        const attribs = gl.getContextAttributes();\n                        if (attribs?.preserveDrawingBuffer === false) {\n                            this.context.logger.warn(\n                                'Unable to clone WebGL context as it has preserveDrawingBuffer=false',\n                                canvas\n                            );\n                        }\n                    }\n\n                    clonedCtx.drawImage(canvas, 0, 0);\n                }\n            }\n            return clonedCanvas;\n        } catch (e) {\n            this.context.logger.info(`Unable to clone canvas as it is tainted`, canvas);\n        }\n\n        return clonedCanvas;\n    }\n\n    createVideoClone(video: HTMLVideoElement): HTMLCanvasElement {\n        const canvas = video.ownerDocument.createElement('canvas');\n\n        canvas.width = video.offsetWidth;\n        canvas.height = video.offsetHeight;\n        const ctx = canvas.getContext('2d');\n\n        try {\n            if (ctx) {\n                ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n                if (!this.options.allowTaint) {\n                    ctx.getImageData(0, 0, canvas.width, canvas.height);\n                }\n            }\n            return canvas;\n        } catch (e) {\n            this.context.logger.info(`Unable to clone video as it is tainted`, video);\n        }\n\n        const blankCanvas = video.ownerDocument.createElement('canvas');\n\n        blankCanvas.width = video.offsetWidth;\n        blankCanvas.height = video.offsetHeight;\n        return blankCanvas;\n    }\n\n    appendChildNode(clone: HTMLElement | SVGElement, child: Node, copyStyles: boolean): void {\n        this.slotCloner.appendChildNode(clone, child, copyStyles);\n    }\n\n    /**\n     * Clone child nodes from source element to clone element.\n     * Delegates to SlotCloner which handles shadow DOM, slots, and light DOM.\n     */\n    cloneChildNodes(node: Element, clone: HTMLElement | SVGElement, copyStyles: boolean): void {\n        this.slotCloner.cloneChildNodes(node, clone, copyStyles);\n    }\n\n    cloneNode(node: Node, copyStyles: boolean): Node {\n        if (isTextNode(node)) {\n            return (node.ownerDocument ?? document).createTextNode(node.data);\n        }\n\n        if (!node.ownerDocument) {\n            return node.cloneNode(false);\n        }\n\n        const window = node.ownerDocument.defaultView;\n\n        if (window && isElementNode(node) && (isHTMLElementNode(node) || isSVGElementNode(node))) {\n            const clone = this.createElementClone(node);\n            clone.style.transitionProperty = 'none';\n\n            const style = window.getComputedStyle(node);\n\n            // Per CSS spec, replaced elements, void elements, and SVG elements\n            // cannot have ::before / ::after pseudo-elements — skip these queries.\n            const checkPseudoElements = canHavePseudoElements(node);\n\n            if (this.referenceElement === node && isHTMLElementNode(clone)) {\n                this.clonedReferenceElement = clone;\n            }\n            if (isBodyElement(clone)) {\n                createPseudoHideStyles(clone, this.options.cspNonce);\n            }\n\n            const counters = this.counters.parse(new CSSParsedCounterDeclaration(this.context, style));\n\n            if (checkPseudoElements) {\n                const styleBefore = window.getComputedStyle(node, ':before');\n                const before = this.pseudoContents.resolvePseudoContent(\n                    node,\n                    clone,\n                    styleBefore,\n                    PseudoElementType.BEFORE\n                );\n                if (before) {\n                    clone.insertBefore(before, clone.firstChild);\n                }\n            }\n\n            if (isCustomElement(node)) {\n                copyStyles = true;\n            }\n\n            if (!isVideoElement(node)) {\n                this.cloneChildNodes(node, clone, copyStyles);\n            }\n\n            // ::after content must follow the element's children (CSS\n            // generated-content order). Resolving it before the children were\n            // cloned put it between ::before and the content, which also\n            // desynchronised the shared open-quote/close-quote depth.\n            if (checkPseudoElements) {\n                const styleAfter = window.getComputedStyle(node, ':after');\n                const after = this.pseudoContents.resolvePseudoContent(\n                    node,\n                    clone,\n                    styleAfter,\n                    PseudoElementType.AFTER\n                );\n                if (after) {\n                    clone.appendChild(after);\n                }\n            }\n\n            this.counters.pop(counters);\n\n            if (\n                (style && (this.options.copyStyles || isSVGElementNode(node)) && !isIFrameElement(node)) ||\n                copyStyles\n            ) {\n                copyCSSStyles(style, clone);\n            }\n\n            if (node.scrollTop !== 0 || node.scrollLeft !== 0) {\n                this.scrolledElements.push([clone, node.scrollLeft, node.scrollTop]);\n            }\n\n            if (\n                (isTextareaElement(node) || isSelectElement(node)) &&\n                (isTextareaElement(clone) || isSelectElement(clone))\n            ) {\n                clone.value = node.value;\n            }\n\n            return clone;\n        }\n\n        return node.cloneNode(false);\n    }\n\n    static destroy(container: HTMLIFrameElement): boolean {\n        if (container.parentNode) {\n            container.parentNode.removeChild(container);\n            return true;\n        }\n        return false;\n    }\n}\n","/**\n * DOM Normalizer\n * Handles DOM side effects that need to happen before rendering\n * Extracted from ElementContainer to follow SRP\n */\n\nimport { CSSParsedDeclaration } from '../css';\nimport { isHTMLElementNode, isSVGElementNode } from './node-type-guards';\n\n/**\n * Stored original styles for restoration\n */\nexport interface OriginalStyles {\n    animationDuration?: string;\n    transform?: string;\n    rotate?: string;\n    translate?: string;\n    scale?: string;\n}\n\n/**\n * Normalize element styles for accurate rendering\n * This includes disabling animations and neutralizing transforms.\n */\nexport class DOMNormalizer {\n    /**\n     * Normalize a single element and return original styles.\n     *\n     * ## Why we replace transforms with an identity value instead of \"none\"\n     *\n     * `getBoundingClientRect()` returns visual (post-transform) coordinates, so we\n     * must neutralize any active transform before measuring element bounds.\n     *\n     * The naive approach of setting `transform: none` (or `rotate: none`) has a\n     * critical side-effect: per **CSS Transforms Level 2**, an element whose\n     * `transform` is non-none automatically becomes the **containing block** for\n     * all of its `position: absolute` *and* `position: fixed` descendants.\n     * Setting it to `none` destroys that role, causing children to resolve their\n     * percentage dimensions and offsets against an unintended ancestor — which\n     * produces completely wrong bounds.\n     *\n     * Solution: instead of removing the transform, we replace it with a visually\n     * inert identity value:\n     *\n     * - `transform: scale(0.5)` → `transform: translate(0, 0)`\n     *   - `translate(0, 0)` is an identity transform (no visual change, no layout shift).\n     *   - `getBoundingClientRect()` returns the same layout-space coordinates as\n     *     if there were no transform at all.\n     *   - Because the value is still non-none, the element **remains a containing\n     *     block** for both `position: absolute` and `position: fixed` descendants.\n     *\n     * - `rotate: 45deg` → `rotate: 0deg`\n     *   - `0deg` is the identity rotation; `0deg ≠ none`, so the same containing-\n     *     block guarantee holds.\n     *\n     * @param element - Element to normalize\n     * @param styles - Parsed CSS styles\n     * @returns Original styles map for restoration\n     */\n    static normalizeElement(element: Element, styles: CSSParsedDeclaration): OriginalStyles {\n        const originalStyles: OriginalStyles = {};\n\n        // Both HTML and SVG containers measure the same way: neutralise the\n        // transform before parseBounds so getBoundingClientRect returns\n        // layout-space coordinates and the paint-time TransformEffect applies\n        // the transform exactly once. SVG elements implement\n        // ElementCSSInlineStyle, so element.style works for them too; skipping\n        // them double-applied outer <svg> transforms (issue #244).\n        if (!isHTMLElementNode(element) && !isSVGElementNode(element)) {\n            return originalStyles;\n        }\n\n        // Disable animations to capture static state\n        if (styles.animationDuration.some((duration) => duration > 0)) {\n            originalStyles.animationDuration = element.style.animationDuration;\n            element.style.animationDuration = '0s';\n        }\n\n        // Replace the actual transform with an identity translate so that:\n        //   1. getBoundingClientRect() returns layout-space (unscaled/unrotated) coords.\n        //   2. The element still satisfies \"transform != none\" and therefore keeps\n        //      its role as a containing block for position:absolute / position:fixed\n        //      descendants (CSS Transforms Level 2 §2.3).\n        if (styles.transform !== null) {\n            originalStyles.transform = element.style.transform;\n            element.style.transform = 'translate(0, 0)';\n        }\n\n        // The individual transform properties get the same treatment with\n        // their own identity values:\n        //   rotate: 45deg → 0deg, translate: 10px → 0px, scale: 2 → 1.\n        // Identity (≠ none) keeps the containing-block role where the browser\n        // honors the individual properties.\n        let needsContainingBlockFallback = false;\n\n        if (styles.rotate !== null) {\n            originalStyles.rotate = element.style.rotate;\n            element.style.rotate = '0deg';\n            needsContainingBlockFallback = true;\n        }\n\n        if (styles.translate !== null) {\n            originalStyles.translate = element.style.translate;\n            element.style.translate = '0px';\n            needsContainingBlockFallback = true;\n        }\n\n        if (styles.scale !== null) {\n            originalStyles.scale = element.style.scale;\n            element.style.scale = '1';\n            needsContainingBlockFallback = true;\n        }\n\n        // Individual transform properties are CSS Transforms Level 2 and their\n        // containing-block guarantee is not uniformly implemented across all\n        // browsers. When any of them was the only transform-like property on\n        // this element, also set `transform: translate(0, 0)` so the\n        // containing-block role is reliably established via the well-supported\n        // `transform` property.\n        if (needsContainingBlockFallback && originalStyles.transform === undefined) {\n            originalStyles.transform = element.style.transform;\n            element.style.transform = 'translate(0, 0)';\n        }\n\n        return originalStyles;\n    }\n\n    /**\n     * Restore element styles after rendering.\n     *\n     * @param element - Element to restore\n     * @param originalStyles - Original styles to restore\n     */\n    static restoreElement(element: Element, originalStyles: OriginalStyles): void {\n        if (!isHTMLElementNode(element) && !isSVGElementNode(element)) {\n            return;\n        }\n\n        if (originalStyles.animationDuration !== undefined) {\n            element.style.animationDuration = originalStyles.animationDuration;\n        }\n\n        if (originalStyles.transform !== undefined) {\n            element.style.transform = originalStyles.transform;\n        }\n\n        if (originalStyles.rotate !== undefined) {\n            element.style.rotate = originalStyles.rotate;\n        }\n\n        if (originalStyles.translate !== undefined) {\n            element.style.translate = originalStyles.translate;\n        }\n\n        if (originalStyles.scale !== undefined) {\n            element.style.scale = originalStyles.scale;\n        }\n    }\n}\n","import { CSSParsedDeclaration } from '../css/index';\nimport { TextContainer } from './text-container';\nimport { Bounds, parseBounds } from '../css/layout/bounds';\nimport { isHTMLElementNode, isSVGElementNode } from './node-type-guards';\nimport { Context } from '../core/context';\nimport { DebuggerType, isDebugging } from '../core/debugger';\nimport { DOMNormalizer, OriginalStyles } from './dom-normalizer';\n\nexport interface ElementContainerOptions {\n    normalizeDom?: boolean;\n}\n\nexport class ElementContainer {\n    readonly styles: CSSParsedDeclaration;\n    readonly textNodes: TextContainer[] = [];\n    readonly elements: ElementContainer[] = [];\n    bounds: Bounds;\n\n    /**\n     * Bounds of the <legend> child of a <fieldset>, when present. Browsers break\n     * the fieldset's top border where the legend sits; the renderer uses these\n     * bounds to leave a matching gap (issue #227).\n     */\n    readonly legendBounds?: Bounds;\n\n    createsStackingContext = false;\n    createsRealStackingContext = false;\n    isListOwner = false;\n    debugRender = false;\n\n    private originalStyles?: OriginalStyles;\n    private originalElement?: Element;\n\n    constructor(\n        protected readonly context: Context,\n        element: Element,\n        options: ElementContainerOptions = {}\n    ) {\n        if (isDebugging(element, DebuggerType.PARSE)) {\n            debugger;\n        }\n\n        this.styles = new CSSParsedDeclaration(context, context.config.window.getComputedStyle(element, null));\n\n        const shouldNormalize = options.normalizeDom !== false;\n        // Outer <svg> elements normalize like HTML containers: their CSS\n        // transform must not survive bounds measurement, or the paint-time\n        // TransformEffect applies it a second time (issue #244).\n        if (shouldNormalize && (isHTMLElementNode(element) || isSVGElementNode(element))) {\n            this.originalStyles = DOMNormalizer.normalizeElement(element, this.styles);\n            this.originalElement = element;\n        }\n\n        this.bounds = parseBounds(this.context, element);\n\n        if (element.tagName === 'FIELDSET') {\n            const legend = element.querySelector(':scope > legend');\n            if (legend) {\n                const legendBounds = parseBounds(this.context, legend);\n                this.legendBounds = legendBounds;\n\n                // A <fieldset>'s legend is centered on its top border line and\n                // overflows ABOVE it. Chrome's getBoundingClientRect() for the\n                // fieldset includes that overflow, so bounds.top is too high and\n                // the border would be drawn above the legend. Shift the bounds so\n                // the top border sits at the legend's vertical center, matching\n                // how the browser renders fieldset + legend (issue #227).\n                const borderBoxTop = legendBounds.top + legendBounds.height / 2 - this.styles.borderTopWidth / 2;\n                this.bounds = new Bounds(\n                    this.bounds.left,\n                    borderBoxTop,\n                    this.bounds.width,\n                    this.bounds.height - (borderBoxTop - this.bounds.top)\n                );\n            }\n        }\n\n        if (isDebugging(element, DebuggerType.RENDER)) {\n            this.debugRender = true;\n        }\n    }\n\n    /**\n     * Restore original element styles (if normalized)\n     * Call this after rendering is complete to clean up DOM state\n     */\n    restore(): void {\n        if (this.originalStyles && this.originalElement) {\n            DOMNormalizer.restoreElement(this.originalElement, this.originalStyles);\n            // Clear references to prevent memory leaks\n            this.originalStyles = undefined;\n            this.originalElement = undefined;\n        }\n    }\n\n    /**\n     * Recursively restore all elements in the tree\n     * Call this on the root container after rendering is complete\n     */\n    restoreTree(): void {\n        this.restore();\n        // Recursively restore all child elements\n        for (const child of this.elements) {\n            child.restoreTree();\n        }\n    }\n}\n","/**\n * Runtime feature detection.\n *\n * Only checks that still gate real behaviour are kept: range-bounds\n * measurement (iOS 13 quirk), SVG drawing and CORS image support.\n * Dead probes (IE-era CORS XHR / XHR response-type checks) were removed —\n * every supported browser exposes `crossOrigin`, `responseType` and\n * `withCredentials`; Intl.Segmenter is used unconditionally.\n */\n\nconst testRangeBounds = (document: Document) => {\n    const TEST_HEIGHT = 123;\n\n    if (document.createRange) {\n        const range = document.createRange();\n        if (range.getBoundingClientRect) {\n            const testElement = document.createElement('boundtest');\n            testElement.style.height = `${TEST_HEIGHT}px`;\n            testElement.style.display = 'block';\n            document.body.appendChild(testElement);\n\n            range.selectNode(testElement);\n            const rangeBounds = range.getBoundingClientRect();\n            const rangeHeight = Math.round(rangeBounds.height);\n            document.body.removeChild(testElement);\n            if (rangeHeight === TEST_HEIGHT) {\n                return true;\n            }\n        }\n    }\n\n    return false;\n};\n\nconst testCORS = (): boolean => typeof new Image().crossOrigin !== 'undefined';\n\nconst testSVG = (document: Document): boolean => {\n    const img = new Image();\n    const canvas = document.createElement('canvas');\n    const ctx = canvas.getContext('2d');\n    if (!ctx) {\n        return false;\n    }\n\n    img.src = `data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'></svg>`;\n\n    try {\n        ctx.drawImage(img, 0, 0);\n        canvas.toDataURL();\n    } catch (e) {\n        return false;\n    }\n    return true;\n};\n\nexport const createForeignObjectSVG = (\n    width: number,\n    height: number,\n    x: number,\n    y: number,\n    node: Node\n): SVGForeignObjectElement => {\n    const xmlns = 'http://www.w3.org/2000/svg';\n    const svg = document.createElementNS(xmlns, 'svg');\n    const foreignObject = document.createElementNS(xmlns, 'foreignObject');\n    svg.setAttributeNS(null, 'width', width.toString());\n    svg.setAttributeNS(null, 'height', height.toString());\n\n    foreignObject.setAttributeNS(null, 'width', '100%');\n    foreignObject.setAttributeNS(null, 'height', '100%');\n    foreignObject.setAttributeNS(null, 'x', x.toString());\n    foreignObject.setAttributeNS(null, 'y', y.toString());\n    foreignObject.setAttributeNS(null, 'externalResourcesRequired', 'true');\n    svg.appendChild(foreignObject);\n\n    foreignObject.appendChild(node);\n\n    return svg;\n};\n\nexport const loadSerializedSVG = (svg: Node): Promise<HTMLImageElement> => {\n    return new Promise((resolve, reject) => {\n        const img = new Image();\n        img.onload = () => resolve(img);\n        img.onerror = reject;\n\n        img.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(new XMLSerializer().serializeToString(svg))}`;\n    });\n};\n\nexport const FEATURES = {\n    get SUPPORT_RANGE_BOUNDS(): boolean {\n        'use strict';\n        const value = testRangeBounds(document);\n        Object.defineProperty(FEATURES, 'SUPPORT_RANGE_BOUNDS', { value });\n        return value;\n    },\n    get SUPPORT_SVG_DRAWING(): boolean {\n        'use strict';\n        const value = testSVG(document);\n        Object.defineProperty(FEATURES, 'SUPPORT_SVG_DRAWING', { value });\n        return value;\n    },\n    get SUPPORT_CORS_IMAGES(): boolean {\n        'use strict';\n        const value = testCORS();\n        Object.defineProperty(FEATURES, 'SUPPORT_CORS_IMAGES', { value });\n        return value;\n    }\n};\n","import { CSSParsedDeclaration } from '../index';\nimport { Bounds, parseBounds } from './bounds';\nimport { FEATURES } from '../../core/features';\nimport { Context } from '../../core/context';\nimport { isVerticalWritingMode } from '../property-descriptors/writing-mode';\n\nexport class TextBounds {\n    readonly text: string;\n    readonly bounds: Bounds;\n\n    constructor(text: string, bounds: Bounds) {\n        this.text = text;\n        this.bounds = bounds;\n    }\n}\n\nexport const parseTextBounds = (\n    context: Context,\n    value: string,\n    styles: CSSParsedDeclaration,\n    node: Text\n): TextBounds[] => {\n    const textList = breakText(value, styles);\n    const textBounds: TextBounds[] = [];\n    let offset = 0;\n    textList.forEach((text) => {\n        if (styles.textDecorationLine.length || text.trim().length > 0) {\n            if (FEATURES.SUPPORT_RANGE_BOUNDS) {\n                const clientRects = createRange(node, offset, text.length).getClientRects();\n                if (clientRects.length > 1) {\n                    const subSegments = segmentGraphemes(text);\n                    let subOffset = 0;\n                    subSegments.forEach((subSegment) => {\n                        textBounds.push(\n                            new TextBounds(\n                                subSegment,\n                                Bounds.fromDOMRectList(\n                                    context,\n                                    createRange(node, subOffset + offset, subSegment.length).getClientRects()\n                                )\n                            )\n                        );\n                        subOffset += subSegment.length;\n                    });\n                } else {\n                    textBounds.push(new TextBounds(text, Bounds.fromDOMRectList(context, clientRects)));\n                }\n            } else {\n                const replacementNode = node.splitText(text.length);\n                textBounds.push(new TextBounds(text, getWrapperBounds(context, node)));\n                node = replacementNode;\n            }\n        } else if (!FEATURES.SUPPORT_RANGE_BOUNDS) {\n            node = node.splitText(text.length);\n        }\n        offset += text.length;\n    });\n\n    return textBounds;\n};\n\nconst getWrapperBounds = (context: Context, node: Text): Bounds => {\n    const ownerDocument = node.ownerDocument;\n    if (ownerDocument) {\n        const wrapper = ownerDocument.createElement('html2canvaswrapper');\n        wrapper.appendChild(node.cloneNode(true));\n        const parentNode = node.parentNode;\n        if (parentNode) {\n            parentNode.replaceChild(wrapper, node);\n            const bounds = parseBounds(context, wrapper);\n            if (wrapper.firstChild) {\n                parentNode.replaceChild(wrapper.firstChild, wrapper);\n            }\n            return bounds;\n        }\n    }\n\n    return Bounds.EMPTY;\n};\n\nconst createRange = (node: Text, offset: number, length: number): Range => {\n    const ownerDocument = node.ownerDocument;\n    if (!ownerDocument) {\n        throw new Error('Node has no owner document');\n    }\n    const range = ownerDocument.createRange();\n    range.setStart(node, offset);\n    range.setEnd(node, offset + length);\n    return range;\n};\n\n// Segmenter construction is expensive and segmentation is locale-independent\n// for our use, so one instance per granularity is created and reused for\n// every text node of every render. Intl.Segmenter (Baseline since 2022)\n// replaced the css-line-break / text-segmentation fallbacks.\nconst segmenterCache = new Map<'grapheme' | 'word', Intl.Segmenter>();\n\nconst getSegmenter = (granularity: 'grapheme' | 'word'): Intl.Segmenter => {\n    let segmenter = segmenterCache.get(granularity);\n    if (!segmenter) {\n        segmenter = new Intl.Segmenter(undefined, { granularity });\n        segmenterCache.set(granularity, segmenter);\n    }\n    return segmenter;\n};\n\nexport const segmentGraphemes = (value: string): string[] =>\n    Array.from(getSegmenter('grapheme').segment(value), (s) => s.segment);\n\nconst segmentWords = (value: string): string[] => {\n    // Intl.Segmenter's word granularity splits words and whitespace into\n    // separate segments; parseTextBounds measures each segment independently,\n    // which matches the previous LineBreaker + word-separator pipeline's\n    // per-fragment measurement.\n    return Array.from(getSegmenter('word').segment(value), (s) => s.segment);\n};\n\nconst breakText = (value: string, styles: CSSParsedDeclaration): string[] => {\n    if (isVerticalWritingMode(styles.writingMode)) {\n        return segmentGraphemes(value);\n    }\n\n    return styles.letterSpacing !== 0 ? segmentGraphemes(value) : segmentWords(value);\n};\n","import { CSSParsedDeclaration } from '../css/index';\nimport { TEXT_TRANSFORM } from '../css/property-descriptors/text-transform';\nimport { parseTextBounds, TextBounds } from '../css/layout/text';\nimport { Context } from '../core/context';\n\nexport class TextContainer {\n    text: string;\n    textBounds: TextBounds[];\n\n    constructor(context: Context, node: Text, styles: CSSParsedDeclaration) {\n        this.text = transform(node.data, styles.textTransform);\n        // Range offsets below are based on transformed text; keep the node in sync\n        // when casing changes string length, for example \"ß\".toUpperCase() === \"SS\".\n        if (this.text.length !== node.data.length) {\n            node.data = this.text;\n        }\n        this.textBounds = parseTextBounds(context, this.text, styles, node);\n    }\n}\n\nconst transform = (text: string, transform: TEXT_TRANSFORM) => {\n    switch (transform) {\n        case TEXT_TRANSFORM.LOWERCASE:\n            return text.toLowerCase();\n        case TEXT_TRANSFORM.CAPITALIZE:\n            return text.replace(CAPITALIZE, capitalize);\n        case TEXT_TRANSFORM.UPPERCASE:\n            return text.toUpperCase();\n        default:\n            return text;\n    }\n};\n\nconst CAPITALIZE = /(^|\\s|:|-|\\(|\\))([a-z])/g;\n\nconst capitalize = (m: string, p1: string, p2: string) => {\n    if (m.length > 0) {\n        return p1 + p2.toUpperCase();\n    }\n\n    return m;\n};\n","import { ElementContainer, ElementContainerOptions } from '../element-container';\nimport { Context } from '../../core/context';\n\nexport class ImageElementContainer extends ElementContainer {\n    src: string;\n    intrinsicWidth: number;\n    intrinsicHeight: number;\n\n    constructor(context: Context, img: HTMLImageElement, options: ElementContainerOptions = {}) {\n        super(context, img, options);\n        this.src = img.currentSrc || img.src;\n        this.intrinsicWidth = img.naturalWidth;\n        this.intrinsicHeight = img.naturalHeight;\n        this.context.cache.addImage(this.src);\n    }\n}\n","import { ElementContainer, ElementContainerOptions } from '../element-container';\nimport { Context } from '../../core/context';\n\nexport class CanvasElementContainer extends ElementContainer {\n    canvas: HTMLCanvasElement;\n    intrinsicWidth: number;\n    intrinsicHeight: number;\n\n    constructor(context: Context, canvas: HTMLCanvasElement, options: ElementContainerOptions = {}) {\n        super(context, canvas, options);\n        this.canvas = canvas;\n        this.intrinsicWidth = canvas.width;\n        this.intrinsicHeight = canvas.height;\n    }\n}\n","import { ElementContainer, ElementContainerOptions } from '../element-container';\nimport { parseBounds } from '../../css/layout/bounds';\nimport { Context } from '../../core/context';\n\nconst BOX_OFFSET_PROPERTIES = [\n    'position',\n    'inset',\n    'top',\n    'right',\n    'bottom',\n    'left',\n    'inset-inline',\n    'inset-inline-start',\n    'inset-inline-end',\n    'inset-block',\n    'inset-block-start',\n    'inset-block-end',\n    'margin',\n    'margin-top',\n    'margin-right',\n    'margin-bottom',\n    'margin-left',\n    'margin-inline',\n    'margin-inline-start',\n    'margin-inline-end',\n    'margin-block',\n    'margin-block-start',\n    'margin-block-end'\n];\n\nexport const serializeWithoutBoxOffsets = (serializer: XMLSerializer, img: SVGSVGElement): string => {\n    const style = img.getAttribute('style');\n    BOX_OFFSET_PROPERTIES.forEach((property) => img.style.removeProperty(property));\n    const serialized = serializer.serializeToString(img);\n\n    if (style === null) {\n        img.removeAttribute('style');\n    } else {\n        img.setAttribute('style', style);\n    }\n\n    return serialized;\n};\n\nexport class SVGElementContainer extends ElementContainer {\n    svg: string;\n    intrinsicWidth: number;\n    intrinsicHeight: number;\n\n    constructor(context: Context, img: SVGSVGElement, options: ElementContainerOptions = {}) {\n        super(context, img, options);\n        const s = new XMLSerializer();\n        const bounds = parseBounds(context, img);\n        img.setAttribute('width', `${bounds.width}px`);\n        img.setAttribute('height', `${bounds.height}px`);\n\n        this.svg = `data:image/svg+xml,${encodeURIComponent(serializeWithoutBoxOffsets(s, img))}`;\n        this.intrinsicWidth = img.width.baseVal.value;\n        this.intrinsicHeight = img.height.baseVal.value;\n\n        this.context.cache.addImage(this.svg);\n    }\n}\n","import { ElementContainer, ElementContainerOptions } from '../element-container';\nimport { Context } from '../../core/context';\nexport class LIElementContainer extends ElementContainer {\n    readonly value: number;\n\n    constructor(context: Context, element: HTMLLIElement, options: ElementContainerOptions = {}) {\n        super(context, element, options);\n        this.value = element.value;\n    }\n}\n","import { ElementContainer, ElementContainerOptions } from '../element-container';\nimport { Context } from '../../core/context';\nexport class OLElementContainer extends ElementContainer {\n    readonly start: number;\n    readonly reversed: boolean;\n\n    constructor(context: Context, element: HTMLOListElement, options: ElementContainerOptions = {}) {\n        super(context, element, options);\n        this.start = element.start;\n        this.reversed = typeof element.reversed === 'boolean' && element.reversed === true;\n    }\n}\n","import { ElementContainer, ElementContainerOptions } from '../element-container';\nimport { BORDER_STYLE } from '../../css/property-descriptors/border-style';\nimport { BACKGROUND_CLIP } from '../../css/property-descriptors/background-clip';\nimport { BACKGROUND_ORIGIN } from '../../css/property-descriptors/background-origin';\nimport { TokenType } from '../../css/syntax/tokenizer';\nimport { LengthPercentageTuple } from '../../css/types/length-percentage';\nimport { Bounds } from '../../css/layout/bounds';\nimport { Context } from '../../core/context';\n\nconst CHECKBOX_BORDER_RADIUS: LengthPercentageTuple = [\n    {\n        type: TokenType.DIMENSION_TOKEN,\n        flags: 0,\n        unit: 'px',\n        number: 3\n    }\n];\n\nconst RADIO_BORDER_RADIUS: LengthPercentageTuple = [\n    {\n        type: TokenType.PERCENTAGE_TOKEN,\n        flags: 0,\n        number: 50\n    }\n];\n\nconst reformatInputBounds = (bounds: Bounds): Bounds => {\n    if (bounds.width > bounds.height) {\n        return new Bounds(bounds.left + (bounds.width - bounds.height) / 2, bounds.top, bounds.height, bounds.height);\n    } else if (bounds.width < bounds.height) {\n        return new Bounds(bounds.left, bounds.top + (bounds.height - bounds.width) / 2, bounds.width, bounds.width);\n    }\n    return bounds;\n};\n\nconst getInputValue = (node: HTMLInputElement): string => {\n    const value = node.type === PASSWORD ? new Array(node.value.length + 1).join('\\u2022') : node.value;\n\n    return value.length === 0 ? node.placeholder || '' : value;\n};\n\nconst isPlaceholder = (node: HTMLInputElement): boolean => {\n    return node.value.length === 0 && !!node.placeholder;\n};\n\nexport const CHECKBOX = 'checkbox';\nexport const RADIO = 'radio';\nexport const PASSWORD = 'password';\n// Fallback for `accent-color: auto`: the default accent colour browsers use\n// for checked controls (Chrome/Safari/Firefox all ship the same blue).\nexport const INPUT_COLOR = 0x0075ffff;\n// Default placeholder color (similar to browsers: rgba(117, 117, 117, 1) or #757575)\nexport const PLACEHOLDER_COLOR = 0x757575ff;\n\nexport class InputElementContainer extends ElementContainer {\n    readonly type: string;\n    readonly checked: boolean;\n    readonly value: string;\n    readonly isPlaceholder: boolean;\n\n    constructor(context: Context, input: HTMLInputElement, options: ElementContainerOptions = {}) {\n        super(context, input, options);\n        this.type = input.type.toLowerCase();\n        this.checked = input.checked;\n        this.value = getInputValue(input);\n        this.isPlaceholder = isPlaceholder(input);\n\n        if (this.type === CHECKBOX || this.type === RADIO) {\n            this.styles.backgroundColor = 0xdededeff;\n            this.styles.borderTopColor =\n                this.styles.borderRightColor =\n                this.styles.borderBottomColor =\n                this.styles.borderLeftColor =\n                    0xa5a5a5ff;\n            this.styles.borderTopWidth =\n                this.styles.borderRightWidth =\n                this.styles.borderBottomWidth =\n                this.styles.borderLeftWidth =\n                    1;\n            this.styles.borderTopStyle =\n                this.styles.borderRightStyle =\n                this.styles.borderBottomStyle =\n                this.styles.borderLeftStyle =\n                    BORDER_STYLE.SOLID;\n            this.styles.backgroundClip = [BACKGROUND_CLIP.BORDER_BOX];\n            this.styles.backgroundOrigin = [BACKGROUND_ORIGIN.BORDER_BOX];\n            this.bounds = reformatInputBounds(this.bounds);\n        }\n\n        switch (this.type) {\n            case CHECKBOX:\n                this.styles.borderTopRightRadius =\n                    this.styles.borderTopLeftRadius =\n                    this.styles.borderBottomRightRadius =\n                    this.styles.borderBottomLeftRadius =\n                        CHECKBOX_BORDER_RADIUS;\n                break;\n            case RADIO:\n                this.styles.borderTopRightRadius =\n                    this.styles.borderTopLeftRadius =\n                    this.styles.borderBottomRightRadius =\n                    this.styles.borderBottomLeftRadius =\n                        RADIO_BORDER_RADIUS;\n                break;\n        }\n    }\n}\n","import { ElementContainer, ElementContainerOptions } from '../element-container';\nimport { Context } from '../../core/context';\nexport class SelectElementContainer extends ElementContainer {\n    readonly value: string;\n    constructor(context: Context, element: HTMLSelectElement, options: ElementContainerOptions = {}) {\n        super(context, element, options);\n        const option = element.options[element.selectedIndex || 0];\n        this.value = option ? option.text || '' : '';\n    }\n}\n","import { ElementContainer, ElementContainerOptions } from '../element-container';\nimport { Context } from '../../core/context';\nexport class TextareaElementContainer extends ElementContainer {\n    readonly value: string;\n    constructor(context: Context, element: HTMLTextAreaElement, options: ElementContainerOptions = {}) {\n        super(context, element, options);\n        this.value = element.value;\n    }\n}\n","import { ElementContainer, ElementContainerOptions } from '../element-container';\nimport { parseColor, type Color } from '../../css/types/color';\nimport { TRANSPARENT_COLOR } from '../../css/types/color';\nimport { isTransparent } from '../../css/types/color-utilities';\nimport { Context } from '../../core/context';\n\n// Parser function type to break circular dependency\ntype ParseTreeFunction = (context: Context, node: HTMLElement) => ElementContainer;\n\nexport class IFrameElementContainer extends ElementContainer {\n    src: string;\n    width: number;\n    height: number;\n    tree?: ElementContainer;\n    backgroundColor: Color;\n    private parseTreeFn?: ParseTreeFunction;\n\n    constructor(\n        context: Context,\n        iframe: HTMLIFrameElement,\n        parseTreeFn?: ParseTreeFunction,\n        options: ElementContainerOptions = {}\n    ) {\n        super(context, iframe, options);\n        this.src = iframe.src;\n        this.width = parseInt(iframe.width, 10) || 0;\n        this.height = parseInt(iframe.height, 10) || 0;\n        this.backgroundColor = this.styles.backgroundColor;\n        this.parseTreeFn = parseTreeFn;\n        try {\n            const contentWindow = iframe.contentWindow;\n            const contentDocument = contentWindow?.document;\n            if (contentWindow && contentDocument && contentDocument.documentElement && this.parseTreeFn) {\n                this.tree = this.parseTreeFn(context, contentDocument.documentElement);\n\n                // http://www.w3.org/TR/css3-background/#special-backgrounds\n                const documentBackgroundColor = parseColor(\n                    context,\n                    contentWindow.getComputedStyle(contentDocument.documentElement).backgroundColor as string\n                );\n                const bodyBackgroundColor = contentDocument.body\n                    ? parseColor(\n                          context,\n                          contentWindow.getComputedStyle(contentDocument.body).backgroundColor as string\n                      )\n                    : TRANSPARENT_COLOR;\n\n                this.backgroundColor = isTransparent(documentBackgroundColor)\n                    ? isTransparent(bodyBackgroundColor)\n                        ? this.styles.backgroundColor\n                        : bodyBackgroundColor\n                    : documentBackgroundColor;\n            }\n        } catch (e) {\n            // Cross-origin frames (and same-origin access failures) cannot be\n            // parsed; capture continues with the iframe's painted box only.\n            // Report instead of failing silently — a blank region is otherwise\n            // indistinguishable from a genuinely empty frame.\n            const error = e instanceof Error ? e : new Error(String(e));\n            this.context.logger.warn(\n                `Unable to render iframe content${this.src ? ` from ${this.src}` : ''}: ${error.message}`\n            );\n            this.context.onError?.(error);\n        }\n    }\n}\n","import { CSSParsedDeclaration } from '../css';\nimport { ElementContainer, ElementContainerOptions } from './element-container';\nimport { TextContainer } from './text-container';\nimport { ImageElementContainer } from './replaced-elements/image-element-container';\nimport { CanvasElementContainer } from './replaced-elements/canvas-element-container';\nimport { SVGElementContainer } from './replaced-elements/svg-element-container';\nimport { LIElementContainer } from './elements/li-element-container';\nimport { OLElementContainer } from './elements/ol-element-container';\nimport { InputElementContainer } from './replaced-elements/input-element-container';\nimport { SelectElementContainer } from './elements/select-element-container';\nimport { TextareaElementContainer } from './elements/textarea-element-container';\nimport { IFrameElementContainer } from './replaced-elements/iframe-element-container';\nimport { Context } from '../core/context';\nimport {\n    isBodyElement,\n    isCanvasElement,\n    isElementNode,\n    isIFrameElement,\n    isImageElement,\n    isInputElement,\n    isLIElement,\n    isOLElement,\n    isSelectElement,\n    isSlotElement,\n    isSVGElement,\n    isTextareaElement,\n    isTextNode\n} from './node-type-guards';\n\nimport { contains } from '../core/bitwise';\nimport { ISOLATION } from '../css/property-descriptors/isolation';\nimport { DISPLAY } from '../css/property-descriptors/display';\nimport { MIX_BLEND_MODE } from '../css/property-descriptors/mix-blend-mode';\nimport { Bounds } from '../css/layout/bounds';\nimport { TextBounds } from '../css/layout/text';\n\nconst LIST_OWNERS = ['OL', 'UL', 'MENU'];\n\nconst parseNodeTree = (\n    context: Context,\n    node: Node,\n    parent: ElementContainer,\n    root: ElementContainer,\n    zoomScale = 1,\n    options: ElementContainerOptions = {}\n) => {\n    for (let childNode = node.firstChild, nextNode; childNode; childNode = nextNode) {\n        nextNode = childNode.nextSibling;\n        parseChildNode(context, childNode, parent, root, zoomScale, options);\n    }\n};\n\n/**\n * Parse a single node as a child of `parent`.\n *\n * Separated from the tree walk so that nodes assigned to a `<slot>` (including\n * bare text nodes, which have no child nodes) can be parsed directly. Without\n * this, slotted shadow-DOM content such as web component labels was silently\n * dropped because `parseNodeTree` only iterates `node.firstChild` (issue #226).\n */\nconst parseChildNode = (\n    context: Context,\n    childNode: Node,\n    parent: ElementContainer,\n    root: ElementContainer,\n    zoomScale = 1,\n    options: ElementContainerOptions = {}\n) => {\n    // Fixes #2238 #1624 - Fix the issue of TextNode content being overlooked in rendering due to being perceived as blank by trim().\n    if (isTextNode(childNode) && childNode.data.length > 0) {\n        const textContainer = new TextContainer(context, childNode, parent.styles);\n        if (zoomScale !== 1) {\n            // Inside a zoomed ancestor, getClientRects returns zoomed (visual)\n            // coordinates. The renderer paints this subtree in unzoomed layout\n            // coordinates (relative to the zoomed element's visual top-left,\n            // which the zoom TransformEffect keeps fixed), so convert text\n            // bounds into that space.\n            const originLeft = parent.bounds.left;\n            const originTop = parent.bounds.top;\n            textContainer.textBounds = textContainer.textBounds.map(\n                (tb) =>\n                    new TextBounds(\n                        tb.text,\n                        new Bounds(\n                            originLeft + (tb.bounds.left - originLeft) / zoomScale,\n                            originTop + (tb.bounds.top - originTop) / zoomScale,\n                            tb.bounds.width / zoomScale,\n                            tb.bounds.height / zoomScale\n                        )\n                    )\n            );\n        }\n        parent.textNodes.push(textContainer);\n    } else if (isElementNode(childNode)) {\n        if (isSlotElement(childNode) && childNode.assignedNodes) {\n            // Slotted content is laid out at the slot's position: parse each\n            // assigned node (text or element) as a direct child of the slot's\n            // parent container.\n            childNode\n                .assignedNodes()\n                .forEach((assignedNode: Node) =>\n                    parseChildNode(context, assignedNode, parent, root, zoomScale, options)\n                );\n        } else {\n            const container = createContainer(context, childNode, options);\n            // A zoomed element lays itself out in unzoomed coordinates and is\n            // visually scaled by its own TransformEffect from the element's\n            // visual top-left corner. Its bounds therefore keep the visual\n            // left/top (position in the parent flow) but the width/height\n            // must be converted back to the unzoomed layout size — the\n            // TransformEffect scales them back up during painting.\n            // Descendants are laid out in unzoomed coordinates relative to\n            // that corner: parseChildNode converts their bounds into that\n            // space as the subtree is parsed.\n            const ownZoom = container.styles.zoom || 1;\n            if (ownZoom !== 1) {\n                container.bounds = new Bounds(\n                    container.bounds.left,\n                    container.bounds.top,\n                    container.bounds.width / ownZoom,\n                    container.bounds.height / ownZoom\n                );\n            }\n            if (container.styles.isVisible()) {\n                if (createsRealStackingContext(childNode, container, root)) {\n                    container.createsRealStackingContext = true;\n                } else if (createsStackingContext(container.styles)) {\n                    container.createsStackingContext = true;\n                }\n\n                if (LIST_OWNERS.indexOf(childNode.tagName) !== -1) {\n                    container.isListOwner = true;\n                }\n\n                parent.elements.push(container);\n                const childZoom = zoomScale * (container.styles.zoom || 1);\n                if (childNode.shadowRoot) {\n                    parseNodeTree(context, childNode.shadowRoot, container, root, childZoom, options);\n                } else if (!isTextareaElement(childNode) && !isSVGElement(childNode) && !isSelectElement(childNode)) {\n                    parseNodeTree(context, childNode, container, root, childZoom, options);\n                }\n            }\n        }\n    }\n};\n\nconst createContainer = (\n    context: Context,\n    element: Element,\n    options: ElementContainerOptions = {}\n): ElementContainer => {\n    if (isImageElement(element)) {\n        return new ImageElementContainer(context, element, options);\n    }\n\n    if (isCanvasElement(element)) {\n        return new CanvasElementContainer(context, element, options);\n    }\n\n    if (isSVGElement(element)) {\n        return new SVGElementContainer(context, element, options);\n    }\n\n    if (isLIElement(element)) {\n        return new LIElementContainer(context, element, options);\n    }\n\n    if (isOLElement(element)) {\n        return new OLElementContainer(context, element, options);\n    }\n\n    if (isInputElement(element)) {\n        return new InputElementContainer(context, element, options);\n    }\n\n    if (isSelectElement(element)) {\n        return new SelectElementContainer(context, element, options);\n    }\n\n    if (isTextareaElement(element)) {\n        return new TextareaElementContainer(context, element, options);\n    }\n\n    if (isIFrameElement(element)) {\n        return new IFrameElementContainer(context, element, (ctx, node) => parseTree(ctx, node, options), options);\n    }\n\n    return new ElementContainer(context, element, options);\n};\n\nexport const parseTree = (\n    context: Context,\n    element: HTMLElement,\n    options: ElementContainerOptions = {}\n): ElementContainer => {\n    const container = createContainer(context, element, options);\n    container.createsRealStackingContext = true;\n    parseNodeTree(context, element, container, container, 1, options);\n    return container;\n};\n\nconst createsRealStackingContext = (node: Element, container: ElementContainer, root: ElementContainer): boolean => {\n    return (\n        container.styles.isPositionedWithZIndex() ||\n        container.styles.opacity < 1 ||\n        Boolean(container.styles.filter) ||\n        Boolean(container.styles.backdropFilter) ||\n        container.styles.maskImage.length > 0 ||\n        Boolean(container.styles.webkitBoxReflect) ||\n        container.styles.isolation === ISOLATION.ISOLATE ||\n        container.styles.isTransformed() ||\n        (isBodyElement(node) && root.styles.isTransparent())\n    );\n};\n\nconst createsStackingContext = (styles: CSSParsedDeclaration): boolean => {\n    // Positioned and floating elements create stacking contexts\n    if (styles.isPositioned() || styles.isFloating()) {\n        return true;\n    }\n\n    // mix-blend-mode blends the element as one isolated group with the\n    // backdrop, which requires its own stacking context (same as opacity<1).\n    if (styles.mixBlendMode !== MIX_BLEND_MODE.NORMAL) {\n        return true;\n    }\n\n    // Fix for Issue #137: Inline-level containers (inline-flex, inline-block, etc.)\n    // should create stacking contexts to prevent their children from being added\n    // to the parent's stacking context, which causes rendering order issues\n    return (\n        contains(styles.display, DISPLAY.INLINE_FLEX) ||\n        contains(styles.display, DISPLAY.INLINE_BLOCK) ||\n        contains(styles.display, DISPLAY.INLINE_GRID) ||\n        contains(styles.display, DISPLAY.INLINE_TABLE)\n    );\n};\n","import { BezierCurve } from './bezier-curve';\nimport { Vector } from './vector';\nexport const enum PathType {\n    VECTOR = 0,\n    BEZIER_CURVE = 1\n}\n\nexport interface IPath {\n    type: PathType;\n    add(deltaX: number, deltaY: number): IPath;\n}\n\nexport const equalPath = (a: Path[], b: Path[]): boolean => {\n    if (a.length === b.length) {\n        return a.some((v, i) => v === b[i]);\n    }\n\n    return false;\n};\n\nexport const transformPath = (path: Path[], deltaX: number, deltaY: number, deltaW: number, deltaH: number): Path[] => {\n    return path.map((point, index) => {\n        switch (index) {\n            case 0:\n                return point.add(deltaX, deltaY);\n            case 1:\n                return point.add(deltaX + deltaW, deltaY);\n            case 2:\n                return point.add(deltaX + deltaW, deltaY + deltaH);\n            case 3:\n                return point.add(deltaX, deltaY + deltaH);\n        }\n        return point;\n    });\n};\n\nexport type Path = Vector | BezierCurve;\n","import { IPath, Path, PathType } from './path';\n\nexport class Vector implements IPath {\n    type: PathType;\n    x: number;\n    y: number;\n\n    constructor(x: number, y: number) {\n        this.type = PathType.VECTOR;\n        this.x = x;\n        this.y = y;\n    }\n\n    add(deltaX: number, deltaY: number): Vector {\n        return new Vector(this.x + deltaX, this.y + deltaY);\n    }\n}\n\nexport const isVector = (path: Path): path is Vector => path.type === PathType.VECTOR;\n","import { Vector } from './vector';\nimport { IPath, PathType, Path } from './path';\n\nconst lerp = (a: Vector, b: Vector, t: number): Vector => {\n    return new Vector(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t);\n};\n\nexport class BezierCurve implements IPath {\n    type: PathType;\n    start: Vector;\n    startControl: Vector;\n    endControl: Vector;\n    end: Vector;\n\n    constructor(start: Vector, startControl: Vector, endControl: Vector, end: Vector) {\n        this.type = PathType.BEZIER_CURVE;\n        this.start = start;\n        this.startControl = startControl;\n        this.endControl = endControl;\n        this.end = end;\n    }\n\n    subdivide(t: number, firstHalf: boolean): BezierCurve {\n        const ab = lerp(this.start, this.startControl, t);\n        const bc = lerp(this.startControl, this.endControl, t);\n        const cd = lerp(this.endControl, this.end, t);\n        const abbc = lerp(ab, bc, t);\n        const bccd = lerp(bc, cd, t);\n        const dest = lerp(abbc, bccd, t);\n        return firstHalf ? new BezierCurve(this.start, ab, abbc, dest) : new BezierCurve(dest, bccd, cd, this.end);\n    }\n\n    add(deltaX: number, deltaY: number): BezierCurve {\n        return new BezierCurve(\n            this.start.add(deltaX, deltaY),\n            this.startControl.add(deltaX, deltaY),\n            this.endControl.add(deltaX, deltaY),\n            this.end.add(deltaX, deltaY)\n        );\n    }\n\n    reverse(): BezierCurve {\n        return new BezierCurve(this.end, this.endControl, this.startControl, this.start);\n    }\n}\n\nexport const isBezierCurve = (path: Path): path is BezierCurve => path.type === PathType.BEZIER_CURVE;\n","import { ElementContainer } from '../dom/element-container';\nimport { getAbsoluteValue, getAbsoluteValueForTuple } from '../css/types/length-percentage';\nimport { Vector } from './vector';\nimport { BezierCurve } from './bezier-curve';\nimport { Path } from './path';\n\nexport class BoundCurves {\n    readonly topLeftBorderDoubleOuterBox: Path;\n    readonly topRightBorderDoubleOuterBox: Path;\n    readonly bottomRightBorderDoubleOuterBox: Path;\n    readonly bottomLeftBorderDoubleOuterBox: Path;\n    readonly topLeftBorderDoubleInnerBox: Path;\n    readonly topRightBorderDoubleInnerBox: Path;\n    readonly bottomRightBorderDoubleInnerBox: Path;\n    readonly bottomLeftBorderDoubleInnerBox: Path;\n    readonly topLeftBorderStroke: Path;\n    readonly topRightBorderStroke: Path;\n    readonly bottomRightBorderStroke: Path;\n    readonly bottomLeftBorderStroke: Path;\n    readonly topLeftBorderBox: Path;\n    readonly topRightBorderBox: Path;\n    readonly bottomRightBorderBox: Path;\n    readonly bottomLeftBorderBox: Path;\n    readonly topLeftPaddingBox: Path;\n    readonly topRightPaddingBox: Path;\n    readonly bottomRightPaddingBox: Path;\n    readonly bottomLeftPaddingBox: Path;\n    readonly topLeftContentBox: Path;\n    readonly topRightContentBox: Path;\n    readonly bottomRightContentBox: Path;\n    readonly bottomLeftContentBox: Path;\n\n    constructor(element: ElementContainer) {\n        const styles = element.styles;\n        const bounds = element.bounds;\n\n        let [tlh, tlv] = getAbsoluteValueForTuple(styles.borderTopLeftRadius, bounds.width, bounds.height);\n        let [trh, trv] = getAbsoluteValueForTuple(styles.borderTopRightRadius, bounds.width, bounds.height);\n        let [brh, brv] = getAbsoluteValueForTuple(styles.borderBottomRightRadius, bounds.width, bounds.height);\n        let [blh, blv] = getAbsoluteValueForTuple(styles.borderBottomLeftRadius, bounds.width, bounds.height);\n\n        const factors = [];\n        factors.push((tlh + trh) / bounds.width);\n        factors.push((blh + brh) / bounds.width);\n        factors.push((tlv + blv) / bounds.height);\n        factors.push((trv + brv) / bounds.height);\n        const maxFactor = Math.max(...factors);\n\n        if (maxFactor > 1) {\n            tlh /= maxFactor;\n            tlv /= maxFactor;\n            trh /= maxFactor;\n            trv /= maxFactor;\n            brh /= maxFactor;\n            brv /= maxFactor;\n            blh /= maxFactor;\n            blv /= maxFactor;\n        }\n\n        const topWidth = bounds.width - trh;\n        const rightHeight = bounds.height - brv;\n        const bottomWidth = bounds.width - brh;\n        const leftHeight = bounds.height - blv;\n\n        const borderTopWidth = styles.borderTopWidth;\n        const borderRightWidth = styles.borderRightWidth;\n        const borderBottomWidth = styles.borderBottomWidth;\n        const borderLeftWidth = styles.borderLeftWidth;\n\n        const paddingTop = getAbsoluteValue(styles.paddingTop, element.bounds.width);\n        const paddingRight = getAbsoluteValue(styles.paddingRight, element.bounds.width);\n        const paddingBottom = getAbsoluteValue(styles.paddingBottom, element.bounds.width);\n        const paddingLeft = getAbsoluteValue(styles.paddingLeft, element.bounds.width);\n\n        this.topLeftBorderDoubleOuterBox =\n            tlh > 0 || tlv > 0\n                ? getCurvePoints(\n                      bounds.left + borderLeftWidth / 3,\n                      bounds.top + borderTopWidth / 3,\n                      tlh - borderLeftWidth / 3,\n                      tlv - borderTopWidth / 3,\n                      CORNER.TOP_LEFT\n                  )\n                : new Vector(bounds.left + borderLeftWidth / 3, bounds.top + borderTopWidth / 3);\n        this.topRightBorderDoubleOuterBox =\n            trh > 0 || trv > 0\n                ? getCurvePoints(\n                      bounds.left + topWidth,\n                      bounds.top + borderTopWidth / 3,\n                      trh - borderRightWidth / 3,\n                      trv - borderTopWidth / 3,\n                      CORNER.TOP_RIGHT\n                  )\n                : new Vector(bounds.left + bounds.width - borderRightWidth / 3, bounds.top + borderTopWidth / 3);\n        this.bottomRightBorderDoubleOuterBox =\n            brh > 0 || brv > 0\n                ? getCurvePoints(\n                      bounds.left + bottomWidth,\n                      bounds.top + rightHeight,\n                      brh - borderRightWidth / 3,\n                      brv - borderBottomWidth / 3,\n                      CORNER.BOTTOM_RIGHT\n                  )\n                : new Vector(\n                      bounds.left + bounds.width - borderRightWidth / 3,\n                      bounds.top + bounds.height - borderBottomWidth / 3\n                  );\n        this.bottomLeftBorderDoubleOuterBox =\n            blh > 0 || blv > 0\n                ? getCurvePoints(\n                      bounds.left + borderLeftWidth / 3,\n                      bounds.top + leftHeight,\n                      blh - borderLeftWidth / 3,\n                      blv - borderBottomWidth / 3,\n                      CORNER.BOTTOM_LEFT\n                  )\n                : new Vector(bounds.left + borderLeftWidth / 3, bounds.top + bounds.height - borderBottomWidth / 3);\n        this.topLeftBorderDoubleInnerBox =\n            tlh > 0 || tlv > 0\n                ? getCurvePoints(\n                      bounds.left + (borderLeftWidth * 2) / 3,\n                      bounds.top + (borderTopWidth * 2) / 3,\n                      tlh - (borderLeftWidth * 2) / 3,\n                      tlv - (borderTopWidth * 2) / 3,\n                      CORNER.TOP_LEFT\n                  )\n                : new Vector(bounds.left + (borderLeftWidth * 2) / 3, bounds.top + (borderTopWidth * 2) / 3);\n        this.topRightBorderDoubleInnerBox =\n            trh > 0 || trv > 0\n                ? getCurvePoints(\n                      bounds.left + topWidth,\n                      bounds.top + (borderTopWidth * 2) / 3,\n                      trh - (borderRightWidth * 2) / 3,\n                      trv - (borderTopWidth * 2) / 3,\n                      CORNER.TOP_RIGHT\n                  )\n                : new Vector(\n                      bounds.left + bounds.width - (borderRightWidth * 2) / 3,\n                      bounds.top + (borderTopWidth * 2) / 3\n                  );\n        this.bottomRightBorderDoubleInnerBox =\n            brh > 0 || brv > 0\n                ? getCurvePoints(\n                      bounds.left + bottomWidth,\n                      bounds.top + rightHeight,\n                      brh - (borderRightWidth * 2) / 3,\n                      brv - (borderBottomWidth * 2) / 3,\n                      CORNER.BOTTOM_RIGHT\n                  )\n                : new Vector(\n                      bounds.left + bounds.width - (borderRightWidth * 2) / 3,\n                      bounds.top + bounds.height - (borderBottomWidth * 2) / 3\n                  );\n        this.bottomLeftBorderDoubleInnerBox =\n            blh > 0 || blv > 0\n                ? getCurvePoints(\n                      bounds.left + (borderLeftWidth * 2) / 3,\n                      bounds.top + leftHeight,\n                      blh - (borderLeftWidth * 2) / 3,\n                      blv - (borderBottomWidth * 2) / 3,\n                      CORNER.BOTTOM_LEFT\n                  )\n                : new Vector(\n                      bounds.left + (borderLeftWidth * 2) / 3,\n                      bounds.top + bounds.height - (borderBottomWidth * 2) / 3\n                  );\n        this.topLeftBorderStroke =\n            tlh > 0 || tlv > 0\n                ? getCurvePoints(\n                      bounds.left + borderLeftWidth / 2,\n                      bounds.top + borderTopWidth / 2,\n                      tlh - borderLeftWidth / 2,\n                      tlv - borderTopWidth / 2,\n                      CORNER.TOP_LEFT\n                  )\n                : new Vector(bounds.left + borderLeftWidth / 2, bounds.top + borderTopWidth / 2);\n        this.topRightBorderStroke =\n            trh > 0 || trv > 0\n                ? getCurvePoints(\n                      bounds.left + topWidth,\n                      bounds.top + borderTopWidth / 2,\n                      trh - borderRightWidth / 2,\n                      trv - borderTopWidth / 2,\n                      CORNER.TOP_RIGHT\n                  )\n                : new Vector(bounds.left + bounds.width - borderRightWidth / 2, bounds.top + borderTopWidth / 2);\n        this.bottomRightBorderStroke =\n            brh > 0 || brv > 0\n                ? getCurvePoints(\n                      bounds.left + bottomWidth,\n                      bounds.top + rightHeight,\n                      brh - borderRightWidth / 2,\n                      brv - borderBottomWidth / 2,\n                      CORNER.BOTTOM_RIGHT\n                  )\n                : new Vector(\n                      bounds.left + bounds.width - borderRightWidth / 2,\n                      bounds.top + bounds.height - borderBottomWidth / 2\n                  );\n        this.bottomLeftBorderStroke =\n            blh > 0 || blv > 0\n                ? getCurvePoints(\n                      bounds.left + borderLeftWidth / 2,\n                      bounds.top + leftHeight,\n                      blh - borderLeftWidth / 2,\n                      blv - borderBottomWidth / 2,\n                      CORNER.BOTTOM_LEFT\n                  )\n                : new Vector(bounds.left + borderLeftWidth / 2, bounds.top + bounds.height - borderBottomWidth / 2);\n        this.topLeftBorderBox =\n            tlh > 0 || tlv > 0\n                ? getCurvePoints(bounds.left, bounds.top, tlh, tlv, CORNER.TOP_LEFT)\n                : new Vector(bounds.left, bounds.top);\n        this.topRightBorderBox =\n            trh > 0 || trv > 0\n                ? getCurvePoints(bounds.left + topWidth, bounds.top, trh, trv, CORNER.TOP_RIGHT)\n                : new Vector(bounds.left + bounds.width, bounds.top);\n        this.bottomRightBorderBox =\n            brh > 0 || brv > 0\n                ? getCurvePoints(bounds.left + bottomWidth, bounds.top + rightHeight, brh, brv, CORNER.BOTTOM_RIGHT)\n                : new Vector(bounds.left + bounds.width, bounds.top + bounds.height);\n        this.bottomLeftBorderBox =\n            blh > 0 || blv > 0\n                ? getCurvePoints(bounds.left, bounds.top + leftHeight, blh, blv, CORNER.BOTTOM_LEFT)\n                : new Vector(bounds.left, bounds.top + bounds.height);\n        this.topLeftPaddingBox =\n            tlh > 0 || tlv > 0\n                ? getCurvePoints(\n                      bounds.left + borderLeftWidth,\n                      bounds.top + borderTopWidth,\n                      Math.max(0, tlh - borderLeftWidth),\n                      Math.max(0, tlv - borderTopWidth),\n                      CORNER.TOP_LEFT\n                  )\n                : new Vector(bounds.left + borderLeftWidth, bounds.top + borderTopWidth);\n        this.topRightPaddingBox =\n            trh > 0 || trv > 0\n                ? getCurvePoints(\n                      bounds.left + Math.min(topWidth, bounds.width - borderRightWidth),\n                      bounds.top + borderTopWidth,\n                      topWidth > bounds.width + borderRightWidth ? 0 : Math.max(0, trh - borderRightWidth),\n                      Math.max(0, trv - borderTopWidth),\n                      CORNER.TOP_RIGHT\n                  )\n                : new Vector(bounds.left + bounds.width - borderRightWidth, bounds.top + borderTopWidth);\n        this.bottomRightPaddingBox =\n            brh > 0 || brv > 0\n                ? getCurvePoints(\n                      bounds.left + Math.min(bottomWidth, bounds.width - borderLeftWidth),\n                      bounds.top + Math.min(rightHeight, bounds.height - borderBottomWidth),\n                      Math.max(0, brh - borderRightWidth),\n                      Math.max(0, brv - borderBottomWidth),\n                      CORNER.BOTTOM_RIGHT\n                  )\n                : new Vector(\n                      bounds.left + bounds.width - borderRightWidth,\n                      bounds.top + bounds.height - borderBottomWidth\n                  );\n        this.bottomLeftPaddingBox =\n            blh > 0 || blv > 0\n                ? getCurvePoints(\n                      bounds.left + borderLeftWidth,\n                      bounds.top + Math.min(leftHeight, bounds.height - borderBottomWidth),\n                      Math.max(0, blh - borderLeftWidth),\n                      Math.max(0, blv - borderBottomWidth),\n                      CORNER.BOTTOM_LEFT\n                  )\n                : new Vector(bounds.left + borderLeftWidth, bounds.top + bounds.height - borderBottomWidth);\n        this.topLeftContentBox =\n            tlh > 0 || tlv > 0\n                ? getCurvePoints(\n                      bounds.left + borderLeftWidth + paddingLeft,\n                      bounds.top + borderTopWidth + paddingTop,\n                      Math.max(0, tlh - (borderLeftWidth + paddingLeft)),\n                      Math.max(0, tlv - (borderTopWidth + paddingTop)),\n                      CORNER.TOP_LEFT\n                  )\n                : new Vector(bounds.left + borderLeftWidth + paddingLeft, bounds.top + borderTopWidth + paddingTop);\n        this.topRightContentBox =\n            trh > 0 || trv > 0\n                ? getCurvePoints(\n                      bounds.left + Math.min(topWidth, bounds.width + borderLeftWidth + paddingLeft),\n                      bounds.top + borderTopWidth + paddingTop,\n                      topWidth > bounds.width + borderLeftWidth + paddingLeft ? 0 : trh - borderLeftWidth + paddingLeft,\n                      trv - (borderTopWidth + paddingTop),\n                      CORNER.TOP_RIGHT\n                  )\n                : new Vector(\n                      bounds.left + bounds.width - (borderRightWidth + paddingRight),\n                      bounds.top + borderTopWidth + paddingTop\n                  );\n        this.bottomRightContentBox =\n            brh > 0 || brv > 0\n                ? getCurvePoints(\n                      bounds.left + Math.min(bottomWidth, bounds.width - (borderLeftWidth + paddingLeft)),\n                      bounds.top + Math.min(rightHeight, bounds.height + borderTopWidth + paddingTop),\n                      Math.max(0, brh - (borderRightWidth + paddingRight)),\n                      brv - (borderBottomWidth + paddingBottom),\n                      CORNER.BOTTOM_RIGHT\n                  )\n                : new Vector(\n                      bounds.left + bounds.width - (borderRightWidth + paddingRight),\n                      bounds.top + bounds.height - (borderBottomWidth + paddingBottom)\n                  );\n        this.bottomLeftContentBox =\n            blh > 0 || blv > 0\n                ? getCurvePoints(\n                      bounds.left + borderLeftWidth + paddingLeft,\n                      bounds.top + leftHeight,\n                      Math.max(0, blh - (borderLeftWidth + paddingLeft)),\n                      blv - (borderBottomWidth + paddingBottom),\n                      CORNER.BOTTOM_LEFT\n                  )\n                : new Vector(\n                      bounds.left + borderLeftWidth + paddingLeft,\n                      bounds.top + bounds.height - (borderBottomWidth + paddingBottom)\n                  );\n    }\n}\n\nenum CORNER {\n    TOP_LEFT = 0,\n    TOP_RIGHT = 1,\n    BOTTOM_RIGHT = 2,\n    BOTTOM_LEFT = 3\n}\n\nconst getCurvePoints = (x: number, y: number, r1: number, r2: number, position: CORNER): BezierCurve => {\n    const kappa = 4 * ((Math.sqrt(2) - 1) / 3);\n    const ox = r1 * kappa; // control point offset horizontal\n    const oy = r2 * kappa; // control point offset vertical\n    const xm = x + r1; // x-middle\n    const ym = y + r2; // y-middle\n\n    switch (position) {\n        case CORNER.TOP_LEFT:\n            return new BezierCurve(\n                new Vector(x, ym),\n                new Vector(x, ym - oy),\n                new Vector(xm - ox, y),\n                new Vector(xm, y)\n            );\n        case CORNER.TOP_RIGHT:\n            return new BezierCurve(\n                new Vector(x, y),\n                new Vector(x + ox, y),\n                new Vector(xm, ym - oy),\n                new Vector(xm, ym)\n            );\n        case CORNER.BOTTOM_RIGHT:\n            return new BezierCurve(\n                new Vector(xm, y),\n                new Vector(xm, y + oy),\n                new Vector(x + ox, ym),\n                new Vector(x, ym)\n            );\n        case CORNER.BOTTOM_LEFT:\n        default:\n            return new BezierCurve(\n                new Vector(xm, ym),\n                new Vector(xm - ox, ym),\n                new Vector(x, y + oy),\n                new Vector(x, y)\n            );\n    }\n};\n\nexport const calculateBorderBoxPath = (curves: BoundCurves): Path[] => {\n    return [curves.topLeftBorderBox, curves.topRightBorderBox, curves.bottomRightBorderBox, curves.bottomLeftBorderBox];\n};\n\nexport const calculateContentBoxPath = (curves: BoundCurves): Path[] => {\n    return [\n        curves.topLeftContentBox,\n        curves.topRightContentBox,\n        curves.bottomRightContentBox,\n        curves.bottomLeftContentBox\n    ];\n};\n\nexport const calculatePaddingBoxPath = (curves: BoundCurves): Path[] => {\n    return [\n        curves.topLeftPaddingBox,\n        curves.topRightPaddingBox,\n        curves.bottomRightPaddingBox,\n        curves.bottomLeftPaddingBox\n    ];\n};\n","import { Matrix } from '../css/property-descriptors/transform';\nimport { at } from '../core/util';\nimport { MixBlendMode, MIX_BLEND_MODE } from '../css/property-descriptors/mix-blend-mode';\nimport { Path } from './path';\n\nexport const enum EffectType {\n    TRANSFORM = 0,\n    CLIP = 1,\n    OPACITY = 2,\n    CLIP_PATH = 3,\n    BLEND = 4,\n    FILTER = 5\n}\n\nexport const enum EffectTarget {\n    BACKGROUND_BORDERS = 1 << 1,\n    CONTENT = 1 << 2\n}\n\nexport interface IElementEffect {\n    readonly type: EffectType;\n    readonly target: number;\n}\n\nexport class TransformEffect implements IElementEffect {\n    readonly type: EffectType = EffectType.TRANSFORM;\n    readonly target: number = EffectTarget.BACKGROUND_BORDERS | EffectTarget.CONTENT;\n\n    constructor(\n        readonly offsetX: number,\n        readonly offsetY: number,\n        readonly matrix: Matrix\n    ) {}\n}\n\nexport class ClipEffect implements IElementEffect {\n    readonly type: EffectType = EffectType.CLIP;\n\n    constructor(\n        readonly path: Path[],\n        readonly target: EffectTarget\n    ) {}\n}\n\nexport class OpacityEffect implements IElementEffect {\n    readonly type: EffectType = EffectType.OPACITY;\n    readonly target: number = EffectTarget.BACKGROUND_BORDERS | EffectTarget.CONTENT;\n\n    constructor(readonly opacity: number) {}\n}\n\n/**\n * Clips the element and all its descendants to an arbitrary canvas-drawn shape.\n * The `applyClip` callback is responsible for calling beginPath, the shape\n * operations, and ctx.clip() — giving each shape type full control over how\n * the path is constructed (arc, ellipse, lineTo, Path2D, etc.).\n */\nexport class ClipPathEffect implements IElementEffect {\n    readonly type: EffectType = EffectType.CLIP_PATH;\n    readonly target: number = EffectTarget.BACKGROUND_BORDERS | EffectTarget.CONTENT;\n\n    constructor(readonly applyClip: (ctx: CanvasRenderingContext2D) => void) {}\n}\n\n/**\n * Maps a CSS mix-blend-mode value to the corresponding Canvas {@link GlobalCompositeOperation}.\n * All CSS blend mode values are supported by the Canvas 2D API except 'normal',\n * which maps to the default 'source-over'.\n */\nconst MIX_BLEND_MODE_TO_COMPOSITE: Record<MixBlendMode, GlobalCompositeOperation> = {\n    [MIX_BLEND_MODE.NORMAL]: 'source-over',\n    [MIX_BLEND_MODE.MULTIPLY]: 'multiply',\n    [MIX_BLEND_MODE.SCREEN]: 'screen',\n    [MIX_BLEND_MODE.OVERLAY]: 'overlay',\n    [MIX_BLEND_MODE.DARKEN]: 'darken',\n    [MIX_BLEND_MODE.LIGHTEN]: 'lighten',\n    [MIX_BLEND_MODE.COLOR_DODGE]: 'color-dodge',\n    [MIX_BLEND_MODE.COLOR_BURN]: 'color-burn',\n    [MIX_BLEND_MODE.HARD_LIGHT]: 'hard-light',\n    [MIX_BLEND_MODE.SOFT_LIGHT]: 'soft-light',\n    [MIX_BLEND_MODE.DIFFERENCE]: 'difference',\n    [MIX_BLEND_MODE.EXCLUSION]: 'exclusion',\n    [MIX_BLEND_MODE.HUE]: 'hue',\n    [MIX_BLEND_MODE.SATURATION]: 'saturation',\n    [MIX_BLEND_MODE.COLOR]: 'color',\n    [MIX_BLEND_MODE.LUMINOSITY]: 'luminosity'\n};\n\nexport class BlendEffect implements IElementEffect {\n    readonly type: EffectType = EffectType.BLEND;\n    readonly target: number = EffectTarget.BACKGROUND_BORDERS | EffectTarget.CONTENT;\n    readonly compositeOperation: GlobalCompositeOperation;\n\n    constructor(readonly mixBlendMode: MixBlendMode) {\n        this.compositeOperation = MIX_BLEND_MODE_TO_COMPOSITE[mixBlendMode];\n    }\n}\n\nexport class FilterEffect implements IElementEffect {\n    readonly type: EffectType = EffectType.FILTER;\n    readonly target: number = EffectTarget.BACKGROUND_BORDERS | EffectTarget.CONTENT;\n\n    /** CSS filter string with drop-shadow() stripped (safe for ctx.filter). */\n    readonly safeFilterString: string;\n    /** Shadow params for drop-shadow(), if present and successfully parsed. */\n    readonly shadow?: { offsetX: number; offsetY: number; blur: number; color: string };\n\n    constructor(filterString: string) {\n        const parsed = FilterEffect.parseDropShadow(filterString);\n        this.shadow = parsed.shadow;\n        this.safeFilterString = parsed.safeFilterString;\n    }\n\n    /**\n     * Parse a CSS filter string, extracting drop-shadow() parameters for\n     * rendering via ctx.shadow* (which avoids canvas taint), and producing\n     * a safe filter string with all drop-shadow() calls removed.\n     *\n     * Uses paren-depth tracking to correctly handle nested function\n     * arguments — e.g. rgba() / hsla() inside drop-shadow() — which\n     * the previous regex-based approach ([^)]+) could not handle.\n     *\n     * Per CSS spec the shadow value is: <color>? && <length>{2,3}\n     * (components can appear in any order).\n     */\n    private static parseDropShadow(filterString: string): {\n        shadow?: { offsetX: number; offsetY: number; blur: number; color: string };\n        safeFilterString: string;\n    } {\n        if (!filterString) {\n            return { safeFilterString: '' };\n        }\n\n        const matches = FilterEffect.findDropShadows(filterString);\n\n        if (matches.length === 0) {\n            return { safeFilterString: filterString };\n        }\n\n        // Parse the first drop-shadow body to extract shadow params\n        const shadow = FilterEffect.parseDropShadowBody(at(matches, 0).body);\n\n        // Build safe filter string by removing ALL drop-shadow() occurrences\n        let result = '';\n        let lastEnd = 0;\n        for (const m of matches) {\n            result += filterString.slice(lastEnd, m.start);\n            lastEnd = m.end;\n        }\n        result += filterString.slice(lastEnd);\n\n        return {\n            shadow,\n            safeFilterString: result.replace(/\\s+/g, ' ').trim()\n        };\n    }\n\n    /**\n     * Find all drop-shadow() function calls in a CSS filter string.\n     * Uses paren-depth tracking to correctly skip over nested\n     * parentheses (e.g. rgba(0, 0, 0, 0.15)).\n     */\n    private static findDropShadows(str: string): Array<{ body: string; start: number; end: number }> {\n        const results: Array<{ body: string; start: number; end: number }> = [];\n        const re = /drop-shadow\\(/gi;\n        let m: RegExpExecArray | null;\n\n        while ((m = re.exec(str)) !== null) {\n            const openParen = m.index + 'drop-shadow('.length - 1; // position of '('\n            const start = m.index;\n\n            let depth = 1;\n            let pos = openParen + 1;\n\n            while (pos < str.length && depth > 0) {\n                const ch = str[pos] ?? '';\n                if (ch === '(') depth++;\n                else if (ch === ')') depth--;\n                pos++;\n            }\n\n            if (depth !== 0) break; // malformed — stop scanning\n\n            const body = str.slice(openParen + 1, pos - 1);\n            results.push({ body, start, end: pos });\n        }\n\n        return results;\n    }\n\n    /**\n     * Parse the body of a single drop-shadow() function.\n     * Body format (order-independent): <offsetX> <offsetY> [<blur>] [<color>?]\n     */\n    private static parseDropShadowBody(\n        body: string\n    ): { offsetX: number; offsetY: number; blur: number; color: string } | undefined {\n        const tokens = FilterEffect.tokenizeFilterArgs(body.trim());\n\n        const lengths: number[] = [];\n        let color: string | undefined;\n\n        for (const token of tokens) {\n            if (FilterEffect.isCSSLength(token)) {\n                lengths.push(parseFloat(token));\n            } else if (token) {\n                color = token;\n            }\n        }\n\n        if (lengths.length < 2 || lengths.length > 3) {\n            return undefined;\n        }\n\n        return {\n            offsetX: at(lengths, 0),\n            offsetY: at(lengths, 1),\n            blur: lengths.length > 2 ? at(lengths, 2) : 0,\n            color: color ?? 'rgba(0,0,0,1)'\n        };\n    }\n\n    /**\n     * Split whitespace-separated tokens while keeping parenthesised\n     * expressions intact.\n     *\n     * e.g. \"rgba(0, 0, 0, 0.15) 0px 1px 2px\"\n     *   → [\"rgba(0, 0, 0, 0.15)\", \"0px\", \"1px\", \"2px\"]\n     */\n    private static tokenizeFilterArgs(str: string): string[] {\n        const tokens: string[] = [];\n        let current = '';\n        let depth = 0;\n\n        for (let i = 0; i < str.length; i++) {\n            const ch = str[i] ?? '';\n\n            if (ch === '(') {\n                depth++;\n                current += ch;\n            } else if (ch === ')') {\n                depth--;\n                current += ch;\n            } else if (/\\s/.test(ch)) {\n                if (depth > 0) {\n                    current += ch;\n                } else if (current) {\n                    tokens.push(current);\n                    current = '';\n                }\n            } else {\n                current += ch;\n            }\n        }\n\n        if (current) {\n            tokens.push(current);\n        }\n\n        return tokens;\n    }\n\n    /** True when token looks like a CSS length: number with optional unit. */\n    private static isCSSLength(token: string): boolean {\n        return /^-?[\\d.]+(px|em|rem|pt|cm|mm|in|pc|ex|ch|vw|vh|vmin|vmax|%)?$/i.test(token);\n    }\n}\n\nexport const isTransformEffect = (effect: IElementEffect): effect is TransformEffect =>\n    effect.type === EffectType.TRANSFORM;\nexport const isClipEffect = (effect: IElementEffect): effect is ClipEffect => effect.type === EffectType.CLIP;\nexport const isOpacityEffect = (effect: IElementEffect): effect is OpacityEffect => effect.type === EffectType.OPACITY;\nexport const isClipPathEffect = (effect: IElementEffect): effect is ClipPathEffect =>\n    effect.type === EffectType.CLIP_PATH;\nexport const isBlendEffect = (effect: IElementEffect): effect is BlendEffect => effect.type === EffectType.BLEND;\nexport const isFilterEffect = (effect: IElementEffect): effect is FilterEffect => effect.type === EffectType.FILTER;\n","import { ElementContainer } from '../dom/element-container';\nimport { at } from '../core/util';\nimport { contains } from '../core/bitwise';\nimport { BoundCurves, calculateBorderBoxPath, calculatePaddingBoxPath } from './bound-curves';\nimport {\n    BlendEffect,\n    ClipEffect,\n    ClipPathEffect,\n    EffectTarget,\n    FilterEffect,\n    IElementEffect,\n    isBlendEffect,\n    isClipEffect,\n    isFilterEffect,\n    isOpacityEffect,\n    OpacityEffect,\n    TransformEffect\n} from './effects';\nimport { Matrix } from '../css/property-descriptors/transform';\nimport { OVERFLOW } from '../css/property-descriptors/overflow';\nimport { equalPath } from './path';\nimport { DISPLAY } from '../css/property-descriptors/display';\nimport { OLElementContainer } from '../dom/elements/ol-element-container';\nimport { LIElementContainer } from '../dom/elements/li-element-container';\nimport { createCounterText } from '../css/types/functions/counter';\nimport { POSITION } from '../css/property-descriptors/position';\nimport { getAbsoluteValue } from '../css/types/length-percentage';\nimport { Bounds } from '../css/layout/bounds';\nimport { CLIP_PATH_TYPE, ClipPathValue, ShapeRadius } from '../css/property-descriptors/clip-path';\nimport { MIX_BLEND_MODE } from '../css/property-descriptors/mix-blend-mode';\n\nexport class StackingContext {\n    element: ElementPaint;\n    negativeZIndex: StackingContext[];\n    zeroOrAutoZIndexOrTransformedOrOpacity: StackingContext[];\n    positiveZIndex: StackingContext[];\n    nonPositionedFloats: StackingContext[];\n    nonPositionedInlineLevel: StackingContext[];\n    inlineLevel: ElementPaint[];\n    nonInlineLevel: ElementPaint[];\n\n    constructor(container: ElementPaint) {\n        this.element = container;\n        this.inlineLevel = [];\n        this.nonInlineLevel = [];\n        this.negativeZIndex = [];\n        this.zeroOrAutoZIndexOrTransformedOrOpacity = [];\n        this.positiveZIndex = [];\n        this.nonPositionedFloats = [];\n        this.nonPositionedInlineLevel = [];\n    }\n}\n\nexport class ElementPaint {\n    readonly effects: IElementEffect[] = [];\n    readonly curves: BoundCurves;\n    listValue?: string;\n    /** Memoised getEffects results for the plain (surfaceRoot-less) render path. */\n    private plainEffectsCache: Map<EffectTarget, IElementEffect[]> | null = null;\n\n    constructor(\n        readonly container: ElementContainer,\n        readonly parent: ElementPaint | null\n    ) {\n        this.curves = new BoundCurves(this.container);\n        if (this.container.styles.opacity < 1) {\n            this.effects.push(new OpacityEffect(this.container.styles.opacity));\n        }\n\n        // CSS Transforms Level 2 combines the individual transform properties\n        // with `transform` as translate → rotate → scale → transform, all\n        // around the shared transform-origin. Effects are applied in push\n        // order and post-multiply, so pushing in this order yields the spec\n        // matrix product T·R·S·X.\n        if (this.container.styles.translate !== null) {\n            const origin = this.container.styles.transformOrigin;\n            const offsetX = this.container.bounds.left + getAbsoluteValue(origin[0], this.container.bounds.width);\n            const offsetY = this.container.bounds.top + getAbsoluteValue(origin[1], this.container.bounds.height);\n            const [tx, ty] = this.container.styles.translate;\n            const dx = getAbsoluteValue(tx, this.container.bounds.width);\n            const dy = getAbsoluteValue(ty, this.container.bounds.height);\n            this.effects.push(new TransformEffect(offsetX, offsetY, [1, 0, 0, 1, dx, dy]));\n        }\n\n        if (this.container.styles.rotate !== null) {\n            const origin = this.container.styles.transformOrigin;\n            const offsetX = this.container.bounds.left + getAbsoluteValue(origin[0], this.container.bounds.width);\n            const offsetY = this.container.bounds.top + getAbsoluteValue(origin[1], this.container.bounds.height);\n            // Apply rotate property if present\n            const angle = this.container.styles.rotate;\n            const rad = (angle * Math.PI) / 180;\n            const cos = Math.cos(rad);\n            const sin = Math.sin(rad);\n            const rotateMatrix: Matrix = [cos, sin, -sin, cos, 0, 0];\n            this.effects.push(new TransformEffect(offsetX, offsetY, rotateMatrix));\n        }\n\n        if (this.container.styles.scale !== null) {\n            const origin = this.container.styles.transformOrigin;\n            const offsetX = this.container.bounds.left + getAbsoluteValue(origin[0], this.container.bounds.width);\n            const offsetY = this.container.bounds.top + getAbsoluteValue(origin[1], this.container.bounds.height);\n            const [sx, sy] = this.container.styles.scale;\n            this.effects.push(new TransformEffect(offsetX, offsetY, [sx, 0, 0, sy, 0, 0]));\n        }\n\n        if (this.container.styles.transform !== null) {\n            const origin = this.container.styles.transformOrigin;\n            const offsetX = this.container.bounds.left + getAbsoluteValue(origin[0], this.container.bounds.width);\n            const offsetY = this.container.bounds.top + getAbsoluteValue(origin[1], this.container.bounds.height);\n            const matrix = this.container.styles.transform;\n            this.effects.push(new TransformEffect(offsetX, offsetY, matrix));\n        }\n\n        if (hasOverflowClip(this.container.styles)) {\n            const borderBox = calculateBorderBoxPath(this.curves);\n            const paddingBox = calculatePaddingBoxPath(this.curves);\n\n            if (equalPath(borderBox, paddingBox)) {\n                this.effects.push(new ClipEffect(borderBox, EffectTarget.BACKGROUND_BORDERS | EffectTarget.CONTENT));\n            } else {\n                this.effects.push(new ClipEffect(borderBox, EffectTarget.BACKGROUND_BORDERS));\n                this.effects.push(new ClipEffect(paddingBox, EffectTarget.CONTENT));\n            }\n        }\n\n        if (this.container.styles.clipPath.type !== CLIP_PATH_TYPE.NONE) {\n            const clipPathEffect = buildClipPathEffect(this.container.styles.clipPath, this.container.bounds);\n            if (clipPathEffect) {\n                this.effects.push(clipPathEffect);\n            }\n        }\n\n        if (this.container.styles.mixBlendMode !== MIX_BLEND_MODE.NORMAL) {\n            this.effects.push(new BlendEffect(this.container.styles.mixBlendMode));\n        }\n\n        if (this.container.styles.filter !== null) {\n            this.effects.push(new FilterEffect(this.container.styles.filter));\n        }\n\n        if (this.container.styles.zoom !== 1) {\n            // CSS `zoom` lays the element out in unzoomed coordinates and\n            // scales the whole render by the zoom factor from the element's\n            // visual top-left corner. parseChildNode has already converted\n            // this subtree's bounds/textBounds back to unzoomed layout\n            // coordinates relative to that corner, so zooming the entire\n            // paint with the corner as the fixed point restores both the\n            // visual size and the left alignment.\n            const offsetX = this.container.bounds.left;\n            const offsetY = this.container.bounds.top;\n            const z = this.container.styles.zoom;\n            const zoomMatrix: Matrix = [z, 0, 0, z, 0, 0];\n            this.effects.push(new TransformEffect(offsetX, offsetY, zoomMatrix));\n        }\n    }\n\n    getEffects(target: EffectTarget, surfaceRoot?: ElementPaint): IElementEffect[] {\n        // The ElementPaint tree is fully built before rendering begins, so the\n        // ancestor walk below is deterministic per node. Memoise it for the\n        // plain render path (surfaceRoot undefined), which resolves the same\n        // two target masks for every element of every render. The composited\n        // filter-surface path passes a surfaceRoot whose filtering depends on\n        // the caller, so it always recomputes.\n        if (!surfaceRoot) {\n            let cache = this.plainEffectsCache;\n            if (!cache) {\n                cache = new Map();\n                this.plainEffectsCache = cache;\n            }\n            let cached = cache.get(target);\n            if (!cached) {\n                cached = this.computeEffects(target);\n                cache.set(target, cached);\n            }\n            return cached;\n        }\n        return this.computeEffects(target, surfaceRoot);\n    }\n\n    private computeEffects(target: EffectTarget, surfaceRoot?: ElementPaint): IElementEffect[] {\n        let inFlow = [POSITION.ABSOLUTE, POSITION.FIXED].indexOf(this.container.styles.position) === -1;\n        let parent = this === surfaceRoot ? null : this.parent;\n        // The surface root owns its filter/opacity/blend (applied when the\n        // surface is composited onto the backdrop). Its overflow clip,\n        // however, must stay in the surface: it clips the root's own direct\n        // content while the surface is painted, and cannot be reconstructed\n        // afterwards without losing the border-radius part of the path.\n        const sourceEffects = (paint: ElementPaint) =>\n            paint.effects.filter(\n                (effect) =>\n                    paint !== surfaceRoot ||\n                    (!isFilterEffect(effect) && !isOpacityEffect(effect) && !isBlendEffect(effect))\n            );\n        const effects = sourceEffects(this);\n        while (parent) {\n            const croplessEffects = sourceEffects(parent).filter((effect) => !isClipEffect(effect));\n            if (inFlow || parent.container.styles.position !== POSITION.STATIC || !parent.parent) {\n                inFlow = [POSITION.ABSOLUTE, POSITION.FIXED].indexOf(parent.container.styles.position) === -1;\n                if (hasOverflowClip(parent.container.styles)) {\n                    const borderBox = calculateBorderBoxPath(parent.curves);\n                    const paddingBox = calculatePaddingBoxPath(parent.curves);\n                    if (!equalPath(borderBox, paddingBox)) {\n                        effects.unshift(\n                            new ClipEffect(paddingBox, EffectTarget.BACKGROUND_BORDERS | EffectTarget.CONTENT)\n                        );\n                    }\n                }\n                effects.unshift(...croplessEffects);\n            } else {\n                effects.unshift(...croplessEffects);\n            }\n\n            parent = parent === surfaceRoot ? null : parent.parent;\n        }\n\n        return effects.filter((effect) => contains(effect.target, target));\n    }\n}\n\n/** @internal – exported for testing only. */\nexport const hasOverflowClip = (styles: ElementContainer['styles']): boolean =>\n    styles.overflowX !== OVERFLOW.VISIBLE || styles.overflowY !== OVERFLOW.VISIBLE;\n\n/**\n * Resolve a `closest-side` or `farthest-side` shape-radius keyword to pixels\n * for a single axis. Used by both `circle()` (per-axis) and `ellipse()`.\n *\n * @param r       - The ShapeRadius (keyword or length-percentage).\n * @param center  - Absolute center coordinate on this axis (cx or cy).\n * @param start   - Absolute start of the reference box on this axis.\n * @param end     - Absolute end of the reference box on this axis.\n * @param dimRef  - Reference dimension for resolving a length-percentage value.\n * @internal – exported for testing only.\n */\nexport const resolveAxisRadius = (\n    r: ShapeRadius,\n    center: number,\n    start: number,\n    end: number,\n    dimRef: number\n): number => {\n    if (r === 'closest-side') return Math.min(center - start, end - center);\n    if (r === 'farthest-side') return Math.max(center - start, end - center);\n    return getAbsoluteValue(r, dimRef);\n};\n\n/**\n * Convert a parsed ClipPathValue + element bounds into a ClipPathEffect whose\n * `applyClip` callback draws the clip shape directly onto the canvas context.\n *\n * All coordinates are computed in page-absolute space at construction time so\n * the callback itself is allocation-free and executes synchronously.\n * @internal – exported for testing only.\n */\nexport const buildClipPathEffect = (clipPath: ClipPathValue, bounds: Bounds): ClipPathEffect | null => {\n    const { left: bLeft, top: bTop, width: bWidth, height: bHeight } = bounds;\n\n    switch (clipPath.type) {\n        case CLIP_PATH_TYPE.INSET: {\n            const iLeft = getAbsoluteValue(clipPath.left, bWidth);\n            const iTop = getAbsoluteValue(clipPath.top, bHeight);\n            const x = bLeft + iLeft;\n            const y = bTop + iTop;\n            // Clamp to zero: per CSS spec, overlapping insets produce an empty shape.\n            const w = Math.max(0, bWidth - iLeft - getAbsoluteValue(clipPath.right, bWidth));\n            const h = Math.max(0, bHeight - iTop - getAbsoluteValue(clipPath.bottom, bHeight));\n            return new ClipPathEffect((ctx) => {\n                ctx.beginPath();\n                ctx.rect(x, y, w, h);\n                ctx.clip();\n            });\n        }\n\n        case CLIP_PATH_TYPE.CIRCLE: {\n            const cx = bLeft + getAbsoluteValue(clipPath.cx, bWidth);\n            const cy = bTop + getAbsoluteValue(clipPath.cy, bHeight);\n            let r: number;\n            if (clipPath.radius === 'closest-side') {\n                r = Math.min(cx - bLeft, cy - bTop, bLeft + bWidth - cx, bTop + bHeight - cy);\n            } else if (clipPath.radius === 'farthest-side') {\n                r = Math.max(cx - bLeft, cy - bTop, bLeft + bWidth - cx, bTop + bHeight - cy);\n            } else {\n                // Per CSS spec, percentage is relative to sqrt(w² + h²) / sqrt(2).\n                r = getAbsoluteValue(clipPath.radius, Math.sqrt(bWidth * bWidth + bHeight * bHeight) / Math.SQRT2);\n            }\n            return new ClipPathEffect((ctx) => {\n                ctx.beginPath();\n                ctx.arc(cx, cy, Math.max(0, r), 0, Math.PI * 2);\n                ctx.clip();\n            });\n        }\n\n        case CLIP_PATH_TYPE.ELLIPSE: {\n            const cx = bLeft + getAbsoluteValue(clipPath.cx, bWidth);\n            const cy = bTop + getAbsoluteValue(clipPath.cy, bHeight);\n            const rx = resolveAxisRadius(clipPath.rx, cx, bLeft, bLeft + bWidth, bWidth);\n            const ry = resolveAxisRadius(clipPath.ry, cy, bTop, bTop + bHeight, bHeight);\n            return new ClipPathEffect((ctx) => {\n                ctx.beginPath();\n                ctx.ellipse(cx, cy, Math.max(0, rx), Math.max(0, ry), 0, 0, Math.PI * 2);\n                ctx.clip();\n            });\n        }\n\n        case CLIP_PATH_TYPE.POLYGON: {\n            // Pre-compute all vertices in page-absolute coordinates.\n            const absPoints = clipPath.points.map(\n                ([px, py]) =>\n                    [bLeft + getAbsoluteValue(px, bWidth), bTop + getAbsoluteValue(py, bHeight)] as [number, number]\n            );\n            return new ClipPathEffect((ctx) => {\n                ctx.beginPath();\n                if (absPoints.length > 0) {\n                    ctx.moveTo(at(at(absPoints, 0), 0), at(at(absPoints, 0), 1));\n                    for (let i = 1; i < absPoints.length; i++) {\n                        ctx.lineTo(at(at(absPoints, i), 0), at(at(absPoints, i), 1));\n                    }\n                    ctx.closePath();\n                }\n                // Calling clip() with an empty path (zero points) is intentional:\n                // it clips the entire region to nothing, which is the correct\n                // behaviour for a degenerate polygon() per the CSS spec.\n                ctx.clip();\n            });\n        }\n\n        case CLIP_PATH_TYPE.PATH: {\n            // path() coordinates are in the element's local space (0,0 = element top-left).\n            // We temporarily translate the canvas origin to the element's position, clip\n            // with the Path2D, then restore only the transform matrix (not the clipping\n            // region) via setTransform so the clip persists for the enclosing\n            // ctx.save() / ctx.restore() pair managed by EffectsRenderer.\n            //\n            // When the element also has a CSS transform, that transform was already applied\n            // by a preceding TransformEffect, so the path coordinates end up correctly in\n            // the element's transformed local space — matching browser behaviour.\n            const { d } = clipPath;\n            let cachedPath: Path2D | null = null;\n            return new ClipPathEffect((ctx) => {\n                try {\n                    if (!cachedPath) {\n                        cachedPath = new Path2D(d);\n                    }\n                    const savedTransform = ctx.getTransform();\n                    ctx.translate(bLeft, bTop);\n                    ctx.clip(cachedPath);\n                    ctx.setTransform(savedTransform);\n                } catch (_e) {\n                    // Path2D or getTransform/setTransform not supported in this environment.\n                }\n            });\n        }\n\n        case CLIP_PATH_TYPE.XYWH: {\n            const x = bLeft + getAbsoluteValue(clipPath.x, bWidth);\n            const y = bTop + getAbsoluteValue(clipPath.y, bHeight);\n            const w = Math.max(0, getAbsoluteValue(clipPath.width, bWidth));\n            const h = Math.max(0, getAbsoluteValue(clipPath.height, bHeight));\n            return new ClipPathEffect((ctx) => {\n                ctx.beginPath();\n                ctx.rect(x, y, w, h);\n                ctx.clip();\n            });\n        }\n\n        case CLIP_PATH_TYPE.NONE:\n            return null;\n\n        default: {\n            // Exhaustiveness guard: if a new CLIP_PATH_TYPE is added in the future\n            // without a corresponding case above, TypeScript will raise a compile-time\n            // error here rather than silently falling through.\n            const _exhaustive: never = clipPath;\n            void _exhaustive;\n            return null;\n        }\n    }\n};\n\nconst parseStackTree = (\n    parent: ElementPaint,\n    stackingContext: StackingContext,\n    realStackingContext: StackingContext,\n    listItems: ElementPaint[]\n) => {\n    parent.container.elements.forEach((child) => {\n        const treatAsRealStackingContext = child.createsRealStackingContext;\n        const createsStackingContext = child.createsStackingContext;\n        const paintContainer = new ElementPaint(child, parent);\n        if (contains(child.styles.display, DISPLAY.LIST_ITEM)) {\n            listItems.push(paintContainer);\n        }\n\n        const listOwnerItems = child.isListOwner ? [] : listItems;\n\n        if (treatAsRealStackingContext || createsStackingContext) {\n            const parentStack =\n                treatAsRealStackingContext || child.styles.isPositioned() ? realStackingContext : stackingContext;\n\n            const stack = new StackingContext(paintContainer);\n\n            if (child.styles.isPositioned() || child.styles.opacity < 1 || child.styles.isTransformed()) {\n                const order = child.styles.zIndex.order;\n                if (order < 0) {\n                    let index = 0;\n\n                    parentStack.negativeZIndex.some((current, i) => {\n                        if (order >= current.element.container.styles.zIndex.order) {\n                            index = i + 1;\n                            return false;\n                        } else if (index > 0) {\n                            return true;\n                        }\n\n                        return false;\n                    });\n                    parentStack.negativeZIndex.splice(index, 0, stack);\n                } else if (order > 0) {\n                    let index = 0;\n                    parentStack.positiveZIndex.some((current, i) => {\n                        if (order >= current.element.container.styles.zIndex.order) {\n                            index = i + 1;\n                            return false;\n                        } else if (index > 0) {\n                            return true;\n                        }\n\n                        return false;\n                    });\n                    parentStack.positiveZIndex.splice(index, 0, stack);\n                } else {\n                    parentStack.zeroOrAutoZIndexOrTransformedOrOpacity.push(stack);\n                }\n            } else {\n                if (child.styles.isFloating()) {\n                    parentStack.nonPositionedFloats.push(stack);\n                } else {\n                    parentStack.nonPositionedInlineLevel.push(stack);\n                }\n            }\n\n            parseStackTree(\n                paintContainer,\n                stack,\n                treatAsRealStackingContext ? stack : realStackingContext,\n                listOwnerItems\n            );\n        } else {\n            if (child.styles.isInlineLevel()) {\n                stackingContext.inlineLevel.push(paintContainer);\n            } else {\n                stackingContext.nonInlineLevel.push(paintContainer);\n            }\n\n            parseStackTree(paintContainer, stackingContext, realStackingContext, listOwnerItems);\n        }\n\n        if (child.isListOwner) {\n            processListItems(child, listOwnerItems);\n        }\n    });\n};\n\nconst processListItems = (owner: ElementContainer, elements: ElementPaint[]) => {\n    let numbering = owner instanceof OLElementContainer ? owner.start : 1;\n    const reversed = owner instanceof OLElementContainer ? owner.reversed : false;\n    for (let i = 0; i < elements.length; i++) {\n        const item = at(elements, i);\n        if (\n            item.container instanceof LIElementContainer &&\n            typeof item.container.value === 'number' &&\n            item.container.value !== 0\n        ) {\n            numbering = item.container.value;\n        }\n\n        item.listValue = createCounterText(numbering, item.container.styles.listStyleType, true);\n\n        numbering += reversed ? -1 : 1;\n    }\n};\n\nexport const parseStackingContexts = (container: ElementContainer): StackingContext => {\n    const paintContainer = new ElementPaint(container, null);\n    const root = new StackingContext(paintContainer);\n    const listItems: ElementPaint[] = [];\n    parseStackTree(paintContainer, root, root, listItems);\n    processListItems(paintContainer.container, listItems);\n    return root;\n};\n","/**\n * Shared gradient rasterisation primitives.\n *\n * Canvas 2D has no repeating gradients and no native elliptical radial\n * gradients, so every gradient painter (background, mask, border-image) needs\n * the same two building blocks:\n *\n * 1. periodic stop stacking — the one-cycle stop list re-added k·period + s\n *    for k = 0..cycles-1, clamped to the [0, 1] gradient range;\n * 2. ellipse rasterisation — a circle of radius rx scaled vertically by\n *    ry / rx, painted on a 2rx × 2ry offscreen canvas.\n *\n * Centralising them keeps the subtle invariants in one place:\n * - stop positions are normalised against rx (the canvas gradient radius),\n *   NOT the diameter — normalising against the diameter halves every\n *   absolute-px stop;\n * - the fill must cover the pre-scale circle (fillRect of the rx*2 square),\n *   not the post-scale ellipse box — a user-space (2rx × 2ry) rect shrinks\n *   vertically under the y-scale and clips the ellipse whenever ry < rx;\n * - outside the ending shape a radial gradient continues with its last\n *   colour, which callers must paint across the full area first.\n */\n\nimport { UnprocessedGradientColorStop, GradientColorStop } from '../../css/types/image';\nimport { processColorStops } from '../../css/types/functions/gradient';\nimport { asString } from '../../css/types/color-utilities';\nimport { at } from '../../core/util';\n\nexport interface StringColorStop {\n    stop: number;\n    color: string;\n}\n\nconst clampStop = (stop: number): number => Math.min(1, Math.max(0, stop));\n\n/**\n * Stack the one-cycle stop list periodically across [0, 1]. Returns null for\n * a degenerate period (all stops clamped to one point) — CSS renders the\n * last colour across the whole area in that case, and callers should paint\n * the last colour instead of stacking.\n */\nexport const stackRepeatingStops = (processed: GradientColorStop[]): StringColorStop[] | null => {\n    const first = at(processed, 0);\n    const last = at(processed, processed.length - 1);\n    if (last.stop - first.stop < 1e-6) {\n        return null;\n    }\n    const period = Math.max(last.stop - first.stop, 0.01);\n    const stops: StringColorStop[] = [];\n    const cycles = Math.ceil(1 / period);\n    for (let k = 0; k < cycles; k++) {\n        for (const s of processed) {\n            const stop = k * period + (s.stop - first.stop);\n            if (stop > 1) break;\n            stops.push({ stop, color: asString(s.color) });\n        }\n    }\n    // Continue with the last colour out to the ending shape (skip when a\n    // cycle stop already lands exactly on 1).\n    const lastPushed = stops[stops.length - 1];\n    if (!lastPushed || lastPushed.stop < 1) {\n        stops.push({ stop: 1, color: asString(last.color) });\n    }\n    return stops;\n};\n\n/** Map parsed stops to string-colour stops clamped into the canvas [0, 1] range. */\nexport const toCanvasStops = (processed: GradientColorStop[]): StringColorStop[] =>\n    processed.map((s) => ({ stop: clampStop(s.stop), color: asString(s.color) }));\n\nexport interface RasterizedRadialGradient {\n    /** 2rx × 2ry device-pixel canvas holding the gradient ellipse. */\n    canvas: HTMLCanvasElement;\n    /** Colour beyond the ending shape (the last stop's colour). */\n    lastColor: string;\n    rx: number;\n    ry: number;\n}\n\n/**\n * Rasterise a radial gradient's ending-shape ellipse to an offscreen canvas.\n *\n * The ellipse is a circle of radius rx scaled vertically by ry / rx around\n * the canvas centre, so the offscreen canvas is the ellipse's full 2rx × 2ry\n * bounding box and callers draw it at (centre - rx, centre - ry). Handles the\n * repeating variant by stacking stops across the [0, 1] gradient range.\n */\nexport const rasterizeRadialGradient = (\n    ownerDocument: Document,\n    rx: number,\n    ry: number,\n    stops: UnprocessedGradientColorStop[],\n    repeating = false\n): RasterizedRadialGradient | null => {\n    const processed = processColorStops(stops, rx);\n    const last = at(processed, processed.length - 1);\n    const lastColor = asString(last.color);\n\n    const canvas = ownerDocument.createElement('canvas');\n    canvas.width = Math.max(1, Math.ceil(rx * 2));\n    canvas.height = Math.max(1, Math.ceil(ry * 2));\n    const ctx = canvas.getContext('2d');\n    if (!ctx) {\n        return null;\n    }\n\n    let colorStops: StringColorStop[];\n    if (repeating) {\n        const stacked = stackRepeatingStops(processed);\n        if (!stacked) {\n            // Degenerate period: the last colour covers everything.\n            ctx.fillStyle = lastColor;\n            ctx.fillRect(0, 0, canvas.width, canvas.height);\n            return { canvas, lastColor, rx, ry };\n        }\n        colorStops = stacked;\n    } else {\n        colorStops = toCanvasStops(processed);\n    }\n\n    const gradient = ctx.createRadialGradient(rx, rx, 0, rx, rx, rx);\n    colorStops.forEach((s) => gradient.addColorStop(clampStop(s.stop), s.color));\n    ctx.fillStyle = gradient;\n    if (rx !== ry) {\n        ctx.scale(1, ry / rx);\n    }\n    // Fill the pre-scale circle square: after the y-scale it maps to the\n    // ellipse's full device box. A post-scale (2rx × 2ry) rect would cover\n    // only a 2ry²/rx-tall band and clip the ellipse whenever ry < rx.\n    ctx.fillRect(0, 0, rx * 2, rx * 2);\n    return { canvas, lastColor, rx, ry };\n};\n","import { getAbsoluteValue } from '../css/types/length-percentage';\nimport { Bounds } from '../css/layout/bounds';\nimport { ElementContainer } from '../dom/element-container';\n\nexport const paddingBox = (element: ElementContainer): Bounds => {\n    const bounds = element.bounds;\n    const styles = element.styles;\n    return bounds.add(\n        styles.borderLeftWidth,\n        styles.borderTopWidth,\n        -(styles.borderRightWidth + styles.borderLeftWidth),\n        -(styles.borderTopWidth + styles.borderBottomWidth)\n    );\n};\n\nexport const contentBox = (element: ElementContainer): Bounds => {\n    const styles = element.styles;\n    const bounds = element.bounds;\n\n    const paddingLeft = getAbsoluteValue(styles.paddingLeft, bounds.width);\n    const paddingRight = getAbsoluteValue(styles.paddingRight, bounds.width);\n    const paddingTop = getAbsoluteValue(styles.paddingTop, bounds.width);\n    const paddingBottom = getAbsoluteValue(styles.paddingBottom, bounds.width);\n\n    return bounds.add(\n        paddingLeft + styles.borderLeftWidth,\n        paddingTop + styles.borderTopWidth,\n        -(styles.borderRightWidth + styles.borderLeftWidth + paddingLeft + paddingRight),\n        -(styles.borderTopWidth + styles.borderBottomWidth + paddingTop + paddingBottom)\n    );\n};\n","import { Bounds } from '../css/layout/bounds';\nimport { at } from '../core/util';\nimport { BACKGROUND_ORIGIN } from '../css/property-descriptors/background-origin';\nimport { ElementContainer } from '../dom/element-container';\nimport { BACKGROUND_SIZE, BackgroundSizeInfo } from '../css/property-descriptors/background-size';\nimport { Vector } from './vector';\nimport { BACKGROUND_REPEAT } from '../css/property-descriptors/background-repeat';\nimport { getAbsoluteValue, getAbsoluteValueForTuple, isLengthPercentage } from '../css/types/length-percentage';\nimport { CSSValue, isIdentToken } from '../css/syntax/parser';\nimport { contentBox, paddingBox } from './box-sizing';\nimport { Path } from './path';\nimport { BACKGROUND_CLIP } from '../css/property-descriptors/background-clip';\n\nexport const calculateBackgroundPositioningArea = (\n    backgroundOrigin: BACKGROUND_ORIGIN,\n    element: ElementContainer\n): Bounds => {\n    if (backgroundOrigin === BACKGROUND_ORIGIN.BORDER_BOX) {\n        return element.bounds;\n    }\n\n    if (backgroundOrigin === BACKGROUND_ORIGIN.CONTENT_BOX) {\n        return contentBox(element);\n    }\n\n    return paddingBox(element);\n};\n\nexport const calculateBackgroundPaintingArea = (backgroundClip: BACKGROUND_CLIP, element: ElementContainer): Bounds => {\n    if (backgroundClip === BACKGROUND_CLIP.BORDER_BOX) {\n        return element.bounds;\n    }\n\n    if (backgroundClip === BACKGROUND_CLIP.CONTENT_BOX) {\n        return contentBox(element);\n    }\n\n    return paddingBox(element);\n};\n\nexport const calculateBackgroundRendering = (\n    container: ElementContainer,\n    index: number,\n    intrinsicSize: [number | null, number | null, number | null]\n): [Path[], number, number, number, number] => {\n    const backgroundPositioningArea = calculateBackgroundPositioningArea(\n        getBackgroundValueForIndex(container.styles.backgroundOrigin, index),\n        container\n    );\n\n    const backgroundPaintingArea = calculateBackgroundPaintingArea(\n        getBackgroundValueForIndex(container.styles.backgroundClip, index),\n        container\n    );\n\n    const backgroundImageSize = calculateBackgroundSize(\n        getBackgroundValueForIndex(container.styles.backgroundSize, index),\n        intrinsicSize,\n        backgroundPositioningArea\n    );\n\n    let [sizeWidth, sizeHeight] = backgroundImageSize;\n\n    const position = getAbsoluteValueForTuple(\n        getBackgroundValueForIndex(container.styles.backgroundPosition, index),\n        backgroundPositioningArea.width - sizeWidth,\n        backgroundPositioningArea.height - sizeHeight\n    );\n\n    const path = calculateBackgroundRepeatPath(\n        getBackgroundValueForIndex(container.styles.backgroundRepeat, index),\n        position,\n        backgroundImageSize,\n        backgroundPositioningArea,\n        backgroundPaintingArea\n    );\n\n    const offsetX = Math.round(backgroundPositioningArea.left + position[0]);\n    const offsetY = Math.round(backgroundPositioningArea.top + position[1]);\n\n    sizeWidth = Math.max(1, sizeWidth);\n    sizeHeight = Math.max(1, sizeHeight);\n\n    return [path, offsetX, offsetY, sizeWidth, sizeHeight];\n};\n\nexport const isAuto = (token: CSSValue): boolean => isIdentToken(token) && token.value === BACKGROUND_SIZE.AUTO;\n\nconst hasIntrinsicValue = (value: number | null): value is number => typeof value === 'number';\n\nexport const calculateBackgroundSize = (\n    size: BackgroundSizeInfo[],\n    [intrinsicWidth, intrinsicHeight, intrinsicProportion]: [number | null, number | null, number | null],\n    bounds: Bounds\n): [number, number] => {\n    const [first, second] = size;\n\n    if (!first) {\n        return [0, 0];\n    }\n\n    if (isLengthPercentage(first) && second && isLengthPercentage(second)) {\n        return [getAbsoluteValue(first, bounds.width), getAbsoluteValue(second, bounds.height)];\n    }\n\n    const hasIntrinsicProportion = hasIntrinsicValue(intrinsicProportion);\n\n    if (isIdentToken(first) && (first.value === BACKGROUND_SIZE.CONTAIN || first.value === BACKGROUND_SIZE.COVER)) {\n        if (hasIntrinsicValue(intrinsicProportion)) {\n            const targetRatio = bounds.width / bounds.height;\n\n            return targetRatio < intrinsicProportion !== (first.value === BACKGROUND_SIZE.COVER)\n                ? [bounds.width, bounds.width / intrinsicProportion]\n                : [bounds.height * intrinsicProportion, bounds.height];\n        }\n\n        return [bounds.width, bounds.height];\n    }\n\n    const hasIntrinsicWidth = hasIntrinsicValue(intrinsicWidth);\n    const hasIntrinsicHeight = hasIntrinsicValue(intrinsicHeight);\n    const hasIntrinsicDimensions = hasIntrinsicWidth || hasIntrinsicHeight;\n\n    // If the background-size is auto or auto auto:\n    if (isAuto(first) && (!second || isAuto(second))) {\n        // If the image has both horizontal and vertical intrinsic dimensions, it's rendered at that size.\n        if (hasIntrinsicWidth && hasIntrinsicHeight) {\n            return [intrinsicWidth as number, intrinsicHeight as number];\n        }\n\n        // If the image has no intrinsic dimensions and has no intrinsic proportions,\n        // it's rendered at the size of the background positioning area.\n\n        if (!hasIntrinsicProportion && !hasIntrinsicDimensions) {\n            return [bounds.width, bounds.height];\n        }\n\n        // NOTE (known gap): Per the CSS spec, images with intrinsic proportions\n        // but no intrinsic dimensions should be rendered as if 'contain' had been\n        // specified. This branch is not yet implemented — the image will render\n        // at the size of the background positioning area instead.\n\n        // If the image has only one intrinsic dimension and has intrinsic proportions, it's rendered at the size corresponding to that one dimension.\n        // The other dimension is computed using the specified dimension and the intrinsic proportions.\n        if (hasIntrinsicDimensions && hasIntrinsicProportion) {\n            const width = hasIntrinsicWidth\n                ? (intrinsicWidth as number)\n                : (intrinsicHeight as number) * (intrinsicProportion as number);\n            const height = hasIntrinsicHeight\n                ? (intrinsicHeight as number)\n                : (intrinsicWidth as number) / (intrinsicProportion as number);\n            return [width, height];\n        }\n\n        // If the image has only one intrinsic dimension but has no intrinsic proportions,\n        // it's rendered using the specified dimension and the other dimension of the background positioning area.\n        const width = hasIntrinsicWidth ? (intrinsicWidth as number) : bounds.width;\n        const height = hasIntrinsicHeight ? (intrinsicHeight as number) : bounds.height;\n        return [width, height];\n    }\n\n    // If the image has intrinsic proportions, it's stretched to the specified dimension.\n    // The unspecified dimension is computed using the specified dimension and the intrinsic proportions.\n    if (hasIntrinsicProportion) {\n        let width = 0;\n        let height = 0;\n        if (isLengthPercentage(first)) {\n            width = getAbsoluteValue(first, bounds.width);\n        } else if (second && isLengthPercentage(second)) {\n            height = getAbsoluteValue(second, bounds.height);\n        }\n\n        if (isAuto(first)) {\n            width = height * (intrinsicProportion as number);\n        } else if (!second || isAuto(second)) {\n            height = width / (intrinsicProportion as number);\n        }\n\n        return [width, height];\n    }\n\n    // If the image has no intrinsic proportions, it's stretched to the specified dimension.\n    // The unspecified dimension is computed using the image's corresponding intrinsic dimension,\n    // if there is one. If there is no such intrinsic dimension,\n    // it becomes the corresponding dimension of the background positioning area.\n\n    let width = null;\n    let height = null;\n\n    if (isLengthPercentage(first)) {\n        width = getAbsoluteValue(first, bounds.width);\n    } else if (second && isLengthPercentage(second)) {\n        height = getAbsoluteValue(second, bounds.height);\n    }\n\n    if (width !== null && (!second || isAuto(second))) {\n        height =\n            hasIntrinsicWidth && hasIntrinsicHeight\n                ? (width / (intrinsicWidth as number)) * (intrinsicHeight as number)\n                : bounds.height;\n    }\n\n    if (height !== null && isAuto(first)) {\n        width =\n            hasIntrinsicWidth && hasIntrinsicHeight\n                ? (height / (intrinsicHeight as number)) * (intrinsicWidth as number)\n                : bounds.width;\n    }\n\n    if (width !== null && height !== null) {\n        return [width, height];\n    }\n\n    throw new Error(`Unable to calculate background-size for element`);\n};\n\nexport const getBackgroundValueForIndex = <T>(values: T[], index: number): T => {\n    const value = values[index];\n    if (typeof value === 'undefined') {\n        return at(values, 0);\n    }\n\n    return value;\n};\n\nexport const calculateBackgroundRepeatPath = (\n    repeat: BACKGROUND_REPEAT,\n    [x, y]: [number, number],\n    [width, height]: [number, number],\n    backgroundPositioningArea: Bounds,\n    backgroundPaintingArea: Bounds\n): [Vector, Vector, Vector, Vector] => {\n    switch (repeat) {\n        case BACKGROUND_REPEAT.REPEAT_X:\n            return [\n                new Vector(Math.round(backgroundPositioningArea.left), Math.round(backgroundPositioningArea.top + y)),\n                new Vector(\n                    Math.round(backgroundPositioningArea.left + backgroundPositioningArea.width),\n                    Math.round(backgroundPositioningArea.top + y)\n                ),\n                new Vector(\n                    Math.round(backgroundPositioningArea.left + backgroundPositioningArea.width),\n                    Math.round(height + backgroundPositioningArea.top + y)\n                ),\n                new Vector(\n                    Math.round(backgroundPositioningArea.left),\n                    Math.round(height + backgroundPositioningArea.top + y)\n                )\n            ];\n        case BACKGROUND_REPEAT.REPEAT_Y:\n            return [\n                new Vector(Math.round(backgroundPositioningArea.left + x), Math.round(backgroundPositioningArea.top)),\n                new Vector(\n                    Math.round(backgroundPositioningArea.left + x + width),\n                    Math.round(backgroundPositioningArea.top)\n                ),\n                new Vector(\n                    Math.round(backgroundPositioningArea.left + x + width),\n                    Math.round(backgroundPositioningArea.height + backgroundPositioningArea.top)\n                ),\n                new Vector(\n                    Math.round(backgroundPositioningArea.left + x),\n                    Math.round(backgroundPositioningArea.height + backgroundPositioningArea.top)\n                )\n            ];\n        case BACKGROUND_REPEAT.NO_REPEAT:\n            return [\n                new Vector(\n                    Math.round(backgroundPositioningArea.left + x),\n                    Math.round(backgroundPositioningArea.top + y)\n                ),\n                new Vector(\n                    Math.round(backgroundPositioningArea.left + x + width),\n                    Math.round(backgroundPositioningArea.top + y)\n                ),\n                new Vector(\n                    Math.round(backgroundPositioningArea.left + x + width),\n                    Math.round(backgroundPositioningArea.top + y + height)\n                ),\n                new Vector(\n                    Math.round(backgroundPositioningArea.left + x),\n                    Math.round(backgroundPositioningArea.top + y + height)\n                )\n            ];\n        default:\n            return [\n                new Vector(Math.round(backgroundPaintingArea.left), Math.round(backgroundPaintingArea.top)),\n                new Vector(\n                    Math.round(backgroundPaintingArea.left + backgroundPaintingArea.width),\n                    Math.round(backgroundPaintingArea.top)\n                ),\n                new Vector(\n                    Math.round(backgroundPaintingArea.left + backgroundPaintingArea.width),\n                    Math.round(backgroundPaintingArea.height + backgroundPaintingArea.top)\n                ),\n                new Vector(\n                    Math.round(backgroundPaintingArea.left),\n                    Math.round(backgroundPaintingArea.height + backgroundPaintingArea.top)\n                )\n            ];\n    }\n};\n","import { throwIfAborted } from '../../core/abort-helper';\n\n// Only errors in the optional surface path are eligible for legacy fallback.\nexport class FilterSurfaceError extends Error {}\n\nexport const releaseSurface = (canvas: HTMLCanvasElement): void => {\n    canvas.width = canvas.height = 0;\n};\n\n/**\n * A parsed CSS filter chain. Functions keep their declaration order — CSS\n * applies them left to right, and the native canvas backend reproduces that\n * order exactly. Chains containing functions the backends cannot express\n * (url() references, unknown functions) fail parsing and stay on the legacy\n * renderer, where ctx.filter receives the full string natively.\n */\nexport type FilterFunction =\n    | { kind: 'blur'; value: number }\n    | { kind: 'drop-shadow'; x: number; y: number; blur: number; color: string }\n    | { kind: 'unitless'; name: UnitlessFilterName; value: number };\n\nexport type UnitlessFilterName =\n    'brightness' | 'contrast' | 'grayscale' | 'hue-rotate' | 'invert' | 'opacity' | 'saturate' | 'sepia';\n\nexport interface ParsedFilter {\n    functions: FilterFunction[];\n}\n\nconst UNITLESS_NAMES: readonly UnitlessFilterName[] = [\n    'brightness',\n    'contrast',\n    'grayscale',\n    'hue-rotate',\n    'invert',\n    'opacity',\n    'saturate',\n    'sepia'\n];\n\n// Distinct filter strings are few, but parsing runs for every node of a\n// canComposite() subtree walk, so identical values are memoised with a small\n// LRU bound. Returned objects are treated as read-only by all callers.\nconst PARSED_FILTER_CACHE_MAX = 256;\nconst parsedFilterCache = new Map<string, ParsedFilter | null>();\n\nconst EMPTY_FILTER: ParsedFilter = { functions: [] };\n\nexport function parseFilterChain(value: string | null): ParsedFilter | null {\n    if (!value || value === 'none') return EMPTY_FILTER;\n\n    const cached = parsedFilterCache.get(value);\n    if (cached !== undefined) {\n        parsedFilterCache.delete(value);\n        parsedFilterCache.set(value, cached);\n        return cached;\n    }\n\n    const parsed = computeFilterChain(value);\n    if (parsedFilterCache.size >= PARSED_FILTER_CACHE_MAX) {\n        const oldest = parsedFilterCache.keys().next().value;\n        if (oldest !== undefined) parsedFilterCache.delete(oldest);\n    }\n    parsedFilterCache.set(value, parsed);\n    return parsed;\n}\n\nconst computeFilterChain = (value: string): ParsedFilter | null => {\n    const functions: FilterFunction[] = [];\n    let index = 0;\n    while (index < value.length) {\n        const char = value[index];\n        if (char === ' ' || char === '\\n' || char === '\\t') {\n            index++;\n            continue;\n        }\n        const open = value.indexOf('(', index);\n        if (open === -1) return null; // stray content between functions\n        const name = value.slice(index, open).trim();\n        if (!/^[a-zA-Z-]+$/.test(name)) return null;\n        const bodyEnd = matchingParenthesis(value, open);\n        if (bodyEnd === -1) return null;\n        const fn = parseFilterFunction(name, value.slice(open + 1, bodyEnd).trim());\n        if (!fn) return null;\n        functions.push(fn);\n        index = bodyEnd + 1;\n    }\n    return { functions };\n};\n\n/** Index of the ')' matching the '(' at `open`, or -1. */\nconst matchingParenthesis = (value: string, open: number): number => {\n    let depth = 1;\n    for (let i = open + 1; i < value.length; i++) {\n        const char = value[i];\n        if (char === '(') depth++;\n        else if (char === ')') {\n            depth--;\n            if (depth === 0) return i;\n        }\n    }\n    return -1;\n};\n\nconst PX_LENGTH_RE = /^-?\\d+(?:\\.\\d+)?px$/;\n\nconst parseFilterFunction = (name: string, body: string): FilterFunction | null => {\n    if (name === 'blur') {\n        // Nonzero unitless lengths are invalid; unitless zero is allowed.\n        if (body === '0') return { kind: 'blur', value: 0 };\n        if (!PX_LENGTH_RE.test(body)) return null;\n        const value = Number.parseFloat(body);\n        return value < 0 ? null : { kind: 'blur', value };\n    }\n    if (name === 'drop-shadow') {\n        return parseDropShadowBody(body);\n    }\n    if ((UNITLESS_NAMES as readonly string[]).indexOf(name) !== -1) {\n        const unitless = name as UnitlessFilterName;\n        if (unitless === 'hue-rotate') {\n            const degrees = parseAngleDegrees(body);\n            return degrees === null ? null : { kind: 'unitless', name: unitless, value: degrees };\n        }\n        const trimmed = body.trim();\n        const percentage = trimmed.endsWith('%');\n        const numeric = percentage ? trimmed.slice(0, -1) : trimmed;\n        if (!/^-?\\d+(?:\\.\\d+)?$/.test(numeric)) return null;\n        const value = Number.parseFloat(numeric) * (percentage ? 1 / 100 : 1);\n        return { kind: 'unitless', name: unitless, value };\n    }\n    return null; // url() references and unknown functions stay on the legacy path\n};\n\n/** Split on whitespace outside parentheses so rgba(...) colours stay one token. */\nconst splitTopLevel = (body: string): string[] => {\n    const parts: string[] = [];\n    let depth = 0;\n    let current = '';\n    for (const char of body) {\n        if (char === '(') depth++;\n        else if (char === ')') depth--;\n        if (char === ' ' && depth === 0) {\n            if (current) parts.push(current);\n            current = '';\n            continue;\n        }\n        current += char;\n    }\n    if (current) parts.push(current);\n    return parts;\n};\n\nconst parseDropShadowBody = (body: string): FilterFunction | null => {\n    const parts = splitTopLevel(body);\n    const lengths = parts.filter((part) => PX_LENGTH_RE.test(part)).map((part) => Number.parseFloat(part));\n    if (lengths.length < 2 || lengths.length > 3) return null;\n    const colors = parts.filter((part) => !PX_LENGTH_RE.test(part));\n    if (parts.length - colors.length !== lengths.length) return null;\n    return {\n        kind: 'drop-shadow',\n        x: lengths[0] as number,\n        y: lengths[1] as number,\n        blur: (lengths[2] as number) ?? 0,\n        color: colors.join(' ') || 'rgba(0, 0, 0, 0)'\n    };\n};\n\nconst parseAngleDegrees = (body: string): number | null => {\n    const trimmed = body.trim();\n    if (trimmed === '0') return 0;\n    const numeric = Number.parseFloat(trimmed);\n    if (Number.isNaN(numeric)) return null;\n    if (trimmed.endsWith('deg')) return numeric;\n    if (trimmed.endsWith('grad')) return numeric * 0.9;\n    if (trimmed.endsWith('rad')) return (numeric * 180) / Math.PI;\n    if (trimmed.endsWith('turn')) return numeric * 360;\n    return null;\n};\n\n/**\n * Render the chain as a canvas ctx.filter string, scaling all device-space\n * lengths (blur radii, shadow offsets) by the capture scale. Unitless\n * functions and hue angles are scale-invariant.\n */\nexport const nativeFilterString = (filter: ParsedFilter, scale: number): string =>\n    filter.functions\n        .map((fn) => {\n            switch (fn.kind) {\n                case 'blur':\n                    return `blur(${fn.value * scale}px)`;\n                case 'drop-shadow':\n                    return `drop-shadow(${fn.x * scale}px ${fn.y * scale}px ${fn.blur * scale}px ${fn.color})`;\n                case 'unitless':\n                    return fn.name === 'hue-rotate' ? `hue-rotate(${fn.value}deg)` : `${fn.name}(${fn.value})`;\n            }\n        })\n        .join(' ');\n\n/**\n * Outset (in CSS pixels) a surface must grow so blur/shadow spillover is not\n * cropped. Unitless functions never spread beyond the bounds. Consecutive\n * blurs compound, so their radii sum.\n */\nexport function filterOutset(filter: ParsedFilter): number {\n    let blurSum = 0;\n    let maxShadowOffset = 0;\n    for (const fn of filter.functions) {\n        if (fn.kind === 'blur') blurSum += fn.value;\n        else if (fn.kind === 'drop-shadow') {\n            blurSum += fn.blur;\n            maxShadowOffset = Math.max(maxShadowOffset, Math.abs(fn.x), Math.abs(fn.y));\n        }\n    }\n    return Math.ceil(3 * blurSum + maxShadowOffset);\n}\n\nfunction canvasLike(source: HTMLCanvasElement): HTMLCanvasElement {\n    const canvas = (source.ownerDocument ?? document).createElement('canvas');\n    canvas.width = source.width;\n    canvas.height = source.height;\n    return canvas;\n}\n\nconst decodeSurface = (image: HTMLImageElement, signal?: AbortSignal): Promise<void> =>\n    new Promise((resolve, reject) => {\n        const finish = (error?: Error) => {\n            clearTimeout(timer);\n            signal?.removeEventListener('abort', abort);\n            if (error) reject(error);\n            else resolve();\n        };\n        const abort = () => finish(new DOMException('The operation was aborted.', 'AbortError'));\n        const timer = setTimeout(() => finish(new FilterSurfaceError('Filter surface image decode timed out')), 10000);\n        signal?.addEventListener('abort', abort, { once: true });\n        if (signal?.aborted) abort();\n        else\n            image.decode().then(\n                () => finish(),\n                () => finish(new FilterSurfaceError('Filter surface image decode failed'))\n            );\n    });\n\n// Cache only a capability result, never raster storage. Separate Documents may use\n// different Canvas implementations (including embedded webviews and test realms).\nconst canvasFilterSupport = new WeakMap<Document, boolean>();\n\nexport function supportsNativeFilters(owner: Document = document): boolean {\n    const cached = canvasFilterSupport.get(owner);\n    if (cached !== undefined) return cached;\n    const source = owner.createElement('canvas');\n    const target = owner.createElement('canvas');\n    let supported = false;\n    try {\n        source.width = source.height = target.width = target.height = 32;\n        const input = source.getContext('2d');\n        const context = target.getContext('2d');\n        // Check before assignment: on older WebKit assigning filter creates an\n        // expando property, not a working implementation.\n        if (input && context && 'filter' in context) {\n            input.fillStyle = '#fff';\n            input.fillRect(8, 8, 8, 8);\n            context.filter = 'blur(2px)';\n            context.drawImage(source, 0, 0);\n            const blurred = (context.getImageData(6, 12, 1, 1).data[3] ?? 0) > 0;\n            context.clearRect(0, 0, 32, 32);\n            context.filter = 'drop-shadow(12px 0px 0px rgba(255, 0, 0, 0.5))';\n            context.drawImage(source, 0, 0);\n            const shadow = context.getImageData(24, 12, 1, 1).data;\n            supported =\n                blurred &&\n                (shadow[0] ?? 0) > 240 &&\n                (shadow[1] ?? 0) < 10 &&\n                (shadow[3] ?? 0) >= 126 &&\n                (shadow[3] ?? 0) <= 129;\n        }\n    } catch {\n        // Readback can itself be unavailable. Be conservative and retain SVG.\n    } finally {\n        releaseSurface(source);\n        releaseSurface(target);\n    }\n    canvasFilterSupport.set(owner, supported);\n    return supported;\n}\n\nfunction tryNativeFilterSurface(\n    source: HTMLCanvasElement,\n    filter: ParsedFilter,\n    opacity: number,\n    scale: number,\n    signal?: AbortSignal\n): HTMLCanvasElement | null {\n    let filtered: HTMLCanvasElement | undefined;\n    let output: HTMLCanvasElement | undefined;\n    let complete = false;\n    try {\n        throwIfAborted(signal);\n        filtered = canvasLike(source);\n        const context = filtered.getContext('2d');\n        if (!context || !('filter' in context)) return null;\n        context.filter = nativeFilterString(filter, scale);\n        if (context.filter === 'none' || context.filter === '') return null;\n        // Canvas applies globalAlpha before filtering. Filter the complete layer\n        // at alpha 1, then composite opacity separately, including its shadow.\n        context.drawImage(source, 0, 0);\n        throwIfAborted(signal);\n        output = canvasLike(source);\n        const composite = output.getContext('2d');\n        if (!composite) return null;\n        composite.globalAlpha = opacity;\n        composite.drawImage(filtered, 0, 0);\n        throwIfAborted(signal);\n        complete = true;\n        return output;\n    } catch {\n        // A native allocation/draw failure may still succeed through SVG, but\n        // cancellation must never silently degrade to a successful fallback.\n        throwIfAborted(signal);\n        return null;\n    } finally {\n        if (filtered) releaseSurface(filtered);\n        if (output && !complete) releaseSurface(output);\n    }\n}\n\n/**\n * The SVG fallback predates the ordered-chain parser and only expresses the\n * blur + single drop-shadow subset (at most one of each, blur before the\n * shadow). Chains outside that subset reject with FilterSurfaceError so the\n * caller keeps its legacy renderer instead of rendering a wrong filter.\n */\nconst isSvgExpressible = (filter: ParsedFilter): boolean => {\n    let blurs = 0;\n    let shadows = 0;\n    for (const fn of filter.functions) {\n        if (fn.kind === 'blur') blurs++;\n        else if (fn.kind === 'drop-shadow') shadows++;\n        else return false;\n    }\n    if (blurs > 1 || shadows > 1) return false;\n    if (blurs > 0 && shadows > 0) {\n        const blurIndex = filter.functions.findIndex((fn) => fn.kind === 'blur');\n        const shadowIndex = filter.functions.findIndex((fn) => fn.kind === 'drop-shadow');\n        return blurIndex < shadowIndex;\n    }\n    return true;\n};\n\n// Backend selection is internal; the public html2canvas options are unchanged.\nexport async function renderFilterSurface(\n    source: HTMLCanvasElement,\n    filter: ParsedFilter,\n    opacity: number,\n    scale: number,\n    signal?: AbortSignal\n): Promise<HTMLCanvasElement> {\n    throwIfAborted(signal);\n    if (filter.functions.length > 0 && supportsNativeFilters(source.ownerDocument ?? document)) {\n        const output = tryNativeFilterSurface(source, filter, opacity, scale, signal);\n        if (output) return output;\n    }\n    if (!isSvgExpressible(filter)) {\n        // Native filters are unavailable (older WebKit) and the SVG fallback\n        // cannot express this chain — reject so the caller keeps the legacy\n        // renderer instead of rendering a wrong filter.\n        throw new FilterSurfaceError('Filter chain requires native canvas filters');\n    }\n    return renderSvgFilterSurface(source, filter, opacity, scale, signal);\n}\n\n// Explicit SVG entry is internal and allows independent fallback benchmarks/tests.\n// No foreignObject or external image is used.\nasync function renderSvgFilterSurface(\n    source: HTMLCanvasElement,\n    filter: ParsedFilter,\n    opacity: number,\n    scale: number,\n    signal?: AbortSignal\n): Promise<HTMLCanvasElement> {\n    throwIfAborted(signal);\n    const blur = filter.functions.find((fn) => fn.kind === 'blur');\n    const shadow = filter.functions.find((fn) => fn.kind === 'drop-shadow');\n    const blurValue = blur && blur.kind === 'blur' ? blur.value : 0;\n    const shadowValue =\n        shadow && shadow.kind === 'drop-shadow'\n            ? { x: shadow.x, y: shadow.y, blur: shadow.blur, color: shadow.color }\n            : undefined;\n    if (!blurValue && !shadowValue) {\n        const output = canvasLike(source);\n        const context = output.getContext('2d');\n        if (!context) {\n            releaseSurface(output);\n            throw new FilterSurfaceError('Filter surface canvas is unavailable');\n        }\n        context.globalAlpha = opacity;\n        try {\n            context.drawImage(source, 0, 0);\n            return output;\n        } catch {\n            releaseSurface(output);\n            throw new FilterSurfaceError('Filter surface image cannot be drawn');\n        }\n    }\n    const namespace = 'http://www.w3.org/2000/svg';\n    const svgDocument = source.ownerDocument ?? document;\n    const element = (tag: string, attributes: Record<string, string | number> = {}) => {\n        const node = svgDocument.createElementNS(namespace, tag);\n        Object.entries(attributes).forEach(([key, value]) => node.setAttribute(key, String(value)));\n        return node;\n    };\n    const svg = element('svg', {\n        width: source.width,\n        height: source.height,\n        viewBox: `0 0 ${source.width} ${source.height}`\n    });\n    const defs = element('defs');\n    const filterElement = element('filter', {\n        id: 'composited-filter',\n        filterUnits: 'userSpaceOnUse',\n        x: 0,\n        y: 0,\n        width: source.width,\n        height: source.height,\n        'color-interpolation-filters': 'sRGB'\n    });\n    if (blurValue) {\n        filterElement.appendChild(\n            element('feGaussianBlur', { stdDeviation: blurValue * scale, result: 'blurred-source' })\n        );\n    }\n    if (shadowValue) {\n        // Explicit primitives avoid the narrower feDropShadow blur observed in WebKit.\n        filterElement.appendChild(\n            element('feGaussianBlur', {\n                in: blurValue ? 'blurred-source' : 'SourceAlpha',\n                stdDeviation: shadowValue.blur * scale\n            })\n        );\n        filterElement.appendChild(\n            element('feOffset', { dx: shadowValue.x * scale, dy: shadowValue.y * scale, result: 'offset-shadow' })\n        );\n        filterElement.appendChild(element('feFlood', { 'flood-color': shadowValue.color }));\n        filterElement.appendChild(element('feComposite', { in2: 'offset-shadow', operator: 'in' }));\n        const merge = element('feMerge');\n        merge.appendChild(element('feMergeNode'));\n        merge.appendChild(element('feMergeNode', { in: blurValue ? 'blurred-source' : 'SourceGraphic' }));\n        filterElement.appendChild(merge);\n    }\n    defs.appendChild(filterElement);\n    svg.appendChild(defs);\n    let sourceUrl: string;\n    try {\n        sourceUrl = source.toDataURL('image/png');\n        if (sourceUrl === 'data:,') throw new Error('Canvas size is unsupported');\n    } catch {\n        // allowTaint may intentionally produce an unreadable canvas. Keep that\n        // API behavior by letting the caller render the subtree on the old path.\n        throw new FilterSurfaceError('Filter surface pixels cannot be serialized');\n    }\n    svg.appendChild(\n        element('image', {\n            width: source.width,\n            height: source.height,\n            href: sourceUrl,\n            filter: 'url(#composited-filter)'\n        })\n    );\n    const imageWindow = svgDocument.defaultView as (Window & { Image?: typeof Image }) | null;\n    const image = imageWindow?.Image ? new imageWindow.Image() : new Image();\n    let output: HTMLCanvasElement | undefined;\n    try {\n        image.src = `data:image/svg+xml,${encodeURIComponent(new XMLSerializer().serializeToString(svg))}`;\n        await decodeSurface(image, signal);\n        throwIfAborted(signal);\n        output = canvasLike(source);\n        const context = output.getContext('2d');\n        if (!context) throw new FilterSurfaceError('Filter surface canvas is unavailable');\n        context.globalAlpha = opacity;\n        context.drawImage(image, 0, 0);\n        return output;\n    } catch (error) {\n        if (output) releaseSurface(output);\n        if (signal?.aborted) throwIfAborted(signal);\n        throw error instanceof FilterSurfaceError\n            ? error\n            : new FilterSurfaceError('Filter surface image cannot be drawn');\n    } finally {\n        image.removeAttribute('src');\n    }\n}\n","import { Bounds } from '../../css/layout/bounds';\nimport { ElementContainer } from '../../dom/element-container';\nimport { getAbsoluteValue } from '../../css/types/length-percentage';\nimport { filterOutset, parseFilterChain } from './filter-surface';\n\n// Budget backing stores across all active nested surfaces in one capture.\n// Reserve source, filtered output and decoded SVG/PNG rasters conservatively.\n// Browser encoder/decoder overhead and the caller's output canvas are separate.\nexport const MAX_SURFACE_PIXELS = 16 * 1024 * 1024;\nexport const MAX_SURFACE_SIDE = 8192;\nexport interface SurfaceBudget {\n    pixels: number;\n}\n\nexport function reserveSurface(budget: SurfaceBudget, width: number, height: number): number {\n    const pixels = width * height * 4;\n    if (\n        !Number.isFinite(pixels) ||\n        width <= 0 ||\n        height <= 0 ||\n        width > MAX_SURFACE_SIDE ||\n        height > MAX_SURFACE_SIDE ||\n        budget.pixels + pixels > MAX_SURFACE_PIXELS\n    )\n        return 0;\n    budget.pixels += pixels;\n    return pixels;\n}\n\nconst expand = (b: Bounds, margin: number): Bounds => b.add(-margin, -margin, margin * 2, margin * 2);\nconst union = (a: Bounds, b: Bounds): Bounds =>\n    new Bounds(\n        Math.min(a.left, b.left),\n        Math.min(a.top, b.top),\n        Math.max(a.left + a.width, b.left + b.width) - Math.min(a.left, b.left),\n        Math.max(a.top + a.height, b.top + b.height) - Math.min(a.top, b.top)\n    );\n\n// Conservative paint bounds for the untransformed subtree supported by this path.\n// Include overflow descendants, text ink padding, box/text shadows and nested filters.\nexport function surfaceBounds(container: ElementContainer): Bounds {\n    const styles = container.styles;\n    let bounds = container.bounds;\n    for (const shadow of styles.boxShadow) {\n        if (!shadow.inset) {\n            const spread = Math.max(0, shadow.spread.number) + 3 * shadow.blur.number;\n            bounds = union(\n                bounds,\n                expand(container.bounds.add(shadow.offsetX.number, shadow.offsetY.number, 0, 0), spread)\n            );\n        }\n    }\n    for (const text of container.textNodes) {\n        for (const part of text.textBounds) {\n            const ink = expand(\n                part.bounds,\n                2 * getAbsoluteValue(styles.fontSize, container.bounds.height) + styles.webkitTextStrokeWidth\n            );\n            bounds = union(bounds, ink);\n            for (const shadow of styles.textShadow) {\n                bounds = union(\n                    bounds,\n                    expand(ink.add(shadow.offsetX.number, shadow.offsetY.number, 0, 0), 3 * shadow.blur.number)\n                );\n            }\n        }\n    }\n    for (const child of container.elements) {\n        if (child.styles.isVisible()) bounds = union(bounds, surfaceBounds(child));\n    }\n    const filter = parseFilterChain(styles.filter);\n    return expand(bounds, filter ? filterOutset(filter) : 0);\n}\n\nexport function cropSurface(bounds: Bounds, viewport: Bounds, margin: number, scale: number): Bounds {\n    // Pixels just outside the destination still contribute through blur/shadow.\n    const area = expand(viewport, margin);\n    const left = Math.floor(Math.max(bounds.left, area.left) * scale) / scale;\n    const top = Math.floor(Math.max(bounds.top, area.top) * scale) / scale;\n    const right = Math.ceil(Math.min(bounds.left + bounds.width, area.left + area.width) * scale) / scale;\n    const bottom = Math.ceil(Math.min(bounds.top + bounds.height, area.top + area.height) * scale) / scale;\n    return new Bounds(left, top, Math.max(0, right - left), Math.max(0, bottom - top));\n}\n","/**\n * Text Decoration Renderer\n *\n * Handles rendering of text-decoration lines:\n * - underline, overline, line-through\n * - solid, double, dotted, dashed, wavy styles\n * Extracted from TextRenderer to reduce file size.\n */\nimport { Bounds } from '../../../css/layout/bounds';\nimport { CSSParsedDeclaration } from '../../../css';\nimport { TEXT_DECORATION_LINE } from '../../../css/property-descriptors/text-decoration-line';\nimport { TEXT_DECORATION_STYLE } from '../../../css/property-descriptors/text-decoration-style';\nimport { asString } from '../../../css/types/color-utilities';\n\nexport class TextDecorationRenderer {\n    constructor(private readonly ctx: CanvasRenderingContext2D) {}\n\n    render(bounds: Bounds, styles: CSSParsedDeclaration): void {\n        // Definedness fallback, not `||`: Color is a number and transparent\n        // is 0x00000000, which `||` would treat as missing and paint the\n        // decoration in the text colour instead of leaving it invisible.\n        this.ctx.fillStyle = asString(styles.textDecorationColor ?? styles.color);\n\n        let thickness = 1;\n        if (typeof styles.textDecorationThickness === 'number') {\n            thickness = styles.textDecorationThickness;\n        } else if (styles.textDecorationThickness === 'from-font') {\n            thickness = Math.max(1, Math.floor(styles.fontSize.number * 0.05));\n        }\n\n        let underlineOffset = 0;\n        if (typeof styles.textUnderlineOffset === 'number') {\n            underlineOffset = styles.textUnderlineOffset;\n        }\n\n        const decorationStyle = styles.textDecorationStyle;\n\n        styles.textDecorationLine.forEach((line) => {\n            let y = 0;\n            switch (line) {\n                case TEXT_DECORATION_LINE.UNDERLINE:\n                    y = bounds.top + bounds.height - thickness + underlineOffset;\n                    break;\n                case TEXT_DECORATION_LINE.OVERLINE:\n                    y = bounds.top;\n                    break;\n                case TEXT_DECORATION_LINE.LINE_THROUGH:\n                    y = bounds.top + (bounds.height / 2 - thickness / 2);\n                    break;\n                default:\n                    return;\n            }\n            this.draw(bounds.left, y, bounds.width, thickness, decorationStyle);\n        });\n    }\n\n    private draw(x: number, y: number, width: number, thickness: number, style: number): void {\n        switch (style) {\n            case TEXT_DECORATION_STYLE.SOLID:\n                this.ctx.fillRect(x, y, width, thickness);\n                break;\n            case TEXT_DECORATION_STYLE.DOUBLE: {\n                const gap = Math.max(1, thickness);\n                this.ctx.fillRect(x, y, width, thickness);\n                this.ctx.fillRect(x, y + thickness + gap, width, thickness);\n                break;\n            }\n            case TEXT_DECORATION_STYLE.DOTTED:\n                this.drawPattern(x, y, width, thickness, [thickness, thickness * 2]);\n                break;\n            case TEXT_DECORATION_STYLE.DASHED:\n                this.drawPattern(x, y, width, thickness, [thickness * 3, thickness * 2]);\n                break;\n            case TEXT_DECORATION_STYLE.WAVY:\n                this.drawWavy(x, y, width, thickness);\n                break;\n            default:\n                this.ctx.fillRect(x, y, width, thickness);\n        }\n    }\n\n    private drawPattern(x: number, y: number, width: number, thickness: number, dash: number[]): void {\n        this.ctx.save();\n        this.ctx.beginPath();\n        this.ctx.setLineDash(dash);\n        this.ctx.lineWidth = thickness;\n        this.ctx.strokeStyle = this.ctx.fillStyle;\n        this.ctx.moveTo(x, y + thickness / 2);\n        this.ctx.lineTo(x + width, y + thickness / 2);\n        this.ctx.stroke();\n        this.ctx.restore();\n    }\n\n    private drawWavy(x: number, y: number, width: number, thickness: number): void {\n        this.ctx.save();\n        this.ctx.beginPath();\n        this.ctx.lineWidth = thickness;\n        this.ctx.strokeStyle = this.ctx.fillStyle;\n\n        const amplitude = thickness * 2;\n        const wavelength = thickness * 4;\n        let currentX = x;\n        this.ctx.moveTo(currentX, y + thickness / 2);\n\n        while (currentX < x + width) {\n            const nextX = Math.min(currentX + wavelength / 2, x + width);\n            this.ctx.quadraticCurveTo(\n                currentX + wavelength / 4,\n                y + thickness / 2 - amplitude,\n                nextX,\n                y + thickness / 2\n            );\n            currentX = nextX;\n            if (currentX < x + width) {\n                const nextX2 = Math.min(currentX + wavelength / 2, x + width);\n                this.ctx.quadraticCurveTo(\n                    currentX + wavelength / 4,\n                    y + thickness / 2 + amplitude,\n                    nextX2,\n                    y + thickness / 2\n                );\n                currentX = nextX2;\n            }\n        }\n\n        this.ctx.stroke();\n        this.ctx.restore();\n    }\n}\n","/**\n * Font measurement utility\n *\n * Provides Canvas API-based font measurement that works correctly with webfonts\n * (which may not be loaded in the original document) and system fonts.\n *\n * Fallback chain:\n *   1. fontBoundingBoxAscent — font-level metric (Chrome 99+, FF 116+, Safari 17.4+)\n *   2. actualBoundingBoxAscent — glyph-level metric (widely supported)\n *   3. fallback value — coarse CSS fallback\n */\n\nconst SAMPLE_TEXT = 'Mg'; // characters with both ascender and descender\n\nexport interface CanvasFontMetrics {\n    baseline: number;\n    height: number;\n}\n\nconst isValidMetric = (value: number | undefined): value is number => value !== undefined && !Number.isNaN(value);\n\n/**\n * Measure the baseline ascent and full font box for the currently set font.\n */\nexport const measureFontMetrics = (ctx: CanvasRenderingContext2D, fallback: number): CanvasFontMetrics => {\n    const tm = ctx.measureText(SAMPLE_TEXT);\n    const fontMetrics = tm as TextMetrics & {\n        fontBoundingBoxAscent?: number;\n        fontBoundingBoxDescent?: number;\n    };\n    const baseline = isValidMetric(fontMetrics.fontBoundingBoxAscent)\n        ? fontMetrics.fontBoundingBoxAscent\n        : isValidMetric(tm.actualBoundingBoxAscent)\n          ? tm.actualBoundingBoxAscent\n          : fallback;\n    const height =\n        isValidMetric(fontMetrics.fontBoundingBoxAscent) && isValidMetric(fontMetrics.fontBoundingBoxDescent)\n            ? fontMetrics.fontBoundingBoxAscent + fontMetrics.fontBoundingBoxDescent\n            : isValidMetric(tm.actualBoundingBoxAscent) && isValidMetric(tm.actualBoundingBoxDescent)\n              ? tm.actualBoundingBoxAscent + tm.actualBoundingBoxDescent\n              : fallback;\n\n    return { baseline, height };\n};\n\n/**\n * Measure the baseline ascent for the currently set font.\n *\n * @param ctx - Canvas 2D rendering context with ctx.font already set\n * @param fallback - Fallback value when no metrics are available (e.g. fontSize.number)\n * @returns The distance from the text baseline to the top of the bounding box\n */\nexport const measureBaseline = (ctx: CanvasRenderingContext2D, fallback: number): number => {\n    return measureFontMetrics(ctx, fallback).baseline;\n};\n","/**\n * Text Renderer\n *\n * Handles rendering of text content including:\n * - Text with letter spacing\n * - Text decorations (underline, overline, line-through)\n * - Text shadows\n * - Webkit line clamp\n * - Text overflow ellipsis\n * - Paint order (fill/stroke)\n * - Font styles\n */\n\nimport { TextContainer } from '../../dom/text-container';\nimport { at } from '../../core/util';\nimport { CSSParsedDeclaration } from '../../css';\nimport { Bounds } from '../../css/layout/bounds';\nimport { TextBounds, segmentGraphemes } from '../../css/layout/text';\nimport { asString } from '../../css/types/color-utilities';\nimport { PAINT_ORDER_LAYER } from '../../css/property-descriptors/paint-order';\nimport { DIRECTION } from '../../css/property-descriptors/direction';\nimport { DISPLAY } from '../../css/property-descriptors/display';\nimport { TEXT_OVERFLOW } from '../../css/property-descriptors/text-overflow';\nimport { OVERFLOW } from '../../css/property-descriptors/overflow';\nimport { isDimensionToken } from '../../css/syntax/parser';\nimport { TextShadow } from '../../css/property-descriptors/text-shadow';\nimport {\n    isSidewaysWritingMode,\n    isVerticalWritingMode,\n    WRITING_MODE\n} from '../../css/property-descriptors/writing-mode';\nimport { TextDecorationRenderer } from './text/text-decoration-renderer';\nimport { measureBaseline } from './font-utils';\nimport { computeLineHeight } from '../../css/property-descriptors/line-height';\n\n/**\n * Dependencies required for TextRenderer\n */\nexport interface TextRendererDependencies {\n    ctx: CanvasRenderingContext2D;\n    options: {\n        scale: number;\n    };\n}\n\n// Tolerance (px) for text-overflow: ellipsis detection. Canvas measureText can\n// report a width a fraction of a pixel wider than the browser's layout box, so\n// text that fits exactly must not be truncated (issue #226).\nconst TEXT_OVERFLOW_EPSILON = 1;\n\n/**\n * Detect CJK (Chinese, Japanese, Korean) characters in a string.\n * Vertical writing modes use it to keep CJK glyphs upright and on the\n * ideographic baseline while other scripts are rotated.\n *\n * Covers:\n *   U+2E80–U+2FFF  CJK Radicals Supplement, Kangxi Radicals\n *   U+3000–U+30FF  CJK Symbols & Punctuation (。、「」…), Hiragana, Katakana\n *   U+3400–U+4DBF  CJK Extension A\n *   U+4E00–U+9FFF  CJK Unified Ideographs (most common Chinese/Japanese/Korean)\n *   U+AC00–U+D7AF  Hangul Syllables\n *   U+F900–U+FAFF  CJK Compatibility Ideographs\n *   U+FF01–U+FFEF  Halfwidth and Fullwidth Forms (Ａ Ｂ １ ２ ！ ？ etc.)\n */\nconst CJK_CHAR_REGEX = /[\\u2E80-\\u2FFF\\u3000-\\u30FF\\u3400-\\u4DBF\\u4E00-\\u9FFF\\uAC00-\\uD7AF\\uF900-\\uFAFF\\uFF01-\\uFFEF]/;\n\nexport const hasCJKCharacters = (text: string): boolean => CJK_CHAR_REGEX.test(text);\n\n/**\n * Chromium-based engines render stroked text with visibly sharper joins when\n * `miter` is requested, closely matching their own -webkit-text-stroke\n * output; other engines need `round` joins to avoid glyph spikes. No CSS or\n * platform API expresses this behavioural difference, so engine detection is\n * the only reliable signal: `navigator.userAgentData` is Chromium-only, with\n * the legacy `window.chrome` marker as a fallback for older webviews.\n */\nconst isChromiumEngine = (): boolean => {\n    if (typeof navigator === 'undefined') {\n        return false;\n    }\n    const nav = navigator as Navigator & { userAgentData?: unknown };\n    if (nav.userAgentData !== undefined) {\n        return true;\n    }\n    const currentWindow = typeof window !== 'undefined' ? (window as Window & { chrome?: unknown }) : undefined;\n    return currentWindow?.chrome !== undefined;\n};\n\nexport const getTextStrokeLineJoin = (): CanvasLineJoin => (isChromiumEngine() ? 'miter' : 'round');\n\n/**\n * Text Renderer\n *\n * Specialized renderer for text content.\n * Extracted from CanvasRenderer to improve code organization and maintainability.\n */\nexport class TextRenderer {\n    private readonly ctx: CanvasRenderingContext2D;\n    private readonly options: { scale: number };\n    private readonly decorationRenderer: TextDecorationRenderer;\n    /**\n     * Baseline ascent per font string. Consecutive text nodes overwhelmingly\n     * share a font, and each measureBaseline call issues a canvas measureText,\n     * so repeated fonts are memoised (bounded; cleared if the working set\n     * exceeds the cap).\n     */\n    private readonly baselineCache: Map<string, number> = new Map();\n    /**\n     * Per-render glyph width cache. Keyed by glyph + font string,\n     * avoids redundant `measureText` calls when letter-spacing is non-zero.\n     * Cleared at the start of each renderTextNode call.\n     */\n    private glyphWidthCache: Map<string, number> | null = null;\n\n    constructor(deps: TextRendererDependencies) {\n        this.ctx = deps.ctx;\n        this.options = deps.options;\n        this.decorationRenderer = new TextDecorationRenderer(deps.ctx);\n    }\n\n    /**\n     * Returns the cached width for a glyph+font pair, measuring via\n     * measureText if not yet cached. Only used when letterSpacing !== 0\n     * (the `canRenderWholeText` fast path handles the zero-spacing case).\n     */\n    private cachedMeasureText(glyph: string, fontString: string): number {\n        let cache = this.glyphWidthCache;\n        if (!cache) {\n            cache = new Map();\n            this.glyphWidthCache = cache;\n        }\n        const key = glyph + fontString;\n        let w = cache.get(key);\n        if (w === undefined) {\n            w = this.ctx.measureText(glyph).width;\n            cache.set(key, w);\n        }\n        return w;\n    }\n\n    /**\n     * Iterate grapheme clusters one-by-one, applying correct letter-spacing.\n     *\n     * Issue #73: When letter-spacing is non-zero, text must be rendered character by\n     * character, adding `letterSpacing` to each character's advance width.\n     *\n     * In horizontal text every glyph keeps the alphabetic baseline, CJK included:\n     * inline layout aligns a whole line on its alphabetic baseline regardless of\n     * script, and `baseline` was measured for that. Drawing CJK graphemes at the\n     * same y with `textBaseline = 'ideographic'` lifts them above the Latin text\n     * next to them, and away from where the `letterSpacing === 0` whole-string\n     * path draws them.\n     *\n     * The `renderFn` callback receives (letter, x, y) and performs the actual draw\n     * call (fillText or strokeText), allowing fill and stroke paths to share one\n     * implementation.\n     */\n    private iterateLettersWithLetterSpacing(\n        text: TextBounds,\n        letterSpacing: number,\n        baseline: number,\n        writingMode: WRITING_MODE,\n        renderFn: (letter: string, x: number, y: number) => void\n    ): void {\n        if (isVerticalWritingMode(writingMode)) {\n            this.iterateVerticalGlyphs(text, letterSpacing, baseline, writingMode, renderFn);\n            return;\n        }\n\n        const letters = segmentGraphemes(text.text);\n        const y = text.bounds.top + baseline;\n        const fontString = this.ctx.font;\n        let left = text.bounds.left;\n        for (const letter of letters) {\n            renderFn(letter, left, y);\n            left += this.cachedMeasureText(letter, fontString) + letterSpacing;\n        }\n    }\n\n    private iterateVerticalGlyphs(\n        text: TextBounds,\n        letterSpacing: number,\n        baseline: number,\n        writingMode: WRITING_MODE,\n        renderFn: (letter: string, x: number, y: number) => void\n    ): void {\n        const letters = segmentGraphemes(text.text);\n        const fontString = this.ctx.font;\n        const rotationAngle = writingMode === WRITING_MODE.SIDEWAYS_LR ? -Math.PI / 2 : Math.PI / 2;\n        let top = text.bounds.top;\n\n        for (let i = 0; i < letters.length;) {\n            const letter = letters[i] as string;\n            const isSideways =\n                isSidewaysWritingMode(writingMode) || (!hasCJKCharacters(letter) && letter.trim().length > 0);\n\n            if (!isSideways) {\n                // CJK glyph in vertical writing mode — render upright\n                const savedBaseline = this.ctx.textBaseline;\n                if (hasCJKCharacters(letter)) {\n                    this.ctx.textBaseline = 'ideographic';\n                }\n                renderFn(letter, text.bounds.left, top + baseline);\n                this.ctx.textBaseline = savedBaseline;\n                top += this.cachedMeasureText(letter, fontString) + letterSpacing;\n                i++;\n                continue;\n            }\n\n            // ── Batch consecutive sideways glyphs into one save/restore ──\n            const runStart = i;\n            while (i < letters.length) {\n                const ch = letters[i] as string;\n                if (!isSidewaysWritingMode(writingMode) && !hasCJKCharacters(ch) && ch.trim().length === 0) break;\n                if (isSidewaysWritingMode(writingMode) || (!hasCJKCharacters(ch) && ch.trim().length > 0)) {\n                    i++;\n                } else {\n                    break;\n                }\n            }\n\n            // Render entire sideways run in one save/restore\n            this.ctx.save();\n            this.ctx.translate(text.bounds.left + baseline, top);\n            this.ctx.rotate(rotationAngle);\n            let runOffset = 0;\n            for (let j = runStart; j < i; j++) {\n                const glyph = letters[j] as string;\n                renderFn(glyph, 0, runOffset);\n                runOffset += this.cachedMeasureText(glyph, fontString) + letterSpacing;\n            }\n            this.ctx.restore();\n            top += runOffset;\n        }\n    }\n\n    /**\n     * Render text with letter-spacing applied (fill pass).\n     * When letterSpacing is 0 the whole string is drawn in one call; otherwise each\n     * grapheme is drawn individually so spacing is applied correctly.\n     */\n    renderTextWithLetterSpacing(\n        text: TextBounds,\n        letterSpacing: number,\n        baseline: number,\n        writingMode: WRITING_MODE = WRITING_MODE.HORIZONTAL_TB\n    ): void {\n        this.renderFillText(text, letterSpacing, baseline, writingMode);\n    }\n\n    private canRenderWholeText(letterSpacing: number, writingMode: WRITING_MODE): boolean {\n        return letterSpacing === 0 && !isVerticalWritingMode(writingMode);\n    }\n\n    private renderFillText(text: TextBounds, letterSpacing: number, baseline: number, writingMode: WRITING_MODE): void {\n        if (this.canRenderWholeText(letterSpacing, writingMode)) {\n            this.ctx.fillText(text.text, text.bounds.left, text.bounds.top + baseline);\n        } else {\n            this.iterateLettersWithLetterSpacing(text, letterSpacing, baseline, writingMode, (letter, x, y) => {\n                this.ctx.fillText(letter, x, y);\n            });\n        }\n    }\n\n    private renderStrokeText(\n        text: TextBounds,\n        letterSpacing: number,\n        baseline: number,\n        writingMode: WRITING_MODE\n    ): void {\n        if (this.canRenderWholeText(letterSpacing, writingMode)) {\n            this.ctx.strokeText(text.text, text.bounds.left, text.bounds.top + baseline);\n        } else {\n            this.iterateLettersWithLetterSpacing(text, letterSpacing, baseline, writingMode, (letter, x, y) => {\n                this.ctx.strokeText(letter, x, y);\n            });\n        }\n    }\n\n    private renderTextStrokeWithStyle(text: TextBounds, styles: CSSParsedDeclaration, baseline: number): void {\n        if (!styles.webkitTextStrokeWidth || !text.text.trim().length) {\n            return;\n        }\n\n        this.ctx.strokeStyle = asString(styles.webkitTextStrokeColor);\n        this.ctx.lineWidth = styles.webkitTextStrokeWidth;\n        this.ctx.lineJoin = getTextStrokeLineJoin();\n        this.renderStrokeText(text, styles.letterSpacing, baseline, styles.writingMode);\n        this.ctx.strokeStyle = '';\n        this.ctx.lineWidth = 0;\n        this.ctx.lineJoin = 'miter';\n    }\n\n    private renderTextFillWithShadows(text: TextBounds, styles: CSSParsedDeclaration, baseline: number): void {\n        this.ctx.fillStyle = this.resolveFillColor(styles);\n        this.renderTextWithLetterSpacing(text, styles.letterSpacing, baseline, styles.writingMode);\n\n        const textShadows: TextShadow = styles.textShadow;\n        if (textShadows.length && text.text.trim().length) {\n            textShadows\n                .slice(0)\n                .reverse()\n                .forEach((textShadow) => {\n                    this.ctx.shadowColor = asString(textShadow.color);\n                    this.ctx.shadowOffsetX = textShadow.offsetX.number * this.options.scale;\n                    this.ctx.shadowOffsetY = textShadow.offsetY.number * this.options.scale;\n                    // Canvas shadow metrics live in device space (unaffected\n                    // by the context transform), so blur scales like the\n                    // offsets above.\n                    this.ctx.shadowBlur = textShadow.blur.number * this.options.scale;\n\n                    this.renderTextWithLetterSpacing(text, styles.letterSpacing, baseline, styles.writingMode);\n                });\n\n            this.ctx.shadowColor = '';\n            this.ctx.shadowOffsetX = 0;\n            this.ctx.shadowOffsetY = 0;\n            this.ctx.shadowBlur = 0;\n        }\n    }\n\n    /**\n     * Helper method to render text with paint order support\n     * Reduces code duplication in line-clamp and normal rendering\n     */\n    private renderTextBoundWithPaintOrder(\n        textBound: TextBounds,\n        styles: CSSParsedDeclaration,\n        paintOrderLayers: number[],\n        baseline: number\n    ): void {\n        paintOrderLayers.forEach((paintOrderLayer: number) => {\n            switch (paintOrderLayer) {\n                case PAINT_ORDER_LAYER.FILL:\n                    this.ctx.fillStyle = this.resolveFillColor(styles);\n                    this.renderTextWithLetterSpacing(textBound, styles.letterSpacing, baseline, styles.writingMode);\n                    break;\n                case PAINT_ORDER_LAYER.STROKE:\n                    this.renderTextStrokeWithStyle(textBound, styles, baseline);\n                    break;\n            }\n        });\n    }\n\n    private renderTextDecoration(bounds: Bounds, styles: CSSParsedDeclaration): void {\n        this.decorationRenderer.render(bounds, styles);\n    }\n\n    // Helper method to truncate text and add ellipsis if needed\n    private truncateTextWithEllipsis(text: string, maxWidth: number, letterSpacing: number): string {\n        // Use the Unicode ellipsis character (U+2026) whose width the browser measures\n        // as a single glyph, matching native text-overflow behaviour more closely.\n        const ellipsis = '\\u2026';\n        const ellipsisWidth = this.ctx.measureText(ellipsis).width;\n        // Segment into grapheme clusters so multi-byte characters (emoji, composed\n        // sequences) are never split mid-character.\n        const graphemes = segmentGraphemes(text);\n\n        if (letterSpacing === 0) {\n            // Measure the whole candidate string for accuracy: the browser applies\n            // kerning and ligatures when rendering multiple glyphs together, so\n            // measuring them as one string is more precise than summing individual widths.\n            // Binary search reduces measurements from O(n) to O(log n).\n            // NOTE: can't use cachedMeasureText here — the binary search measures\n            // concatenated substrings, and kerning/ligatures depend on the full string.\n            const fits = (n: number) =>\n                this.ctx.measureText(graphemes.slice(0, n).join('')).width + ellipsisWidth <= maxWidth;\n            let lo = 0;\n            let hi = graphemes.length;\n            while (lo < hi) {\n                const mid = (lo + hi + 1) >> 1;\n                if (fits(mid)) {\n                    lo = mid;\n                } else {\n                    hi = mid - 1;\n                }\n            }\n            return graphemes.slice(0, lo).join('') + ellipsis;\n        } else {\n            const fontString = this.ctx.font;\n            let width = ellipsisWidth;\n            const result: string[] = [];\n\n            for (const letter of graphemes) {\n                const glyphWidth = this.cachedMeasureText(letter, fontString);\n                // Check against glyph width only (no trailing spacing): letter-spacing\n                // is applied *between* characters, not after the final glyph. Using\n                // `glyphWidth + letterSpacing` would incorrectly discard letters that\n                // fit as the last character before the ellipsis.\n                if (width + glyphWidth > maxWidth) {\n                    break;\n                }\n                result.push(letter);\n                // Accumulate glyph + inter-character spacing for the *next* iteration.\n                width += glyphWidth + letterSpacing;\n            }\n\n            return result.join('') + ellipsis;\n        }\n    }\n\n    /**\n     * Create font style array\n     * Public method used by list rendering\n     */\n    createFontStyle(styles: CSSParsedDeclaration): string[] {\n        const fontVariant = styles.fontVariant\n            .filter((variant) => variant === 'normal' || variant === 'small-caps')\n            .join('');\n        const fontFamily = styles.fontFamily.join(', ');\n        const fontSize = isDimensionToken(styles.fontSize)\n            ? `${styles.fontSize.number}${styles.fontSize.unit}`\n            : `${styles.fontSize.number}px`;\n\n        return [\n            [styles.fontStyle, fontVariant, styles.fontWeight, fontSize, fontFamily].join(' '),\n            fontFamily,\n            fontSize\n        ];\n    }\n\n    /**\n     * -webkit-text-fill-color overrides the fill colour while leaving\n     * decorations and strokes on `color` (e.g. the classic transparent-fill\n     * gradient text). Falls back to `color` when the computed value could not\n     * be resolved (currentcolor).\n     */\n    private resolveFillColor(styles: CSSParsedDeclaration): string {\n        return asString(styles.webkitTextFillColor ?? styles.color);\n    }\n\n    /**\n     * Render text with -webkit-line-clamp truncation.\n     * Groups text bounds by their Y position into visual lines, then renders\n     * only the first N-1 complete lines followed by an ellipsis on the Nth line.\n     */\n    private renderLineClampedText(\n        text: TextContainer,\n        styles: CSSParsedDeclaration,\n        paintOrder: number[],\n        baseline: number,\n        containerBounds?: Bounds\n    ): boolean {\n        const lineHeight = computeLineHeight(styles.lineHeight, styles.fontSize.number);\n        const lines: TextBounds[][] = [];\n        let currentLine: TextBounds[] = [];\n        let currentLineTop = at(text.textBounds, 0).bounds.top;\n\n        text.textBounds.forEach((tb) => {\n            if (Math.abs(tb.bounds.top - currentLineTop) >= lineHeight * 0.5) {\n                if (currentLine.length > 0) lines.push(currentLine);\n                currentLine = [tb];\n                currentLineTop = tb.bounds.top;\n            } else {\n                currentLine.push(tb);\n            }\n        });\n        if (currentLine.length > 0) lines.push(currentLine);\n\n        const maxLines = styles.webkitLineClamp;\n        if (lines.length <= maxLines) return false; // fall through to normal rendering\n\n        // Render full lines (0..N-2)\n        for (let i = 0; i < maxLines - 1; i++) {\n            at(lines, i).forEach((tb) => this.renderTextBoundWithPaintOrder(tb, styles, paintOrder, baseline));\n        }\n\n        // Nth line: truncated with ellipsis\n        const lastLine = lines[maxLines - 1];\n        if (lastLine?.length && containerBounds) {\n            const textStr = lastLine.map((tb) => tb.text).join('');\n            const first = at(lastLine, 0);\n            const avail = containerBounds.width - (first.bounds.left - containerBounds.left);\n            const truncated = this.truncateTextWithEllipsis(textStr, avail, styles.letterSpacing);\n            const bounds = new TextBounds(truncated, first.bounds);\n            for (const layer of paintOrder) {\n                if (layer === PAINT_ORDER_LAYER.FILL) {\n                    this.ctx.fillStyle = this.resolveFillColor(styles);\n                    this.renderTextWithLetterSpacing(bounds, styles.letterSpacing, baseline, styles.writingMode);\n                } else if (layer === PAINT_ORDER_LAYER.STROKE) {\n                    this.renderTextStrokeWithStyle(bounds, styles, baseline);\n                }\n            }\n        }\n        return true;\n    }\n\n    /**\n     * Render single-line text with text-overflow: ellipsis.\n     * Returns true if ellipsis was applied (caller should skip normal rendering).\n     */\n    private renderEllipsisText(\n        text: TextContainer,\n        styles: CSSParsedDeclaration,\n        paintOrder: number[],\n        baseline: number,\n        containerBounds: Bounds\n    ): boolean {\n        const lineHeight = computeLineHeight(styles.lineHeight, styles.fontSize.number);\n        const firstTop = at(text.textBounds, 0).bounds.top;\n        const isSingleLine = text.textBounds.every((tb) => Math.abs(tb.bounds.top - firstTop) < lineHeight * 0.5);\n        if (!isSingleLine) return false;\n\n        let fullText = text.textBounds\n            .map((tb) => tb.text)\n            .join('')\n            .replace(/\\s+/g, ' ')\n            .trim();\n        const fullWidth = this.ctx.measureText(fullText).width;\n        // Small tolerance: canvas measurement can differ from the browser's text\n        // layout by a fraction of a pixel (kerning/font rounding), so text that\n        // exactly fits the container must not be falsely truncated (issue #226).\n        if (fullWidth <= containerBounds.width + TEXT_OVERFLOW_EPSILON) return false;\n\n        const truncated = this.truncateTextWithEllipsis(fullText, containerBounds.width, styles.letterSpacing);\n        const bounds = new TextBounds(truncated, at(text.textBounds, 0).bounds);\n        for (const layer of paintOrder) {\n            if (layer === PAINT_ORDER_LAYER.FILL) this.renderTextFillWithShadows(bounds, styles, baseline);\n            else if (layer === PAINT_ORDER_LAYER.STROKE) this.renderTextStrokeWithStyle(bounds, styles, baseline);\n        }\n        return true;\n    }\n\n    private measureBaselineCached(fontString: string, fallback: number): number {\n        let baseline = this.baselineCache.get(fontString);\n        if (baseline === undefined) {\n            baseline = measureBaseline(this.ctx, fallback);\n            if (this.baselineCache.size >= 64) {\n                this.baselineCache.clear();\n            }\n            this.baselineCache.set(fontString, baseline);\n        }\n        return baseline;\n    }\n\n    async renderTextNode(text: TextContainer, styles: CSSParsedDeclaration, containerBounds?: Bounds): Promise<void> {\n        // Reset glyph width cache at the start of each text node render —\n        // the font may change between nodes.\n        this.glyphWidthCache = null;\n        const [fontString] = this.createFontStyle(styles);\n        this.ctx.font = fontString ?? '';\n        this.ctx.direction = styles.direction === DIRECTION.RTL ? 'rtl' : 'ltr';\n        this.ctx.textAlign = 'left';\n        this.ctx.textBaseline = 'alphabetic';\n        const paintOrder = styles.paintOrder;\n\n        // Compute baseline using the actual rendered font via Canvas API.\n        // This ensures correct positioning whether using webfonts (which may not\n        // be loaded in the original document but are active in the Canvas) or\n        // system fonts.\n        const baseline = this.measureBaselineCached(fontString ?? '', styles.fontSize.number);\n\n        // -webkit-line-clamp\n        // Chrome reports `display: -webkit-box` as `flow-root` in computed\n        // styles, so accept FLOW_ROOT as well as BLOCK here — otherwise the\n        // clamp branch is skipped and the text renders without truncation.\n        const clamp =\n            styles.webkitLineClamp > 0 &&\n            (styles.display & (DISPLAY.BLOCK | DISPLAY.FLOW_ROOT)) !== 0 &&\n            styles.overflowY === OVERFLOW.HIDDEN &&\n            text.textBounds.length > 0;\n        if (clamp) {\n            if (this.renderLineClampedText(text, styles, paintOrder, baseline, containerBounds)) return;\n        }\n\n        // text-overflow: ellipsis (single-line only)\n        const ellipsis =\n            styles.textOverflow === TEXT_OVERFLOW.ELLIPSIS &&\n            containerBounds &&\n            styles.overflowX === OVERFLOW.HIDDEN &&\n            text.textBounds.length > 0;\n        if (ellipsis && this.renderEllipsisText(text, styles, paintOrder, baseline, containerBounds)) return;\n\n        // Normal rendering: fill + stroke + decorations per text bound\n        text.textBounds.forEach((tb) => {\n            paintOrder.forEach((layer) => {\n                if (layer === PAINT_ORDER_LAYER.FILL) {\n                    this.renderTextFillWithShadows(tb, styles, baseline);\n                    if (styles.textDecorationLine.length) this.renderTextDecoration(tb.bounds, styles);\n                } else if (layer === PAINT_ORDER_LAYER.STROKE) {\n                    this.renderTextStrokeWithStyle(tb, styles, baseline);\n                }\n            });\n        });\n\n        if (styles.textEmphasisStyle) {\n            this.renderTextEmphasis(text, styles, baseline);\n        }\n    }\n\n    /**\n     * Draw text-emphasis marks over (or under) each grapheme cluster.\n     *\n     * Vertical writing modes are skipped in the current scope: marks would\n     * need to sit beside vertical glyph runs rather than above them.\n     */\n    private renderTextEmphasis(text: TextContainer, styles: CSSParsedDeclaration, baseline: number): void {\n        if (isVerticalWritingMode(styles.writingMode)) {\n            return;\n        }\n        const style = styles.textEmphasisStyle;\n        if (!style) {\n            return;\n        }\n        const fontSize = styles.fontSize.number;\n        const markDiameter = fontSize * 0.5;\n        const color = asString(styles.textEmphasisColor ?? styles.color);\n        const position = styles.textEmphasisPosition;\n\n        const drawShapeMark = (centerX: number, centerY: number): void => {\n            if (typeof style === 'string') {\n                // Custom string: draw the character itself at the mark size.\n                const savedFont = this.ctx.font;\n                this.ctx.font = savedFont.replace(/^\\S+/, `${markDiameter}px`);\n                this.ctx.textAlign = 'center';\n                this.ctx.fillText(style, centerX, centerY + markDiameter / 3);\n                this.ctx.font = savedFont;\n                this.ctx.textAlign = 'left';\n                return;\n            }\n            const { fill, shape } = style;\n            const radius = markDiameter * (shape === 'dot' ? 0.3 : shape === 'sesame' ? 0.26 : 0.34);\n            this.ctx.beginPath();\n            if (shape === 'sesame') {\n                // Sesame seeds are teardrop shaped; a rotated ellipse is the\n                // accepted canvas approximation.\n                this.ctx.ellipse(centerX, centerY, radius * 1.3, radius * 0.8, Math.PI / 4, 0, Math.PI * 2);\n            } else if (shape === 'triangle') {\n                this.ctx.moveTo(centerX, centerY - radius);\n                this.ctx.lineTo(centerX + radius * 1.1, centerY + radius * 0.8);\n                this.ctx.lineTo(centerX - radius * 1.1, centerY + radius * 0.8);\n                this.ctx.closePath();\n            } else {\n                this.ctx.arc(centerX, centerY, radius, 0, Math.PI * 2);\n            }\n            if (fill) {\n                if (shape === 'double-circle') {\n                    // Two concentric rings, drawn as strokes of different widths.\n                    this.ctx.lineWidth = radius * 0.7;\n                    this.ctx.stroke();\n                    this.ctx.beginPath();\n                    this.ctx.arc(centerX, centerY, radius * 0.4, 0, Math.PI * 2);\n                    this.ctx.lineWidth = radius * 0.35;\n                    this.ctx.stroke();\n                } else {\n                    this.ctx.fill();\n                }\n            } else {\n                this.ctx.lineWidth = Math.max(1, radius * 0.35);\n                this.ctx.stroke();\n                if (shape === 'double-circle') {\n                    this.ctx.beginPath();\n                    this.ctx.arc(centerX, centerY, radius * 0.5, 0, Math.PI * 2);\n                    this.ctx.stroke();\n                }\n            }\n        };\n\n        const fontString = this.ctx.font;\n        for (const tb of text.textBounds) {\n            // Walk grapheme clusters with their advance widths — the same walk\n            // the letter-spacing renderer uses — and centre a mark per glyph.\n            const baselineY = tb.bounds.top + baseline;\n            const centerY = position.over ? baselineY - fontSize - markDiameter * 0.4 : baselineY + markDiameter * 0.9;\n            let left = tb.bounds.left;\n            for (const letter of segmentGraphemes(tb.text)) {\n                const width = this.cachedMeasureText(letter, fontString);\n                this.ctx.save();\n                try {\n                    this.ctx.fillStyle = color;\n                    this.ctx.strokeStyle = color;\n                    this.ctx.lineWidth = 1;\n                    drawShapeMark(left + width / 2 + styles.letterSpacing / 2, centerY);\n                } finally {\n                    this.ctx.restore();\n                }\n                left += width + styles.letterSpacing;\n            }\n        }\n    }\n}\n","import { isBezierCurve } from '../bezier-curve';\nimport { Path } from '../path';\nimport { Vector } from '../vector';\n\nexport const formatCanvasPath = (ctx: CanvasRenderingContext2D, paths: Path[]): void => {\n    paths.forEach((point, index) => {\n        const start: Vector = isBezierCurve(point) ? point.start : point;\n        if (index === 0) {\n            ctx.moveTo(start.x, start.y);\n        } else {\n            ctx.lineTo(start.x, start.y);\n        }\n\n        if (isBezierCurve(point)) {\n            ctx.bezierCurveTo(\n                point.startControl.x,\n                point.startControl.y,\n                point.endControl.x,\n                point.endControl.y,\n                point.end.x,\n                point.end.y\n            );\n        }\n    });\n};\n\nexport const createCanvasPath = (ctx: CanvasRenderingContext2D, paths: Path[]): void => {\n    ctx.beginPath();\n    formatCanvasPath(ctx, paths);\n    ctx.closePath();\n};\n","/**\n * Generic LRU (Least-Recently-Used) wrapper over a native `Map`.\n *\n * Both the CSS parse cache and the background pattern cache implement the\n * same LRU eviction pattern using Map's insertion-order guarantee.  This\n * tiny utility centralises that logic so it can be reused without\n * duplication.\n *\n * Usage:\n * ```ts\n * const cache = new LRUMap<string, CanvasPattern>(50);\n * const entry = cache.get(key); // promotes if found, returns undefined otherwise\n * cache.set(key, value);         // evicts oldest entry when at capacity\n * ```\n */\nexport class LRUMap<K, V> {\n    private readonly _map: Map<K, V>;\n\n    constructor(private readonly maxSize: number) {\n        this._map = new Map();\n    }\n\n    /**\n     * Get a value by key.\n     * On cache hit the entry is promoted to the end of the Map (most-recently-used).\n     * Returns `undefined` on miss.\n     */\n    get(key: K): V | undefined {\n        if (!this._map.has(key)) {\n            return undefined;\n        }\n        // Delete-then-set promotes the entry to MRU position.\n        const value = this._map.get(key)!;\n        this._map.delete(key);\n        this._map.set(key, value);\n        return value;\n    }\n\n    /**\n     * Insert or update a key-value pair.\n     * If the key already exists it is moved to MRU position.  If the map is\n     * at capacity the least-recently-used entry (oldest insertion order) is\n     * evicted before inserting.\n     */\n    set(key: K, value: V): void {\n        if (this._map.has(key)) {\n            this._map.delete(key);\n        } else if (this._map.size >= this.maxSize) {\n            const oldestKey = this._map.keys().next().value;\n            if (oldestKey !== undefined) {\n                this._map.delete(oldestKey);\n            }\n        }\n        this._map.set(key, value);\n    }\n\n    /** Current number of entries. */\n    get size(): number {\n        return this._map.size;\n    }\n\n    /** Remove all entries. */\n    clear(): void {\n        this._map.clear();\n    }\n}\n","/**\n * Background Renderer\n *\n * Handles rendering of element backgrounds including:\n * - Background colors\n * - Background images (URL)\n * - Linear gradients\n * - Radial gradients\n * - Background patterns and repeats\n */\n\nimport { Context } from '../../core/context';\nimport { at } from '../../core/util';\nimport { ElementContainer } from '../../dom/element-container';\nimport { Path } from '../path';\nimport {\n    CSSImageType,\n    CSSConicGradientImage,\n    CSSLinearGradientImage,\n    CSSRadialGradientImage,\n    CSSURLImage,\n    isConicGradient,\n    isLinearGradient,\n    isRadialGradient,\n    isRepeatingConicGradient,\n    isRepeatingLinearGradient,\n    isRepeatingRadialGradient\n} from '../../css/types/image';\nimport { calculateBackgroundRendering, getBackgroundValueForIndex } from '../background';\nimport { calculateGradientDirection, calculateRadius, processColorStops } from '../../css/types/functions/gradient';\nimport { FIFTY_PERCENT, getAbsoluteValue } from '../../css/types/length-percentage';\nimport { asString } from '../../css/types/color-utilities';\nimport { IMAGE_RENDERING } from '../../css/property-descriptors/image-rendering';\nimport { BACKGROUND_REPEAT } from '../../css/property-descriptors/background-repeat';\nimport { createCanvasPath } from './canvas-path';\nimport { rasterizeRadialGradient, stackRepeatingStops } from './gradient-rasterizer';\nimport { LRUMap } from '../../core/lru-map';\nimport { PATTERN_CACHE_MAX } from '../../core/constants';\n\n/**\n * Dependencies required for BackgroundRenderer\n */\nexport interface BackgroundRendererDependencies {\n    ctx: CanvasRenderingContext2D;\n    context: Context;\n    canvas: HTMLCanvasElement;\n    options: {\n        width: number;\n        height: number;\n        scale: number;\n    };\n}\n\n/**\n * Background Renderer\n *\n * Specialized renderer for element backgrounds.\n * Extracted from CanvasRenderer to improve code organization and maintainability.\n */\nexport class BackgroundRenderer {\n    private readonly ctx: CanvasRenderingContext2D;\n    private readonly context: Context;\n    private readonly canvas: HTMLCanvasElement;\n\n    /**\n     * Instance-level LRU cache for background-image patterns.\n     * CanvasPatterns are tied to the rendering context and must not be\n     * shared across different render passes. This cache lives for the\n     * duration of one html2canvas() call.\n     */\n    private readonly patternCache = new LRUMap<string, CanvasPattern>(PATTERN_CACHE_MAX);\n\n    constructor(deps: BackgroundRendererDependencies) {\n        this.ctx = deps.ctx;\n        this.context = deps.context;\n        this.canvas = deps.canvas;\n    }\n\n    /**\n     * Render background images for a container\n     * Supports URL images, linear gradients, and radial gradients\n     *\n     * @param container - Element container with background styles\n     */\n    async renderBackgroundImage(container: ElementContainer): Promise<void> {\n        let index = container.styles.backgroundImage.length - 1;\n        const blendModes = container.styles.backgroundBlendMode;\n        let layerCount = 0;\n\n        for (const backgroundImage of container.styles.backgroundImage.slice(0).reverse()) {\n            // Save context and apply blend mode for non-first layers\n            if (layerCount > 0) {\n                const blendMode = blendModes[layerCount] ?? blendModes[0] ?? 'normal';\n                if (blendMode !== 'normal') {\n                    this.ctx.save();\n                    this.ctx.globalCompositeOperation = blendMode as GlobalCompositeOperation;\n                }\n            }\n\n            if (backgroundImage.type === CSSImageType.URL) {\n                await this.renderBackgroundURLImage(container, backgroundImage as CSSURLImage, index);\n            } else if (isLinearGradient(backgroundImage)) {\n                this.renderLinearGradient(container, backgroundImage, index);\n            } else if (isRepeatingLinearGradient(backgroundImage)) {\n                this.renderRepeatingLinearGradient(container, backgroundImage, index);\n            } else if (isRadialGradient(backgroundImage)) {\n                this.renderRadialGradient(container, backgroundImage, index);\n            } else if (isRepeatingRadialGradient(backgroundImage)) {\n                this.renderRepeatingRadialGradient(container, backgroundImage, index);\n            } else if (isConicGradient(backgroundImage)) {\n                this.renderConicGradient(container, backgroundImage, index);\n            } else if (isRepeatingConicGradient(backgroundImage)) {\n                this.renderRepeatingConicGradient(container, backgroundImage, index);\n            }\n\n            if (layerCount > 0) {\n                const blendMode = blendModes[layerCount] ?? blendModes[0] ?? 'normal';\n                if (blendMode !== 'normal') {\n                    this.ctx.restore();\n                }\n            }\n\n            index--;\n            layerCount++;\n        }\n    }\n\n    /**\n     * Render a URL-based background image\n     */\n    private async renderBackgroundURLImage(\n        container: ElementContainer,\n        backgroundImage: CSSURLImage,\n        index: number\n    ): Promise<void> {\n        let image;\n        const url = backgroundImage.url;\n        try {\n            image = await this.context.cache.match(url);\n        } catch (e) {\n            // Load failures are reported to onError once, by the cache; this\n            // catch adds the usage context to the log only.\n            this.context.logger.error(`Error loading background-image ${url}`);\n        }\n\n        if (image) {\n            const imageWidth = isNaN(image.width) || image.width === 0 ? 1 : image.width;\n            const imageHeight = isNaN(image.height) || image.height === 0 ? 1 : image.height;\n            const [path, x, y, width, height] = calculateBackgroundRendering(container, index, [\n                imageWidth,\n                imageHeight,\n                imageWidth / imageHeight\n            ]);\n\n            // Determine repetition mode based on CSS background-repeat\n            const repeat = getBackgroundValueForIndex(container.styles.backgroundRepeat, index);\n            const repeatMode =\n                repeat === BACKGROUND_REPEAT.NO_REPEAT\n                    ? 'no-repeat'\n                    : repeat === BACKGROUND_REPEAT.REPEAT_X\n                      ? 'repeat-x'\n                      : repeat === BACKGROUND_REPEAT.REPEAT_Y\n                        ? 'repeat-y'\n                        : 'repeat';\n\n            // Cache key: URL + resized dimensions + imageRendering + repeat mode (pattern is dependent on all four)\n            const cacheKey = `${url}|${Math.round(width)}x${Math.round(height)}|${container.styles.imageRendering}|${repeatMode}`;\n            let pattern = this.patternCache.get(cacheKey);\n\n            if (!pattern) {\n                const resized = this.resizeImage(\n                    image as HTMLImageElement,\n                    width,\n                    height,\n                    container.styles.imageRendering\n                );\n                pattern = this.ctx.createPattern(resized, repeatMode) as CanvasPattern;\n\n                this.patternCache.set(cacheKey, pattern);\n            }\n\n            this.renderRepeat(path, pattern, x, y);\n        }\n    }\n\n    /**\n     * Render a repeating linear gradient background.\n     * Renders one cycle of the gradient to a pattern canvas, then fills\n     * the background area using createPattern('repeat').\n     */\n    private renderRepeatingLinearGradient(\n        container: ElementContainer,\n        backgroundImage: CSSLinearGradientImage,\n        index: number\n    ): void {\n        const [path, x, y, width, height] = calculateBackgroundRendering(container, index, [null, null, null]);\n        const [lineLength, lx0, lx1, ly0, ly1] = calculateGradientDirection(backgroundImage.angle, width, height);\n        // calculateGradientDirection returns endpoints in background-area\n        // local coordinates; the fill happens on a context already translated\n        // to page coordinates, so shift the gradient line by the area origin.\n        const gx0 = x + lx0;\n        const gx1 = x + lx1;\n        const gy0 = y + ly0;\n        const gy1 = y + ly1;\n\n        // Draw the stripes directly on the gradient line: the one-cycle stop\n        // list is stacked k·period + s for k = 0..cycles-1 (clamped to [0,1]\n        // of the line), exactly like the repeating radial renderer. This\n        // avoids pattern tiling, whose tile must be an integer translation\n        // period of the stripe phase along both axes — impossible for most\n        // angled gradients (a 45° stripe needs irrational tile sizes), which\n        // made every tile seam drift and the stripes alias.\n        const processedStops = processColorStops(backgroundImage.stops, lineLength || 1);\n        const stacked = stackRepeatingStops(processedStops);\n\n        const gradient = this.ctx.createLinearGradient(gx0, gy0, gx1, gy1);\n        if (!stacked) {\n            // A degenerate period (all stops clamped to one point) repeats\n            // nothing — CSS renders the last colour across the whole area.\n            const lastColor = asString(at(processedStops, processedStops.length - 1).color);\n            gradient.addColorStop(0, lastColor);\n            gradient.addColorStop(1, lastColor);\n        } else {\n            stacked.forEach((s) => gradient.addColorStop(Math.min(1, Math.max(0, s.stop)), s.color));\n        }\n\n        this.path(path);\n        this.ctx.fillStyle = gradient;\n        this.ctx.fill();\n    }\n\n    /**\n     * Render a linear gradient background\n     */\n    private renderLinearGradient(\n        container: ElementContainer,\n        backgroundImage: CSSLinearGradientImage,\n        index: number\n    ): void {\n        const [path, x, y, width, height] = calculateBackgroundRendering(container, index, [null, null, null]);\n        const [lineLength, x0, x1, y0, y1] = calculateGradientDirection(backgroundImage.angle, width, height);\n\n        // Cache key: angle + dimensions + serialised colour stops\n        const cacheKey = `lg|${backgroundImage.angle}|${Math.round(width)}x${Math.round(height)}|${JSON.stringify(backgroundImage.stops)}`;\n\n        let pattern = this.patternCache.get(cacheKey);\n        if (!pattern) {\n            const ownerDocument = this.canvas.ownerDocument ?? document;\n            const canvas = ownerDocument.createElement('canvas');\n            canvas.width = width;\n            canvas.height = height;\n            const ctx = canvas.getContext('2d');\n            if (!ctx) {\n                return;\n            }\n            const gradient = ctx.createLinearGradient(x0, y0, x1, y1);\n\n            processColorStops(backgroundImage.stops, lineLength || 1).forEach((colorStop) =>\n                gradient.addColorStop(colorStop.stop, asString(colorStop.color))\n            );\n\n            ctx.fillStyle = gradient;\n            ctx.fillRect(0, 0, width, height);\n            if (width > 0 && height > 0) {\n                pattern = this.ctx.createPattern(canvas, 'repeat') as CanvasPattern;\n                this.patternCache.set(cacheKey, pattern);\n            }\n        }\n\n        if (pattern) {\n            this.renderRepeat(path, pattern, x, y);\n        }\n    }\n\n    /**\n     * Render a radial gradient background\n     */\n    private renderRadialGradient(\n        container: ElementContainer,\n        backgroundImage: CSSRadialGradientImage,\n        index: number\n    ): void {\n        const [path, left, top, width, height] = calculateBackgroundRendering(container, index, [null, null, null]);\n        const position = backgroundImage.position.length === 0 ? [FIFTY_PERCENT] : backgroundImage.position;\n        const x = getAbsoluteValue(at(position, 0), width);\n        const y = getAbsoluteValue(at(position, position.length - 1), height);\n\n        let [rx, ry] = calculateRadius(backgroundImage, x, y, width, height);\n        // Handle edge case where radial gradient size is 0\n        // Use a minimum value of 0.01 to ensure gradient is still rendered\n        if (rx === 0 || ry === 0) {\n            rx = Math.max(rx, 0.01);\n            ry = Math.max(ry, 0.01);\n        }\n        if (rx > 0 && ry > 0) {\n            // Cache key for radial gradient: position + radii + colour stops\n            const cacheKey = `rg|${Math.round(x)}x${Math.round(y)}|${Math.round(rx)}x${Math.round(ry)}|${JSON.stringify(backgroundImage.stops)}`;\n\n            // Outside the ending shape a radial gradient continues with its\n            // last colour stop; resolve it up front so the underlay paints on\n            // cache hits too.\n            const processed = processColorStops(backgroundImage.stops, rx);\n            const lastColor = asString(at(processed, processed.length - 1).color);\n\n            let pattern = this.patternCache.get(cacheKey);\n\n            if (!pattern) {\n                const ownerDocument = this.canvas.ownerDocument ?? document;\n                // The stop line length is rx (the canvas gradient radius), NOT\n                // the diameter — see rasterizeRadialGradient for the invariants.\n                const rasterized = rasterizeRadialGradient(ownerDocument, rx, ry, backgroundImage.stops, false);\n                if (!rasterized) {\n                    return;\n                }\n                pattern = this.ctx.createPattern(rasterized.canvas, 'no-repeat') as CanvasPattern;\n                this.patternCache.set(cacheKey, pattern);\n            }\n\n            this.path(path);\n            this.ctx.save();\n            this.ctx.clip();\n            // Paint the last colour first and lay the ellipse pattern on top.\n            this.ctx.fillStyle = lastColor;\n            this.ctx.fill();\n            this.ctx.translate(left + x - rx, top + y - ry);\n            this.ctx.fillStyle = pattern;\n            this.ctx.fillRect(0, 0, rx * 2, ry * 2);\n            this.ctx.restore();\n        }\n    }\n\n    /**\n     * Render a repeating radial gradient.\n     *\n     * Canvas radial gradients have no native repeat mode, so the stop list is\n     * stacked: with period p (the last stop position) the stops are re-added\n     * k*p + s for k = 0..ceil(radius / p) - 1, clipped to the [0, 1] gradient\n     * range. The full repeating gradient is then rasterised with the same\n     * ellipse pattern trick as the plain radial renderer.\n     */\n    private renderRepeatingRadialGradient(\n        container: ElementContainer,\n        backgroundImage: CSSRadialGradientImage,\n        index: number\n    ): void {\n        const [path, left, top, width, height] = calculateBackgroundRendering(container, index, [null, null, null]);\n        const position = backgroundImage.position.length === 0 ? [FIFTY_PERCENT] : backgroundImage.position;\n        const x = getAbsoluteValue(at(position, 0), width);\n        const y = getAbsoluteValue(at(position, position.length - 1), height);\n\n        let [rx, ry] = calculateRadius(backgroundImage, x, y, width, height);\n        if (rx === 0 || ry === 0) {\n            rx = Math.max(rx, 0.01);\n            ry = Math.max(ry, 0.01);\n        }\n        if (!(rx > 0 && ry > 0)) {\n            return;\n        }\n\n        const cacheKey = `rrg|${Math.round(x)}x${Math.round(y)}|${Math.round(rx)}x${Math.round(ry)}|${JSON.stringify(backgroundImage.stops)}`;\n        let pattern = this.patternCache.get(cacheKey);\n        if (!pattern) {\n            const ownerDocument = this.canvas.ownerDocument ?? document;\n            // Shared ellipse rasteriser: stacking + the rx stop line length\n            // and pre-scale fill coverage invariants live in one place.\n            const rasterized = rasterizeRadialGradient(ownerDocument, rx, ry, backgroundImage.stops, true);\n            if (!rasterized) {\n                return;\n            }\n            pattern = this.ctx.createPattern(rasterized.canvas, 'no-repeat') as CanvasPattern;\n            this.patternCache.set(cacheKey, pattern);\n        }\n\n        if (pattern) {\n            this.path(path);\n            this.ctx.save();\n            this.ctx.clip();\n            this.ctx.translate(left + x - rx, top + y - ry);\n            this.ctx.fillStyle = pattern;\n            this.ctx.fillRect(0, 0, rx * 2, ry * 2);\n            this.ctx.restore();\n        }\n    }\n\n    /**\n     * Render a conic gradient.\n     *\n     * Color stops are angular: percentages of the full 360° sweep, normalised\n     * by processing against a line length of 1. Canvas createConicGradient\n     * measures its start angle in the same clockwise-from-12-o'clock space as\n     * CSS `from <angle>`.\n     */\n    private renderConicGradient(\n        container: ElementContainer,\n        backgroundImage: CSSConicGradientImage,\n        index: number\n    ): void {\n        const [path, left, top, width, height] = calculateBackgroundRendering(container, index, [null, null, null]);\n        const position = backgroundImage.position.length === 0 ? [FIFTY_PERCENT] : backgroundImage.position;\n        const cx = left + getAbsoluteValue(at(position, 0), width);\n        const cy = top + getAbsoluteValue(at(position, position.length - 1), height);\n\n        // Canvas conic gradients start at 3 o'clock; CSS `from 0deg` starts at\n        // 12 o'clock (verified against Chrome), so shift by -90°.\n        const gradient = this.ctx.createConicGradient(backgroundImage.angle - Math.PI / 2, cx, cy);\n        // Stops arrive normalised to [0, 1]; regions beyond the last stop pad\n        // with its colour, matching canvas gradient semantics.\n        const stops = processColorStops(backgroundImage.stops, 1);\n        stops.forEach((s) => {\n            gradient.addColorStop(Math.min(1, Math.max(0, s.stop)), asString(s.color));\n        });\n\n        this.path(path);\n        this.ctx.save();\n        this.ctx.clip();\n        this.ctx.fillStyle = gradient;\n        this.ctx.fill();\n        this.ctx.restore();\n    }\n\n    /**\n     * Render a repeating conic gradient background.\n     *\n     * Canvas conic gradient stops span the full 2π sweep as [0, 1], so the\n     * one-cycle stop list is stacked k·period + s for k = 0..cycles-1 over the\n     * whole sweep — the same periodic-stop stacking the repeating linear and\n     * radial renderers use along their gradient lines.\n     */\n    private renderRepeatingConicGradient(\n        container: ElementContainer,\n        backgroundImage: CSSConicGradientImage,\n        index: number\n    ): void {\n        const [path, left, top, width, height] = calculateBackgroundRendering(container, index, [null, null, null]);\n        const position = backgroundImage.position.length === 0 ? [FIFTY_PERCENT] : backgroundImage.position;\n        const cx = left + getAbsoluteValue(at(position, 0), width);\n        const cy = top + getAbsoluteValue(at(position, position.length - 1), height);\n\n        const processedStops = processColorStops(backgroundImage.stops, 1);\n        const firstStop = at(processedStops, 0);\n        const lastStop = at(processedStops, processedStops.length - 1);\n        const period = Math.max(lastStop.stop - firstStop.stop, 0.01);\n\n        // A degenerate period (all stops clamped to one point) repeats\n        // nothing — CSS renders the last colour across the whole area.\n        if (lastStop.stop - firstStop.stop < 1e-6) {\n            const gradient = this.ctx.createConicGradient(backgroundImage.angle - Math.PI / 2, cx, cy);\n            gradient.addColorStop(0, asString(lastStop.color));\n            gradient.addColorStop(1, asString(lastStop.color));\n            this.path(path);\n            this.ctx.save();\n            this.ctx.clip();\n            this.ctx.fillStyle = gradient;\n            this.ctx.fill();\n            this.ctx.restore();\n            return;\n        }\n\n        const stops: Array<{ stop: number; color: string }> = [];\n        const cycles = Math.ceil(1 / period);\n        for (let k = 0; k < cycles; k++) {\n            for (const s of processedStops) {\n                const stop = k * period + (s.stop - firstStop.stop);\n                if (stop > 1) break;\n                stops.push({ stop, color: asString(s.color) });\n            }\n        }\n        // The band covering the sweep end extends flat to 1 (its next stop is\n        // beyond the sweep), so pad with that band's colour, matching CSS\n        // repeating behaviour at the sweep boundary.\n        const lastIncluded = at(stops, stops.length - 1);\n        if (lastIncluded && lastIncluded.stop < 1) {\n            stops.push({ stop: 1, color: lastIncluded.color });\n        }\n\n        // Canvas conic gradients start at 3 o'clock; CSS `from 0deg` starts at\n        // 12 o'clock (verified against Chrome), so shift by -90°.\n        const gradient = this.ctx.createConicGradient(backgroundImage.angle - Math.PI / 2, cx, cy);\n        stops.forEach((s) => {\n            gradient.addColorStop(Math.min(1, Math.max(0, s.stop)), s.color);\n        });\n\n        this.path(path);\n        this.ctx.save();\n        this.ctx.clip();\n        this.ctx.fillStyle = gradient;\n        this.ctx.fill();\n        this.ctx.restore();\n    }\n\n    /**\n     * Render a repeating pattern with offset\n     *\n     * @param path - Path to fill\n     * @param pattern - Canvas pattern or gradient\n     * @param offsetX - X offset for pattern\n     * @param offsetY - Y offset for pattern\n     */\n    private renderRepeat(\n        path: Path[],\n        pattern: CanvasPattern | CanvasGradient,\n        offsetX: number,\n        offsetY: number\n    ): void {\n        this.path(path);\n        this.ctx.fillStyle = pattern;\n        this.ctx.translate(offsetX, offsetY);\n        this.ctx.fill();\n        this.ctx.translate(-offsetX, -offsetY);\n    }\n\n    /**\n     * Resize an image to target dimensions\n     *\n     * @param image - Source image\n     * @param width - Target width\n     * @param height - Target height\n     * @param imageRendering - CSS image-rendering property value\n     * @returns Resized canvas or original image\n     */\n    private resizeImage(\n        image: HTMLImageElement,\n        width: number,\n        height: number,\n        imageRendering: IMAGE_RENDERING\n    ): HTMLCanvasElement | HTMLImageElement {\n        // NOTE: Early-return optimisation disabled per upstream investigation\n        // (https://github.com/niklasvh/html2canvas/pull/2911).\n        // Returning the original image when dimensions match caused subtle\n        // rendering issues — a resized copy through a fresh offscreen canvas\n        // is always safer, even when width/height are unchanged.\n\n        const ownerDocument = this.canvas.ownerDocument ?? document;\n        const canvas = ownerDocument.createElement('canvas');\n        canvas.width = Math.max(1, width);\n        canvas.height = Math.max(1, height);\n        const ctx = canvas.getContext('2d');\n        if (!ctx) {\n            return image;\n        }\n\n        // Apply image smoothing based on CSS image-rendering property\n        if (imageRendering === IMAGE_RENDERING.PIXELATED || imageRendering === IMAGE_RENDERING.CRISP_EDGES) {\n            this.context.logger.debug(`Disabling image smoothing for background image due to CSS image-rendering`);\n            ctx.imageSmoothingEnabled = false;\n        } else if (imageRendering === IMAGE_RENDERING.SMOOTH) {\n            this.context.logger.debug(\n                `Enabling image smoothing for background image due to CSS image-rendering: smooth`\n            );\n            ctx.imageSmoothingEnabled = true;\n        } else {\n            // AUTO: inherit from main renderer context\n            ctx.imageSmoothingEnabled = this.ctx.imageSmoothingEnabled;\n        }\n\n        // Inherit quality setting\n        if (this.ctx.imageSmoothingQuality) {\n            ctx.imageSmoothingQuality = this.ctx.imageSmoothingQuality;\n        }\n\n        ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, width, height);\n        return canvas;\n    }\n\n    /**\n     * Create a canvas path from path array\n     *\n     * @param paths - Array of path points\n     */\n    private path(paths: Path[]): void {\n        createCanvasPath(this.ctx, paths);\n    }\n}\n","import { Path } from './path';\nimport { BoundCurves } from './bound-curves';\nimport { isBezierCurve } from './bezier-curve';\n\nexport const parsePathForBorder = (curves: BoundCurves, borderSide: number): Path[] => {\n    switch (borderSide) {\n        case 0:\n            return createPathFromCurves(\n                curves.topLeftBorderBox,\n                curves.topLeftPaddingBox,\n                curves.topRightBorderBox,\n                curves.topRightPaddingBox\n            );\n        case 1:\n            return createPathFromCurves(\n                curves.topRightBorderBox,\n                curves.topRightPaddingBox,\n                curves.bottomRightBorderBox,\n                curves.bottomRightPaddingBox\n            );\n        case 2:\n            return createPathFromCurves(\n                curves.bottomRightBorderBox,\n                curves.bottomRightPaddingBox,\n                curves.bottomLeftBorderBox,\n                curves.bottomLeftPaddingBox\n            );\n        case 3:\n        default:\n            return createPathFromCurves(\n                curves.bottomLeftBorderBox,\n                curves.bottomLeftPaddingBox,\n                curves.topLeftBorderBox,\n                curves.topLeftPaddingBox\n            );\n    }\n};\n\nexport const parsePathForBorderDoubleOuter = (curves: BoundCurves, borderSide: number): Path[] => {\n    switch (borderSide) {\n        case 0:\n            return createPathFromCurves(\n                curves.topLeftBorderBox,\n                curves.topLeftBorderDoubleOuterBox,\n                curves.topRightBorderBox,\n                curves.topRightBorderDoubleOuterBox\n            );\n        case 1:\n            return createPathFromCurves(\n                curves.topRightBorderBox,\n                curves.topRightBorderDoubleOuterBox,\n                curves.bottomRightBorderBox,\n                curves.bottomRightBorderDoubleOuterBox\n            );\n        case 2:\n            return createPathFromCurves(\n                curves.bottomRightBorderBox,\n                curves.bottomRightBorderDoubleOuterBox,\n                curves.bottomLeftBorderBox,\n                curves.bottomLeftBorderDoubleOuterBox\n            );\n        case 3:\n        default:\n            return createPathFromCurves(\n                curves.bottomLeftBorderBox,\n                curves.bottomLeftBorderDoubleOuterBox,\n                curves.topLeftBorderBox,\n                curves.topLeftBorderDoubleOuterBox\n            );\n    }\n};\n\nexport const parsePathForBorderDoubleInner = (curves: BoundCurves, borderSide: number): Path[] => {\n    switch (borderSide) {\n        case 0:\n            return createPathFromCurves(\n                curves.topLeftBorderDoubleInnerBox,\n                curves.topLeftPaddingBox,\n                curves.topRightBorderDoubleInnerBox,\n                curves.topRightPaddingBox\n            );\n        case 1:\n            return createPathFromCurves(\n                curves.topRightBorderDoubleInnerBox,\n                curves.topRightPaddingBox,\n                curves.bottomRightBorderDoubleInnerBox,\n                curves.bottomRightPaddingBox\n            );\n        case 2:\n            return createPathFromCurves(\n                curves.bottomRightBorderDoubleInnerBox,\n                curves.bottomRightPaddingBox,\n                curves.bottomLeftBorderDoubleInnerBox,\n                curves.bottomLeftPaddingBox\n            );\n        case 3:\n        default:\n            return createPathFromCurves(\n                curves.bottomLeftBorderDoubleInnerBox,\n                curves.bottomLeftPaddingBox,\n                curves.topLeftBorderDoubleInnerBox,\n                curves.topLeftPaddingBox\n            );\n    }\n};\n\nexport const parsePathForBorderStroke = (curves: BoundCurves, borderSide: number): Path[] => {\n    switch (borderSide) {\n        case 0:\n            return createStrokePathFromCurves(curves.topLeftBorderStroke, curves.topRightBorderStroke);\n        case 1:\n            return createStrokePathFromCurves(curves.topRightBorderStroke, curves.bottomRightBorderStroke);\n        case 2:\n            return createStrokePathFromCurves(curves.bottomRightBorderStroke, curves.bottomLeftBorderStroke);\n        case 3:\n        default:\n            return createStrokePathFromCurves(curves.bottomLeftBorderStroke, curves.topLeftBorderStroke);\n    }\n};\n\nconst createStrokePathFromCurves = (outer1: Path, outer2: Path): Path[] => {\n    const path = [];\n    if (isBezierCurve(outer1)) {\n        path.push(outer1.subdivide(0.5, false));\n    } else {\n        path.push(outer1);\n    }\n\n    if (isBezierCurve(outer2)) {\n        path.push(outer2.subdivide(0.5, true));\n    } else {\n        path.push(outer2);\n    }\n\n    return path;\n};\n\nconst createPathFromCurves = (outer1: Path, inner1: Path, outer2: Path, inner2: Path): Path[] => {\n    const path = [];\n    if (isBezierCurve(outer1)) {\n        path.push(outer1.subdivide(0.5, false));\n    } else {\n        path.push(outer1);\n    }\n\n    if (isBezierCurve(outer2)) {\n        path.push(outer2.subdivide(0.5, true));\n    } else {\n        path.push(outer2);\n    }\n\n    if (isBezierCurve(inner2)) {\n        path.push(inner2.subdivide(0.5, true).reverse());\n    } else {\n        path.push(inner2);\n    }\n\n    if (isBezierCurve(inner1)) {\n        path.push(inner1.subdivide(0.5, false).reverse());\n    } else {\n        path.push(inner1);\n    }\n\n    return path;\n};\n","/**\n * Border Renderer\n *\n * Handles rendering of element borders including:\n * - Solid borders\n * - Double borders\n * - Dashed borders\n * - Dotted borders\n */\n\nimport { Color } from '../../css/types/color';\nimport { at } from '../../core/util';\nimport { asString } from '../../css/types/color-utilities';\nimport { BoundCurves } from '../bound-curves';\nimport { BORDER_STYLE } from '../../css/property-descriptors/border-style';\nimport {\n    parsePathForBorder,\n    parsePathForBorderDoubleInner,\n    parsePathForBorderDoubleOuter,\n    parsePathForBorderStroke\n} from '../border';\nimport { isBezierCurve, BezierCurve } from '../bezier-curve';\nimport { Vector } from '../vector';\nimport { Path } from '../path';\n\n/**\n * Dependencies required for BorderRenderer\n */\nexport interface BorderRendererDependencies {\n    ctx: CanvasRenderingContext2D;\n}\n\n/**\n * Path creation callbacks\n * The main CanvasRenderer retains path() and formatPath() methods,\n * so we inject them as callbacks to avoid duplication\n */\nexport interface PathCallbacks {\n    path(paths: Path[]): void;\n    formatPath(paths: Path[]): void;\n}\n\n/**\n * Border Renderer\n *\n * Specialized renderer for element borders.\n * Extracted from CanvasRenderer to improve code organization and maintainability.\n */\nexport class BorderRenderer {\n    private readonly ctx: CanvasRenderingContext2D;\n    private pathCallbacks: PathCallbacks;\n\n    constructor(deps: BorderRendererDependencies, pathCallbacks: PathCallbacks) {\n        this.ctx = deps.ctx;\n        this.pathCallbacks = pathCallbacks;\n    }\n\n    /**\n     * Render a solid border\n     *\n     * @param color - Border color\n     * @param side - Border side (0=top, 1=right, 2=bottom, 3=left)\n     * @param curvePoints - Border curve points\n     */\n    async renderSolidBorder(color: Color, side: number, curvePoints: BoundCurves): Promise<void> {\n        this.pathCallbacks.path(parsePathForBorder(curvePoints, side));\n        this.ctx.fillStyle = asString(color);\n        this.ctx.fill();\n    }\n\n    /**\n     * Render a double border\n     * Falls back to solid border if width is too small\n     *\n     * @param color - Border color\n     * @param width - Border width\n     * @param side - Border side (0=top, 1=right, 2=bottom, 3=left)\n     * @param curvePoints - Border curve points\n     */\n    async renderDoubleBorder(color: Color, width: number, side: number, curvePoints: BoundCurves): Promise<void> {\n        if (width < 3) {\n            await this.renderSolidBorder(color, side, curvePoints);\n            return;\n        }\n\n        const outerPaths = parsePathForBorderDoubleOuter(curvePoints, side);\n        this.pathCallbacks.path(outerPaths);\n        this.ctx.fillStyle = asString(color);\n        this.ctx.fill();\n        const innerPaths = parsePathForBorderDoubleInner(curvePoints, side);\n        this.pathCallbacks.path(innerPaths);\n        this.ctx.fill();\n    }\n\n    /**\n     * Render a dashed or dotted border\n     *\n     * @param color - Border color\n     * @param width - Border width\n     * @param side - Border side (0=top, 1=right, 2=bottom, 3=left)\n     * @param curvePoints - Border curve points\n     * @param style - Border style (DASHED or DOTTED)\n     */\n    async renderDashedDottedBorder(\n        color: Color,\n        width: number,\n        side: number,\n        curvePoints: BoundCurves,\n        style: BORDER_STYLE\n    ): Promise<void> {\n        this.ctx.save();\n\n        const strokePaths = parsePathForBorderStroke(curvePoints, side);\n        const boxPaths = parsePathForBorder(curvePoints, side);\n\n        if (style === BORDER_STYLE.DASHED) {\n            this.pathCallbacks.path(boxPaths);\n            this.ctx.clip();\n        }\n\n        // Extract start and end coordinates\n        let startX, startY, endX, endY;\n        if (isBezierCurve(at(boxPaths, 0))) {\n            startX = (at(boxPaths, 0) as BezierCurve).start.x;\n            startY = (at(boxPaths, 0) as BezierCurve).start.y;\n        } else {\n            startX = (at(boxPaths, 0) as Vector).x;\n            startY = (at(boxPaths, 0) as Vector).y;\n        }\n        if (isBezierCurve(at(boxPaths, 1))) {\n            endX = (at(boxPaths, 1) as BezierCurve).end.x;\n            endY = (at(boxPaths, 1) as BezierCurve).end.y;\n        } else {\n            endX = (at(boxPaths, 1) as Vector).x;\n            endY = (at(boxPaths, 1) as Vector).y;\n        }\n\n        // Calculate border length\n        let length;\n        if (side === 0 || side === 2) {\n            length = Math.abs(startX - endX);\n        } else {\n            length = Math.abs(startY - endY);\n        }\n\n        this.ctx.beginPath();\n        if (style === BORDER_STYLE.DOTTED) {\n            this.pathCallbacks.formatPath(strokePaths);\n        } else {\n            this.pathCallbacks.formatPath(boxPaths.slice(0, 2));\n        }\n\n        // Calculate dash and space lengths\n        let dashLength = width < 3 ? width * 3 : width * 2;\n        let spaceLength = width < 3 ? width * 2 : width;\n        if (style === BORDER_STYLE.DOTTED) {\n            dashLength = width;\n            spaceLength = width;\n        }\n\n        // Adjust dash pattern for border length\n        let useLineDash = true;\n        if (length <= dashLength * 2) {\n            useLineDash = false;\n        } else if (length <= dashLength * 2 + spaceLength) {\n            const multiplier = length / (2 * dashLength + spaceLength);\n            dashLength *= multiplier;\n            spaceLength *= multiplier;\n        } else {\n            const numberOfDashes = Math.floor((length + spaceLength) / (dashLength + spaceLength));\n            const minSpace = (length - numberOfDashes * dashLength) / (numberOfDashes - 1);\n            const maxSpace = (length - (numberOfDashes + 1) * dashLength) / numberOfDashes;\n            spaceLength =\n                maxSpace <= 0 || Math.abs(spaceLength - minSpace) < Math.abs(spaceLength - maxSpace)\n                    ? minSpace\n                    : maxSpace;\n        }\n\n        // Apply line dash pattern\n        if (useLineDash) {\n            if (style === BORDER_STYLE.DOTTED) {\n                this.ctx.setLineDash([0, dashLength + spaceLength]);\n            } else {\n                this.ctx.setLineDash([dashLength, spaceLength]);\n            }\n        }\n\n        // Set line style and stroke\n        if (style === BORDER_STYLE.DOTTED) {\n            this.ctx.lineCap = 'round';\n            this.ctx.lineWidth = width;\n        } else {\n            this.ctx.lineWidth = width * 2 + 1.1;\n        }\n        this.ctx.strokeStyle = asString(color);\n        this.ctx.stroke();\n        this.ctx.setLineDash([]);\n\n        // Fill dashed round edge gaps\n        if (style === BORDER_STYLE.DASHED) {\n            if (isBezierCurve(at(boxPaths, 0))) {\n                const path1 = at(boxPaths, 3) as BezierCurve;\n                const path2 = at(boxPaths, 0) as BezierCurve;\n                this.ctx.beginPath();\n                this.pathCallbacks.formatPath([\n                    new Vector(path1.end.x, path1.end.y),\n                    new Vector(path2.start.x, path2.start.y)\n                ]);\n                this.ctx.stroke();\n            }\n            if (isBezierCurve(at(boxPaths, 1))) {\n                const path1 = at(boxPaths, 1) as BezierCurve;\n                const path2 = at(boxPaths, 2) as BezierCurve;\n                this.ctx.beginPath();\n                this.pathCallbacks.formatPath([\n                    new Vector(path1.end.x, path1.end.y),\n                    new Vector(path2.start.x, path2.start.y)\n                ]);\n                this.ctx.stroke();\n            }\n        }\n\n        this.ctx.restore();\n    }\n}\n","/**\n * Border Image Renderer\n *\n * Renders CSS border-image using 9-slice scaling.\n * The source image is divided into 9 regions (4 corners, 4 edges, 1 center)\n * based on border-image-slice values, then each region is drawn to the\n * corresponding area of the element's border box.\n */\n\nimport { BorderImageSlice } from '../../css/property-descriptors/border-image-slice';\nimport { BORDER_IMAGE_REPEAT, BorderImageRepeat } from '../../css/property-descriptors/border-image-repeat';\nimport { Bounds } from '../../css/layout/bounds';\n\nexport interface BorderImageSides {\n    top: number;\n    right: number;\n    bottom: number;\n    left: number;\n}\n\n/**\n * Resolve border-image-width to per-side pixel widths. `auto` uses the\n * corresponding border width, numbers multiply it, lengths are absolute and\n * percentages refer to the border image area (width for left/right, height\n * for top/bottom).\n */\nexport const resolveBorderImageWidths = (\n    width: {\n        top: { kind: string; value?: number };\n        right: { kind: string; value?: number };\n        bottom: { kind: string; value?: number };\n        left: { kind: string; value?: number };\n    } | null,\n    borderWidths: [number, number, number, number],\n    area: Bounds\n): [number, number, number, number] => {\n    const sides = width ? [width.top, width.right, width.bottom, width.left] : null;\n    return [0, 1, 2, 3].map((i) => {\n        const side = sides ? sides[i] : null;\n        const borderWidth = borderWidths[i] ?? 0;\n        if (!side) return borderWidth;\n        if (side.kind === 'auto') return borderWidth;\n        if (side.kind === 'number') return borderWidth * (side.value ?? 1);\n        if (side.kind === 'length') return side.value ?? 0;\n        // percentage: left/right of the area width, top/bottom of its height\n        return ((side.value ?? 0) / 100) * (i === 0 || i === 2 ? area.height : area.width);\n    }) as [number, number, number, number];\n};\n\n/** Resolve border-image-outset to per-side pixel offsets (numbers multiply the border width). */\nexport const resolveBorderImageOutset = (\n    outset: {\n        top: { kind: string; value?: number };\n        right: { kind: string; value?: number };\n        bottom: { kind: string; value?: number };\n        left: { kind: string; value?: number };\n    } | null,\n    borderWidths: [number, number, number, number]\n): BorderImageSides => {\n    const sides = outset ? [outset.top, outset.right, outset.bottom, outset.left] : null;\n    const px = (i: number): number => {\n        const side = sides ? sides[i] : null;\n        if (!side) return 0;\n        if (side.kind === 'number') return (borderWidths[i] ?? 0) * (side.value ?? 0);\n        return side.value ?? 0;\n    };\n    return { top: px(0), right: px(1), bottom: px(2), left: px(3) };\n};\n\nexport class BorderImageRenderer {\n    private readonly ctx: CanvasRenderingContext2D;\n\n    constructor(ctx: CanvasRenderingContext2D) {\n        this.ctx = ctx;\n    }\n\n    renderBorderImage(\n        bounds: Bounds,\n        image: HTMLImageElement,\n        slice: BorderImageSlice,\n        repeat: BorderImageRepeat,\n        borderTopWidth: number,\n        borderRightWidth: number,\n        borderBottomWidth: number,\n        borderLeftWidth: number,\n        outset: BorderImageSides = { top: 0, right: 0, bottom: 0, left: 0 }\n    ): void {\n        // The border image area starts at the border box and grows outwards\n        // by the outset amounts.\n        bounds = bounds.add(-outset.left, -outset.top, outset.left + outset.right, outset.top + outset.bottom);\n        const imgW = image.naturalWidth || image.width;\n        const imgH = image.naturalHeight || image.height;\n        if (imgW <= 0 || imgH <= 0) {\n            return;\n        }\n\n        // Calculate source slice positions in image pixel space\n        const sT = Math.min(slice.unit === 'percent' ? (slice.top / 100) * imgH : Math.min(slice.top, imgH), imgH);\n        const sR = Math.min(slice.unit === 'percent' ? (slice.right / 100) * imgW : Math.min(slice.right, imgW), imgW);\n        const sB = Math.min(\n            slice.unit === 'percent' ? (slice.bottom / 100) * imgH : Math.min(slice.bottom, imgH),\n            imgH\n        );\n        const sL = Math.min(slice.unit === 'percent' ? (slice.left / 100) * imgW : Math.min(slice.left, imgW), imgW);\n\n        const { left, top, width, height } = bounds;\n        if (width <= 0 || height <= 0) {\n            return;\n        }\n\n        // Clamp border widths to available box dimensions\n        const dT = Math.min(borderTopWidth, height);\n        const dR = Math.min(borderRightWidth, width);\n        const dB = Math.min(borderBottomWidth, height - dT);\n        const dL = Math.min(borderLeftWidth, width - dR);\n\n        // Draw corners\n        this.drawRegion(image, 0, 0, sL, sT, left, top, dL, dT);\n        this.drawRegion(image, imgW - sR, 0, sR, sT, left + width - dR, top, dR, dT);\n        this.drawRegion(image, imgW - sR, imgH - sB, sR, sB, left + width - dR, top + height - dB, dR, dB);\n        this.drawRegion(image, 0, imgH - sB, sL, sB, left, top + height - dB, dL, dB);\n\n        // Draw edges. Tiling direction follows the edge identity (top/bottom\n        // tile horizontally, left/right vertically) — the repeat keywords in\n        // the edges array already encode that axis. Deriving the direction\n        // from the destination aspect ratio mis-tiles narrow tall boxes,\n        // whose top/bottom edges are taller than they are wide.\n        const edges: Array<{\n            sx: number;\n            sy: number;\n            sw: number;\n            sh: number;\n            dx: number;\n            dy: number;\n            dw: number;\n            dh: number;\n            repeat: BORDER_IMAGE_REPEAT;\n            horizontal: boolean;\n        }> = [\n            {\n                sx: sL,\n                sy: 0,\n                sw: imgW - sL - sR,\n                sh: sT,\n                dx: left + dL,\n                dy: top,\n                dw: width - dL - dR,\n                dh: dT,\n                repeat: repeat.horizontal,\n                horizontal: true\n            },\n            {\n                sx: imgW - sR,\n                sy: sT,\n                sw: sR,\n                sh: imgH - sT - sB,\n                dx: left + width - dR,\n                dy: top + dT,\n                dw: dR,\n                dh: height - dT - dB,\n                repeat: repeat.vertical,\n                horizontal: false\n            },\n            {\n                sx: sL,\n                sy: imgH - sB,\n                sw: imgW - sL - sR,\n                sh: sB,\n                dx: left + dL,\n                dy: top + height - dB,\n                dw: width - dL - dR,\n                dh: dB,\n                repeat: repeat.horizontal,\n                horizontal: true\n            },\n            {\n                sx: 0,\n                sy: sT,\n                sw: sL,\n                sh: imgH - sT - sB,\n                dx: left,\n                dy: top + dT,\n                dw: dL,\n                dh: height - dT - dB,\n                repeat: repeat.vertical,\n                horizontal: false\n            }\n        ];\n\n        for (const edge of edges) {\n            if (edge.sw <= 0 || edge.sh <= 0 || edge.dw <= 0 || edge.dh <= 0) continue;\n\n            if (edge.repeat === BORDER_IMAGE_REPEAT.STRETCH) {\n                this.ctx.drawImage(image, edge.sx, edge.sy, edge.sw, edge.sh, edge.dx, edge.dy, edge.dw, edge.dh);\n            } else if (edge.repeat === BORDER_IMAGE_REPEAT.REPEAT || edge.repeat === BORDER_IMAGE_REPEAT.ROUND) {\n                this.drawRepeatedEdge(image, edge, edge.horizontal, edge.repeat === BORDER_IMAGE_REPEAT.ROUND);\n            }\n        }\n\n        // Draw center if fill is specified. border-image-repeat applies to\n        // the center region too, so stretch/tile each axis per its keyword.\n        if (slice.fill) {\n            this.drawCenterRegion(\n                image,\n                { sx: sL, sy: sT, sw: imgW - sL - sR, sh: imgH - sT - sB },\n                { dx: left + dL, dy: top + dT, dw: width - dL - dR, dh: height - dT - dB },\n                repeat\n            );\n        }\n    }\n\n    private drawRegion(\n        image: HTMLImageElement,\n        sx: number,\n        sy: number,\n        sw: number,\n        sh: number,\n        dx: number,\n        dy: number,\n        dw: number,\n        dh: number\n    ): void {\n        if (sw > 0 && sh > 0 && dw > 0 && dh > 0) {\n            this.ctx.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh);\n        }\n    }\n\n    private drawRepeatedEdge(\n        image: HTMLImageElement,\n        edge: { sx: number; sy: number; sw: number; sh: number; dx: number; dy: number; dw: number; dh: number },\n        horizontal: boolean,\n        round: boolean\n    ): void {\n        const srcLength = horizontal ? edge.sw : edge.sh;\n        const tgLength = horizontal ? edge.dw : edge.dh;\n        if (srcLength <= 0 || tgLength <= 0) return;\n\n        let tileSize: number;\n        let tileCount: number;\n\n        if (round) {\n            tileCount = Math.max(1, Math.round(tgLength / srcLength));\n            tileSize = tgLength / tileCount;\n        } else {\n            tileSize = srcLength;\n            tileCount = Math.ceil(tgLength / tileSize);\n        }\n\n        // The rect clip below crops the overflowing last tile — drawing it at\n        // full size (not squeezed to the remainder) matches how browsers\n        // render `repeat`.\n        this.ctx.save();\n        this.ctx.beginPath();\n        this.ctx.rect(edge.dx, edge.dy, edge.dw, edge.dh);\n        this.ctx.clip();\n\n        for (let i = 0; i < tileCount; i++) {\n            const offset = i * tileSize;\n\n            if (horizontal) {\n                this.ctx.drawImage(\n                    image,\n                    edge.sx,\n                    edge.sy,\n                    edge.sw,\n                    edge.sh,\n                    edge.dx + offset,\n                    edge.dy,\n                    tileSize,\n                    edge.dh\n                );\n            } else {\n                this.ctx.drawImage(\n                    image,\n                    edge.sx,\n                    edge.sy,\n                    edge.sw,\n                    edge.sh,\n                    edge.dx,\n                    edge.dy + offset,\n                    edge.dw,\n                    tileSize\n                );\n            }\n        }\n\n        this.ctx.restore();\n    }\n\n    /**\n     * Draw the center region of the border image, tiling each axis per its\n     * border-image-repeat keyword (stretch spans the whole axis, repeat\n     * tiles at source size with the overflow cropped, round scales the tile\n     * to divide the axis evenly).\n     */\n    private drawCenterRegion(\n        image: HTMLImageElement,\n        src: { sx: number; sy: number; sw: number; sh: number },\n        dst: { dx: number; dy: number; dw: number; dh: number },\n        repeat: BorderImageRepeat\n    ): void {\n        if (src.sw <= 0 || src.sh <= 0 || dst.dw <= 0 || dst.dh <= 0) {\n            return;\n        }\n        const axis = (mode: BORDER_IMAGE_REPEAT, srcLen: number, dstLen: number): { size: number; count: number } => {\n            if (mode === BORDER_IMAGE_REPEAT.STRETCH) {\n                return { size: dstLen, count: 1 };\n            }\n            if (mode === BORDER_IMAGE_REPEAT.ROUND) {\n                const count = Math.max(1, Math.round(dstLen / srcLen));\n                return { size: dstLen / count, count };\n            }\n            return { size: srcLen, count: Math.max(1, Math.ceil(dstLen / srcLen)) };\n        };\n        const columns = axis(repeat.horizontal, src.sw, dst.dw);\n        const rows = axis(repeat.vertical, src.sh, dst.dh);\n\n        this.ctx.save();\n        this.ctx.beginPath();\n        this.ctx.rect(dst.dx, dst.dy, dst.dw, dst.dh);\n        this.ctx.clip();\n        for (let row = 0; row < rows.count; row++) {\n            for (let column = 0; column < columns.count; column++) {\n                this.ctx.drawImage(\n                    image,\n                    src.sx,\n                    src.sy,\n                    src.sw,\n                    src.sh,\n                    dst.dx + column * columns.size,\n                    dst.dy + row * rows.size,\n                    columns.size,\n                    rows.size\n                );\n            }\n        }\n        this.ctx.restore();\n    }\n}\n","/**\n * Scale `blur(<n>px)` radii in a ctx.filter string by the device-pixel\n * ratio. Other filter functions (brightness, saturate, …) take\n * unitless values and are unaffected.\n */\nconst BLUR_PX_RE = /blur\\((\\d+(?:\\.\\d+)?)px\\)/gi;\nconst scaleFilterBlur = (filter: string, scale: number): string =>\n    scale === 1\n        ? filter\n        : filter.replace(BLUR_PX_RE, (_match, value: string) => `blur(${parseFloat(value) * scale}px)`);\n\n/**\n * Effects Renderer\n *\n * Handles rendering effects including:\n * - Opacity effects\n * - Transform effects (matrix transformations)\n * - Clip effects (overflow / border-radius clipping via Path[])\n * - Clip-path effects (CSS clip-path shapes: inset, circle, ellipse, polygon, path)\n * - Blend effects (mix-blend-mode)\n * - Filter effects (CSS filter functions)\n */\n\nimport {\n    IElementEffect,\n    isBlendEffect,\n    isClipEffect,\n    isClipPathEffect,\n    isFilterEffect,\n    isOpacityEffect,\n    isTransformEffect\n} from '../effects';\nimport { Path } from '../path';\nimport { at } from '../../core/util';\n\n/**\n * Dependencies required for EffectsRenderer\n */\nexport interface EffectsRendererDependencies {\n    ctx: CanvasRenderingContext2D;\n    /**\n     * Device-pixel ratio of the bound context. Canvas shadow metrics\n     * (offset/blur) live in device space, unaffected by the context\n     * transform, so drop-shadow() blur must be scaled like the offsets.\n     * Defaults to 1.\n     */\n    scale?: number;\n}\n\n/**\n * Path callback for clip effects\n */\nexport interface EffectsPathCallback {\n    path(paths: Path[]): void;\n}\n\n/**\n * Effects Renderer\n *\n * Manages rendering effects stack including opacity, transforms, and clipping.\n * Extracted from CanvasRenderer to improve code organization and maintainability.\n *\n * ## Save/restore optimisation\n *\n * Canvas `save()` / `restore()` snapshot and restore the entire canvas state\n * (transform matrix, clip region, compositing mode, filter, shadow, …) which\n * is relatively expensive. The old implementation called `save()` / `restore()`\n * for every single effect unconditionally.\n *\n * This implementation does a **batch pre-scan** before applying effects:\n *\n * | Effect type        | Modifies             | Reversible?   | Needs save? |\n * |--------------------|----------------------|---------------|-------------|\n * | TransformEffect     | transform matrix     | ❌ irreversible | **YES**     |\n * | ClipEffect         | clip region          | ❌ cumulative   | **YES**     |\n * | ClipPathEffect     | clip region          | ❌ cumulative   | **YES**     |\n * | OpacityEffect      | globalAlpha          | ✅ scalar       | NO          |\n * | BlendEffect        | globalCompositeOp    | ✅ scalar       | NO          |\n * | FilterEffect       | filter + shadow      | ✅ string+vec   | NO          |\n *\n * When the batch contains *only* lightweight effects (opacity / blend / filter)\n * we skip `save()` entirely and manually reset properties on pop.\n *\n * When the batch contains at least one heavyweight effect (transform / clip /\n * clip-path) we call `save()` **once** before the first heavyweight effect and\n * `restore()` **once** when that effect is popped.\n */\nexport class EffectsRenderer {\n    private readonly ctx: CanvasRenderingContext2D;\n    private readonly pathCallback: EffectsPathCallback;\n    private readonly scale: number;\n    private readonly activeEffects: IElementEffect[] = [];\n    /** Whether a canvas state save was performed for the current batch. */\n    private didSave = false;\n    /** Index (0-based, from start of activeEffects array) of the last\n     *  heavyweight effect in the batch — the one whose pop triggers\n     *  restore(). Set to -1 when no save was performed. */\n    private saveAtDepth = -1;\n\n    constructor(deps: EffectsRendererDependencies, pathCallback: EffectsPathCallback) {\n        this.ctx = deps.ctx;\n        this.pathCallback = pathCallback;\n        this.scale = deps.scale ?? 1;\n    }\n\n    /**\n     * Apply multiple effects.\n     * Clears existing effects and applies new ones.\n     */\n    applyEffects(effects: IElementEffect[]): void {\n        // ── 1. Pop all previously active effects ──────────────────────\n        while (this.activeEffects.length) {\n            this.popEffect();\n        }\n\n        // ── 2. Determine whether to save canvas state ─────────────────\n        this.didSave = false;\n        this.saveAtDepth = -1;\n\n        const isHeavy = (e: IElementEffect) => isTransformEffect(e) || isClipEffect(e) || isClipPathEffect(e);\n\n        // Pre-compute the index of the *last* heavyweight effect so pop\n        // can reliably match it regardless of how many heavyweight effects\n        // are in the batch (the save was issued before the first, but the\n        // restore must happen when the LAST heavyweight is popped).\n        const lastHeavyIdx = effects.reduceRight<number>(\n            (found, e, idx) => (found !== -1 ? found : isHeavy(e) ? idx : -1),\n            -1\n        );\n\n        // ── 3. Apply each effect ──────────────────────────────────────\n        for (let i = 0; i < effects.length; i++) {\n            const effect = at(effects, i);\n            if (isHeavy(effect)) {\n                if (!this.didSave) {\n                    this.ctx.save();\n                    this.didSave = true;\n                }\n                if (i === lastHeavyIdx) {\n                    this.saveAtDepth = this.activeEffects.length;\n                }\n            }\n            this.applyEffect(effect);\n        }\n    }\n\n    /**\n     * Apply a single effect (called internally by applyEffects).\n     */\n    private applyEffect(effect: IElementEffect): void {\n        if (isTransformEffect(effect)) {\n            this.ctx.translate(effect.offsetX, effect.offsetY);\n            this.ctx.transform(\n                effect.matrix[0],\n                effect.matrix[1],\n                effect.matrix[2],\n                effect.matrix[3],\n                effect.matrix[4],\n                effect.matrix[5]\n            );\n            this.ctx.translate(-effect.offsetX, -effect.offsetY);\n        } else if (isClipEffect(effect)) {\n            this.pathCallback.path(effect.path);\n            this.ctx.clip();\n        } else if (isClipPathEffect(effect)) {\n            effect.applyClip(this.ctx);\n        } else if (isOpacityEffect(effect)) {\n            // Multiply into current globalAlpha so nested opacity works\n            // without save/restore overhead.\n            this.ctx.globalAlpha *= effect.opacity;\n        } else if (isBlendEffect(effect)) {\n            this.ctx.globalCompositeOperation = effect.compositeOperation;\n        } else if (isFilterEffect(effect)) {\n            // drop-shadow() is rendered via ctx.shadow* to avoid canvas\n            // taint; remaining filters go through ctx.filter. Filter\n            // lengths are applied in device space (unaffected by the\n            // context transform — verified in Chromium), so blur radii\n            // must be scaled like the shadow metrics below.\n            this.ctx.filter = scaleFilterBlur(effect.safeFilterString, this.scale) || 'none';\n\n            if (effect.shadow) {\n                this.ctx.shadowOffsetX = effect.shadow.offsetX * this.scale;\n                this.ctx.shadowOffsetY = effect.shadow.offsetY * this.scale;\n                this.ctx.shadowBlur = effect.shadow.blur * this.scale;\n                this.ctx.shadowColor = effect.shadow.color;\n            }\n        }\n\n        this.activeEffects.push(effect);\n    }\n\n    /**\n     * Remove the most recent effect.\n     * Restores canvas state if needed.\n     */\n    private popEffect(): void {\n        if (this.activeEffects.length === 0) return;\n\n        // If the effect being popped is the one that triggered the save,\n        // restore the canvas state now.\n        if (this.didSave && this.activeEffects.length - 1 === this.saveAtDepth) {\n            this.ctx.restore();\n            this.didSave = false;\n            this.saveAtDepth = -1;\n        }\n\n        this.activeEffects.pop();\n\n        // If the batch had ONLY lightweight effects (no save was performed),\n        // reset properties to their defaults. We only do this when all effects\n        // have been popped (activeEffects is empty), so properties don't\n        // flip mid-batch.\n        if (!this.didSave && this.activeEffects.length === 0) {\n            this.ctx.globalAlpha = 1;\n            this.ctx.globalCompositeOperation = 'source-over';\n            this.ctx.filter = 'none';\n            this.ctx.shadowOffsetX = 0;\n            this.ctx.shadowOffsetY = 0;\n            this.ctx.shadowBlur = 0;\n            this.ctx.shadowColor = 'rgba(0, 0, 0, 0)';\n        }\n    }\n\n    /**\n     * Get the current number of active effects.\n     */\n    getActiveEffectCount(): number {\n        return this.activeEffects.length;\n    }\n\n    /**\n     * Check if there are any active effects.\n     */\n    hasActiveEffects(): boolean {\n        return this.activeEffects.length > 0;\n    }\n}\n","/**\n * Mask Renderer\n *\n * Paints CSS mask-image layers into a mask surface (alpha mask) which the\n * caller composites onto the element surface via `destination-in`.\n *\n * Value grammars are shared with background-image (position/size/repeat), so\n * the layer maths mirrors the background renderer but works in the local\n * coordinate space of the mask positioning area (default: border box) and\n * always fills the whole area — a mask surface is about alpha coverage, not\n * about what is visible underneath.\n *\n * Gradient layers share the rasterisation primitives of the background\n * renderer (gradient-rasterizer.ts): repeating gradients stack their stop\n * cycles, and the area beyond a radial gradient's ending shape keeps the\n * last stop's colour. Limitations (v1): mask-mode is alpha-only; layers\n * composite with source-over (≈ the spec-default `add`).\n */\n\nimport {\n    CSSConicGradientImage,\n    CSSImageType,\n    CSSLinearGradientImage,\n    CSSRadialGradientImage,\n    CSSURLImage,\n    ICSSImage,\n    isRadialGradient,\n    isRepeatingRadialGradient\n} from '../../css/types/image';\nimport { calculateGradientDirection, calculateRadius, processColorStops } from '../../css/types/functions/gradient';\nimport {\n    FIFTY_PERCENT,\n    getAbsoluteValue,\n    isLengthPercentage,\n    LengthPercentage\n} from '../../css/types/length-percentage';\nimport { isIdentToken } from '../../css/syntax/parser';\nimport { BACKGROUND_REPEAT } from '../../css/property-descriptors/background-repeat';\nimport { BACKGROUND_SIZE, BackgroundSizeInfo } from '../../css/property-descriptors/background-size';\nimport { asString } from '../../css/types/color-utilities';\nimport { at } from '../../core/util';\nimport { rasterizeRadialGradient, stackRepeatingStops, toCanvasStops } from './gradient-rasterizer';\n\n/**\n * CSS layer lists cycle: a single mask-size applies to every mask-image\n * layer, so index access must wrap instead of throwing.\n */\nconst valueForIndex = <T>(values: T[], index: number): T | undefined =>\n    values.length === 0 ? undefined : (values[index % values.length] ?? values[0]);\n\nexport interface MaskLayerStyles {\n    maskPosition: LengthPercentage[][];\n    maskRepeat: BACKGROUND_REPEAT[];\n    maskSize: BackgroundSizeInfo[][];\n}\n\nexport interface MaskArea {\n    left: number;\n    top: number;\n    width: number;\n    height: number;\n}\n\nexport type MaskImageSource = HTMLImageElement | HTMLCanvasElement;\n\n/**\n * Resolve one mask-size declaration to concrete pixel width/height.\n * `auto` keeps the image's intrinsic ratio; gradients default to 100%.\n */\nconst resolveLayerSize = (\n    size: BackgroundSizeInfo[] | undefined,\n    area: MaskArea,\n    naturalWidth: number,\n    naturalHeight: number\n): { width: number; height: number } => {\n    const first = size ? size[0] : undefined;\n    const second = size && size.length > 1 ? at(size, 1) : undefined;\n\n    const keyword = (value: BackgroundSizeInfo | undefined): string | null =>\n        value !== undefined && isIdentToken(value) ? value.value : null;\n\n    const resolve = (value: BackgroundSizeInfo | undefined, extent: number, natural: number): number | null => {\n        if (value === undefined || isIdentToken(value)) return null; // auto keywords keep the ratio\n        if (isLengthPercentage(value)) return getAbsoluteValue(value, extent);\n        return natural;\n    };\n\n    const firstKeyword = keyword(first);\n    if (firstKeyword === BACKGROUND_SIZE.CONTAIN || firstKeyword === BACKGROUND_SIZE.COVER) {\n        const scale =\n            firstKeyword === BACKGROUND_SIZE.CONTAIN\n                ? Math.min(area.width / naturalWidth, area.height / naturalHeight)\n                : Math.max(area.width / naturalWidth, area.height / naturalHeight);\n        return { width: naturalWidth * scale, height: naturalHeight * scale };\n    }\n\n    let width = resolve(first, area.width, naturalWidth);\n    let height = resolve(second, area.height, naturalHeight);\n    if (width === null && height === null) {\n        // auto auto (or no declaration): the image's intrinsic size.\n        width = naturalWidth;\n        height = naturalHeight;\n    } else if (width === null) {\n        width = (naturalWidth / naturalHeight) * (height as number);\n    } else if (height === null) {\n        height = (naturalHeight / naturalWidth) * width;\n    }\n    return { width: width as number, height: height as number };\n};\n\n/** Draw one URL layer with mask-repeat tiling. */\nconst paintUrlLayer = (\n    ctx: CanvasRenderingContext2D,\n    image: MaskImageSource,\n    styles: MaskLayerStyles,\n    index: number,\n    area: MaskArea\n): void => {\n    const naturalWidth = (image as HTMLImageElement).naturalWidth || image.width || area.width;\n    const naturalHeight = (image as HTMLImageElement).naturalHeight || image.height || area.height;\n    const { width: drawWidth, height: drawHeight } = resolveLayerSize(\n        valueForIndex(styles.maskSize, index),\n        area,\n        naturalWidth,\n        naturalHeight\n    );\n\n    // The first tile is placed by mask-position (percentages resolve against\n    // the leftover space, matching background-position).\n    const position = valueForIndex(styles.maskPosition, index) ?? [];\n    const offsetX = area.left + getAbsoluteValue(at(position, 0), area.width - drawWidth);\n    const offsetY = area.top + getAbsoluteValue(at(position, position.length - 1), area.height - drawHeight);\n\n    const repeat = valueForIndex(styles.maskRepeat, index) ?? BACKGROUND_REPEAT.REPEAT;\n    const repeatsX = repeat === BACKGROUND_REPEAT.REPEAT || repeat === BACKGROUND_REPEAT.REPEAT_X;\n    const repeatsY = repeat === BACKGROUND_REPEAT.REPEAT || repeat === BACKGROUND_REPEAT.REPEAT_Y;\n    const tilesBeforeX = repeatsX ? Math.ceil((offsetX - area.left) / drawWidth) : 0;\n    const tilesBeforeY = repeatsY ? Math.ceil((offsetY - area.top) / drawHeight) : 0;\n    const tilesAfterX = repeatsX ? Math.ceil((area.left + area.width - offsetX) / drawWidth) : 0;\n    const tilesAfterY = repeatsY ? Math.ceil((area.top + area.height - offsetY) / drawHeight) : 0;\n\n    for (let ty = -tilesBeforeY; ty <= tilesAfterY; ty++) {\n        for (let tx = -tilesBeforeX; tx <= tilesAfterX; tx++) {\n            ctx.drawImage(image, offsetX + tx * drawWidth, offsetY + ty * drawHeight, drawWidth, drawHeight);\n        }\n    }\n};\n\n/** Draw one radial-gradient layer (ellipse rasterised via the scaled-circle trick). */\nconst paintRadialLayer = (ctx: CanvasRenderingContext2D, layer: CSSRadialGradientImage, area: MaskArea): void => {\n    const { width, height } = area;\n    const position = layer.position.length === 0 ? [FIFTY_PERCENT] : layer.position;\n    const cx = getAbsoluteValue(at(position, 0), width);\n    const cy = getAbsoluteValue(at(position, position.length - 1), height);\n    let [rx, ry] = calculateRadius(layer, cx, cy, width, height);\n    rx = Math.max(rx, 0.01);\n    ry = Math.max(ry, 0.01);\n\n    const ownerDocument = ctx.canvas.ownerDocument ?? document;\n    // Shared ellipse rasteriser keeps the stop line length (rx), the\n    // pre-scale fill coverage and the repeating stop stacking in one place.\n    const rasterized = rasterizeRadialGradient(ownerDocument, rx, ry, layer.stops, isRepeatingRadialGradient(layer));\n    if (!rasterized) {\n        return;\n    }\n    // Outside the ending shape the gradient continues with its last colour —\n    // for a mask that means the whole positioning area keeps that alpha, not\n    // just the ellipse's bounding box.\n    ctx.fillStyle = rasterized.lastColor;\n    ctx.fillRect(area.left, area.top, area.width, area.height);\n    ctx.drawImage(rasterized.canvas, area.left + cx - rx, area.top + cy - ry, rx * 2, ry * 2);\n};\n\n/** Draw one gradient layer filling the whole mask area. */\nconst paintGradientLayer = (ctx: CanvasRenderingContext2D, layer: ICSSImage, area: MaskArea): void => {\n    const { width, height } = area;\n    if (width <= 0 || height <= 0) return;\n\n    if (isRadialGradient(layer) || isRepeatingRadialGradient(layer)) {\n        paintRadialLayer(ctx, layer as CSSRadialGradientImage, area);\n        return;\n    }\n\n    let gradient: CanvasGradient | null = null;\n    if (layer.type === CSSImageType.LINEAR_GRADIENT || layer.type === CSSImageType.REPEATING_LINEAR_GRADIENT) {\n        const linear = layer as CSSLinearGradientImage;\n        // calculateGradientDirection returns [lineLength, x0, x1, y0, y1] in\n        // area-local coordinates; the gradient line must be offset into the\n        // same page-coordinate space the fillRect below uses.\n        const [lineLength, lx0, lx1, ly0, ly1] = calculateGradientDirection(linear.angle || 0, width, height);\n        const processed = processColorStops(linear.stops, lineLength || 1);\n        if (layer.type === CSSImageType.REPEATING_LINEAR_GRADIENT) {\n            const stacked = stackRepeatingStops(processed);\n            if (!stacked) {\n                // Degenerate period: the last colour covers the whole area.\n                ctx.fillStyle = asString(at(processed, processed.length - 1).color);\n                ctx.fillRect(area.left, area.top, width, height);\n                return;\n            }\n            gradient = ctx.createLinearGradient(area.left + lx0, area.top + ly0, area.left + lx1, area.top + ly1);\n            stacked.forEach((s) => gradient!.addColorStop(Math.min(1, Math.max(0, s.stop)), s.color));\n        } else {\n            gradient = ctx.createLinearGradient(area.left + lx0, area.top + ly0, area.left + lx1, area.top + ly1);\n            toCanvasStops(processed).forEach((s) => gradient!.addColorStop(s.stop, s.color));\n        }\n    } else if (layer.type === CSSImageType.CONIC_GRADIENT || layer.type === CSSImageType.REPEATING_CONIC_GRADIENT) {\n        const conic = layer as CSSConicGradientImage;\n        const processed = processColorStops(conic.stops, 1);\n        const repeating = layer.type === CSSImageType.REPEATING_CONIC_GRADIENT;\n        if (repeating && !stackRepeatingStops(processed)) {\n            // Degenerate period: the last colour covers the whole area.\n            ctx.fillStyle = asString(at(processed, processed.length - 1).color);\n            ctx.fillRect(area.left, area.top, width, height);\n            return;\n        }\n        // Canvas conic starts at 3 o'clock, CSS `from 0deg` at 12 o'clock.\n        gradient = ctx.createConicGradient(conic.angle - Math.PI / 2, area.left + width / 2, area.top + height / 2);\n        const stops = (repeating ? stackRepeatingStops(processed) : null) ?? toCanvasStops(processed);\n        stops.forEach((s) => gradient!.addColorStop(Math.min(1, Math.max(0, s.stop)), s.color));\n    }\n\n    if (gradient) {\n        ctx.fillStyle = gradient;\n        ctx.fillRect(area.left, area.top, width, height);\n    }\n};\n\n/**\n * Paint every mask layer into `ctx` (expected to already be scaled to device\n * pixels and translated so the page origin maps correctly).\n */\nexport const paintMaskLayers = async (\n    ctx: CanvasRenderingContext2D,\n    layers: ICSSImage[],\n    styles: MaskLayerStyles,\n    area: MaskArea,\n    matchImage: (url: string) => Promise<MaskImageSource | undefined>\n): Promise<void> => {\n    // First layer is the topmost; paint order is irrelevant for an additive\n    // alpha mask, but keep spec order (first = top).\n    for (let i = 0; i < layers.length; i++) {\n        const layer = at(layers, i);\n        if (layer.type === CSSImageType.URL) {\n            const image = await matchImage((layer as CSSURLImage).url);\n            if (image) {\n                paintUrlLayer(ctx, image, styles, i, area);\n            }\n        } else {\n            paintGradientLayer(ctx, layer, area);\n        }\n    }\n};\n","import { OBJECT_FIT, ObjectFit } from '../css/property-descriptors/object-fit';\nimport { LengthPercentage, getAbsoluteValue } from '../css/types/length-percentage';\n\nexport interface ObjectFitBox {\n    left: number;\n    top: number;\n    width: number;\n    height: number;\n}\n\nexport interface ObjectFitRendering {\n    sx: number;\n    sy: number;\n    sw: number;\n    sh: number;\n    dx: number;\n    dy: number;\n    dw: number;\n    dh: number;\n}\n\nexport const calculateObjectFitRendering = (\n    intrinsicWidth: number,\n    intrinsicHeight: number,\n    box: ObjectFitBox,\n    objectFit: ObjectFit,\n    objectPosition?: [LengthPercentage, LengthPercentage]\n): ObjectFitRendering => {\n    let sx = 0;\n    let sy = 0;\n    let sw = intrinsicWidth;\n    let sh = intrinsicHeight;\n    let dx = box.left;\n    let dy = box.top;\n    let dw = box.width;\n    let dh = box.height;\n\n    const boxRatio = dw / dh;\n    const imgRatio = sw / sh;\n\n    // Resolve object-position offsets (default: 50% 50% = center)\n    const posX = objectPosition ? getAbsoluteValue(objectPosition[0], 1) : 0.5;\n    const posY = objectPosition ? getAbsoluteValue(objectPosition[1], 1) : 0.5;\n\n    if (objectFit === OBJECT_FIT.CONTAIN) {\n        if (imgRatio > boxRatio) {\n            dh = dw / imgRatio;\n            dy += (box.height - dh) * posY;\n        } else {\n            dw = dh * imgRatio;\n            dx += (box.width - dw) * posX;\n        }\n    } else if (objectFit === OBJECT_FIT.COVER) {\n        if (imgRatio > boxRatio) {\n            sw = sh * boxRatio;\n            sx += (intrinsicWidth - sw) * posX;\n        } else {\n            sh = sw / boxRatio;\n            sy += (intrinsicHeight - sh) * posY;\n        }\n    } else if (objectFit === OBJECT_FIT.NONE) {\n        if (sw > dw) {\n            sx += (sw - dw) * posX;\n            sw = dw;\n        } else {\n            dx += (dw - sw) * posX;\n            dw = sw;\n        }\n        if (sh > dh) {\n            sy += (sh - dh) * posY;\n            sh = dh;\n        } else {\n            dy += (dh - sh) * posY;\n            dh = sh;\n        }\n    } else if (objectFit === OBJECT_FIT.SCALE_DOWN) {\n        // CSS object-fit: scale-down sizes the content as if `none` or\n        // `contain` were specified, whichever yields the smaller concrete\n        // object size. Compare the rendered areas (contain fits inside the\n        // box; none is the intrinsic size clipped to the box); exact ties\n        // keep `none`.\n        const containW = imgRatio > boxRatio ? dw : dh * imgRatio;\n        const containH = imgRatio > boxRatio ? dw / imgRatio : dh;\n        const noneW = Math.min(sw, dw);\n        const noneH = Math.min(sh, dh);\n        if (containW * containH < noneW * noneH) {\n            if (imgRatio > boxRatio) {\n                dh = dw / imgRatio;\n                dy += (box.height - dh) * posY;\n            } else {\n                dw = dh * imgRatio;\n                dx += (box.width - dw) * posX;\n            }\n        } else {\n            if (sw > dw) {\n                sx += (sw - dw) * posX;\n                sw = dw;\n            } else {\n                dx += (dw - sw) * posX;\n                dw = sw;\n            }\n            if (sh > dh) {\n                sy += (sh - dh) * posY;\n                sh = dh;\n            } else {\n                dy += (dh - sh) * posY;\n                dh = sh;\n            }\n        }\n    }\n\n    return { sx, sy, sw, sh, dx, dy, dw, dh };\n};\n","import { ElementPaint } from '../stacking-context';\nimport { asString } from '../../css/types/color-utilities';\nimport { ImageElementContainer } from '../../dom/replaced-elements/image-element-container';\nimport { CanvasElementContainer } from '../../dom/replaced-elements/canvas-element-container';\nimport { SVGElementContainer } from '../../dom/replaced-elements/svg-element-container';\nimport { IFrameElementContainer } from '../../dom/replaced-elements/iframe-element-container';\nimport { ReplacedElementContainer } from '../../dom/replaced-elements';\nimport {\n    InputElementContainer,\n    CHECKBOX,\n    RADIO,\n    INPUT_COLOR,\n    PLACEHOLDER_COLOR\n} from '../../dom/replaced-elements/input-element-container';\nimport { TextareaElementContainer } from '../../dom/elements/textarea-element-container';\nimport { SelectElementContainer } from '../../dom/elements/select-element-container';\nimport { ElementContainer } from '../../dom/element-container';\nimport { Bounds } from '../../css/layout/bounds';\nimport { BoundCurves } from '../bound-curves';\nimport { TextBounds } from '../../css/layout/text';\nimport { Vector } from '../vector';\nimport { contentBox, paddingBox } from '../box-sizing';\nimport { Context } from '../../core/context';\nimport { TextRenderer } from './text-renderer';\nimport { measureFontMetrics } from './font-utils';\nimport { IMAGE_RENDERING } from '../../css/property-descriptors/image-rendering';\nimport { TEXT_ALIGN } from '../../css/property-descriptors/text-align';\nimport { DISPLAY } from '../../css/property-descriptors/display';\nimport { LIST_STYLE_TYPE } from '../../css/property-descriptors/list-style-type';\nimport { CSSImageType, CSSURLImage } from '../../css/types/image';\nimport { getAbsoluteValue } from '../../css/types/length-percentage';\nimport { computeLineHeight } from '../../css/property-descriptors/line-height';\nimport { WHITE_SPACE } from '../../css/property-descriptors/white-space';\nimport { contains } from '../../core/bitwise';\nimport { Color } from '../../css/types/color';\nimport { CSSParsedDeclaration } from '../../css/index';\n\n/**\n * Factory type for creating an iframe canvas renderer — avoids circular import\n * from canvas-renderer.ts which in turn imports content-renderer.ts.\n */\ntype IframeRendererFactory = (\n    context: Context,\n    options: { scale: number; backgroundColor: Color | null; x: number; y: number; width: number; height: number }\n) => { render: (element: ElementContainer) => Promise<HTMLCanvasElement> };\n\n/**\n * Render replaced elements: Image, Canvas, SVG, IFrame.\n */\nexport async function renderReplacedElements(\n    ctx: CanvasRenderingContext2D,\n    context: Context,\n    options: { scale: number; backgroundColor: Color | null; x: number; y: number; width: number; height: number },\n    iframeRendererFactory: IframeRendererFactory,\n    container: ElementContainer,\n    curves: BoundCurves,\n    styles: CSSParsedDeclaration,\n    renderReplacedElementFn: (\n        container: ReplacedElementContainer,\n        curves: BoundCurves,\n        image: HTMLImageElement | HTMLCanvasElement\n    ) => void\n): Promise<void> {\n    if (container instanceof ImageElementContainer) {\n        try {\n            const image = await context.cache.match(container.src);\n\n            const prevSmoothing = ctx.imageSmoothingEnabled;\n            if (\n                styles.imageRendering === IMAGE_RENDERING.PIXELATED ||\n                styles.imageRendering === IMAGE_RENDERING.CRISP_EDGES\n            ) {\n                ctx.imageSmoothingEnabled = false;\n            } else if (styles.imageRendering === IMAGE_RENDERING.SMOOTH) {\n                ctx.imageSmoothingEnabled = true;\n            }\n\n            renderReplacedElementFn(container, curves, image!);\n            ctx.imageSmoothingEnabled = prevSmoothing;\n        } catch (e) {\n            // Load failures are reported to onError once, by the cache.\n            context.logger.error(`Error loading image ${container.src}`);\n        }\n    }\n\n    if (container instanceof CanvasElementContainer) {\n        renderReplacedElementFn(container, curves, container.canvas);\n    }\n\n    if (container instanceof SVGElementContainer) {\n        try {\n            const image = await context.cache.match(container.svg);\n            renderReplacedElementFn(container, curves, image!);\n        } catch (e) {\n            // Load failures are reported to onError once, by the cache.\n            context.logger.error(`Error loading svg ${container.svg.substring(0, 255)}`);\n        }\n    }\n\n    if (container instanceof IFrameElementContainer && container.tree) {\n        const iframeRenderer = iframeRendererFactory(context, {\n            scale: options.scale,\n            backgroundColor: container.backgroundColor,\n            x: 0,\n            y: 0,\n            width: container.width,\n            height: container.height\n        });\n\n        const canvas = await iframeRenderer.render(container.tree);\n        if (container.width && container.height) {\n            ctx.drawImage(\n                canvas,\n                0,\n                0,\n                container.width,\n                container.height,\n                container.bounds.left,\n                container.bounds.top,\n                container.bounds.width,\n                container.bounds.height\n            );\n        }\n    }\n}\n\n/**\n * Render form element content: checkbox, radio, text input.\n */\nexport function renderFormElements(\n    ctx: CanvasRenderingContext2D,\n    textRenderer: TextRenderer,\n    pathFn: (paths: Vector[]) => void,\n    container: ElementContainer,\n    styles: CSSParsedDeclaration\n): void {\n    if (container instanceof InputElementContainer) {\n        const size = Math.min(container.bounds.width, container.bounds.height);\n\n        if (container.type === CHECKBOX && container.checked) {\n            ctx.save();\n            pathFn([\n                new Vector(container.bounds.left + size * 0.39363, container.bounds.top + size * 0.79),\n                new Vector(container.bounds.left + size * 0.16, container.bounds.top + size * 0.5549),\n                new Vector(container.bounds.left + size * 0.27347, container.bounds.top + size * 0.44071),\n                new Vector(container.bounds.left + size * 0.39694, container.bounds.top + size * 0.5649),\n                new Vector(container.bounds.left + size * 0.72983, container.bounds.top + size * 0.23),\n                new Vector(container.bounds.left + size * 0.84, container.bounds.top + size * 0.34085),\n                new Vector(container.bounds.left + size * 0.39363, container.bounds.top + size * 0.79)\n            ]);\n            ctx.fillStyle = asString(container.styles.accentColor ?? INPUT_COLOR);\n            ctx.fill();\n            ctx.restore();\n        } else if (container.type === RADIO && container.checked) {\n            ctx.save();\n            ctx.beginPath();\n            ctx.arc(container.bounds.left + size / 2, container.bounds.top + size / 2, size / 4, 0, Math.PI * 2, true);\n            ctx.fillStyle = asString(container.styles.accentColor ?? INPUT_COLOR);\n            ctx.fill();\n            ctx.restore();\n        }\n    }\n\n    if (isTextInputElement(container) && container.value.length) {\n        const [font] = textRenderer.createFontStyle(styles);\n        // Use Canvas API to measure baseline from the actual rendered font\n        ctx.font = font ?? '';\n        const fontSizeValue = getAbsoluteValue(styles.fontSize, 0);\n        const { baseline, height: fontHeight } = measureFontMetrics(ctx, fontSizeValue);\n        const isPlaceholder = container instanceof InputElementContainer && container.isPlaceholder;\n        ctx.fillStyle = isPlaceholder ? asString(PLACEHOLDER_COLOR) : asString(styles.color);\n        ctx.textBaseline = 'alphabetic';\n        ctx.textAlign = canvasTextAlign(container.styles.textAlign);\n\n        const bounds = contentBox(container);\n        const clipBounds =\n            container instanceof InputElementContainer\n                ? inputTextClipBounds(bounds, paddingBox(container), fontHeight)\n                : bounds;\n        let x = 0;\n        switch (container.styles.textAlign) {\n            case TEXT_ALIGN.CENTER:\n                x += bounds.width / 2;\n                break;\n            case TEXT_ALIGN.RIGHT:\n                x += bounds.width;\n                break;\n        }\n\n        let verticalOffset = 0;\n        if (container instanceof InputElementContainer) {\n            verticalOffset = (bounds.height - fontHeight) / 2;\n        }\n\n        const textBounds = bounds.add(x, verticalOffset, 0, 0);\n\n        ctx.save();\n        pathFn([\n            new Vector(clipBounds.left, clipBounds.top),\n            new Vector(clipBounds.left + clipBounds.width, clipBounds.top),\n            new Vector(clipBounds.left + clipBounds.width, clipBounds.top + clipBounds.height),\n            new Vector(clipBounds.left, clipBounds.top + clipBounds.height)\n        ]);\n        ctx.clip();\n\n        // A <textarea> soft-wraps its value at the element width (unless\n        // white-space is `pre`/`nowrap`, e.g. wrap=\"off\"); text inputs are\n        // single-line. Render textareas line-by-line so long values wrap\n        // instead of being clipped on one line (issue #228).\n        const lines = wrapTextToWidth(\n            ctx,\n            container.value,\n            bounds.width,\n            styles.whiteSpace === WHITE_SPACE.PRE || styles.whiteSpace === WHITE_SPACE.NOWRAP\n        );\n        const lineHeight = computeLineHeight(styles.lineHeight, fontSizeValue);\n\n        lines.forEach((line, index) => {\n            let lineX = textBounds.left;\n            const lineWidth = ctx.measureText(line).width;\n            switch (styles.textAlign) {\n                case TEXT_ALIGN.CENTER:\n                    lineX += (bounds.width - lineWidth) / 2;\n                    break;\n                case TEXT_ALIGN.RIGHT:\n                    lineX += bounds.width - lineWidth;\n                    break;\n            }\n            const lineBounds = new Bounds(lineX, textBounds.top + index * lineHeight, 0, 0);\n            textRenderer.renderTextWithLetterSpacing(\n                new TextBounds(line, lineBounds),\n                styles.letterSpacing,\n                baseline,\n                styles.writingMode\n            );\n        });\n        ctx.restore();\n        ctx.textBaseline = 'alphabetic';\n        ctx.textAlign = 'left';\n    }\n}\n\n/**\n * Native single-line inputs may paint value text into their padding area when\n * fixed height and vertical padding leave a content box shorter than the font.\n * Preserve the content box horizontally, but avoid clipping those glyphs to the\n * collapsed vertical content box.\n * @internal exported for testing\n */\nexport const inputTextClipBounds = (contentBounds: Bounds, inputPaddingBox: Bounds, fontHeight: number): Bounds =>\n    contentBounds.height < fontHeight\n        ? new Bounds(contentBounds.left, inputPaddingBox.top, contentBounds.width, inputPaddingBox.height)\n        : contentBounds;\n\n/**\n * Split text into lines that fit the given pixel width, preserving hard line\n * breaks and (when wrapping is enabled) breaking at word boundaries — mirroring\n * how a <textarea> lays out its value.\n * @internal exported for testing\n */\nexport const wrapTextToWidth = (\n    ctx: CanvasRenderingContext2D,\n    text: string,\n    maxWidth: number,\n    noWrap: boolean\n): string[] => {\n    const lines: string[] = [];\n    const paragraphs = text.split('\\n');\n    for (const paragraph of paragraphs) {\n        if (noWrap) {\n            lines.push(paragraph);\n            continue;\n        }\n        const words = paragraph.split(/(\\s+)/);\n        let line = '';\n        for (const word of words) {\n            const candidate = line + word;\n            if (ctx.measureText(candidate).width <= maxWidth || line === '') {\n                line = candidate;\n            } else {\n                lines.push(line);\n                line = word;\n            }\n        }\n        lines.push(line);\n    }\n    return lines;\n};\n\n/**\n * Render list-item marker (image or text).\n */\nexport async function renderListMarker(\n    ctx: CanvasRenderingContext2D,\n    context: Context,\n    textRenderer: TextRenderer,\n    paint: ElementPaint,\n    container: ElementContainer,\n    styles: CSSParsedDeclaration\n): Promise<void> {\n    if (!contains(container.styles.display, DISPLAY.LIST_ITEM)) {\n        return;\n    }\n\n    if (container.styles.listStyleImage !== null) {\n        const img = container.styles.listStyleImage;\n        if (img.type === CSSImageType.URL) {\n            const url = (img as CSSURLImage).url;\n            try {\n                const image = await context.cache.match(url);\n                // Browsers contain the image inside a 1em marker box and\n                // centre it on the first line's midline — matching the\n                // geometric markers below.\n                const fontSize = getAbsoluteValue(styles.fontSize, 0);\n                const naturalWidth = (image as HTMLImageElement)?.naturalWidth || image!.width;\n                const naturalHeight = (image as HTMLImageElement)?.naturalHeight || image!.height;\n                if (naturalWidth <= 0 || naturalHeight <= 0) {\n                    return;\n                }\n                const markerScale = Math.min(fontSize / naturalWidth, fontSize / naturalHeight);\n                const markerWidth = naturalWidth * markerScale;\n                const markerHeight = naturalHeight * markerScale;\n                const markerCenterY =\n                    container.bounds.top +\n                    getAbsoluteValue(container.styles.paddingTop, container.bounds.width) +\n                    computeLineHeight(styles.lineHeight, styles.fontSize.number) / 2;\n                ctx.drawImage(\n                    image!,\n                    container.bounds.left - (markerWidth + 10),\n                    markerCenterY - markerHeight / 2,\n                    markerWidth,\n                    markerHeight\n                );\n            } catch (e) {\n                // Load failures are reported to onError once, by the cache.\n                context.logger.error(`Error loading list-style-image ${url}`);\n            }\n        }\n    } else if (paint.listValue && container.styles.listStyleType !== LIST_STYLE_TYPE.NONE) {\n        // Geometric markers (disc / circle / square) are drawn as shapes:\n        // rendering them as text glyphs relies on the font's bullet glyph,\n        // which is far smaller than the browser's marker (~0.36em circle).\n        const type = container.styles.listStyleType;\n        if (type === LIST_STYLE_TYPE.DISC || type === LIST_STYLE_TYPE.CIRCLE || type === LIST_STYLE_TYPE.SQUARE) {\n            const size = styles.fontSize.number * 0.45;\n            const cx = container.bounds.left - size * 0.9;\n            const cy =\n                container.bounds.top +\n                getAbsoluteValue(container.styles.paddingTop, container.bounds.width) +\n                computeLineHeight(styles.lineHeight, styles.fontSize.number) / 2;\n            ctx.save();\n            ctx.fillStyle = asString(styles.color);\n            ctx.beginPath();\n            if (type === LIST_STYLE_TYPE.SQUARE) {\n                ctx.rect(cx - size / 2, cy - size / 2, size, size);\n            } else {\n                ctx.arc(cx, cy, size / 2, 0, Math.PI * 2);\n                if (type === LIST_STYLE_TYPE.CIRCLE) {\n                    ctx.strokeStyle = asString(styles.color);\n                    ctx.lineWidth = size * 0.18;\n                }\n            }\n            if (type === LIST_STYLE_TYPE.CIRCLE) {\n                ctx.stroke();\n            } else {\n                ctx.fill();\n            }\n            ctx.restore();\n        } else {\n            const [font] = textRenderer.createFontStyle(styles);\n            ctx.font = font ?? '';\n            ctx.fillStyle = asString(styles.color);\n            ctx.textBaseline = 'middle';\n            ctx.textAlign = 'right';\n\n            const bounds = new Bounds(\n                container.bounds.left,\n                container.bounds.top + getAbsoluteValue(container.styles.paddingTop, container.bounds.width),\n                container.bounds.width,\n                computeLineHeight(styles.lineHeight, styles.fontSize.number) / 2 + 1\n            );\n\n            textRenderer.renderTextWithLetterSpacing(\n                new TextBounds(paint.listValue, bounds),\n                styles.letterSpacing,\n                computeLineHeight(styles.lineHeight, styles.fontSize.number) / 2 + 2,\n                styles.writingMode\n            );\n            ctx.textBaseline = 'bottom';\n            ctx.textAlign = 'left';\n        }\n    }\n}\n\n/**\n * Type guard for text input containers.\n */\nconst isTextInputElement = (\n    container: ElementContainer\n): container is InputElementContainer | TextareaElementContainer | SelectElementContainer => {\n    if (container instanceof TextareaElementContainer) {\n        return true;\n    } else if (container instanceof SelectElementContainer) {\n        return true;\n    } else if (container instanceof InputElementContainer && container.type !== RADIO && container.type !== CHECKBOX) {\n        return true;\n    }\n    return false;\n};\n\n/**\n * Map CSS text-align to Canvas textAlign.\n */\nconst canvasTextAlign = (textAlign: TEXT_ALIGN): CanvasTextAlign => {\n    switch (textAlign) {\n        case TEXT_ALIGN.CENTER:\n            return 'center';\n        case TEXT_ALIGN.RIGHT:\n            return 'right';\n        case TEXT_ALIGN.LEFT:\n        default:\n            return 'left';\n    }\n};\n","import { BezierCurve, isBezierCurve } from '../bezier-curve';\nimport { at } from '../../core/util';\nimport { Path } from '../path';\nimport { Vector } from '../vector';\n\n// CSS Backgrounds 3, 6.1.1: growing a small corner needs the cubic adjustment\n// to approach a square continuously as the original radius approaches zero.\nexport const shadowRadius = (radius: number, spread: number): number => {\n    const delta = spread > radius ? spread * (1 + Math.pow(radius / spread - 1, 3)) : spread;\n    return Math.max(0, radius + delta);\n};\n\n// Input is the four clockwise border/padding corner segments from BoundCurves.\n// Translation alone preserves the old radii and turns a spread circle into a\n// rounded square. Resize each quarter ellipse around its box corner instead.\nexport const spreadShadowPath = (paths: Path[], spread: number): Path[] => {\n    if (spread === 0) return paths;\n    const corners = paths.map((point, index) => {\n        if (!isBezierCurve(point)) return { x: point.x, y: point.y, rx: 0, ry: 0 };\n        return {\n            x: index % 2 === 0 ? point.start.x : point.end.x,\n            y: index % 2 === 0 ? point.end.y : point.start.y,\n            rx: Math.abs(point.end.x - point.start.x),\n            ry: Math.abs(point.end.y - point.start.y)\n        };\n    });\n    const width = at(corners, 1).x - at(corners, 0).x + 2 * spread;\n    const height = at(corners, 3).y - at(corners, 0).y + 2 * spread;\n    if (width <= 0 || height <= 0) return [];\n    const radii = corners.map((c) => ({ x: shadowRadius(c.rx, spread), y: shadowRadius(c.ry, spread) }));\n    const ratio = (size: number, sum: number): number => (sum > 0 ? size / sum : 1);\n    const factor = Math.min(\n        1,\n        ratio(width, at(radii, 0).x + at(radii, 1).x),\n        ratio(width, at(radii, 3).x + at(radii, 2).x),\n        ratio(height, at(radii, 0).y + at(radii, 3).y),\n        ratio(height, at(radii, 1).y + at(radii, 2).y)\n    );\n    return paths.map((point, index) => {\n        const corner = at(corners, index);\n        const x = corner.x + (index === 1 || index === 2 ? spread : -spread);\n        const y = corner.y + (index >= 2 ? spread : -spread);\n        if (!isBezierCurve(point)) return new Vector(x, y);\n        const rx = at(radii, index).x * factor;\n        const ry = at(radii, index).y * factor;\n        if (!rx || !ry) return new Vector(x, y);\n        const sx = rx / corner.rx;\n        const sy = ry / corner.ry;\n        const resize = (v: Vector): Vector => new Vector(x + (v.x - corner.x) * sx, y + (v.y - corner.y) * sy);\n        return new BezierCurve(\n            resize(point.start),\n            resize(point.startControl),\n            resize(point.endControl),\n            resize(point.end)\n        );\n    });\n};\n","import { Bounds } from '../../css/layout/bounds';\n\nexport interface ShadowTransform {\n    a: number;\n    b: number;\n    c: number;\n    d: number;\n    e: number;\n    f: number;\n}\n\nexport interface ShadowSpace {\n    matrix: ShadowTransform;\n    viewport: Bounds;\n    scale: number;\n    uniform: boolean;\n}\n\n// Map the output bitmap back into the current user space. Capture x/y are not\n// in this space once CSS transforms (including ancestor transforms) are active.\n// An AABB of all four inverse-transformed corners is conservative under rotation.\nexport const shadowSpace = (matrix: ShadowTransform, width: number, height: number): ShadowSpace | null => {\n    const { a, b, c, d, e, f } = matrix;\n    if (![a, b, c, d, e, f, width, height].every(Number.isFinite)) return null;\n    const determinant = a * d - b * c;\n    if (!Number.isFinite(determinant) || determinant === 0) return null;\n    const inversePoint = (x: number, y: number) => ({\n        x: (d * (x - e) - c * (y - f)) / determinant,\n        y: (-b * (x - e) + a * (y - f)) / determinant\n    });\n    const corners = [inversePoint(0, 0), inversePoint(width, 0), inversePoint(width, height), inversePoint(0, height)];\n    if (!corners.every((point) => Number.isFinite(point.x) && Number.isFinite(point.y))) return null;\n    const left = Math.min(...corners.map((point) => point.x));\n    const top = Math.min(...corners.map((point) => point.y));\n    const right = Math.max(...corners.map((point) => point.x));\n    const bottom = Math.max(...corners.map((point) => point.y));\n    // Largest singular value: enough local raster resolution for either output\n    // axis. A scalar Canvas shadow blur is exact only for similarity transforms.\n    const xx = a * a + b * b;\n    const yy = c * c + d * d;\n    const xy = a * c + b * d;\n    const scale = Math.sqrt((xx + yy + Math.hypot(xx - yy, 2 * xy)) / 2);\n    if (!Number.isFinite(scale) || scale <= 0) return null;\n    const tolerance = 1e-10 * Math.max(xx, yy);\n    return {\n        matrix,\n        viewport: new Bounds(left, top, right - left, bottom - top),\n        scale,\n        uniform: Math.abs(xx - yy) <= tolerance && Math.abs(xy) <= tolerance\n    };\n};\n","import { Bounds } from '../../css/layout/bounds';\nimport { BoxShadow } from '../../css/property-descriptors/box-shadow';\nimport { asString, isTransparent } from '../../css/types/color-utilities';\nimport { SHADOW_MASK_OFFSET } from '../../core/constants';\nimport { ElementPaint } from '../stacking-context';\nimport { calculateBorderBoxPath, calculatePaddingBoxPath } from '../bound-curves';\nimport { paddingBox } from '../box-sizing';\nimport { Path, transformPath } from '../path';\nimport { createCanvasPath, formatCanvasPath } from './canvas-path';\nimport { FilterSurfaceError, releaseSurface, renderFilterSurface } from './filter-surface';\nimport { cropSurface, reserveSurface, SurfaceBudget } from './surface-bounds';\nimport { spreadShadowPath } from './box-shadow-geometry';\nimport { shadowSpace, ShadowSpace } from './box-shadow-transform';\n\ninterface ShadowOptions {\n    x: number;\n    y: number;\n    width: number;\n    height: number;\n    scale: number;\n    signal?: AbortSignal;\n}\n\n// Separate closed subpaths plus even-odd filling avoid reversing only the order\n// of corner Beziers, which does not reverse the curves themselves.\nconst complement = (ctx: CanvasRenderingContext2D, rect: Bounds, hole: Path[]): void => {\n    ctx.beginPath();\n    ctx.rect(rect.left, rect.top, rect.width, rect.height);\n    if (hole.length) {\n        formatCanvasPath(ctx, hole);\n        ctx.closePath();\n    }\n};\n\nconst insetHole = (paint: ElementPaint, shadow: BoxShadow[number]): Path[] => {\n    const spread = shadow.spread.number;\n    const box = paddingBox(paint.container);\n    if (box.width - 2 * spread <= 0 || box.height - 2 * spread <= 0) return [];\n    return spreadShadowPath(calculatePaddingBoxPath(paint.curves), -spread);\n};\n\n// Rasterize in local coordinates, blur once, and then let the destination CTM\n// transform the complete shadow. This also preserves anisotropic/sheared blur.\nconst paintShadowSurface = async (\n    ctx: CanvasRenderingContext2D,\n    paint: ElementPaint,\n    shadow: BoxShadow[number],\n    options: ShadowOptions,\n    budget: SurfaceBudget,\n    space: ShadowSpace\n): Promise<boolean> => {\n    const padding = paddingBox(paint.container);\n    const blur = shadow.blur.number / 2;\n    const margin = Math.ceil(3 * blur) + 2;\n    const spread = shadow.spread.number;\n    const area = shadow.inset\n        ? padding\n        : paint.container.bounds.add(\n              shadow.offsetX.number - spread,\n              shadow.offsetY.number - spread,\n              2 * spread,\n              2 * spread\n          );\n    const bounds = cropSurface(area.add(-margin, -margin, 2 * margin, 2 * margin), space.viewport, margin, space.scale);\n    if (!bounds.width || !bounds.height) return true;\n    const width = Math.ceil(bounds.width * space.scale);\n    const height = Math.ceil(bounds.height * space.scale);\n    const reserved = reserveSurface(budget, width, height);\n    if (!reserved) return false;\n    let source: HTMLCanvasElement | undefined;\n    let filtered: HTMLCanvasElement | undefined;\n    try {\n        source = ctx.canvas.ownerDocument.createElement('canvas');\n        source.width = width;\n        source.height = height;\n        const sourceCtx = source.getContext('2d');\n        if (!sourceCtx) return false;\n        sourceCtx.scale(space.scale, space.scale);\n        sourceCtx.translate(-bounds.left, -bounds.top);\n        const silhouette = shadow.inset\n            ? insetHole(paint, shadow)\n            : spreadShadowPath(calculateBorderBoxPath(paint.curves), spread);\n        const path = transformPath(silhouette, shadow.offsetX.number, shadow.offsetY.number, 0, 0);\n        if (shadow.inset) complement(sourceCtx, bounds, path);\n        else createCanvasPath(sourceCtx, path);\n        sourceCtx.fillStyle = asString(shadow.color);\n        sourceCtx.fill(shadow.inset ? 'evenodd' : 'nonzero');\n        filtered = await renderFilterSurface(\n            source,\n            { functions: [{ kind: 'blur', value: blur }] },\n            1,\n            space.scale,\n            options.signal\n        );\n        ctx.save();\n        try {\n            if (shadow.inset) {\n                createCanvasPath(ctx, calculatePaddingBoxPath(paint.curves));\n                ctx.clip();\n            } else {\n                complement(ctx, space.viewport, calculateBorderBoxPath(paint.curves));\n                ctx.clip('evenodd');\n            }\n            ctx.drawImage(\n                filtered,\n                bounds.left,\n                bounds.top,\n                filtered.width / space.scale,\n                filtered.height / space.scale\n            );\n        } finally {\n            ctx.restore();\n        }\n        return true;\n    } catch (error) {\n        if (!(error instanceof FilterSurfaceError)) throw error;\n        return false;\n    } finally {\n        if (filtered && filtered !== source) releaseSurface(filtered);\n        if (source) releaseSurface(source);\n        budget.pixels -= reserved;\n    }\n};\n\nexport const paintBoxShadow = async (\n    ctx: CanvasRenderingContext2D,\n    paint: ElementPaint,\n    shadow: BoxShadow[number],\n    options: ShadowOptions,\n    budget: SurfaceBudget\n): Promise<void> => {\n    if (options.signal?.aborted) throw new DOMException('The operation was aborted.', 'AbortError');\n    if (isTransparent(shadow.color)) return;\n    const spread = shadow.spread.number;\n    if (\n        !shadow.inset &&\n        (paint.container.bounds.width + 2 * spread <= 0 || paint.container.bounds.height + 2 * spread <= 0)\n    )\n        return;\n    // getTransform includes capture scale, CSS transforms and their origins.\n    // Without it the CTM is unknown: approximate it with the capture transform\n    // and only ever move the mask relative to the real CTM (see below).\n    const knownTransform = typeof ctx.getTransform === 'function';\n    const matrix = knownTransform\n        ? ctx.getTransform()\n        : {\n              a: options.scale,\n              b: 0,\n              c: 0,\n              d: options.scale,\n              e: -options.x * options.scale,\n              f: -options.y * options.scale\n          };\n    const space = shadowSpace(matrix, ctx.canvas.width, ctx.canvas.height);\n    // Singular transforms have zero painted area; never attempt to invert them.\n    if (!space) return;\n    const { viewport } = space;\n    if (\n        shadow.blur.number > 0 &&\n        (shadow.inset || !space.uniform) &&\n        (await paintShadowSurface(ctx, paint, shadow, options, budget, space))\n    )\n        return;\n    const padding = paddingBox(paint.container);\n    ctx.save();\n    try {\n        if (shadow.inset && shadow.blur.number === 0) {\n            createCanvasPath(ctx, calculatePaddingBoxPath(paint.curves));\n            ctx.clip();\n            complement(\n                ctx,\n                padding,\n                transformPath(insetHole(paint, shadow), shadow.offsetX.number, shadow.offsetY.number, 0, 0)\n            );\n            ctx.fillStyle = asString(shadow.color);\n            ctx.fill('evenodd');\n            return;\n        }\n        const margin =\n            Math.ceil(\n                shadow.blur.number * 2 +\n                    Math.abs(spread) +\n                    Math.abs(shadow.offsetX.number) +\n                    Math.abs(shadow.offsetY.number)\n            ) + 2;\n        // Displace in OUTPUT pixels, not along a CSS axis. A rotated or reflected\n        // local x axis need not point off the left edge of the output bitmap.\n        const sourceBounds = shadow.inset\n            ? padding.add(-margin, -margin, 2 * margin, 2 * margin)\n            : paint.container.bounds.add(-spread, -spread, 2 * spread, 2 * spread);\n        const { a, b, c, d, e, f } = matrix;\n        const right = sourceBounds.left + sourceBounds.width;\n        const bottom = sourceBounds.top + sourceBounds.height;\n        const maxX = Math.max(\n            a * sourceBounds.left + c * sourceBounds.top + e,\n            a * right + c * sourceBounds.top + e,\n            a * right + c * bottom + e,\n            a * sourceBounds.left + c * bottom + e\n        );\n        const displacement = Math.max(SHADOW_MASK_OFFSET, maxX + margin * space.scale + 2);\n        if (shadow.inset) {\n            createCanvasPath(ctx, calculatePaddingBoxPath(paint.curves));\n            ctx.clip();\n        } else {\n            complement(ctx, viewport, calculateBorderBoxPath(paint.curves));\n            ctx.clip('evenodd');\n        }\n        // Current paths retain their device coordinates across transform changes.\n        // setTransform with an approximate matrix would discard CSS transforms\n        // on the real CTM, so the legacy path translates relative to it instead.\n        if (knownTransform) ctx.setTransform(a, b, c, d, e - displacement, f);\n        else ctx.translate(-displacement / a, 0);\n        if (shadow.inset) complement(ctx, sourceBounds, insetHole(paint, shadow));\n        else createCanvasPath(ctx, spreadShadowPath(calculateBorderBoxPath(paint.curves), spread));\n        if (knownTransform) ctx.setTransform(a, b, c, d, e, f);\n        else ctx.translate(displacement / a, 0);\n        ctx.shadowOffsetX = displacement + a * shadow.offsetX.number + c * shadow.offsetY.number;\n        ctx.shadowOffsetY = b * shadow.offsetX.number + d * shadow.offsetY.number;\n        // Allocation/filter-failure fallback remains bounded-memory. Its blur is\n        // isotropic under nonuniform transforms, but positioning stays correct.\n        ctx.shadowBlur = shadow.blur.number * space.scale;\n        ctx.shadowColor = asString(shadow.color);\n        ctx.fillStyle = 'rgb(0, 0, 0)';\n        ctx.fill(shadow.inset ? 'evenodd' : 'nonzero');\n    } finally {\n        ctx.restore();\n    }\n};\n","/**\n * Text Clip Renderer\n *\n * Implements `background-clip: text` — paints the element's background\n * (color + images) to an offscreen canvas and clips it to the text glyph\n * shapes with destination-in compositing, then composites the result back\n * onto the main canvas.\n *\n * Extracted from CanvasRenderer to keep paint orchestration separate from\n * this self-contained compositing algorithm.\n *\n * The offscreen and mask canvases are backed at device-pixel resolution\n * (bounds × scale) with their contexts scaled to CSS pixels, so the\n * composite back onto the main canvas maps 1:1 onto the backing store and\n * stays sharp at devicePixelRatio > 1.\n *\n * Matching browser paint order for clipped text:\n * - text shadows render *beneath* the clipped background (silhouettes in\n *   the shadow colour), they are not part of the clip region;\n * - -webkit-text-stroke is part of the clip region (fill ∪ stroke band).\n */\n\nimport { ElementPaint } from '../stacking-context';\nimport { CSSParsedDeclaration } from '../../css';\nimport { asString, isTransparent } from '../../css/types/color-utilities';\nimport { DIRECTION } from '../../css/property-descriptors/direction';\nimport { isVerticalWritingMode, WRITING_MODE } from '../../css/property-descriptors/writing-mode';\nimport { segmentGraphemes, TextBounds } from '../../css/layout/text';\nimport { Context } from '../../core/context';\nimport { Bounds } from '../../css/layout/bounds';\nimport { at } from '../../core/util';\nimport { BackgroundRenderer } from './background-renderer';\nimport { measureBaseline } from './font-utils';\nimport { getTextStrokeLineJoin } from './text-renderer';\nimport { releaseSurface } from './filter-surface';\nimport { TextShadow } from '../../css/property-descriptors/text-shadow';\n\nexport interface TextClipRendererDependencies {\n    /** Main canvas context the clipped background is composited onto. */\n    ctx: CanvasRenderingContext2D;\n    context: Context;\n    /** Device-pixel ratio shared with the main renderer. */\n    scale: number;\n    /** Font builder shared with the text renderer so both use identical fonts. */\n    createFontStyle: (styles: CSSParsedDeclaration) => string[];\n}\n\ninterface GlyphLayer {\n    canvas: HTMLCanvasElement;\n    ctx: CanvasRenderingContext2D;\n}\n\ninterface GlyphDrawOptions {\n    bounds: Bounds;\n    baseline: number;\n    letterSpacing: number;\n    writingMode: WRITING_MODE;\n}\n\ntype GlyphDraw = (ctx: CanvasRenderingContext2D, text: string, x: number, y: number) => void;\n\nexport class TextClipRenderer {\n    private readonly ctx: CanvasRenderingContext2D;\n    private readonly context: Context;\n    private readonly scale: number;\n    private readonly createFontStyle: (styles: CSSParsedDeclaration) => string[];\n\n    constructor(deps: TextClipRendererDependencies) {\n        this.ctx = deps.ctx;\n        this.context = deps.context;\n        this.scale = deps.scale;\n        this.createFontStyle = deps.createFontStyle;\n    }\n\n    async render(paint: ElementPaint): Promise<void> {\n        const container = paint.container;\n        const styles = container.styles;\n        const bounds = container.bounds;\n        const scale = this.scale;\n\n        if (bounds.width <= 0 || bounds.height <= 0) {\n            return;\n        }\n\n        const ownerDocument = this.ctx.canvas.ownerDocument ?? document;\n        const width = Math.ceil(bounds.width);\n        const height = Math.ceil(bounds.height);\n        const deviceWidth = Math.ceil(bounds.width * scale);\n        const deviceHeight = Math.ceil(bounds.height * scale);\n\n        // ── Draw background onto an offscreen canvas ──\n        const offscreen = this.createLayer(ownerDocument, deviceWidth, deviceHeight);\n        if (!offscreen) {\n            return;\n        }\n        // Every intermediate surface is released once the composite has been\n        // drawn onto the main canvas, matching the filter/box-shadow surface\n        // discipline (canvas backing stores are not free until GC runs).\n        let mask: GlyphLayer | null = null;\n        let composite: GlyphLayer | null = null;\n        let shadowCanvases: HTMLCanvasElement[] | null = null;\n        try {\n            offscreen.ctx.scale(scale, scale);\n\n            const [fontString] = this.createFontStyle(styles);\n            offscreen.ctx.font = fontString ?? '';\n            offscreen.ctx.textBaseline = 'alphabetic';\n            offscreen.ctx.textAlign = 'left';\n            offscreen.ctx.direction = styles.direction === DIRECTION.RTL ? 'rtl' : 'ltr';\n\n            // Measure baseline from the actual rendered font\n            const baseline = measureBaseline(offscreen.ctx, styles.fontSize.number);\n\n            const bgRenderer = new BackgroundRenderer({\n                ctx: offscreen.ctx,\n                context: this.context,\n                canvas: offscreen.canvas,\n                // The context is pre-scaled to CSS pixels, so the background\n                // renderer works in the same coordinate space as the main canvas.\n                options: { width, height, scale: 1 }\n            });\n\n            if (!isTransparent(styles.backgroundColor)) {\n                offscreen.ctx.fillStyle = asString(styles.backgroundColor);\n                offscreen.ctx.fillRect(0, 0, width, height);\n            }\n\n            // Background images are positioned relative to the element bounds,\n            // so we need the BackgroundRenderer to compute offsets in the same\n            // coordinate space as the main renderer.  We do that by translating\n            // the offscreen context so that the element origin (bounds.left, bounds.top)\n            // falls at (0, 0).\n            offscreen.ctx.save();\n            offscreen.ctx.translate(-bounds.left, -bounds.top);\n            await bgRenderer.renderBackgroundImage(container);\n            offscreen.ctx.restore();\n\n            const drawOptions: GlyphDrawOptions = {\n                bounds,\n                baseline,\n                letterSpacing: styles.letterSpacing,\n                writingMode: styles.writingMode\n            };\n\n            // ── Clip the background to the glyph shapes ──\n            // Glyphs accumulate on a separate mask canvas with normal compositing:\n            // a per-fragment destination-in pass keeps only pixels covered by the\n            // current fragment, so fragments (graphemes with letter-spacing, words\n            // around punctuation) would erase each other. One destination-in pass\n            // against the combined mask keeps the background wherever any glyph\n            // painted. -webkit-text-stroke widens the clip region to the stroke\n            // band, matching how WebKit clips to stroked glyphs.\n            mask = this.createGlyphLayer(ownerDocument, deviceWidth, deviceHeight, offscreen.ctx);\n            if (!mask) {\n                return;\n            }\n            const hasStroke = !!styles.webkitTextStrokeWidth;\n            if (hasStroke) {\n                mask.ctx.strokeStyle = asString(styles.webkitTextStrokeColor);\n                mask.ctx.lineWidth = styles.webkitTextStrokeWidth;\n                mask.ctx.lineJoin = getTextStrokeLineJoin();\n            }\n            for (const textNode of container.textNodes) {\n                for (const textBound of textNode.textBounds) {\n                    this.drawGlyphs(mask, textBound, drawOptions, (ctx, text, x, y) => {\n                        ctx.fillText(text, x, y);\n                        if (hasStroke) {\n                            ctx.strokeText(text, x, y);\n                        }\n                    });\n                }\n            }\n\n            // The offscreen context is scaled to CSS pixels, so the device-sized\n            // mask must be drawn at CSS size (width/height) — passing device\n            // dimensions here would double-scale the mask by `scale` and misalign\n            // the clip region whenever scale ≠ 1.\n            offscreen.ctx.globalCompositeOperation = 'destination-in';\n            offscreen.ctx.drawImage(mask.canvas, 0, 0, width, height);\n\n            // ── Composite to the main canvas ──\n            // Text shadows paint beneath the clipped background in browsers, so\n            // they are rendered on their own canvases and layered under it. Each\n            // shadow gets its own canvas: canvas shadow properties cast from\n            // whatever is already drawn, so reusing one canvas would make every\n            // previously drawn glyph (and its silhouette) cast again. Layers are\n            // stacked in browser order — the last shadow declared sits deepest.\n            // The main context is scaled to CSS pixels — drawImage at CSS size\n            // maps the device-pixel surfaces onto the backing store 1:1.\n            shadowCanvases = this.renderShadowSilhouettes(\n                paint,\n                ownerDocument,\n                deviceWidth,\n                deviceHeight,\n                offscreen.ctx,\n                styles,\n                drawOptions\n            );\n\n            if (shadowCanvases) {\n                composite = this.createLayer(ownerDocument, deviceWidth, deviceHeight);\n                if (!composite) {\n                    return;\n                }\n                // composite layer has no transform applied — device-pixel drawImage 1:1.\n                for (const shadowCanvas of shadowCanvases) {\n                    composite.ctx.drawImage(shadowCanvas, 0, 0);\n                }\n                composite.ctx.drawImage(offscreen.canvas, 0, 0);\n                this.ctx.drawImage(composite.canvas, bounds.left, bounds.top, bounds.width, bounds.height);\n            } else {\n                this.ctx.drawImage(offscreen.canvas, bounds.left, bounds.top, bounds.width, bounds.height);\n            }\n        } finally {\n            releaseSurface(offscreen.canvas);\n            if (mask) releaseSurface(mask.canvas);\n            if (composite) releaseSurface(composite.canvas);\n            if (shadowCanvases) shadowCanvases.forEach(releaseSurface);\n        }\n    }\n\n    private createLayer(ownerDocument: Document, width: number, height: number): GlyphLayer | null {\n        const canvas = ownerDocument.createElement('canvas');\n        canvas.width = width;\n        canvas.height = height;\n        const ctx = canvas.getContext('2d');\n        if (!ctx) {\n            return null;\n        }\n        return { canvas, ctx };\n    }\n\n    private createGlyphLayer(\n        ownerDocument: Document,\n        width: number,\n        height: number,\n        fontSource: CanvasRenderingContext2D\n    ): GlyphLayer | null {\n        const layer = this.createLayer(ownerDocument, width, height);\n        if (!layer) {\n            return null;\n        }\n        layer.ctx.scale(this.scale, this.scale);\n        layer.ctx.font = fontSource.font;\n        layer.ctx.textBaseline = fontSource.textBaseline;\n        layer.ctx.textAlign = fontSource.textAlign;\n        layer.ctx.direction = fontSource.direction;\n        layer.ctx.fillStyle = '#000';\n        return layer;\n    }\n\n    /**\n     * Draw one text bound onto a glyph layer, splitting into per-glyph draws\n     * when letter-spacing is in effect so the layout matches the main text\n     * renderer. Vertical writing modes fall back to a single draw call.\n     */\n    private drawGlyphs(layer: GlyphLayer, textBound: TextBounds, drawOptions: GlyphDrawOptions, draw: GlyphDraw): void {\n        // Offset from element bounds to canvas-local coordinates\n        const x = textBound.bounds.left - drawOptions.bounds.left;\n        const y = textBound.bounds.top - drawOptions.bounds.top + drawOptions.baseline;\n        const { letterSpacing, writingMode } = drawOptions;\n\n        if (letterSpacing <= 0) {\n            draw(layer.ctx, textBound.text, x, y);\n            return;\n        }\n\n        if (isVerticalWritingMode(writingMode)) {\n            // Vertical writing mode: not yet supported for text-clip;\n            // fall back to a single draw call.\n            draw(layer.ctx, textBound.text, x, y);\n            return;\n        }\n\n        let offset = x;\n        for (const letter of segmentGraphemes(textBound.text)) {\n            draw(layer.ctx, letter, offset, y);\n            offset += layer.ctx.measureText(letter).width + letterSpacing;\n        }\n    }\n\n    /**\n     * Paint the text-shadow silhouettes for every glyph, one canvas per\n     * shadow, returned front-to-back (the last shadow sits deepest). Returns\n     * null when the element has no text shadows.\n     */\n    private renderShadowSilhouettes(\n        paint: ElementPaint,\n        ownerDocument: Document,\n        deviceWidth: number,\n        deviceHeight: number,\n        fontSource: CanvasRenderingContext2D,\n        styles: CSSParsedDeclaration,\n        drawOptions: GlyphDrawOptions\n    ): HTMLCanvasElement[] | null {\n        const textShadows: TextShadow = styles.textShadow;\n        if (!textShadows.length) {\n            return null;\n        }\n\n        const canvases: HTMLCanvasElement[] = [];\n        // The canvas shadow* properties cast the blurred silhouette in the\n        // shadow colour; the source glyph is painted in the same colour and\n        // ends up covered by the clipped background composited on top.\n        // Shadow offsets are in device pixels (unaffected by the context\n        // transform), matching the main text renderer.\n        for (let i = textShadows.length - 1; i >= 0; i--) {\n            const textShadow = at(textShadows, i);\n            const layer = this.createGlyphLayer(ownerDocument, deviceWidth, deviceHeight, fontSource);\n            if (!layer) {\n                continue;\n            }\n            layer.ctx.shadowColor = asString(textShadow.color);\n            layer.ctx.shadowOffsetX = textShadow.offsetX.number * this.scale;\n            layer.ctx.shadowOffsetY = textShadow.offsetY.number * this.scale;\n            // Device-space metric like the offsets: scale it alongside them.\n            layer.ctx.shadowBlur = textShadow.blur.number * this.scale;\n            layer.ctx.fillStyle = asString(textShadow.color);\n            for (const textNode of paint.container.textNodes) {\n                for (const textBound of textNode.textBounds) {\n                    this.drawGlyphs(layer, textBound, drawOptions, (ctx, text, x, y) => {\n                        ctx.fillText(text, x, y);\n                    });\n                }\n            }\n            canvases.push(layer.canvas);\n        }\n\n        return canvases.length ? canvases : null;\n    }\n}\n","import { ElementPaint, parseStackingContexts, StackingContext } from '../stacking-context';\nimport { Color } from '../../css/types/color';\nimport { asString, isTransparent } from '../../css/types/color-utilities';\nimport { ElementContainer } from '../../dom/element-container';\nimport { BoxShadow } from '../../css/property-descriptors/box-shadow';\nimport { BORDER_STYLE } from '../../css/property-descriptors/border-style';\nimport { Path, transformPath } from '../path';\nimport { BACKGROUND_CLIP } from '../../css/property-descriptors/background-clip';\nimport { BoundCurves, calculateBorderBoxPath, calculateContentBoxPath, calculatePaddingBoxPath } from '../bound-curves';\nimport {\n    CSSImageType,\n    CSSURLImage,\n    CSSLinearGradientImage,\n    CSSRadialGradientImage,\n    CSSConicGradientImage,\n    ICSSImage\n} from '../../css/types/image';\nimport { calculateGradientDirection, calculateRadius, processColorStops } from '../../css/types/functions/gradient';\nimport { getAbsoluteValue, FIFTY_PERCENT } from '../../css/types/length-percentage';\nimport { rasterizeRadialGradient, stackRepeatingStops, toCanvasStops } from './gradient-rasterizer';\nimport { at } from '../../core/util';\nimport { getBackgroundValueForIndex } from '../background';\nimport { contentBox } from '../box-sizing';\nimport { ReplacedElementContainer } from '../../dom/replaced-elements';\nimport { EffectTarget, isBlendEffect, isClipEffect, isFilterEffect, isOpacityEffect } from '../effects';\nimport { CLIP_PATH_TYPE } from '../../css/property-descriptors/clip-path';\nimport { MIX_BLEND_MODE } from '../../css/property-descriptors/mix-blend-mode';\nimport {\n    FilterSurfaceError,\n    filterOutset,\n    parseFilterChain,\n    releaseSurface,\n    renderFilterSurface,\n    ParsedFilter\n} from './filter-surface';\nimport { cropSurface, reserveSurface, surfaceBounds, SurfaceBudget } from './surface-bounds';\nimport { Bounds } from '../../css/layout/bounds';\nimport { DISPLAY } from '../../css/property-descriptors/display';\nimport { contains } from '../../core/bitwise';\nimport { TextRenderer } from './text-renderer';\nimport { Context } from '../../core/context';\nimport { BackgroundRenderer } from './background-renderer';\nimport { BorderRenderer } from './border-renderer';\nimport { BorderImageRenderer, resolveBorderImageOutset, resolveBorderImageWidths } from './border-image-renderer';\nimport { EffectsRenderer } from './effects-renderer';\nimport { createCanvasPath, formatCanvasPath } from './canvas-path';\nimport { OUTLINE_STYLE } from '../../css/property-descriptors/outline';\nimport { paintMaskLayers } from './mask-renderer';\nimport { BoxReflect } from '../../css/property-descriptors/webkit-box-reflect';\nimport { calculateObjectFitRendering } from '../object-fit';\nimport { renderReplacedElements, renderFormElements, renderListMarker } from './content-renderer';\nimport { paintBoxShadow } from './box-shadow-painter';\nimport { TextClipRenderer } from './text-clip-renderer';\nimport { CSSParsedDeclaration } from '../../css/index';\n\nexport type RenderConfigurations = RenderOptions & {\n    backgroundColor: Color | null;\n    signal?: AbortSignal;\n    /**\n     * Enable/disable image smoothing (anti-aliasing).\n     * When disabled, images are rendered with pixel-perfect sharpness (no interpolation).\n     * CSS `image-rendering` property on individual elements takes precedence.\n     * @default browser default (usually true)\n     */\n    imageSmoothing?: boolean;\n    /**\n     * Image smoothing quality level when imageSmoothing is enabled.\n     * Higher quality may be slower for large images.\n     * Only supported in modern browsers (Chrome 54+, Firefox 94+, Safari 17+).\n     * Falls back gracefully in older browsers.\n     * @default browser default\n     */\n    imageSmoothingQuality?: 'low' | 'medium' | 'high';\n};\n\nexport interface RenderOptions {\n    scale: number;\n    canvas?: HTMLCanvasElement;\n    x: number;\n    y: number;\n    width: number;\n    height: number;\n}\n\nexport class CanvasRenderer {\n    canvas: HTMLCanvasElement;\n    ctx: CanvasRenderingContext2D;\n    private readonly context: Context;\n    private readonly options: RenderConfigurations;\n    private readonly backgroundRenderer: BackgroundRenderer;\n    private readonly borderRenderer: BorderRenderer;\n    private readonly borderImageRenderer: BorderImageRenderer;\n    private readonly effectsRenderer: EffectsRenderer;\n    private readonly textRenderer: TextRenderer;\n    private readonly textClipRenderer: TextClipRenderer;\n    private legacySubtree = false;\n\n    constructor(\n        context: Context,\n        options: RenderConfigurations,\n        private readonly surfaceRoot?: ElementPaint,\n        private readonly surfaceBudget: SurfaceBudget = { pixels: 0 }\n    ) {\n        this.context = context;\n        this.options = options;\n        this.canvas = options.canvas ? options.canvas : context.resourceDocument.createElement('canvas');\n        const ctx = this.canvas.getContext('2d');\n        if (!ctx) {\n            if (!options.canvas) releaseSurface(this.canvas);\n            if (surfaceRoot) throw new FilterSurfaceError('Filter surface canvas is unavailable');\n            throw new Error('Failed to get 2D rendering context from canvas');\n        }\n        this.ctx = ctx;\n        if (!options.canvas) {\n            this.canvas.width = Math.floor(options.width * options.scale);\n            this.canvas.height = Math.floor(options.height * options.scale);\n            this.canvas.style.width = `${options.width}px`;\n            this.canvas.style.height = `${options.height}px`;\n        }\n        this.ctx.scale(this.options.scale, this.options.scale);\n        this.ctx.translate(-options.x, -options.y);\n        this.ctx.textBaseline = 'bottom';\n\n        // Set image smoothing options\n        if (options.imageSmoothing !== undefined) {\n            this.ctx.imageSmoothingEnabled = options.imageSmoothing;\n        }\n        if (options.imageSmoothingQuality) {\n            this.ctx.imageSmoothingQuality = options.imageSmoothingQuality;\n        }\n\n        // Initialize specialized renderers\n        this.backgroundRenderer = new BackgroundRenderer({\n            ctx: this.ctx,\n            context: this.context,\n            canvas: this.canvas,\n            options: {\n                width: options.width,\n                height: options.height,\n                scale: options.scale\n            }\n        });\n\n        this.borderRenderer = new BorderRenderer(\n            { ctx: this.ctx },\n            {\n                path: (paths) => this.path(paths),\n                formatPath: (paths) => this.formatPath(paths)\n            }\n        );\n\n        this.borderImageRenderer = new BorderImageRenderer(this.ctx);\n\n        this.effectsRenderer = new EffectsRenderer(\n            { ctx: this.ctx, scale: options.scale },\n            { path: (paths) => this.path(paths) }\n        );\n\n        this.textRenderer = new TextRenderer({\n            ctx: this.ctx,\n            options: { scale: options.scale }\n        });\n\n        this.textClipRenderer = new TextClipRenderer({\n            ctx: this.ctx,\n            context: this.context,\n            scale: options.scale,\n            createFontStyle: (styles) => this.textRenderer.createFontStyle(styles)\n        });\n\n        this.context.logger.debug(\n            `Canvas renderer initialized (${options.width}x${options.height}) with scale ${options.scale}`\n        );\n    }\n\n    async renderStack(stack: StackingContext): Promise<void> {\n        const styles = stack.element.container.styles;\n        if (styles.isVisible()) {\n            const filter = parseFilterChain(styles.filter);\n            const hasFilter = filter !== null && filter.functions.length > 0;\n            const hasMask = styles.maskImage.length > 0;\n            const reflect = styles.webkitBoxReflect;\n            // mix-blend-mode blends the element (background + content) as one\n            // isolated group with the backdrop, so it also requires the\n            // composited surface path — setting globalCompositeOperation on\n            // the main canvas would blend each paint call separately and,\n            // for light-coloured content (white text over multiply), erase it.\n            const hasBlend = styles.mixBlendMode !== MIX_BLEND_MODE.NORMAL;\n            if (\n                stack.element !== this.surfaceRoot &&\n                !this.legacySubtree &&\n                (hasMask || reflect || hasBlend || (filter !== null && (hasFilter || styles.opacity < 1))) &&\n                this.canComposite(stack.element)\n            ) {\n                if (!(await this.renderCompositedStack(stack, filter, hasMask, reflect, hasBlend))) {\n                    // A rejected optional surface must preserve the previous subtree path.\n                    this.legacySubtree = true;\n                    try {\n                        await this.renderStackContent(stack);\n                    } finally {\n                        this.legacySubtree = false;\n                    }\n                }\n                return;\n            }\n            await this.renderStackContent(stack);\n        }\n    }\n\n    // Draft scope: transformed and clip-path subtrees keep the old path.\n    // The surface root owns its filter/opacity; ancestors are applied at composition.\n    private canComposite(paint: ElementPaint): boolean {\n        const supported = (container: ElementContainer): boolean => {\n            const styles = container.styles;\n            return (\n                !styles.isTransformed() &&\n                styles.zoom === 1 &&\n                styles.clipPath.type === CLIP_PATH_TYPE.NONE &&\n                !contains(styles.display, DISPLAY.LIST_ITEM) &&\n                parseFilterChain(styles.filter) !== null\n            );\n        };\n        const subtree = (container: ElementContainer): boolean =>\n            supported(container) && container.elements.every(subtree);\n        let ancestor = paint.parent;\n        while (ancestor && ancestor !== this.surfaceRoot) {\n            if (!supported(ancestor.container)) return false;\n            ancestor = ancestor.parent;\n        }\n        return subtree(paint.container);\n    }\n\n    private async renderCompositedStack(\n        stack: StackingContext,\n        filter: ParsedFilter | null,\n        hasMask: boolean,\n        reflect: BoxReflect | null,\n        hasBlend = false\n    ): Promise<boolean> {\n        const signal = this.options.signal;\n        if (signal?.aborted) throw new DOMException('The operation was aborted.', 'AbortError');\n        const bounds = cropSurface(\n            surfaceBounds(stack.element.container),\n            new Bounds(this.options.x, this.options.y, this.options.width, this.options.height),\n            filter ? filterOutset(filter) : 0,\n            this.options.scale\n        );\n        if (!bounds.width || !bounds.height) return true;\n        const reserved = reserveSurface(\n            this.surfaceBudget,\n            Math.ceil(bounds.width * this.options.scale),\n            Math.ceil(bounds.height * this.options.scale)\n        );\n        if (!reserved) {\n            this.context.logger.info('Filter surface budget exceeded; using the existing renderer');\n            return false;\n        }\n        const options = {\n            ...this.options,\n            canvas: undefined,\n            backgroundColor: null,\n            x: bounds.left,\n            y: bounds.top,\n            width: bounds.width,\n            height: bounds.height\n        };\n        let source: CanvasRenderer | undefined;\n        let filtered: HTMLCanvasElement | undefined;\n        try {\n            source = new CanvasRenderer(this.context, options, stack.element, this.surfaceBudget);\n            await source.renderStackContent(stack);\n            source.effectsRenderer.applyEffects([]);\n            if (filter) {\n                filtered = await renderFilterSurface(\n                    source.canvas,\n                    filter,\n                    stack.element.container.styles.opacity,\n                    options.scale,\n                    signal\n                );\n            }\n            const composited = filtered ?? source.canvas;\n            if (hasMask) {\n                await this.applyMask(composited, stack.element.container.styles, bounds);\n            }\n            if (signal?.aborted) throw new DOMException('The operation was aborted.', 'AbortError');\n            const own = stack.element.effects;\n            const effects = stack.element\n                .getEffects(EffectTarget.CONTENT, this.surfaceRoot)\n                .filter(\n                    (effect) =>\n                        !own.includes(effect) ||\n                        (!isFilterEffect(effect) &&\n                            !isOpacityEffect(effect) &&\n                            !isBlendEffect(effect) &&\n                            !isClipEffect(effect))\n                );\n            this.effectsRenderer.applyEffects(effects);\n            if (hasBlend) {\n                // The isolated surface already contains the element's full\n                // paint (background + content), including its opacity —\n                // renderFilterSurface bakes it even for empty filter chains.\n                // Blend it with the backdrop as one group via the element's\n                // mix-blend-mode. save/restore keeps the composite operation\n                // from leaking into later paints.\n                this.ctx.save();\n                this.ctx.globalCompositeOperation = stack.element.container.styles\n                    .mixBlendMode as GlobalCompositeOperation;\n                this.ctx.drawImage(\n                    composited,\n                    options.x,\n                    options.y,\n                    composited.width / options.scale,\n                    composited.height / options.scale\n                );\n                this.ctx.restore();\n            } else {\n                this.ctx.drawImage(\n                    composited,\n                    options.x,\n                    options.y,\n                    composited.width / options.scale,\n                    composited.height / options.scale\n                );\n            }\n            if (reflect) {\n                await this.drawReflection(composited, stack.element.container.bounds, bounds, reflect);\n            }\n            return true;\n        } catch (error) {\n            if (!(error instanceof FilterSurfaceError)) throw error;\n            this.context.logger.info(`${error.message}; using the existing renderer`);\n            return false;\n        } finally {\n            if (source) releaseSurface(source.canvas);\n            if (filtered) releaseSurface(filtered);\n            this.surfaceBudget.pixels -= reserved;\n        }\n    }\n\n    /**\n     * Composite an alpha mask onto a finished element surface: all mask\n     * layers are painted additively into a mask surface, then kept pixels are\n     * selected with destination-in.\n     */\n    private async applyMask(surface: HTMLCanvasElement, styles: CSSParsedDeclaration, bounds: Bounds): Promise<void> {\n        const ctx = surface.getContext('2d');\n        if (!ctx) {\n            return;\n        }\n        const maskCanvas = this.context.resourceDocument.createElement('canvas');\n        maskCanvas.width = surface.width;\n        maskCanvas.height = surface.height;\n        const maskCtx = maskCanvas.getContext('2d');\n        if (!maskCtx) {\n            return;\n        }\n        // The surface's device-pixel origin corresponds to the element bounds\n        // origin, while mask layers paint in page coordinates — align them.\n        maskCtx.scale(this.options.scale, this.options.scale);\n        maskCtx.translate(-bounds.left, -bounds.top);\n        try {\n            await paintMaskLayers(\n                maskCtx,\n                styles.maskImage,\n                styles,\n                { left: bounds.left, top: bounds.top, width: bounds.width, height: bounds.height },\n                async (url) => await this.context.cache.match(url)\n            );\n        } catch (error) {\n            this.context.logger.error(`Error rendering mask-image: ${error instanceof Error ? error.message : error}`);\n            return;\n        }\n        ctx.save();\n        try {\n            ctx.setTransform(1, 0, 0, 1, 0, 0); // device pixels for the composite\n            ctx.globalCompositeOperation = 'destination-in';\n            ctx.drawImage(maskCanvas, 0, 0);\n        } finally {\n            ctx.restore();\n        }\n    }\n\n    /**\n     * Mirror the element surface in the given direction and offset, optionally\n     * masked (the -webkit-box-reflect mask applies in element space, so it is\n     * composited in the mirrored space where the reflection was drawn).\n     */\n    private async drawReflection(\n        composited: HTMLCanvasElement,\n        elementBounds: Bounds,\n        surfaceBoundsObj: Bounds,\n        reflect: BoxReflect\n    ): Promise<void> {\n        const scale = this.options.scale;\n        const w = Math.ceil(elementBounds.width * scale);\n        const h = Math.ceil(elementBounds.height * scale);\n        if (w <= 0 || h <= 0) {\n            return;\n        }\n        const reserved = reserveSurface(this.surfaceBudget, w, h);\n        if (!reserved) {\n            return;\n        }\n        let refCanvas: HTMLCanvasElement | undefined;\n        let maskCanvas: HTMLCanvasElement | undefined;\n        try {\n            refCanvas = this.context.resourceDocument.createElement('canvas');\n            refCanvas.width = w;\n            refCanvas.height = h;\n            const ctx = refCanvas.getContext('2d');\n            if (!ctx) {\n                return;\n            }\n            const offX = Math.round((elementBounds.left - surfaceBoundsObj.left) * scale);\n            const offY = Math.round((elementBounds.top - surfaceBoundsObj.top) * scale);\n            const horizontal = reflect.direction === 'left' || reflect.direction === 'right';\n            ctx.save();\n            try {\n                if (horizontal) {\n                    ctx.translate(w, 0);\n                    ctx.scale(-1, 1);\n                } else {\n                    ctx.translate(0, h);\n                    ctx.scale(1, -1);\n                }\n                ctx.drawImage(composited, -offX, -offY);\n            } finally {\n                ctx.restore();\n            }\n\n            if (reflect.mask) {\n                // The mask surface must match the reflection's device-pixel\n                // size (w×h here is already device scale). Painting it at CSS\n                // dimensions would only cover the top-left fraction of the\n                // reflection, and destination-in would erase the rest.\n                maskCanvas = this.context.resourceDocument.createElement('canvas');\n                maskCanvas.width = w;\n                maskCanvas.height = h;\n                const mctx = maskCanvas.getContext('2d');\n                if (mctx) {\n                    mctx.scale(scale, scale);\n                    await paintMaskLayers(\n                        mctx,\n                        [reflect.mask],\n                        {\n                            maskPosition: [],\n                            maskRepeat: [],\n                            maskSize: []\n                        },\n                        { left: 0, top: 0, width: elementBounds.width, height: elementBounds.height },\n                        async (url) => await this.context.cache.match(url)\n                    );\n                    ctx.save();\n                    try {\n                        if (horizontal) {\n                            ctx.translate(w, 0);\n                            ctx.scale(-1, 1);\n                        } else {\n                            ctx.translate(0, h);\n                            ctx.scale(1, -1);\n                        }\n                        ctx.globalCompositeOperation = 'destination-in';\n                        ctx.drawImage(maskCanvas, 0, 0, w, h);\n                    } finally {\n                        ctx.restore();\n                    }\n                }\n            }\n\n            const offset = reflect.offset;\n            let x = elementBounds.left;\n            let y = elementBounds.top;\n            if (reflect.direction === 'below') y = elementBounds.top + elementBounds.height + offset;\n            else if (reflect.direction === 'above') y = elementBounds.top - elementBounds.height - offset;\n            else if (reflect.direction === 'right') x = elementBounds.left + elementBounds.width + offset;\n            else x = elementBounds.left - elementBounds.width - offset;\n\n            this.ctx.save();\n            try {\n                this.ctx.filter = 'none';\n                this.ctx.drawImage(refCanvas, x, y, elementBounds.width, elementBounds.height);\n            } finally {\n                this.ctx.restore();\n            }\n        } finally {\n            if (refCanvas) releaseSurface(refCanvas);\n            if (maskCanvas) releaseSurface(maskCanvas);\n            this.surfaceBudget.pixels -= reserved;\n        }\n    }\n\n    async renderNode(paint: ElementPaint): Promise<void> {\n        if (paint.container.debugRender) {\n            debugger;\n        }\n\n        if (paint.container.styles.isVisible()) {\n            await this.renderNodeBackgroundAndBorders(paint);\n            await this.renderNodeContent(paint);\n        }\n    }\n\n    /**\n     * Helper method to render text with paint order support\n     * Reduces code duplication in line-clamp and normal rendering\n     */\n\n    // Helper method to truncate text and add ellipsis if needed\n\n    renderReplacedElement(\n        container: ReplacedElementContainer,\n        curves: BoundCurves,\n        image: HTMLImageElement | HTMLCanvasElement\n    ): void {\n        const intrinsicWidth = (image as HTMLImageElement).naturalWidth || container.intrinsicWidth;\n        const intrinsicHeight = (image as HTMLImageElement).naturalHeight || container.intrinsicHeight;\n        if (image && intrinsicWidth > 0 && intrinsicHeight > 0) {\n            const box = contentBox(container);\n            const path = calculatePaddingBoxPath(curves);\n            this.path(path);\n            this.ctx.save();\n            this.ctx.clip();\n            const { sx, sy, sw, sh, dx, dy, dw, dh } = calculateObjectFitRendering(\n                intrinsicWidth,\n                intrinsicHeight,\n                box,\n                container.styles.objectFit,\n                container.styles.objectPosition\n            );\n            this.ctx.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh);\n            this.ctx.restore();\n        }\n    }\n\n    async renderNodeContent(paint: ElementPaint): Promise<void> {\n        this.effectsRenderer.applyEffects(paint.getEffects(EffectTarget.CONTENT, this.surfaceRoot));\n        const container = paint.container;\n        const curves = paint.curves;\n        const styles = container.styles;\n        // Use content box for text overflow calculation (excludes padding and border)\n        const textBounds = contentBox(container);\n        for (const child of container.textNodes) {\n            await this.textRenderer.renderTextNode(child, styles, textBounds);\n        }\n\n        await renderReplacedElements(\n            this.ctx,\n            this.context,\n            {\n                scale: this.options.scale,\n                backgroundColor: this.options.backgroundColor,\n                x: this.options.x,\n                y: this.options.y,\n                width: this.options.width,\n                height: this.options.height\n            },\n            (ctx, opts) => new CanvasRenderer(ctx, opts),\n            container,\n            curves,\n            styles,\n            (c, cv, img) => this.renderReplacedElement(c, cv, img)\n        );\n\n        renderFormElements(this.ctx, this.textRenderer, this.path.bind(this), container, styles);\n\n        await renderListMarker(this.ctx, this.context, this.textRenderer, paint, container, styles);\n    }\n\n    async renderStackContent(stack: StackingContext): Promise<void> {\n        if (stack.element.container.debugRender) {\n            debugger;\n        }\n        const signal = this.options.signal;\n        // https://www.w3.org/TR/css-position-3/#painting-order\n        // 1. the background and borders of the element forming the stacking context.\n        await this.renderNodeBackgroundAndBorders(stack.element);\n        // 2. the child stacking contexts with negative stack levels (most negative first).\n        for (const child of stack.negativeZIndex) {\n            if (signal?.aborted) throw new DOMException('The operation was aborted.', 'AbortError');\n            await this.renderStack(child);\n        }\n        // 3. For all its in-flow, non-positioned, block-level descendants in tree order:\n        if (signal?.aborted) throw new DOMException('The operation was aborted.', 'AbortError');\n        await this.renderNodeContent(stack.element);\n\n        for (const child of stack.nonInlineLevel) {\n            await this.renderNode(child);\n        }\n        // 4. All non-positioned floating descendants, in tree order. For each one of these,\n        // treat the element as if it created a new stacking context, but any positioned descendants and descendants\n        // which actually create a new stacking context should be considered part of the parent stacking context,\n        // not this new one.\n        for (const child of stack.nonPositionedFloats) {\n            if (signal?.aborted) throw new DOMException('The operation was aborted.', 'AbortError');\n            await this.renderStack(child);\n        }\n        // 5. the in-flow, inline-level, non-positioned descendants, including inline tables and inline blocks.\n        for (const child of stack.nonPositionedInlineLevel) {\n            if (signal?.aborted) throw new DOMException('The operation was aborted.', 'AbortError');\n            await this.renderStack(child);\n        }\n        for (const child of stack.inlineLevel) {\n            await this.renderNode(child);\n        }\n        // 6. All positioned, opacity or transform descendants, in tree order that fall into the following categories:\n        //  All positioned descendants with 'z-index: auto' or 'z-index: 0', in tree order.\n        //  For those with 'z-index: auto', treat the element as if it created a new stacking context,\n        //  but any positioned descendants and descendants which actually create a new stacking context should be\n        //  considered part of the parent stacking context, not this new one. For those with 'z-index: 0',\n        //  treat the stacking context generated atomically.\n        //\n        //  All opacity descendants with opacity less than 1\n        //\n        //  All transform descendants with transform other than none\n        for (const child of stack.zeroOrAutoZIndexOrTransformedOrOpacity) {\n            if (signal?.aborted) throw new DOMException('The operation was aborted.', 'AbortError');\n            await this.renderStack(child);\n        }\n        // 7. Stacking contexts formed by positioned descendants with z-indices greater than or equal to 1 in z-index\n        // order (smallest first) then tree order.\n        for (const child of stack.positiveZIndex) {\n            if (signal?.aborted) throw new DOMException('The operation was aborted.', 'AbortError');\n            await this.renderStack(child);\n        }\n    }\n\n    path(paths: Path[]): void {\n        createCanvasPath(this.ctx, paths);\n    }\n\n    formatPath(paths: Path[]): void {\n        formatCanvasPath(this.ctx, paths);\n    }\n\n    private async renderSurfaceBoxShadow(paint: ElementPaint, shadow: BoxShadow[number]): Promise<void> {\n        // Rasterize a visible silhouette, then blur it. Linux WebKit can drop the\n        // interior of Canvas shadows whose solid mask is outside a cropped canvas.\n        const spread = shadow.spread.number;\n        const blur = shadow.blur.number / 2;\n        const margin = Math.ceil(3 * blur) + 1;\n        const box = paint.container.bounds.add(-spread, -spread, 2 * spread, 2 * spread);\n        if (box.width <= 0 || box.height <= 0) return;\n        const scale = this.options.scale;\n        const bounds = cropSurface(\n            box.add(-margin, -margin, 2 * margin, 2 * margin),\n            new Bounds(\n                this.options.x - shadow.offsetX.number,\n                this.options.y - shadow.offsetY.number,\n                this.options.width,\n                this.options.height\n            ),\n            margin,\n            scale\n        );\n        if (!bounds.width || !bounds.height) return;\n        const width = Math.ceil(bounds.width * scale),\n            height = Math.ceil(bounds.height * scale);\n        const reserved = reserveSurface(this.surfaceBudget, width, height);\n        if (!reserved) throw new FilterSurfaceError('Box shadow surface budget exceeded');\n        let source: HTMLCanvasElement | undefined;\n        let filtered: HTMLCanvasElement | undefined;\n        try {\n            source = this.context.resourceDocument.createElement('canvas');\n            source.width = width;\n            source.height = height;\n            const ctx = source.getContext('2d');\n            if (!ctx) throw new FilterSurfaceError('Box shadow surface canvas is unavailable');\n            ctx.scale(scale, scale);\n            ctx.translate(-bounds.left, -bounds.top);\n            createCanvasPath(\n                ctx,\n                transformPath(calculateBorderBoxPath(paint.curves), -spread, -spread, 2 * spread, 2 * spread)\n            );\n            ctx.fillStyle = asString(shadow.color);\n            ctx.fill();\n            filtered = await renderFilterSurface(\n                source,\n                { functions: [{ kind: 'blur', value: blur }] },\n                1,\n                scale,\n                this.options.signal\n            );\n            this.ctx.save();\n            try {\n                this.ctx.beginPath();\n                this.ctx.rect(this.options.x, this.options.y, this.options.width, this.options.height);\n                formatCanvasPath(this.ctx, calculateBorderBoxPath(paint.curves));\n                this.ctx.closePath();\n                this.ctx.clip('evenodd');\n                this.ctx.drawImage(\n                    filtered,\n                    bounds.left + shadow.offsetX.number,\n                    bounds.top + shadow.offsetY.number,\n                    filtered.width / scale,\n                    filtered.height / scale\n                );\n            } finally {\n                this.ctx.restore();\n            }\n        } finally {\n            if (source) releaseSurface(source);\n            if (filtered) releaseSurface(filtered);\n            this.surfaceBudget.pixels -= reserved;\n        }\n    }\n\n    async renderNodeBackgroundAndBorders(paint: ElementPaint): Promise<void> {\n        this.effectsRenderer.applyEffects(paint.getEffects(EffectTarget.BACKGROUND_BORDERS, this.surfaceRoot));\n        // backdrop-filter filters whatever has already been painted beneath the\n        // element. Capture that region from the main canvas first — anything\n        // painted later (the element itself, higher siblings) is not part of\n        // the backdrop.\n        if (!this.surfaceRoot && paint.container.styles.backdropFilter) {\n            await this.renderBackdropFilter(paint);\n        }\n        const styles = paint.container.styles;\n        const hasBackground = !isTransparent(styles.backgroundColor) || styles.backgroundImage.length;\n        const hasTextClip = hasTextBackgroundClip(styles);\n\n        const borders = [\n            { style: styles.borderTopStyle, color: styles.borderTopColor, width: styles.borderTopWidth },\n            { style: styles.borderRightStyle, color: styles.borderRightColor, width: styles.borderRightWidth },\n            { style: styles.borderBottomStyle, color: styles.borderBottomColor, width: styles.borderBottomWidth },\n            { style: styles.borderLeftStyle, color: styles.borderLeftColor, width: styles.borderLeftWidth }\n        ];\n\n        const backgroundClipValue = getBackgroundValueForIndex(styles.backgroundClip, 0);\n        const backgroundPaintingArea = calculateBackgroundCurvedPaintingArea(backgroundClipValue, paint.curves);\n\n        if (hasBackground || styles.boxShadow.length) {\n            // Handle background-clip: text\n            if (hasTextClip && paint.container.textNodes.length > 0) {\n                await this.textClipRenderer.render(paint);\n            } else {\n                this.ctx.save();\n                this.path(backgroundPaintingArea);\n                this.ctx.clip();\n\n                if (!isTransparent(styles.backgroundColor)) {\n                    this.ctx.fillStyle = asString(styles.backgroundColor);\n                    this.ctx.fill();\n                }\n\n                await this.backgroundRenderer.renderBackgroundImage(paint.container);\n\n                this.ctx.restore();\n            }\n\n            for (const shadow of styles.boxShadow.slice(0).reverse()) {\n                if (this.surfaceRoot && !shadow.inset) {\n                    await this.renderSurfaceBoxShadow(paint, shadow);\n                    continue;\n                }\n                await paintBoxShadow(this.ctx, paint, shadow, this.options, this.surfaceBudget);\n            }\n        }\n\n        // Render border-image if present (replaces traditional borders per CSS spec)\n        if (styles.borderImageSource) {\n            const source = styles.borderImageSource;\n            const bounds = paint.container.bounds;\n            const borderWidths: [number, number, number, number] = [\n                Math.max(0, styles.borderTopWidth),\n                Math.max(0, styles.borderRightWidth),\n                Math.max(0, styles.borderBottomWidth),\n                Math.max(0, styles.borderLeftWidth)\n            ];\n            let image: HTMLImageElement | HTMLCanvasElement | null = null;\n            if (source.type === CSSImageType.URL) {\n                const url = (source as CSSURLImage).url;\n                try {\n                    image = (await this.context.cache.match(url)) ?? null;\n                } catch (e) {\n                    this.context.logger.error(`Error loading border-image ${url}`);\n                }\n            } else {\n                // Gradient sources: rasterise the gradient across the border\n                // image area, then run the same 9-slice pipeline as for images.\n                image = this.rasterizeGradientSource(source, bounds);\n            }\n            if (image) {\n                const outset = resolveBorderImageOutset(styles.borderImageOutset, borderWidths);\n                const area = bounds.add(\n                    -outset.left,\n                    -outset.top,\n                    outset.left + outset.right,\n                    outset.top + outset.bottom\n                );\n                const widths = resolveBorderImageWidths(styles.borderImageWidth, borderWidths, area);\n                this.borderImageRenderer.renderBorderImage(\n                    bounds,\n                    image as HTMLImageElement,\n                    styles.borderImageSlice,\n                    styles.borderImageRepeat,\n                    widths[0],\n                    widths[1],\n                    widths[2],\n                    widths[3],\n                    outset\n                );\n            }\n            // When border-image is present, skip regular border rendering\n            return;\n        }\n\n        let side = 0;\n        for (const border of borders) {\n            if (border.style !== BORDER_STYLE.NONE && !isTransparent(border.color) && border.width > 0) {\n                const renderBorderSide = async (): Promise<void> => {\n                    if (border.style === BORDER_STYLE.DASHED) {\n                        await this.borderRenderer.renderDashedDottedBorder(\n                            border.color,\n                            border.width,\n                            side,\n                            paint.curves,\n                            BORDER_STYLE.DASHED\n                        );\n                    } else if (border.style === BORDER_STYLE.DOTTED) {\n                        await this.borderRenderer.renderDashedDottedBorder(\n                            border.color,\n                            border.width,\n                            side,\n                            paint.curves,\n                            BORDER_STYLE.DOTTED\n                        );\n                    } else if (border.style === BORDER_STYLE.DOUBLE) {\n                        await this.borderRenderer.renderDoubleBorder(border.color, border.width, side, paint.curves);\n                    } else {\n                        await this.borderRenderer.renderSolidBorder(border.color, side, paint.curves);\n                    }\n                };\n\n                // Browsers break a <fieldset>'s top border where its <legend>\n                // sits, instead of drawing the border through the legend (issue\n                // #227). Render the top border in two clipped segments around\n                // the legend's horizontal span.\n                const legend = paint.container.legendBounds;\n                if (side === 0 && legend) {\n                    const bounds = paint.container.bounds;\n                    const legendLeft = legend.left - bounds.left;\n                    const legendRight = legend.left + legend.width - bounds.left;\n                    if (legendLeft > 0) {\n                        this.ctx.save();\n                        this.ctx.beginPath();\n                        this.ctx.rect(bounds.left, bounds.top, legendLeft, bounds.height);\n                        this.ctx.clip();\n                        await renderBorderSide();\n                        this.ctx.restore();\n                    }\n                    const rightStart = bounds.left + legendRight;\n                    const rightWidth = bounds.width - legendRight;\n                    if (rightWidth > 0) {\n                        this.ctx.save();\n                        this.ctx.beginPath();\n                        this.ctx.rect(rightStart, bounds.top, rightWidth, bounds.height);\n                        this.ctx.clip();\n                        await renderBorderSide();\n                        this.ctx.restore();\n                    }\n                } else {\n                    await renderBorderSide();\n                }\n            }\n            side++;\n        }\n\n        this.renderOutline(paint);\n    }\n\n    /**\n     * Draw the element outline: a single closed stroke around the border box,\n     * offset outwards. Outlines paint atop content and do not affect layout.\n     */\n    private renderOutline(paint: ElementPaint): void {\n        const styles = paint.container.styles;\n        if (styles.outlineStyle === OUTLINE_STYLE.NONE || styles.outlineStyle === OUTLINE_STYLE.AUTO) {\n            return;\n        }\n        const width = Math.max(0, styles.outlineWidth);\n        if (width <= 0) {\n            return;\n        }\n        const color = styles.outlineColor ?? styles.color;\n        if (isTransparent(color)) {\n            return;\n        }\n        const spread = Math.max(0, styles.outlineOffset) + width / 2;\n        const outlinePath = transformPath(\n            calculateBorderBoxPath(paint.curves),\n            -spread,\n            -spread,\n            2 * spread,\n            2 * spread\n        );\n\n        this.ctx.save();\n        try {\n            this.ctx.strokeStyle = asString(color);\n            this.ctx.lineWidth = width;\n            if (styles.outlineStyle === OUTLINE_STYLE.DASHED) {\n                this.ctx.setLineDash([width * 3, width * 3]);\n            } else if (styles.outlineStyle === OUTLINE_STYLE.DOTTED) {\n                this.ctx.setLineDash([width, width * 2]);\n            }\n            this.path(outlinePath);\n            this.ctx.stroke();\n        } finally {\n            this.ctx.restore();\n        }\n    }\n\n    /**\n     * Rasterise a gradient border-image-source across the border image area.\n     * CSS allows any <image> as the border-image source; gradients are painted\n     * over the whole border-image box and then sliced by the regular 9-slice\n     * pipeline, matching browser behaviour for `border-image: linear-gradient()`.\n     * Returns null when the gradient could not be painted.\n     */\n    private rasterizeGradientSource(source: ICSSImage, bounds: Bounds): HTMLCanvasElement | null {\n        const width = Math.max(1, Math.ceil(bounds.width));\n        const height = Math.max(1, Math.ceil(bounds.height));\n        const ownerDocument = this.ctx.canvas.ownerDocument ?? document;\n        const canvas = ownerDocument.createElement('canvas');\n        canvas.width = width;\n        canvas.height = height;\n        const ctx = canvas.getContext('2d');\n        if (!ctx) {\n            return null;\n        }\n\n        if (source.type === CSSImageType.LINEAR_GRADIENT || source.type === CSSImageType.REPEATING_LINEAR_GRADIENT) {\n            const gradientImage = source as CSSLinearGradientImage;\n            const [lineLength, x0, y0, x1, y1] = calculateGradientDirection(gradientImage.angle, width, height);\n            const processed = processColorStops(gradientImage.stops, lineLength || width);\n            const repeating = source.type === CSSImageType.REPEATING_LINEAR_GRADIENT;\n            // Repeating gradients stack the one-cycle stop list periodically.\n            const stacked = repeating ? stackRepeatingStops(processed) : null;\n            const gradient = ctx.createLinearGradient(x0, y0, x1, y1);\n            if (stacked) {\n                stacked.forEach((colorStop) => {\n                    gradient.addColorStop(Math.min(1, Math.max(0, colorStop.stop)), colorStop.color);\n                });\n            } else if (repeating) {\n                // Degenerate period repeats nothing — last colour across the box.\n                const lastColor = asString(at(processed, processed.length - 1).color);\n                gradient.addColorStop(0, lastColor);\n                gradient.addColorStop(1, lastColor);\n            } else {\n                toCanvasStops(processed).forEach((colorStop) => {\n                    gradient.addColorStop(colorStop.stop, colorStop.color);\n                });\n            }\n            ctx.fillStyle = gradient;\n            ctx.fillRect(0, 0, width, height);\n            return canvas;\n        }\n        if (source.type === CSSImageType.RADIAL_GRADIENT || source.type === CSSImageType.REPEATING_RADIAL_GRADIENT) {\n            const gradientImage = source as CSSRadialGradientImage;\n            const position = gradientImage.position.length === 0 ? [FIFTY_PERCENT] : gradientImage.position;\n            const cx = getAbsoluteValue(at(position, 0), width);\n            const cy = getAbsoluteValue(at(position, position.length - 1), height);\n            const [rx, ry] = calculateRadius(gradientImage, cx, cy, width, height);\n            if (rx <= 0 || ry <= 0) {\n                return null;\n            }\n            const ownerDocument = this.ctx.canvas.ownerDocument ?? document;\n            const rasterized = rasterizeRadialGradient(\n                ownerDocument,\n                rx,\n                ry,\n                gradientImage.stops,\n                source.type === CSSImageType.REPEATING_RADIAL_GRADIENT\n            );\n            if (!rasterized) {\n                return null;\n            }\n            // Outside the ending shape the gradient continues with its last\n            // colour, so cover the whole border-image box before drawing the\n            // ellipse (drawn at its 2rx × 2ry device box around the centre).\n            ctx.fillStyle = rasterized.lastColor;\n            ctx.fillRect(0, 0, width, height);\n            ctx.drawImage(rasterized.canvas, cx - rx, cy - ry, rx * 2, ry * 2);\n            return canvas;\n        }\n        if (source.type === CSSImageType.CONIC_GRADIENT || source.type === CSSImageType.REPEATING_CONIC_GRADIENT) {\n            const gradientImage = source as CSSConicGradientImage;\n            // Canvas conic gradients measure angles from the positive x-axis\n            // clockwise; CSS conic gradients start at the 12 o'clock position.\n            const cx = getAbsoluteValue(at(gradientImage.position, 0), width);\n            const cy = getAbsoluteValue(at(gradientImage.position, 1), height);\n            const gradient = ctx.createConicGradient(gradientImage.angle - Math.PI / 2, cx, cy);\n            let stops: Array<{ stop: number; color: string }>;\n            if (source.type === CSSImageType.REPEATING_CONIC_GRADIENT) {\n                // Stack the one-cycle stop list periodically across the full\n                // sweep; the band covering the end extends flat to 1.\n                const processed = processColorStops(gradientImage.stops, 1);\n                const first = at(processed, 0);\n                const last = at(processed, processed.length - 1);\n                const period = Math.max(last.stop - first.stop, 0.01);\n                stops = [];\n                const cycles = Math.ceil(1 / period);\n                for (let k = 0; k < cycles; k++) {\n                    for (const s of processed) {\n                        const stop = k * period + (s.stop - first.stop);\n                        if (stop > 1) break;\n                        stops.push({ stop, color: asString(s.color) });\n                    }\n                }\n                const lastIncluded = at(stops, stops.length - 1);\n                if (lastIncluded && lastIncluded.stop < 1) {\n                    stops.push({ stop: 1, color: lastIncluded.color });\n                }\n            } else {\n                stops = processColorStops(gradientImage.stops, Math.max(width, height)).map((colorStop) => ({\n                    stop: colorStop.stop,\n                    color: asString(colorStop.color)\n                }));\n            }\n            stops.forEach((s) => {\n                gradient.addColorStop(Math.min(1, Math.max(0, s.stop)), s.color);\n            });\n            ctx.fillStyle = gradient;\n            ctx.fillRect(0, 0, width, height);\n            return canvas;\n        }\n        this.context.logger.warn('Unsupported border-image source; only URL and gradient images are supported');\n        return null;\n    }\n\n    /**\n     * Filter the already-painted content beneath the element's border box and\n     * paint the result back, approximating CSS backdrop-filter for the chain\n     * subset the filter surface backends support.\n     */\n    private async renderBackdropFilter(paint: ElementPaint): Promise<void> {\n        const filter = parseFilterChain(paint.container.styles.backdropFilter);\n        if (!filter || filter.functions.length === 0) {\n            return; // unsupported or empty chain\n        }\n        const bounds = paint.container.bounds;\n        if (bounds.width <= 0 || bounds.height <= 0) {\n            return;\n        }\n        const scale = this.options.scale;\n        const width = Math.ceil(bounds.width * scale);\n        const height = Math.ceil(bounds.height * scale);\n        if (width <= 0 || height <= 0) {\n            return;\n        }\n        const reserved = reserveSurface(this.surfaceBudget, width, height);\n        if (!reserved) {\n            return; // budget exhausted: render without the backdrop effect\n        }\n        let source: HTMLCanvasElement | undefined;\n        let filtered: HTMLCanvasElement | undefined;\n        try {\n            source = this.context.resourceDocument.createElement('canvas');\n            source.width = width;\n            source.height = height;\n            const srcCtx = source.getContext('2d');\n            if (!srcCtx) {\n                return;\n            }\n            // Canvas device pixel (0,0) corresponds to CSS (options.x, options.y).\n            const sx = Math.round((bounds.left - this.options.x) * scale);\n            const sy = Math.round((bounds.top - this.options.y) * scale);\n            srcCtx.drawImage(this.canvas, sx, sy, width, height, 0, 0, width, height);\n            try {\n                filtered = await renderFilterSurface(source, filter, 1, scale, this.options.signal);\n            } catch (error) {\n                // Unlike the composited-stack path there is no legacy fallback\n                // for backdrop-filter (tainted canvas, SVG rejection, decode\n                // failure): capture continues without the effect instead of\n                // failing the whole render.\n                if (error instanceof FilterSurfaceError) {\n                    this.context.logger.info(`${error.message}; rendering without the backdrop effect`);\n                    return;\n                }\n                throw error;\n            }\n            if (this.options.signal?.aborted) {\n                throw new DOMException('The operation was aborted.', 'AbortError');\n            }\n            this.ctx.save();\n            try {\n                // An enclosing filter effect must not re-filter the compositing.\n                this.ctx.filter = 'none';\n                this.ctx.drawImage(filtered, bounds.left, bounds.top, bounds.width, bounds.height);\n            } finally {\n                this.ctx.restore();\n            }\n        } finally {\n            if (source) releaseSurface(source);\n            if (filtered) releaseSurface(filtered);\n            this.surfaceBudget.pixels -= reserved;\n        }\n    }\n\n    async render(element: ElementContainer): Promise<HTMLCanvasElement> {\n        try {\n            if (this.options.backgroundColor) {\n                this.ctx.fillStyle = asString(this.options.backgroundColor);\n                this.ctx.fillRect(this.options.x, this.options.y, this.options.width, this.options.height);\n            }\n\n            const stack = parseStackingContexts(element);\n\n            await this.renderStack(stack);\n            this.effectsRenderer.applyEffects([]);\n            return this.canvas;\n        } catch (error) {\n            // Failed captures have no returned canvas. Release only our backing\n            // store; a canvas supplied by the caller remains caller-owned.\n            if (!this.options.canvas) releaseSurface(this.canvas);\n            throw error;\n        }\n    }\n}\n\nconst calculateBackgroundCurvedPaintingArea = (clip: BACKGROUND_CLIP, curves: BoundCurves): Path[] => {\n    switch (clip) {\n        case BACKGROUND_CLIP.BORDER_BOX:\n            return calculateBorderBoxPath(curves);\n        case BACKGROUND_CLIP.CONTENT_BOX:\n            return calculateContentBoxPath(curves);\n        case BACKGROUND_CLIP.PADDING_BOX:\n        default:\n            return calculatePaddingBoxPath(curves);\n    }\n};\n\n/**\n * Check if any background layer uses background-clip: text\n */\nconst hasTextBackgroundClip = (styles: CSSParsedDeclaration): boolean => {\n    return styles.backgroundClip.some((clip) => clip === BACKGROUND_CLIP.TEXT);\n};\n","import { RenderConfigurations } from './canvas-renderer';\nimport { createForeignObjectSVG, loadSerializedSVG } from '../../core/features';\nimport { asString } from '../../css/types/color-utilities';\nimport { Context } from '../../core/context';\n\nexport class ForeignObjectRenderer {\n    canvas: HTMLCanvasElement;\n    ctx: CanvasRenderingContext2D;\n    options: RenderConfigurations;\n    private readonly context: Context;\n\n    constructor(context: Context, options: RenderConfigurations) {\n        this.context = context;\n        this.options = options;\n        this.canvas = options.canvas ? options.canvas : context.resourceDocument.createElement('canvas');\n        const ctx = this.canvas.getContext('2d');\n        if (!ctx) {\n            throw new Error('Failed to get 2D rendering context from canvas');\n        }\n        this.ctx = ctx;\n        this.canvas.width = Math.floor(options.width * options.scale);\n        this.canvas.height = Math.floor(options.height * options.scale);\n        this.canvas.style.width = `${options.width}px`;\n        this.canvas.style.height = `${options.height}px`;\n\n        this.ctx.scale(this.options.scale, this.options.scale);\n        this.ctx.translate(-options.x, -options.y);\n        this.context.logger.debug(\n            `EXPERIMENTAL ForeignObject renderer initialized (${options.width}x${options.height} at ${options.x},${options.y}) with scale ${options.scale}`\n        );\n    }\n\n    async render(element: HTMLElement): Promise<HTMLCanvasElement> {\n        if (this.options.signal?.aborted) {\n            throw new DOMException('The operation was aborted.', 'AbortError');\n        }\n\n        // The clone carries the source page's margins and positional offsets,\n        // but inside the SVG it is the root: the capture rect already includes\n        // those offsets, so the element must paint from the foreignObject's\n        // origin or the offset would be applied a second time. Stripped only\n        // for serialization (the SVG string is fixed synchronously).\n        const restoreRootOffsets = stripRootOffsets(element);\n        // The SVG is declared at CSS-pixel size so the foreignObject lays out\n        // its content at CSS scale; drawImage below rasterizes it at device\n        // resolution under the scaled context.\n        const svg = createForeignObjectSVG(this.options.width, this.options.height, 0, 0, element);\n        // loadSerializedSVG serializes synchronously (Promise executor), so the\n        // stripped inline styles are captured before the restore runs.\n        const imagePromise = loadSerializedSVG(svg);\n        restoreRootOffsets();\n\n        const img = await imagePromise;\n\n        if (this.options.signal?.aborted) {\n            throw new DOMException('The operation was aborted.', 'AbortError');\n        }\n\n        if (this.options.backgroundColor) {\n            // The context translates by (-x, -y), so anchor both fills and the\n            // image at (x, y) — mirroring CanvasRenderer.render — or offsets\n            // would be applied twice and the background would miss the canvas.\n            this.ctx.fillStyle = asString(this.options.backgroundColor);\n            this.ctx.fillRect(this.options.x, this.options.y, this.options.width, this.options.height);\n        }\n\n        this.ctx.drawImage(img, this.options.x, this.options.y, this.options.width, this.options.height);\n\n        return this.canvas;\n    }\n}\n\n/**\n * Temporarily neutralize the root element's layout offsets for SVG\n * serialization. `top/right/bottom/left` reset to `auto` (inset values of\n * positioned elements are baked into the capture rect); margins to `0`.\n */\nconst ROOT_OFFSET_PROPERTIES = [\n    'marginTop',\n    'marginRight',\n    'marginBottom',\n    'marginLeft',\n    'top',\n    'right',\n    'bottom',\n    'left'\n] as const;\n\nconst stripRootOffsets = (element: HTMLElement): (() => void) => {\n    const style = element.style;\n    const previous = ROOT_OFFSET_PROPERTIES.map((property) => [property, style[property]] as const);\n    for (const property of ROOT_OFFSET_PROPERTIES) {\n        style[property] = property.startsWith('margin') ? '0px' : 'auto';\n    }\n    return () => {\n        for (const [property, value] of previous) {\n            style[property] = value;\n        }\n    };\n};\n","export interface LoggerOptions {\n    id: string;\n    enabled: boolean;\n}\n\nexport class Logger {\n    private readonly id: string;\n    private readonly enabled: boolean;\n    private readonly start: number;\n\n    constructor({ id, enabled }: LoggerOptions) {\n        this.id = id;\n        this.enabled = enabled;\n        this.start = Date.now();\n    }\n\n    debug(...args: unknown[]): void {\n        if (this.enabled) {\n            // eslint-disable-next-line no-console\n            if (typeof window !== 'undefined' && window.console && typeof console.debug === 'function') {\n                // eslint-disable-next-line no-console\n                console.debug(this.id, `${this.getTime()}ms`, ...args);\n            } else {\n                this.info(...args);\n            }\n        }\n    }\n\n    getTime(): number {\n        return Date.now() - this.start;\n    }\n\n    info(...args: unknown[]): void {\n        if (this.enabled) {\n            // eslint-disable-next-line no-console\n            if (typeof window !== 'undefined' && window.console && typeof console.info === 'function') {\n                // eslint-disable-next-line no-console\n                console.info(this.id, `${this.getTime()}ms`, ...args);\n            }\n        }\n    }\n\n    warn(...args: unknown[]): void {\n        if (this.enabled) {\n            if (typeof window !== 'undefined' && window.console && typeof console.warn === 'function') {\n                console.warn(this.id, `${this.getTime()}ms`, ...args);\n            } else {\n                this.info(...args);\n            }\n        }\n    }\n\n    error(...args: unknown[]): void {\n        if (this.enabled) {\n            if (typeof window !== 'undefined' && window.console && typeof console.error === 'function') {\n                console.error(this.id, `${this.getTime()}ms`, ...args);\n            } else {\n                this.info(...args);\n            }\n        }\n    }\n}\n","import { FEATURES } from './features';\nimport { Context } from './context';\nimport { throwIfAborted } from './abort-helper';\nimport {\n    DEFAULT_IMAGE_CACHE_SIZE,\n    DEFAULT_IMAGE_TIMEOUT_MS,\n    INLINE_IMAGE_RESOLVE_DELAY_MS,\n    MAX_IMAGE_CACHE_SIZE,\n    RESOURCE_KEY_LOG_LENGTH\n} from './constants';\n\nexport interface ResourceOptions {\n    imageTimeout: number;\n    useCORS: boolean;\n    allowTaint: boolean;\n    proxy?: string;\n    customIsSameOrigin?: (this: void, src: string, oldFn: (src: string) => boolean) => boolean | Promise<boolean>;\n    /**\n     * LRU cap for normal-mode (immediate) loads. Default: 100.\n     * Suspended between startDefer() and preloadAll() so every image collected\n     * during a render stays available to the renderer, which never reloads.\n     */\n    maxCacheSize?: number;\n}\n\ninterface CacheEntry {\n    value: Promise<HTMLImageElement | HTMLCanvasElement | undefined>;\n}\n\nexport class Cache {\n    private readonly _cache: Map<string, CacheEntry> = new Map();\n    private readonly maxSize: number;\n    private readonly _pendingOperations: Map<string, Promise<void>> = new Map();\n\n    /** When true, addImage() collects URLs without starting loads. */\n    private _deferMode = false;\n    /** URLs collected during defer mode, pending batch preload. */\n    private _collectedUrls: Set<string> = new Set();\n    /**\n     * Eviction is suspended between startDefer() and the end of preloadAll():\n     * the render pipeline loads every image it is going to paint inside that\n     * window, and match() never reloads, so an LRU eviction there would\n     * silently drop images from the output on pages with more unique images\n     * than maxSize.\n     *\n     * A counter (not a flag) keeps nested/overlapping defer windows — e.g.\n     * two renders sharing one cache via `config.cache` — suspended until the\n     * last one finishes preloading.\n     */\n    private _evictionSuspendCount = 0;\n\n    private get _evictionEnabled(): boolean {\n        return this._evictionSuspendCount === 0;\n    }\n\n    constructor(\n        private readonly context: Context,\n        private readonly _options: ResourceOptions\n    ) {\n        // Default cache size: 100 items\n        this.maxSize = _options.maxCacheSize ?? DEFAULT_IMAGE_CACHE_SIZE;\n\n        if (this.maxSize < 1) {\n            throw new Error('Cache maxSize must be at least 1');\n        }\n\n        if (this.maxSize > MAX_IMAGE_CACHE_SIZE) {\n            this.context.logger.warn(\n                `Cache maxSize ${this.maxSize} is very large and may cause memory issues. ` +\n                    `Consider using a smaller value (recommended: 100-1000).`\n            );\n        }\n    }\n\n    /**\n     * Enter defer mode: subsequent addImage() calls only collect URLs.\n     * Call preloadAll() to exit defer mode and batch-load all URLs.\n     */\n    startDefer(): void {\n        this._deferMode = true;\n        this._evictionSuspendCount++;\n    }\n\n    /**\n     * Exit defer mode and load all collected URLs in parallel, respecting\n     * an optional concurrency cap to avoid overwhelming the browser's network\n     * stack (default: 10 concurrent loads).\n     * After this call returns, all images are either loaded (cache hit) or\n     * failed (logged and reported via onError). Subsequent cache.match()\n     * calls return immediately.\n     *\n     * @param concurrency - Max concurrent image loads (1–100, default 10).\n     * @param onProgress - Invoked once before loading and after each settled\n     *   batch with (settledCount, totalCount), enabling coarse progress UI.\n     *   Not invoked when there is nothing to load.\n     * @param signal - Checked before each batch; aborting rejects the whole\n     *   preload with an AbortError instead of waiting for the remaining\n     *   batches to finish.\n     */\n    async preloadAll(\n        concurrency = 10,\n        onProgress?: (loaded: number, total: number) => void,\n        signal?: AbortSignal\n    ): Promise<void> {\n        this._deferMode = false;\n        const urls = Array.from(this._collectedUrls);\n        this._collectedUrls.clear();\n\n        try {\n            if (urls.length === 0) {\n                return;\n            }\n\n            const limit = Math.max(1, Math.min(concurrency, 100));\n            this.context.logger.debug(`Preloading ${urls.length} image(s) with concurrency ${limit}`);\n\n            // Load in batches to respect the concurrency cap while maximising\n            // parallelism within each batch. Each batch wait races the abort\n            // signal so an abort takes effect immediately, not after the\n            // current batch's slowest image settles; in-flight loads keep\n            // running but are already reported through the normal error path.\n            let settled = 0;\n            const abortPromise = signal\n                ? new Promise<never>((_, reject) => {\n                      const onAbort = (): void => reject(new DOMException('The operation was aborted.', 'AbortError'));\n                      if (signal.aborted) {\n                          onAbort();\n                      } else {\n                          signal.addEventListener('abort', onAbort, { once: true });\n                      }\n                  })\n                : null;\n            // An already-aborted signal exits via throwIfAborted before the\n            // first loop race subscribes to abortPromise; keep a no-op\n            // handler so that rejection is never unhandled.\n            abortPromise?.catch(() => undefined);\n            onProgress?.(0, urls.length);\n            for (let i = 0; i < urls.length; i += limit) {\n                throwIfAborted(signal);\n                const batch = urls.slice(i, i + limit);\n                batch.map((url) => this._addImageWithPending(url));\n                // _addImageWithPending stores the real load promise in the\n                // cache synchronously before its queued-start promise\n                // resolves, so awaiting the entries here waits for actual\n                // load completion — the documented contract of preloadAll —\n                // and makes onProgress report loaded (not merely started)\n                // images. Failures are already reported by the load catch.\n                const batchSettled = Promise.allSettled(\n                    batch.map((url) => this._cache.get(url)?.value ?? Promise.resolve())\n                );\n                // Race so an abort takes effect immediately, not after the\n                // current batch's slowest image settles; in-flight loads keep\n                // running but are already reported through the normal error\n                // path.\n                await (abortPromise ? Promise.race([batchSettled, abortPromise]) : batchSettled);\n                settled += batch.length;\n                onProgress?.(settled, urls.length);\n            }\n        } finally {\n            // Nested defer windows keep eviction suspended until the last one\n            // completes; never let a stray resume push the counter negative.\n            this._evictionSuspendCount = Math.max(0, this._evictionSuspendCount - 1);\n        }\n    }\n\n    addImage(src: string): Promise<void> {\n        // ── Defer mode: collect only ──────────────────────────────\n        if (this._deferMode) {\n            if (!this.has(src) && (isBlobImage(src) || isRenderable(src))) {\n                this._collectedUrls.add(src);\n            }\n            return Promise.resolve();\n        }\n\n        // ── Normal mode: immediate load ───────────────────────────\n        // Wait for any pending operations on this key\n        const pending = this._pendingOperations.get(src);\n        if (pending) {\n            return pending;\n        }\n\n        if (this.has(src)) {\n            // Move to end for LRU ordering\n            const entry = this._cache.get(src)!;\n            this._cache.delete(src);\n            this._cache.set(src, entry);\n            return Promise.resolve();\n        }\n\n        if (isBlobImage(src) || isRenderable(src)) {\n            return this._addImageWithPending(src);\n        }\n\n        return Promise.resolve();\n    }\n\n    /**\n     * Shared helper: enqueues loading for a single URL with pending-operation\n     * deduplication and error swallowing. Used by both addImage() (normal mode)\n     * and preloadAll() (batch mode).\n     */\n    private _addImageWithPending(src: string): Promise<void> {\n        const pending = this._pendingOperations.get(src);\n        if (pending) {\n            return pending;\n        }\n\n        const operation = this._addImageInternal(src);\n        this._pendingOperations.set(src, operation);\n        operation.finally(() => {\n            this._pendingOperations.delete(src);\n        });\n\n        return operation;\n    }\n\n    private async _addImageInternal(src: string): Promise<void> {\n        const timeoutMs = this._options.imageTimeout ?? DEFAULT_IMAGE_TIMEOUT_MS;\n        const imageWithTimeout = this.withTimeout(\n            this.loadImage(src),\n            timeoutMs,\n            `Timed out (${timeoutMs}ms) loading image`\n        );\n\n        // Handle errors to prevent unhandled rejections. The failure is\n        // reported once, here at load time, via both the logger and the\n        // onError hook; renderer-side catch blocks keep their own log lines\n        // but must not re-report the same resource to onError.\n        imageWithTimeout.catch((error) => {\n            const reason = error instanceof Error ? error.message : String(error);\n            const message = `Failed to load image ${src.substring(0, RESOURCE_KEY_LOG_LENGTH)}: ${reason}`;\n            this.context.logger.error(message);\n            this.context.onError?.(new Error(message));\n        });\n\n        // Store the promise with timeout in cache\n        this.set(src, imageWithTimeout);\n    }\n\n    private withTimeout<T>(promise: Promise<T>, timeoutMs: number, message: string): Promise<T> {\n        if (timeoutMs <= 0) {\n            return promise;\n        }\n\n        let timeoutId: ReturnType<typeof setTimeout> | undefined;\n        const timeout = new Promise<never>((_, reject) => {\n            timeoutId = setTimeout(() => reject(new Error(message)), timeoutMs);\n        });\n\n        return Promise.race([promise, timeout]).finally(() => {\n            if (timeoutId !== undefined) {\n                clearTimeout(timeoutId);\n            }\n        });\n    }\n\n    match(src: string): Promise<HTMLImageElement | HTMLCanvasElement | undefined> | undefined {\n        const entry = this._cache.get(src);\n        if (entry) {\n            // Move to end for LRU ordering (O(1))\n            this._cache.delete(src);\n            this._cache.set(src, entry);\n            return entry.value;\n        }\n        return undefined;\n    }\n\n    /**\n     * Set a value in cache with LRU eviction (O(1) via Map insertion order).\n     * Map preserves insertion order; delete+set on access moves items to the end.\n     * The first key in Map.keys() is always the least recently used.\n     */\n    private set(key: string, value: Promise<HTMLImageElement | HTMLCanvasElement | undefined>): void {\n        if (this._cache.has(key)) {\n            // Update existing entry: move to end of Map\n            this._cache.delete(key);\n        } else if (this._evictionEnabled && this._cache.size >= this.maxSize) {\n            // Evict LRU (first key = least recently used) — O(1)\n            const lruKey = this._cache.keys().next().value;\n            if (lruKey !== undefined) {\n                this._cache.delete(lruKey);\n                this.context.logger.debug(`Cache: Evicted LRU entry: ${lruKey}`);\n            }\n        }\n\n        this._cache.set(key, { value });\n    }\n\n    /**\n     * Get cache size\n     */\n    size(): number {\n        return this._cache.size;\n    }\n\n    /**\n     * Get max cache size\n     */\n    getMaxSize(): number {\n        return this.maxSize;\n    }\n\n    /**\n     * Clear all cache entries\n     */\n    clear(): void {\n        this._cache.clear();\n    }\n\n    private async loadImage(key: string): Promise<HTMLImageElement | undefined> {\n        const originChecker = this.context.originChecker;\n        const defaultIsSameOrigin = (src: string) => originChecker.isSameOrigin(src);\n\n        const isSameOrigin: boolean =\n            typeof this._options.customIsSameOrigin === 'function'\n                ? await this._options.customIsSameOrigin(key, defaultIsSameOrigin)\n                : defaultIsSameOrigin(key);\n        // With allowTaint disabled (the default), a cross-origin image is safe to\n        // draw only when the server sends CORS headers. Instead of skipping such\n        // images outright, still ATTEMPT a CORS load: it succeeds for CORS-enabled\n        // hosts (CDNs, avatar services, picsum, ...) and fails cleanly for hosts\n        // without CORS headers, where the image is skipped exactly as before\n        // (issue #229). An explicit proxy takes precedence so existing setups\n        // that rely on proxying keep working.\n        const canAttemptCors =\n            !isSameOrigin &&\n            this._options.allowTaint === false &&\n            !isInlineImage(key) &&\n            !isBlobImage(key) &&\n            typeof this._options.proxy !== 'string';\n        const useCORS =\n            !isInlineImage(key) &&\n            (this._options.useCORS === true || canAttemptCors) &&\n            FEATURES.SUPPORT_CORS_IMAGES &&\n            !isSameOrigin;\n        const useProxy =\n            !isInlineImage(key) &&\n            !isSameOrigin &&\n            !isBlobImage(key) &&\n            typeof this._options.proxy === 'string' &&\n            !useCORS;\n        if (\n            !isSameOrigin &&\n            this._options.allowTaint === false &&\n            !isInlineImage(key) &&\n            !isBlobImage(key) &&\n            !useProxy &&\n            !useCORS\n        ) {\n            return;\n        }\n\n        let src = key;\n        if (useProxy) {\n            src = await this.proxy(src);\n        }\n\n        this.context.logger.debug(`Added image ${key.substring(0, RESOURCE_KEY_LOG_LENGTH)}`);\n\n        // Allocate the image in the configured window's realm when available\n        // so multi-window captures do not depend on the global constructor.\n        const imageConstructor = (this.context.config.window as Window & { Image?: typeof Image }).Image ?? Image;\n\n        return await new Promise((resolve, reject) => {\n            const img = new imageConstructor();\n            img.onload = () => resolve(img);\n            img.onerror = reject;\n            //ios safari 10.3 taints canvas with data urls unless crossOrigin is set to anonymous\n            if (isInlineBase64Image(src) || useCORS) {\n                img.crossOrigin = 'anonymous';\n            }\n            img.src = src;\n            if (img.complete === true) {\n                // Cached and data-URL images are complete synchronously, which\n                // means the load event already fired. Wait for the bitmap to\n                // be usable via decode() — without the fixed 500ms timer the\n                // previous fallback added to every such image.\n                if (typeof img.decode === 'function') {\n                    img.decode().then(\n                        () => resolve(img),\n                        () => reject(new Error(`Failed to decode image ${src.substring(0, RESOURCE_KEY_LOG_LENGTH)}`))\n                    );\n                } else {\n                    setTimeout(() => resolve(img), INLINE_IMAGE_RESOLVE_DELAY_MS);\n                }\n            }\n        });\n    }\n\n    private has(key: string): boolean {\n        return this._cache.has(key);\n    }\n\n    keys(): Promise<string[]> {\n        return Promise.resolve(Array.from(this._cache.keys()));\n    }\n\n    private proxy(src: string): Promise<string> {\n        const proxy = this._options.proxy;\n\n        if (!proxy) {\n            throw new Error('No proxy defined');\n        }\n\n        const key = src.substring(0, RESOURCE_KEY_LOG_LENGTH);\n\n        return new Promise((resolve, reject) => {\n            const xhr = new XMLHttpRequest();\n            xhr.onload = () => {\n                if (xhr.status === 200) {\n                    const reader = new FileReader();\n                    reader.addEventListener('load', () => resolve(reader.result as string), false);\n                    reader.addEventListener('error', (e) => reject(e), false);\n                    reader.readAsDataURL(xhr.response as Blob);\n                } else {\n                    reject(`Failed to proxy resource ${key} with status code ${xhr.status}`);\n                }\n            };\n\n            xhr.onerror = reject;\n            const queryString = proxy.indexOf('?') > -1 ? '&' : '?';\n            // The responseType query parameter is part of the proxy server\n            // contract (tests/proxy.cjs and the upstream html2canvas proxy).\n            xhr.open('GET', `${proxy}${queryString}url=${encodeURIComponent(src)}&responseType=blob`);\n            xhr.responseType = 'blob';\n\n            if (this._options.imageTimeout) {\n                const timeout = this._options.imageTimeout;\n                xhr.timeout = timeout;\n                xhr.ontimeout = () => reject(`Timed out (${timeout}ms) proxying ${key}`);\n            }\n\n            xhr.send();\n        });\n    }\n}\n\nconst INLINE_SVG = /^data:image\\/svg\\+xml/i;\nconst INLINE_BASE64 = /^data:image\\/.*;base64,/i;\nconst INLINE_IMG = /^data:image\\/.*/i;\n\nconst isRenderable = (src: string): boolean => FEATURES.SUPPORT_SVG_DRAWING || !isSVG(src);\nconst isInlineImage = (src: string): boolean => INLINE_IMG.test(src);\nconst isInlineBase64Image = (src: string): boolean => INLINE_BASE64.test(src);\nconst isBlobImage = (src: string): boolean => src.substring(0, 4) === 'blob';\n\nconst isSVG = (src: string): boolean => src.slice(-3).toLowerCase() === 'svg' || INLINE_SVG.test(src);\n","/**\n * Origin Checker\n *\n * Provides origin checking functionality without global static state.\n * Each instance maintains its own base URI and origin reference.\n *\n * Replaces the static methods in CacheStorage with instance-based approach.\n */\nexport class OriginChecker {\n    private readonly baseUri: string;\n    private readonly origin: string;\n\n    constructor(window: Window) {\n        if (!window || !window.document) {\n            throw new Error('Valid window object required for OriginChecker');\n        }\n\n        if (!window.location || !window.location.href) {\n            throw new Error('Window object must have valid location');\n        }\n\n        this.baseUri = window.location.href;\n        this.origin = this.getOrigin(window.location.href);\n    }\n\n    /**\n     * Get the origin (protocol + hostname + port) of a URL\n     *\n     * @param url - URL to parse; relative URLs resolve against the context\n     *              window's location, as the anchor element used to\n     * @returns Origin string (e.g. \"https://example.com:8080\"), or an empty\n     *          string for unparseable URLs — which never matches and is\n     *          therefore treated as cross-origin\n     */\n    getOrigin(url: string): string {\n        // `new URL().origin` replaces the IE9-era double-href anchor hack and\n        // is collision-safe for IPv6 hosts.\n        try {\n            return new URL(url, this.baseUri).origin;\n        } catch (e) {\n            return '';\n        }\n    }\n\n    /**\n     * Check if a URL is from the same origin as the context\n     *\n     * @param src - URL to check\n     * @returns true if same origin, false otherwise\n     */\n    isSameOrigin(src: string): boolean {\n        return this.getOrigin(src) === this.origin;\n    }\n\n    /**\n     * Get the current context origin\n     *\n     * @returns The origin of the context window\n     */\n    getContextOrigin(): string {\n        return this.origin;\n    }\n}\n","import { Logger } from './logger';\nimport { Cache, ResourceOptions } from './cache-storage';\nimport { Bounds } from '../css/layout/bounds';\nimport { OriginChecker } from './origin-checker';\nimport { Html2CanvasConfig } from '../config';\n\nexport type ContextOptions = {\n    logging: boolean;\n    cache?: Cache;\n    /** Called when a resource fails to load. */\n    onError?: (error: Error) => void;\n} & ResourceOptions;\n\nexport class Context {\n    // Declared before the instance fields that read it: ES2022 define\n    // semantics flag use-before-initialization otherwise.\n    private static instanceCount = 1;\n\n    private readonly instanceName = `#${Context.instanceCount++}`;\n    readonly logger: Logger;\n    readonly cache: Cache;\n    readonly originChecker: OriginChecker;\n    readonly config: Html2CanvasConfig;\n    readonly onError?: (error: Error) => void;\n\n    private _windowBounds: Bounds;\n\n    constructor(options: ContextOptions, windowBounds: Bounds, config: Html2CanvasConfig) {\n        this.config = config;\n        this.logger = new Logger({ id: this.instanceName, enabled: options.logging });\n        this.originChecker = new OriginChecker(config.window);\n        this.cache = options.cache ?? config.cache ?? new Cache(this, options);\n        this.onError = options.onError;\n        this._windowBounds = windowBounds;\n    }\n\n    /** Viewport bounds in page coordinates; added to client rects during bounds parsing. */\n    get windowBounds(): Bounds {\n        return this._windowBounds;\n    }\n\n    /**\n     * Document used to allocate offscreen resources (offscreen canvases,\n     * images, measurement elements). Prefers the configured window's document\n     * so resources live in the captured realm; falls back to the global\n     * document, which keeps mock environments without a window document\n     * working.\n     */\n    get resourceDocument(): Document {\n        const windowDocument = (this.config.window as { document?: Document }).document;\n        if (windowDocument) {\n            return windowDocument;\n        }\n        return typeof document !== 'undefined' ? document : (undefined as unknown as Document);\n    }\n\n    /**\n     * Compensate window bounds for a page scroll that the browser performed\n     * underneath us. Used by the document cloner: WebKit's scroll anchoring can\n     * scroll the cloned iframe after `onclone`, and the offset must be applied\n     * to subsequent bounds parsing (the only sanctioned mutation of this value).\n     */\n    adjustWindowBounds(left: number, top: number): void {\n        this._windowBounds = this._windowBounds.add(left, top, 0, 0);\n    }\n}\n","import type { Options } from '../options';\nimport type { Html2CanvasConfig } from '../config';\nimport type { ResourceOptions } from './cache-storage';\nimport type { ContextOptions } from './context';\nimport type { CloneConfigurations } from '../dom/document-cloner';\nimport type { RenderConfigurations } from '../render/canvas/canvas-renderer';\nimport { DEFAULT_IMAGE_TIMEOUT_MS } from './constants';\n\n/**\n * Coerce known numeric options from string (or other) values to actual numbers.\n * Mutates the opts object in place — this is intentionally a normalisation\n * (not pure) step that runs once at the beginning of renderElement.\n */\nexport const coerceNumberOptions = (opts: Partial<Options>): void => {\n    const numKeys: (keyof Options)[] = [\n        'scale',\n        'width',\n        'height',\n        'imageTimeout',\n        'x',\n        'y',\n        'windowWidth',\n        'windowHeight',\n        'scrollX',\n        'scrollY'\n    ];\n    numKeys.forEach((key) => {\n        const v = opts[key];\n        if (v !== undefined && v !== null && typeof v !== 'number') {\n            const n = Number(v);\n            if (!Number.isNaN(n)) {\n                (opts as Record<string, unknown>)[key] = n;\n            }\n        }\n    });\n};\n\n/** Assemble resource loading options from user-provided Options. */\nexport const assembleResourceOptions = (opts: Partial<Options>): ResourceOptions => ({\n    allowTaint: opts.allowTaint ?? false,\n    imageTimeout: opts.imageTimeout ?? DEFAULT_IMAGE_TIMEOUT_MS,\n    proxy: opts.proxy,\n    useCORS: opts.useCORS ?? false,\n    customIsSameOrigin: opts.customIsSameOrigin,\n    maxCacheSize: opts.maxCacheSize\n});\n\n/** Assemble context (logging + cache) options, extending resource options. */\nexport const assembleContextOptions = (\n    opts: Partial<Options>,\n    config: Html2CanvasConfig,\n    resourceOptions: ResourceOptions\n): ContextOptions => ({\n    logging: opts.logging ?? true,\n    cache: opts.cache ?? config.cache,\n    ...resourceOptions\n});\n\n/** Assemble window / viewport options. */\nexport interface AssembledWindowOptions {\n    windowWidth: number;\n    windowHeight: number;\n    scrollX: number;\n    scrollY: number;\n}\n\nconst DEFAULT_WINDOW_WIDTH = 800;\nconst DEFAULT_WINDOW_HEIGHT = 600;\nconst DEFAULT_SCROLL = 0;\n\nexport const assembleWindowOptions = (opts: Partial<Options>, defaultView: Window): AssembledWindowOptions => {\n    const win = defaultView as Window & {\n        innerWidth?: number;\n        innerHeight?: number;\n        pageXOffset?: number;\n        pageYOffset?: number;\n    };\n    return {\n        windowWidth: opts.windowWidth ?? win.innerWidth ?? DEFAULT_WINDOW_WIDTH,\n        windowHeight: opts.windowHeight ?? win.innerHeight ?? DEFAULT_WINDOW_HEIGHT,\n        scrollX: opts.scrollX ?? win.pageXOffset ?? DEFAULT_SCROLL,\n        scrollY: opts.scrollY ?? win.pageYOffset ?? DEFAULT_SCROLL\n    };\n};\n\n/** Assemble DOM cloning options. */\nexport const assembleCloneOptions = (\n    opts: Partial<Options>,\n    config: Html2CanvasConfig,\n    foreignObjectRendering: boolean\n): CloneConfigurations => ({\n    allowTaint: opts.allowTaint ?? false,\n    onclone: opts.onclone,\n    ignoreElements: opts.ignoreElements,\n    iframeContainer: opts.iframeContainer,\n    inlineImages: foreignObjectRendering,\n    copyStyles: foreignObjectRendering,\n    cspNonce: opts.cspNonce ?? config.cspNonce,\n    signal: opts.signal\n});\n\n/** Assemble canvas rendering options. */\nexport const assembleRenderOptions = (\n    opts: Partial<Options>,\n    backgroundColor: number | null,\n    left: number,\n    top: number,\n    width: number,\n    height: number,\n    devicePixelRatio: number\n): RenderConfigurations => ({\n    canvas: opts.canvas,\n    backgroundColor,\n    signal: opts.signal,\n    scale: opts.scale ?? devicePixelRatio ?? 1,\n    x: (opts.x ?? 0) + left,\n    y: (opts.y ?? 0) + top,\n    width: opts.width ?? Math.ceil(width),\n    height: opts.height ?? Math.ceil(height),\n    imageSmoothing: opts.imageSmoothing,\n    imageSmoothingQuality: opts.imageSmoothingQuality\n});\n","import { parseColor, TRANSPARENT_COLOR, type Color } from '../css/types/color';\nimport { isTransparent } from '../css/types/color-utilities';\nimport type { Context } from './context';\n\n/**\n * Resolve the background colour for the rendered canvas, following CSS\n * background propagation rules:\n *\n * 1. If the target element is `<html>`, inherit the first opaque ancestor\n *    (doc → body → fallback).\n * 2. Otherwise use the user-supplied backgroundColor, or opaque white.\n *\n * @param context               - Current rendering context.\n * @param element               - The root element being rendered.\n * @param backgroundColorOverride - User-supplied override (string | null).\n * @returns A resolved colour value suitable for filling the canvas.\n */\nexport const parseBackgroundColor = (\n    context: Context,\n    element: HTMLElement,\n    backgroundColorOverride?: string | null\n): Color => {\n    const ownerDocument = element.ownerDocument;\n    // http://www.w3.org/TR/css3-background/#special-backgrounds\n    const documentBackgroundColor = ownerDocument.documentElement\n        ? parseColor(context, getComputedStyle(ownerDocument.documentElement).backgroundColor as string)\n        : TRANSPARENT_COLOR;\n    const bodyBackgroundColor = ownerDocument.body\n        ? parseColor(context, getComputedStyle(ownerDocument.body).backgroundColor as string)\n        : TRANSPARENT_COLOR;\n\n    const defaultBackgroundColor =\n        typeof backgroundColorOverride === 'string'\n            ? parseColor(context, backgroundColorOverride)\n            : backgroundColorOverride === null\n              ? TRANSPARENT_COLOR\n              : 0xffffffff;\n\n    return element === ownerDocument.documentElement\n        ? isTransparent(documentBackgroundColor)\n            ? isTransparent(bodyBackgroundColor)\n                ? defaultBackgroundColor\n                : bodyBackgroundColor\n            : documentBackgroundColor\n        : defaultBackgroundColor;\n};\n","import { Bounds, parseBounds, parseDocumentSize } from '../css/layout/bounds';\nimport { TRANSPARENT_COLOR } from '../css/types/color';\nimport { CloneConfigurations, DocumentCloner } from '../dom/document-cloner';\nimport { isBodyElement, isHTMLElement } from '../dom/node-type-guards';\nimport { parseTree } from '../dom/node-parser';\nimport { ElementContainer } from '../dom/element-container';\nimport { CanvasRenderer, RenderConfigurations } from '../render/canvas/canvas-renderer';\nimport { ForeignObjectRenderer } from '../render/canvas/foreignobject-renderer';\nimport { Context } from './context';\nimport { Html2CanvasConfig } from '../config';\nimport { createDefaultValidator } from './validator';\nimport { PerformanceMonitor } from './performance-monitor';\nimport type { Options } from '../options';\nimport { throwIfAborted } from './abort-helper';\nimport {\n    coerceNumberOptions,\n    assembleResourceOptions,\n    assembleContextOptions,\n    assembleWindowOptions,\n    assembleCloneOptions,\n    assembleRenderOptions\n} from './config-assembler';\nimport { parseBackgroundColor } from './background-parser';\n\n/**\n * Progress milestones emitted via `Options.onProgress`.\n * Phase names are stable API; percentages are coarse estimates.\n */\nexport const enum ProgressPhase {\n    CLONE = 'clone',\n    PARSE = 'parse',\n    PRELOAD = 'preload',\n    LAYOUT = 'layout',\n    RENDER = 'render'\n}\n\nconst emitProgress = (\n    onProgress: ((phase: string, progress: number) => void) | undefined,\n    context: Context,\n    phase: string,\n    progress: number\n): void => {\n    if (!onProgress) {\n        return;\n    }\n    try {\n        onProgress(phase, progress);\n    } catch (error) {\n        // A broken consumer callback must never break the render itself.\n        context.logger.error(`onProgress callback failed: ${error instanceof Error ? error.message : String(error)}`);\n    }\n};\n\nexport const renderElement = async (\n    element: HTMLElement,\n    opts: Partial<Options>,\n    config: Html2CanvasConfig\n): Promise<HTMLCanvasElement> => {\n    coerceNumberOptions(opts);\n\n    // Input validation (unless explicitly skipped)\n    if (!opts.skipValidation) {\n        const validator = opts.validator || createDefaultValidator();\n\n        const elementValidation = validator.validateElement(element);\n        if (!elementValidation.valid) {\n            throw new Error(elementValidation.error);\n        }\n\n        const optionsValidation = validator.validateOptions(opts);\n        if (!optionsValidation.valid) {\n            throw new Error(`Invalid options: ${optionsValidation.error}`);\n        }\n    }\n\n    if (!element || typeof element !== 'object') {\n        throw new Error('Invalid element provided as first argument');\n    }\n    const ownerDocument = element.ownerDocument;\n\n    if (!ownerDocument) {\n        throw new Error(`Element is not attached to a Document`);\n    }\n\n    const defaultView = ownerDocument.defaultView;\n\n    if (!defaultView) {\n        throw new Error(`Document is not attached to a Window`);\n    }\n\n    const resourceOptions = assembleResourceOptions(opts);\n    const contextOptions = assembleContextOptions(opts, config, resourceOptions);\n    const windowOptions = assembleWindowOptions(opts, defaultView);\n\n    const windowBounds = new Bounds(\n        windowOptions.scrollX,\n        windowOptions.scrollY,\n        windowOptions.windowWidth,\n        windowOptions.windowHeight\n    );\n\n    const context = new Context(contextOptions, windowBounds, config);\n\n    const performanceMonitoring = opts.enablePerformanceMonitoring ?? opts.logging ?? false;\n    const perfMonitor = new PerformanceMonitor(context, performanceMonitoring);\n\n    perfMonitor.start('total', {\n        width: windowOptions.windowWidth,\n        height: windowOptions.windowHeight\n    });\n\n    const signal = opts.signal;\n\n    throwIfAborted(signal);\n\n    const foreignObjectRendering = opts.foreignObjectRendering ?? false;\n    const cloneOptions: CloneConfigurations = assembleCloneOptions(opts, config, foreignObjectRendering);\n\n    context.logger.debug(\n        `Starting document clone with size ${windowBounds.width}x${\n            windowBounds.height\n        } scrolled to ${-windowBounds.left},${-windowBounds.top}`\n    );\n\n    emitProgress(opts.onProgress, context, ProgressPhase.CLONE, 10);\n\n    perfMonitor.start('clone');\n    const documentCloner = new DocumentCloner(context, element, cloneOptions);\n    const clonedElement = documentCloner.clonedReferenceElement;\n    if (!clonedElement) {\n        throw new Error('Unable to find element in cloned iframe');\n    }\n\n    const container = await documentCloner.toIFrame(ownerDocument, windowBounds);\n    perfMonitor.end('clone');\n\n    emitProgress(opts.onProgress, context, ProgressPhase.CLONE, 30);\n\n    if (signal?.aborted) {\n        if (opts.removeContainer ?? true) {\n            DocumentCloner.destroy(container);\n        }\n        throwIfAborted(signal);\n    }\n\n    const { width, height, left, top } =\n        isBodyElement(clonedElement) || isHTMLElement(clonedElement)\n            ? parseDocumentSize(clonedElement.ownerDocument)\n            : parseBounds(context, clonedElement);\n\n    const backgroundColor = parseBackgroundColor(context, clonedElement, opts.backgroundColor);\n\n    const renderOptions: RenderConfigurations = assembleRenderOptions(\n        opts,\n        backgroundColor,\n        left,\n        top,\n        width,\n        height,\n        defaultView.devicePixelRatio ?? 1\n    );\n\n    let canvas;\n\n    let root: ElementContainer | undefined;\n\n    try {\n        if (foreignObjectRendering) {\n            context.logger.debug(`Document cloned, using foreign object rendering`);\n            perfMonitor.start('render-foreignobject');\n            const renderer = new ForeignObjectRenderer(context, renderOptions);\n            canvas = await renderer.render(clonedElement);\n            perfMonitor.end('render-foreignobject');\n        } else {\n            context.logger.debug(\n                `Document cloned, element located at ${left},${top} with size ${width}x${height} using computed rendering`\n            );\n\n            context.logger.debug(`Starting DOM parsing`);\n            perfMonitor.start('parse');\n            throwIfAborted(signal);\n            // Enter defer mode: collect all image URLs during parse without\n            // starting individual loads. This avoids serialised loading in\n            // DOM-traversal order.\n            context.cache.startDefer();\n            root = parseTree(context, clonedElement, { normalizeDom: opts.normalizeDom });\n            perfMonitor.end('parse');\n\n            emitProgress(opts.onProgress, context, ProgressPhase.PARSE, 50);\n\n            // Batch-preload all collected images in parallel before rendering,\n            // reporting progress across the 50→60 range. The abort signal\n            // stops the wait as soon as it fires instead of after the\n            // slowest batch's images settle.\n            perfMonitor.start('preload');\n            await context.cache.preloadAll(\n                10,\n                (loaded, total) => {\n                    emitProgress(\n                        opts.onProgress,\n                        context,\n                        ProgressPhase.PRELOAD,\n                        50 + Math.round((loaded / total) * 10)\n                    );\n                },\n                signal\n            );\n            perfMonitor.end('preload');\n\n            // Element bounds and text layout were measured during parse; with\n            // image resources resolved the layout information is final.\n            emitProgress(opts.onProgress, context, ProgressPhase.LAYOUT, 60);\n\n            if (backgroundColor === root.styles.backgroundColor) {\n                root.styles.backgroundColor = TRANSPARENT_COLOR;\n            }\n\n            context.logger.debug(\n                `Starting renderer for element at ${renderOptions.x},${renderOptions.y} with size ${renderOptions.width}x${renderOptions.height}`\n            );\n\n            perfMonitor.start('render');\n            throwIfAborted(signal);\n            const renderer = new CanvasRenderer(context, renderOptions);\n            canvas = await renderer.render(root);\n            perfMonitor.end('render');\n        }\n\n        emitProgress(opts.onProgress, context, ProgressPhase.RENDER, 90);\n    } finally {\n        perfMonitor.start('cleanup');\n        try {\n            if (root) root.restoreTree();\n        } finally {\n            if (opts.removeContainer ?? true) DocumentCloner.destroy(container);\n            perfMonitor.end('cleanup');\n        }\n    }\n    perfMonitor.end('total');\n    context.logger.debug(`Finished rendering`);\n    if (performanceMonitoring) perfMonitor.logSummary();\n    emitProgress(opts.onProgress, context, ProgressPhase.RENDER, 100);\n    return canvas;\n};\n","import { Html2CanvasConfig, type ConfigOptions } from './config';\nimport { createDefaultValidator, Validator, type ValidationResult } from './core/validator';\nimport { PerformanceMonitor } from './core/performance-monitor';\nimport { renderElement } from './core/render-element';\nimport type { Options } from './options';\n\nexport type { Options };\n\n/**\n * Renders an HTML element to a `<canvas>` element.\n *\n * The function clones the target element and its subtree into a hidden iframe,\n * resolves all computed styles, and paints the result onto a canvas —\n * producing a visual snapshot of the DOM as it appears in the browser.\n *\n * @example\n * ```ts\n * import html2canvas from 'html2canvas-pro';\n *\n * const canvas = await html2canvas(document.body, {\n *   backgroundColor: '#ffffff',\n *   scale: 2,\n *   useCORS: true\n * });\n * document.body.appendChild(canvas);\n * ```\n *\n * @param element - The root HTMLElement to render.\n * @param options - Rendering options.\n * @param config  - Advanced configuration. In most cases this is auto-created;\n *                  only pass it if you need to share a cache across multiple calls.\n * @returns A promise that resolves to the rendered HTMLCanvasElement.\n *\n * @throws {Error} If the element is not attached to a document.\n * @throws {DOMException} If an {@link Options.signal|AbortSignal} was provided and the operation was aborted.\n */\nconst html2canvas = (\n    element: HTMLElement,\n    options: Partial<Options> = {},\n    config?: Html2CanvasConfig\n): Promise<HTMLCanvasElement> => {\n    const finalConfig =\n        config ||\n        Html2CanvasConfig.fromElement(element, {\n            cspNonce: options.cspNonce,\n            cache: options.cache\n        });\n\n    return renderElement(element, options, finalConfig);\n};\n\nexport default html2canvas;\nexport {\n    html2canvas,\n    Html2CanvasConfig,\n    ConfigOptions,\n    Validator,\n    ValidationResult,\n    createDefaultValidator,\n    PerformanceMonitor\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAiCA,IAAa,oBAAb,MAAa,kBAAkB;CAC3B;CACA;CACA;CAEA,YAAY,UAAyB,CAAC,GAAG;EACrC,MAAM,iBAAiB,QAAQ,WAAW,OAAO,WAAW,cAAc,SAAS,KAAA;EAEnF,IAAI,CAAC,gBACD,MAAM,IAAI,MAAM,6CAA6C;EAGjE,KAAK,SAAS;EACd,KAAK,WAAW,QAAQ;EACxB,KAAK,QAAQ,QAAQ;CACzB;;;;;CAMA,OAAO,YAAY,SAAsB,UAAkC,CAAC,GAAsB;EAC9F,MAAM,gBAAgB,QAAQ;EAE9B,IAAI,CAAC,eACD,MAAM,IAAI,MAAM,uCAAuC;EAG3D,MAAM,cAAc,cAAc;EAElC,IAAI,CAAC,aACD,MAAM,IAAI,MAAM,sCAAsC;EAG1D,OAAO,IAAI,kBAAkB;GACzB,QAAQ;GACR,GAAG;EACP,CAAC;CACL;;;;CAKA,MAAM,UAAkC,CAAC,GAAsB;EAC3D,OAAO,IAAI,kBAAkB;GACzB,QAAQ,QAAQ,UAAU,KAAK;GAC/B,UAAU,QAAQ,YAAY,KAAK;GACnC,OAAO,QAAQ,SAAS,KAAK;EACjC,CAAC;CACL;AACJ;;;;;;;;AC7BA,IAAa,YAAb,MAAuB;CACnB;CAEA,YAAY,SAA0B,CAAC,GAAG;EACtC,KAAK,SAAS;GACV,iBAAiB;GACjB,eAAe;GACf,GAAG;EACP;CACJ;;;;;;;;CASA,YAAY,KAAa,UAAyC,WAA6B;EAC3F,IAAI,CAAC,OAAO,OAAO,QAAQ,UACvB,OAAO;GACH,OAAO;GACP,OAAO;EACX;EAIJ,IAAI,IAAI,WAAW,OAAO,GAAG;GACzB,IAAI,CAAC,KAAK,OAAO,eACb,OAAO;IACH,OAAO;IACP,OAAO;GACX;GAEJ,OAAO;IAAE,OAAO;IAAM,WAAW;GAAI;EACzC;EAGA,IAAI,IAAI,WAAW,OAAO,GACtB,OAAO;GAAE,OAAO;GAAM,WAAW;EAAI;EAIzC,IAAI;GACA,MAAM,YAAY,IAAI,IAAI,GAAG;GAG7B,IAAI,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,SAAS,UAAU,QAAQ,GAChD,OAAO;IACH,OAAO;IACP,OAAO,YAAY,UAAU,SAAS;GAC1C;GAIJ,IAAI,YAAY,WAAW,KAAK,OAAO,uBAAuB,KAAK,OAAO,oBAAoB,SAAS,GAAG;IACtG,MAAM,WAAW,UAAU,SAAS,YAAY;IAMhD,IAAI,CALc,KAAK,OAAO,oBAAoB,MAAM,WAAW;KAC/D,MAAM,mBAAmB,OAAO,YAAY;KAC5C,OAAO,aAAa,oBAAoB,SAAS,SAAS,MAAM,gBAAgB;IACpF,CAEa,GACT,OAAO;KACH,OAAO;KACP,OAAO,gBAAgB,UAAU,SAAS;IAC9C;GAER;GAGA,IAAI,YAAY,SAAS;IACrB,IAAI,CAAC,KAAK,OAAO,qBAAqB;KAClC,MAAM,WAAW,UAAU,SAAS,YAAY;KAGhD,IAAI,aAAa,eAAe,aAAa,eAAe,aAAa,OACrE,OAAO;MACH,OAAO;MACP,OAAO;KACX;KAIJ,IAAI,KAAK,YAAY,QAAQ,GACzB,OAAO;MACH,OAAO;MACP,OAAO;KACX;KAIJ,IAAI,SAAS,WAAW,UAAU,KAAK,SAAS,WAAW,OAAO,GAC9D,OAAO;MACH,OAAO;MACP,OAAO;KACX;IAER;IAKA,OAAO;KAAE,OAAO;KAAM,WAAW;IAAI;GACzC;GAEA,OAAO;IAAE,OAAO;IAAM,WAAW;GAAI;EACzC,SAAS,GAAG;GACR,OAAO;IACH,OAAO;IACP,OAAO,uBAAuB,aAAa,QAAQ,EAAE,UAAU;GACnE;EACJ;CACJ;;;;CAKA,YAAoB,UAA2B;EAqB3C,IAAI;GAlBA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EAIkB,CAAC,CAAC,MAAM,YAAY,QAAQ,KAAK,QAAQ,CAAC,GAC5D,OAAO;EAIX,IAAI,SAAS,SAAS,GAAG,GACrB,OAAO,KAAK,cAAc,QAAQ;EAGtC,OAAO;CACX;;;;;CAMA,cAAsB,UAA2B;EAG7C,MAAM,OAFiB,SAAS,YAAY,CAAC,CAAC,KAEpB,CAAC,CAAC,QAAQ,YAAY,EAAE;EAElD,MAAM,kBAAkB,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM;EAE9C,IAAI,aAAa,KAAK,eAAe,KAAK,oBAAoB,OAC1D,OAAO;EAGX,IAAI,aAAa,KAAK,eAAe,KAAK,oBAAoB,MAC1D,OAAO;EAIX,MAAM,eAAe,KAAK,WAAW,eAAe;EACpD,IAAI,CAAC,cAED,OAAO,KAAK,oBAAoB,eAAe;EAInD,MAAM,YAAY,SAAS,aAAa,UAAU,GAAG,CAAC,GAAG,EAAE;EAC3D,IAAI,aAAa,OAAQ,aAAa,KAClC,OAAO;EAIX,IAAI,cAAc,KAAM;GACpB,MAAM,aAAa,SAAS,aAAa,UAAU,GAAG,CAAC,GAAG,EAAE;GAE5D,IAAI,cAAc,OAAQ,cAAc,KACpC,OAAO;EAEf;EAEA,IAAI,cAAc,KACd,OAAO;EAEX,OAAO;CACX;;;;;CAMA,WAAmB,MAA6B;EAC5C,IAAI;GAEA,IAAI,KAAK,SAAS,IAAI,GAAG;IACrB,MAAM,QAAQ,KAAK,MAAM,IAAI;IAC7B,IAAI,MAAM,SAAS,GACf,OAAO;IAEX,MAAM,YAAY,MAAM,KAAK,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC;IACpD,MAAM,aAAa,MAAM,KAAK,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC;IACrD,MAAM,eAAe,IAAI,UAAU,SAAS,WAAW;IACvD,IAAI,eAAe,GACf,OAAO;IAEX,MAAM,cAAc,MAAM,YAAY,CAAC,CAAC,KAAK,MAAM;IAEnD,OAAO;KADW,GAAG;KAAW,GAAG;KAAa,GAAG;IACrC,CAAC,CAAC,KAAK,MAAM,EAAE,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;GAC3D,OAAO;IAEH,MAAM,QAAQ,KAAK,MAAM,GAAG;IAC5B,IAAI,MAAM,WAAW,GACjB,OAAO;IAEX,OAAO,MAAM,KAAK,MAAM,EAAE,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;GACxD;EACJ,QAAQ;GACJ,OAAO;EACX;CACJ;;;;CAKA,oBAA4B,MAAuB;EAE/C,IAAI,sBAAsB,KAAK,IAAI,KAAK,sBAAsB,KAAK,IAAI,GACnE,OAAO;EAGX,IAAI,uBAAuB,KAAK,IAAI,GAChC,OAAO;EAGX,IAAI,sBAAsB,KAAK,IAAI,GAC/B,OAAO;EAEX,OAAO;CACX;;;;;;;CAQA,iBAAiB,OAAiC;EAC9C,IAAI,CAAC,SAAS,OAAO,UAAU,UAC3B,OAAO;GACH,OAAO;GACP,OAAO;EACX;EAKJ,IAAI,MAAM,SAAS,IACf,OAAO;GACH,OAAO;GACP,OAAO;EACX;EAIJ,IAAI,CAAC,sBAAsB,KAAK,KAAK,GACjC,OAAO;GACH,OAAO;GACP,OAAO;EACX;EAGJ,OAAO;GAAE,OAAO;GAAM,WAAW;EAAM;CAC3C;;;;;;;CAQA,qBAAqB,SAAmC;EACpD,IAAI,OAAO,YAAY,YAAY,MAAM,OAAO,GAC5C,OAAO;GACH,OAAO;GACP,OAAO;EACX;EAGJ,IAAI,UAAU,GACV,OAAO;GACH,OAAO;GACP,OAAO;EACX;EAGJ,IAAI,KAAK,OAAO,mBAAmB,UAAU,KAAK,OAAO,iBACrD,OAAO;GACH,OAAO;GACP,OAAO,iBAAiB,QAAQ,6BAA6B,KAAK,OAAO,gBAAgB;EAC7F;EAGJ,OAAO;GAAE,OAAO;GAAM,WAAW;EAAQ;CAC7C;;;;;;;;CASA,mBAAmB,OAAe,QAAkC;EAChE,IAAI,OAAO,UAAU,YAAY,OAAO,WAAW,UAC/C,OAAO;GACH,OAAO;GACP,OAAO;EACX;EAGJ,IAAI,MAAM,KAAK,KAAK,MAAM,MAAM,GAC5B,OAAO;GACH,OAAO;GACP,OAAO;EACX;EAGJ,IAAI,SAAS,KAAK,UAAU,GACxB,OAAO;GACH,OAAO;GACP,OAAO;EACX;EAIJ,MAAM,gBAAgB;EACtB,IAAI,QAAQ,iBAAiB,SAAS,eAClC,OAAO;GACH,OAAO;GACP,OAAO,sCAAsC,cAAc;EAC/D;EAGJ,OAAO;GAAE,OAAO;GAAM,WAAW;IAAE;IAAO;GAAO;EAAE;CACvD;;;;;;;CAQA,cAAc,OAAiC;EAC3C,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GACxC,OAAO;GACH,OAAO;GACP,OAAO;EACX;EAGJ,IAAI,SAAS,GACT,OAAO;GACH,OAAO;GACP,OAAO;EACX;EAIJ,IAAI,QAAQ,IACR,OAAO;GACH,OAAO;GACP,OAAO;EACX;EAGJ,OAAO;GAAE,OAAO;GAAM,WAAW;EAAM;CAC3C;;;;;;;CAQA,gBAAgB,SAAoC;EAChD,IAAI,CAAC,SACD,OAAO;GACH,OAAO;GACP,OAAO;EACX;EAGJ,IAAI,OAAO,YAAY,UACnB,OAAO;GACH,OAAO;GACP,OAAO;EACX;EAMJ,MAAM,KAAK;EACX,IAAI,OAAO,gBAAgB,eAAe,mBAAmB,aAAa;GAEtE,IAAI,CAAC,QAAQ,eACT,OAAO;IAAE,OAAO;IAAO,OAAO;GAAyC;GAE3E,OAAO,EAAE,OAAO,KAAK;EACzB;EAGA,IAAI,CAAC,GAAG,eACJ,OAAO;GACH,OAAO;GACP,OAAO;EACX;EAEJ,IAAI,CAAE,GAAG,cAA0C,aAC/C,OAAO;GACH,OAAO;GACP,OAAO;EACX;EAGJ,OAAO,EAAE,OAAO,KAAK;CACzB;;;;;;;CAQA,gBAAgB,SAAoD;EAChE,MAAM,SAAmB,CAAC;EAE1B,MAAM,WAAW,QAAQ;EACzB,IAAI,aAAa,KAAA,KAAa,aAAa,QAAQ,OAAO,aAAa,YAAY,SAAS,SAAS,GAAG;GACpG,MAAM,cAAc,KAAK,YAAY,UAAU,OAAO;GACtD,IAAI,CAAC,YAAY,OACb,OAAO,KAAK,UAAU,YAAY,OAAO;EAEjD;EAGA,IAAI,QAAQ,iBAAiB,KAAA,GAAW;GACpC,MAAM,gBAAgB,KAAK,qBAAqB,QAAQ,YAAsB;GAC9E,IAAI,CAAC,cAAc,OACf,OAAO,KAAK,kBAAkB,cAAc,OAAO;EAE3D;EACA,IAAI,QAAQ,UAAU,KAAA,KAAa,QAAQ,WAAW,KAAA,GAAW;GAC7D,MAAM,QAAS,QAAQ,SAAoB;GAC3C,MAAM,SAAU,QAAQ,UAAqB;GAC7C,MAAM,mBAAmB,KAAK,mBAAmB,OAAO,MAAM;GAC9D,IAAI,CAAC,iBAAiB,OAClB,OAAO,KAAK,eAAe,iBAAiB,OAAO;EAE3D;EAGA,IAAI,QAAQ,UAAU,KAAA,GAAW;GAC7B,MAAM,cAAc,KAAK,cAAc,QAAQ,KAAe;GAC9D,IAAI,CAAC,YAAY,OACb,OAAO,KAAK,UAAU,YAAY,OAAO;EAEjD;EAGA,IAAI,QAAQ,aAAa,KAAA,GAAW;GAChC,MAAM,cAAc,KAAK,iBAAiB,QAAQ,QAAkB;GACpE,IAAI,CAAC,YAAY,OACb,OAAO,KAAK,cAAc,YAAY,OAAO;EAErD;EAGA,IAAI,KAAK,OAAO,iBAAiB;GAC7B,MAAM,eAAe,KAAK,OAAO,gBAAgB,SAAS,SAAS;GACnE,IAAI,CAAC,aAAa,OACd,OAAO,KAAK,sBAAsB,aAAa,OAAO;EAE9D;EAEA,IAAI,OAAO,SAAS,GAChB,OAAO;GACH,OAAO;GACP,OAAO,OAAO,KAAK,IAAI;EAC3B;EAGJ,OAAO,EAAE,OAAO,KAAK;CACzB;AACJ;;;;AAKA,SAAgB,uBAAuB,SAA0B,CAAC,GAAc;CAC5E,OAAO,IAAI,UAAU;EACjB,eAAe;EACf,iBAAiB;EACjB,GAAG;CACP,CAAC;AACL;;;;;;;;;;;;;;;;;;;;AC3gBA,IAAa,qBAAb,MAAgC;CAOP;CANrB,gCAAiE,IAAI,IAAI;CACzE,mBAAyD,CAAC;CAC1D;CACA;CAEA,YACI,SACA,UAAmB,MACrB;EAFmB,KAAA,UAAA;EAGjB,KAAK,UAAU;EAGf,KAAK,UACD,OAAO,gBAAgB,eAAe,OAAO,YAAY,QAAQ,mBACrD,YAAY,IAAI,UAChB,KAAK,IAAI;CAC7B;;;;;;;CAQA,MAAM,MAAc,UAA0C;EAC1D,IAAI,CAAC,KAAK,SACN;EAGJ,IAAI,KAAK,cAAc,IAAI,IAAI,GAC3B,KAAK,SAAS,OAAO,KAAK,uBAAuB,KAAK,gCAAgC;EAG1F,KAAK,cAAc,IAAI,MAAM;GACzB;GACA,WAAW,KAAK,QAAQ;GACxB;EACJ,CAAC;CACL;;;;;;;CAQA,IAAI,MAA6C;EAC7C,IAAI,CAAC,KAAK,SACN;EAGJ,MAAM,SAAS,KAAK,cAAc,IAAI,IAAI;EAE1C,IAAI,CAAC,QAAQ;GACT,KAAK,SAAS,OAAO,KAAK,uBAAuB,KAAK,iCAAiC;GACvF;EACJ;EAEA,OAAO,UAAU,KAAK,QAAQ;EAC9B,OAAO,WAAW,OAAO,UAAU,OAAO;EAE1C,KAAK,iBAAiB,KAAK,MAAM;EACjC,KAAK,cAAc,OAAO,IAAI;EAE9B,KAAK,SAAS,OAAO,MAAM,OAAO,KAAK,IAAI,OAAO,SAAS,QAAQ,CAAC,EAAE,KAAK,OAAO,QAAQ;EAE1F,OAAO;CACX;;;;;;;;;CAUA,QAAW,MAAc,IAAa,UAAuC;EACzE,KAAK,MAAM,MAAM,QAAQ;EACzB,IAAI;GACA,MAAM,SAAS,GAAG;GAClB,KAAK,IAAI,IAAI;GACb,OAAO;EACX,SAAS,OAAO;GACZ,KAAK,IAAI,IAAI;GACb,MAAM;EACV;CACJ;;;;;;;;;CAUA,MAAM,aAAgB,MAAc,IAAsB,UAAgD;EACtG,KAAK,MAAM,MAAM,QAAQ;EACzB,IAAI;GACA,MAAM,SAAS,MAAM,GAAG;GACxB,KAAK,IAAI,IAAI;GACb,OAAO;EACX,SAAS,OAAO;GACZ,KAAK,IAAI,IAAI;GACb,MAAM;EACV;CACJ;;;;;;CAOA,aAAkC;EAC9B,OAAO,CAAC,GAAG,KAAK,gBAAgB;CACpC;;;;;;;CAQA,UAAU,MAA6C;EACnD,OAAO,KAAK,iBAAiB,MAAM,MAAM,EAAE,SAAS,IAAI;CAC5D;;;;;;CAOA,aAAiC;EAC7B,MAAM,gBAAgB,KAAK,iBAAiB,QAAQ,KAAK,WAAW,OAAO,OAAO,YAAY,IAAI,CAAC;EAEnG,MAAM,YAAY,KAAK,iBAAiB,KAAK,YAAY;GACrD,MAAM,OAAO;GACb,UAAU,OAAO,YAAY;GAC7B,YAAY,gBAAgB,MAAO,OAAO,YAAY,KAAK,gBAAiB,IAAA,CAAK,QAAQ,CAAC,IAAI,MAAM;EACxG,EAAE;EAEF,OAAO;GACH;GACA,SAAS,KAAK,WAAW;GACzB;EACJ;CACJ;;;;CAKA,aAAmB;EACf,IAAI,CAAC,KAAK,WAAW,KAAK,iBAAiB,WAAW,KAAK,CAAC,KAAK,SAC7D;EAGJ,MAAM,UAAU,KAAK,WAAW;EAEhC,KAAK,QAAQ,OAAO,KAAK,oCAAoC,QAAQ,cAAc,QAAQ,CAAC,EAAE,KAAK;EAEnG,QAAQ,UACH,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CACvC,SAAS,SAAS;GACf,KAAK,QAAS,OAAO,KACjB,KAAK,KAAK,KAAK,OAAO,EAAE,EAAE,GAAG,KAAK,SAAS,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,WAAW,SAAS,CAAC,GACtG;EACJ,CAAC;CACT;;;;CAKA,QAAc;EACV,KAAK,cAAc,MAAM;EACzB,KAAK,iBAAiB,OAAO,CAAC;CAClC;;;;CAKA,YAAqB;EACjB,OAAO,KAAK;CAChB;;;;;CAMA,mBAA6B;EACzB,OAAO,MAAM,KAAK,KAAK,cAAc,KAAK,CAAC;CAC/C;AACJ;;;AC9OA,IAAa,SAAb,MAAa,OAAO;CAEH;CACA;CACA;CACA;CAJb,YACI,MACA,KACA,OACA,QACF;EAJW,KAAA,OAAA;EACA,KAAA,MAAA;EACA,KAAA,QAAA;EACA,KAAA,SAAA;CACV;CAEH,IAAI,GAAW,GAAW,GAAW,GAAmB;EACpD,OAAO,IAAI,OAAO,KAAK,OAAO,GAAG,KAAK,MAAM,GAAG,KAAK,QAAQ,GAAG,KAAK,SAAS,CAAC;CAClF;CAEA,OAAO,eAAe,SAAkB,YAAgC;EACpE,OAAO,IAAI,OACP,WAAW,OAAO,QAAQ,aAAa,MACvC,WAAW,MAAM,QAAQ,aAAa,KACtC,WAAW,OACX,WAAW,MACf;CACJ;CAEA,OAAO,gBAAgB,SAAkB,aAAkC;EACvE,MAAM,QAAQ,MAAM,KAAK,WAAW;EAGpC,IAAI,UAAU,MAAM,MAAM,SAAS,KAAK,UAAU,CAAC;EAInD,IAAI,CAAC,SACD,UAAU,MAAM,MAAM,SAAS,KAAK,WAAW,CAAC;EAKpD,IAAI,CAAC,WAAW,MAAM,SAAS,GAC3B,UAAU,MAAM;EAGpB,OAAO,UACD,IAAI,OACA,QAAQ,OAAO,QAAQ,aAAa,MACpC,QAAQ,MAAM,QAAQ,aAAa,KACnC,QAAQ,OACR,QAAQ,MACZ,IACA,OAAO;CACjB;CAEA,OAAO,QAAQ,IAAI,OAAO,GAAG,GAAG,GAAG,CAAC;AACxC;AAEA,MAAa,eAAe,SAAkB,SAA0B;CACpE,OAAO,OAAO,eAAe,SAAS,KAAK,sBAAsB,CAAC;AACtE;AAEA,MAAa,qBAAqB,aAA+B;CAC7D,MAAM,OAAO,SAAS;CACtB,MAAM,kBAAkB,SAAS;CAEjC,IAAI,CAAC,QAAQ,CAAC,iBACV,MAAM,IAAI,MAAM,6BAA6B;CAcjD,OAAO,IAAI,OAAO,GAAG,GAZP,KAAK,IACf,KAAK,IAAI,KAAK,aAAa,gBAAgB,WAAW,GACtD,KAAK,IAAI,KAAK,aAAa,gBAAgB,WAAW,GACtD,KAAK,IAAI,KAAK,aAAa,gBAAgB,WAAW,CASlC,GANT,KAAK,IAChB,KAAK,IAAI,KAAK,cAAc,gBAAgB,YAAY,GACxD,KAAK,IAAI,KAAK,cAAc,gBAAgB,YAAY,GACxD,KAAK,IAAI,KAAK,cAAc,gBAAgB,YAAY,CAG7B,CAAM;AACzC;;;;;;;;ACvEA,MAAa,MAAS,OAAqB,UAAqB;CAC5D,MAAM,QAAQ,MAAM;CACpB,IAAI,UAAU,KAAA,GACV,MAAM,IAAI,MAAM,4BAA4B,OAAO;CAEvD,OAAO;AACX;ACkBA,MAAM,wBAAwB;AAqF9B,MAAM,WAAW,cAAsB,aAAA,MAAqB,aAAa;AACzE,MAAM,wBAAwB,cAAsB,aAAa,SAAU,aAAa;AACxF,MAAM,SAAS,cACX,QAAQ,SAAS,KAAM,aAAA,MAAkB,aAAA,MAAoB,aAAA,MAAkB,aAAA;AACnF,MAAM,qBAAqB,cAAsB,aAAA,MAAkB,aAAA;AACnE,MAAM,qBAAqB,cAAsB,aAAA,MAAkB,aAAA;AACnE,MAAM,YAAY,cAAsB,kBAAkB,SAAS,KAAK,kBAAkB,SAAS;AACnG,MAAM,uBAAuB,cAAsB,aAAA;AACnD,MAAM,gBAAgB,cAClB,cAAA,MAA2B,cAAA,KAAsC,cAAA;AACrE,MAAM,wBAAwB,cAC1B,SAAS,SAAS,KAAK,oBAAoB,SAAS,KAAK,cAAA;AAC7D,MAAM,mBAAmB,cACrB,qBAAqB,SAAS,KAAK,QAAQ,SAAS,KAAK,cAAA;AAC7D,MAAM,2BAA2B,cAA+B;CAC5D,OACK,aAAA,KAAqB,aAAA,KACtB,cAAA,MACC,aAAA,MAA0B,aAAA,MAC3B,cAAA;AAER;AACA,MAAM,iBAAiB,IAAY,OAAwB;CACvD,IAAI,OAAA,IACA,OAAO;CAGX,OAAO,OAAA;AACX;AACA,MAAM,qBAAqB,IAAY,IAAY,OAAwB;CACvE,IAAI,OAAA,IACA,OAAO,qBAAqB,EAAE,KAAK,cAAc,IAAI,EAAE;MACpD,IAAI,qBAAqB,EAAE,GAC9B,OAAO;MACJ,IAAI,OAAA,MAA0B,cAAc,IAAI,EAAE,GACrD,OAAO;CAEX,OAAO;AACX;AAEA,MAAM,iBAAiB,IAAY,IAAY,OAAwB;CACnE,IAAI,OAAA,MAAoB,OAAA,IAAqB;EACzC,IAAI,QAAQ,EAAE,GACV,OAAO;EAGX,OAAO,OAAA,MAAoB,QAAQ,EAAE;CACzC;CAEA,IAAI,OAAA,IACA,OAAO,QAAQ,EAAE;CAGrB,OAAO,QAAQ,EAAE;AACrB;AAoBA,MAAM,kBAAkB,eAAiC;CACrD,IAAI,IAAI;CACR,IAAI,OAAO;CACX,IAAI,WAAW,OAAA,MAAoB,WAAW,OAAA,IAAqB;EAC/D,IAAI,WAAW,OAAA,IACX,OAAO;EAEX;CACJ;CAEA,MAAM,WAAqB,CAAC;CAE5B,OAAO,QAAQ,WAAW,MAAM,GAAG,GAAG;EAClC,SAAS,KAAK,GAAG,YAAY,CAAC,CAAC;EAC/B;CACJ;CAEA,MAAM,MAAM,SAAS,SAAS,SAAS,OAAO,cAAc,GAAG,QAAQ,GAAG,EAAE,IAAI;CAEhF,IAAI,WAAW,OAAA,IACX;CAGJ,MAAM,WAAW,CAAC;CAClB,OAAO,QAAQ,WAAW,MAAM,GAAG,GAAG;EAClC,SAAS,KAAK,GAAG,YAAY,CAAC,CAAC;EAC/B;CACJ;CAEA,MAAM,QAAQ,SAAS;CACvB,MAAM,OAAO,QAAQ,SAAS,OAAO,cAAc,GAAG,QAAQ,GAAG,EAAE,IAAI;CAEvE,IAAI,WAAW,OAAA,MAAY,WAAW,OAAA,KAClC;CAGJ,IAAI,UAAU;CAEd,IAAI,WAAW,OAAA,MAAoB,WAAW,OAAA,IAAqB;EAC/D,IAAI,WAAW,OAAA,IACX,UAAU;EAEd;CACJ;CAEA,MAAM,WAAqB,CAAC;CAE5B,OAAO,QAAQ,WAAW,MAAM,GAAG,GAAG;EAClC,SAAS,KAAK,GAAG,YAAY,CAAC,CAAC;EAC/B;CACJ;CAEA,MAAM,MAAM,SAAS,SAAS,SAAS,OAAO,cAAc,GAAG,QAAQ,GAAG,EAAE,IAAI;CAEhF,OAAO,QAAQ,MAAM,OAAO,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,UAAU,GAAG;AAClF;;;AChPA,MAAa,yBAAgC,EACzC,MAAA,EACJ;AACA,MAAa,0BAAiC,EAC1C,MAAA,EACJ;AACA,MAAa,cAAqB,EAAE,MAAA,EAA4B;AAChE,MAAa,qBAA4B,EAAE,MAAA,GAAmC;AAC9E,MAAa,qBAA4B,EAAE,MAAA,EAAmC;AAC9E,MAAa,eAAsB,EAAE,MAAA,GAA6B;AAClE,MAAa,mBAA0B,EAAE,MAAA,EAAiC;AAC1E,MAAa,sBAA6B,EAAE,MAAA,GAAoC;AAChF,MAAa,2BAAkC,EAC3C,MAAA,GACJ;AACA,MAAa,4BAAmC,EAC5C,MAAA,GACJ;AACA,MAAa,wBAA+B,EAAE,MAAA,GAAsC;AACpF,MAAa,gBAAuB,EAAE,MAAA,GAA8B;AACpE,MAAa,mBAA0B,EAAE,MAAA,EAAiC;AAC1E,MAAa,YAAmB,EAAE,MAAA,GAA0B;AAC5D,MAAa,YAAmB,EAAE,MAAA,GAA0B;AAC5D,MAAa,cAAqB,EAAE,MAAA,GAA4B;AAChE,MAAa,kBAAyB,EAAE,MAAA,GAAgC;AACxE,MAAa,4BAAmC,EAC5C,MAAA,GACJ;AACA,MAAa,6BAAoC,EAC7C,MAAA,GACJ;AACA,MAAa,mBAA0B,EAAE,MAAA,GAAiC;AAC1E,MAAa,YAAmB,EAAE,MAAA,GAA0B;;;ACoG5D,IAAa,YAAb,MAAa,UAAU;CACnB,OAAe,QAAqB,CAAC;CACrC,OAAwB,gBAAgB;CAExC,OAAO,MAAiB;EACpB,OAAO,UAAU,MAAM,IAAI,KAAK,IAAI,UAAU;CAClD;CAEA,OAAO,QAAQ,WAA4B;EACvC,IAAI,UAAU,MAAM,SAAS,UAAU,eAAe;GAClD,UAAU,OAAO;GACjB,UAAU,MAAM,KAAK,SAAS;EAClC;CACJ;CAEA;;;;;;;;CAQA;CAEA,cAAc;EACV,KAAK,SAAS,CAAC;EACf,KAAK,UAAU;CACnB;CAEA,SAAuB;EACnB,KAAK,SAAS,CAAC;EACf,KAAK,UAAU;CACnB;CAEA,MAAM,OAAqB;EACvB,IAAI,KAAK,UAAU,GAAG;GAClB,KAAK,SAAS,KAAK,OAAO,MAAM,KAAK,OAAO;GAC5C,KAAK,UAAU;EACnB;EACA,KAAK,SAAS,KAAK,OAAO,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,SAAS,KAAK,YAAY,CAAC,CAAW,CAAC;CAC5F;CAEA,OAAmB;EACf,MAAM,SAAS,CAAC;EAChB,IAAI,QAAQ,KAAK,aAAa;EAC9B,OAAO,UAAU,WAAW;GACxB,OAAO,KAAK,KAAK;GACjB,QAAQ,KAAK,aAAa;EAC9B;EACA,OAAO;CACX;CAEA,eAAiC;EAC7B,MAAM,YAAY,KAAK,iBAAiB;EAExC,QAAQ,WAAR;GACI,KAAA,IACI,OAAO,KAAK,mBAAA,EAAiC;GACjD,KAAA,IAAkB;IACd,MAAM,KAAK,KAAK,cAAc,CAAC;IAC/B,MAAM,KAAK,KAAK,cAAc,CAAC;IAC/B,MAAM,KAAK,KAAK,cAAc,CAAC;IAC/B,IAAI,gBAAgB,EAAE,KAAK,cAAc,IAAI,EAAE,GAAG;KAC9C,MAAM,QAAQ,kBAAkB,IAAI,IAAI,EAAE,IAAA,IAAA;KAG1C,OAAO;MAAE,MAAA;MAA4B,OAFvB,KAAK,YAEkB;MAAO;KAAM;IACtD;IACA;GACJ;GACA,KAAA;IACI,IAAI,KAAK,cAAc,CAAC,MAAA,IAAmB;KACvC,KAAK,iBAAiB;KACtB,OAAO;IACX;IACA;GACJ,KAAA,IACI,OAAO,KAAK,mBAAA,EAA6B;GAC7C,KAAA,IACI,OAAO;GACX,KAAA,IACI,OAAO;GACX,KAAA;IACI,IAAI,KAAK,cAAc,CAAC,MAAA,IAAmB;KACvC,KAAK,iBAAiB;KACtB,OAAO;IACX;IACA;GACJ,KAAA;IACI,IAAI,cAAc,WAAW,KAAK,cAAc,CAAC,GAAG,KAAK,cAAc,CAAC,CAAC,GAAG;KACxE,KAAK,mBAAmB,SAAS;KACjC,OAAO,KAAK,oBAAoB;IACpC;IACA;GACJ,KAAA,IACI,OAAO;GACX,KAAA,IAAmB;IACf,MAAM,KAAK;IACX,MAAM,KAAK,KAAK,cAAc,CAAC;IAC/B,MAAM,KAAK,KAAK,cAAc,CAAC;IAE/B,IAAI,cAAc,IAAI,IAAI,EAAE,GAAG;KAC3B,KAAK,mBAAmB,SAAS;KACjC,OAAO,KAAK,oBAAoB;IACpC;IAEA,IAAI,kBAAkB,IAAI,IAAI,EAAE,GAAG;KAC/B,KAAK,mBAAmB,SAAS;KACjC,OAAO,KAAK,sBAAsB;IACtC;IAEA,IAAI,OAAA,MAAuB,OAAA,IAA0B;KACjD,KAAK,iBAAiB;KACtB,KAAK,iBAAiB;KACtB,OAAO;IACX;IACA;GACJ;GACA,KAAA;IACI,IAAI,cAAc,WAAW,KAAK,cAAc,CAAC,GAAG,KAAK,cAAc,CAAC,CAAC,GAAG;KACxE,KAAK,mBAAmB,SAAS;KACjC,OAAO,KAAK,oBAAoB;IACpC;IACA;GACJ,KAAA;IACI,IAAI,KAAK,cAAc,CAAC,MAAA,IAAgB;KACpC,KAAK,iBAAiB;KACtB,OAAO,MAAM;MACT,IAAI,IAAI,KAAK,iBAAiB;MAC9B,IAAI,MAAA,IAAgB;OAChB,IAAI,KAAK,iBAAiB;OAC1B,IAAI,MAAA,IACA,OAAO,KAAK,aAAa;MAEjC;MACA,IAAI,MAAA,IACA,OAAO,KAAK,aAAa;KAEjC;IACJ;IACA;GACJ,KAAA,IACI,OAAO;GACX,KAAA,IACI,OAAO;GACX,KAAA;IACI,IACI,KAAK,cAAc,CAAC,MAAA,MACpB,KAAK,cAAc,CAAC,MAAA,MACpB,KAAK,cAAc,CAAC,MAAA,IACtB;KACE,KAAK,iBAAiB;KACtB,KAAK,iBAAiB;KACtB,KAAK,iBAAiB;KACtB,OAAO;IACX;IACA;GACJ,KAAA,IAAoB;IAChB,MAAM,KAAK,KAAK,cAAc,CAAC;IAC/B,MAAM,KAAK,KAAK,cAAc,CAAC;IAC/B,MAAM,KAAK,KAAK,cAAc,CAAC;IAC/B,IAAI,kBAAkB,IAAI,IAAI,EAAE,GAE5B,OAAO;KAAE,MAAA;KAAkC,OAD7B,KAAK,YACwB;IAAM;IAErD;GACJ;GACA,KAAA,IACI,OAAO;GACX,KAAA;IACI,IAAI,cAAc,WAAW,KAAK,cAAc,CAAC,CAAC,GAAG;KACjD,KAAK,mBAAmB,SAAS;KACjC,OAAO,KAAK,sBAAsB;IACtC;IACA;GACJ,KAAA,IACI,OAAO;GACX,KAAA;IACI,IAAI,KAAK,cAAc,CAAC,MAAA,IAAmB;KACvC,KAAK,iBAAiB;KACtB,OAAO;IACX;IACA;GACJ,KAAA,KACI,OAAO;GACX,KAAA,KACI,OAAO;GACX,KAAA;GACA,KAAA,IAAQ;IACJ,MAAM,KAAK,KAAK,cAAc,CAAC;IAC/B,MAAM,KAAK,KAAK,cAAc,CAAC;IAC/B,IAAI,OAAA,OAAqB,MAAM,EAAE,KAAK,OAAA,KAAuB;KACzD,KAAK,iBAAiB;KACtB,OAAO,KAAK,yBAAyB;IACzC;IACA,KAAK,mBAAmB,SAAS;IACjC,OAAO,KAAK,sBAAsB;GACtC;GACA,KAAA;IACI,IAAI,KAAK,cAAc,CAAC,MAAA,IAAmB;KACvC,KAAK,iBAAiB;KACtB,OAAO;IACX;IACA,IAAI,KAAK,cAAc,CAAC,MAAA,KAAqB;KACzC,KAAK,iBAAiB;KACtB,OAAO;IACX;IACA;GACJ,KAAA;IACI,IAAI,KAAK,cAAc,CAAC,MAAA,IAAmB;KACvC,KAAK,iBAAiB;KACtB,OAAO;IACX;IACA;GACJ,KAAA,IACI,OAAO;EACf;EAEA,IAAI,aAAa,SAAS,GAAG;GACzB,KAAK,kBAAkB;GACvB,OAAO;EACX;EAEA,IAAI,QAAQ,SAAS,GAAG;GACpB,KAAK,mBAAmB,SAAS;GACjC,OAAO,KAAK,oBAAoB;EACpC;EAEA,IAAI,qBAAqB,SAAS,GAAG;GACjC,KAAK,mBAAmB,SAAS;GACjC,OAAO,KAAK,sBAAsB;EACtC;EAEA,OAAO;GAAE,MAAA;GAA6B,OAAO,OAAO,cAAc,SAAS;EAAE;CACjF;CAEA,mBAAmC;EAC/B,MAAM,QAAQ,KAAK,OAAO,KAAK;EAE/B,IAAI,UAAU,KAAA,GACV,OAAO;EAEX,KAAK;EACL,OAAO;CACX;CAEA,mBAA2B,WAAmB;EAG1C,IAAI,KAAK,UAAU,KAAK,KAAK,OAAO,KAAK,UAAU,OAAO,WACtD,KAAK;OAEL,KAAK,OAAO,OAAO,KAAK,SAAS,GAAG,SAAS;CAErD;CAEA,cAAsB,OAAuB;EACzC,MAAM,YAAY,KAAK,OAAO,KAAK,UAAU;EAC7C,OAAO,cAAc,KAAA,IAAY,YAAY;CACjD;CAEA,2BAAsD;EAClD,MAAM,SAAS,CAAC;EAChB,IAAI,YAAY,KAAK,iBAAiB;EACtC,OAAO,MAAM,SAAS,KAAK,OAAO,SAAS,GAAG;GAC1C,OAAO,KAAK,SAAS;GACrB,YAAY,KAAK,iBAAiB;EACtC;EACA,IAAI,gBAAgB;EACpB,OAAO,cAAA,MAA+B,OAAO,SAAS,GAAG;GACrD,OAAO,KAAK,SAAS;GACrB,YAAY,KAAK,iBAAiB;GAClC,gBAAgB;EACpB;EAEA,IAAI,eASA,OAAO;GAAE,MAAA;GAAqC,OARhC,SACV,OAAO,cAAc,GAAG,OAAO,KAAK,UAAW,UAAA,KAAA,KAAiC,KAAM,CAAC,GACvF,EAM0C;GAAO,KAJzC,SACR,OAAO,cAAc,GAAG,OAAO,KAAK,UAAW,UAAA,KAAA,KAA8B,KAAM,CAAC,GACpF,EAEiD;EAAI;EAG7D,MAAM,QAAQ,SAAS,OAAO,cAAc,GAAG,MAAM,GAAG,EAAE;EAC1D,IAAI,cAAA,MAA8B,MAAM,KAAK,cAAc,CAAC,CAAC,GAAG;GAC5D,YAAY,KAAK,iBAAiB;GAClC,MAAM,YAAY,CAAC;GACnB,OAAO,MAAM,SAAS,KAAK,UAAU,SAAS,GAAG;IAC7C,UAAU,KAAK,SAAS;IACxB,YAAY,KAAK,iBAAiB;GACtC;GAGA,OAAO;IAAE,MAAA;IAAqC;IAAO,KAFzC,SAAS,OAAO,cAAc,GAAG,SAAS,GAAG,EAEJ;GAAI;EAC7D,OACI,OAAO;GAAE,MAAA;GAAqC;GAAO,KAAK;EAAM;CAExE;CAEA,wBAA0D;EACtD,MAAM,QAAQ,KAAK,YAAY;EAC/B,IAAI,MAAM,YAAY,MAAM,SAAS,KAAK,cAAc,CAAC,MAAA,IAAwB;GAC7E,KAAK,iBAAiB;GACtB,OAAO,KAAK,gBAAgB;EAChC,OAAO,IAAI,KAAK,cAAc,CAAC,MAAA,IAAwB;GACnD,KAAK,iBAAiB;GACtB,OAAO;IAAE,MAAA;IAAgC;GAAM;EACnD;EAEA,OAAO;GAAE,MAAA;GAA6B;EAAM;CAChD;CAEA,kBAAoD;EAChD,MAAM,QAAQ,CAAC;EACf,KAAK,kBAAkB;EAEvB,IAAI,KAAK,cAAc,CAAC,MAAA,IACpB,OAAO;GAAE,MAAA;GAA2B,OAAO;EAAG;EAGlD,MAAM,OAAO,KAAK,cAAc,CAAC;EACjC,IAAI,SAAA,MAAuB,SAAA,IAAyB;GAChD,MAAM,cAAc,KAAK,mBAAmB,KAAK,iBAAiB,CAAC;GACnE,IAAI,YAAY,SAAA,GAAiC;IAC7C,KAAK,kBAAkB;IAEvB,IAAI,KAAK,cAAc,CAAC,MAAA,MAAa,KAAK,cAAc,CAAC,MAAA,IAAyB;KAC9E,KAAK,iBAAiB;KACtB,OAAO;MAAE,MAAA;MAA2B,OAAQ,YAAiC;KAAM;IACvF;GACJ;GAEA,KAAK,sBAAsB;GAC3B,OAAO;EACX;EAEA,OAAO,MAAM;GACT,MAAM,YAAY,KAAK,iBAAiB;GACxC,IAAI,cAAA,MAAqB,cAAA,IACrB,OAAO;IAAE,MAAA;IAA2B,OAAO,OAAO,cAAc,GAAG,KAAK;GAAE;QACvE,IAAI,aAAa,SAAS,GAAG;IAChC,KAAK,kBAAkB;IACvB,IAAI,KAAK,cAAc,CAAC,MAAA,MAAa,KAAK,cAAc,CAAC,MAAA,IAAyB;KAC9E,KAAK,iBAAiB;KACtB,OAAO;MAAE,MAAA;MAA2B,OAAO,OAAO,cAAc,GAAG,KAAK;KAAE;IAC9E;IACA,KAAK,sBAAsB;IAC3B,OAAO;GACX,OAAO,IACH,cAAA,MACA,cAAA,MACA,cAAA,MACA,wBAAwB,SAAS,GACnC;IACE,KAAK,sBAAsB;IAC3B,OAAO;GACX,OAAO,IAAI,cAAA,IAA+B;IACtC,IAAI,cAAc,WAAW,KAAK,cAAc,CAAC,CAAC,GAC9C,MAAM,KAAK,KAAK,wBAAwB,CAAC;SACtC;KACH,KAAK,sBAAsB;KAC3B,OAAO;IACX;GACJ,OACI,MAAM,KAAK,SAAS;EAE5B;CACJ;CAEA,oBAAkC;EAC9B,OAAO,aAAa,KAAK,cAAc,CAAC,CAAC,GACrC,KAAK,iBAAiB;CAE9B;CAEA,wBAAsC;EAClC,OAAO,MAAM;GACT,MAAM,YAAY,KAAK,iBAAiB;GACxC,IAAI,cAAA,MAAmC,cAAA,IACnC;GAGJ,IAAI,cAAc,WAAW,KAAK,cAAc,CAAC,CAAC,GAC9C,KAAK,wBAAwB;EAErC;CACJ;CAEA,mBAA2B,OAAuB;EAC9C,MAAM,mBAAmB;EACzB,IAAI,QAAQ;EACZ,MAAM,MAAM,KAAK,UAAU;EAC3B,IAAI,OAAO,KAAK;EAChB,OAAO,OAAO,KAAK;GACf,MAAM,KAAK,KAAK,IAAI,KAAK,OAAO,gBAAgB;GAChD,SAAS,OAAO,cAAc,GAAG,KAAK,OAAO,MAAM,MAAM,EAAE,CAAC;GAC5D,OAAO;EACX;EAGA,KAAK,UAAU,MAAM;EAErB,OAAO;CACX;CAEA,mBAA2B,iBAAmD;EAC1E,IAAI,QAAQ;EACZ,IAAI,IAAI;EAER,GAAG;GACC,MAAM,YAAY,KAAK,OAAO,KAAK,UAAU;GAC7C,IAAI,cAAA,MAAqB,cAAc,KAAA,KAAa,cAAc,iBAAiB;IAC/E,SAAS,KAAK,mBAAmB,CAAC;IAClC,OAAO;KAAE,MAAA;KAA8B;IAAM;GACjD;GAEA,IAAI,cAAA,IAAyB;IACzB,KAAK,WAAW;IAChB,OAAO;GACX;GAEA,IAAI,cAAA,IAA+B;IAC/B,MAAM,OAAO,KAAK,OAAO,KAAK,UAAU,IAAI;IAC5C,IAAI,SAAA,MAAgB,SAAS,KAAA,GAAW;KACpC,IAAI,SAAA,IAAoB;MACpB,SAAS,KAAK,mBAAmB,CAAC;MAClC,IAAI;MACJ,KAAK;KACT,OAAO,IAAI,cAAc,WAAW,IAAI,GAAG;MACvC,SAAS,KAAK,mBAAmB,CAAC;MAClC,SAAS,OAAO,cAAc,KAAK,wBAAwB,CAAC;MAC5D,IAAI;KACR;IACJ;GACJ;GAEA;EACJ,SAAS;CACb;CAEA,gBAA0C;EACtC,MAAM,OAAO,CAAC;EACd,IAAI,OAAA;EACJ,IAAI,KAAK,KAAK,cAAc,CAAC;EAC7B,IAAI,OAAA,MAAoB,OAAA,IACpB,KAAK,KAAK,KAAK,iBAAiB,CAAC;EAGrC,OAAO,QAAQ,KAAK,cAAc,CAAC,CAAC,GAChC,KAAK,KAAK,KAAK,iBAAiB,CAAC;EAErC,KAAK,KAAK,cAAc,CAAC;EACzB,IAAI,KAAK,KAAK,cAAc,CAAC;EAC7B,IAAI,OAAA,MAAoB,QAAQ,EAAE,GAAG;GACjC,KAAK,KAAK,KAAK,iBAAiB,GAAG,KAAK,iBAAiB,CAAC;GAC1D,OAAA;GACA,OAAO,QAAQ,KAAK,cAAc,CAAC,CAAC,GAChC,KAAK,KAAK,KAAK,iBAAiB,CAAC;EAEzC;EAEA,KAAK,KAAK,cAAc,CAAC;EACzB,KAAK,KAAK,cAAc,CAAC;EACzB,MAAM,KAAK,KAAK,cAAc,CAAC;EAC/B,KAAK,OAAA,MAAY,OAAA,UAAgB,OAAA,MAAoB,OAAA,OAAwB,QAAQ,EAAE,KAAM,QAAQ,EAAE,IAAI;GACvG,KAAK,KAAK,KAAK,iBAAiB,GAAG,KAAK,iBAAiB,CAAC;GAC1D,OAAA;GACA,OAAO,QAAQ,KAAK,cAAc,CAAC,CAAC,GAChC,KAAK,KAAK,KAAK,iBAAiB,CAAC;EAEzC;EAEA,OAAO,CAAC,eAAe,IAAI,GAAG,IAAI;CACtC;CAEA,sBAAiE;EAC7D,MAAM,CAAC,QAAQ,SAAS,KAAK,cAAc;EAC3C,MAAM,KAAK,KAAK,cAAc,CAAC;EAC/B,MAAM,KAAK,KAAK,cAAc,CAAC;EAC/B,MAAM,KAAK,KAAK,cAAc,CAAC;EAE/B,IAAI,kBAAkB,IAAI,IAAI,EAAE,GAE5B,OAAO;GAAE,MAAA;GAAiC;GAAQ;GAAO,MAD5C,KAAK,YACuC;EAAK;EAGlE,IAAI,OAAA,IAAwB;GACxB,KAAK,iBAAiB;GACtB,OAAO;IAAE,MAAA;IAAkC;IAAQ;GAAM;EAC7D;EAEA,OAAO;GAAE,MAAA;GAA8B;GAAQ;EAAM;CACzD;CAEA,0BAA0C;EACtC,MAAM,YAAY,KAAK,iBAAiB;EAExC,IAAI,MAAM,SAAS,GAAG;GAClB,IAAI,MAAM,OAAO,cAAc,SAAS;GACxC,OAAO,MAAM,KAAK,cAAc,CAAC,CAAC,KAAK,IAAI,SAAS,GAChD,OAAO,OAAO,cAAc,KAAK,iBAAiB,CAAC;GAGvD,IAAI,aAAa,KAAK,cAAc,CAAC,CAAC,GAClC,KAAK,iBAAiB;GAG1B,MAAM,eAAe,SAAS,KAAK,EAAE;GAErC,IAAI,iBAAiB,KAAK,qBAAqB,YAAY,KAAK,eAAe,SAC3E,OAAO;GAGX,OAAO;EACX;EAEA,IAAI,cAAA,IACA,OAAO;EAGX,OAAO;CACX;CAEA,cAA8B;EAC1B,IAAI,SAAS;EACb,OAAO,MAAM;GACT,MAAM,YAAY,KAAK,iBAAiB;GACxC,IAAI,gBAAgB,SAAS,GACzB,UAAU,OAAO,cAAc,SAAS;QACrC,IAAI,cAAc,WAAW,KAAK,cAAc,CAAC,CAAC,GACrD,UAAU,OAAO,cAAc,KAAK,wBAAwB,CAAC;QAC1D;IACH,KAAK,mBAAmB,SAAS;IACjC,OAAO;GACX;EACJ;CACJ;AACJ;;;AC7oBA,IAAa,SAAb,MAAa,OAAO;CAChB;CAEA,YAAY,QAAoB;EAC5B,KAAK,UAAU;CACnB;CAEA,OAAO,OAAO,OAAuB;EACjC,MAAM,YAAY,IAAI,UAAU;EAChC,UAAU,MAAM,KAAK;EACrB,OAAO,IAAI,OAAO,UAAU,KAAK,CAAC;CACtC;CAEA,OAAO,WAAW,OAAyB;EACvC,OAAO,OAAO,OAAO,KAAK,CAAC,CAAC,oBAAoB;CACpD;CAEA,OAAO,YAAY,OAA2B;EAC1C,OAAO,OAAO,OAAO,KAAK,CAAC,CAAC,qBAAqB;CACrD;CAEA,sBAAgC;EAC5B,IAAI,QAAQ,KAAK,aAAa;EAC9B,OAAO,MAAM,SAAA,IACT,QAAQ,KAAK,aAAa;EAG9B,IAAI,MAAM,SAAA,IACN,MAAM,IAAI,YAAY,mDAAmD;EAG7E,KAAK,eAAe,KAAK;EACzB,MAAM,QAAQ,KAAK,sBAAsB;EAEzC;GACI,QAAQ,KAAK,aAAa;SACrB,MAAM,SAAA;EAEf,IAAI,MAAM,SAAA,IACN,OAAO;EAGX,MAAM,IAAI,YAAY,kFAAkF;CAC5G;CAEA,uBAAmC;EAC/B,MAAM,SAAS,CAAC;EAChB,OAAO,MAAM;GACT,MAAM,QAAQ,KAAK,sBAAsB;GACzC,IAAI,MAAM,SAAA,IACN,OAAO;GAEX,OAAO,KAAK,KAAK;EACrB;CACJ;CAEA,wBAA0C;EACtC,MAAM,QAAQ,KAAK,aAAa;EAEhC,QAAQ,MAAM,MAAd;GACI,KAAA;GACA,KAAA;GACA,KAAA,GACI,OAAO,KAAK,mBAAmB,MAAM,IAAI;GAC7C,KAAA,IACI,OAAO,KAAK,gBAAgB,KAAK;EACzC;EAEA,OAAO;CACX;CAEA,mBAA2B,MAA8B;EACrD,MAAM,QAAkB;GAAE;GAAM,QAAQ,CAAC;EAAE;EAE3C,IAAI,QAAQ,KAAK,aAAa;EAC9B,OAAO,MAAM;GACT,IAAI,MAAM,SAAA,MAAgC,iBAAiB,OAAO,IAAI,GAClE,OAAO;GAGX,KAAK,eAAe,KAAK;GACzB,MAAM,OAAO,KAAK,KAAK,sBAAsB,CAAC;GAC9C,QAAQ,KAAK,aAAa;EAC9B;CACJ;CAEA,gBAAwB,eAA8C;EAClE,MAAM,cAA2B;GAC7B,MAAM,cAAc;GACpB,QAAQ,CAAC;GACT,MAAA;EACJ;EAEA,OAAO,MAAM;GACT,MAAM,QAAQ,KAAK,aAAa;GAChC,IAAI,MAAM,SAAA,MAAgC,MAAM,SAAA,GAC5C,OAAO;GAGX,KAAK,eAAe,KAAK;GACzB,YAAY,OAAO,KAAK,KAAK,sBAAsB,CAAC;EACxD;CACJ;CAEA,eAAiC;EAC7B,MAAM,QAAQ,KAAK,QAAQ,MAAM;EACjC,OAAO,OAAO,UAAU,cAAc,YAAY;CACtD;CAEA,eAAuB,OAAuB;EAC1C,KAAK,QAAQ,QAAQ,KAAK;CAC9B;AACJ;AAEA,MAAa,oBAAoB,UAA6C,MAAM,SAAA;AACpF,MAAa,iBAAiB,UAA+C,MAAM,SAAA;AACnF,MAAa,gBAAgB,UAA+C,MAAM,SAAA;AAClF,MAAa,iBAAiB,UAA+C,MAAM,SAAA;AACnF,MAAa,oBAAoB,OAAiB,UAC9C,aAAa,KAAK,KAAK,MAAM,UAAU;AAE3C,MAAa,iBAAiB,UAA6B,MAAM,SAAA;AACjE,MAAa,2BAA2B,UACpC,MAAM,SAAA,MAAuC,MAAM,SAAA;AAEvD,MAAa,qBAAqB,WAAqC;CACnE,MAAM,OAAqB,CAAC;CAC5B,IAAI,MAAkB,CAAC;CACvB,OAAO,SAAS,UAAU;EACtB,IAAI,MAAM,SAAA,GAAgC;GAGtC,IAAI,IAAI,QAAQ;IACZ,KAAK,KAAK,GAAG;IACb,MAAM,CAAC;GACX;GACA;EACJ;EAEA,IAAI,MAAM,SAAA,IACN,IAAI,KAAK,KAAK;CAEtB,CAAC;CACD,IAAI,IAAI,QACJ,KAAK,KAAK,GAAG;CAGjB,OAAO;AACX;AAEA,MAAM,oBAAoB,OAAiB,SAAgC;CACvE,IAAI,SAAA,MAA+C,MAAM,SAAA,IACrD,OAAO;CAEX,IAAI,SAAA,MAAgD,MAAM,SAAA,IACtD,OAAO;CAGX,OAAO,SAAA,KAA6C,MAAM,SAAA;AAC9D;;;;;;;;;AChLA,MAAM,iBAAiB;AAEvB,MAAM,sBAAsB,SAAyB;CACjD,MAAM,SAAS,KAAK,MAAM,cAAc;CACxC,IAAI,CAAC,QACD,OAAO;CAIX,MAAM,SAA8B,CAAC;CACrC,MAAM,MAAgB,CAAC;CACvB,MAAM,aAAqC;EAAE,KAAK;EAAG,KAAK;EAAG,KAAK;EAAG,KAAK;CAAE;CAE5E,KAAK,MAAM,OAAO,QACd,IAAI,kBAAkB,KAAK,GAAG,GAC1B,OAAO,KAAK,WAAW,GAAG,CAAC;MACxB,IAAI,QAAQ,KACf,IAAI,KAAK,GAAG;MACT,IAAI,QAAQ,KAAK;EACpB,OAAO,IAAI,UAAU,IAAI,IAAI,SAAS,OAAO,KACzC,OAAO,KAAK,IAAI,IAAI,CAAE;EAE1B,IAAI,CAAC,IAAI,QAAQ,OAAO;EACxB,IAAI,IAAI;CACZ,OAAO;EAEH,OAAO,IAAI,WAAW,WAAW,GAAG,KAAK,IAAI,SAAS,CAAC,MAAM,OAAO,WAAW,QAAQ,IACnF,OAAO,KAAK,IAAI,IAAI,CAAE;EAE1B,IAAI,KAAK,GAAG;CAChB;CAGJ,OAAO,IAAI,QAAQ;EACf,MAAM,KAAK,IAAI,IAAI;EACnB,IAAI,OAAO,KAAK,OAAO;EACvB,OAAO,KAAK,EAAE;CAClB;CAGA,MAAM,QAAkB,CAAC;CACzB,KAAK,MAAM,QAAQ,QACf,IAAI,OAAO,SAAS,UAChB,MAAM,KAAK,IAAI;MACZ;EACH,MAAM,IAAI,MAAM,IAAI;EACpB,MAAM,IAAI,MAAM,IAAI;EACpB,IAAI,MAAM,KAAA,KAAa,MAAM,KAAA,GAAW,OAAO;EAC/C,QAAQ,MAAR;GACI,KAAK;IACD,MAAM,KAAK,IAAI,CAAC;IAChB;GACJ,KAAK;IACD,MAAM,KAAK,IAAI,CAAC;IAChB;GACJ,KAAK;IACD,MAAM,KAAK,IAAI,CAAC;IAChB;GACJ,KAAK;IACD,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,CAAC;IAChC;GACJ,SACI,OAAO;EACf;CACJ;CAGJ,OAAO,MAAM,WAAW,IAAK,MAAM,MAAM,MAAO;AACpD;;;;;;;;;;ACrEA,MAAa,SAAS,OAAe,KAAa,QAAwB;CACtE,OAAO,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,GAAG;AAC7C;;;;AAYA,MAAa,oBAAoB,GAAc,MAAkB;CAC7D,OAAO;EACH,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;EACrC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;EACrC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;CACzC;AACJ;;;;;;;;;;;ACjBA,MAAa,iBAAiB,QAA4D;CACtF,OAAO,iBACH;EACI;EAAoB;EAAoB;EAAqB;EAAqB;EAClF;EAAqB;EAAqB;EAAsB;CACpE,GACA,GACJ;AACJ;;;;;;AAOA,MAAa,iBAAiB,QAA4D;CACtF,OAAO,iBACH;EACI;EAAqB;EAAmB;EAAoB;EAAqB;EACjF;EAAqB;EAAqB;EAAqB;CACnE,GACA,GACJ;AACJ;;;;;;AAOA,MAAa,kBAAkB,QAAoB;CAC/C,MAAM,CAAC,GAAG,GAAG,KAAK;CAClB,MAAM,YAAY,MAAsB;EACpC,MAAM,OAAO,IAAI,IAAI,KAAK,GACtB,MAAM,KAAK,IAAI,CAAC;EAEpB,OAAO,MAAM,WAAY,QAAQ,QAAQ,QAAQ,IAAI,OAAO,QAAS,QAAQ;CACjF;CACA,OAAO;EAAC,SAAS,CAAC;EAAG,SAAS,CAAC;EAAG,SAAS,CAAC;CAAC;AACjD;;;;;;AAOA,MAAa,iBAAiB,QAAoB;CAC9C,MAAM,CAAC,GAAG,GAAG,KAAK;CAClB,MAAM,YAAY,MAAsB;EACpC,MAAM,OAAO,IAAI,IAAI,KAAK,GACtB,MAAM,KAAK,IAAI,CAAC;EAEpB,OAAO,OAAO,SAAU,IAAI,QAAQ,SAAS,MAAM,QAAS,UAAU;CAC1E;CACA,OAAO;EAAC,SAAS,CAAC;EAAG,SAAS,CAAC;EAAG,SAAS,CAAC;CAAC;AACjD;;;;;;AAOA,MAAa,eAAe,SAAuB;CAC/C,MAAM,CAAC,GAAG,GAAG,KAAK,eAAe,cAAc;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC,CAAC;CAC3E,OAAO;EAAC;EAAG;EAAG;EAAG,KAAK;CAAE;AAC5B;;;;;AAMA,MAAa,qBAAqB,SAAuB;CACrD,MAAM,CAAC,GAAG,GAAG,KAAK,cAAc;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC;CAC3D,OAAO;EACH,MAAM,KAAK,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG;EACjC,MAAM,KAAK,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG;EACjC,MAAM,KAAK,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG;EACjC,KAAK;CACT;AACJ;;;ACrFA,MAAa,YAAY,UACrB,MAAM,SAAA,MAAmC,MAAM,SAAA;;;ACmBnD,MAAa,sBAAsB,UAC/B,MAAM,SAAA,MAAuC,SAAS,KAAK,KAAK,qBAAqB,KAAK;;;;;AAM9F,MAAa,wBAAwB,UACjC,MAAM,SAAA,MAAoC,MAA6B,oBAAoB,KAAA;;;;AAK/F,MAAa,kBAAkB,UAC3B,MAAM,SAAA,MAA+B,MAAM,SAAS;;;;;;;;;;;;;;AAexD,MAAa,gCAAgC,cAAoD;CAC7F,MAAM,WAAW,+BAA+B,WAAW,CAAC;CAC5D,IAAI,CAAC,UAAU,OAAO;CAEtB,MAAM,cAAc,+BAA+B,WAAW,GAAG;CACjE,IAAI,CAAC,aAAa,OAAO;CAEzB,MAAM,cAAe,SAA8B;CACnD,MAAM,aAAc,YAAiC,SAAS;CAG9D,IAAI,eAAe,GACf,OAAO;CAGX,OAAO;EACH,MAAA;EACA,QAAQ;EACR,OAAA;EACA,iBAAiB;EACjB,kBAAkB;CACtB;AACJ;;;;;;AAOA,MAAa,6BAA6B,UAA6C;CACnF,IAAI,eAAe,KAAK,GACpB,OAAO,6BAA6B,KAAK;CAE7C,OAAO,mBAAmB,KAAK,IAAI,QAAQ;AAC/C;;;;;;AAOA,MAAa,kCAAkC,WAAwB,eAAe,MAA+B;CAEjH,MAAM,mBAAmB,WAAsC;EAC3D,IAAI,aAAa;EAEjB,KAAK,MAAM,SAAS,QAAQ;GACxB,IAAI,MAAM,SAAA,IACN;GAGJ,IAAI,MAAM,SAAA,IAA6B;IACnC,IAAI,MAAM,SAAS,QAAQ;KACvB,MAAM,SAAS,gBAAgB,MAAM,MAAM;KAC3C,IAAI,WAAW,MAAM,OAAO;KAC5B,cAAc,IAAI,OAAO;IAC7B,OACI,OAAO;GAEf,OAAO,IAAI,MAAM,SAAA,IACb,cAAc,MAAM,OAAO,SAAS;QACjC,IAAI,MAAM,SAAA,IAAoC;IAEjD,IAAI,MAAM,SAAS,MACf,cAAc,MAAM,OAAO,SAAS;SACjC,IAAI,MAAM,SAAS,SAAS,MAAM,SAAS,MAC9C,eAAe,MAAM,SAAS,GAAA,CAAI,SAAS;SAE3C,cAAc,MAAM,OAAO,SAAS;GAE5C,OAAO,IAAI,MAAM,SAAA,IAEb,eAAgB,MAAM,SAAS,MAAO,aAAA,CAAc,SAAS;QAC1D,IAAI,MAAM,SAAA,GAAgC;IAC7C,MAAM,KAAK,MAAM;IACjB,IAAI,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KACjD,cAAc,IAAI,GAAG;SAClB,IAAI,OAAO,KACd,cAAc;SACX,IAAI,OAAO,KACd,cAAc;GAEtB;EACJ;EAEA,OAAO;CACX;CAEA,IAAI;EACA,MAAM,aAAa,gBAAgB,UAAU,MAAM;EACnD,IAAI,eAAe,QAAQ,WAAW,KAAK,MAAM,IAC7C,OAAO;EAKX,MAAM,SAAS,mBAAmB,UAAU;EAE5C,IAAI,OAAO,WAAW,YAAY,CAAC,MAAM,MAAM,GAE3C,OAAO;GACH,MAAA;GACA,QAAQ;GACR,OAAA;EACJ;CAER,SAAS,GAAG;EACR,OAAO;CACX;CAEA,OAAO;AACX;AACA,MAAa,8BAA8B,WACvC,OAAO,SAAS,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;AACvE,MAAa,cAAgC;CACzC,MAAA;CACA,QAAQ;CACR,OAAA;AACJ;AAEA,MAAa,gBAAkC;CAC3C,MAAA;CACA,QAAQ;CACR,OAAA;AACJ;AAEA,MAAa,kBAAoC;CAC7C,MAAA;CACA,QAAQ;CACR,OAAA;AACJ;AAEA,MAAa,4BACT,OACA,OACA,WACmB;CACnB,MAAM,CAAC,GAAG,KAAK;CACf,OAAO,CAAC,iBAAiB,GAAG,KAAK,GAAG,iBAAiB,OAAO,MAAM,cAAc,IAAI,GAAG,MAAM,CAAC;AAClG;AACA,MAAa,oBAAoB,OAAyB,WAA2B;CACjF,IAAI,qBAAqB,KAAK,GAC1B,OAAQ,MAAM,kBAAkB,MAAO,SAAS,MAAM;CAG1D,IAAI,MAAM,SAAA,IACN,OAAQ,MAAM,SAAS,MAAO;CAGlC,IAAI,iBAAiB,KAAK,GACtB,QAAQ,MAAM,MAAd;EACI,KAAK;EACL,KAAK,MAKD,OAAO,KAAK,MAAM;EAEtB,SACI,OAAO,MAAM;CACrB;CAGJ,OAAO,MAAM;AACjB;;;ACpNA,MAAM,MAAM;AACZ,MAAM,OAAO;AACb,MAAM,MAAM;AACZ,MAAM,OAAO;AAEb,MAAa,QAAiC;CAC1C,MAAM;CACN,QAAQ,UAAmB,UAA4B;EACnD,IAAI,MAAM,SAAA,IACN,QAAQ,MAAM,MAAd;GACI,KAAK,KACD,OAAQ,KAAK,KAAK,MAAM,SAAU;GACtC,KAAK,MACD,OAAQ,KAAK,KAAK,MAAO,MAAM;GACnC,KAAK,KACD,OAAO,MAAM;GACjB,KAAK,MACD,OAAO,KAAK,KAAK,IAAI,MAAM;EACnC;EAGJ,MAAM,IAAI,MAAM,wBAAwB;CAC5C;AACJ;AAEA,MAAa,WAAW,UAA6B;CACjD,IAAI,MAAM,SAAA,IACF;MAAA,MAAM,SAAS,OAAO,MAAM,SAAS,QAAQ,MAAM,SAAS,OAAO,MAAM,SAAS,MAClF,OAAO;CAAA;CAGf,OAAO;AACX;AAEA,MAAa,kBAAkB,WAAgD;CAM3E,QALqB,OAChB,OAAO,YAAY,CAAC,CACpB,KAAK,UAAU,MAAM,KAAK,CAAC,CAC3B,KAAK,GAES,GAAnB;EACI,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,YACD,OAAO,CAAC,aAAa,WAAW;EACpC,KAAK;EACL,KAAK,UACD,OAAO,IAAI,CAAC;EAChB,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,aACD,OAAO,CAAC,aAAa,eAAe;EACxC,KAAK;EACL,KAAK,QACD,OAAO,IAAI,EAAE;EACjB,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,gBACD,OAAO,CAAC,iBAAiB,eAAe;EAC5C,KAAK;EACL,KAAK,OACD,OAAO,IAAI,GAAG;EAClB,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,eACD,OAAO,CAAC,iBAAiB,WAAW;EACxC,KAAK;EACL,KAAK,SACD,OAAO,IAAI,GAAG;CACtB;CAEA,OAAO;AACX;AAEA,MAAa,OAAO,QAAyB,KAAK,KAAK,MAAO;;;AC1E9D,MAAa,iBAAiB,WAA2B,MAAO,WAAW;AAE3E,MAAa,YAAY,UAAyB;CAC9C,MAAM,QAAQ,MAAO;CACrB,MAAM,OAAO,MAAQ,SAAS;CAC9B,MAAM,QAAQ,MAAQ,SAAS;CAC/B,MAAM,MAAM,MAAQ,SAAS;CAC7B,OAAO,QAAQ,MAAM,QAAQ,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,IAAI,KAAK,OAAO,IAAI,GAAG,MAAM,GAAG,KAAK;AACtG;AAEA,MAAa,QAAQ,GAAW,GAAW,GAAW,OAChD,KAAK,KAAO,KAAK,KAAO,KAAK,IAAM,KAAK,MAAM,IAAI,GAAG,KAAK,OAAQ;AAExE,MAAa,sBAAsB,OAAiB,MAAsB;CACtE,IAAI,MAAM,SAAA,IACN,OAAO,MAAM;CAGjB,IAAI,MAAM,SAAA,IAAqC;EAC3C,MAAM,MAAM,MAAM,IAAI,IAAI;EAC1B,OAAO,MAAM,IAAK,MAAM,SAAS,MAAO,MAAM,KAAK,MAAO,MAAM,SAAS,MAAO,GAAG;CACvF;CAEA,OAAO;AACX;AAEA,MAAa,uBAAuB,WAAgC;CAChE,MAAM,QAAQ,OAAO;CACrB,QAAQ,SAAS,MAAM,SAAA,KAAiC,MAAM,QAAQ,eAAe;AACzF;AAKA,MAAa,YAAY,SAAwB;CAC7C,OAAO,KACH,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG,GACvC,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG,GACvC,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG,GACvC,MAAM,KAAK,IAAI,GAAG,CAAC,CACvB;AACJ;AAEA,MAAa,kBAAkB,SAAwB;CACnD,MAAM,CAAC,GAAG,GAAG,GAAG,KAAK;CACrB,MAAM,MAAM,eAAe;EAAC;EAAG;EAAG;CAAC,CAAC;CACpC,OAAO,KACH,MAAM,KAAK,MAAM,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,GACtC,MAAM,KAAK,MAAM,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,GACtC,MAAM,KAAK,MAAM,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,GACtC,CACJ;AACJ;AAEA,MAAa,WAAW,SAAwB;CAC5C,MAAM,cAAc,cAAc;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC;CAC7D,OAAO,eAAe;EAAC,YAAY;EAAI,YAAY;EAAI,YAAY;EAAI,KAAK;CAAE,CAAC;AACnF;AAEA,MAAa,WAAW,UAAmB,SAA6B;CACpE,IAAI,oBAAoB,KAAK,OAAO,uBAAuB,CAAC,GACxD,MAAM,IAAI,MAAM,wCAAwC;CAE5D,MAAM,CAAC,YAAY,GAAG,GAAG,SAAS,qBAAqB,IAAI,GAKvD,IAAI,sBAAsB,IAAI,IAAI,aAAa,MAAM,YACrD,MAAM,eAAe,cAAc,QAAQ;EAAC;EAAG;EAAG;CAAC,CAAC,CAAC,CAAC;CAE1D,OAAO,KACH,MAAM,KAAK,MAAM,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,GACtC,MAAM,KAAK,MAAM,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,GACtC,MAAM,KAAK,MAAM,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,GACtC,KACJ;AACJ;AAEA,MAAM,yBAAyB,SAA8B;CACzD,MAAM,KAAK,KAAK,OAAO,uBAAuB,CAAC,CAAC;CAChD,OAAO,OAAO,KAAA,KAAa,GAAG,SAAA;AAClC;AAEA,MAAa,aAAa,UAAmB,SAA6B;CACtE,IAAI,oBAAoB,KAAK,OAAO,uBAAuB,CAAC,GACxD,MAAM,IAAI,MAAM,0CAA0C;CAE9D,MAAM,CAAC,GAAG,GAAG,GAAG,SAAS,qBAAqB,IAAI,GAC9C,MAAM,eAAe,cAAc,UAAU;EAAC;EAAG;EAAG;CAAC,CAAC,CAAC,CAAC;CAE5D,OAAO,KACH,MAAM,KAAK,MAAM,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,GACtC,MAAM,KAAK,MAAM,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,GACtC,MAAM,KAAK,MAAM,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,GACtC,KACJ;AACJ;AAEA,MAAa,aAAa,UAAmB,SAA6B;CACtE,IAAI,oBAAoB,KAAK,OAAO,uBAAuB,CAAC,GACxD,MAAM,IAAI,MAAM,0CAA0C;CAE9D,MAAM,CAAC,GAAG,GAAG,GAAG,SAAS,uBAAuB,IAAI,GAChD,MAAM,eAAe,cAAc,UAAU,QAAQ;EAAC;EAAG;EAAG;CAAC,CAAC,CAAC,CAAC,CAAC;CAErE,OAAO,KACH,MAAM,KAAK,MAAM,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,GACtC,MAAM,KAAK,MAAM,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,GACtC,MAAM,KAAK,MAAM,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,GACtC,KACJ;AACJ;AAEA,MAAa,WAAW,UAAmB,SAA6B;CACpE,IAAI,oBAAoB,KAAK,OAAO,uBAAuB,CAAC,GACxD,MAAM,IAAI,MAAM,wCAAwC;CAE5D,MAAM,CAAC,GAAG,GAAG,GAAG,KAAK,qBAAqB,IAAI,GAC1C,MAAM,eAAe,cAAc,QAAQ,QAAQ;EAAC;EAAG;EAAG;CAAC,CAAC,CAAC,CAAC,CAAC;CAEnE,OAAO,KACH,MAAM,KAAK,MAAM,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,GACtC,MAAM,KAAK,MAAM,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,GACtC,MAAM,KAAK,MAAM,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,GACtC,CACJ;AACJ;AAEA,MAAa,wBAAwB,SAAkB,SAA4B;CAC/E,MAAM,SAAS,KAAK,OAAO,uBAAuB,GAC9C,MAAM,OAAO,IACb,aAAa,OAAO,IACpB,YAAY,OAAO,IAGnB,QAAQ,OAAO,IACf,QACI,UAAU,KAAA,KAAa,MAAM,SAAA,KAAkC,MAAM,UAAU,MAAM,OAAO,KAAK,OAAO;CAOhH,OAAO;EANC,OACG,IAAI,SAAA,KAAkC,IAAI,IAAI,MAAM,IAAI,MAAM,MAAM,SAAS,GAAG,MAAM,KAAK,KAAK,KACjG;EACF,eAAe,KAAA,KAAa,mBAAmB,UAAU,IAAI,WAAW,SAAS,MAAM;EACvF,cAAc,KAAA,KAAa,mBAAmB,SAAS,IAAI,UAAU,SAAS,MAAM;EACpF,UAAU,KAAA,KAAa,mBAAmB,KAAK,IAAI,iBAAiB,OAAO,CAAC,IAAI;CACtE;AACtB;AAEA,MAAa,WAAW,SAAkB,SAA6B;CACnE,IAAI,oBAAoB,IAAI,GACxB,MAAM,IAAI,MAAM,wCAAwC;CAE5D,MAAM,CAAC,GAAG,GAAG,GAAG,KAAK,qBAAqB,SAAS,IAAI,GACnD,MAAM,QAAQ;EAAC;EAAG;EAAG;CAAC,CAAC;CAC3B,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3D;AAEA,MAAa,wBAAwB,SAA4B;CAC7D,MAAM,SAAS,KAAK,OAAO,uBAAuB,GAC9C,KAAK,OAAO,IACZ,KAAK,OAAO,IACZ,KAAK,OAAO,IACZ,KAAK,OAAO;CAMhB,OAAO;EALC,OAAO,KAAA,KAAa,mBAAmB,EAAE,IAAI,GAAG,SAAS;EACzD,OAAO,KAAA,KAAa,mBAAmB,EAAE,IAAI,GAAG,SAAS;EACzD,OAAO,KAAA,MAAc,cAAc,EAAE,KAAK,iBAAiB,EAAE,KAAK,GAAG,SAAS;EAC9E,OAAO,KAAA,KAAa,mBAAmB,EAAE,IAAI,iBAAiB,IAAI,CAAC,IAAI;CAE7D;AACtB;AAEA,MAAa,wBAAwB,SAA4B;CAC7D,MAAM,SAAS,KAAK,OAAO,uBAAuB,GAC9C,KAAK,OAAO,IACZ,KAAK,OAAO,IACZ,KAAK,OAAO,IACZ,KAAK,OAAO;CAoBhB,OAAO;EAlBC,OAAO,KAAA,IACD,GAAG,SAAA,KACC,GAAG,SAAS,MACZ,cAAc,EAAE,IACd,GAAG,SACH,IACN;EAEN,OAAO,KAAA,IACD,GAAG,SAAA,KACC,GAAG,SAAS,MACZ,cAAc,EAAE,IACd,GAAG,SACH,IACN;EACN,OAAO,KAAA,MAAc,cAAc,EAAE,KAAK,iBAAiB,EAAE,KAAK,GAAG,SAAS;EAC1E,OAAO,KAAA,KAAa,mBAAmB,EAAE,IAAI,iBAAiB,IAAI,CAAC,IAAI;CAE7D;AAC1B;AAEA,MAAa,0BAA0B,SAA4B;CAC/D,MAAM,SAAS,KAAK,OAAO,uBAAuB,GAC9C,KAAK,OAAO,IACZ,KAAK,OAAO,IACZ,KAAK,OAAO,IACZ,KAAK,OAAO;CAoBhB,OAAO;EAlBC,OAAO,KAAA,IACD,GAAG,SAAA,KACC,GAAG,SAAS,MACZ,cAAc,EAAE,IACd,GAAG,SACH,IACN;EAEN,OAAO,KAAA,IACD,GAAG,SAAA,KACC,GAAG,SAAS,MACZ,cAAc,EAAE,IACd,GAAG,SACH,IACN;EACN,OAAO,KAAA,MAAc,cAAc,EAAE,KAAK,iBAAiB,EAAE,KAAK,GAAG,SAAS;EAC9E,OAAO,KAAA,KAAa,mBAAmB,EAAE,IAAI,iBAAiB,IAAI,CAAC,IAAI;CAE7D;AACtB;;;;;;AAOA,MAAa,YAAY,QAA4D;CACjF,OAAO,iBACH;EACI;EAAoB;EAAsB;EAAsB;EAAqB;EACrF;EAAuB;EAAuB;EAAsB;CACxE,GACA,GACJ;AACJ;;;;;;AAOA,MAAa,YAAY,QAA4D;CACjF,OAAO,iBACH;EACI;EAAmB;EAAsB;EAAqB;EAAqB;EACnF;EAAsB;EAAsB;EAAuB;CACvE,GACA,GACJ;AACJ;AAEA,MAAa,WAAW,IAAY,IAAY,QAAwB;CACpE,IAAI,MAAM,GACN,OAAO;CAEX,IAAI,OAAO,GACP,OAAO;CAGX,IAAI,MAAM,IAAI,GACV,QAAQ,KAAK,MAAM,MAAM,IAAI;MAC1B,IAAI,MAAM,IAAI,GACjB,OAAO;MACJ,IAAI,MAAM,IAAI,GACjB,QAAQ,KAAK,MAAM,KAAK,IAAI,IAAI,OAAO;MAEvC,OAAO;AAEf;AAEA,MAAa,WAAW,CAAC,GAAG,GAAG,OAA2D;CAGtF,IAAI,MAAM,GACN,OAAO;EAAC;EAAG;EAAG;CAAC;CAEnB,MAAM,KAAK,KAAK,KAAM,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI,GAC5C,KAAK,IAAI,IAAI;CAKjB,OAAO;EAJC,QAAQ,IAAI,IAAI,IAAI,IAAI,CAIxB;EAHA,QAAQ,IAAI,IAAI,CAGb;EAFH,QAAQ,IAAI,IAAI,IAAI,IAAI,CAElB;CAAC;AACnB;;;;;;;;AASA,MAAa,WAAW,CAAC,GAAG,GAAG,OAA2D;CACtF,IAAI,IAAI,GACJ,IAAI;CAER,IAAI,MAAM,CAAC,GACP,IAAI;CAER,OAAO;EAAC;EAAG,IAAI,KAAK,IAAK,IAAI,KAAK,KAAM,GAAG;EAAG,IAAI,KAAK,IAAK,IAAI,KAAK,KAAM,GAAG;CAAC;AACnF;;;;;;AAOA,MAAa,aAAa,QAA4D;CAClF,MAAM,OAAO,iBACL;EACI;EAAG;EAAoB;EAAoB;EAAG;EAAqB;EAAqB;EACxF;EAAqB;CACzB,GACA,GACJ,GACA,MAAY;EAAC,KAAK,MAAM;EAAG,KAAK,MAAM;EAAG,KAAK,MAAM;CAAC;CAEzD,OAAO,iBACH;EACI;EAAoB;EAAqB;EAAoB;EAAqB;EAClF;EAAqB;EAAqB;EAAqB;CACnE,GACA,GACJ;AACJ;;;;;;AAOA,MAAa,WAAW,QAA4D;CAChF,MAAM,MAAM,IAAI,KAAK,MAAM,KACvB,KAAK,IAAI,KAAK,MAAM,IACpB,KAAK,KAAK,IAAI,KAAK,KACnB,IAAI,QAAQ,IACZ,IAAI,KAAK,KACT,MAAY;GACN,KAAK,IAAI,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,QAAU;EACtD,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI,KAAK;GAC9B,KAAK,IAAI,MAAM,KAAK,MAAM,KAAK,MAAM,KAAM,QAA0B;CAC3E;CAEJ,OAAO,SAAS;EAAC,IAAI;EAAI,IAAI;EAAI,IAAI;CAAE,CAAC;AAC5C;;;;;;;AAQA,MAAa,YAAY,UAAmB,SAAuD;CAC/F,MAAM,SAAS,KAAK,OAAO,uBAAuB;CAElD,IAAI,OAAO,WAAW,KAAK,OAAO,WAAW,GAAG;EAC5C,MAAM,IAAI,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC,GACzC,IAAI,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC,GACvC,IAAI,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC,GACvC,IAAI,OAAO,WAAW,IAAI,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,GACjE,aAAa,cAAc;GAAC,IAAI;GAAK,IAAI;GAAK,IAAI;EAAG,CAAC,GACtD,CAAC,GAAG,GAAG,KAAK,cAAc;GAAC,WAAW;GAAI,WAAW;GAAI,WAAW;EAAE,CAAC;EAC3E,OAAO;GAAC;GAAG;GAAG;GAAG;EAAC;CACtB;CAEA,OAAO;EAAC;EAAG;EAAG;EAAG;CAAC;AACtB;;;;;;;AAQA,MAAa,YAAY,SAAkB,SAAuD;CAC9F,MAAM,CAAC,GAAG,GAAG,GAAG,KAAK,qBAAqB,SAAS,IAAI,GACnD,aAAa,cAAc,QAAQ;EAAC;EAAG;EAAG;CAAC,CAAC,CAAC,GAC7C,CAAC,GAAG,GAAG,KAAK,cAAc;EAAC,WAAW;EAAI,WAAW;EAAI,WAAW;CAAE,CAAC;CAE3E,OAAO;EAAC;EAAG;EAAG;EAAG;CAAC;AACtB;;;;;;;AAQA,MAAa,YAAY,UAAmB,SAAuD;CAC/F,MAAM,CAAC,GAAG,GAAG,GAAG,SAAS,qBAAqB,IAAI,GAC9C,CAAC,GAAG,GAAG,KAAK,QAAQ;EAAC;EAAG;EAAG;CAAC,CAAC;CACjC,OAAO;EAAC;EAAG;EAAG;EAAG;CAAK;AAC1B;;;;;;;AAQA,MAAa,YAAY,UAAmB,SAAuD;CAC/F,MAAM,CAAC,GAAG,GAAG,GAAG,SAAS,qBAAqB,IAAI,GAC9C,CAAC,GAAG,GAAG,KAAK,QAAQ,QAAQ;EAAC;EAAG;EAAG;CAAC,CAAC,CAAC;CAC1C,OAAO;EAAC;EAAG;EAAG;EAAG;CAAK;AAC1B;;;;;;;AAQA,MAAa,cAAc,UAAmB,SAAuD;CACjG,MAAM,CAAC,GAAG,GAAG,GAAG,SAAS,uBAAuB,IAAI,GAChD,CAAC,GAAG,GAAG,KAAK,UAAU,QAAQ;EAAC;EAAG;EAAG;CAAC,CAAC,CAAC;CAC5C,OAAO;EAAC;EAAG;EAAG;EAAG;CAAK;AAC1B;;;;;;;AAQA,MAAa,cAAc,UAAmB,SAAuD;CACjG,MAAM,CAAC,GAAG,GAAG,GAAG,SAAS,qBAAqB,IAAI,GAC9C,CAAC,GAAG,GAAG,KAAK,UAAU;EAAC;EAAG;EAAG;CAAC,CAAC;CACnC,OAAO;EAAC;EAAG;EAAG;EAAG;CAAK;AAC1B;;;;;;AAOA,MAAa,cAAc,SAA6B;CACpD,OAAO,SAAS;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC;AAC/C;;;;;;AAOA,MAAa,cAAc,SAA6E;CACpG,OAAO;AACX;;;;;;AAOA,MAAa,gBAAgB,SAA6E;CACtG,MAAM,CAAC,GAAG,GAAG,KAAK,SAAS;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC;CACtD,OAAO;EAAC;EAAG;EAAG;EAAG,KAAK;CAAE;AAC5B;;;;;;AAOA,MAAa,cAAc,SAAwB;CAC/C,OAAO,QAAQ;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC;AACvD;;;;;;AAOA,MAAa,gBAAgB,SAAwB;CACjD,MAAM,MAAM,WAAW;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC;CAClD,OAAO,QAAQ;EAAC,IAAI;EAAI,IAAI;EAAI,IAAI;EAAI,KAAK;CAAE,CAAC;AACpD;;;;;;;;;;;AC/dA,MAAa,iBAAiB,QAA4D;CACtF,OAAO,iBACH;EACI;EAAoB;EAAqB;EAAoB;EAAoB;EACjF;EAAmB;EAAK;EAAqB;CACjD,GACA,GACJ;AACJ;;;;;;AAMA,MAAa,iBAAiB,QAA4D;CACtF,OAAO,iBACH;EACI;EAAmB;EAAqB;EAAsB;EAAqB;EACnF;EAAsB;EAAqB;EAAsB;CACrE,GACA,GACJ;AACJ;;;;;;AAOA,MAAa,eAAe,OAAmB;CAC3C,MAAM,YAAY,MAAsB;EACpC,MAAM,OAAO,IAAI,IAAI,KAAK;EAG1B,IAFU,IAAI,QAEH,QACP,OAAO,IAAI;EAGf,OAAO,SAAS,IAAI,QAAS,UAAU,OAAO;CAClD;CACA,OAAO;EAAC,SAAS,GAAG,EAAE;EAAG,SAAS,GAAG,EAAE;EAAG,SAAS,GAAG,EAAE;CAAC;AAC7D;;;;;;AAOA,MAAa,eAAe,QAAoB;CAC5C,OAAO,eAAe,GAAG;AAC7B;;;;;;AAOA,MAAa,WAAW,SAAqB;CACzC,MAAM,YAAY,YAAY;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC;CACzD,OAAO,cAAc;EAAC,UAAU;EAAI,UAAU;EAAI,UAAU;CAAE,CAAC;AACnE;;;;;;AAOA,MAAa,aAAa,SAA6E;CACnG,MAAM,CAAC,GAAG,GAAG,KAAK,YAAY,cAAc;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC,CAAC;CACxE,OAAO;EAAC;EAAG;EAAG;EAAG,KAAK;CAAE;AAC5B;;;;;;AAOA,MAAa,aAAa,SAAwB;CAC9C,MAAM,MAAM,QAAQ;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC;CAC/C,OAAO,QAAQ;EAAC,IAAI;EAAI,IAAI;EAAI,IAAI;EAAI,KAAK;CAAE,CAAC;AACpD;;;;;;;;;;;AChFA,MAAa,iBAAiB,QAA4D;CACtF,OAAO,iBACH;EACI;EAAoB;EAAqB;EAAsB;EAAqB;EACpF;EAAqB;EAAsB;EAAsB;CACrE,GACA,GACJ;AACJ;;;;;;AAOA,MAAa,iBAAiB,QAA4D;CACtF,OAAO,iBACH;EACI;EAAoB;EAAoB;EAAoB;EAAqB;EACjF;EAAoB;EAAqB;EAAqB;CAClE,GACA,GACJ;AACJ;;;;;;AAOA,MAAa,iBAAiB,QAA4D;CACtF,MAAM,SAAS,IAAI,KAAK,MAAc;EAGlC,QAFa,IAAI,IAAI,KAAK,KAChB,KAAK,IAAI,CACH,MAAM,MAAM;CAChC,CAAC;CAED,OAAO;EAAC,OAAO,MAAM;EAAG,OAAO,MAAM;EAAG,OAAO,MAAM;CAAC;AAC1D;;;;;;AAOA,MAAa,iBAAiB,QAA4D;CACtF,MAAM,SAAS,IAAI,KAAK,MAAc;EAGlC,QAFa,IAAI,IAAI,KAAK,KAChB,KAAK,IAAI,CACH,MAAM,MAAM;CAChC,CAAC;CAED,OAAO;EAAC,OAAO,MAAM;EAAG,OAAO,MAAM;EAAG,OAAO,MAAM;CAAC;AAC1D;;;;;;AAOA,MAAa,cAAc,SAA6E;CACpG,MAAM,CAAC,GAAG,GAAG,KAAK,cAAc,cAAc;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC,CAAC;CAC1E,OAAO;EAAC;EAAG;EAAG;EAAG,KAAK;CAAE;AAC5B;;;;;;AAOA,MAAa,iBAAiB,SAAwB;CAClD,MAAM,cAAc,cAAc,cAAc,cAAc;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC,CAAC,CAAC;CAC3F,OAAO,eAAe;EAAC,YAAY;EAAI,YAAY;EAAI,YAAY;EAAI,KAAK;CAAE,CAAC;AACnF;;;;;;;;;;;AC1EA,MAAa,uBAAuB,OAA2D;CAC3F,OAAO,iBACH;EACI;EAAoB;EAAqB;EAAoB;EAAoB;EACjF;EAAqB;EAAK;EAAK;CACnC,GACA,EACJ;AACJ;;;;;;AAOA,MAAa,uBAAuB,QAA4D;CAC5F,OAAO,iBACH;EACI;EAAoB;EAAsB;EAAsB;EAAqB;EACrF;EAAqB;EAAK;EAAK;CACnC,GACA,GACJ;AACJ;;;;;;AAOA,MAAa,4BAA4B,OAAmB;CACxD,MAAM,CAAC,KAAK,KAAK,OAAO;CACxB,MAAM,YAAY,MAAsB;EACpC,OAAO,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK;CACxC;CACA,OAAO;EAAC,SAAS,GAAG;EAAG,SAAS,GAAG;EAAG,SAAS,GAAG;CAAC;AACvD;;;;;;AAOA,MAAa,4BAA4B,OAAmB;CACxD,MAAM,CAAC,KAAK,KAAK,OAAO;CACxB,MAAM,YAAY,MAAsB;EACpC,OAAO,IAAI,IAAI,MAAM,MAAM,IAAI,OAAO,IAAI;CAC9C;CACA,OAAO;EAAC,SAAS,GAAG;EAAG,SAAS,GAAG;EAAG,SAAS,GAAG;CAAC;AACvD;;;;;;AAOA,MAAa,iBAAiB,SAAqB;CAC/C,MAAM,kBAAkB,yBAAyB;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC;CAC5E,OAAO,SAAS,oBAAoB;EAAC,gBAAgB;EAAI,gBAAgB;EAAI,gBAAgB;CAAE,CAAC,CAAC;AACrG;;;;;;AAOA,MAAa,mBAAmB,SAA6E;CACzG,MAAM,CAAC,GAAG,GAAG,KAAK,yBAAyB,oBAAoB,SAAS;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC,CAAC,CAAC;CACrG,OAAO;EAAC;EAAG;EAAG;EAAG,KAAK;CAAE;AAC5B;;;;;;AAOA,MAAa,mBAAmB,SAAwB;CACpD,MAAM,MAAM,cAAc;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC;CACrD,OAAO,QAAQ;EAAC,IAAI;EAAI,IAAI;EAAI,IAAI;EAAI,KAAK;CAAE,CAAC;AACpD;;;;;;ACpFA,MAAM,KAAK;AACX,MAAM,KAAK;;;;;;AAOX,MAAa,yBAAyB,QAAoB;CACtD,MAAM,YAAY,MAAuB,IAAI,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,GAAI;CACtG,OAAO;EAAC,SAAS,IAAI,EAAE;EAAG,SAAS,IAAI,EAAE;EAAG,SAAS,IAAI,EAAE;CAAC;AAChE;;;;;;AAOA,MAAa,yBAAyB,QAAoB;CACtD,MAAM,YAAY,MAAuB,KAAK,KAAK,KAAK,KAAK,IAAI,GAAG,GAAI,IAAK,qBAAU,MAAM;CAC7F,OAAO;EAAC,SAAS,IAAI,EAAE;EAAG,SAAS,IAAI,EAAE;EAAG,SAAS,IAAI,EAAE;CAAC;AAChE;;;;;;AAOA,MAAa,sBAAsB,QAA4D;CAC3F,OAAO,iBACH;EACI;EAAoB;EAAqB;EAAoB;EAAoB;EACjF;EAAqB;EAAK;EAAsB;CACpD,GACA,GACJ;AACJ;;;;;;AAOA,MAAa,sBAAsB,QAA4D;CAC3F,OAAO,iBACH;EACI;EAAmB;EAAoB;EAAmB;EAAoB;EAC9E;EAAoB;EAAmB;EAAoB;CAC/D,GACA,GACJ;AACJ;;;;;;AAOA,MAAa,gBAAgB,SAAqB;CAC9C,MAAM,iBAAiB,sBAAsB;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC;CACxE,OAAO,mBAAmB;EAAC,eAAe;EAAI,eAAe;EAAI,eAAe;CAAE,CAAC;AACvF;;;;;;AAOA,MAAa,kBAAkB,SAA6E;CACxG,MAAM,CAAC,GAAG,GAAG,KAAK,sBAAsB,mBAAmB;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC,CAAC;CACvF,OAAO;EAAC;EAAG;EAAG;EAAG,KAAK;CAAE;AAC5B;;;;;;AAOA,MAAa,kBAAkB,SAAwB;CACnD,MAAM,MAAM,aAAa;EAAC,KAAK;EAAI,KAAK;EAAI,KAAK;CAAE,CAAC;CACpD,OAAO,QAAQ;EAAC,IAAI;EAAI,IAAI;EAAI,IAAI;EAAI,KAAK;CAAE,CAAC;AACpD;;;ACnDA,MAAM,gBAAoD;CAAE,KAAK;CAAG,OAAO;CAAG,KAAK;AAAE;AAIrF,MAAM,eAA0B;CAC5B;CAAoB;CAAqB;CAAoB;CAAqB;CAClF;CAAqB;CAAqB;CAAqB;AACnE;AACA,MAAM,iBAA4B;CAC9B;CAAG;CAAoB;CAAoB;CAAG;CAAqB;CAAqB;CAAG;CAC3F;AACJ;AAEA,MAAM,kBAAkB,MAA4B;CAChD,MAAM,IAAI,EAAE,IACR,IAAI,EAAE,IACN,IAAI,EAAE,IACN,IAAI,EAAE,IACN,IAAI,EAAE,IACN,IAAI,EAAE,IACN,IAAI,EAAE,IACN,IAAI,EAAE,IACN,IAAI,EAAE;CACV,MAAM,MAAM,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI;CACzE,OAAO;GACF,IAAI,IAAI,IAAI,KAAK;GACjB,IAAI,IAAI,IAAI,KAAK;GACjB,IAAI,IAAI,IAAI,KAAK;GACjB,IAAI,IAAI,IAAI,KAAK;GACjB,IAAI,IAAI,IAAI,KAAK;GACjB,IAAI,IAAI,IAAI,KAAK;GACjB,IAAI,IAAI,IAAI,KAAK;GACjB,IAAI,IAAI,IAAI,KAAK;GACjB,IAAI,IAAI,IAAI,KAAK;CACtB;AACJ;AAEA,MAAM,aAAa,eAAe,YAAY;AAC9C,MAAM,iBAAiB,eAAe,cAAc;AAIpD,MAAM,QAAQ,QAAQ;AACtB,MAAM,QAAQ,KAAK;AACnB,MAAM,SAAS,QAAQ,QAAQ;AAC/B,MAAM,cAAc,QAAS;AAC7B,MAAM,cAAe,QAAuB;AAE5C,MAAM,cAAc,UAAuB;EACtC,MAAQ,SAAS,MAAO;EACxB,MAAQ,SAAS,MAAO;EACxB,MAAQ,SAAS,KAAM;AAC5B;;AAGA,MAAa,eAAe,QAAoB;CAC5C,MAAM,CAAC,KAAK,KAAK,OAAO,SAAS;EAAC,IAAI;EAAI,IAAI;EAAI,IAAI;CAAE,CAAC;CACzD,MAAM,KAAK,MAAM;CACjB,MAAM,KAAK;CACX,MAAM,KAAK,MAAM;CACjB,MAAM,KAAK,KAAK,SAAS,KAAK,KAAK,EAAE,KAAK,QAAQ,KAAK,MAAM;CAC7D,MAAM,KAAK,KAAK,SAAS,KAAK,KAAK,EAAE,KAAK,QAAQ,KAAK,MAAM;CAC7D,MAAM,KAAK,KAAK,SAAS,KAAK,KAAK,EAAE,KAAK,QAAQ,KAAK,MAAM;CAC7D,OAAO;EAAC,MAAM,KAAK;EAAI,OAAO,KAAK;EAAK,OAAO,KAAK;CAAG;AAC3D;;AAGA,MAAa,iBAAiB,QAAoB;CAC9C,MAAM,MAAM,iBAAiB,YAAY,GAAG;CAC5C,MAAM,UAAgB;EAAC,KAAK,KAAK,IAAI,EAAE;EAAG,KAAK,KAAK,IAAI,EAAE;EAAG,KAAK,KAAK,IAAI,EAAE;CAAC;CAC9E,OAAO,iBAAiB,gBAAgB,OAAO;AACnD;;AAGA,MAAM,YAAY,QAAoB;CAClC,MAAM,IAAI,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;CACnC,MAAM,IAAK,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,IAAI,MAAO,KAAK;CACpD,OAAO;EAAC,IAAI;EAAI;GAAI,IAAI,OAAO;CAAG;AACtC;;AAGA,MAAM,iBAAiB,QAAoB;CACvC,MAAM,IAAI,IAAI,IACV,IAAI,IAAI,IACR,IAAI,IAAI;CACZ,MAAM,MAAM,KAAK,IAAI,GAAG,GAAG,CAAC;CAC5B,MAAM,MAAM,KAAK,IAAI,GAAG,GAAG,CAAC;CAC5B,MAAM,KAAK,MAAM,OAAO;CACxB,IAAI,QAAQ,KACR,OAAO;EAAC;EAAG;EAAG;CAAC;CAEnB,MAAM,IAAI,MAAM;CAChB,MAAM,IAAI,IAAI,KAAM,KAAK,IAAI,MAAM,OAAO,KAAK,MAAM;CACrD,IAAI;CACJ,IAAI,QAAQ,GACR,MAAM,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,MAAM;MACnC,IAAI,QAAQ,GACf,MAAM,IAAI,KAAK,IAAI,KAAK;MAExB,MAAM,IAAI,KAAK,IAAI,KAAK;CAE5B,OAAO;EAAC;EAAG;EAAG;CAAC;AACnB;;AAGA,MAAM,YAAY,OAAc,UAA4B;CACxD,MAAM,KAAK,MAAO,SAAS;CAC3B,MAAM,MAAM,WAAW,KAAK;CAC5B,MAAM,SAAS,cAAc,GAAG;CAChC,MAAM,MAAM,cAAc,MAAM;CAChC,IAAI;CACJ,QAAQ,OAAR;EACI,KAAK;GACD,SAAS;GACT;EACJ,KAAK;GACD,SAAS;GACT;EACJ,KAAK;EACL,KAAK;GACD,SAAS;GACT;EACJ,KAAK;GACD,SAAS,SAAS,GAAG;GACrB;EACJ,KAAK;GACD,SAAS,YAAY,GAAG;GACxB;EACJ,KAAK;GACD,SAAS,cAAc,GAAG;GAC1B;EACJ,KAAK;GACD,SAAS,SAAS,YAAY,GAAG,CAAC;GAClC;EACJ,KAAK;GACD,SAAS,SAAS,cAAc,GAAG,CAAC;GACpC;EACJ,KAAK,OAED,SAAS;GAAC,cAAc,GAAG,CAAC,CAAC,KAAK;GAAK,cAAc,GAAG,CAAC,CAAC;GAAI,cAAc,GAAG,CAAC,CAAC;EAAE;CAE3F;CACA,OAAO;EAAC,OAAO;EAAI,OAAO;EAAI,OAAO;EAAI;CAAC;AAC9C;;AAGA,MAAM,cAAc,QAAe,UAA4B;CAC3D,MAAM,KAAK,OAAO,IACd,KAAK,OAAO,IACZ,KAAK,OAAO,IACZ,IAAI,OAAO;CACf,QAAQ,OAAR;EACI,KAAK,QACD,OAAO,SAAS;GAAC;GAAI;GAAI;GAAI;EAAC,CAAC;EACnC,KAAK,eACD,OAAO,eAAe;GAAC;GAAI;GAAI;GAAI;EAAC,CAAC;EACzC,KAAK;EACL,KAAK,WACD,OAAO,QAAQ;GAAC;GAAI;GAAI;GAAI;EAAC,CAAC;EAClC,KAAK,WACD,OAAO,QAAQ,CAAC,GAAG,SAAS;GAAC;GAAI;GAAI;EAAE,CAAC,GAAG,CAAC,CAAC;EACjD,KAAK,OACD,OAAO,WAAW,QAAQ;GAAC;GAAI;GAAI;EAAE,CAAC,GAAG,CAAC;EAC9C,KAAK,SACD,OAAO,WAAW,UAAU;GAAC;GAAI;GAAI;EAAE,CAAC,GAAG,CAAC;EAChD,KAAK,OACD,OAAO,WAAW,QAAQ,QAAQ;GAAC;GAAI;GAAI;EAAE,CAAC,CAAC,GAAG,CAAC;EACvD,KAAK,SACD,OAAO,WAAW,UAAU,QAAQ;GAAC;GAAI;GAAI;EAAE,CAAC,CAAC,GAAG,CAAC;EACzD,KAAK,OAAO;GACR,MAAM,MAAM,QAAQ;IAAC,KAAK;IAAK;IAAI;GAAE,CAAC;GACtC,OAAO,SAAS;IAAC,IAAI;IAAI,IAAI;IAAI,IAAI;IAAI;GAAC,CAAC;EAC/C;CACJ;AACJ;AAEA,MAAM,cAAc,KAAW,MAAqB;CAChD,MAAM,MAAM,eAAe,cAAc,GAAG,CAAC;CAC7C,OAAO,SAAS;EAAC,IAAI;EAAI,IAAI;EAAI,IAAI;EAAI;CAAC,CAAC;AAC/C;;;;;;AAOA,MAAa,kBACT,IACA,IACA,SACA,SACA,SAAoB,cACX;CACT,MAAM,OAAO,UAAU;CACvB,IAAI,SAAS,GACT,OAAO;CAEX,IAAI,MAAO,KAAK,MAAM,MAAO,OAAO;CACpC,QAAQ,QAAR;EACI,KAAK;GACD,IAAI,IAAI,KAAK,KAAK;GAClB;EACJ,KAAK;GACD,IAAI,IAAI,KAAK,KAAK;GAClB;EACJ,KAAK,cACD;EACJ,KAAK,cACD,IAAI,IAAI,GAAG,KAAK;CAExB;CACA,OAAO,KAAK,KAAK,UAAU;AAC/B;AAIA,MAAM,qBAAqB,SAAkB,WAAqC;CAC9E,IAAI;CACJ,IAAI,aAA4B;CAChC,KAAK,MAAM,SAAS,QAAQ;EACxB,IAAI,MAAM,SAAA,MAAuC,MAAM,SAAA,GACnD;EAEJ,IAAI,MAAM,SAAA,IACN,aAAa,MAAM;OAChB,IAAI,aAAa,KAAK,KAAK,MAAM,UAAU,QAE1C;OAAA,eAAe,MAAM,aAAa;EAAA,OACnC,IAAI,eAAe,KAAA,GACtB,aAAa;OAEb,MAAM,IAAI,MAAM,2CAA2C;CAEnE;CACA,IAAI,eAAe,KAAA,GACf,MAAM,IAAI,MAAM,0CAA0C;CAE9D,MAAM,QAAkB;CACxB,OAAO;EAAE,OAAOA,QAAU,MAAM,SAAS,KAAK;EAAG;CAAW;AAChE;AAEA,MAAM,mBAAgC;CAClC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACJ;AAEA,MAAM,aACF,IACA,IACA,IACA,IACA,OACA,cAC8B;CAC9B,MAAM,SAAS,cAAc;CAE7B,MAAM,KAAY;EAAC,GAAG,KAAK,GAAG;EAAI,GAAG,KAAK,GAAG;EAAI,GAAG,KAAK,GAAG;EAAI,GAAG;CAAE;CACrE,MAAM,KAAY;EAAC,GAAG,KAAK,GAAG;EAAI,GAAG,KAAK,GAAG;EAAI,GAAG,KAAK,GAAG;EAAI,GAAG;CAAE;CACrE,MAAM,QAAQ,KAAK,GAAG,KAAK,KAAK,GAAG;CACnC,IAAI,SAAS,GACT,OAAO;EAAC;EAAG;EAAG;EAAG;CAAC;CAEtB,MAAM,MAAa;EAAC;EAAG;EAAG;EAAG;CAAK;CAClC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;EACxB,IAAI,MAAM,QACN;EAEJ,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK;CACjD;CACA,IAAI,WAAW,KAAA,GAAW;EACtB,IAAI,KAAK,GAAG,IAAI,MAAM;EACtB,IAAI,KAAK,GAAG,IAAI,MAAM;EAItB,IAAI,GAAG,OAAO,GAAG,KAAK;EACtB,IAAI,GAAG,OAAO,GAAG,KAAK;EACtB,IAAI,UAAU,eAAe,IAAI,IAAI,IAAI,IAAI,SAAS;CAC1D;CACA,OAAO;AACX;AAEA,MAAM,mBAAmB,SAAkB,SAA4B;CACnE,MAAM,SAAuB,CAAC,CAAC,CAAC;CAChC,KAAK,MAAM,SAAS,MAChB,IAAI,MAAM,SAAA,GACN,OAAO,KAAK,CAAC,CAAC;MAEd,OAAO,OAAO,SAAS,EAAE,CAAE,KAAK,KAAK;CAG7C,MAAM,aAAa,OAAO,KAAK,UAAU,MAAM,QAAQ,MAAM,EAAE,SAAA,EAAmC,CAAC;CACnG,IAAI,WAAW,WAAW,GACtB,MAAM,IAAI,MAAM,mDAAmD;CAGvE,MAAM,SAAS,WAAW;CAC1B,MAAM,YAAY,SAAS,OAAO,KAAK,KAAA;CACvC,MAAM,eAAe,cAAc,KAAA,KAAa,aAAa,SAAS,KAAK,UAAU,UAAU;CAC/F,IAAI,CAAC,UAAU,OAAO,SAAS,KAAK,CAAC,cACjC,MAAM,IAAI,MAAM,wDAAwD;CAE5E,MAAM,aAAa,OAAO;CAC1B,IAAI,CAAC,cAAc,CAAC,aAAa,UAAU,GACvC,MAAM,IAAI,MAAM,yCAAyC;CAE7D,MAAM,QAAQ,WAAW;CACzB,IAAI,iBAAiB,QAAQ,KAAK,MAAM,IACpC,MAAM,IAAI,MAAM,gDAAgD,MAAM,EAAE;CAG5E,IAAI,YAAuB;CAC3B,MAAM,OAAO,OAAO,MAAM,CAAC;CAC3B,IAAI,KAAK,SAAS,GAAG;EACjB,MAAM,SAAS,KAAK;EACpB,MAAM,aAAa,KAAK;EACxB,IACI,CAAC,UACD,CAAC,cACD,CAAC,aAAa,MAAM,KACpB,CAAC,aAAa,UAAU,KACxB,WAAW,UAAU,OAErB,MAAM,IAAI,MAAM,2CAA2C;EAE/D,IAAI;GAAC;GAAW;GAAU;GAAc;EAAY,CAAC,CAAC,QAAQ,OAAO,KAAK,MAAM,IAC5E,MAAM,IAAI,MAAM,uCAAuC,OAAO,MAAM,EAAE;EAE1E,YAAY,OAAO;CACvB;CAEA,MAAM,SAAS,WAAW;CAC1B,MAAM,SAAS,WAAW;CAC1B,IAAI,CAAC,UAAU,CAAC,QACZ,MAAM,IAAI,MAAM,mDAAmD;CAEvE,MAAM,aAAa,kBAAkB,SAAS,MAAM;CACpD,MAAM,aAAa,kBAAkB,SAAS,MAAM;CAEpD,IAAI,KAAK,WAAW;CACpB,IAAI,KAAK,WAAW;CACpB,IAAI,OAAO,QAAQ,OAAO,MAAM;EAC5B,KAAK;EACL,KAAK;CACT,OAAO,IAAI,OAAO,MACd,KAAK,OAAO,MAAM;MACf,IAAI,OAAO,MACd,KAAK,MAAM;MACR;EACH,MAAM,MAAM,KAAK;EACjB,IAAI,MAAM,GAAG;GACT,KAAM,KAAK,MAAO;GAClB,KAAM,KAAK,MAAO;EACtB;CACJ;CACA,MAAM,WAAW,MAAM,KAAK;CAC5B,MAAM,WAAW,MAAM,KAAK;CAE5B,MAAM,QAAQ,UACV,SAAS,WAAW,OAAO,KAAK,GAChC,SAAS,WAAW,OAAO,KAAK,GAChC,SACA,SACA,OACA,SACJ;CACA,OAAO,WAAW,OAAO,KAAK;AAClC;AAEA,MAAa,YAAY,SAAkB,SAA4B;CACnE,IAAI;EACA,OAAO,gBAAgB,SAAS,IAAI;CACxC,SAAS,GAAG;EAGR,QAAQ,OAAO,KAAK,kCAAkC,aAAa,QAAQ,EAAE,UAAU,GAAG;EAC1F,OAAA;CACJ;AACJ;;;ACjYA,MAAaC,UAAgC;CACzC,MAAM;CACN,QAAQ,SAAkB,UAA2B;EACjD,IAAI,MAAM,SAAA,IAA6B;GACnC,MAAM,gBAAgB,0BAA0B,MAAM;GACtD,IAAI,OAAO,kBAAkB,aACzB,MAAM,IAAI,MAAM,sDAAsD,MAAM,KAAK,EAAE;GAEvF,OAAO,cAAc,SAAS,MAAM,MAAM;EAC9C;EAEA,IAAI,MAAM,SAAA,GAA+B;GACrC,MAAM,CAAC,GAAG,GAAG,GAAG,KAAK,SAAS,KAAK;GACnC,OAAO,KAAK,GAAG,GAAG,GAAG,CAAC;EAC1B;EAEA,IAAI,MAAM,SAAA,IAAgC;GACtC,MAAM,aAAa,OAAO,MAAM,MAAM,YAAY;GAClD,IAAI,OAAO,eAAe,aACtB,OAAO;EAEf;EAEA,OAAA;CACJ;AACJ;AAEA,MAAM,YAAY,UAAuD;CACrE,IAAI,MAAM,MAAM,WAAW,GAAG;EAC1B,MAAM,IAAI,MAAM,MAAM,UAAU,GAAG,CAAC;EACpC,MAAM,IAAI,MAAM,MAAM,UAAU,GAAG,CAAC;EACpC,MAAM,IAAI,MAAM,MAAM,UAAU,GAAG,CAAC;EACpC,OAAO;GAAC,SAAS,IAAI,GAAG,EAAE;GAAG,SAAS,IAAI,GAAG,EAAE;GAAG,SAAS,IAAI,GAAG,EAAE;GAAG;EAAC;CAC5E;CAEA,IAAI,MAAM,MAAM,WAAW,GAAG;EAC1B,MAAM,IAAI,MAAM,MAAM,UAAU,GAAG,CAAC;EACpC,MAAM,IAAI,MAAM,MAAM,UAAU,GAAG,CAAC;EACpC,MAAM,IAAI,MAAM,MAAM,UAAU,GAAG,CAAC;EACpC,MAAM,IAAI,MAAM,MAAM,UAAU,GAAG,CAAC;EACpC,OAAO;GAAC,SAAS,IAAI,GAAG,EAAE;GAAG,SAAS,IAAI,GAAG,EAAE;GAAG,SAAS,IAAI,GAAG,EAAE;GAAG,SAAS,IAAI,GAAG,EAAE,IAAI;EAAG;CACpG;CAEA,IAAI,MAAM,MAAM,WAAW,GAAG;EAC1B,MAAM,IAAI,MAAM,MAAM,UAAU,GAAG,CAAC;EACpC,MAAM,IAAI,MAAM,MAAM,UAAU,GAAG,CAAC;EACpC,MAAM,IAAI,MAAM,MAAM,UAAU,GAAG,CAAC;EACpC,OAAO;GAAC,SAAS,GAAG,EAAE;GAAG,SAAS,GAAG,EAAE;GAAG,SAAS,GAAG,EAAE;GAAG;EAAC;CAChE;CAEA,IAAI,MAAM,MAAM,WAAW,GAAG;EAC1B,MAAM,IAAI,MAAM,MAAM,UAAU,GAAG,CAAC;EACpC,MAAM,IAAI,MAAM,MAAM,UAAU,GAAG,CAAC;EACpC,MAAM,IAAI,MAAM,MAAM,UAAU,GAAG,CAAC;EACpC,MAAM,IAAI,MAAM,MAAM,UAAU,GAAG,CAAC;EACpC,OAAO;GAAC,SAAS,GAAG,EAAE;GAAG,SAAS,GAAG,EAAE;GAAG,SAAS,GAAG,EAAE;GAAG,SAAS,GAAG,EAAE,IAAI;EAAG;CACpF;CAEA,OAAO;EAAC;EAAG;EAAG;EAAG;CAAC;AACtB;AAEA,MAAM,OAAO,UAAmB,SAA6B;CACzD,MAAM,SAAS,KAAK,OAAO,uBAAuB;CAElD,IAAI,oBAAoB,MAAM,GAC1B,MAAM,IAAI,MAAM,wCAAwC;CAG5D,IAAI,OAAO,WAAW,KAAK,OAAO,WAAW,GAAG;EAC5C,MAAM,IAAI,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC;EAC7C,MAAM,IAAI,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC;EAC7C,MAAM,IAAI,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC;EAC7C,MAAM,IAAI,OAAO,WAAW,IAAI,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI;EACvE,OAAO,KAAK,GAAG,GAAG,GAAG,CAAC;CAC1B;CAIA,IAAI,OAAO,WAAW,GAAG;EACrB,MAAM,QAAQ,GAAG,QAAQ,CAAC;EAC1B,IAAI,MAAM,SAAA,KAAkC,MAAM,UAAU,KAAK;GAC7D,MAAM,IAAI,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC;GAC7C,MAAM,IAAI,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC;GAC7C,MAAM,IAAI,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC;GAC7C,MAAM,IAAI,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC;GAC7C,OAAO,KAAK,GAAG,GAAG,GAAG,CAAC;EAC1B;CACJ;CAEA,OAAO;AACX;;;;;;;AAQA,MAAM,UAAU,SAAkB,SAAqB;CACnD,MAAM,SAAS,KAAK,OAAO,uBAAuB,GAC9C,UAAU,OAAO,IACjB,gBAAgB,WAAW,QAAQ,SAAA,KAAiC,QAAQ,QAAQ;CAGxF,IAAI,CAFe,oBAAoB,MAAM,GAE5B;EACb,MAAM,cAAc,eAChB,qBAAqB,gCAAgC;EACzD,IAAI,OAAO,uBAAuB,aAC9B,MAAM,IAAI,MAAM,mDAAmD,YAAY,uBAAuB;EAE1G,MAAM,KAAK,GAAG,QAAQ,CAAC,GACnB,KAAK,GAAG,QAAQ,CAAC,GACjB,KAAK,GAAG,QAAQ,CAAC,GACjB,KAAK,OAAO,IACZ,KAAK,OAAO;EAahB,OAAO,mBAAmB;GAZjB,cAAc,EAAE,IAAI,GAAG,SAAS;GAChC,cAAc,EAAE,IAAI,GAAG,SAAS;GAChC,cAAc,EAAE,IAAI,GAAG,SAAS;GAEjC,OAAO,KAAA,KACP,GAAG,SAAA,KACH,GAAG,UAAU,OACb,OAAO,KAAA,KACP,cAAc,EAAE,IACV,GAAG,SACH;EAE0B,CAAC;CAC7C,OAAO;EACH,MAAM,oBAAoB,OAAyC,UAAoB;GACnF,IAAI,cAAc,KAAK,GACnB,OAAO,MAAM;GAGjB,MAAM,cAAc,UAA0B;IAC1C,OAAO,UAAU,OAAO,UAAU,MAAM,IAAI,UAAU,OAAO,UAAU,MAAM,IAAI;GACrF;GAEA,IAAI,aAAa,KAAK,GAAG;IACrB,MAAM,WAAW,WAAW,MAAM,KAAK;IACvC,OAAO,GAAG,OAAO,QAAQ;GAC7B;GAEA,MAAM,aAAa,SAA6B;IAC5C,MAAM,QAAQ,KAAK,OAAO,uBAAuB;IACjD,IAAI,aAAa;IACjB,KAAK,MAAM,QAAQ,OACf,cACI,KAAK,SAAA,MAA+B,KAAK,SAAS,SAC5C,UAAU,KAAK,MAAM,IACrB,cAAc,IAAI,IAChB,KAAK,SACL,KAAK,SAAA,KAAkC,aAAa,IAAI,IACtD,KAAK,QACL;IAElB,cAAc;IACd,OAAO;GACX;GAEA,IAAI,MAAM,SAAA,IAA6B;IACnC,MAAM,OAAO,MAAM,OAAO,OAAO,uBAAuB;IACxD,IAAI,MAAM,SAAS,QAAQ;KACvB,MAAM,aAAa,UAAU,IAAI,CAAC,CAC7B,QAAQ,OAAO,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CACnC,QAAQ,OAAO,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CACnC,QAAQ,OAAO,MAAM,EAAE,CAAC,SAAS,CAAC;KAEvC,OAAO,mBAAmB,UAAU;IACxC;GACJ;GAEA,OAAO;EACX;EAEA,MAAM,aAAa,GAAG,QAAQ,CAAC,GAC3B,kBACI,WAAW,SAAA,KACL,WAAW,OACX,aAAa,UAAU,KAAK,WAAW,SAAA,IACrC,QACA,WACZ,WAAW,GAAG,QAAQ,CAAC,GACvB,gBAAgB,aAAa,QAAQ,IAAI,SAAS,QAAQ;EAE9D,IAAI,OACA,WAAW,SAAA,KAA8B,WAAW,SAAS,aAAa,UAAU,IAAI,CAAC,UAAU,IAAI,CAAC;EAE5G,IAAI,aAAa,UAAU,GAAG;GAE1B,IAAI,OADgB,OAAO,WAAW,MAAM,YAAY,OAC7B,aACvB,MAAM,IAAI,MAAM,0DAA0D;QACvE;IACH,MAAM,KAAK,WAAW,SAAS,WAAW,KAAK,GAC3C,QAAQ,MAAO,IACf,OAAO,MAAQ,MAAM,GACrB,QAAQ,MAAQ,MAAM;IAE1B,OAAO;KACH;MAAE,MAAA;MAA8B,QAF1B,MAAQ,MAAM;MAEyB,OAAO;KAAE;KACtD;MAAE,MAAA;MAA8B,QAAQ;MAAO,OAAO;KAAE;KACxD;MAAE,MAAA;MAA8B,QAAQ;MAAM,OAAO;KAAE;KACvD;MAAE,MAAA;MAA8B,QAAQ,QAAQ,IAAI,QAAQ,MAAM;MAAO,OAAO;KAAE;IACtF;GACJ;EACJ,OAAO,IAAI,WAAW,SAAA,GAA+B;GACjD,MAAM,CAAC,KAAK,OAAO,MAAM,SAAS,SAAS,UAAU;GACrD,OAAO;IACH;KAAE,MAAA;KAA8B,QAAQ;KAAK,OAAO;IAAE;IACtD;KAAE,MAAA;KAA8B,QAAQ;KAAO,OAAO;IAAE;IACxD;KAAE,MAAA;KAA8B,QAAQ;KAAM,OAAO;IAAE;IACvD;KAAE,MAAA;KAA8B,QAAQ,QAAQ,IAAI,QAAQ,MAAM;KAAO,OAAO;IAAE;GACtF;EACJ;EAEA,IAAI,KAAK,WAAW,GAChB,MAAM,IAAI,MAAM,0DAA0D;EAG9E,IAAI,kBAAkB,WAClB,MAAM,IAAI,MAAM,6DAA6D;EAGjF,MAAM,iBAAiB,8BAA8B,kBACjD,iBAAiB,gCAAgC,gBACjD,cAAc,gCAAgC;EAElD,IAAI,OAAO,mBAAmB,aAC1B,MAAM,IAAI,MAAM,mDAAmD,gBAAgB,uBAAuB;EAE9G,IAAI,OAAO,mBAAmB,aAC1B,MAAM,IAAI,MAAM,mDAAmD,cAAc,uBAAuB;EAG5G,MACI,wBAA0D,eADT,eAAe,SAAS,IACS,CAAC,GACnF,KAAK,iBAAiB,uBAAuB,GAAG,QAAQ,CAAC,CAAC,GAC1D,KAAK,iBAAiB,uBAAuB,GAAG,QAAQ,CAAC,CAAC,GAC1D,KAAK,iBAAiB,uBAAuB,GAAG,QAAQ,CAAC,CAAC,GAC1D,KAAK,OAAO,IACZ,KAAK,OAAO,IACZ,IACI,OAAO,KAAA,KACP,GAAG,SAAA,KACH,GAAG,UAAU,OACb,OAAO,KAAA,KACP,cAAc,EAAE,IACV,GAAG,SACH;EACd,IAAI,OAAO,QAAQ,OAAO,QAAQ,OAAO,MACrC,MAAM,IAAI,MAAM,4CAA4C;EAEhE,IAAI,OAAO,gBAAgB,aACvB,MAAM,IAAI,MAAM,mDAAmD,cAAc,uBAAuB;EAG5G,OAAO,YAAY;GAAC;GAAI;GAAI;GAAI;EAAC,CAAC;CACtC;AACJ;AAEA,MAAM,kCAEF;CACA,MAAM;CACN,eAAe;CACf,cAAc;CACd,WAAW;CACX,gBAAgB;CAChB,KAAK;CACL,WAAW;CACX,WAAW;CACX,SAAS;AACb;AAEA,MAAM,gCAEF;CACA,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,OAAO;CACP,OAAO;AACX;AAEA,MAAM,kCAEF;CACA,MAAM;CACN,eAAe;CACf,cAAc;CACd,WAAW;CACX,gBAAgB;CAChB,KAAK;CACL,WAAW;CACX,WAAW;CACX,SAAS;AACb;AAEA,MAAM,4BAEF;CACA,KAAK;CACL,MAAM;CACD;CACL,MAAM;CACN,KAAK;CACL,OAAO;CACP,OAAO;CACP,KAAK;CACL,OAAO;CACP,aAAa;AACjB;AAEA,MAAa,cAAc,SAAkB,UACzCA,QAAM,MAAM,SAAS,OAAO,OAAO,KAAK,CAAC,CAAC,oBAAoB,CAAC;AAInE,MAAa,SAAmC;CAC5C,WAAW;CACX,cAAc;CACd,MAAM;CACN,YAAY;CACZ,OAAO;CACP,OAAO;CACP,QAAQ;CACR,OAAO;CACP,gBAAgB;CAChB,MAAM;CACN,YAAY;CACZ,OAAO;CACP,WAAW;CACX,WAAW;CACX,YAAY;CACZ,WAAW;CACX,OAAO;CACP,gBAAgB;CAChB,UAAU;CACV,SAAS;CACT,MAAM;CACN,UAAU;CACV,UAAU;CACV,eAAe;CACf,UAAU;CACV,WAAW;CACX,UAAU;CACV,WAAW;CACX,aAAa;CACb,gBAAgB;CAChB,YAAY;CACZ,YAAY;CACZ,SAAS;CACT,YAAY;CACZ,cAAc;CACd,eAAe;CACf,eAAe;CACf,eAAe;CACf,eAAe;CACf,YAAY;CACZ,UAAU;CACV,aAAa;CACb,SAAS;CACT,SAAS;CACT,YAAY;CACZ,WAAW;CACX,aAAa;CACb,aAAa;CACb,SAAS;CACT,WAAW;CACX,YAAY;CACZ,MAAM;CACN,WAAW;CACX,MAAM;CACN,OAAO;CACP,aAAa;CACb,MAAM;CACN,UAAU;CACV,SAAS;CACT,WAAW;CACX,QAAQ;CACR,OAAO;CACP,OAAO;CACP,UAAU;CACV,eAAe;CACf,WAAW;CACX,cAAc;CACd,WAAW;CACX,YAAY;CACZ,WAAW;CACX,sBAAsB;CACtB,WAAW;CACX,YAAY;CACZ,WAAW;CACX,WAAW;CACX,aAAa;CACb,eAAe;CACf,cAAc;CACd,gBAAgB;CAChB,gBAAgB;CAChB,gBAAgB;CAChB,aAAa;CACb,MAAM;CACN,WAAW;CACX,OAAO;CACP,SAAS;CACT,QAAQ;CACR,kBAAkB;CAClB,YAAY;CACZ,cAAc;CACd,cAAc;CACd,gBAAgB;CAChB,iBAAiB;CACjB,mBAAmB;CACnB,iBAAiB;CACjB,iBAAiB;CACjB,cAAc;CACd,WAAW;CACX,WAAW;CACX,UAAU;CACV,aAAa;CACb,MAAM;CACN,SAAS;CACT,OAAO;CACP,WAAW;CACX,QAAQ;CACR,WAAW;CACX,QAAQ;CACR,eAAe;CACf,WAAW;CACX,eAAe;CACf,eAAe;CACf,YAAY;CACZ,WAAW;CACX,MAAM;CACN,MAAM;CACN,MAAM;CACN,YAAY;CACZ,QAAQ;CACR,eAAe;CACf,KAAK;CACL,WAAW;CACX,WAAW;CACX,aAAa;CACb,QAAQ;CACR,YAAY;CACZ,UAAU;CACV,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,WAAW;CACX,WAAW;CACX,WAAW;CACX,MAAM;CACN,aAAa;CACb,WAAW;CACX,KAAK;CACL,MAAM;CACN,SAAS;CACT,QAAQ;CACR,aAAA;CACA,WAAW;CACX,QAAQ;CACR,OAAO;CACP,OAAO;CACP,YAAY;CACZ,QAAQ;CACR,aAAa;AACjB;;;;;;;;;AClfA,MAAa,iBAAiB,SAAgC,KAAK,aAAa,KAAK;AACrF,MAAa,cAAc,SAA6B,KAAK,aAAa,KAAK;AAE/E,MAAa,oBAAoB,YAC7B,OAAQ,QAAuB,cAAc;AAEjD,MAAa,qBAAqB,SAC9B,cAAc,IAAI,KAAK,OAAQ,KAAqB,UAAU,eAAe,CAAC,iBAAiB,IAAI;AAIvG,MAAa,kBAAkB,SAA4C,KAAK,YAAY;AAC5F,MAAa,iBAAiB,SAA2C,KAAK,YAAY;AAC1F,MAAa,gBAAgB,SAAyC,KAAK,YAAY;AACvF,MAAa,iBAAiB,SAA2C,KAAK,YAAY;AAC1F,MAAa,mBAAmB,SAA6C,KAAK,YAAY;AAC9F,MAAa,kBAAkB,SAA4C,KAAK,YAAY;AAC5F,MAAa,kBAAkB,SAA4C,KAAK,YAAY;AAC5F,MAAa,mBAAmB,SAA6C,KAAK,YAAY;AAC9F,MAAa,kBAAkB,SAA4C,KAAK,YAAY;AAC5F,MAAa,mBAAmB,SAA6C,KAAK,YAAY;AAC9F,MAAa,qBAAqB,SAA+C,KAAK,YAAY;AAClG,MAAa,mBAAmB,SAA6C,KAAK,YAAY;AAC9F,MAAa,iBAAiB,SAA2C,KAAK,YAAY;AAC1F,MAAa,eAAe,SAAyC,KAAK,YAAY;AACtF,MAAa,eAAe,SAA4C,KAAK,YAAY;AAEzF,MAAa,mBAAmB,YAC5B,CAAC,iBAAiB,OAAO,KAAK,QAAQ,QAAQ,QAAQ,GAAG,IAAI;AAEjE,MAAM,wCAAwB,IAAI,IAAI;CAClC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACJ,CAAC;;;;;;AAOD,MAAa,yBAAyB,YAClC,CAAC,iBAAiB,OAAO,KAAK,CAAC,sBAAsB,IAAI,QAAQ,OAAO;;;ACT5E,MAAa,gBAAgE;CACzE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,SAAiB;EACxC,QAAQ,MAAR;GACI,KAAK,QACD,OAAA;GACJ,KAAK,UACD,OAAA;GACJ,KAAK,UACD,OAAA;GACJ,KAAK,WACD,OAAA;GACJ,KAAK,eACD,OAAA;GACJ,KAAK,wBACD,OAAA;GACJ,KAAK,eACD,OAAA;GACJ,KAAK,eACD,OAAA;GACJ,KAAK,eACD,OAAA;GACJ,KAAK,eACD,OAAA;GACJ,KAAK,eACD,OAAA;GACJ,KAAK,gBACD,OAAA;GACJ,KAAK,YACD,OAAA;GACJ,KAAK,WACD,OAAA;GACJ,KAAK,aACD,OAAA;GACJ,KAAK,sBACD,OAAA;GACJ,KAAK,qBACD,OAAA;GACJ,KAAK,mBACD,OAAA;GACJ,KAAK,cACD,OAAA;GACJ,KAAK,oBACD,OAAA;GACJ,KAAK,YACD,OAAA;GACJ,KAAK,YACD,OAAA;GACJ,KAAK,YACD,OAAA;GACJ,KAAK,UACD,OAAA;GACJ,KAAK,YACD,OAAA;GACJ,KAAK,kBACD,OAAA;GACJ,KAAK,mBACD,OAAA;GACJ,KAAK,qBACD,OAAA;GACJ,KAAK,WACD,OAAA;GACJ,KAAK,YACD,OAAA;GACJ,KAAK,kBACD,OAAA;GACJ,KAAK,SACD,OAAA;GACJ,KAAK,wBACD,OAAA;GACJ,KAAK,uBACD,OAAA;GACJ,KAAK,yBACD,OAAA;GACJ,KAAK,OACD,OAAA;GACJ,KAAK,kBACD,OAAA;GACJ,KAAK,aACD,OAAA;GACJ,KAAK,aACD,OAAA;GACJ,KAAK,WACD,OAAA;GACJ,KAAK,SACD,OAAA;GACJ,KAAK,WACD,OAAA;GACJ,KAAK,uBACD,OAAA;GACJ,KAAK,yBACD,OAAA;GACJ,KAAK,SACD,OAAA;GACJ,KAAK,UACD,OAAA;GACJ,KAAK,QACD,OAAA;GACJ,KAAK,WACD,OAAA;GACJ,KAAK,uBACD,OAAA;GACJ,KAAK,yBACD,OAAA;GACJ,KAAK,kBACD,OAAA;GACJ,KAAK,mBACD,OAAA;GACJ,KAAK,qBACD,OAAA;GAEJ,SACI,OAAA;EACR;CACJ;AACJ;;;AClLA,MAAa,YAAY,KAAa,WAA4B,MAAM,WAAW;;;ACKnF,IAAa,eAAb,MAA0B;CACtB,WAAyD,CAAC;CAE1D,gBAAgB,MAAsB;EAClC,MAAM,UAAU,KAAK,SAAS;EAE9B,IAAI,WAAW,QAAQ,QACnB,OAAO,GAAG,SAAS,QAAQ,SAAS,CAAC;EAEzC,OAAO;CACX;CAEA,iBAAiB,MAAiC;EAC9C,MAAM,UAAU,KAAK,SAAS;EAC9B,OAAO,UAAU,UAAU,CAAC;CAChC;CAEA,IAAI,UAA0B;EAC1B,SAAS,SAAS,YAAY,KAAK,SAAS,QAAQ,EAAE,IAAI,CAAC;CAC/D;CAEA,MAAM,OAA8C;EAChD,MAAM,mBAAmB,MAAM;EAC/B,MAAM,eAAe,MAAM;EAC3B,IAAI,WAAW;EAEf,IAAI,qBAAqB,MACrB,iBAAiB,SAAS,UAAU;GAChC,MAAM,UAAU,KAAK,SAAS,MAAM;GACpC,IAAI,WAAW,MAAM,cAAc,GAAG;IAClC,WAAW;IACX,IAAI,CAAC,QAAQ,QACT,QAAQ,KAAK,CAAC;IAElB,MAAM,YAAY,KAAK,IAAI,GAAG,QAAQ,SAAS,CAAC;IAChD,QAAQ,cAAc,QAAQ,cAAc,KAAK,MAAM;GAC3D;EACJ,CAAC;EAGL,MAAM,eAAyB,CAAC;EAChC,IAAI,UACA,aAAa,SAAS,UAAU;GAC5B,IAAI,UAAU,KAAK,SAAS,MAAM;GAClC,aAAa,KAAK,MAAM,OAAO;GAC/B,IAAI,CAAC,SACD,UAAU,KAAK,SAAS,MAAM,WAAW,CAAC;GAE9C,QAAQ,KAAK,MAAM,KAAK;EAC5B,CAAC;EAGL,OAAO;CACX;AACJ;AAOA,MAAM,cAA8B;CAChC,UAAU;EAAC;EAAM;EAAK;EAAK;EAAK;EAAK;EAAI;EAAI;EAAI;EAAI;EAAG;EAAG;EAAG;CAAC;CAC/D,QAAQ;EAAC;EAAK;EAAM;EAAK;EAAM;EAAK;EAAM;EAAK;EAAM;EAAK;EAAM;EAAK;EAAM;CAAG;AAClF;AAEA,MAAM,WAA2B;CAC7B,UAAU;EACN;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAI;EAAI;EAC3G;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CACpD;CACA,QAAQ;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACJ;AACJ;AAEA,MAAM,SAAyB;CAC3B,UAAU;EACN;EAAO;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAK;EAAK;EAAK;EAAK;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAC7G;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CACpD;CACA,QAAQ;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACJ;AACJ;AAEA,MAAM,WAA2B;CAC7B,UAAU;EACN;EAAO;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAC1G;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;CAC5D;CACA,QAAQ;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACJ;AACJ;AAEA,MAAM,yBACF,OACA,KACA,KACA,SACA,UACA,WACC;CACD,IAAI,QAAQ,OAAO,QAAQ,KACvB,OAAO,kBAAkB,OAAO,UAAU,OAAO,SAAS,CAAC;CAG/D,OACI,QAAQ,SAAS,QAAQ,QAAQ,SAAS,UAAU;EAChD,OAAO,SAAS,SAAS;GACrB,SAAS;GACT,UAAU,QAAQ,OAAO;EAC7B;EACA,OAAO;CACX,GAAG,EAAE,IAAI;AAEjB;AAEA,MAAM,wCACF,OACA,sBACA,WACA,aACS;CACT,IAAI,SAAS;CAEb,GAAG;EACC,IAAI,CAAC,WACD;EAEJ,SAAS,SAAS,KAAK,IAAI;EAC3B,SAAS;CACb,SAAS,QAAQ,wBAAwB;CAEzC,OAAO;AACX;AAEA,MAAM,+BACF,OACA,qBACA,mBACA,WACA,WACS;CACT,MAAM,uBAAuB,oBAAoB,sBAAsB;CAEvE,QACK,QAAQ,IAAI,MAAM,OAClB,qCAAqC,KAAK,IAAI,KAAK,GAAG,sBAAsB,YAAY,cACrF,OAAO,cAAc,KAAK,MAAM,YAAY,oBAAoB,IAAI,mBAAmB,CAC3F,IACI;AAEZ;AAEA,MAAM,iCAAiC,OAAe,SAAiB,SAAS,SAAiB;CAC7F,MAAM,uBAAuB,QAAQ;CACrC,OACI,qCACI,KAAK,IAAI,KAAK,GACd,sBACA,QAIC,cAAc,OAAO,QAAQ,KAAK,MAAM,YAAY,oBAAoB,EAAE,CAC/E,IAAI;AAEZ;AAEA,MAAM,YAAY;AAClB,MAAM,uBAAuB;AAC7B,MAAM,4BAA4B;AAClC,MAAM,2BAA2B;AAEjC,MAAM,oBACF,OACA,SACA,aACA,cACA,QACA,UACS;CACT,IAAI,QAAQ,SAAS,QAAQ,MACzB,OAAO,kBAAkB,OAAA,GAAoC,OAAO,SAAS,CAAC;CAElF,IAAI,MAAM,KAAK,IAAI,KAAK;CACxB,IAAI,SAAS;CAEb,IAAI,QAAQ,GACR,OAAO,QAAQ,KAAK;CAGxB,KAAK,IAAI,QAAQ,GAAG,MAAM,KAAK,SAAS,GAAG,SAAS;EAChD,MAAM,cAAc,MAAM;EAE1B,IAAI,gBAAgB,KAAK,SAAS,OAAO,SAAS,KAAK,WAAW,IAC9D,SAAS,QAAQ,eAAe;OAC7B,IACH,cAAc,KACb,gBAAgB,KAAK,UAAU,KAC/B,gBAAgB,KAAK,UAAU,KAAK,SAAS,OAAO,oBAAoB,KACxE,gBAAgB,KAAK,UAAU,KAAK,SAAS,OAAO,yBAAyB,KAAK,QAAQ,OAC1F,gBAAgB,KAAK,QAAQ,KAAK,SAAS,OAAO,wBAAwB,GAE3E,UAAU,QAAQ,gBAAgB,OAAO,QAAQ,IAAK,YAAY,QAAQ,MAAM,KAAM,MAAM;OACzF,IAAI,gBAAgB,KAAK,QAAQ,GACpC,UAAU,YAAY,QAAQ,MAAM,MAAM;EAE9C,MAAM,KAAK,MAAM,MAAM,EAAE;CAC7B;CAEA,QAAQ,QAAQ,IAAI,eAAe,MAAM;AAC7C;AAEA,MAAM,+BAA+B;AACrC,MAAM,6BAA6B;AACnC,MAAM,oBAAoB;AAC1B,MAAM,kBAAkB;AAExB,MAAa,qBAAqB,OAAe,MAAuB,iBAAkC;CACtG,MAAM,gBAAgB,eAAe,OAAO;CAC5C,MAAM,YAAY,eAAe,MAAM;CACvC,MAAM,eAAe,eAAe,OAAO;CAC3C,MAAM,cAAc,eAAe,MAAM;CACzC,QAAQ,MAAR;EACI,KAAA,GACI,OAAO,MAAM;EACjB,KAAA,GACI,OAAO,MAAM;EACjB,KAAA,GACI,OAAO,MAAM;EACjB,KAAA;GACI,MAAM,SAAS,4BAA4B,OAAO,IAAI,IAAI,MAAM,aAAa;GAC7E,OAAO,OAAO,SAAS,IAAI,IAAI,WAAW;EAC9C,KAAA,GACI,OAAO,8BAA8B,OAAO,cAAc,SAAS;EACvE,KAAA,GACI,OAAO,sBACH,OACA,GACA,MACA,aAAA,GAEA,aACJ,CAAC,CAAC,YAAY;EAClB,KAAA,GACI,OAAO,sBAAsB,OAAO,GAAG,MAAM,aAAA,GAAsC,aAAa;EACpG,KAAA,GACI,OAAO,4BAA4B,OAAO,KAAK,KAAK,OAAO,aAAa;EAC5E,KAAA,GACI,OAAO,4BAA4B,OAAO,IAAI,KAAK,OAAO,aAAa;EAC3E,KAAA,IACI,OAAO,4BAA4B,OAAO,IAAI,IAAI,OAAO,aAAa;EAC1E,KAAA,IACI,OAAO,4BAA4B,OAAO,MAAM,MAAM,MAAM,aAAa;EAC7E,KAAA;EACA,KAAA,IACI,OAAO,sBAAsB,OAAO,GAAG,MAAM,UAAA,GAAmC,aAAa;EACjG,KAAA,IACI,OAAO,sBACH,OACA,GACA,MACA,UAAA,GAEA,aACJ,CAAC,CAAC,YAAY;EAClB,KAAA,IACI,OAAO,4BAA4B,OAAO,MAAM,MAAM,MAAM,aAAa;EAC7E,KAAA;EACA,KAAA,IACI,OAAO,4BAA4B,OAAO,MAAM,MAAM,MAAM,aAAa;EAC7E,KAAA,IACI,OAAO,8BAA8B,OAAO,gBAAgB,SAAS;EACzE,KAAA,IACI,OAAO,8BAA8B,OAAO,cAAc,SAAS;EACvE,KAAA;EACA,KAAA,IACI,OAAO,iBACH,OACA,cACA,8BACA,KACA,WACA,EACJ;EACJ,KAAA,IACI,OAAO,iBACH,OACA,cACA,4BACA,KACA,WACA,EACJ;EACJ,KAAA,IACI,OAAO,iBACH,OACA,cACA,8BACA,KACA,WACA,EACJ;EACJ,KAAA,IACI,OAAO,iBACH,OACA,cACA,4BACA,KACA,WACA,EACJ;EACJ,KAAA,IACI,OAAO,iBAAiB,OAAO,cAAc,QAAQ,mBAAmB,WAAW,CAAC;EACxF,KAAA,IACI,OAAO,iBACH,OACA,cACA,QACA,mBACA,WACA,CACJ;EACJ,KAAA,IACI,OAAO,iBACH,OACA,cACA,QACA,iBACA,cACA,CACJ;EACJ,KAAA,IACI,OAAO,iBAAiB,OAAO,cAAc,QAAQ,iBAAiB,cAAc,CAAC;EACzF,KAAA,IACI,OAAO,iBACH,OACA,cACA,OACA,iBACA,cACA,CACJ;EACJ,KAAA,IACI,OAAO,4BAA4B,OAAO,MAAO,MAAO,MAAM,aAAa;EAC/E,KAAA,IACI,OAAO,sBAAsB,OAAO,GAAG,OAAO,UAAA,GAAmC,aAAa;EAClG,KAAA,IACI,OAAO,4BAA4B,OAAO,MAAO,MAAO,MAAM,aAAa;EAC/E,KAAA,IACI,OAAO,4BAA4B,OAAO,MAAO,MAAO,MAAM,aAAa;EAC/E,KAAA,IACI,OAAO,sBAAsB,OAAO,GAAG,OAAO,QAAA,GAAiC,aAAa;EAChG,KAAA,IACI,OAAO,8BACH,OACA,kDACJ;EACJ,KAAA,IACI,OAAO,8BACH,OACA,iDACJ;EACJ,KAAA,IACI,OAAO,4BAA4B,OAAO,MAAO,MAAO,MAAM,aAAa;EAC/E,KAAA,IACI,OAAO,8BACH,OACA,oDACA,SACJ;EACJ,KAAA,IACI,OAAO,8BACH,OACA,mDACA,SACJ;EACJ,KAAA,IACI,OAAO,4BAA4B,OAAO,MAAO,MAAO,MAAM,aAAa;EAC/E,KAAA,IACI,OAAO,4BAA4B,OAAO,MAAQ,MAAQ,MAAM,aAAa;EACjF,KAAA,IACI,OAAO,4BAA4B,OAAO,MAAQ,MAAQ,MAAM,aAAa;EACjF,KAAA,IACI,OAAO,4BAA4B,OAAO,MAAO,MAAO,MAAM,aAAa;EAC/E,KAAA,IACI,OAAO,4BAA4B,OAAO,MAAO,MAAO,MAAM,aAAa;EAC/E,KAAA,IACI,OAAO,4BAA4B,OAAO,MAAO,MAAO,MAAM,aAAa;EAC/E,KAAA,IACI,OAAO,4BAA4B,OAAO,MAAO,MAAO,MAAM,aAAa;EAC/E,KAAA,IACI,OAAO,4BAA4B,OAAO,MAAO,MAAO,MAAM,aAAa;EAC/E,KAAA,IACI,OAAO,4BAA4B,OAAO,MAAO,MAAO,MAAM,aAAa;EAE/E,SACI,OAAO,4BAA4B,OAAO,IAAI,IAAI,MAAM,aAAa;CAC7E;AACJ;;;AC5dA,MAAa,UAA4C;CACrD,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAgC;EACvD,OAAO,OAAO,OAAO,YAAY,CAAC,CAAC,QAAQ,KAAK,UAAU;GACtD,OAAO,MAAMC,oBAAkB,MAAM,KAAK;EAC9C,GAAA,CAAe;CACnB;AACJ;AAEA,MAAMA,uBAAqB,YAA6B;CACpD,QAAQ,SAAR;EACI,KAAK;EACL,KAAK,eACD,OAAA;EACJ,KAAK,UACD,OAAA;EACJ,KAAK,UACD,OAAA;EACJ,KAAK,QACD,OAAA;EACJ,KAAK,aACD,OAAA;EACJ,KAAK,SACD,OAAA;EACJ,KAAK;EACL,KAAK,gBACD,OAAA;EACJ,KAAK;EACL,KAAK,YACD,OAAA;EACJ,KAAK,QACD,OAAA;EACJ,KAAK,WACD,OAAA;EACJ,KAAK,aACD,OAAA;EACJ,KAAK,mBACD,OAAA;EACJ,KAAK,sBACD,OAAA;EACJ,KAAK,sBACD,OAAA;EACJ,KAAK,aACD,OAAA;EACJ,KAAK,cACD,OAAA;EACJ,KAAK,sBACD,OAAA;EACJ,KAAK,gBACD,OAAA;EACJ,KAAK,iBACD,OAAA;EACJ,KAAK,aACD,OAAA;EACJ,KAAK,aACD,OAAA;EACJ,KAAK,uBACD,OAAA;EACJ,KAAK,uBACD,OAAA;EACJ,KAAK,YACD,OAAA;EACJ,KAAK,gBACD,OAAA;EACJ,KAAK,oBACD,OAAA;EACJ,KAAK,gBACD,OAAA;EACJ,KAAK,eACD,OAAA;EACJ,KAAK,eACD,OAAA;CACR;CAEA,OAAA;AACJ;;;AC1GA,MAAa,QAA8C;CACvD,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAAkB;EACzC,QAAQ,OAAR;GACI,KAAK,QACD,OAAA;GACJ,KAAK,SACD,OAAA;GACJ,KAAK,gBACD,OAAA;GACJ,KAAK,cACD,OAAA;EACR;EACA,OAAA;CACJ;AACJ;;;ACjBA,MAAa,WAAgD;CACzD,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAmC;EAC1D,OAAO,OAAO,OAAO,YAAY,CAAC,CAAC,KAAK,aAAa;GACjD,QAAQ,SAAS,OAAjB;IACI,KAAK,UACD,OAAA;IACJ,KAAK,UACD,OAAA;IACJ,KAAK,QACD,OAAA;IACJ,KAAK,QACD,OAAA;IAEJ,SACI,OAAA;GACR;EACJ,CAAC;CACL;AACJ;;;AC/BA,MAAa,sBAAoD;CAC7D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ;AACZ;;;ACMA,MAAa,qBAAkE;CAC3E,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAA2C;EAClE,OAAO,OACF,OAAO,YAAY,CAAC,CACpB,KAAK,UAAU;GACZ,QAAQ,MAAM,OAAd;IACI,KAAK,aACD,OAAA;IACJ,KAAK,YACD,OAAA;IACJ,KAAK,gBACD,OAAA;IACJ,KAAK,QACD,OAAA;GACR;GACA,OAAA;EACJ,CAAC,CAAC,CACD,QAAQ,SAAS,SAAA,CAAkC;CAC5D;AACJ;;;AC9BA,MAAa,UAA4C;CACrD,MAAM;CACN,cAAc;CACd,MAAA;CACA,QAAQ;CACR,QAAQ,UAAmB,WAAuB;EAC9C,IAAI,OAAO,WAAW,GAClB,OAAO,CAAC;EAGZ,MAAM,QAAQ,OAAO;EAErB,IAAI,SAAS,MAAM,SAAA,MAAkC,MAAM,UAAU,QACjE,OAAO,CAAC;EAGZ,OAAO;CACX;AACJ;;;ACZA,MAAa,SAA0C;CACnD,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAuB;EAC9C,IAAI,OAAO,WAAW,GAClB,OAAO;EAGX,MAAM,QAAQ,OAAO;EAErB,IAAI,SAAS,MAAM,SAAA,MAAkC,MAAM,UAAU,QACjE,OAAO;EAGX,MAAM,SAAS,CAAC;EAChB,MAAM,WAAW,OAAO,OAAO,aAAa;EAE5C,IAAI,SAAS,SAAS,MAAM,GACxB,OAAO;EAGX,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,GAAG;GACzC,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC;GAC7B,MAAM,QAAQ,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC;GAClC,OAAO,KAAK;IAAE;IAAM;GAAM,CAAC;EAC/B;EAEA,OAAO;CACX;AACJ;AAEA,MAAa,YAAY,QAAgB,OAAe,SAA0B;CAC9E,IAAI,CAAC,QACD,OAAO;CAGX,MAAM,QAAQ,OAAO,KAAK,IAAI,OAAO,OAAO,SAAS,CAAC;CACtD,IAAI,CAAC,OACD,OAAO;CAGX,OAAO,OAAO,MAAM,OAAO,MAAM;AACrC;;;;AC5CA,MAAa,qBAAqB,QAAoB,kBAA8C;CAChG,MAAM,UAA8B,CAAC;CACrC,MAAM,WAAW,OAAO,OAAO,aAAa;CAE5C,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;EACtC,MAAM,UAAU,SAAS;EACzB,MAAM,OAAO,SAAS,IAAI;EAC1B,IAAI,WAAW,QAAQ,SAAA,IAAgC;GACnD,MAAM,MAAM,QAAQ,cAAc,IAAI,IAAI,KAAK,SAAS;GACxD,QAAQ,KAAK,CAAC,QAAQ,OAAO,GAAG,CAAC;EACrC;CACJ;CAEA,OAAO;AACX;AAEA,MAAa,mBAA8D;CACvE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAuB;EAC9C,IAAI,OAAO,WAAW,GAClB,OAAO;EAGX,MAAM,QAAQ,OAAO;EACrB,IAAI,SAAS,MAAM,SAAA,MAAkC,MAAM,UAAU,QACjE,OAAO;EAGX,OAAO,kBAAkB,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,gBAAgB;GAAE;GAAS;EAAU,EAAE;CAC9F;AACJ;;;AClCA,MAAa,eAAsD;CAC/D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAuB;EAC9C,IAAI,OAAO,WAAW,GAClB,OAAO,CAAC;EAGZ,OAAO,kBAAkB,QAAQ,CAAC,CAAC,CAC9B,QAAQ,CAAC,aAAa,YAAY,MAAM,CAAC,CACzC,KAAK,CAAC,SAAS,YAAY;GAAE;GAAS;EAAM,EAAE;CACvD;AACJ;;;ACdA,MAAa,iBAA0D;CACnE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAuC;EAC9D,OAAO,OAAO,KAAK,UAAU;GACzB,IAAI,aAAa,KAAK,GAClB,QAAQ,MAAM,OAAd;IACI,KAAK,eACD,OAAA;IACJ,KAAK,eACD,OAAA;IACJ,KAAK,QACD,OAAA;GACR;GAEJ,OAAA;EACJ,CAAC;CACL;AACJ;;;AC9BA,MAAa,kBAAgD;CACzD,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ;AACZ;;;ACMA,MAAa,kBAAkB,SAAkB,SAAmD;CAChG,MAAM,QAAQC,QAAU,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC;CAClD,MAAM,OAAO,KAAK;CAClB,OAAO,QAAQ,mBAAmB,IAAI,IAAI;EAAE;EAAO;CAAK,IAAI;EAAE;EAAO,MAAM;CAAK;AACpF;AAEA,MAAa,qBAAqB,OAAuC,eAA4C;CAIjH,MAAM,gBAAgD,MAAM,KAAK,UAAU;EAAE,OAAO,KAAK;EAAO,MAAM,KAAK;CAAK,EAAE;CAClH,MAAM,QAAQ,GAAG,eAAe,CAAC;CACjC,MAAM,OAAO,GAAG,eAAe,cAAc,SAAS,CAAC;CACvD,IAAI,MAAM,SAAS,MACf,MAAM,OAAO;CAGjB,IAAI,KAAK,SAAS,MACd,KAAK,OAAO;CAGhB,MAAM,eAAkC,CAAC;CACzC,IAAI,WAAW;CACf,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;EAC3C,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC;EAClC,IAAI,SAAS,MAAM;GACf,MAAM,gBAAgB,iBAAiB,MAAM,UAAU;GACvD,IAAI,gBAAgB,UAChB,aAAa,KAAK,aAAa;QAE/B,aAAa,KAAK,QAAQ;GAE9B,WAAW;EACf,OACI,aAAa,KAAK,IAAI;CAE9B;CAEA,IAAI,WAAW;CACf,KAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;EAC1C,MAAM,OAAO,GAAG,cAAc,CAAC;EAC/B,IAAI,SAAS,MACL;OAAA,aAAa,MACb,WAAW;EAAA,OAEZ,IAAI,aAAa,MAAM;GAC1B,MAAM,YAAY,IAAI;GAEtB,MAAM,YAAY,OADA,aAAa,WAAW,OACH,YAAY;GACnD,KAAK,IAAI,IAAI,GAAG,KAAK,WAAW,KAC5B,aAAa,WAAW,IAAI,KAAK,WAAW;GAEhD,WAAW;EACf;CACJ;CAEA,OAAO,cAAc,KAAK,EAAE,SAAS,MAAM;EACvC,OAAO;GAAE;GAAO,MAAM,KAAK,IAAI,KAAK,IAAI,GAAI,aAAa,KAAgB,UAAU,GAAG,CAAC;EAAE;CAC7F,CAAC;AACL;AAEA,MAAM,sBAAsB,QAAwB,OAAe,WAA2B;CAC1F,MAAM,UAAU,QAAQ;CACxB,MAAM,UAAU,SAAS;CACzB,MAAM,IAAI,iBAAiB,OAAO,IAAI,KAAK,IAAI;CAC/C,MAAM,IAAI,UAAU,iBAAiB,OAAO,IAAI,MAAM;CAEtD,QAAQ,KAAK,MAAM,GAAG,CAAC,IAAI,KAAK,KAAK,MAAM,KAAK,KAAK;AACzD;AAEA,MAAa,8BACT,OACA,OACA,WAC2C;CAC3C,MAAM,SAAS,OAAO,UAAU,WAAW,QAAQ,mBAAmB,OAAO,OAAO,MAAM;CAE1F,MAAM,aAAa,KAAK,IAAI,QAAQ,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,SAAS,KAAK,IAAI,MAAM,CAAC;CAE1F,MAAM,YAAY,QAAQ;CAC1B,MAAM,aAAa,SAAS;CAC5B,MAAM,iBAAiB,aAAa;CAEpC,MAAM,QAAQ,KAAK,IAAI,SAAS,KAAK,KAAK,CAAC,IAAI;CAC/C,MAAM,QAAQ,KAAK,IAAI,SAAS,KAAK,KAAK,CAAC,IAAI;CAE/C,OAAO;EAAC;EAAY,YAAY;EAAO,YAAY;EAAO,aAAa;EAAO,aAAa;CAAK;AACpG;AAEA,MAAM,YAAY,GAAW,MAAsB,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC;AAE1E,MAAM,cAAc,OAAe,QAAgB,GAAW,GAAW,YAAuC;CAQ5G,OAAO;EANH,CAAC,GAAG,CAAC;EACL,CAAC,GAAG,MAAM;EACV,CAAC,OAAO,CAAC;EACT,CAAC,OAAO,MAAM;CAGL,CAAC,CAAC,QACV,MAAM,WAAW;EACd,MAAM,CAAC,IAAI,MAAM;EACjB,MAAM,IAAI,SAAS,IAAI,IAAI,IAAI,EAAE;EACjC,IAAI,UAAU,IAAI,KAAK,kBAAkB,IAAI,KAAK,iBAC9C,OAAO;GACH,eAAe;GACf,iBAAiB;EACrB;EAGJ,OAAO;CACX,GACA;EACI,iBAAiB,UAAU,WAAW;EACtC,eAAe;CACnB,CACJ,CAAC,CAAC;AACN;AAEA,MAAa,mBACT,UACA,GACA,GACA,OACA,WACmB;CACnB,IAAI,KAAK;CACT,IAAI,KAAK;CAET,QAAQ,SAAS,MAAjB;EACI,KAAA;GAGI,IAAI,SAAS,UAAA,GACT,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,GAAG,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC;QACnF,IAAI,SAAS,UAAA,GAAkC;IAClD,KAAK,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC;IAC9C,KAAK,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC;GACnD;GACA;EAEJ,KAAA;GAGI,IAAI,SAAS,UAAA,GACT,KAAK,KAAK,KAAK,IACX,SAAS,GAAG,CAAC,GACb,SAAS,GAAG,IAAI,MAAM,GACtB,SAAS,IAAI,OAAO,CAAC,GACrB,SAAS,IAAI,OAAO,IAAI,MAAM,CAClC;QACG,IAAI,SAAS,UAAA,GAAkC;IAElD,MAAM,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC;IACjG,MAAM,CAAC,IAAI,MAAM,WAAW,OAAO,QAAQ,GAAG,GAAG,IAAI;IACrD,KAAK,SAAS,KAAK,IAAI,KAAK,KAAK,CAAC;IAClC,KAAK,IAAI;GACb;GACA;EAEJ,KAAA;GAEI,IAAI,SAAS,UAAA,GACT,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,GAAG,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC;QACnF,IAAI,SAAS,UAAA,GAAkC;IAClD,KAAK,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC;IAC9C,KAAK,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC;GACnD;GACA;EAEJ,KAAA,GAGI,IAAI,SAAS,UAAA,GACT,KAAK,KAAK,KAAK,IACX,SAAS,GAAG,CAAC,GACb,SAAS,GAAG,IAAI,MAAM,GACtB,SAAS,IAAI,OAAO,CAAC,GACrB,SAAS,IAAI,OAAO,IAAI,MAAM,CAClC;OACG,IAAI,SAAS,UAAA,GAAkC;GAElD,MAAM,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC;GACjG,MAAM,CAAC,IAAI,MAAM,WAAW,OAAO,QAAQ,GAAG,GAAG,KAAK;GACtD,KAAK,SAAS,KAAK,IAAI,KAAK,KAAK,CAAC;GAClC,KAAK,IAAI;EACb;CAER;CAEA,IAAI,MAAM,QAAQ,SAAS,IAAI,GAAG;EAC9B,MAAM,OAAO,SAAS;EACtB,KAAK,iBAAiB,GAAG,MAAM,CAAC,GAAG,KAAK;EACxC,KAAK,KAAK,WAAW,IAAI,iBAAiB,GAAG,MAAM,CAAC,GAAG,MAAM,IAAI;CACrE;CAEA,OAAO,CAAC,IAAI,EAAE;AAClB;;;AC5MA,MAAa,kBAAkB,SAAkB,WAA+C;CAC5F,IAAIC,UAAiC,IAAI,GAAG;CAC5C,MAAM,QAAwC,CAAC;CAE/C,kBAAkB,MAAM,CAAC,CAAC,SAAS,KAAK,MAAM;EAC1C,IAAI,MAAM,GAAG;GACT,MAAM,aAAa,IAAI;GACvB,IAAI,cAAc,WAAW,SAAA,MAAkC,WAAW,UAAU,MAAM;IACtF,UAAQ,eAAe,GAAG;IAC1B;GACJ,OAAO,IAAI,cAAc,QAAQ,UAAU,GAAG;IAC1C,UAAQC,MAAU,MAAM,SAAS,UAAU;IAC3C;GACJ;EACJ;EACA,MAAM,YAAY,eAAe,SAAS,GAAG;EAC7C,MAAM,KAAK,SAAS;CACxB,CAAC;CAED,OAAO;EAAE,OAAA;EAAO;EAAO,MAAA;CAAmC;AAC9D;;;ACpBA,MAAa,wBAAwB,SAAkB,WAA+C;CAClG,IAAIC,UAAiC,IAAI,GAAG;CAC5C,MAAM,QAAwC,CAAC;CAE/C,kBAAkB,MAAM,CAAC,CAAC,SAAS,KAAK,MAAM;EAC1C,IAAI,MAAM,GAAG;GACT,MAAM,aAAa,IAAI;GACvB,IACI,cACA,WAAW,SAAA,MACX;IAAC;IAAO;IAAQ;IAAS;GAAQ,CAAC,CAAC,QAAQ,WAAW,KAAK,MAAM,IACnE;IACE,UAAQ,eAAe,GAAG;IAC1B;GACJ,OAAO,IAAI,cAAc,QAAQ,UAAU,GAAG;IAC1C,WAASC,MAAU,MAAM,SAAS,UAAU,IAAI,IAAI,GAAG,KAAK,IAAI,GAAG;IACnE;GACJ;EACJ;EACA,MAAM,YAAY,eAAe,SAAS,GAAG;EAC7C,MAAM,KAAK,SAAS;CACxB,CAAC;CAED,OAAO;EACH,OAAA;EACA;EACA,MAAA;CACJ;AACJ;;;AClBA,MAAa,kBACT,SACA,WACkD;CAClD,MAAM,QAAQ,IAAI,GAAG;CACrB,MAAM,QAAwC,CAAC;CAC/C,IAAI,OAAA;CACJ,MAAM,QAAA;CACN,MAAM,OAAA;CACN,MAAM,WAA+B,CAAC;CACtC,kBAAkB,MAAM,CAAC,CAAC,SAAS,KAAK,MAAM;EAC1C,MAAM,aAAa,IAAI;EACvB,IAAI,CAAC,YACD;EAEJ,IAAI,MAAM,GAAG;GACT,IAAI,aAAa,UAAU,KAAK,WAAW,UAAU,UAAU;IAC3D,OAAA;IACA;GACJ,OAAO,IAAI,aAAa,UAAU,KAAK,WAAW,UAAU,UAAU;IAClE,OAAA;IACA;GACJ;EACJ;EAEA,IAAI,WAAW,SAAA,IAA6B;GACxC,IAAI,WAAW,SAAS,QAAQ;IAC5B,MAAM,QAAQC,QAAU,MAAM,SAAS,GAAG,WAAW,QAAQ,CAAC,CAAC;IAC/D,MAAM,KAAK;KAAE,MAAM;KAAa;IAAM,CAAC;GAC3C,OAAO,IAAI,WAAW,SAAS,MAAM;IACjC,MAAM,QAAQA,QAAU,MAAM,SAAS,GAAG,WAAW,QAAQ,CAAC,CAAC;IAC/D,MAAM,KAAK;KAAE,MAAM;KAAiB;IAAM,CAAC;GAC/C,OAAO,IAAI,WAAW,SAAS,cAAc;IACzC,MAAM,SAAS,WAAW,OAAO,OAAO,uBAAuB;IAC/D,IAAI,OAAO,WAAW,GAAG;KACrB,MAAM,QAAQA,QAAU,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC;KACpD,MAAM,OAAO,GAAG,QAAQ,CAAC;KACzB,IAAI,cAAc,IAAI,GAClB,MAAM,KAAK;MACP,MAAM;OAAE,MAAA;OAAkC,QAAQ,KAAK,SAAS;OAAK,OAAO,KAAK;MAAM;MACvF;KACJ,CAAC;IAET;GACJ;EACJ;CACJ,CAAC;CAED,OAAO,SAAA,IACD;EACI,QAAQ,QAAQ,IAAI,GAAG,KAAK,IAAI,GAAG;EACnC;EACA;CACJ,IACA;EAAE;EAAM;EAAO;EAAO;EAAU;CAAK;AAC/C;;;ACrDA,MAAa,eAAe;AAC5B,MAAa,gBAAgB;AAC7B,MAAa,iBAAiB;AAC9B,MAAa,kBAAkB;AAC/B,MAAa,SAAS;AACtB,MAAa,UAAU;AACvB,MAAa,QAAQ;AACrB,MAAa,UAAU;AAEvB,MAAa,kBAAkB,SAAkB,WAA+C;CAC5F,IAAI,QAAA;CACJ,IAAI,OAAA;CACJ,MAAM,QAAwC,CAAC;CAC/C,MAAM,WAA+B,CAAC;CACtC,kBAAkB,MAAM,CAAC,CAAC,SAAS,KAAK,MAAM;EAC1C,IAAI,cAAc;EAClB,IAAI,MAAM,GAAG;GACT,IAAI,eAAe;GACnB,cAAc,IAAI,QAAQ,KAAK,UAAU;IACrC,IAAI,cAAc;KACd,IAAI,aAAa,KAAK,GAClB,QAAQ,MAAM,OAAd;MACI,KAAK;OACD,SAAS,KAAK,aAAa;OAC3B,OAAO;MACX,KAAK;MACL,KAAK;OACD,SAAS,KAAK,WAAW;OACzB,OAAO;MACX,KAAK;MACL,KAAK;OACD,SAAS,KAAK,eAAe;OAC7B,OAAO;KACf;UACG,IAAI,mBAAmB,KAAK,KAAK,SAAS,KAAK,GAClD,SAAS,KAAK,KAAK;IAE3B,OAAO,IAAI,aAAa,KAAK,GACzB,QAAQ,MAAM,OAAd;KACI,KAAK;MACD,QAAA;MACA,OAAO;KACX,KAAK;MACD,QAAA;MACA,OAAO;KACX,KAAK;MACD,eAAe;MACf,OAAO;KACX,KAAK;MACD,OAAA;MACA,OAAO;KACX,KAAK;KACL,KAAK;MACD,OAAA;MACA,OAAO;KACX,KAAK;KACL,KAAK;MACD,OAAA;MACA,OAAO;KACX,KAAK;MACD,OAAA;MACA,OAAO;IACf;SACG,IAAI,SAAS,KAAK,KAAK,mBAAmB,KAAK,GAAG;KACrD,IAAI,CAAC,MAAM,QAAQ,IAAI,GACnB,OAAO,CAAC;KAEZ,KAAK,KAAK,KAAK;KACf,OAAO;IACX;IACA,OAAO;GACX,GAAG,WAAW;EAClB;EAEA,IAAI,aAAa;GACb,MAAM,YAAY,eAAe,SAAS,GAAG;GAC7C,MAAM,KAAK,SAAS;EACxB;CACJ,CAAC;CAED,OAAO;EAAE;EAAM;EAAO;EAAO;EAAU,MAAA;CAAmC;AAC9E;;;ACtEA,MAAa,wBAAwB,SAAkB,WAA+C;CAClG,IAAI,QAAA;CACJ,IAAI,OAAA;CACJ,MAAM,QAAwC,CAAC;CAC/C,MAAM,WAA+B,CAAC;CAEtC,kBAAkB,MAAM,CAAC,CAAC,SAAS,KAAK,MAAM;EAC1C,IAAI,cAAc;EAClB,IAAI,MAAM,GACN,cAAc,IAAI,QAAQ,KAAK,UAAU;GACrC,IAAI,aAAa,KAAK,GAClB,QAAQ,MAAM,OAAd;IACI,KAAK;KACD,SAAS,KAAK,aAAa;KAC3B,OAAO;IACX,KAAK;IACL,KAAK;KACD,SAAS,KAAK,WAAW;KACzB,OAAO;IACX,KAAK;IACL,KAAK;KACD,SAAS,KAAK,eAAe;KAC7B,OAAO;GACf;QACG,IAAI,mBAAmB,KAAK,KAAK,SAAS,KAAK,GAAG;IACrD,SAAS,KAAK,KAAK;IACnB,OAAO;GACX;GAEA,OAAO;EACX,GAAG,WAAW;OACX,IAAI,MAAM,GACb,cAAc,IAAI,QAAQ,KAAK,UAAU;GACrC,IAAI,aAAa,KAAK,GAClB,QAAQ,MAAM,OAAd;IACI,KAAK;KACD,QAAA;KACA,OAAO;IACX,KAAK;KACD,QAAA;KACA,OAAO;IACX,KAAK;IACL,KAAK;KACD,OAAA;KACA,OAAO;IACX,KAAK;KACD,OAAA;KACA,OAAO;IACX,KAAK;KACD,OAAA;KACA,OAAO;IACX,KAAK;IACL,KAAK;KACD,OAAA;KACA,OAAO;GACf;QACG,IAAI,SAAS,KAAK,KAAK,mBAAmB,KAAK,GAAG;IACrD,IAAI,CAAC,MAAM,QAAQ,IAAI,GACnB,OAAO,CAAC;IAEZ,KAAK,KAAK,KAAK;IACf,OAAO;GACX;GAEA,OAAO;EACX,GAAG,WAAW;EAGlB,IAAI,aAAa;GACb,MAAM,YAAY,eAAe,SAAS,GAAG;GAC7C,MAAM,KAAK,SAAS;EACxB;CACJ,CAAC;CAED,OAAO;EAAE;EAAM;EAAO;EAAO;EAAU,MAAA;CAAmC;AAC9E;;;ACpGA,MAAa,2BAA2B,SAAkB,WAA+C;CAErG,OAAO;EAAE,GADQ,eAAe,SAAS,MACtB;EAAG,MAAA;CAA6C;AACvE;;;;;;;ACCA,MAAa,2BAA2B,SAAkB,WAA+C;CAErG,OAAO;EACH,GAFa,eAAe,SAAS,MAE3B;EACV,MAAA;CACJ;AACJ;;;;;;;;;;ACKA,MAAa,iBAAiB,SAAkB,WAA8C;CAC1F,IAAI,YAAY;CAChB,MAAM,WAA+B,CAAC;CACtC,MAAM,QAAwC,CAAC;CAG/C,kBAD+B,MAC5B,CAAC,CAAC,SAAS,KAAK,MAAM;EACrB,IAAI,cAAc;EAClB,IAAI,MAAM,GAAG;GACT,IAAI,YAAY;GAChB,IAAI,UAAU;GAId,cAAc,IAAI,QAAQ,KAAK,UAAU;IACrC,IAAI,aAAa,KAAK,GAClB,QAAQ,MAAM,OAAd;KACI,KAAK;MACD,YAAY;MACZ,UAAU;MACV,OAAO;KACX,KAAK;MACD,YAAY;MACZ,UAAU;MACV,OAAO;KACX,KAAK;MACD,SAAS,KAAK,aAAa;MAC3B,OAAO;KACX,KAAK;KACL,KAAK;MACD,SAAS,KAAK,WAAW;MACzB,OAAO;KACX,KAAK;KACL,KAAK;MACD,SAAS,KAAK,eAAe;MAC7B,OAAO;IACf;IAEJ,IAAI,WAAW;KACX,YAAY,MAAM,MAAM,SAAS,KAAK;KACtC,OAAO;IACX;IACA,IAAI,WAAW,mBAAmB,KAAK,GAAG;KACtC,SAAS,KAAK,KAAK;KACnB,OAAO;IACX;IACA,OAAO;GACX,GAAG,IAAI;EACX;EACA,IAAI,eAAe,IAAI,SAAS,GAC5B,MAAM,KAAK,eAAe,SAAS,GAAG,CAAC;CAE/C,CAAC;CAED,OAAO;EACH,MAAA;EACA,OAAO;EACP;EACA;CACJ;AACJ;;;;;;AAOA,MAAa,0BAA0B,SAAkB,WAA8C;CAEnG,OAAO;EACH,GAFa,cAAc,SAAS,MAE1B;EACV,MAAA;CACJ;AACJ;;;AClFA,MAAM,mBAAmB,UAAwC;CAC7D,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI,iBAAiB,KAAK,GAGlB;MAAA,MAAM,SAAS,UAAU,MAAM,SAAS,KAAK,OAAO,MAAM;CAAA;CAElE,IAAI,cAAc,KAAK,GACnB,OAAO,MAAM;CAEjB,OAAO;AACX;;;;;;;;AASA,MAAa,YAAY,SAAkB,WAAkC;CACzE,MAAM,OAAO,kBAAkB,MAAM;CACrC,MAAM,MAAM,QAAQ,OAAO,OAAO,oBAAoB;CAEtD,MAAM,aAAkC,CAAC;CACzC,KAAK,MAAM,OAAO,MAAM;EACpB,MAAM,aAAa,IAAI,MAAM,MAAM,EAAE,SAAA,MAAgC,EAAE,SAAA,EAA2B;EAClG,IAAI,CAAC,YAAY;EACjB,MAAM,kBAAkB,IAAI,MAAM,MAAM,iBAAiB,CAAC,KAAK,cAAc,CAAC,CAAC;EAC/E,WAAW,KAAK;GAAE;GAAY,YAAY,gBAAgB,eAAe;EAAE,CAAC;CAChF;CACA,IAAI,WAAW,WAAW,GACtB,MAAM,IAAI,MAAM,mDAAmD;CAGvE,MAAM,aAAa,WACd,QAAQ,cAAc,UAAU,cAAc,GAAG,CAAC,CAClD,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;CAE/C,MAAM,SAAS,GACX,WAAW,SAAS,IAAI,aAAa,WAAW,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU,GAClG,CACJ;CAEA,OAAO,MAAM,MAAM,SAAS,OAAO,UAAU;AACjD;;;AC9BA,MAAa,oBAAoB,eAAgE;CAC7F,OAAO,WAAW,SAAA;AACtB;AAEA,MAAa,oBAAoB,eAAgE;CAC7F,OAAO,WAAW,SAAA;AACtB;AAEA,MAAa,6BAA6B,eAAgE;CACtG,OAAO,WAAW,SAAA;AACtB;AAEA,MAAa,6BAA6B,eAAgE;CACtG,OAAO,WAAW,SAAA;AACtB;AAEA,MAAa,mBAAmB,eAA+D;CAC3F,OAAO,WAAW,SAAA;AACtB;AAEA,MAAa,4BAA4B,eAA+D;CACpG,OAAO,WAAW,SAAA;AACtB;AAiEA,MAAa,QAAoC;CAC7C,MAAM;CACN,QAAQ,SAAkB,UAA+B;EACrD,IAAI,MAAM,SAAA,IAA8B;GACpC,MAAM,QAAqB;IAAE,KAAK,MAAM;IAAO,MAAA;GAAuB;GACtE,QAAQ,MAAM,SAAS,MAAM,KAAK;GAClC,OAAO;EACX;EAEA,IAAI,MAAM,SAAA,IAA6B;GACnC,MAAM,gBAAgB,0BAA0B,MAAM;GACtD,IAAI,OAAO,kBAAkB,aACzB,MAAM,IAAI,MAAM,sDAAsD,MAAM,KAAK,EAAE;GAEvF,OAAO,cAAc,SAAS,MAAM,MAAM;EAC9C;EAEA,MAAM,IAAI,MAAM,0BAA0B,MAAM,MAAM;CAC1D;AACJ;AAEA,SAAgB,iBAAiB,OAA0B;CACvD,OACI,EAAE,MAAM,SAAA,MAAkC,MAAM,UAAU,YACzD,MAAM,SAAA,MAA+B,CAAC,CAAC,0BAA0B,MAAM;AAEhF;AAEA,MAAM,4BAA+F;CACjG,mBAAmB;CACnB,wBAAwB;CACxB,uBAAuB;CACvB,sBAAsB;CACtB,2BAA2B;CAC3B,mBAAmB;CACnB,wBAAwB;CACxB,uBAAuB;CACvB,sBAAsB;CACtB,2BAA2B;CAC3B,oBAAoB;CACpB,6BAA6B;CAC7B,qCAAqC;CACrC,kCAAkC;CAClC,iCAAiC;CACjC,gCAAgC;CAChC,6BAA6B;CAC7B,qCAAqC;CACrC,kCAAkC;CAClC,kBAAkB;CAClB,0BAA0B;CAC1B,uBAAuB;CACvB,4BAA4B;CAC5B,oCAAoC;CACpC,iCAAiC;CACjC,aAAa;CACb,qBAAqB;AACzB;;;ACnKA,MAAa,kBAAwD;CACjE,MAAM;CACN,cAAc;CACd,MAAA;CACA,QAAQ;CACR,WAAW;CACX,QAAQ,SAAkB,WAAuB;EAC7C,IAAI,OAAO,WAAW,GAClB,OAAO,CAAC;EAGZ,MAAM,QAAQ,OAAO;EAErB,IAAI,SAAS,MAAM,SAAA,MAAkC,MAAM,UAAU,QACjE,OAAO,CAAC;EAGZ,OAAO,OACF,QAAQ,UAAU,wBAAwB,KAAK,KAAK,iBAAiB,KAAK,CAAC,CAAC,CAC5E,KAAK,UAAU,MAAM,MAAM,SAAS,KAAK,CAAC;CACnD;AACJ;;;ACfA,MAAa,mBAA8D;CACvE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAyC;EAChE,OAAO,OAAO,KAAK,UAAU;GACzB,IAAI,aAAa,KAAK,GAClB,QAAQ,MAAM,OAAd;IACI,KAAK,eACD,OAAA;IACJ,KAAK,eACD,OAAA;GACR;GAEJ,OAAA;EACJ,CAAC;CACL;AACJ;;;AClBA,MAAa,qBAAkE;CAC3E,MAAM;CACN,cAAc;CACd,MAAA;CACA,QAAQ;CACR,QAAQ,UAAmB,WAA2C;EAClE,OAAO,kBAAkB,MAAM,CAAC,CAC3B,KAAK,WAAuB;GAEzB,OAAO,OAAO,IAAI,yBAAyB,CAAC,CAAC,QAAQ,MAAkC,MAAM,IAAI;EACrG,CAAC,CAAC,CACD,IAAI,0BAA0B;CACvC;AACJ;;;ACbA,MAAa,mBAA8D;CACvE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAyC;EAChE,OAAO,kBAAkB,MAAM,CAAC,CAC3B,KAAK,WACF,OACK,OAAO,YAAY,CAAC,CACpB,KAAK,UAAU,MAAM,KAAK,CAAC,CAC3B,KAAK,GAAG,CACjB,CAAC,CACA,IAAI,qBAAqB;CAClC;AACJ;AAEA,MAAM,yBAAyB,UAAqC;CAChE,QAAQ,OAAR;EACI,KAAK,aACD,OAAA;EACJ,KAAK;EACL,KAAK,oBACD,OAAA;EACJ,KAAK;EACL,KAAK,oBACD,OAAA;EAEJ,SACI,OAAA;CACR;AACJ;;;AC5BA,MAAa,iBAA0D;CACnE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAuC;EAC9D,OAAO,kBAAkB,MAAM,CAAC,CAAC,KAAK,WAClC,OACK,KAAK,UAAW,0BAA0B,KAAK,IAAI,QAAQ,0BAA0B,KAAK,CAAE,CAAC,CAC7F,QAAQ,MAAkC,MAAM,IAAI,CAC7D;CACJ;AACJ;AAEA,MAAM,6BAA6B,UAC/B,aAAa,KAAK,KAAK,mBAAmB,KAAK;;;AC7BnD,MAAM,sBAAsB,UAAgD;CACxE,MAAM,UAAU,KAAK;CACrB,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ;AACZ;AAEA,MAAa,iBAA+C,mBAAmB,KAAK;AACpF,MAAa,mBAAiD,mBAAmB,OAAO;AACxF,MAAa,oBAAkD,mBAAmB,QAAQ;AAC1F,MAAa,kBAAgD,mBAAmB,MAAM;;;ACNtF,MAAM,uBAAuB,UAAyD;CAClF,MAAM,UAAU,KAAK;CACrB,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WACvB,2BAA2B,OAAO,OAAO,kBAAkB,CAAC;AACpE;AAEA,MAAa,sBAA6D,oBAAoB,UAAU;AACxG,MAAa,uBAA8D,oBAAoB,WAAW;AAC1G,MAAa,0BAAiE,oBAAoB,cAAc;AAChH,MAAa,yBAAgE,oBAAoB,aAAa;;;ACR9G,MAAM,sBAAsB,UAA+D;CACvF,MAAM,UAAU,KAAK;CACrB,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAAgC;EACvD,QAAQ,OAAR;GACI,KAAK,QACD,OAAA;GACJ,KAAK,UACD,OAAA;GACJ,KAAK,UACD,OAAA;GACJ,KAAK,UACD,OAAA;EACR;EACA,OAAA;CACJ;AACJ;AAEA,MAAa,iBAA8D,mBAAmB,KAAK;AACnG,MAAa,mBAAgE,mBAAmB,OAAO;AACvG,MAAa,oBAAiE,mBAAmB,QAAQ;AACzG,MAAa,kBAA+D,mBAAmB,MAAM;;;AC9BrG,MAAM,sBAAsB,UAAoD;CAC5E,MAAM,UAAU,KAAK;CACrB,cAAc;CACd,MAAA;CACA,QAAQ;CACR,QAAQ,UAAmB,UAA4B;EACnD,IAAI,iBAAiB,KAAK,GACtB,OAAO,MAAM;EAEjB,OAAO;CACX;AACJ;AAEA,MAAa,iBAAmD,mBAAmB,KAAK;AACxF,MAAa,mBAAqD,mBAAmB,OAAO;AAC5F,MAAa,oBAAsD,mBAAmB,QAAQ;AAC9F,MAAa,kBAAoD,mBAAmB,MAAM;;;AC8E1F,MAAM,OAAqB,EAAE,MAAA,EAA0B;;;;;AAMvD,MAAM,oBAAoB,WAAoC;CAC1D,MAAM,CAAC,SAAS;CAChB,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI,aAAa,KAAK,GAIlB,OAAO,MAAM,UAAU,kBAAkB,kBAAkB;CAE/D,OAAO,mBAAmB,KAAK,IAAI,QAAQ;AAC/C;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,iBAAiB,WAAuE;CAC1F,IAAI,KAA8B;CAClC,IAAI,KAA8B;CAElC,KAAK,MAAM,SAAS,QAChB,IAAI,aAAa,KAAK,GAClB,QAAQ,MAAM,OAAd;EACI,KAAK;GACD,KAAK;GACL;EACJ,KAAK;GACD,KAAK;GACL;EACJ,KAAK;GACD,KAAK;GACL;EACJ,KAAK;GACD,KAAK;GACL;EACJ,KAAK,UAED,IAAI,OAAO,MAAM,KAAK;OACjB,IAAI,OAAO,MAAM,KAAK;CAEnC;MACG,IAAI,mBAAmB,KAAK,GAAG;EAElC,IAAI,OAAO,MAAM,KAAK;OACjB,IAAI,OAAO,MAAM,KAAK;CAC/B;CAGJ,OAAO;EAAE,IAAI,MAAM;EAAe,IAAI,MAAM;CAAc;AAC9D;;;;;;;;;;AAWA,MAAM,cAAc,WAAsC;CACtD,MAAM,UAA8B,CAAC;CACrC,KAAK,MAAM,SAAS,QAAQ;EACxB,IAAI,MAAM,SAAA,IAAqC;EAC/C,IAAI,aAAa,KAAK,KAAK,MAAM,UAAU,SAAS;EACpD,IAAI,mBAAmB,KAAK,GAAG,QAAQ,KAAK,KAAK;CACrD;CACA,MAAM,KAAK,QAAQ,MAAM;CACzB,MAAM,KAAK,QAAQ,MAAM;CAGzB,OAAO;EAAE,MAAA;EAA4B,KAAK;EAAI,OAAO;EAAI,QAF9C,QAAQ,MAAM;EAE4C,MAD1D,QAAQ,MAAM;CACqD;AAClF;;;;AAKA,MAAM,eAAe,WAAuC;CACxD,MAAM,QAAQ,OAAO,OAAO,aAAa;CACzC,MAAM,QAAQ,MAAM,WAAW,MAAM,iBAAiB,GAAG,IAAI,CAAC;CAC9D,MAAM,eAAe,UAAU,KAAK,QAAQ,MAAM,MAAM,GAAG,KAAK;CAChE,MAAM,YAAY,UAAU,KAAK,CAAC,IAAI,MAAM,MAAM,QAAQ,CAAC;CAC3D,OAAO;EACH,MAAA;EACA,QAAQ,iBAAiB,YAAY;EACrC,GAAG,cAAc,SAAS;CAC9B;AACJ;;;;AAKA,MAAM,gBAAgB,WAAwC;CAC1D,MAAM,QAAQ,OAAO,OAAO,aAAa;CACzC,MAAM,QAAQ,MAAM,WAAW,MAAM,iBAAiB,GAAG,IAAI,CAAC;CAC9D,MAAM,eAAe,UAAU,KAAK,QAAQ,MAAM,MAAM,GAAG,KAAK;CAChE,MAAM,YAAY,UAAU,KAAK,CAAC,IAAI,MAAM,MAAM,QAAQ,CAAC;CAC3D,OAAO;EACH,MAAA;EACA,IAAI,iBAAiB,aAAa,MAAM,GAAG,CAAC,CAAC;EAC7C,IAAI,iBAAiB,aAAa,MAAM,GAAG,CAAC,CAAC;EAC7C,GAAG,cAAc,SAAS;CAC9B;AACJ;;;;;;AAOA,MAAM,gBAAgB,WAAwC;CAC1D,MAAM,OAAO,kBAAkB,MAAM;CACrC,MAAM,SAAiD,CAAC;CACxD,KAAK,MAAM,OAAO,MAAM;EACpB,IAAI,IAAI,WAAW,KAAK,IAAI,MAAM,aAAa,IAAI,EAAE,GAAG;EACxD,MAAM,UAAU,IAAI,OAAO,kBAAkB;EAC7C,IAAI,QAAQ,UAAU,GAClB,OAAO,KAAK,CAAC,GAAG,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC;CAEpD;CACA,OAAO;EAAE,MAAA;EAA8B;CAAO;AAClD;;;;;AAMA,MAAM,aAAa,WAAoD;CACnE,MAAM,cAAc,OAAO,MAAM,MAAM,EAAE,SAAA,CAA+B;CACxE,IAAI,CAAC,aAAa,OAAO;CACzB,OAAO;EAAE,MAAA;EAA2B,GAAG,YAAY;CAAM;AAC7D;;;;;;AAOA,MAAM,aAAa,WAAoD;CACnE,MAAM,UAA8B,CAAC;CACrC,KAAK,MAAM,SAAS,QAAQ;EACxB,IAAI,MAAM,SAAA,IAAqC;EAC/C,IAAI,aAAa,KAAK,KAAK,MAAM,UAAU,SAAS;EACpD,IAAI,mBAAmB,KAAK,GAAG,QAAQ,KAAK,KAAK;CACrD;CACA,IAAI,QAAQ,SAAS,GAAG,OAAO;CAC/B,OAAO;EACH,MAAA;EACA,GAAG,GAAG,SAAS,CAAC;EAChB,GAAG,GAAG,SAAS,CAAC;EAChB,OAAO,GAAG,SAAS,CAAC;EACpB,QAAQ,GAAG,SAAS,CAAC;CACzB;AACJ;;;;;;;;AASA,MAAM,aAAa,WAAqD;CACpE,MAAM,UAAyC,CAAC;CAChD,KAAK,MAAM,SAAS,QAAQ;EACxB,IAAI,MAAM,SAAA,IAAqC;EAC/C,IAAI,aAAa,KAAK,GAAG;GACrB,IAAI,MAAM,UAAU,SAAS;GAC7B,IAAI,MAAM,UAAU,QAAQ;IACxB,QAAQ,KAAK,MAAM;IACnB;GACJ;GACA,OAAO;EACX;EACA,IAAI,mBAAmB,KAAK,GAAG,QAAQ,KAAK,KAAK;CACrD;CACA,IAAI,QAAQ,WAAW,GAAG,OAAO;CAGjC,MAAM,WAAW,OAAkC,SAAgE;EAC/G,IAAI,UAAU,QAAQ,OAAO;EAC7B,OAAO,SAAS,SAAS,SAAS,SAAS,cAAc;CAC7D;CACA,OAAO;EACH,MAAA;EACA,KAAK,QAAQ,GAAG,SAAS,CAAC,GAAG,KAAK;EAClC,OAAO,QAAQ,GAAG,SAAS,CAAC,GAAG,OAAO;EACtC,QAAQ,QAAQ,GAAG,SAAS,CAAC,GAAG,QAAQ;EACxC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,MAAM;CACxC;AACJ;AAEA,MAAa,WAAoD;CAC7D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAAmC;EAC1D,IAAI,aAAa,KAAK,KAAK,MAAM,UAAU,QACvC,OAAO;EAGX,IAAI,MAAM,SAAA,IACN,QAAQ,MAAM,MAAd;GACI,KAAK,SACD,OAAO,WAAW,MAAM,MAAM;GAClC,KAAK,UACD,OAAO,YAAY,MAAM,MAAM;GACnC,KAAK,WACD,OAAO,aAAa,MAAM,MAAM;GACpC,KAAK,WACD,OAAO,aAAa,MAAM,MAAM;GACpC,KAAK,QACD,OAAO,UAAU,MAAM,MAAM;GACjC,KAAK,QACD,OAAO,UAAU,MAAM,MAAM;GACjC,KAAK,QACD,OAAO,UAAU,MAAM,MAAM;EACrC;EAGJ,OAAO;CACX;AACJ;;;ACtVA,MAAa,QAAsC;CAC/C,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ;AACZ;;;ACAA,MAAa,YAAsD;CAC/D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,cAAsB;EAC7C,QAAQ,WAAR;GACI,KAAK,OACD,OAAA;GAEJ,SACI,OAAA;EACR;CACJ;AACJ;;;ACbA,MAAa,aAAkD;CAC3D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAuB;EAC9C,MAAM,cAAwB,CAAC;EAC/B,MAAM,UAAoB,CAAC;EAC3B,MAAM,SAAoB,CAAC;EAC3B,IAAI,WAAW;EACf,OAAO,SAAS,UAAU;GACtB,QAAQ,MAAM,MAAd;IACI,KAAA;KACI,YAAY,KAAK,MAAM,KAAK;KAC5B;IACJ,KAAA;KACI,WAAW;KACX,YAAY,KAAK,MAAM,KAAK;KAC5B;IACJ,KAAA;KACI,YAAY,KAAK,MAAM,OAAO,SAAS,CAAC;KACxC;IACJ,KAAA;KACI,QAAQ,KAAK,YAAY,KAAK,GAAG,CAAC;KAClC,OAAO,KAAK,QAAQ;KACpB,WAAW;KACX,YAAY,SAAS;GAE7B;EACJ,CAAC;EACD,IAAI,YAAY,QAAQ;GACpB,QAAQ,KAAK,YAAY,KAAK,GAAG,CAAC;GAClC,OAAO,KAAK,QAAQ;EACxB;EACA,OAAO,QAAQ,KAAK,QAAQ,UACxB,OAAO,UAAU,OAAO,QAAQ,GAAG,MAAM,KACnC,IAAI,OACC,QAAQ,OAAO,MAAM,CAAC,CACtB,QAAQ,MAAM,KAAK,CAAC,CACpB,QAAQ,OAAO,MAAM,CAAC,CACtB,QAAQ,OAAO,MAAM,CAAC,CACtB,QAAQ,OAAO,MAAM,EAAE,KAC5B,MACV;CACJ;AACJ;;;ACpDA,MAAa,WAAyC;CAClD,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ;AACZ;;;ACJA,MAAa,gBAAkD;CAC3D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAAoB;EAC3C,IAAI,MAAM,SAAA,MAAkC,MAAM,UAAU,UACxD,OAAO;EAGX,IAAI,MAAM,SAAA,IACN,OAAO,MAAM;EAGjB,IAAI,MAAM,SAAA,IACN,OAAO,MAAM;EAGjB,OAAO;CACX;AACJ;;;ACjBA,MAAa,YAAuD;CAChE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,cAAkC;EACzD,QAAQ,WAAR;GACI,KAAK,UACD,OAAA;GAEJ,SACI,OAAA;EACR;CACJ;AACJ;;;ACjBA,MAAa,aAA4C;CACrD,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;AACJ;AAEA,MAAa,qBAAqB,OAAiB,aAA6B;CAC5E,IAAI,aAAa,KAAK,KAAK,MAAM,UAAU,UACvC,OAAO,MAAM;MACV,IAAI,MAAM,SAAA,IACb,OAAO,WAAW,MAAM;MACrB,IAAI,mBAAmB,KAAK,GAC/B,OAAO,iBAAiB,OAAO,QAAQ;CAG3C,OAAO;AACX;;;ACfA,MAAa,iBAA6D;CACtE,MAAM;CACN,cAAc;CACd,MAAA;CACA,QAAQ;CACR,WAAW;CACX,QAAQ,SAAkB,UAAoB;EAC1C,IAAI,MAAM,SAAA,MAAkC,MAAM,UAAU,QACxD,OAAO;EAMX,IAAI,CAAC,iBAAiB,KAAK,GACvB,OAAO;EAGX,OAAO,MAAM,MAAM,SAAS,KAAK;CACrC;AACJ;;;ACnBA,MAAa,oBAAwE;CACjF,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,aAAqB;EAC5C,QAAQ,UAAR;GACI,KAAK,UACD,OAAA;GAEJ,SACI,OAAA;EACR;CACJ;AACJ;;;ACnBA,MAAM,iBAAiB,UAAiD;CACpE,MAAM,UAAU;CAChB,cAAc;CACd,QAAQ;CACR,MAAA;AACJ;AAEA,MAAa,YAA2C,cAAc,KAAK;AAC3E,MAAa,cAA6C,cAAc,OAAO;AAC/E,MAAa,eAA8C,cAAc,QAAQ;AACjF,MAAa,aAA4C,cAAc,MAAM;;;ACL7E,MAAa,eAA6D;CACtE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,aAAqB;EAC5C,QAAQ,UAAR;GACI,KAAK,cACD,OAAA;GAEJ,SACI,OAAA;EACR;CACJ;AACJ;;;ACnBA,MAAM,kBAAkB,UAAgD;CACpE,MAAM,WAAW;CACjB,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ;AACZ;AAEA,MAAa,aAA2C,eAAe,KAAK;AAC5E,MAAa,eAA6C,eAAe,OAAO;AAChF,MAAa,gBAA8C,eAAe,QAAQ;AAClF,MAAa,cAA4C,eAAe,MAAM;;;ACL9E,MAAa,YAAuD;CAChE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,cAAsB;EAC7C,QAAQ,WAAR;GACI,KAAK,SACD,OAAA;GACJ,KAAK;GACL,KAAK,WACD,OAAA;GAEJ,SACI,OAAA;EACR;CACJ;AACJ;;;ACfA,MAAa,WAAoD;CAC7D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,aAAqB;EAC5C,QAAQ,UAAR;GACI,KAAK,YACD,OAAA;GACJ,KAAK,YACD,OAAA;GACJ,KAAK,SACD,OAAA;GACJ,KAAK,UACD,OAAA;EACR;EAEA,OAAA;CACJ;AACJ;;;ACbA,MAAa,aAAkD;CAC3D,MAAM;CACN,cAAc;CACd,MAAA;CACA,QAAQ;CACR,QAAQ,SAAkB,WAAmC;EACzD,IAAI,OAAO,WAAW,KAAK,iBAAiB,GAAG,QAAQ,CAAC,GAAG,MAAM,GAC7D,OAAO,CAAC;EAGZ,OAAO,kBAAkB,MAAM,CAAC,CAAC,KAAK,WAAuB;GACzD,MAAM,SAAyB;IAC3B,OAAA;IACA,SAAS;IACT,SAAS;IACT,MAAM;GACV;GACA,IAAI,IAAI;GACR,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;IACpC,MAAM,QAAQ,OAAO;IACrB,IAAI,CAAC,OAAO;IACZ,IAAI,SAAS,KAAK,GAAG;KACjB,IAAI,MAAM,GACN,OAAO,UAAU;UACd,IAAI,MAAM,GACb,OAAO,UAAU;UAEjB,OAAO,OAAO;KAElB;IACJ,OACI,OAAO,QAAQC,QAAU,MAAM,SAAS,KAAK;GAErD;GACA,OAAO;EACX,CAAC;CACL;AACJ;;;AC5CA,MAAa,gBAA+D;CACxE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,kBAA0B;EACjD,QAAQ,eAAR;GACI,KAAK,aACD,OAAA;GACJ,KAAK,aACD,OAAA;GACJ,KAAK,cACD,OAAA;EACR;EAEA,OAAA;CACJ;AACJ;;;ACjBA,MAAaC,cAAiD;CAC1D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAAoB;EAC3C,IAAI,MAAM,SAAA,MAAkC,MAAM,UAAU,QACxD,OAAO;EAGX,IAAI,MAAM,SAAA,IAA6B;GACnC,MAAM,oBAAoB,8BAA8B,MAAM;GAC9D,IAAI,OAAO,sBAAsB,aAC7B,MAAM,IAAI,MAAM,0DAA0D,MAAM,KAAK,EAAE;GAE3F,OAAO,kBAAkB,UAAU,MAAM,MAAM;EACnD;EAEA,OAAO;CACX;AACJ;AAEA,MAAM,UAAU,UAAmB,SAAgC;CAC/D,MAAM,SAAS,KACV,QAAQ,QAAiC,IAAI,SAAA,EAA+B,CAAC,CAC7E,KAAK,QAAQ,IAAI,MAAM;CAE5B,OAAO,OAAO,WAAW,IAAK,SAAoB;AACtD;AAGA,MAAM,YAAY,UAAmB,SAAgC;CACjE,MAAM,SAAS,KACV,QAAQ,QAAiC,IAAI,SAAA,EAA+B,CAAC,CAC7E,KAAK,QAAQ,IAAI,MAAM;CAE5B,IAAI,OAAO,WAAW,IAClB,OAAO;CAIX,OAAO;EAAC,GAAG,QAAQ,CAAC;EAAG,GAAG,QAAQ,CAAC;EAAG,GAAG,QAAQ,CAAC;EAAG,GAAG,QAAQ,CAAC;EAAG,GAAG,QAAQ,EAAE;EAAG,GAAG,QAAQ,EAAE;CAAC;AACtG;AAEA,MAAMC,YAAU,SAAkB,SAAgC;CAC9D,IAAI,KAAK,WAAW,GAChB,OAAO;CAGX,MAAM,MAAM,GAAG,MAAM,CAAC;CACtB,IAAI,UAAU;CAEd,IAAI,IAAI,SAAA,MAAmC,IAAI,WAAW,GACtD,UAAU;MACP,IAAI,IAAI,SAAA,IACX,UAAU,MAAM,MAAM,SAAS,GAAG;MAElC,OAAO;CAGX,MAAM,MAAM,KAAK,IAAI,OAAO;CAC5B,MAAM,MAAM,KAAK,IAAI,OAAO;CAE5B,OAAO;EAAC;EAAK;EAAK,CAAC;EAAK;EAAK;EAAG;CAAC;AACrC;AAEA,MAAM,gCAEF;CACQ;CACE;CACV,QAAQA;AACZ;;;ACzEA,MAAM,gBAAkC;CACpC,MAAA;CACA,QAAQ;CACR,OAAA;AACJ;AACA,MAAM,UAA2B,CAAC,eAAe,aAAa;AAE9D,MAAa,kBAA4D;CACrE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAuB;EAC9C,MAAM,UAA8B,OAAO,OAAO,kBAAkB;EAEpE,IAAI,QAAQ,WAAW,GACnB,OAAO;EAGX,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;CAC1C;AACJ;;;ACrBA,MAAa,SAA2C;CACpD,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAA4B;EACnD,IAAI,MAAM,SAAA,MAAkC,MAAM,UAAU,QACxD,OAAO;EAGX,IAAI,MAAM,SAAA,IACF;OAAA,MAAM,WAAW,GACjB,OAAO;EAAA;EAIf,IAAI,MAAM,SAAA,IAIN,OAFgB,MAAM,MAAM,UAAU,KAExB,IAAI,MAAO,KAAK;EAGlC,OAAO;CACX;AACJ;;;ACzBA,MAAa,aAAwD;CACjE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,eAAuB;EAC9C,QAAQ,YAAR;GACI,KAAK,UACD,OAAA;GACJ,KAAK,YACD,OAAA;GAEJ,SACI,OAAA;EACR;CACJ;AACJ;;;AChBA,MAAa,YAAuD;CAChE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,cAAkC;EACzD,QAAQ,WAAR;GACI,KAAK,aACD,OAAA;GACJ,KAAK,YACD,OAAA;GAEJ,SACI,OAAA;EACR;CACJ;AACJ;;;ACbA,MAAa,aAAyD;CAClE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAA+B;EACtD,QAAQ,OAAR;GACI,KAAK,OACD,OAAA;GACJ,KAAK,UACD,OAAA;GACJ,KAAK,YACD,OAAA;GACJ,KAAK,YACD,OAAA;GAEJ,SACI,OAAA;EACR;CACJ;AACJ;;;ACpBA,MAAa,yBAAyB,gBAAuC,gBAAA;AAE7E,MAAa,yBAAyB,gBAClC,gBAAA,KAA4C,gBAAA;AAEhD,MAAa,cAA2D;CACpE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,gBAAsC;EAC7D,QAAQ,aAAR;GACI,KAAK,eACD,OAAA;GACJ,KAAK,eACD,OAAA;GACJ,KAAK,eACD,OAAA;GACJ,KAAK,eACD,OAAA;GAEJ,SACI,OAAA;EACR;CACJ;AACJ;;;AC1BA,MAAa,SAA2C;CACpD,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAA4B;EACnD,IAAI,MAAM,SAAA,IACN,OAAO;GAAE,MAAM;GAAM,OAAO;EAAE;EAGlC,IAAI,cAAc,KAAK,GACnB,OAAO;GAAE,MAAM;GAAO,OAAO,MAAM;EAAO;EAG9C,MAAM,IAAI,MAAM,+BAA+B;CACnD;AACJ;;;ACrBA,MAAa,OAAgC;CACzC,MAAM;CACN,QAAQ,UAAmB,UAA4B;EACnD,IAAI,MAAM,SAAA,IACN,QAAQ,MAAM,KAAK,YAAY,GAA/B;GACI,KAAK,KACD,OAAO,MAAO,MAAM;GACxB,KAAK,MACD,OAAO,MAAM;EACrB;EAGJ,MAAM,IAAI,MAAM,uBAAuB;CAC3C;AACJ;;;AChBA,MAAa,UAA4C;CACrD,MAAM;CACN,cAAc;CACd,MAAA;CACA,QAAQ;CACR,QAAQ,UAAmB,UAA4B;EACnD,IAAI,cAAc,KAAK,GACnB,OAAO,MAAM;EAEjB,OAAO;CACX;AACJ;;;ACHA,MAAa,sBAA4E;CACrF,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAAyC;EAChE,QAAQ,OAAR;GACI,KAAK,UACD,OAAA;GACJ,KAAK,UACD,OAAA;GACJ,KAAK,UACD,OAAA;GACJ,KAAK,QACD,OAAA;GAEJ,SACI,OAAA;EACR;CACJ;AACJ;;;ACzBA,MAAa,0BAA6E;CACtF,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAA6C;EACpE,IAAI,aAAa,KAAK,GAClB,QAAQ,MAAM,OAAd;GACI,KAAK,QACD,OAAO;GACX,KAAK,aACD,OAAO;EACf;EAGJ,IAAI,iBAAiB,KAAK,GAEtB,OAAO,MAAM;EAIjB,OAAO;CACX;AACJ;;;ACvBA,MAAa,sBAAqE;CAC9E,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAAyC;EAChE,IAAI,aAAa,KAAK,GACd;OAAA,MAAM,UAAU,QAChB,OAAO;EAAA;EAIf,IAAI,iBAAiB,KAAK,GAEtB,OAAO,MAAM;EAIjB,OAAO;CACX;AACJ;;;ACvBA,MAAa,aAA+C;CACxD,MAAM;CACN,cAAc;CACd,MAAA;CACA,QAAQ;CACR,QAAQ,UAAmB,UAA4B;EACnD,IAAI,cAAc,KAAK,GACnB,OAAO,MAAM;EAGjB,IAAI,aAAa,KAAK,GAClB,QAAQ,MAAM,OAAd;GACI,KAAK,QACD,OAAO;GAEX,SACI,OAAO;EACf;EAGJ,OAAO;CACX;AACJ;;;ACtBA,MAAa,cAAiD;CAC1D,MAAM;CACN,cAAc;CACd,MAAA;CACA,QAAQ;CACR,QAAQ,UAAmB,WAAiC;EACxD,OAAO,OAAO,OAAO,YAAY,CAAC,CAAC,KAAK,UAAU,MAAM,KAAK;CACjE;AACJ;;;ACHA,MAAa,YAAuD;CAChE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,aAAqB;EAC5C,QAAQ,UAAR;GACI,KAAK,WACD,OAAA;GACJ,KAAK,UACD,OAAA;GAEJ,SACI,OAAA;EACR;CACJ;AACJ;;;ACnBA,MAAa,WAA8C;CACvD,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,SAAkB,WAAuB;EAC7C,OAAO,OAAO,OAAO,gBAAgB,CAAC,CAAC,KAAK,UAAU,KAAK,MAAM,SAAS,KAAK,CAAC;CACpF;AACJ;;;ACKA,MAAa,YAAgD;CACzD,MAAM;CACN,cAAc;CACd,MAAA;CACA,QAAQ;CACR,QAAQ,SAAkB,WAAkC;EACxD,IAAI,OAAO,WAAW,KAAK,iBAAiB,GAAG,QAAQ,CAAC,GAAG,MAAM,GAC7D,OAAO,CAAC;EAGZ,OAAO,kBAAkB,MAAM,CAAC,CAAC,KAAK,WAAuB;GACzD,MAAM,SAAwB;IAC1B,OAAO;IACP,SAAS;IACT,SAAS;IACT,MAAM;IACN,QAAQ;IACR,OAAO;GACX;GACA,IAAI,IAAI;GACR,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;IACpC,MAAM,QAAQ,OAAO;IACrB,IAAI,CAAC,OAAO;IACZ,IAAI,iBAAiB,OAAO,OAAO,GAC/B,OAAO,QAAQ;SACZ,IAAI,SAAS,KAAK,GAAG;KACxB,IAAI,MAAM,GACN,OAAO,UAAU;UACd,IAAI,MAAM,GACb,OAAO,UAAU;UACd,IAAI,MAAM,GACb,OAAO,OAAO;UAEd,OAAO,SAAS;KAEpB;IACJ,OACI,OAAO,QAAQC,QAAM,MAAM,SAAS,KAAK;GAEjD;GACA,OAAO;EACX,CAAC;CACL;AACJ;;;AClDA,MAAa,aAAkD;CAC3D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAmC;EAC1D,MAAM,gBAAgB;;;;EAA4E;EAClG,MAAM,SAAqB,CAAC;EAE5B,OAAO,OAAO,YAAY,CAAC,CAAC,SAAS,UAAU;GAC3C,QAAQ,MAAM,OAAd;IACI,KAAK;KACD,OAAO,KAAA,CAA6B;KACpC;IACJ,KAAK;KACD,OAAO,KAAA,CAA2B;KAClC;IACJ,KAAK,WACD,OAAO,KAAA,CAA8B;GAE7C;EACJ,CAAC;EACD,cAAc,SAAS,UAAU;GAC7B,IAAI,OAAO,QAAQ,KAAK,MAAM,IAC1B,OAAO,KAAK,KAAK;EAEzB,CAAC;EAED,OAAO;CACX;AACJ;;;ACxCA,MAAa,wBAAsD;CAC/D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ;AACZ;;;ACJA,MAAa,wBAA0D;CACnE,MAAM;CACN,cAAc;CACd,MAAA;CACA,QAAQ;CACR,QAAQ,UAAmB,UAA4B;EACnD,IAAI,iBAAiB,KAAK,GACtB,OAAO,MAAM;EAEjB,OAAO;CACX;AACJ;;;;;;;;ACJA,MAAa,kBAAoD;CAC7D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAAoB;EAE3C,IAAI,MAAM,SAAA,MAAkC,MAAM,UAAU,QACxD,OAAO;EAIX,IAAI,MAAM,SAAA,IACN,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,MAAM,CAAC;EAI/C,OAAO;CACX;AACJ;;;AChBA,MAAa,YAAgD;CACzD,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAkC;EACzD,OAAO,OAAO,OAAO,YAAY,CAAC,CAAC,QAAQ,KAAK,UAAU;GACtD,OAAO,MAAM,kBAAkB,MAAM,KAAK;EAC9C,GAAA,CAAkB;CACtB;AACJ;AAEA,MAAM,qBAAqB,YAA+B;CACtD,QAAQ,SAAR;EACI,KAAK,WACD,OAAA;EACJ,KAAK,SACD,OAAA;EACJ,KAAK,QACD,OAAA;EACJ,KAAK,cACD,OAAA;CACR;CAEA,OAAA;AACJ;;;AC9BA,MAAa,eAA6D;CACtE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,iBAAyB;EAChD,QAAQ,cAAR;GACI,KAAK,YACD,OAAA;GAEJ,SACI,OAAA;EACR;CACJ;AACJ;;;ACZA,MAAa,iBAAiE;CAC1E,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAAmC;EAC1D,QAAQ,MAAM,YAAY,GAA1B;GACI,KAAK;GACL,KAAK;GACL,KAAK,oBACD,OAAA;GACJ,KAAK;GACL,KAAK,6BACD,OAAA;GACJ,KAAK;GACL,KAAK,gBACD,OAAA;GAEJ,SACI,OAAA;EACR;CACJ;AACJ;;;AC7BA,MAAaC,mBAAiB;CAC1B,QAAQ;CACR,UAAU;CACV,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,SAAS;CACT,aAAa;CACb,YAAY;CACZ,YAAY;CACZ,YAAY;CACZ,YAAY;CACZ,WAAW;CACX,KAAK;CACL,YAAY;CACZ,OAAO;CACP,YAAY;AAChB;AAIA,MAAMC,iBAAe,IAAI,IAAY,OAAO,OAAOD,gBAAc,CAAC;AAElE,MAAa,eAA4D;CACrE,MAAM;CACN,cAAc;CACd,MAAA;CACA,QAAQ;CACR,QAAQ,UAAmB,UAAgC;EACvD,OAAOC,eAAa,IAAI,KAAK,IAAK,QAAyBD,iBAAe;CAC9E;AACJ;;;AC1BA,MAAa,SAA+C;CACxD,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAoC;EAC3D,IAAI,OAAO,WAAW,GAAG;GACrB,MAAM,QAAQ,GAAG,QAAQ,CAAC;GAC1B,IAAI,MAAM,SAAA,MAAkC,MAAM,UAAU,QACxD,OAAO;EAEf;EAEA,MAAM,QAAkB,CAAC;EACzB,KAAK,MAAM,SAAS,QAAQ;GACxB,IAAI,MAAM,SAAA,IAA8B;IAIpC,MAAM,KAAK,QAAQ,MAAM,MAAM,GAAG;IAClC;GACJ;GACA,IAAI,MAAM,SAAA,IAA6B;IACnC,MAAM,KAAK;IAEX,MAAM,eAAe,iBAAiB,GAAG,MAAM;IAE/C,QAAQ,GAAG,MAAX;KACI,KAAK;MACD,MAAM,KAAK,QAAQ,aAAa,EAAE;MAClC;KACJ,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;MACD,MAAM,KAAK,GAAG,GAAG,KAAK,GAAG,aAAa,EAAE;MACxC;KACJ,KAAK;MACD,MAAM,KAAK,aAAa,aAAa,EAAE;MACvC;KACJ,KAAK;MACD,MAAM,KAAK,cAAc,aAAa,EAAE;MACxC;KACJ,KAAK;MACD,MAAM,KAAK,eAAe,aAAa,EAAE;MACzC;KACJ,SAMI,MAAM,KAAK,GAAG,GAAG,KAAK,GAAG,aAAa,EAAE;IAEhD;GACJ;EACJ;EAEA,OAAO,MAAM,SAAS,IAAI,MAAM,KAAK,GAAG,IAAI;CAChD;AACJ;;;;;AAMA,MAAM,oBAAoB,WAA+B;CACrD,MAAM,QAAkB,CAAC;CACzB,KAAK,MAAM,KAAK,QAAQ;EACpB,IAAI,EAAE,SAAA,IAAqC;GACvC,MAAM,KAAK,GAAG;GACd;EACJ;EACA,IAAI,EAAE,SAAA,IACF,MAAM,KAAK,GAAG,EAAE,KAAK,GAAG,iBAAiB,EAAE,MAAM,EAAE,EAAE;OAClD,IAAI,EAAE,SAAA,GACT,MAAM,KAAK,GAAG;OACX,IAAI,EAAE,SAAA,GACT,MAAM,KAAK,EAAE,KAAK;OACf,IAAI,EAAE,SAAA,IACT,MAAM,KAAK,GAAG,EAAE,SAAS,EAAE,MAAM;OAC9B,IAAI,EAAE,SAAA,IACT,MAAM,KAAK,GAAG,EAAE,QAAQ;OACrB,IAAI,EAAE,SAAA,IACT,MAAM,KAAK,GAAG,EAAE,OAAO,EAAE;OACtB,IAAI,EAAE,SAAA,IACT,MAAM,KAAK,EAAE,KAAK;OACf,IAAI,EAAE,SAAA,GACT,MAAM,KAAK,IAAI,EAAE,OAAO;CAEhC;CACA,OAAO,MAAM,KAAK,EAAE,CAAC,CAAC,KAAK;AAC/B;;;ACtFA,MAAa,uBAA8E;CACvF,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAA0C;EACjE,QAAQ,OAAR;GACI,KAAK,QACD,OAAA;GACJ,KAAK,oBACD,OAAA;GACJ,KAAK,uBACD,OAAA;GACJ,KAAK,2BACD,OAAA;GACJ,KAAK,8BACD,OAAA;GACJ,KAAK,wBACD,OAAA;GACJ,KAAK,2BACD,OAAA;GACJ,KAAK,cACD,OAAA;GACJ,KAAK,iBACD,OAAA;GAEJ,SACI,OAAA;EACR;CACJ;AACJ;;;ACvCA,MAAa,OAAuC;CAChD,MAAM;CACN,cAAc;CACd,MAAA;CACA,QAAQ;CACR,QAAQ,UAAmB,UAA0B;EACjD,IAAI,MAAM,SAAA,IACN,OAAO,KAAK,IAAI,GAAG,MAAM,SAAS,GAAG;EAEzC,IAAI,MAAM,SAAA,IACN,OAAO,KAAK,IAAI,GAAG,MAAM,MAAM;EAEnC,OAAO;CACX;AACJ;;;ACPA,MAAa,iBAA0D;CACnE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAuC;EAC9D,MAAM,SAA6B,CAAC;EACpC,IAAI,IAAI;EAER,OAAO,IAAI,OAAO,UAAU,OAAO,SAAS,GAAG;GAC3C,MAAM,QAAQ,OAAO;GACrB,IAAI,CAAC,OACD;GAEJ,IAAI,aAAa,KAAK,GAClB,QAAQ,MAAM,OAAd;IACI,KAAK;IACL,KAAK;KACD,OAAO,KAAK,WAAW;KACvB;IACJ,KAAK;KACD,OAAO,KAAK,aAAa;KACzB;IACJ,KAAK;IACL,KAAK,UACD,OAAO,KAAK,eAAe;GAEnC;QACG,IAAI,mBAAmB,KAAK,GAC/B,OAAO,KAAK,KAAK;GAErB;EACJ;EAGA,OAAO,OAAO,SAAS,GACnB,OAAO,KAAK,aAAa;EAG7B,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC;CACxC;AACJ;AC5BA,MAAM,eAAe,IAAI,IAAY,OAAO,OAAO;CAtB/C,QAAQ;CACR,UAAU;CACV,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,SAAS;CACT,aAAa;CACb,YAAY;CACZ,YAAY;CACZ,YAAY;CACZ,YAAY;CACZ,WAAW;CACX,KAAK;CACL,YAAY;CACZ,OAAO;CACP,YAAY;AAOmC,CAAc,CAAC;AAElE,MAAa,sBAAoE;CAC7E,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAA4C;EACnE,MAAM,QAA6B,CAAC;EACpC,MAAM,WAAW,OAAO,OAAO,uBAAuB;EAEtD,KAAK,MAAM,SAAS,UAChB,IAAI,aAAa,KAAK,GACd;OAAA,aAAa,IAAI,MAAM,KAAK,GAC5B,MAAM,KAAK,MAAM,KAAuB;EAAA;EAKpD,OAAO,MAAM,SAAS,IAAI,QAAQ,CAAC,QAAQ;CAC/C;AACJ;;;ACxCA,MAAa,oBAAgE;CACzE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,WAAW;CACX,QAAQ,SAAkB,WAA0C;EAChE,IAAI,OAAO,WAAW,GAClB,OAAO;EAGX,MAAM,WAAW,OAAO,QAAQ,MAAM,wBAAwB,CAAC,KAAK,iBAAiB,CAAC,CAAC;EACvF,IAAI,SAAS,WAAW,GACpB,OAAO;EAGX,OAAO,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC;CAC/C;AACJ;;;ACXA,MAAME,eAAa,UAAsD;CACrE,MAAM,SAAS,CAAC,GAAG,KAAK;CACxB,IAAI,OAAO,WAAW,GAAG;EACrB,MAAM,OAAO,GAAG,QAAQ,CAAC;EACzB,OAAO,KAAK,MAAM,MAAM,IAAI;CAChC,OAAO,IAAI,OAAO,WAAW,GACzB,OAAO,KAAK,GAAG,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC;MACrC,IAAI,OAAO,WAAW,GACzB,OAAO,KAAK,GAAG,QAAQ,CAAC,CAAC;CAE7B,OAAO;EAAC,GAAG,QAAQ,CAAC;EAAG,GAAG,QAAQ,CAAC;EAAG,GAAG,QAAQ,CAAC;EAAG,GAAG,QAAQ,CAAC;CAAC;AACtE;AAEA,MAAa,mBAA8D;CACvE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAyC;EAChE,MAAM,WAAW,OAAO,OAAO,aAAa;EAC5C,MAAM,SAAmB,CAAC;EAC1B,IAAI,OAAO;EACX,IAAI,OAA6B;EAEjC,KAAK,MAAM,SAAS,UAAU;GAC1B,IAAI,aAAa,KAAK,KAAK,MAAM,UAAU,QAAQ;IAC/C,OAAO;IACP;GACJ;GACA,IAAI,MAAM,SAAA,IAAiC;IACvC,OAAO,KAAK,MAAM,MAAM;IACxB,OAAO;GACX,OAAO,IAAI,MAAM,SAAA,IAAqC;IAClD,OAAO,KAAK,MAAM,MAAM;IACxB,OAAO;GACX;EACJ;EAEA,MAAM,CAAC,KAAK,OAAO,QAAQ,QAAQA,YAAU,OAAO,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC;EAE/E,OAAO;GAAE;GAAK;GAAO;GAAQ;GAAM;GAAM;EAAK;CAClD;AACJ;;;ACzCA,MAAM,oBAAoB,UAAuC;CAC7D,QAAQ,OAAR;EACI,KAAK,UACD,OAAA;EACJ,KAAK,SACD,OAAA;EACJ,KAAK,SACD,OAAA;EAEJ,SACI,OAAA;CACR;AACJ;AAEA,MAAa,oBAAgE;CACzE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAA0C;EACjE,MAAM,WAAW,OAAO,OAAO,aAAa;EAC5C,MAAM,SAAgC,CAAC;EAEvC,KAAK,MAAM,SAAS,UAChB,IAAI,aAAa,KAAK,GAClB,OAAO,KAAK,iBAAiB,MAAM,KAAK,CAAC;EAIjD,MAAM,aAAa,OAAO,MAAA;EAG1B,OAAO;GAAE;GAAY,UAFJ,OAAO,MAAM;EAEA;CAClC;AACJ;;;AC1CA,MAAa,qBAA0E;CACnF,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAAwC;EAC/D,QAAQ,OAAR;GACI,KAAK,SACD,OAAA;GAEJ,SACI,OAAA;EACR;CACJ;AACJ;;;ACdA,MAAa,cAAqD;CAC9D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,SAAkB,UAAiC;EACvD,IAAI,aAAa,KAAK,KAAK,MAAM,UAAU,QACvC,OAAO;EAEX,OAAOC,QAAU,MAAM,SAAS,KAAK;CACzC;AACJ;;;ACPA,MAAa,sBAAqE;CAC9E,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,SAAkB,UAAyC;EAC/D,IAAI,aAAa,KAAK,KAAK,MAAM,UAAU,gBACvC,OAAO;EAEX,OAAOC,QAAU,MAAM,SAAS,KAAK;CACzC;AACJ;;;ACfA,MAAa,YAAsD;CAC/D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAA6B;EAGpD,OAAO,UAAU,YAAA,IAAA;CACrB;AACJ;;;ACGA,MAAa,eAA6D;CACtE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAAiC;EACxD,QAAQ,OAAR;GACI,KAAK,SACD,OAAA;GACJ,KAAK,UACD,OAAA;GACJ,KAAK,UACD,OAAA;GACJ,KAAK,UACD,OAAA;GACJ,KAAK,QAGD,OAAA;GACJ,SACI,OAAA;EACR;CACJ;AACJ;AAEA,MAAa,eAAuD;CAChE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,SAAkB,UAAkC;EACxD,IAAI,aAAa,KAAK,MAAM,MAAM,UAAU,kBAAkB,MAAM,UAAU,WAC1E,OAAO;EAEX,OAAOC,QAAU,MAAM,SAAS,KAAK;CACzC;AACJ;AAIA,MAAa,eAAiD;CAC1D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,OAAO,eAAe;AAC1B;AAEA,MAAa,gBAAkD;CAC3D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,UAA4B;EACnD,OAAO,iBAAiB,KAAK,KAAK,cAAc,KAAK,IAAI,MAAM,SAAS;CAC5E;AACJ;;;AClEA,MAAa,iBAA0D;CACnE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,SAAkB,WAA2B,OAAO,MAAM,SAAS,MAAM;AACrF;;;ACQA,MAAa,YAAgD;CACzD,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,WAAW;CACX,OAAO,gBAAgB;AAC3B;AAEA,MAAa,eAAsD;CAC/D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,OAAO,mBAAmB;AAC9B;AAEA,MAAa,aAAkD;CAC3D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,OAAO,iBAAiB;AAC5B;AAEA,MAAa,WAA8C;CACvD,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,OAAO,eAAe;AAC1B;;;ACrCA,MAAM,SAA8B;CAAC;CAAO;CAAU;CAAiB;CAAY;AAAQ;AAE3F,MAAa,oBAAgE;CACzE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAA0C;EACjE,MAAM,SAAS,OAAO,OAAO,aAAa;EAC1C,IAAI,OAAO,WAAW,GAClB,OAAO;EAEX,MAAM,QAAQ,GAAG,QAAQ,CAAC;EAC1B,IAAI,MAAM,SAAA,GAEN,OAAQ,MAA2B;EAEvC,IAAI,aAAa,KAAK,GAAG;GACrB,IAAI,MAAM,UAAU,QAChB,OAAO;GAEX,IACI,MAAM,UAAU,YAChB,MAAM,UAAU,UAChB,OAAO,QAAQ,MAAM,KAA0B,MAAM,IAErD,OAAO,MAAM;EAErB;EAEA,IAAI,OAAO;EACX,IAAI,QAA2B;EAC/B,KAAK,MAAM,SAAS,QAAQ;GACxB,IAAI,CAAC,aAAa,KAAK,GAAG;GAC1B,IAAI,MAAM,UAAU,UAChB,OAAO;QACJ,IAAI,MAAM,UAAU,QACvB,OAAO;QACJ,IAAI,OAAO,QAAQ,MAAM,KAA0B,MAAM,IAC5D,QAAQ,MAAM;EAEtB;EACA,OAAO;GAAE;GAAM;EAAM;CACzB;AACJ;AAKA,MAAa,oBAAiE;CAC1E,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,SAAkB,UAAuC;EAC7D,IAAI,aAAa,KAAK,KAAK,MAAM,UAAU,gBACvC,OAAO;EAEX,OAAOC,QAAU,MAAM,SAAS,KAAK;CACzC;AACJ;AASA,MAAa,uBAAsE;CAC/E,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAA6C;EACpE,IAAI,OAAO;EACX,IAAI,QAAQ;EACZ,KAAK,MAAM,SAAS,QAAQ;GACxB,IAAI,CAAC,aAAa,KAAK,GAAG;GAC1B,QAAQ,MAAM,OAAd;IACI,KAAK;KACD,OAAO;KACP;IACJ,KAAK;KACD,OAAO;KACP;IACJ,KAAK;KACD,QAAQ;KACR;IACJ,KAAK,QACD,QAAQ;GAEhB;EACJ;EACA,OAAO;GAAE;GAAM;EAAM;CACzB;AACJ;;;ACvGA,MAAM,aAAgB,UAA6B;CAC/C,MAAM,SAAS,CAAC,GAAG,KAAK;CACxB,IAAI,OAAO,WAAW,GAAG;EACrB,MAAM,OAAO,GAAG,QAAQ,CAAC;EACzB,OAAO,KAAK,MAAM,MAAM,IAAI;CAChC,OAAO,IAAI,OAAO,WAAW,GACzB,OAAO,KAAK,GAAG,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC;MACrC,IAAI,OAAO,WAAW,GACzB,OAAO,KAAK,GAAG,QAAQ,CAAC,CAAC;CAE7B,OAAO;EAAC,GAAG,QAAQ,CAAC;EAAG,GAAG,QAAQ,CAAC;EAAG,GAAG,QAAQ,CAAC;EAAG,GAAG,QAAQ,CAAC;CAAC;AACtE;AAEA,MAAM,aAAa,UAAiD;CAChE,IAAI,aAAa,KAAK,KAAK,MAAM,UAAU,QACvC,OAAO,EAAE,MAAM,OAAO;CAE1B,IAAI,MAAM,SAAA,IACN,OAAO;EAAE,MAAM;EAAU,OAAO,MAAM;CAAO;CAEjD,IAAI,MAAM,SAAA,MAAsC,MAAM,SAAS,MAC3D,OAAO;EAAE,MAAM;EAAU,OAAO,MAAM;CAAO;CAEjD,IAAI,MAAM,SAAA,IACN,OAAO;EAAE,MAAM;EAAc,OAAO,MAAM;CAAO;CAErD,OAAO;AACX;AAEA,MAAM,cACF,WACkG;CAClG,MAAM,QAAgC,CAAC;CACvC,KAAK,MAAM,SAAS,QAAQ;EACxB,IAAI,MAAM,SAAA,IAAqC;EAC/C,MAAM,OAAO,UAAU,KAAK;EAC5B,IAAI,CAAC,MAAM,OAAO;EAClB,MAAM,KAAK,IAAI;CACnB;CACA,IAAI,MAAM,WAAW,KAAK,MAAM,SAAS,GAAG,OAAO;CACnD,OAAO,UAAU,KAAK;AAC1B;;;;;;;AAQA,MAAa,mBAKR;CACD,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAW;EAClC,MAAM,QAAQ,WAAW,MAAM;EAC/B,MAAM,OAA6B,EAAE,MAAM,OAAO;EAElD,OAAO,QAAQ;GAAE,KAAK,MAAM;GAAI,OAAO,MAAM;GAAI,QAAQ,MAAM;GAAI,MAAM,MAAM;EAAG,IAAI;GADnE,KAAK;GAAM,OAAO;GAAM,QAAQ;GAAM,MAAM;EAC8B;CACjG;AACJ;;;;;AAaA,MAAa,oBAAgE;CACzE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAW;EAClC,MAAM,QAAQ,WAAW,MAAM;EAC/B,MAAM,OAA6B;GAAE,MAAM;GAAU,OAAO;EAAE;EAE9D,OAAO,QAAQ;GAAE,KAAK,MAAM;GAAI,OAAO,MAAM;GAAI,QAAQ,MAAM;GAAI,MAAM,MAAM;EAAG,IAAI;GADlE,KAAK;GAAM,OAAO;GAAM,QAAQ;GAAM,MAAM;EAC8B;CAClG;AACJ;;;;;;;;;;AC5EA,MAAa,mBAA6D;CACtE,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,WAAW;CACX,QAAQ,SAAkB,WAAwC;EAC9D,IAAI,YAAwC;EAC5C,IAAI,SAAS;EACb,IAAI,OAAyB;EAE7B,KAAK,MAAM,SAAS,QAAQ;GACxB,IAAI,MAAM,SAAA,IAAqC;GAC/C,IAAI,cAAc,QAAQ,aAAa,KAAK,GAAG;IAC3C,IACI,MAAM,UAAU,WAChB,MAAM,UAAU,WAChB,MAAM,UAAU,UAChB,MAAM,UAAU,SAClB;KACE,YAAY,MAAM;KAClB;IACJ;IACA,IAAI,MAAM,UAAU,QAChB,OAAO;GAEf;GACA,IAAI,WAAW,KAAK,iBAAiB,KAAK,KAAK,MAAM,SAAS,MAAM;IAChE,SAAS,MAAM;IACf;GACJ;GACA,IAAI,SAAS,QAAQ,iBAAiB,KAAK,GAAG;IAC1C,OAAO,MAAM,MAAM,SAAS,KAAK;IACjC;GACJ;EAEJ;EAEA,IAAI,cAAc,MACd,OAAO;EAEX,OAAO;GAAE;GAAW;GAAQ;EAAK;CACrC;AACJ;;;ACtDA,MAAa,YAAqD;CAC9D,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAuC;EAC9D,MAAM,SAA6B,CAAC;EACpC,KAAK,MAAM,SAAS,QAChB,IAAI,mBAAmB,KAAK,GACxB,OAAO,KAAK,KAAK;EAGzB,IAAI,OAAO,WAAW,GAClB,OAAO;EAEX,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,OAAO,SAAS,IAAI,GAAG,QAAQ,CAAC,IAAI,WAAW;CAC1E;AACJ;;;AClBA,MAAa,QAA6C;CACtD,MAAM;CACN,cAAc;CACd,QAAQ;CACR,MAAA;CACA,QAAQ,UAAmB,WAAmC;EAC1D,MAAM,UAAoB,CAAC;EAC3B,KAAK,MAAM,SAAS,QAChB,IAAI,cAAc,KAAK,GACnB,QAAQ,KAAK,MAAM,MAAM;EAGjC,IAAI,QAAQ,WAAW,GACnB,OAAO;EAEX,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,QAAQ,SAAS,IAAI,GAAG,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC;CAChF;AACJ;;ACTA,MAAa,qBAAqB;;;;;;AAUlC,MAAa,yBAAyB;;;;;AAMtC,MAAa,0BAA0B;;;ACkFvC,MAAa,sBAA0E;CACnF;EAAC;EAAqB;EAAU;CAAmB;CACnD;EAAC;EAAkB;EAAgB;CAAgB;CACnD;EAAC;EAAmB;EAAiB;CAAiB;CACtD;EAAC;EAAmB;EAAiB;CAAiB;CACtD;EAAC;EAAoB;EAAkB;CAAkB;CACzD;EAAC;EAAsB;EAAoB;CAAoB;CAC/D;EAAC;EAAoB;EAAkB;CAAkB;CACzD;EAAC;EAAkB;EAAgB;CAAgB;CACnD;EAAC;EAAkB;EAAgB;CAAgB;CACnD;EAAC;EAAoB;EAAkB;CAAkB;CACzD;EAAC;EAAqB;EAAmB;CAAmB;CAC5D;EAAC;EAAmB;EAAiB;CAAiB;CACtD;EAAC;EAAuB;EAAqB;CAAqB;CAClE;EAAC;EAAwB;EAAsB;CAAsB;CACrE;EAAC;EAA2B;EAAyB;CAAyB;CAC9E;EAAC;EAA0B;EAAwB;CAAwB;CAC3E;EAAC;EAAkB;EAAgB;CAAgB;CACnD;EAAC;EAAoB;EAAkB;CAAkB;CACzD;EAAC;EAAqB;EAAmB;CAAmB;CAC5D;EAAC;EAAmB;EAAiB;CAAiB;CACtD;EAAC;EAAkB;EAAgB;CAAgB;CACnD;EAAC;EAAoB;EAAkB;CAAkB;CACzD;EAAC;EAAqB;EAAmB;CAAmB;CAC5D;EAAC;EAAmB;EAAiB;CAAiB;CACtD;EAAC;EAAa;EAAW;CAAW;CACpC;EAAC;EAAY;EAAU;CAAU;CACjC;EAAC;EAAS;EAAO;CAAO;CACxB;EAAC;EAAa;EAAW;CAAW;CACpC;EAAC;EAAW;EAAS;CAAS;CAC9B;EAAC;EAAc;EAAY;CAAY;CACvC;EAAC;EAAY;EAAU;CAAU;CACjC;EAAC;EAAa;EAAW;CAAW;CACpC;EAAC;EAAe;EAAa;CAAa;CAC1C;EAAC;EAAc;EAAY;CAAY;CACvC;EAAC;EAAiB;EAAe;CAAe;CAChD;EAAC;EAAa;EAAW;CAAW;CACpC;EAAC;EAAc;EAAY;CAAY;CACvC;EAAC;EAAkB;EAAgB;CAAgB;CACnD;EAAC;EAAqB;EAAmB;CAAmB;CAC5D;EAAC;EAAiB;EAAe;CAAe;CAChD;EAAC;EAAa;EAAW;CAAW;CACpC;EAAC;EAAe;EAAa;CAAa;CAC1C;EAAC;EAAgB;EAAc;CAAc;CAC7C;EAAC;EAAc;EAAY;CAAY;CACvC;EAAC;EAAW;EAAS;CAAS;CAC9B;EAAC;EAAgB;EAAc;CAAc;CAC7C;EAAC;EAAc;EAAY;CAAY;CACvC;EAAC;EAAgB;EAAc;CAAc;CAC7C;EAAC;EAAiB;EAAe;CAAe;CAChD;EAAC;EAAe;EAAa;CAAa;CAC1C;EAAC;EAAc;EAAY;CAAY;CACvC;EAAC;EAAY;EAAU;CAAU;CACjC;EAAC;EAAa;EAAW;CAAW;CACpC;EAAC;EAAuB;EAAqB;CAAqB;CAClE;EAAC;EAA2B;EAAyB;CAAyB;CAC9E;EAAC;EAAuB;EAAqB;CAAqB;CAClE;EAAC;EAAc;EAAY;CAAY;CACvC;EAAC;EAAiB;EAAe;CAAe;CAChD;EAAC;EAAgB;EAAc;CAAc;CAC7C;EAAC;EAAaC;EAAW;CAAW;CACpC;EAAC;EAAmB;EAAiB;CAAiB;CACtD;EAAC;EAAU;EAAQ;CAAQ;CAC3B;EAAC;EAAa;EAAW;CAAW;CACpC;EAAC;EAAS;EAAO;CAAO;CACxB;EAAC;EAAc;EAAY;CAAY;CACvC;EAAC;EAAyB;EAAuB;CAAuB;CACxE;EAAC;EAAyB;EAAuB;CAAuB;CACxE;EAAC;EAAmB;EAAiB;CAAiB;CACtD;EAAC;EAAa;EAAW;CAAW;CACpC;EAAC;EAAc;EAAY;CAAY;CACvC;EAAC;EAAe;EAAa;CAAa;CAC1C;EAAC;EAAU;EAAQ;CAAQ;CAC3B;EAAC;EAAa;EAAW;CAAW;CACpC;EAAC;EAAkB;EAAgB;CAAgB;CACnD;EAAC;EAAgB;EAAc;CAAc;CAC7C;EAAC;EAAU;EAAQ;CAAQ;CAC3B;EAAC;EAAwB;EAAsB;CAAsB;CACrE;EAAC;EAAQ;EAAM;CAAM;CACrB;EAAC;EAAkB;EAAgB;CAAgB;CACnD;EAAC;EAAuB;EAAqB;CAAqB;CAClE;EAAC;EAAqB;EAAmB;CAAmB;CAC5D;EAAC;EAAoB;EAAkB;CAAkB;CACzD;EAAC;EAAqB;EAAmB;CAAmB;CAC5D;EAAC;EAAsB;EAAoB;CAAoB;CAC/D;EAAC;EAAe;EAAa;CAAa;CAC1C;EAAC;EAAuB;EAAqB;CAAqB;CAClE;EAAC;EAAa;EAAW;CAAW;CACpC;EAAC;EAAgB;EAAc;CAAc;CAC7C;EAAC;EAAgB;EAAc;CAAc;CAC7C;EAAC;EAAgB;EAAc;CAAc;CAC7C;EAAC;EAAiB;EAAe;CAAe;CAChD;EAAC;EAAkB;EAAgB;CAAgB;CACnD;EAAC;EAAa;EAAW;CAAW;CACpC;EAAC;EAAgB;EAAc;CAAc;CAC7C;EAAC;EAAc;EAAY;CAAY;CACvC;EAAC;EAAY;EAAU;CAAU;CACjC;EAAC;EAAqB;EAAmB;CAAmB;CAC5D;EAAC;EAAqB;EAAmB;CAAmB;CAC5D;EAAC;EAAwB;EAAsB;CAAsB;CACrE;EAAC;EAAoB;EAAkB;CAAkB;CACzD;EAAC;EAAqB;EAAmB;CAAmB;CAC5D;EAAC;EAAoB;EAAkB;CAAkB;AAC7D;AAEA,MAAM,6BAAa,IAAI,IAAsD;AAE7E,MAAa,SAAS,SAAkB,YAAwC,UAA0B;CACtG,IAAI,WAAW,UAAU,QAAQ,OAAO,UAAU,cAAc,MAAM,SAAS,IAAI,WAAW;CAM9F,IAAI,SAAS,KAAK,MAAM,IACpB,WAAW,WAAW;CAG1B,IAAI,aAAa,WAAW,IAAI,UAAU;CAC1C,IAAI,YAAY;EACZ,MAAM,SAAS,WAAW,IAAI,QAAQ;EACtC,IAAI,WAAW,KAAA,GAAW;GACtB,WAAW,OAAO,QAAQ;GAC1B,WAAW,IAAI,UAAU,MAAM;GAC/B,OAAO;EACX;CACJ;CAEA,MAAM,YAAY,UAAU,IAAI;CAChC,UAAU,MAAM,QAAQ;CACxB,MAAM,SAAS,IAAI,OAAO,UAAU,KAAK,CAAC;CAC1C,UAAU,QAAQ,SAAS;CAG3B,MAAM,gBAAgB;EAClB,QAAQ,WAAW,MAAnB;GACI,KAAA,GAAgD;IAC5C,MAAM,QAAQ,OAAO,oBAAoB;IACzC,OAAO,WAAW,MAAM,SAAS,aAAa,KAAK,IAAI,MAAM,QAAQ,WAAW,YAAY;GAChG;GACA,KAAA,GACI,OAAO,WAAW,MAAM,SAAS,OAAO,oBAAoB,CAAC;GACjE,KAAA,GACI,OAAO,WAAW,MAAM,SAAS,OAAO,qBAAqB,CAAC;GAClE,KAAA,GACI,OAAO,OAAO,oBAAoB;GACtC,KAAA,GACI,QAAQ,WAAW,QAAnB;IACI,KAAK,SACD,OAAO,MAAM,MAAM,SAAS,OAAO,oBAAoB,CAAC;IAC5D,KAAK,SACD,OAAOC,QAAU,MAAM,SAAS,OAAO,oBAAoB,CAAC;IAChE,KAAK,SACD,OAAO,MAAM,MAAM,SAAS,OAAO,oBAAoB,CAAC;IAC5D,KAAK,UAAU;KACX,MAAM,SAAS,OAAO,oBAAoB;KAC1C,OAAO,SAAS,MAAM,IAAI,SAAS;IACvC;IACA,KAAK,qBAAqB;KACtB,MAAM,QAAQ,OAAO,oBAAoB;KACzC,OAAO,mBAAmB,KAAK,IAAI,QAAQ;IAC/C;IACA,KAAK,QACD,OAAO,KAAK,MAAM,SAAS,OAAO,oBAAoB,CAAC;GAC/D;EACR;CACJ,EAAA,CAAG;CAEH,IAAI,CAAC,YAAY;EACb,6BAAa,IAAI,IAAI;EACrB,WAAW,IAAI,YAAY,UAAU;CACzC;CAWA,IAAI,EAFA,WAAW,aACV,WAAW,SAAA,KAAqD,WAAW,WAAW,UAC3E;EACZ,IAAI,WAAW,QAAA,KAAwC;GACnD,MAAM,YAAY,WAAW,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;GAC3C,IAAI,cAAc,KAAA,GACd,WAAW,OAAO,SAAS;EAEnC;EACA,WAAW,IAAI,UAAU,MAAM;CACnC;CAEA,OAAO;AACX;;;;;;;;;;;;;AC5SA,IAAa,eAAb,MAA0B;CACO;CAA7B,YAAY,QAA+C;EAA9B,KAAA,SAAA;CAA+B;CAE5D,IAAI,WAAW;EACX,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,aAAa;EACb,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,cAAc;EACd,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,YAAY;EACZ,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,WAAW;EACX,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,aAAa;EACb,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,cAAc;EACd,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,YAAY;EACZ,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,WAAW;EACX,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,aAAa;EACb,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,cAAc;EACd,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,YAAY;EACZ,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,gBAAgB;EAChB,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,iBAAiB;EACjB,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,oBAAoB;EACpB,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,mBAAmB;EACnB,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,cAAc;EACd,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,aAAa;EACb,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,cAAc;EACd,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,YAAY;EACZ,OAAO,KAAK,OAAO;CACvB;AACJ;;;;;;;;;;ACvEA,IAAa,mBAAb,MAA8B;CACG;CAA7B,YAAY,QAA+C;EAA9B,KAAA,SAAA;CAA+B;CAE5D,IAAI,QAAQ;EACR,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,QAAQ;EACR,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,OAAO;EACP,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,SAAS;EACT,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,WAAW;EACX,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,SAAS;EACT,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,OAAO;EACP,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,YAAY;EACZ,OAAO,KAAK,OAAO;CACvB;AACJ;;;;;;;;;;AC3BA,IAAa,aAAb,MAAwB;CACS;CAA7B,YAAY,QAA+C;EAA9B,KAAA,SAAA;CAA+B;CAE5D,IAAI,SAAS;EACT,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,OAAO;EACP,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,QAAQ;EACR,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,UAAU;EACV,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,SAAS;EACT,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,YAAY;EACZ,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,QAAQ;EACR,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,gBAAgB;EAChB,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,aAAa;EACb,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,YAAY;EACZ,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,gBAAgB;EAChB,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,eAAe;EACf,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,aAAa;EACb,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,sBAAsB;EACtB,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,qBAAqB;EACrB,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,sBAAsB;EACtB,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,0BAA0B;EAC1B,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,sBAAsB;EACtB,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,YAAY;EACZ,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,YAAY;EACZ,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,eAAe;EACf,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,cAAc;EACd,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,YAAY;EACZ,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,wBAAwB;EACxB,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,wBAAwB;EACxB,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,kBAAkB;EAClB,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,aAAa;EACb,OAAO,KAAK,OAAO;CACvB;AACJ;;;;;;;;;;ACvFA,IAAa,eAAb,MAA0B;CACO;CAA7B,YAAY,QAA+C;EAA9B,KAAA,SAAA;CAA+B;CAE5D,IAAI,UAAU;EACV,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,WAAW;EACX,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,QAAQ;EACR,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,SAAyC;EACzC,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,YAAY;EACZ,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,cAAc;EACd,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,eAAe;EACf,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,aAAa;EACb,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,aAAa;EACb,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,eAAe;EACf,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,gBAAgB;EAChB,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,cAAc;EACd,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,YAAY;EACZ,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,YAAY;EACZ,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,UAAU;EACV,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,aAAa;EACb,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,YAAY;EACZ,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,kBAAkB;EAClB,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,SAAS;EACT,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,OAAO;EACP,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,WAAW;EACX,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,eAAe;EACf,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,SAAS;EACT,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,iBAAiB;EACjB,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,YAAY;EACZ,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,iBAAiB;EACjB,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,qBAAqB;EACrB,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,iBAAiB;EACjB,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,oBAAoB;EACpB,OAAO,KAAK,OAAO;CACvB;CACA,IAAI,gBAAgB;EAChB,OAAO,KAAK,OAAO;CACvB;CAEA,IAAI,oBAAoB;EACpB,OAAO,KAAK,OAAO;CACvB;CAEA,YAAY;EACR,OAAO,KAAK,OAAO,UAAU;CACjC;CACA,gBAAgB;EACZ,OAAO,KAAK,OAAO,cAAc;CACrC;CACA,gBAAgB;EACZ,OAAO,KAAK,OAAO,cAAc;CACrC;CACA,eAAe;EACX,OAAO,KAAK,OAAO,aAAa;CACpC;CACA,yBAAyB;EACrB,OAAO,KAAK,OAAO,uBAAuB;CAC9C;CACA,aAAa;EACT,OAAO,KAAK,OAAO,WAAW;CAClC;CACA,gBAAgB;EACZ,OAAO,KAAK,OAAO,cAAc;CACrC;AACJ;;;AC3BA,IAAa,uBAAb,MAAkC;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAMA;CACA;CAGA;CACA;CACA;CACA;CAEA,IAAI,SAAuB;EACvB,OAAO,KAAK,YAAY,KAAK,UAAU,IAAI,aAAa,IAAI;CAChE;CACA,IAAI,aAA+B;EAC/B,OAAO,KAAK,gBAAgB,KAAK,cAAc,IAAI,iBAAiB,IAAI;CAC5E;CACA,IAAI,OAAmB;EACnB,OAAO,KAAK,UAAU,KAAK,QAAQ,IAAI,WAAW,IAAI;CAC1D;CACA,IAAI,SAAuB;EACvB,OAAO,KAAK,YAAY,KAAK,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"}